From 0e9f42f3a725982e7934f3a043fdf1beeb054fc6 Mon Sep 17 00:00:00 2001 From: richard elms Date: Mon, 4 Nov 2024 15:11:57 +0100 Subject: [PATCH 01/46] Working in editor --- BugsnagUnity/Assets/BugsnagUnity.meta | 8 + BugsnagUnity/Assets/BugsnagUnity/Editor.meta | 8 + .../Editor/BugsnagAddScriptingSymbol.cs | 38 + .../Editor/BugsnagAddScriptingSymbol.cs.meta | 11 + .../BugsnagUnity/Editor/BugsnagEditor.EDM.cs | 174 + .../Editor/BugsnagEditor.EDM.cs.meta | 11 + .../BugsnagUnity/Editor/BugsnagEditor.cs | 252 + .../BugsnagUnity/Editor/BugsnagEditor.cs.meta | 14 + .../Assets/BugsnagUnity/Editor/icon-dark.png | Bin 0 -> 1563 bytes .../BugsnagUnity/Editor/icon-dark.png.meta | 88 + .../Assets/BugsnagUnity/Editor/icon-light.png | Bin 0 -> 1568 bytes .../BugsnagUnity/Editor/icon-light.png.meta | 88 + BugsnagUnity/Assets/BugsnagUnity/Plugins.meta | 8 + BugsnagUnity/Assets/BugsnagUnity/Scripts.meta | 8 + .../Scripts/AutomaticDataCollector.cs | 49 + .../Scripts/AutomaticDataCollector.cs.meta | 11 + .../BugsnagUnity/Scripts/BlockingQueue.cs | 39 + .../Scripts/BlockingQueue.cs.meta | 11 + .../Assets/BugsnagUnity/Scripts/Bugsnag.cs | 172 + .../BugsnagUnity/Scripts/Bugsnag.cs.meta | 11 + .../BugsnagUnity/Scripts/BugsnagAutoInit.cs | 56 + .../Scripts/BugsnagAutoInit.cs.meta | 11 + .../Scripts/BugsnagSettingsObject.cs | 221 + .../Scripts/BugsnagSettingsObject.cs.meta | 11 + .../Scripts/BugsnagUnityWebRequest.meta | 8 + .../BugsnagUnityWebRequest.cs | 353 + .../BugsnagUnityWebRequest.cs.meta | 11 + .../Scripts/BugsnagUnityWebRequest/README.md | 7 + .../BugsnagUnityWebRequest/README.md.meta | 7 + .../Assets/BugsnagUnity/Scripts/Client.cs | 744 ++ .../BugsnagUnity/Scripts/Client.cs.meta | 11 + .../BugsnagUnity/Scripts/Configuration.cs | 385 + .../Scripts/Configuration.cs.meta | 11 + .../Assets/BugsnagUnity/Scripts/Delivery.cs | 622 ++ .../BugsnagUnity/Scripts/Delivery.cs.meta | 11 + .../Scripts/EndpointConfiguration.cs | 60 + .../Scripts/EndpointConfiguration.cs.meta | 11 + .../BugsnagUnity/Scripts/IBreadcrumbs.cs | 14 + .../BugsnagUnity/Scripts/IBreadcrumbs.cs.meta | 11 + .../BugsnagUnity/Scripts/ICacheManager.cs | 21 + .../Scripts/ICacheManager.cs.meta | 11 + .../Assets/BugsnagUnity/Scripts/IClient.cs | 57 + .../BugsnagUnity/Scripts/IClient.cs.meta | 11 + .../BugsnagUnity/Scripts/IFeatureFlagStore.cs | 13 + .../Scripts/IFeatureFlagStore.cs.meta | 11 + .../BugsnagUnity/Scripts/IFilterable.cs | 8 + .../BugsnagUnity/Scripts/IFilterable.cs.meta | 11 + .../BugsnagUnity/Scripts/IMetadataEditor.cs | 20 + .../Scripts/IMetadataEditor.cs.meta | 11 + .../BugsnagUnity/Scripts/INativeClient.cs | 113 + .../Scripts/INativeClient.cs.meta | 11 + .../BugsnagUnity/Scripts/IUserEditor.cs | 10 + .../BugsnagUnity/Scripts/IUserEditor.cs.meta | 11 + .../BugsnagUnity/Scripts/LastRunInfo.cs | 13 + .../BugsnagUnity/Scripts/LastRunInfo.cs.meta | 11 + .../Scripts/LogTypeSeverityMapping.cs | 37 + .../Scripts/LogTypeSeverityMapping.cs.meta | 11 + .../Scripts/MainThreadDispatchBehaviour.cs | 103 + .../MainThreadDispatchBehaviour.cs.meta | 11 + .../Scripts/MaximumLogTypeCounter.cs | 70 + .../Scripts/MaximumLogTypeCounter.cs.meta | 11 + .../Assets/BugsnagUnity/Scripts/Native.meta | 8 + .../BugsnagUnity/Scripts/Native/Android.meta | 8 + .../Scripts/Native/Android/Breadcrumbs.cs | 57 + .../Native/Android/Breadcrumbs.cs.meta | 11 + .../Scripts/Native/Android/NativeApp.cs | 27 + .../Scripts/Native/Android/NativeApp.cs.meta | 11 + .../Native/Android/NativeAppWithState.cs | 19 + .../Native/Android/NativeAppWithState.cs.meta | 11 + .../Native/Android/NativeBreadcrumb.cs | 33 + .../Native/Android/NativeBreadcrumb.cs.meta | 11 + .../Scripts/Native/Android/NativeClient.cs | 168 + .../Native/Android/NativeClient.cs.meta | 11 + .../Scripts/Native/Android/NativeDevice.cs | 31 + .../Native/Android/NativeDevice.cs.meta | 11 + .../Native/Android/NativeDeviceWithState.cs | 18 + .../Android/NativeDeviceWithState.cs.meta | 11 + .../Scripts/Native/Android/NativeError.cs | 39 + .../Native/Android/NativeError.cs.meta | 11 + .../Scripts/Native/Android/NativeEvent.cs | 195 + .../Native/Android/NativeEvent.cs.meta | 11 + .../Scripts/Native/Android/NativeInterface.cs | 1294 +++ .../Native/Android/NativeInterface.cs.meta | 11 + .../Android/NativePayloadClassWrapper.cs | 290 + .../Android/NativePayloadClassWrapper.cs.meta | 11 + .../Scripts/Native/Android/NativeSession.cs | 29 + .../Native/Android/NativeSession.cs.meta | 11 + .../Native/Android/NativeStackFrame.cs | 25 + .../Native/Android/NativeStackFrame.cs.meta | 11 + .../Scripts/Native/Android/NativeThread.cs | 40 + .../Native/Android/NativeThread.cs.meta | 11 + .../Scripts/Native/Android/NativeUser.cs | 16 + .../Scripts/Native/Android/NativeUser.cs.meta | 11 + .../BugsnagUnity/Scripts/Native/Cocoa.meta | 8 + .../Scripts/Native/Cocoa/Breadcrumbs.cs | 91 + .../Scripts/Native/Cocoa/Breadcrumbs.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeApp.cs | 49 + .../Scripts/Native/Cocoa/NativeApp.cs.meta | 11 + .../Native/Cocoa/NativeAppWithState.cs | 86 + .../Native/Cocoa/NativeAppWithState.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeBreadcrumb.cs | 56 + .../Native/Cocoa/NativeBreadcrumb.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeClient.cs | 490 ++ .../Scripts/Native/Cocoa/NativeClient.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeCode.cs | 339 + .../Scripts/Native/Cocoa/NativeCode.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeDevice.cs | 82 + .../Scripts/Native/Cocoa/NativeDevice.cs.meta | 11 + .../Native/Cocoa/NativeDeviceWithState.cs | 30 + .../Cocoa/NativeDeviceWithState.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeError.cs | 46 + .../Scripts/Native/Cocoa/NativeError.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeEvent.cs | 228 + .../Scripts/Native/Cocoa/NativeEvent.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeImage.cs | 121 + .../Scripts/Native/Cocoa/NativeImage.cs.meta | 11 + .../Native/Cocoa/NativePayloadClassWrapper.cs | 111 + .../Cocoa/NativePayloadClassWrapper.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeSession.cs | 43 + .../Native/Cocoa/NativeSession.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeStackFrame.cs | 51 + .../Native/Cocoa/NativeStackFrame.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeThread.cs | 50 + .../Scripts/Native/Cocoa/NativeThread.cs.meta | 11 + .../Scripts/Native/Cocoa/NativeUser.cs | 23 + .../Scripts/Native/Cocoa/NativeUser.cs.meta | 11 + .../BugsnagUnity/Scripts/Native/Fallback.meta | 8 + .../Scripts/Native/Fallback/Breadcrumbs.cs | 67 + .../Native/Fallback/Breadcrumbs.cs.meta | 11 + .../Scripts/Native/Fallback/CacheManager.cs | 298 + .../Native/Fallback/CacheManager.cs.meta | 11 + .../Scripts/Native/Fallback/NativeClient.cs | 175 + .../Native/Fallback/NativeClient.cs.meta | 11 + .../BugsnagUnity/Scripts/Native/MacOS.meta | 8 + .../Scripts/Native/MacOS/NativeCode.cs | 9 + .../Scripts/Native/MacOS/NativeCode.cs.meta | 11 + .../BugsnagUnity/Scripts/Native/Windows.meta | 8 + .../Scripts/Native/Windows/NativeClient.cs | 222 + .../Native/Windows/NativeClient.cs.meta | 11 + .../BugsnagUnity/Scripts/Native/iOS.meta | 8 + .../Scripts/Native/iOS/NativeCode.cs | 9 + .../Scripts/Native/iOS/NativeCode.cs.meta | 11 + .../Assets/BugsnagUnity/Scripts/Payload.meta | 8 + .../BugsnagUnity/Scripts/Payload/App.cs | 127 + .../BugsnagUnity/Scripts/Payload/App.cs.meta | 11 + .../Scripts/Payload/AppWithState.cs | 63 + .../Scripts/Payload/AppWithState.cs.meta | 11 + .../Scripts/Payload/Breadcrumb.cs | 143 + .../Scripts/Payload/Breadcrumb.cs.meta | 11 + .../Scripts/Payload/BreadcrumbType.cs | 51 + .../Scripts/Payload/BreadcrumbType.cs.meta | 11 + .../Scripts/Payload/Correlation.cs | 53 + .../Scripts/Payload/Correlation.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/Device.cs | 162 + .../Scripts/Payload/Device.cs.meta | 11 + .../Scripts/Payload/DeviceWithState.cs | 51 + .../Scripts/Payload/DeviceWithState.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/Error.cs | 294 + .../Scripts/Payload/Error.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/Event.cs | 388 + .../Scripts/Payload/Event.cs.meta | 11 + .../Scripts/Payload/FeatureFlag.cs | 37 + .../Scripts/Payload/FeatureFlag.cs.meta | 11 + .../Scripts/Payload/HandledState.cs | 151 + .../Scripts/Payload/HandledState.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/IApp.cs | 16 + .../BugsnagUnity/Scripts/Payload/IApp.cs.meta | 11 + .../Scripts/Payload/IAppWithState.cs | 12 + .../Scripts/Payload/IAppWithState.cs.meta | 11 + .../Scripts/Payload/IBreadcrumb.cs | 16 + .../Scripts/Payload/IBreadcrumb.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/IDevice.cs | 22 + .../Scripts/Payload/IDevice.cs.meta | 11 + .../Scripts/Payload/IDeviceWithState.cs | 12 + .../Scripts/Payload/IDeviceWithState.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/IError.cs | 16 + .../Scripts/Payload/IError.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/IEvent.cs | 32 + .../Scripts/Payload/IEvent.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/IPayload.cs | 26 + .../Scripts/Payload/IPayload.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/ISession.cs | 15 + .../Scripts/Payload/ISession.cs.meta | 11 + .../Scripts/Payload/IStackframe.cs | 30 + .../Scripts/Payload/IStackframe.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/IThread.cs | 14 + .../Scripts/Payload/IThread.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/IUser.cs | 12 + .../Scripts/Payload/IUser.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/Metadata.cs | 126 + .../Scripts/Payload/Metadata.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/Method.cs | 53 + .../Scripts/Payload/Method.cs.meta | 11 + .../Scripts/Payload/MethodParameter.cs | 46 + .../Scripts/Payload/MethodParameter.cs.meta | 11 + .../Scripts/Payload/NotifierInfo.cs | 17 + .../Scripts/Payload/NotifierInfo.cs.meta | 11 + .../Scripts/Payload/PayloadContainer.cs | 47 + .../Scripts/Payload/PayloadContainer.cs.meta | 11 + .../Scripts/Payload/PayloadExtensions.cs | 47 + .../Scripts/Payload/PayloadExtensions.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/Report.cs | 83 + .../Scripts/Payload/Report.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/Session.cs | 127 + .../Scripts/Payload/Session.cs.meta | 11 + .../Scripts/Payload/SessionReport.cs | 65 + .../Scripts/Payload/SessionReport.cs.meta | 11 + .../Scripts/Payload/StackTraceLine.cs | 189 + .../Scripts/Payload/StackTraceLine.cs.meta | 11 + .../BugsnagUnity/Scripts/Payload/User.cs | 87 + .../BugsnagUnity/Scripts/Payload/User.cs.meta | 11 + .../BugsnagUnity/Scripts/PayloadManager.cs | 133 + .../Scripts/PayloadManager.cs.meta | 11 + .../BugsnagUnity/Scripts/PerformanceHelper.cs | 81 + .../Scripts/PerformanceHelper.cs.meta | 11 + .../Assets/BugsnagUnity/Scripts/Polyfills.cs | 19 + .../BugsnagUnity/Scripts/Polyfills.cs.meta | 11 + .../BugsnagUnity/Scripts/PostProcessBuild.cs | 79 + .../Scripts/PostProcessBuild.cs.meta | 11 + .../BugsnagUnity/Scripts/SessionTracker.cs | 188 + .../Scripts/SessionTracker.cs.meta | 11 + .../Assets/BugsnagUnity/Scripts/Severity.cs | 55 + .../BugsnagUnity/Scripts/Severity.cs.meta | 11 + .../Assets/BugsnagUnity/Scripts/SimpleJson.cs | 2190 +++++ .../BugsnagUnity/Scripts/SimpleJson.cs.meta | 11 + .../BugsnagUnity/Scripts/TelemetryType.cs | 9 + .../Scripts/TelemetryType.cs.meta | 11 + .../BugsnagUnity/Scripts/ThreadSendPolicy.cs | 10 + .../Scripts/ThreadSendPolicy.cs.meta | 11 + .../Assets/BugsnagUnity/Scripts/Time.cs | 36 + .../Assets/BugsnagUnity/Scripts/Time.cs.meta | 11 + .../Scripts/TimingTrackerBehaviour.cs | 38 + .../Scripts/TimingTrackerBehaviour.cs.meta | 11 + .../BugsnagUnity/Scripts/TypeNameHelper.cs | 161 + .../Scripts/TypeNameHelper.cs.meta | 11 + .../BugsnagUnity/Scripts/UniqueLogThrottle.cs | 73 + .../Scripts/UniqueLogThrottle.cs.meta | 11 + .../BugsnagUnity/Scripts/UnityLogMessage.cs | 37 + .../Scripts/UnityLogMessage.cs.meta | 11 + BugsnagUnity/Assets/Resources.meta | 8 + .../Bugsnag/BugsnagSettingsObject.asset | 65 + .../Bugsnag/BugsnagSettingsObject.asset.meta | 8 + BugsnagUnity/Assets/Scenes.meta | 8 + BugsnagUnity/Assets/Scenes/SampleScene.unity | 768 ++ .../Assets/Scenes/SampleScene.unity.meta | 7 + BugsnagUnity/Assets/Scripts.meta | 8 + BugsnagUnity/Assets/Scripts/Testing.cs | 11 + BugsnagUnity/Assets/Scripts/Testing.cs.meta | 11 + BugsnagUnity/Assets/TextMesh Pro.meta | 8 + .../Assets/TextMesh Pro/Documentation.meta | 8 + .../TextMesh Pro User Guide 2016.pdf | Bin 0 -> 694398 bytes .../TextMesh Pro User Guide 2016.pdf.meta | 7 + BugsnagUnity/Assets/TextMesh Pro/Fonts.meta | 8 + .../Fonts/LiberationSans - OFL.txt | 46 + .../Fonts/LiberationSans - OFL.txt.meta | 8 + .../TextMesh Pro/Fonts/LiberationSans.ttf | Bin 0 -> 350200 bytes .../Fonts/LiberationSans.ttf.meta | 19 + .../Assets/TextMesh Pro/Resources.meta | 8 + .../Resources/Fonts & Materials.meta | 9 + .../LiberationSans SDF - Drop Shadow.mat | 106 + .../LiberationSans SDF - Drop Shadow.mat.meta | 8 + .../LiberationSans SDF - Fallback.asset | 343 + .../LiberationSans SDF - Fallback.asset.meta | 8 + .../LiberationSans SDF - Outline.mat | 104 + .../LiberationSans SDF - Outline.mat.meta | 8 + .../LiberationSans SDF.asset | 7821 +++++++++++++++++ .../LiberationSans SDF.asset.meta | 8 + .../LineBreaking Following Characters.txt | 1 + ...LineBreaking Following Characters.txt.meta | 8 + .../LineBreaking Leading Characters.txt | 1 + .../LineBreaking Leading Characters.txt.meta | 8 + .../TextMesh Pro/Resources/Sprite Assets.meta | 9 + .../Resources/Sprite Assets/EmojiOne.asset | 659 ++ .../Sprite Assets/EmojiOne.asset.meta | 8 + .../TextMesh Pro/Resources/Style Sheets.meta | 9 + .../Style Sheets/Default Style Sheet.asset | 68 + .../Default Style Sheet.asset.meta | 8 + .../TextMesh Pro/Resources/TMP Settings.asset | 46 + .../Resources/TMP Settings.asset.meta | 8 + BugsnagUnity/Assets/TextMesh Pro/Shaders.meta | 8 + .../Shaders/TMP_Bitmap-Custom-Atlas.shader | 143 + .../TMP_Bitmap-Custom-Atlas.shader.meta | 9 + .../Shaders/TMP_Bitmap-Mobile.shader | 145 + .../Shaders/TMP_Bitmap-Mobile.shader.meta | 9 + .../TextMesh Pro/Shaders/TMP_Bitmap.shader | 143 + .../Shaders/TMP_Bitmap.shader.meta | 9 + .../Shaders/TMP_SDF Overlay.shader | 317 + .../Shaders/TMP_SDF Overlay.shader.meta | 9 + .../TextMesh Pro/Shaders/TMP_SDF SSD.shader | 310 + .../Shaders/TMP_SDF SSD.shader.meta | 9 + .../Shaders/TMP_SDF-Mobile Masking.shader | 247 + .../TMP_SDF-Mobile Masking.shader.meta | 9 + .../Shaders/TMP_SDF-Mobile Overlay.shader | 240 + .../TMP_SDF-Mobile Overlay.shader.meta | 9 + .../Shaders/TMP_SDF-Mobile SSD.shader | 106 + .../Shaders/TMP_SDF-Mobile SSD.shader.meta | 9 + .../Shaders/TMP_SDF-Mobile.shader | 240 + .../Shaders/TMP_SDF-Mobile.shader.meta | 9 + .../Shaders/TMP_SDF-Surface-Mobile.shader | 138 + .../TMP_SDF-Surface-Mobile.shader.meta | 9 + .../Shaders/TMP_SDF-Surface.shader | 158 + .../Shaders/TMP_SDF-Surface.shader.meta | 9 + .../TextMesh Pro/Shaders/TMP_SDF.shader | 317 + .../TextMesh Pro/Shaders/TMP_SDF.shader.meta | 9 + .../TextMesh Pro/Shaders/TMP_Sprite.shader | 116 + .../Shaders/TMP_Sprite.shader.meta | 9 + .../Assets/TextMesh Pro/Shaders/TMPro.cginc | 84 + .../TextMesh Pro/Shaders/TMPro.cginc.meta | 9 + .../TextMesh Pro/Shaders/TMPro_Mobile.cginc | 157 + .../Shaders/TMPro_Mobile.cginc.meta | 9 + .../Shaders/TMPro_Properties.cginc | 85 + .../Shaders/TMPro_Properties.cginc.meta | 9 + .../TextMesh Pro/Shaders/TMPro_Surface.cginc | 101 + .../Shaders/TMPro_Surface.cginc.meta | 9 + BugsnagUnity/Assets/TextMesh Pro/Sprites.meta | 8 + .../Sprites/EmojiOne Attribution.txt | 3 + .../Sprites/EmojiOne Attribution.txt.meta | 7 + .../Assets/TextMesh Pro/Sprites/EmojiOne.json | 156 + .../TextMesh Pro/Sprites/EmojiOne.json.meta | 8 + .../Assets/TextMesh Pro/Sprites/EmojiOne.png | Bin 0 -> 112319 bytes .../TextMesh Pro/Sprites/EmojiOne.png.meta | 431 + .../ProjectSettings/AudioManager.asset | 19 + .../ProjectSettings/ClusterInputManager.asset | 6 + .../ProjectSettings/DynamicsManager.asset | 37 + .../ProjectSettings/EditorBuildSettings.asset | 11 + .../ProjectSettings/EditorSettings.asset | 40 + .../ProjectSettings/GraphicsSettings.asset | 64 + .../ProjectSettings/InputManager.asset | 487 + .../ProjectSettings/MemorySettings.asset | 35 + .../ProjectSettings/NavMeshAreas.asset | 93 + .../ProjectSettings/NetworkManager.asset | 8 + .../PackageManagerSettings.asset | 44 + .../ProjectSettings/Physics2DSettings.asset | 56 + .../ProjectSettings/PresetManager.asset | 7 + .../ProjectSettings/ProjectSettings.asset | 884 ++ .../ProjectSettings/ProjectVersion.txt | 2 + .../ProjectSettings/QualitySettings.asset | 239 + .../SceneTemplateSettings.json | 121 + BugsnagUnity/ProjectSettings/TagManager.asset | 43 + .../ProjectSettings/TimeManager.asset | 9 + .../UnityConnectSettings.asset | 36 + BugsnagUnity/ProjectSettings/VFXManager.asset | 14 + .../VersionControlSettings.asset | 8 + BugsnagUnity/ProjectSettings/XRSettings.asset | 10 + BugsnagUnity/ProjectSettings/boot.config | 0 345 files changed, 32195 insertions(+) create mode 100644 BugsnagUnity/Assets/BugsnagUnity.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Editor.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Editor/icon-dark.png create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Editor/icon-dark.png.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Editor/icon-light.png create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Editor/icon-light.png.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Plugins.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/AutomaticDataCollector.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/AutomaticDataCollector.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs.meta create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs create mode 100644 BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs.meta create mode 100644 BugsnagUnity/Assets/Resources.meta create mode 100644 BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset create mode 100644 BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset.meta create mode 100644 BugsnagUnity/Assets/Scenes.meta create mode 100644 BugsnagUnity/Assets/Scenes/SampleScene.unity create mode 100644 BugsnagUnity/Assets/Scenes/SampleScene.unity.meta create mode 100644 BugsnagUnity/Assets/Scripts.meta create mode 100644 BugsnagUnity/Assets/Scripts/Testing.cs create mode 100644 BugsnagUnity/Assets/Scripts/Testing.cs.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Documentation.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Fonts.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Sprites.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.png create mode 100755 BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta create mode 100644 BugsnagUnity/ProjectSettings/AudioManager.asset create mode 100644 BugsnagUnity/ProjectSettings/ClusterInputManager.asset create mode 100644 BugsnagUnity/ProjectSettings/DynamicsManager.asset create mode 100644 BugsnagUnity/ProjectSettings/EditorBuildSettings.asset create mode 100644 BugsnagUnity/ProjectSettings/EditorSettings.asset create mode 100644 BugsnagUnity/ProjectSettings/GraphicsSettings.asset create mode 100644 BugsnagUnity/ProjectSettings/InputManager.asset create mode 100644 BugsnagUnity/ProjectSettings/MemorySettings.asset create mode 100644 BugsnagUnity/ProjectSettings/NavMeshAreas.asset create mode 100644 BugsnagUnity/ProjectSettings/NetworkManager.asset create mode 100644 BugsnagUnity/ProjectSettings/PackageManagerSettings.asset create mode 100644 BugsnagUnity/ProjectSettings/Physics2DSettings.asset create mode 100644 BugsnagUnity/ProjectSettings/PresetManager.asset create mode 100644 BugsnagUnity/ProjectSettings/ProjectSettings.asset create mode 100644 BugsnagUnity/ProjectSettings/ProjectVersion.txt create mode 100644 BugsnagUnity/ProjectSettings/QualitySettings.asset create mode 100644 BugsnagUnity/ProjectSettings/SceneTemplateSettings.json create mode 100644 BugsnagUnity/ProjectSettings/TagManager.asset create mode 100644 BugsnagUnity/ProjectSettings/TimeManager.asset create mode 100644 BugsnagUnity/ProjectSettings/UnityConnectSettings.asset create mode 100644 BugsnagUnity/ProjectSettings/VFXManager.asset create mode 100644 BugsnagUnity/ProjectSettings/VersionControlSettings.asset create mode 100644 BugsnagUnity/ProjectSettings/XRSettings.asset create mode 100644 BugsnagUnity/ProjectSettings/boot.config diff --git a/BugsnagUnity/Assets/BugsnagUnity.meta b/BugsnagUnity/Assets/BugsnagUnity.meta new file mode 100644 index 000000000..378189945 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fd1ffc4415b604e3c8c51571578023b4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor.meta b/BugsnagUnity/Assets/BugsnagUnity/Editor.meta new file mode 100644 index 000000000..004155a4f --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c67c0003216c49408601f4a1b94f834 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs new file mode 100644 index 000000000..9f2474ce4 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs @@ -0,0 +1,38 @@ +using UnityEditor; +using UnityEngine; +[InitializeOnLoad] +public class BugsnagAddScriptingSymbol : MonoBehaviour +{ + private const string DEFINE_SYMBOL = "BUGSNAG_UNITY_WEB_REQUEST"; + + private static BuildTargetGroup[] _supportedPlatforms = { BuildTargetGroup.Android, BuildTargetGroup.Standalone, BuildTargetGroup.iOS, BuildTargetGroup.WebGL }; + + static BugsnagAddScriptingSymbol() + { + foreach (var target in _supportedPlatforms) + { + try + { + SetScriptingSymbol(target); + } + catch + { + // Some users might not have a platform installed, in that case ignore the error + } + } + } + + static void SetScriptingSymbol(BuildTargetGroup buildTargetGroup) + { + var existingSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup); + if (string.IsNullOrEmpty(existingSymbols)) + { + existingSymbols = DEFINE_SYMBOL; + } + else if (!existingSymbols.Contains(DEFINE_SYMBOL)) + { + existingSymbols += ";" + DEFINE_SYMBOL; + } + PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, existingSymbols); + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs.meta new file mode 100644 index 000000000..671526312 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8e3c9a6b6e3c84299b5a658c6849d7ac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs new file mode 100644 index 000000000..47aef9c77 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace BugsnagUnity.Editor +{ + // This class contains all the code for the EDM4U support menu item. This is removed in UPM releases by the upm-tools/build-upm-package.sh script. + public partial class BugsnagEditor : EditorWindow + { + + // The kotlin Version here needs to match the one in the rake build file. Both should reflect what the android notifier is using. + private const string ANDROID_DEPS_XML = "https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib"; + + private const string EDM_MENU_ITEM = "Window/BugSnag/Enable EDM4U Support"; + + private static string EDMDepsFilePath = "/Bugsnag/Editor/BugsnagAndroidDependencies.xml"; + + private static string KotlinLibsDirPath = "/Bugsnag/Plugins/Android/Kotlin"; + + [MenuItem(EDM_MENU_ITEM, false, 1)] + private static void ToggleEDM() + { + if (IsEDMEnabled()) + { + DisableEDM(); + } + else + { + EnableEDM(); + } + } + + [MenuItem(EDM_MENU_ITEM, true)] + private static bool ToggleEDMValidate() + { + UnityEditor.Menu.SetChecked(EDM_MENU_ITEM, IsEDMEnabled()); + return true; + } + + public static void EnableEDM() + { + try + { + EditDepsFile(true); + UpdateKotlinLibraryImportSettings(false); + AssetDatabase.Refresh(); + } + catch (Exception e) + { + Debug.LogError("Error enabling BugSnag EDM4U support: " + e.Message); + } + + if (IsEDMEnabled()) + { + ReportEDMSuccess("BugSnag EDM4U support successfully enabled.\n\nPlease restart Unity before building."); + } + else + { + ReportEDMError("Error enabling BugSnag EDM4U support.\n\nPlease check the console for error messages"); + } + } + + public static void DisableEDM() + { + try + { + EditDepsFile(false); + UpdateKotlinLibraryImportSettings(true); + AssetDatabase.Refresh(); + } + catch (Exception e) + { + Debug.LogError("Error disabling BugSnag EDM4U support: " + e.Message); + } + + if (!IsEDMEnabled()) + { + ReportEDMSuccess("BugSnag EDM4U support successfully disabled.\n\nPlease restart Unity before building."); + } + else + { + ReportEDMError("Error disabling BugSnag EDM4U support.\n\nPlease check the console for error messages"); + } + } + + private static void ReportEDMSuccess(string msg) + { + BugsnagEDMPopup.Open(msg); + Debug.Log(msg); + } + + private static void ReportEDMError(string msg) + { + BugsnagEDMPopup.Open(msg); + Debug.LogError(msg); + } + + private static void UpdateKotlinLibraryImportSettings(bool active) + { + foreach (var lib in GetKotlinLibs()) + { + lib.SetCompatibleWithPlatform(BuildTarget.Android, active); + lib.SaveAndReimport(); + } + } + + private static void EditDepsFile(bool create) + { + var path = Application.dataPath + EDMDepsFilePath; + if (create) + { + File.WriteAllText(path, ANDROID_DEPS_XML); + } + else + { + File.Delete(path); + File.Delete(path + ".meta"); + } + } + + private static List GetKotlinLibs() + { + var kotlinLibs = new List(); + foreach (var libPath in Directory.GetFiles(Application.dataPath + KotlinLibsDirPath, "*.jar")) + { + kotlinLibs.Add((PluginImporter)AssetImporter.GetAtPath(libPath.Replace(Application.dataPath, "Assets"))); + } + return kotlinLibs; + } + + private static bool IsEDMEnabled() + { + if (!File.Exists(Application.dataPath + EDMDepsFilePath)) + { + return false; + } + foreach (var lib in GetKotlinLibs()) + { + if (lib.GetCompatibleWithPlatform(BuildTarget.Android)) + { + return false; + } + } + return true; + } + } + + public class BugsnagEDMPopup : EditorWindow + { + private static string _msg; + + public static void Open(string msg) + { + _msg = msg; + BugsnagEDMPopup window = ScriptableObject.CreateInstance(); + window.position = new Rect(Screen.width / 2, Screen.height / 2, 200, 110); + window.ShowPopup(); + } + + void OnGUI() + { + var style = EditorStyles.wordWrappedLabel; + style.alignment = TextAnchor.MiddleCenter; + GUILayout.Space(5); + EditorGUILayout.LabelField(_msg, style); + GUILayout.Space(5); + if (GUILayout.Button("ok")) this.Close(); + } + } + +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs.meta new file mode 100644 index 000000000..f417161c4 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 55fc4b302697348259084ed568410d50 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs new file mode 100644 index 000000000..dc070068b --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs @@ -0,0 +1,252 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System.IO; +using BugsnagUnity; +using UnityEditor.Callbacks; +using System.Linq; +using System; + +namespace BugsnagUnity.Editor +{ + public partial class BugsnagEditor : EditorWindow + { + + private bool _showBasicConfig = true; + + private bool _showAdvancedSettings, _showAppInformation, _showEndpoints, _showEnabledErrorTypes, _showSwitch; + + public Texture DarkIcon, LightIcon; + + private Vector2 _scrollPos; + + + private void OnEnable() + { + titleContent.text = "BugSnag"; + CheckForSettingsCreation(); + } + + [MenuItem("Window/BugSnag/Configuration", false, 0)] + public static void ShowWindow() + { + CheckForSettingsCreation(); + GetWindow(typeof(BugsnagEditor)); + } + + private void Update() + { + CheckForSettingsCreation(); + } + + private void OnGUI() + { + DrawIcon(); + if (SettingsFileFound()) + { + DrawSettingsEditorWindow(); + } + } + + private static bool SettingsFileFound() + { + return File.Exists(Application.dataPath + "/Resources/Bugsnag/BugsnagSettingsObject.asset"); + } + + private static void CheckForSettingsCreation() + { + if (!SettingsFileFound()) + { + CreateNewSettingsFile(); + } + } + + private void DrawIcon() + { + titleContent.image = EditorGUIUtility.isProSkin ? LightIcon : DarkIcon; + } + + private void DrawSettingsEditorWindow() + { + _scrollPos = EditorGUILayout.BeginScrollView(_scrollPos, + false, + false); + GUILayout.BeginVertical(); + + GUILayout.Space(10); + var settings = GetSettingsObject(); + var so = new SerializedObject(settings); + + var assemblyName = BugsnagUnity.Configuration.GetAssemblyName(); + var version = assemblyName.Version; + EditorGUILayout.LabelField($"BugSnag Unity version {version.Major}.{version.Minor}.{version.Build}"); + + _showBasicConfig = EditorGUILayout.Foldout(_showBasicConfig, "Basic Configuration", true); + if (_showBasicConfig) + { + DrawBasicConfiguration(settings); + } + + GUILayout.Space(5); + _showAdvancedSettings = EditorGUILayout.Foldout(_showAdvancedSettings, "Advanced Configuration", true); + if (_showAdvancedSettings) + { + DrawAdvancedSettings(so, settings); + } + + GUILayout.Space(5); + _showAppInformation = EditorGUILayout.Foldout(_showAppInformation, "App Information", true); + if (_showAppInformation) + { + DrawAppInfo(so, settings); + } + + GUILayout.Space(5); + _showEndpoints = EditorGUILayout.Foldout(_showEndpoints, "Endpoints", true); + if (_showEndpoints) + { + DrawEndpoints(so); + } + + GUILayout.Space(5); + _showSwitch = EditorGUILayout.Foldout(_showSwitch, new GUIContent("Nintendo Switch ⓘ", "Requires Nintendo Switch Bugsnag plugin"), true); + if (_showSwitch) + { + DrawSwitchOptions(so); + } + + GUILayout.Space(10); + + GUILayout.EndVertical(); + EditorGUILayout.EndScrollView(); + so.ApplyModifiedProperties(); + EditorUtility.SetDirty(settings); + } + + private void DrawBasicConfiguration(BugsnagSettingsObject settings) + { + EditorGUI.indentLevel++; + var originalWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 70; + settings.ApiKey = EditorGUILayout.TextField("API Key", settings.ApiKey); + EditorGUIUtility.labelWidth = 280; + settings.StartAutomaticallyAtLaunch = EditorGUILayout.Toggle("Start Automatically (requires API key to be set)", settings.StartAutomaticallyAtLaunch); + EditorGUIUtility.labelWidth = originalWidth; + EditorGUI.indentLevel--; + } + + private void DrawEndpoints(SerializedObject so) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(so.FindProperty("NotifyEndpoint")); + EditorGUILayout.PropertyField(so.FindProperty("SessionEndpoint")); + EditorGUI.indentLevel--; + } + + private void DrawAppInfo(SerializedObject so, BugsnagSettingsObject settings) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(so.FindProperty("AppType")); + EditorGUILayout.PropertyField(so.FindProperty("AppVersion")); + EditorGUILayout.PropertyField(so.FindProperty("ReleaseStage")); + settings.VersionCode = EditorGUILayout.IntField(new GUIContent("Version Code ⓘ", "Android devices only"), settings.VersionCode); + settings.BundleVersion = EditorGUILayout.TextField(new GUIContent("Bundle Version ⓘ", "Apple devices only"), settings.BundleVersion); + EditorGUI.indentLevel--; + } + + private void DrawAdvancedSettings(SerializedObject so, BugsnagSettingsObject settings) + { + EditorGUI.indentLevel++; + var originalWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 270; + var appHangThresholdMillisValue = EditorGUILayout.LongField(new GUIContent("App Hang Threshold Millis ⓘ", "Apple devices only"), (long)settings.AppHangThresholdMillis); + if (appHangThresholdMillisValue >= 0) + { + settings.AppHangThresholdMillis = (ulong)appHangThresholdMillisValue; + } + EditorGUILayout.PropertyField(so.FindProperty("AutoDetectErrors")); + EditorGUILayout.PropertyField(so.FindProperty("AutoTrackSessions")); + EditorGUILayout.PropertyField(so.FindProperty("GenerateAnonymousId")); + EditorGUILayout.PropertyField(so.FindProperty("BreadcrumbLogLevel")); + EditorGUILayout.PropertyField(so.FindProperty("Context")); + EditorGUILayout.PropertyField(so.FindProperty("DiscardClasses")); + EditorGUILayout.PropertyField(so.FindProperty("EnabledBreadcrumbTypes")); + DrawEnabledErrorTypesDropdown(settings); + EditorGUILayout.PropertyField(so.FindProperty("EnabledReleaseStages")); + EditorGUILayout.PropertyField(so.FindProperty("LaunchDurationMillis")); + settings.MaximumBreadcrumbs = EditorGUILayout.IntField("Max Breadcrumbs", settings.MaximumBreadcrumbs); + EditorGUILayout.PropertyField(so.FindProperty("MaxPersistedEvents")); + EditorGUILayout.PropertyField(so.FindProperty("MaxPersistedSessions")); + settings.MaxReportedThreads = EditorGUILayout.IntField(new GUIContent("Max Reported Threads ⓘ", "Android devices only"), settings.MaxReportedThreads); + EditorGUILayout.PropertyField(so.FindProperty("MaxStringValueLength")); + EditorGUILayout.PropertyField(so.FindProperty("NotifyLogLevel")); + EditorGUILayout.PropertyField(so.FindProperty("PersistUser")); + EditorGUILayout.PropertyField(so.FindProperty("RedactedKeys")); + EditorGUILayout.PropertyField(so.FindProperty("ReportExceptionLogsAsHandled")); + EditorGUILayout.PropertyField(so.FindProperty("SecondsPerUniqueLog")); + EditorGUILayout.PropertyField(so.FindProperty("SendLaunchCrashesSynchronously")); + EditorGUILayout.PropertyField(so.FindProperty("SendThreads")); + EditorGUILayout.PropertyField(so.FindProperty("Telemetry")); + EditorGUIUtility.labelWidth = originalWidth; + EditorGUI.indentLevel--; + + } + + private void DrawSwitchOptions(SerializedObject so) + { + EditorGUI.indentLevel++; + EditorGUILayout.PropertyField(so.FindProperty("SwitchCacheIndex")); + EditorGUILayout.PropertyField(so.FindProperty("SwitchCacheMaxSize")); + EditorGUILayout.PropertyField(so.FindProperty("SwitchCacheMountName")); + EditorGUILayout.PropertyField(so.FindProperty("SwitchCacheType")); + EditorGUI.indentLevel--; + } + + private void DrawEnabledErrorTypesDropdown(BugsnagSettingsObject settings) + { + + var style = new GUIStyle(GUI.skin.GetStyle("foldout")); + style.margin = new RectOffset(2, 0, 0, 0); + _showEnabledErrorTypes = EditorGUILayout.Foldout(_showEnabledErrorTypes, "Enabled Error Types", true, style); + if (_showEnabledErrorTypes) + { + EditorGUI.indentLevel += 2; + settings.EnabledErrorTypes.ANRs = EditorGUILayout.Toggle(new GUIContent("ANRs ⓘ", "Android devices only"), settings.EnabledErrorTypes.ANRs); + settings.EnabledErrorTypes.AppHangs = EditorGUILayout.Toggle(new GUIContent("App Hangs ⓘ", "Apple devices only"), settings.EnabledErrorTypes.AppHangs); + settings.EnabledErrorTypes.Crashes = EditorGUILayout.Toggle(new GUIContent("Crashes ⓘ", "Android and Apple devices only"), settings.EnabledErrorTypes.Crashes); + settings.EnabledErrorTypes.OOMs = EditorGUILayout.Toggle(new GUIContent("OOMs ⓘ", "iOS devices only"), settings.EnabledErrorTypes.OOMs); + settings.EnabledErrorTypes.ThermalKills = EditorGUILayout.Toggle(new GUIContent("Thermal Kills ⓘ", "iOS devices only"), settings.EnabledErrorTypes.ThermalKills); + settings.EnabledErrorTypes.UnityLog = EditorGUILayout.Toggle("Unity Logs", settings.EnabledErrorTypes.UnityLog); + EditorGUI.indentLevel -= 2; + } + } + + private BugsnagSettingsObject GetSettingsObject() + { + return Resources.Load("Bugsnag/BugsnagSettingsObject"); + } + + private static void CreateNewSettingsFile() + { + var resPath = Application.dataPath + "/Resources/Bugsnag"; + Directory.CreateDirectory(resPath); + var asset = CreateInstance(); + AssetDatabase.CreateAsset(asset, "Assets/Resources/Bugsnag/BugsnagSettingsObject.asset"); + AssetDatabase.SaveAssets(); + } + +#if UNITY_IOS || UNITY_TVOS + [PostProcessBuild(1400)] + public static void OnPostProcessBuild(BuildTarget target, string path) + { + var xcodeProjectPath = Path.Combine(path, "Unity-iPhone.xcodeproj"); + var pbxPath = Path.Combine(xcodeProjectPath, "project.pbxproj"); + var lines = new LinkedList(File.ReadAllLines(pbxPath)); + BugsnagUnity.PostProcessBuild.Apply(lines); + File.WriteAllLines(pbxPath, lines.ToArray()); + } +#endif + + } +} \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs.meta new file mode 100644 index 000000000..926d16619 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 935253df38ee5445abc731056be30899 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - m_PersistentViewDataDictionary: {instanceID: 0} + - DarkIcon: {fileID: 2800000, guid: 2785e0366c7a34c068497d1bb94c6cb2, type: 3} + - LightIcon: {fileID: 2800000, guid: 7ee8345965a96421e8a7b46a262d3567, type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/icon-dark.png b/BugsnagUnity/Assets/BugsnagUnity/Editor/icon-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..32a7d0fa619af598848be1bd9a38447feee877b2 GIT binary patch literal 1563 zcmaJ>c~BEq7!QYnICxNT0y4N=I~tG89@&H>B|?%78ZihV#kAu%?C}CCBpY`Z2`R0B zVy&GPMZtPaz3ogr#u?ku+E#0;R!dPFr+60}ZPhw59#gO$(+v>oAC5b-``-KB_xrxz zckRc81v8S9(vwswRkCv?^OTfDAF9j1O4gp2J6Ai03Tu zT)hi(1?`}mpBWZGak#+4hAUVT2j@(OvO{LYfFH;-6!KRFBy-3D_uDlq`-m8Yp?(#) z!U7MF^12EkyC4E6ON%2chG9^aNz2g;%`(h1h`rkpHrxhx0GC|X@zt*zE+1+fgpO(qkH5hy_*iUuOp1Y|md1f&U33lxx8kq^qe z5P%{UX-24$EwDm$AO?TX<$7T_APr_p$r&1=gD9@WP`^JCSiiO;yTSi7Ua2j4YJvcD z14*b7S*0Mp2~n_;yw^L5C@O5sb3|UL3SCJFY?U7bWG7{Tl^ZR`b7q}>z1~XMj5aH2k7Atx zNu~oVi2CLg--B4)Yq4g#2xwUlJ%UgfZG*ycK^CNPAqWvVEe2^^G|LAflF5-O4FpXA zkzWM3JW=pN{b@Gyub{x_N!G{#Bce0vX@sO{8lhRE4#8;BKV zi4sOI%Ep|90i6%ilZek~zz`!KS;XWcFvQ0geH<{*go)6>s6r8qbk0ki6cs7$8QH!V z4CU}*v_L?aCs7%kw)M6Sl`0l-QdUps(%rScPNf!(IoYH3JxE-4g0anFPA^-WTQbYF zXvG*u^QU`m6uDEzY77RrDQ#)vFR`aiH@L@c^+Kzv=Xd}6{LcG-uMMJ7*+lV9ac}Rp zN2D`78y~*id4190mcm(|r!bG-Nuug*6>3ToTwO!2G^FTK6FbwI;>SU$2O1WvRL>s1 z{I~15V^c#T{u%8(I_$!;riPraau1HLxNMysivOr|Sm?HH=exN-KYKcfom!f{`@a3s z(dpZc2U>@;=U$z}O4Mpi;qY{8rbadQ`4ni{ng@XoW8YXkaZZ=|N=MQs2QC>~LeGfy zs=e&~$MrG!ne`*iCVN)qf1!!9Kkutk{}FSMs^xc`Z{K<7`@7>;K4nLd8%7W5EiEQ` zx19f-OWWPx#NvF`98Cf)|5?lV8=+i%}opQn3pH1o^&pT6T39OOq9UAvm_L0jF9c~5qDHx=w! zb@p=X<)`PSymxP7CThbrwHuFZ8?~V+t!Dqt4M%+1)?3HNzop*NrYY~fx;fq!bIAL3 s{*1o1V^ng9WBZ-sy^D($c&^2(RqEQ>=E^s1KSqAnPDcT?*H+r_A4pF;>Hq)$ literal 0 HcmV?d00001 diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/icon-dark.png.meta b/BugsnagUnity/Assets/BugsnagUnity/Editor/icon-dark.png.meta new file mode 100644 index 000000000..80d10ac80 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Editor/icon-dark.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 2785e0366c7a34c068497d1bb94c6cb2 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: ff77212589ad64b1f9e9fb9994712e46 + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/icon-light.png b/BugsnagUnity/Assets/BugsnagUnity/Editor/icon-light.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3bed7fe74fe1fd2d6c14336a360a4442f4e8ce GIT binary patch literal 1568 zcmaJ>c~BEq7>|l5)Tjv6dbBR<)T3pyyUA`y7NV02NlOr7YBR-ym)#eLkZjy6k_780 zib&N~MjfS{UZ`jX5usSoG9DG{Fhf;zyxLA%wS_X)vpPD+U^hUle>m>U?tAZh-|zc= z-?bH4nRDf_lVW8uncR|YvPmlven&=2UwW`{VRcZtP7fHFPDJ0W86fIMh} zfD0~bgQ+svu(fWxLv&a(7?$@aKv+i+@c1OOOqMz)-~(&{6cH!Pb9;5@o$rsKh?~=) z@6%So>NCQ8cX~*G^Fx_-HdMfBIdsl!BsIWD20Ty%NWfF*^)mq-+HaSU_F*xOBK<02 zfesxY<*;TUMqYqOvVz1|f*_D&t%3tiz&f2th>}o}I6>hgg%Jd!(lQi<3_hsjPT*XO z&6GCiOgib%d{Oi6{lQb}Y&?|xf=JijDSTI39E4Y24 zoA)ANi@?bji8@rGIuL`$XSF^v?DY?3O3E1?06v^l5V*$^4y<3>FWTV$G+wCfw+DR? zw?RK&B(PFJT+&G&E^QBT2JSYbNyuJx%LP28}^a86#MW z*DnGu3nRYWlJ7xm@=LLdQGh_?1v}3dM%o}NpBH(5KJP=6Dg}Yev;x-c4NGQ)t27X_ z2@3AzkV_MI57M7z#{B{cPMTsh9MoVc4Gk~~0Du8jqrwP4se#H#I5{Uk2l3o<=^N-% zNg{>ei?Csm38-=rG=;e|Y68I z4Tf}hHd@dt&66MvPGQR7B{JDirNyMT2Y&wN^4WJ2z?9SXsusRVCncm7j?W&E5@>jO zd`)z9VC48lJ?q0OwL`^kO zw^#m6+_ByjrMC8*%x?Lug3c%SweLDN9ctdVbm7BaMr8Dr*w+UyC~meGuDx;T;fw`O z|2CG4-I@E!oqaw$r)zPjEIIH|*K4O)>UuNt?~a9fmDu@(z}ckJiNniyE73 zXS%O+Y;O7LMsxMHTV3(J_WDQXV>5Gt?4^dCjlb93AHH(#3H1*echUa!2USZG?tr*$ z%j`4umF)U;6U&+K(); + appMetadata.Add("companyName", Application.companyName); + appMetadata.Add("name", Application.productName); + nativeClient.AddNativeMetadata("app",appMetadata); + + //data added to metadata.device + var deviceMetadata = new Dictionary(); + deviceMetadata.Add("screenDensity", Screen.dpi.ToString()); + var res = Screen.currentResolution; + deviceMetadata.Add("screenResolution", string.Format("{0}x{1}", res.width, res.height)); + deviceMetadata.Add("graphicsDeviceVersion", SystemInfo.graphicsDeviceVersion); + deviceMetadata.Add("graphicsMemorySize", SystemInfo.graphicsMemorySize.ToString()); + deviceMetadata.Add("graphicsShaderLevel", SystemInfo.graphicsShaderLevel.ToString()); + var processorType = SystemInfo.processorType; + if (!string.IsNullOrEmpty(processorType)) + { + deviceMetadata.Add("processorType", processorType); + } + deviceMetadata.Add("osLanguage", Application.systemLanguage.ToString()); + nativeClient.AddNativeMetadata("device", deviceMetadata); + } + + internal static void AddStatefulDeviceData(Metadata metadata) + { + //data added to metadata.device + var deviceMetadata = new Dictionary(); + if (SystemInfo.batteryLevel > -1) + { + deviceMetadata.Add("batteryLevel", SystemInfo.batteryLevel); + } + deviceMetadata.Add("charging", SystemInfo.batteryStatus.Equals(BatteryStatus.Charging)); + metadata.AddMetadata("device", deviceMetadata); + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/AutomaticDataCollector.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/AutomaticDataCollector.cs.meta new file mode 100644 index 000000000..e7245aa89 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/AutomaticDataCollector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93edb793bc6184b2db2b77d813c41af9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs new file mode 100644 index 000000000..11213e697 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using System.Threading; + +namespace BugsnagUnity +{ + class BlockingQueue + { + Queue Queue { get; } + object QueueLock { get; } + + internal BlockingQueue() + { + QueueLock = new object(); + Queue = new Queue(); + } + + internal void Enqueue(T item) + { + lock (QueueLock) + { + Queue.Enqueue(item); + Monitor.Pulse(QueueLock); + } + } + + internal T Dequeue() + { + lock (QueueLock) + { + while (Queue.Count == 0) + { + Monitor.Wait(QueueLock); + } + + return Queue.Dequeue(); + } + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs.meta new file mode 100644 index 000000000..9e89357ca --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6c8c9273b79fe4238b9196dc090a83bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs new file mode 100644 index 000000000..34622f97a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs @@ -0,0 +1,172 @@ +using System; +using System.Collections.Generic; +using BugsnagUnity.Payload; +using UnityEngine.Networking; + +namespace BugsnagUnity +{ + public static class Bugsnag + { + + private const string INIT_WARNING = "Bugsnag is already running and this call to Start() will be ignored. If this was unexpected please check whether Bugsnag is set to start automatically via the settings dialog."; + + static object _clientLock = new object(); + + public static void Start(string apiKey) + { + Start(new Configuration(apiKey)); + } + + public static void Start(Configuration configuration) + { + + lock (_clientLock) + { + if (InternalClient == null) + { + var configClone = configuration.Clone(); + var nativeClient = new NativeClient(configClone); + InternalClient = new Client(nativeClient); + } + else + { + UnityEngine.Debug.LogWarning(INIT_WARNING); + } + } + } + + public static bool IsStarted() + { + return InternalClient != null; + } + + private static Client InternalClient { get; set; } + + private static IClient Client => InternalClient; + + public static void Notify(string name, string message, string stackTrace, Func callback = null) => InternalClient.Notify(name, message, stackTrace, callback); + + public static void Notify(System.Exception exception, string stacktrace, Func callback = null) => InternalClient.Notify(exception, stacktrace, callback); + + public static void Notify(System.Exception exception, Func callback = null) => InternalClient.Notify(exception, callback); + + public static void Notify(System.Exception exception, Severity severity, Func callback = null) => InternalClient.Notify(exception, severity, callback); + + public static List Breadcrumbs => Client.Breadcrumbs.Retrieve(); + + public static void LeaveBreadcrumb(string message, Dictionary metadata = null, BreadcrumbType type = BreadcrumbType.Manual ) => InternalClient.Breadcrumbs.Leave(message, metadata, type); + + public static void LeaveBreadcrumb(UnityWebRequest request, TimeSpan? duration) => InternalClient.LeaveNetworkBreadcrumb(request, duration); + + public static User GetUser() => Client.GetUser(); + + public static void SetUser(string id, string email, string name) => Client.SetUser(id, email, name); + + public static void StartSession() => InternalClient.SessionTracking.StartSession(); + + public static void PauseSession() => InternalClient.SessionTracking.PauseSession(); + + public static bool ResumeSession() => InternalClient.SessionTracking.ResumeSession(); + + /// + /// Used to signal to the Bugsnag client that the focused state of the + /// application has changed. This is used for session tracking and also + /// the tracking of in foreground time for the application. + /// + /// + public static void SetApplicationState(bool inFocus) + { + if(Client != null) + { + Client.SetApplicationState(inFocus); + } + } + + /// + /// Bugsnag uses the concept of contexts to help display and group your errors. + /// Contexts represent what was happening in your game at the time an error + /// occurs. Unless manually set, this will be automatically set to be your currently active Unity Scene. + /// + public static string Context + { + get + { + return Client.GetContext(); + } + set + { + Client.SetContext(value); + } + } + + /// + /// Setting Configuration.LaunchDurationMillis to 0 will cause Bugsnag to consider the app to be launching until Bugsnag.MarkLaunchCompleted() has been called. + /// + public static void MarkLaunchCompleted() => Client.MarkLaunchCompleted(); + + /// + /// Get information regarding the last application run. This will be null on non mobile platforms. + /// + public static LastRunInfo GetLastRunInfo() => Client.LastRunInfo; + + + /// + /// Add an OnError callback to run when an error occurs + /// + public static void AddOnError(Func bugsnagCallback) => Client.AddOnError(bugsnagCallback); + + /// + /// Remove an OnError callback + /// + public static void RemoveOnError(Func bugsnagCallback) => Client.RemoveOnError(bugsnagCallback); + + /// + /// Add an OnSession callback to run when an session is created + /// + public static void AddOnSession(Func callback) => Client.AddOnSession(callback); + + /// + /// Remove an OnSession callback + /// + public static void RemoveOnSession(Func callback) => Client.RemoveOnSession(callback); + + /// + /// AddMetadata that will appear in every reported event + /// + public static void AddMetadata(string section, string key, object value) => Client.AddMetadata(section, key, value); + + /// + /// AddMetadata that will appear in every reported event + /// + public static void AddMetadata(string section, IDictionary metadata) => Client.AddMetadata(section, metadata); + + /// + /// Clear the metadata stored in the specified section + /// + public static void ClearMetadata(string section) => Client.ClearMetadata(section); + + /// + /// Clear the metadata stored with the specified section and key + /// + public static void ClearMetadata(string section, string key) => Client.ClearMetadata(section, key); + + /// + /// Get the metadata stored in the specified section + /// + public static IDictionary GetMetadata(string section) => Client.GetMetadata(section); + + /// + /// Get the metadata stored with the specified section and key + /// + public static object GetMetadata(string section, string key) => Client.GetMetadata(section, key); + + public static void AddFeatureFlag(string name, string variant = null) => Client.AddFeatureFlag(name,variant); + + public static void AddFeatureFlags(FeatureFlag[] featureFlags) => Client.AddFeatureFlags(featureFlags); + + public static void ClearFeatureFlag(string name) => Client.ClearFeatureFlag(name); + + public static void ClearFeatureFlags() => Client.ClearFeatureFlags(); + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs.meta new file mode 100644 index 000000000..dc1979b97 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 056d7fbcc26914051865b334735c71d1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs new file mode 100644 index 000000000..26c076da4 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs @@ -0,0 +1,56 @@ +using UnityEngine; +namespace BugsnagUnity +{ + + public class BugsnagAutoInit + { + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + static void OnBeforeSceneLoadRuntimeMethod() + { + var settings = Resources.Load("Bugsnag/BugsnagSettingsObject"); + if (settings != null && settings.StartAutomaticallyAtLaunch) + { + if(string.IsNullOrEmpty(settings.ApiKey)) + { + Debug.LogError("Bugsnag not auto started as the API key is not set in the Bugsnag Settings window."); + return; + } + var config = settings.GetConfig(); + config.ScriptingBackend = FindScriptingBackend(); + config.DotnetScriptingRuntime = FindDotnetScriptingRuntime(); + config.DotnetApiCompatibility = FindDotnetApiCompatibility(); + Bugsnag.Start(config); + } + } + + private static string FindScriptingBackend() + { +#if ENABLE_MONO + return "Mono"; +#elif ENABLE_IL2CPP + return "IL2CPP"; +#else + return "Unknown"; +#endif + } + + private static string FindDotnetScriptingRuntime() + { +#if NET_4_6 + return ".NET 4.6 equivalent"; +#else + return ".NET 3.5 equivalent"; +#endif + } + + private static string FindDotnetApiCompatibility() + { +#if NET_2_0_SUBSET + return ".NET 2.0 Subset"; +#else + return ".NET 2.0"; +#endif + } + } + +} \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs.meta new file mode 100644 index 000000000..ca0d416a2 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ed73a8b9e01584d74a763fdd2bb3d73e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs new file mode 100644 index 000000000..dbf1f9b91 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs @@ -0,0 +1,221 @@ +using System.Collections.Generic; +using UnityEngine; +using BugsnagUnity.Payload; +using System; + +namespace BugsnagUnity +{ + [Serializable] + public class BugsnagSettingsObject : ScriptableObject + { + + public bool StartAutomaticallyAtLaunch = true; + public bool AutoDetectErrors = true; + public bool AutoTrackSessions = true; + public string ApiKey; + public string AppType; + public ulong AppHangThresholdMillis; + public string AppVersion; + public string BundleVersion; + public EditorLogLevel BreadcrumbLogLevel = EditorLogLevel.Log; + public string Context; + public string[] DiscardClasses; + public string[] EnabledReleaseStages; + public EnabledErrorTypes EnabledErrorTypes = new EnabledErrorTypes(); + public EditorBreadcrumbTypes EnabledBreadcrumbTypes = new EditorBreadcrumbTypes(); + public long LaunchDurationMillis = 5000; + public int MaximumBreadcrumbs = 100; + public int MaxPersistedEvents = 32; + public int MaxPersistedSessions = 128; + public int MaxReportedThreads = 200; + public int MaxStringValueLength = 10000; + public string NotifyEndpoint = "https://notify.bugsnag.com"; + public EditorLogLevel NotifyLogLevel = EditorLogLevel.Exception; + public bool PersistUser = true; + public string SessionEndpoint = "https://sessions.bugsnag.com"; + public ThreadSendPolicy SendThreads = ThreadSendPolicy.UnhandledOnly; + public string[] RedactedKeys = new string[] { ".*password.*" }; + public string ReleaseStage; + public bool ReportExceptionLogsAsHandled = true; + public bool SendLaunchCrashesSynchronously = true; + public double SecondsPerUniqueLog = 5; + public List Telemetry = new List { TelemetryType.InternalErrors, TelemetryType.Usage }; + public int VersionCode = -1; + + public bool GenerateAnonymousId = true; + public SwitchCacheType SwitchCacheType = SwitchCacheType.R; + public string SwitchCacheMountName = "BugsnagCache"; + public int SwitchCacheIndex = 0; + public int SwitchCacheMaxSize = 10485760; + + public static Configuration LoadConfiguration() + { + var settings = Resources.Load("Bugsnag/BugsnagSettingsObject"); + if (settings != null) + { + var config = settings.GetConfig(); + return config; + } + else + { + throw new Exception("No BugsnagSettingsObject found."); + } + } + + public Configuration GetConfig() + { + var config = new Configuration(ApiKey); + config.AutoDetectErrors = AutoDetectErrors; + config.AutoTrackSessions = AutoTrackSessions; + config.AppType = AppType; + if (AppHangThresholdMillis > 0) + { + config.AppHangThresholdMillis = AppHangThresholdMillis; + } + if (!string.IsNullOrEmpty(AppVersion)) + { + config.AppVersion = AppVersion; + } + config.BundleVersion = BundleVersion; + + config.BreadcrumbLogLevel = GetLogTypeFromLogLevel( BreadcrumbLogLevel ); + config.Context = Context; + foreach(string discardedClass in DiscardClasses){ + try + { + config.DiscardClasses.Add(new System.Text.RegularExpressions.Regex(discardedClass)); + } + catch (ArgumentException e) + { + Debug.LogError("Invalid Regex pattern for discard class: " + e.Message); + } + } + if (EnabledReleaseStages != null && EnabledReleaseStages.Length > 0) + { + config.EnabledReleaseStages = EnabledReleaseStages; + } + config.EnabledErrorTypes = EnabledErrorTypes; + config.EnabledBreadcrumbTypes = GetEnabledBreadcrumbTypes(); + config.LaunchDurationMillis = LaunchDurationMillis; + config.MaximumBreadcrumbs = MaximumBreadcrumbs; + config.MaxPersistedEvents = MaxPersistedEvents; + config.MaxPersistedSessions = MaxPersistedSessions; + config.MaxReportedThreads = MaxReportedThreads; + config.MaxStringValueLength = MaxStringValueLength; + config.NotifyLogLevel = GetLogTypeFromLogLevel( NotifyLogLevel ); + config.SendThreads = SendThreads; + if (!string.IsNullOrEmpty(NotifyEndpoint) && !string.IsNullOrEmpty(SessionEndpoint)) + { + config.Endpoints = new EndpointConfiguration(NotifyEndpoint, SessionEndpoint); + } + foreach(string key in RedactedKeys) + { + try + { + config.RedactedKeys.Add(new System.Text.RegularExpressions.Regex(key)); + } + catch (ArgumentException e) + { + Debug.LogError("Invalid Regex pattern for redacted key: " + e.Message); + } + } + if (string.IsNullOrEmpty(ReleaseStage)) + { + config.ReleaseStage = Debug.isDebugBuild ? "development" : "production"; + } + else + { + config.ReleaseStage = ReleaseStage; + } + config.PersistUser = PersistUser; + config.ReportExceptionLogsAsHandled = ReportExceptionLogsAsHandled; + config.SendLaunchCrashesSynchronously = SendLaunchCrashesSynchronously; + config.SecondsPerUniqueLog = TimeSpan.FromSeconds(SecondsPerUniqueLog); + config.Telemetry = Telemetry; + config.VersionCode = VersionCode; + config.GenerateAnonymousId = GenerateAnonymousId; + config.SwitchCacheType = SwitchCacheType; + config.SwitchCacheIndex = SwitchCacheIndex; + config.SwitchCacheMaxSize = SwitchCacheMaxSize; + config.SwitchCacheMountName = SwitchCacheMountName; + + return config; + } + + private BreadcrumbType[] GetEnabledBreadcrumbTypes() + { + var enabledTypes = new List(); + if (EnabledBreadcrumbTypes.Navigation) + { + enabledTypes.Add(BreadcrumbType.Navigation); + } + if (EnabledBreadcrumbTypes.Request) + { + enabledTypes.Add(BreadcrumbType.Request); + } + if (EnabledBreadcrumbTypes.Process) + { + enabledTypes.Add(BreadcrumbType.Process); + } + if (EnabledBreadcrumbTypes.Log) + { + enabledTypes.Add(BreadcrumbType.Log); + } + if (EnabledBreadcrumbTypes.User) + { + enabledTypes.Add(BreadcrumbType.User); + } + if (EnabledBreadcrumbTypes.State) + { + enabledTypes.Add(BreadcrumbType.State); + } + if (EnabledBreadcrumbTypes.Error) + { + enabledTypes.Add(BreadcrumbType.Error); + } + enabledTypes.Add(BreadcrumbType.Manual); + return enabledTypes.ToArray(); + } + + [Serializable] + public class EditorBreadcrumbTypes + { + public bool Error = true; + public bool Log = true; + public bool Navigation = true; + public bool Process = true; + public bool Request = true; + public bool State = true; + public bool User = true; + } + + [Serializable] + public enum EditorLogLevel + { + Exception, + Error, + Assert, + Warning, + Log + } + + + private LogType GetLogTypeFromLogLevel(EditorLogLevel editorLogLevel) + { + switch (editorLogLevel) + { + case EditorLogLevel.Exception: + return LogType.Exception; + case EditorLogLevel.Error: + return LogType.Error; + case EditorLogLevel.Assert: + return LogType.Assert; + case EditorLogLevel.Warning: + return LogType.Warning; + default: + return LogType.Log; + } + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs.meta new file mode 100644 index 000000000..cc077c11a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3e0efee821abb422baf5bb3728925f09 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest.meta new file mode 100644 index 000000000..4ac7e3cb9 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 58466576693af48cfbdd92415cfde237 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs new file mode 100644 index 000000000..ed50b2d81 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs @@ -0,0 +1,353 @@ +using System; +using System.Collections.Generic; +using System.Text; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.Networking; + +namespace BugsnagNetworking +{ + + public class BugsnagUnityWebRequest : IDisposable + { + + public static RequestEvent OnSend = new RequestEvent(); + + public static RequestEvent OnComplete = new RequestEvent(); + + public static RequestEvent OnAbort = new RequestEvent(); + + public UnityWebRequest UnityWebRequest; + + // Constructors + public BugsnagUnityWebRequest() + { + UnityWebRequest = new UnityWebRequest(); + } + + public BugsnagUnityWebRequest(UnityWebRequest unityWebRequest) + { + UnityWebRequest = unityWebRequest; + } + + public BugsnagUnityWebRequest(string url) + { + UnityWebRequest = new UnityWebRequest(url); + } + + public BugsnagUnityWebRequest(Uri uri) + { + UnityWebRequest = new UnityWebRequest(uri); + } + + public BugsnagUnityWebRequest(string url, string method) + { + UnityWebRequest = new UnityWebRequest(url, method); + } + + public BugsnagUnityWebRequest(Uri uri, string method) + { + UnityWebRequest = new UnityWebRequest(uri, method); + } + + // Static Constructors + + // Get + public static BugsnagUnityWebRequest Get(string uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Get(uri)); + } + + public static BugsnagUnityWebRequest Get(Uri uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Get(uri)); + } + + // Post + public static BugsnagUnityWebRequest Post(string uri, string postData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, postData)); + } + + public static BugsnagUnityWebRequest Post(string uri, WWWForm formData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formData)); + } + + public static BugsnagUnityWebRequest Post(string uri, List multipartFormSections) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections)); + } + + public static BugsnagUnityWebRequest Post(string uri, Dictionary formFields) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formFields)); + } + + public static BugsnagUnityWebRequest Post(Uri uri, string postData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, postData)); + } + + public static BugsnagUnityWebRequest Post(Uri uri, WWWForm formData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formData)); + } + + public static BugsnagUnityWebRequest Post(Uri uri, List multipartFormSections) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections)); + } + + public static BugsnagUnityWebRequest Post(Uri uri, Dictionary formFields) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formFields)); + } + + public static BugsnagUnityWebRequest Post(string uri, List multipartFormSections, byte[] boundary) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections, boundary)); + } + + public static BugsnagUnityWebRequest Post(Uri uri, List multipartFormSections, byte[] boundary) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections, boundary)); + } + + // Put + public static BugsnagUnityWebRequest Put(string uri, byte[] bodyData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); + } + + public static BugsnagUnityWebRequest Put(string uri, string bodyData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); + } + + public static BugsnagUnityWebRequest Put(Uri uri, byte[] bodyData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); + } + + public static BugsnagUnityWebRequest Put(Uri uri, string bodyData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); + } + + // Head + public static BugsnagUnityWebRequest Head(string uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Head(uri)); + } + + public static BugsnagUnityWebRequest Head(Uri uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Head(uri)); + } + + // Delete + public static BugsnagUnityWebRequest Delete(string uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Delete(uri)); + } + + public static BugsnagUnityWebRequest Delete(Uri uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Delete(uri)); + } + + // Static Methods + + public static void ClearCookieCache() + { + UnityWebRequest.ClearCookieCache(); + } + + public static string EscapeURL(string s) + { + return UnityWebRequest.EscapeURL(s); + } + + public static string EscapeURL(string s, Encoding e) + { + return UnityWebRequest.EscapeURL(s, e); + } + + public static string UnEscapeURL(string s) + { + return UnityWebRequest.UnEscapeURL(s); + } + + public static string UnEscapeURL(string s, Encoding e) + { + return UnityWebRequest.UnEscapeURL(s, e); + } + + public static byte[] GenerateBoundary() + { + return UnityWebRequest.GenerateBoundary(); + } + + public static byte[] SerializeFormSections(List multipartFormSections, byte[] boundary) + { + return UnityWebRequest.SerializeFormSections(multipartFormSections, boundary); + } + + public static byte[] SerializeSimpleForm(Dictionary formFields) + { + return UnityWebRequest.SerializeSimpleForm(formFields); + } + + + // Public methods + + public UnityWebRequestAsyncOperation SendWebRequest() + { + OnSend.Invoke(this); + var asyncAction = UnityWebRequest.SendWebRequest(); + asyncAction.completed += RequestCompleted; + return asyncAction; + } + + private void RequestCompleted(AsyncOperation obj) + { + OnComplete.Invoke(this); + } + + public void Abort() + { + OnAbort.Invoke(this); + UnityWebRequest.Abort(); + } + + public string GetRequestHeader(string name) => UnityWebRequest.GetRequestHeader(name); + + public string GetResponseHeader(string name) => UnityWebRequest.GetResponseHeader(name); + + public Dictionary GetResponseHeaders() => UnityWebRequest.GetResponseHeaders(); + + public void SetRequestHeader(string name, string value) => UnityWebRequest.SetRequestHeader(name, value); + + public void Dispose() => UnityWebRequest.Dispose(); + + // Static Properties + + public static string kHttpVerbCREATE => UnityWebRequest.kHttpVerbCREATE; + + public static string kHttpVerbDELETE => UnityWebRequest.kHttpVerbDELETE; + + public static string kHttpVerbGET => UnityWebRequest.kHttpVerbGET; + + public static string kHttpVerbHEAD => UnityWebRequest.kHttpVerbHEAD; + + public static string kHttpVerbPOST => UnityWebRequest.kHttpVerbPOST; + + public static string kHttpVerbPUT => UnityWebRequest.kHttpVerbPUT; + + // Properties + + public UnityEngine.Networking.CertificateHandler certificateHandler + { + get { return UnityWebRequest.certificateHandler; } + set { UnityWebRequest.certificateHandler = value; } + } + + public bool disposeCertificateHandlerOnDispose + { + get { return UnityWebRequest.disposeCertificateHandlerOnDispose; } + set { UnityWebRequest.disposeCertificateHandlerOnDispose = value; } + } + + public bool disposeDownloadHandlerOnDispose + { + get { return UnityWebRequest.disposeDownloadHandlerOnDispose; } + set { UnityWebRequest.disposeDownloadHandlerOnDispose = value; } + } + + public bool disposeUploadHandlerOnDispose + { + get { return UnityWebRequest.disposeUploadHandlerOnDispose; } + set { UnityWebRequest.disposeUploadHandlerOnDispose = value; } + } + + public ulong downloadedBytes => UnityWebRequest.downloadedBytes; + + + public UnityEngine.Networking.DownloadHandler downloadHandler + { + get { return UnityWebRequest.downloadHandler; } + set { UnityWebRequest.downloadHandler = value; } + } + + public UnityEngine.Networking.UploadHandler uploadHandler + { + get { return UnityWebRequest.uploadHandler; } + set { UnityWebRequest.uploadHandler = value; } + } + + public float downloadProgress => UnityWebRequest.downloadProgress; + + public string error => UnityWebRequest.error; + + public bool isModifiable => UnityWebRequest.isModifiable; + + public string method + { + get { return UnityWebRequest.method; } + set { UnityWebRequest.method = value; } + } + + public int redirectLimit + { + get { return UnityWebRequest.redirectLimit; } + set { UnityWebRequest.redirectLimit = value; } + } + + public int timeout + { + get { return UnityWebRequest.timeout; } + set { UnityWebRequest.timeout = value; } + } + + public ulong uploadedBytes => UnityWebRequest.uploadedBytes; + + public Uri uri + { + get { return UnityWebRequest.uri; } + set { UnityWebRequest.uri = value; } + } + + public string url + { + get { return UnityWebRequest.url; } + set { UnityWebRequest.url = value; } + } + + public bool useHttpContinue + { + get { return UnityWebRequest.useHttpContinue; } + set { UnityWebRequest.useHttpContinue = value; } + } + + + public bool isDone => UnityWebRequest.isDone; + + public bool isNetworkError => UnityWebRequest.isNetworkError; + + public bool isHttpError => UnityWebRequest.isHttpError; + + public long responseCode => UnityWebRequest.responseCode; + + public float uploadProgress => UnityWebRequest.uploadProgress; + + + } + + [System.Serializable] + public class RequestEvent : UnityEvent + { + + } + +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta new file mode 100644 index 000000000..ce383c0b7 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b82aeb55494974c79ae37b3af2925117 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md new file mode 100644 index 000000000..99b252299 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md @@ -0,0 +1,7 @@ +# bugsnag-unity-web-request + +This is a wrapper for the Unity [UnityWebRequest](https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.html) class. + +It allows the BugSnag Unity Performance SDK and the BugSnag Unity Notifier to be notified of the start and end points of a UnityWebRequest. + +To use, simply use the class BugsnagUnityWebRequest in your project exactly the same way you would use UnityWebRequest. diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md.meta new file mode 100644 index 000000000..9212e3217 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0acd0c2134cda483eb3406faf5ad891f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs new file mode 100644 index 000000000..b06e4f33f --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs @@ -0,0 +1,744 @@ +using BugsnagUnity.Payload; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using UnityEngine; +using UnityEngine.SceneManagement; +using System; +using System.Collections; +using System.Reflection; +using BugsnagNetworking; +using UnityEngine.Networking; + +namespace BugsnagUnity +{ + internal class Client : IClient + { + public Configuration Configuration => NativeClient.Configuration; + + public IBreadcrumbs Breadcrumbs => NativeClient.Breadcrumbs; + + public ISessionTracker SessionTracking { get; } + + public LastRunInfo LastRunInfo => NativeClient.GetLastRunInfo(); + + private User _cachedUser; + + private Metadata _storedMetadata; + + private UniqueLogThrottle _uniqueCounter; + + private MaximumLogTypeCounter _logTypeCounter; + + internal CacheManager CacheManager; + + internal PayloadManager PayloadManager; + + private Delivery _delivery; + + object CallbackLock { get; } = new object(); + + internal INativeClient NativeClient { get; } + + private Stopwatch _foregroundStopwatch; + + private Stopwatch _backgroundStopwatch; + + bool InForeground => _foregroundStopwatch.IsRunning; + + private Thread MainThread; + + private static double AutoCaptureSessionThresholdSeconds = 30; + + private static object autoSessionLock = new object(); + + private OrderedDictionary _featureFlags; + + private bool _isUnity2019OrHigher; + + private class BugsnagLogHandler : ILogHandler + { + + private ILogHandler _oldLogHandler; + + private Client _client; + + private Configuration _config => _client.Configuration; + + public BugsnagLogHandler(ILogHandler oldLogHandler, Client client) + { + _oldLogHandler = oldLogHandler; + _client = client; + } + + public void LogException(System.Exception exception, UnityEngine.Object context) + { + if (exception == null) + { + return; + } + if (_config.AutoDetectErrors && LogType.Exception.IsGreaterThanOrEqualTo(_config.NotifyLogLevel)) + { + var unityLogMessage = new UnityLogMessage(exception); + var shouldSend = Error.ShouldSend(exception) + && _client._uniqueCounter.ShouldSend(unityLogMessage) + && _client._logTypeCounter.ShouldSend(unityLogMessage); + if (shouldSend) + { + var handledState = _config.ReportExceptionLogsAsHandled ? HandledState.ForLoggedException() : HandledState.ForUnhandledException(); + _client.Notify(exception, handledState, null); + } + } + if (_oldLogHandler != null) + { + _oldLogHandler.LogException(exception, context); + } + } + + public void LogFormat(LogType logType, UnityEngine.Object context, string format, params object[] args) + { + if (_oldLogHandler != null) + { + _oldLogHandler.LogFormat(logType, context, format, args); + } + } + } + + private void SetupAdvancedExceptionInterceptor() + { + var oldHandler = UnityEngine.Debug.unityLogger.logHandler; + UnityEngine.Debug.unityLogger.logHandler = new BugsnagLogHandler(oldHandler, this); + } + + public Client(INativeClient nativeClient) + { + InitMainthreadDispatcher(); + NativeClient = nativeClient; + CacheManager = new CacheManager(Configuration); + PayloadManager = new PayloadManager(CacheManager); + _delivery = new Delivery(this, Configuration, CacheManager, PayloadManager); + MainThread = Thread.CurrentThread; + SessionTracking = new SessionTracker(this); + _isUnity2019OrHigher = IsUnity2019OrHigher(); + InitStopwatches(); + InitUserObject(); + InitMetadata(); + InitFeatureFlags(); + InitCounters(); + if (_isUnity2019OrHigher) + { + SetupAdvancedExceptionInterceptor(); + } + InitTimingTracker(); + StartInitialSession(); + CheckForMisconfiguredEndpointsWarning(); + AddBugsnagLoadedBreadcrumb(); + _delivery.StartDeliveringCachedPayloads(); + ListenForSceneLoad(); + SetupNetworkListeners(); + InitLogHandlers(); + } + + private void InitMainthreadDispatcher() + { + MainThreadDispatchBehaviour.Instance(); + } + + private bool IsUnity2019OrHigher() + { + var version = Application.unityVersion; + //will be null in unit tests + if (version == null) + { + return false; + } + return !version.Contains("2017") && + !version.Contains("2018"); + } + + private void InitFeatureFlags() + { + if (Configuration.FeatureFlags != null) + { + _featureFlags = Configuration.FeatureFlags; + } + else + { + _featureFlags = new OrderedDictionary(); + } + } + + private void StartInitialSession() + { + if (IsUsingFallback() && Configuration.AutoTrackSessions && SessionTracking.CurrentSession == null) + { + SessionTracking.StartSession(); + } + } + + private void InitTimingTracker() + { + var timingTrackerObject = new GameObject("Bugsnag app lifecycle tracker"); + timingTrackerObject.AddComponent(); + } + + private void InitLogHandlers() + { + Application.logMessageReceivedThreaded += MultiThreadedNotify; + Application.logMessageReceived += NotifyFromUnityLog; + } + + private void InitCounters() + { + _uniqueCounter = new UniqueLogThrottle(Configuration); + _logTypeCounter = new MaximumLogTypeCounter(Configuration); + } + + private void InitMetadata() + { + _storedMetadata = new Metadata(NativeClient); + _storedMetadata.MergeMetadata(Configuration.Metadata.Payload); + AutomaticDataCollector.SetDefaultData(NativeClient); + } + + private void InitStopwatches() + { + _foregroundStopwatch = new Stopwatch(); + _backgroundStopwatch = new Stopwatch(); + // Required in case the focus event is not recieved (if Bugsnag is started after it is sent) + _foregroundStopwatch.Start(); + } + + private void InitUserObject() + { + if (Configuration.GetUser() != null) + { + // if a user is supplied in the config then use that + _cachedUser = Configuration.GetUser(); + } + else + { + // otherwise create one + _cachedUser = new User { Id = CacheManager.GetCachedDeviceId() }; + // see if a native user is avaliable + NativeClient.PopulateUser(_cachedUser); + } + // listen for changes and pass the data to the native layer + _cachedUser.PropertyChanged.AddListener(() => { NativeClient.SetUser(_cachedUser); }); + } + + private void CheckForMisconfiguredEndpointsWarning() + { + var endpoints = Configuration.Endpoints; + if (endpoints.IsValid) + { + return; + } + if (endpoints.NotifyIsCustom && !endpoints.SessionIsCustom) + { + UnityEngine.Debug.LogWarning("Invalid configuration. endpoints.Notify cannot be set without also setting endpoints.Session. Events will not be sent to Bugsnag."); + } + if (!endpoints.NotifyIsCustom && endpoints.SessionIsCustom) + { + UnityEngine.Debug.LogWarning("Invalid configuration. endpoints.Session cannot be set without also setting endpoints.Notify. Sessions will not be sent to Bugsnag."); + } + } + + private void AddBugsnagLoadedBreadcrumb() + { + if (IsUsingFallback() && Configuration.IsBreadcrumbTypeEnabled(BreadcrumbType.State)) + { + Breadcrumbs.Leave("Bugsnag loaded", null, BreadcrumbType.State); + } + } + + public bool IsUsingFallback() + { + return Application.platform != RuntimePlatform.Android && + Application.platform != RuntimePlatform.OSXPlayer && + Application.platform != RuntimePlatform.IPhonePlayer; + } + + private void ListenForSceneLoad() + { + SceneManager.sceneLoaded += (Scene scene, LoadSceneMode loadSceneMode) => + { + if (Configuration.IsBreadcrumbTypeEnabled(BreadcrumbType.Navigation)) + { + Breadcrumbs.Leave("Scene Loaded", new Dictionary { { "sceneName", scene.name } }, BreadcrumbType.Navigation); + } + _storedMetadata.AddMetadata("app", "lastLoadedUnityScene", scene.name); + }; + } + + public void Send(IPayload payload) + { + if (!ShouldSendRequests()) + { + return; + } + _delivery.Deliver(payload); + } + + void MultiThreadedNotify(string condition, string stackTrace, LogType logType) + { + // Discard messages from the main thread as they will be reported separately + if (!ReferenceEquals(Thread.CurrentThread, MainThread)) + { + NotifyFromUnityLog(condition, stackTrace, logType); + } + } + + private void NotifyFromUnityLog(string condition, string stackTrace, LogType logType) + { + if (!Configuration.EnabledErrorTypes.UnityLog) + { + return; + } + if (logType.Equals(LogType.Exception) && _isUnity2019OrHigher) + { + return; + } + if (condition.StartsWith("BUGSNAG_MAZERUNNER_LOG")) + { + return; + } + if (Configuration.AutoDetectErrors && logType.IsGreaterThanOrEqualTo(Configuration.NotifyLogLevel)) + { + var logMessage = new UnityLogMessage(condition, stackTrace, logType); + var shouldSend = Error.ShouldSend(logMessage) + && _uniqueCounter.ShouldSend(logMessage) + && _logTypeCounter.ShouldSend(logMessage); + if (shouldSend) + { + var severity = Configuration.LogTypeSeverityMapping.Map(logType); + var backupStackFrames = new System.Diagnostics.StackTrace(1, true).GetFrames(); + var forceUnhandled = logType == LogType.Exception && !Configuration.ReportExceptionLogsAsHandled; + var exception = Error.FromUnityLogMessage(logMessage, backupStackFrames, severity, forceUnhandled); + Notify(new Error[] { exception }, exception.HandledState, null, logType); + } + } + else if (Configuration.ShouldLeaveLogBreadcrumb(logType)) + { + var metadata = new Dictionary() + { + {"logLevel" , logType.ToString() } + }; + Breadcrumbs.Leave(condition, metadata, BreadcrumbType.Log); + } + } + + public void Notify(string name, string message, string stackTrace, Func callback) + { + var exceptions = new Error[] { Error.FromStringInfo(name, message, stackTrace) }; + Notify(exceptions, HandledState.ForHandledException(), callback, LogType.Exception); + } + + public void Notify(System.Exception exception, string stacktrace, Func callback) + { + var exceptions = new Errors(exception, stacktrace).ToArray(); + Notify(exceptions, HandledState.ForHandledException(), callback, LogType.Exception); + } + + public void Notify(System.Exception exception, Func callback) + { + Notify(exception, HandledState.ForHandledException(), callback); + } + + public void Notify(System.Exception exception, Severity severity, Func callback) + { + Notify(exception, HandledState.ForUserSpecifiedSeverity(severity), callback); + } + + void Notify(System.Exception exception, HandledState handledState, Func callback) + { + // we need to generate a substitute stacktrace here as if we are not able + // to generate one from the exception that we are given then we are not able + // to do this inside of the IEnumerator generator code + var substitute = new System.Diagnostics.StackTrace(true).GetFrames(); + var errors = new Errors(exception, substitute).ToArray(); + foreach (var error in errors) + { + if (error.IsAndroidJavaException) + { + handledState = HandledState.ForUnhandledException(); + } + } + Notify(errors, handledState, callback, null); + } + + private void Notify(Error[] exceptions, HandledState handledState, Func callback, LogType? logType) + { + if (!ShouldSendRequests() || EventContainsDiscardedClass(exceptions) || !Configuration.Endpoints.IsValid) + { + return; + } + + var correlation = PerformanceHelper.GetCurrentPerformanceSpanContext(); + if (!ReferenceEquals(Thread.CurrentThread, MainThread)) + { + try + { + var asyncHandler = MainThreadDispatchBehaviour.Instance(); + asyncHandler.Enqueue(() => { NotifyOnMainThread(exceptions, handledState, callback,logType, correlation); }); + } + catch + { + // Async behavior is not available in a test environment + } + } + else + { + NotifyOnMainThread(exceptions, handledState, callback, logType, correlation); + } + } + + private void NotifyOnMainThread(Error[] exceptions, HandledState handledState, Func callback, LogType? logType, Correlation correlation) + { + if (!ShouldSendRequests() || EventContainsDiscardedClass(exceptions) || !Configuration.Endpoints.IsValid) + { + return; + } + + var user = _cachedUser.Clone(); + + var app = new AppWithState(Configuration) + { + InForeground = InForeground, + DurationInForeground = _foregroundStopwatch.Elapsed, + }; + + NativeClient.PopulateAppWithState(app); + + var device = new DeviceWithState(Configuration, CacheManager.GetCachedDeviceId()); + + NativeClient.PopulateDeviceWithState(device); + + var eventMetadata = new Metadata(); + + eventMetadata.MergeMetadata(NativeClient.GetNativeMetadata()); + + AutomaticDataCollector.AddStatefulDeviceData(eventMetadata); + + var activeScene = SceneManager.GetActiveScene(); + if (activeScene != null) + { + eventMetadata.AddMetadata("app", "activeUnityScene", activeScene.name); + } + + eventMetadata.MergeMetadata(_storedMetadata.Payload); + + var featureFlags = new OrderedDictionary(); + foreach (DictionaryEntry entry in _featureFlags) + { + featureFlags[entry.Key] = entry.Value; + } + + var @event = new Payload.Event( + Configuration.Context, + eventMetadata, + app, + device, + user, + exceptions, + handledState, + Breadcrumbs.Retrieve(), + SessionTracking.CurrentSession, + Configuration.ApiKey, + featureFlags, + correlation); + + //Check for adding project packages to an android java error event + if (ShouldAddProjectPackagesToEvent(@event)) + { + @event.AddAndroidProjectPackagesToEvent(Configuration.ProjectPackages); + } + + lock (CallbackLock) + { + foreach (var onErrorCallback in Configuration.GetOnErrorCallbacks()) + { + try + { + if (!onErrorCallback.Invoke(@event)) + { + return; + } + } + catch + { + // If the callback causes an exception, ignore it and execute the next one + } + } + } + + try + { + if (callback != null) + { + if (!callback.Invoke(@event)) + { + return; + } + } + } + catch + { + // If the callback causes an exception, ignore it and execute the next one + } + + var report = new Report(Configuration, @event); + if (!report.Ignored) + { + //if serialisation fails, then we ignore the event + if (PayloadManager.AddPendingPayload(report)) + { + Send(report); + if (Configuration.IsBreadcrumbTypeEnabled(BreadcrumbType.Error)) + { + Breadcrumbs.Leave(Breadcrumb.FromReport(report)); + } + SessionTracking.AddException(report); + } + } + } + + + private bool ShouldAddProjectPackagesToEvent(Payload.Event theEvent) + { + return Application.platform.Equals(RuntimePlatform.Android) + && Configuration.ProjectPackages != null + && Configuration.ProjectPackages.Length > 0 + && theEvent.IsAndroidJavaError(); + } + + private bool EventContainsDiscardedClass(Error[] exceptions) + { + foreach (var exception in exceptions) + { + if (Configuration.ErrorClassIsDiscarded(exception.ErrorClass)) + { + return true; + } + } + return false; + } + + public void SetApplicationState(bool inFocus) + { + if (inFocus) + { + _foregroundStopwatch.Start(); + lock (autoSessionLock) + { + if (Configuration.AutoTrackSessions + && _backgroundStopwatch.Elapsed.TotalSeconds > AutoCaptureSessionThresholdSeconds) + { + if (IsUsingFallback()) + { + SessionTracking.StartSession(); + } + else + { + // The android sdk is unable to listen to the unity activity lifecycle + if (Application.platform.Equals(RuntimePlatform.Android)) + { + SessionTracking.ResumeSession(); + } + } + } + _backgroundStopwatch.Reset(); + } + _delivery.StartDeliveringCachedPayloads(); + } + else + { + _foregroundStopwatch.Stop(); + _backgroundStopwatch.Start(); + } + } + + /// + /// True if reports and sessions should be sent based on release stage settings + /// + private bool ShouldSendRequests() + { + return Configuration.ReleaseStage == null + || Configuration.EnabledReleaseStages == null + || Configuration.EnabledReleaseStages.Contains(Configuration.ReleaseStage); + } + + public void SetContext(string context) + { + // set the context property on Configuration, as it currently holds the global state + Configuration.Context = context; + + // propagate the change to the native property also + NativeClient.SetContext(context); + } + + public string GetContext() + { + return Configuration.Context; + } + + public void MarkLaunchCompleted() => NativeClient.MarkLaunchCompleted(); + + public void AddOnError(Func bugsnagCallback) => Configuration.AddOnError(bugsnagCallback); + + public void RemoveOnError(Func bugsnagCallback) => Configuration.RemoveOnError(bugsnagCallback); + + public void AddOnSession(Func callback) + { + Configuration.AddOnSession(callback); + NativeClient.RegisterForOnSessionCallbacks(); + } + + public void RemoveOnSession(Func callback) => Configuration.RemoveOnSession(callback); + + public void AddMetadata(string section, string key, object value) => _storedMetadata.AddMetadata(section, key, value); + + public void AddMetadata(string section, IDictionary metadata) => _storedMetadata.AddMetadata(section, metadata); + + public void ClearMetadata(string section) => _storedMetadata.ClearMetadata(section); + + public void ClearMetadata(string section, string key) => _storedMetadata.ClearMetadata(section, key); + + public IDictionary GetMetadata(string section) => _storedMetadata.GetMetadata(section); + + public object GetMetadata(string section, string key) => _storedMetadata.GetMetadata(section, key); + + public User GetUser() + { + return _cachedUser; + } + + public void SetUser(string id, string email, string name) + { + _cachedUser = new User(id, email, name); + NativeClient.SetUser(_cachedUser); + } + + public void AddFeatureFlag(string name, string variant = null) + { + NativeClient.AddFeatureFlag(name, variant); + _featureFlags[name] = variant; + } + + public void AddFeatureFlags(FeatureFlag[] featureFlags) + { + foreach (var flag in featureFlags) + { + AddFeatureFlag(flag.Name, flag.Variant); + } + } + + public void ClearFeatureFlag(string name) + { + _featureFlags.Remove(name); + NativeClient.ClearFeatureFlag(name); + } + + public void ClearFeatureFlags() + { + _featureFlags.Clear(); + NativeClient.ClearFeatureFlags(); + } + + private void SetupNetworkListeners() + { + // Currently network breadcrumb are the only feature using the web events. + // If we add more features that use web request events, we will need to move this check + if (!Configuration.IsBreadcrumbTypeEnabled(BreadcrumbType.Request)) + { + return; + } + BugsnagUnityWebRequest.OnSend.AddListener(OnWebRequestSend); + BugsnagUnityWebRequest.OnComplete.AddListener(OnWebRequestComplete); + BugsnagUnityWebRequest.OnAbort.AddListener(OnWebRequestAbort); + } + + private readonly Dictionary _requestStartTimes = new Dictionary(); + + + private void OnWebRequestComplete(BugsnagUnityWebRequest request) + { + if (_requestStartTimes.TryGetValue(request, out DateTimeOffset startTime)) + { + TimeSpan duration = DateTimeOffset.UtcNow - startTime; + LeaveNetworkBreadcrumb(request.UnityWebRequest, duration); + _requestStartTimes.Remove(request); + } + else + { + LeaveNetworkBreadcrumb(request.UnityWebRequest, null); + } + } + + private void OnWebRequestSend(BugsnagUnityWebRequest request) + { + _requestStartTimes[request] = DateTimeOffset.UtcNow; + } + + private void OnWebRequestAbort(BugsnagUnityWebRequest request) + { + if (_requestStartTimes.ContainsKey(request)) + { + _requestStartTimes.Remove(request); + } + } + + public void LeaveNetworkBreadcrumb(UnityWebRequest request, TimeSpan? duration) + { + string statusMessage = request.result == UnityWebRequest.Result.Success ? "succeeded" : "failed"; + string fullMessage = $"UnityWebRequest {statusMessage}"; + var metadata = new Dictionary(); + metadata["status"] = request.responseCode; + metadata["method"] = request.method; + metadata["url"] = request.url; + var urlParams = ExtractUrlParams(request.uri); + if (urlParams.Count > 0) + { + metadata["urlParams"] = urlParams; + } + metadata["duration"] = duration?.TotalMilliseconds; + if (request.uploadHandler != null && request.uploadHandler.data != null) + { + metadata["requestContentLength"] = request.uploadHandler.data.Length; + } + if (request.downloadHandler != null && request.downloadHandler.data != null) + { + metadata["responseContentLength"] = request.downloadHandler.data.Length; + } + Breadcrumbs.Leave(fullMessage, metadata, BreadcrumbType.Request); + } + + private Dictionary ExtractUrlParams(Uri uri) + { + var queryParams = new Dictionary(); + var querySegments = uri.Query.TrimStart('?').Split('&'); + + foreach (var segment in querySegments) + { + var parts = segment.Split('='); + if (parts.Length == 2) + { + if (Configuration.KeyIsRedacted(parts[0])) + { + queryParams[parts[0]] = "[REDACTED]"; + } + else + { + queryParams[parts[0]] = parts[1]; + } + } + } + + return queryParams; + } + + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs.meta new file mode 100644 index 000000000..a20788612 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0bc25fb97e8614e9d8fe1f920e4b5386 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs new file mode 100644 index 000000000..7fb87127a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs @@ -0,0 +1,385 @@ +using System; +using System.Reflection; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using BugsnagUnity.Payload; +using UnityEngine; +using System.Text.RegularExpressions; + +namespace BugsnagUnity +{ + + public enum SwitchCacheType + { + None, + R, + I + } + + public class Configuration : IMetadataEditor, IFeatureFlagStore + { + + // Nintendo switch specifics ---------- + public SwitchCacheType SwitchCacheType = SwitchCacheType.R; + + public string SwitchCacheMountName = "BugsnagCache"; + + public int SwitchCacheIndex = 0; + + public int SwitchCacheMaxSize = 10485760; //10MiB in Bytes + // ---------- + + public string AppType; + + public string BundleVersion; + + + + public int VersionCode = -1; + + public long LaunchDurationMillis = 5000; + + public ThreadSendPolicy SendThreads = ThreadSendPolicy.UnhandledOnly; + + public bool SendLaunchCrashesSynchronously = true; + + public bool GenerateAnonymousId = true; + + public bool PersistUser = true; + + public string HostName; + + private User _user = null; + + internal Metadata Metadata = new Metadata(); + + internal OrderedDictionary FeatureFlags = new OrderedDictionary(); + + + public List RedactedKeys = new List{new Regex(".*password.*",RegexOptions.IgnoreCase)}; + public bool KeyIsRedacted(string key) + { + if (RedactedKeys == null) + { + return false; + } + foreach (var regex in RedactedKeys) + { + if (regex.IsMatch(key)) + { + return true; + } + } + return false; + } + + public List DiscardClasses = new List(); + + internal bool ErrorClassIsDiscarded(string className) + { + if (DiscardClasses == null) + { + return false; + } + foreach (var regex in DiscardClasses) + { + if (regex.IsMatch(className)) + { + return true; + } + } + return false; + } + + public Configuration(string apiKey) + { + ApiKey = apiKey; + } + + public string PersistenceDirectory; + + public bool ReportExceptionLogsAsHandled = true; + + public TimeSpan MaximumLogsTimePeriod = TimeSpan.FromSeconds(1); + + public Dictionary MaximumTypePerTimePeriod = new Dictionary + { + { LogType.Assert, 5 }, + { LogType.Error, 5 }, + { LogType.Exception, 20 }, + { LogType.Log, 5 }, + { LogType.Warning, 5 }, + }; + + public TimeSpan SecondsPerUniqueLog = TimeSpan.FromSeconds(5); + + public LogType BreadcrumbLogLevel = LogType.Log; + + public bool ShouldLeaveLogBreadcrumb(LogType logType) + { + return IsBreadcrumbTypeEnabled(BreadcrumbType.Log) + && logType.IsGreaterThanOrEqualTo(BreadcrumbLogLevel); + } + + public BreadcrumbType[] EnabledBreadcrumbTypes { get; set; } + + public bool IsBreadcrumbTypeEnabled(BreadcrumbType breadcrumbType) + { + return EnabledBreadcrumbTypes == null || + EnabledBreadcrumbTypes.Contains(breadcrumbType); + } + + public string ApiKey { get; set; } + + private int _maximumBreadcrumbs = 100; + + public int MaximumBreadcrumbs + { + get { return _maximumBreadcrumbs; } + set + { + if (value < 0 || value > 500) + { + if (IsRunningInEditor()) + { + Debug.LogError("Invalid configuration value detected. Option maxBreadcrumbs should be an integer between 0-500. Supplied value is " + value); + } + return; + } + else + { + _maximumBreadcrumbs = value; + } + } + } + + public int MaxReportedThreads = 200; + + public string ReleaseStage = "production"; + + public string[] EnabledReleaseStages; + + public string[] ProjectPackages; + + public string AppVersion = Application.version; + + public EndpointConfiguration Endpoints = new EndpointConfiguration(); + + internal string PayloadVersion { get; } = "4.0"; + + internal string SessionPayloadVersion { get; } = "1.0"; + + public string Context; + + public LogType NotifyLogLevel = LogType.Exception; + + public bool AutoDetectErrors = true; + + public bool AutoTrackSessions = true; + + public LogTypeSeverityMapping LogTypeSeverityMapping { get; } = new LogTypeSeverityMapping(); + + public string ScriptingBackend; + + public string DotnetScriptingRuntime; + + public string DotnetApiCompatibility; + + public EnabledErrorTypes EnabledErrorTypes = new EnabledErrorTypes(); + + private ulong _appHangThresholdMillis = 0; + + public ulong AppHangThresholdMillis + { + get { return _appHangThresholdMillis; } + set + { + if (value < 250) + { + if (IsRunningInEditor()) + { + Debug.LogError("Invalid configuration value detected. Option AppHangThresholdMillis should be a ulong higher than 249. Supplied value is " + value); + } + return; + } + else + { + _appHangThresholdMillis = value; + } + } + } + + public int MaxPersistedEvents = 32; + + public int MaxPersistedSessions = 128; + + public int MaxStringValueLength = 10000; + + private bool IsRunningInEditor() + { + return Application.platform == RuntimePlatform.OSXEditor + || Application.platform == RuntimePlatform.WindowsEditor + || Application.platform == RuntimePlatform.LinuxEditor; + } + + // Thread-safe collections with locks + private readonly object _onErrorLock = new object(); + private List> _onErrorCallbacks = new List>(); + + private readonly object _onSendErrorLock = new object(); + private List> _onSendErrorCallbacks = new List>(); + + private readonly object _onSessionLock = new object(); + private List> _onSessionCallbacks = new List>(); + + public void AddOnError(Func callback) + { + lock (_onErrorLock) + { + _onErrorCallbacks.Add(callback); + } + } + + internal List> GetOnErrorCallbacks() + { + lock (_onErrorLock) + { + return _onErrorCallbacks.ToList(); + } + } + + public void RemoveOnError(Func callback) + { + lock (_onErrorLock) + { + _onErrorCallbacks.Remove(callback); + } + } + + public void AddOnSendError(Func callback) + { + lock (_onSendErrorLock) + { + _onSendErrorCallbacks.Add(callback); + } + } + + internal List> GetOnSendErrorCallbacks() + { + lock (_onSendErrorLock) + { + return _onSendErrorCallbacks.ToList(); + } + } + + public void RemoveOnSendError(Func callback) + { + lock (_onSendErrorLock) + { + _onSendErrorCallbacks.Remove(callback); + } + } + + public void AddOnSession(Func callback) + { + lock (_onSessionLock) + { + _onSessionCallbacks.Add(callback); + } + } + + public void RemoveOnSession(Func callback) + { + lock (_onSessionLock) + { + _onSessionCallbacks.Remove(callback); + } + } + + internal List> GetOnSessionCallbacks() + { + lock (_onSessionLock) + { + return _onSessionCallbacks.ToList(); + } + } + + public List Telemetry = new List { TelemetryType.InternalErrors, TelemetryType.Usage }; + + public void AddMetadata(string section, string key, object value) => Metadata.AddMetadata(section, key, value); + + public void AddMetadata(string section, IDictionary metadata) => Metadata.AddMetadata(section, metadata); + + public void ClearMetadata(string section) => Metadata.ClearMetadata(section); + + public void ClearMetadata(string section, string key) => Metadata.ClearMetadata(section, key); + + public IDictionary GetMetadata(string section) => Metadata.GetMetadata(section); + + public object GetMetadata(string section, string key) => Metadata.GetMetadata(section, key); + + public User GetUser() => _user; + + public void SetUser(string id, string email, string name) + { + _user = new User(id, email, name); + } + + internal Configuration Clone() + { + var clone = (Configuration)MemberwiseClone(); + if (_user != null) + { + clone._user = _user.Clone(); + } + if (Endpoints.IsValid) + { + clone.Endpoints = Endpoints.Clone(); + } + return clone; + } + + public void AddFeatureFlag(string name, string variant = null) + { + FeatureFlags[name] = variant; + } + + public void AddFeatureFlags(FeatureFlag[] featureFlags) + { + foreach (var flag in featureFlags) + { + AddFeatureFlag(flag.Name,flag.Variant); + } + } + + public void ClearFeatureFlag(string name) + { + FeatureFlags.Remove(name); + } + + public void ClearFeatureFlags() + { + FeatureFlags.Clear(); + } + + public static AssemblyName GetAssemblyName() { + return typeof(Configuration).Assembly.GetName(); + } + } + + [Serializable] + public class EnabledErrorTypes + { + public bool ANRs = true; + public bool AppHangs = true; + public bool OOMs = true; + public bool Crashes = true; + public bool ThermalKills = true; + public bool UnityLog = true; + + public EnabledErrorTypes() + { } + } +} + diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs.meta new file mode 100644 index 000000000..9c9ddeba1 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ec068695434d944349dea511fa785193 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs new file mode 100644 index 000000000..55b8601fd --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs @@ -0,0 +1,622 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using BugsnagUnity.Payload; +using UnityEngine; +using UnityEngine.Networking; +using System.Security.Cryptography; + +namespace BugsnagUnity +{ + class Delivery + { + + private Client _client; + + private Configuration _configuration; + + private CacheManager _cacheManager; + + private PayloadManager _payloadManager; + + private object _callbackLock { get; } = new object(); + + private static List _finishedCacheDeliveries = new List(); + + private bool _cacheDeliveryInProcess; + + private const int MAX_PAYLOAD_BYTES = 1000000; + + private const string STRING_TRUNCATION_MESSAGE = "***{0} CHARS TRUNCATED***"; + + private const string BREADCRUMB_TRUNCATION_MESSAGE = "Removed, along with {0} older breadcrumbs, to reduce payload size"; + + private const string EVENT_KEY_EVENT = "event"; + + private const string EVENT_KEY_BREADCRUMBS = "breadcrumbs"; + + private const string EVENT_KEY_METADATA = "metaData"; + + private const string EVENT_KEY_BREADCRUMB_TYPE = "type"; + + private const string EVENT_KEY_BREADCRUMB_MESSAGE = "name"; + + private const string EVENT_KEY_BREADCRUMB_METADATA = "metaData"; + + private const string EVENT_KEY_BREADCRUMB_TIMESTAMP = "timestamp"; + + + internal Delivery(Client client, Configuration configuration, CacheManager cacheManager, PayloadManager payloadManager) + { + _client = client; + _configuration = configuration; + _cacheManager = cacheManager; + _payloadManager = payloadManager; + } + + // Run any on send error callbacks if it's an event, serialise the payload and add it to the sending queue + public void Deliver(IPayload payload) + { + if (payload.PayloadType == PayloadType.Event) + { + var report = (Report)payload; + if (_configuration.GetOnSendErrorCallbacks().Count > 0) + { + lock (_callbackLock) + { + foreach (var onSendErrorCallback in _configuration.GetOnSendErrorCallbacks()) + { + try + { + if (!onSendErrorCallback.Invoke(report.Event)) + { + return; + } + } + catch + { + // If the callback causes an exception, ignore it and execute the next one + } + } + } + } + report.Event.RedactMetadata(_configuration); + //pipeline expects and array of events even though we only ever report 1 + report.ApplyEventsArray(); + } + try + { + MainThreadDispatchBehaviour.Instance().Enqueue(PushToServer(payload)); + } + catch + { + // not avaliable in unit tests + } + } + + // Push to the server and handle the result + IEnumerator PushToServer(IPayload payload) + { + var shouldDeliver = false; + if (Application.platform == RuntimePlatform.WebGLPlayer) + { + shouldDeliver = _client.NativeClient.ShouldAttemptDelivery(); + } + else + { + var networkCheckDone = false; + new Thread(() => { + shouldDeliver = _client.NativeClient.ShouldAttemptDelivery(); + networkCheckDone = true; + }).Start(); + + while (!networkCheckDone) + { + yield return null; + } + } + if (!shouldDeliver) + { + _payloadManager.SendPayloadFailed(payload); + _finishedCacheDeliveries.Add(payload.Id); + yield break; + } + + byte[] body = null; + // It's not possible to yield from a try catch block, so we use this flag bool instead + var errorDuringSerialisation = false; + if (payload.PayloadType == PayloadType.Session) + { + try + { + body = SerializeObject(payload); + } + catch + { + errorDuringSerialisation = true; + } + } + else + { + // There is no threading on webgl, so we treat the payload differently + if (Application.platform == RuntimePlatform.WebGLPlayer) + { + try + { + body = PrepareEventBodySimple(payload); + } + catch + { + errorDuringSerialisation = true; + } + } + else + { + var bodyReady = false; + new Thread(() => { + try + { + body = PrepareEventBody(payload); + } + catch + { + errorDuringSerialisation = true; + } + bodyReady = true; + }).Start(); + + while (!bodyReady) + { + yield return null; + } + } + } + + if (errorDuringSerialisation) + { + _payloadManager.RemovePayload(payload); + _finishedCacheDeliveries.Add(payload.Id); + yield break; + } + + using (var req = new UnityWebRequest(payload.Endpoint.ToString())) + { + req.SetRequestHeader("Content-Type", "application/json"); + req.SetRequestHeader("Bugsnag-Sent-At", DateTimeOffset.Now.ToString("o", CultureInfo.InvariantCulture)); + req.SetRequestHeader("Bugsnag-Integrity", "sha1 " + Hash(body)); + + foreach (var header in payload.Headers) + { + req.SetRequestHeader(header.Key, header.Value); + } + req.uploadHandler = new UploadHandlerRaw(body); + req.downloadHandler = new DownloadHandlerBuffer(); + req.method = UnityWebRequest.kHttpVerbPOST; + yield return req.SendWebRequest(); + + while (!req.isDone) + { + yield return new WaitForEndOfFrame(); + } + var code = req.responseCode; + if (code == 200 || code == 202) + { + // success! + _payloadManager.RemovePayload(payload); + StartDeliveringCachedPayloads(); + } + else if ( code == 0 || code == 408 || code == 429 || code >= 500) + { + // sending failed with no network or retryable error, cache payload to disk + _payloadManager.SendPayloadFailed(payload); + } + else + { + // sending failed with an unacceptable status code, remove payload from cache and pending payloads + _payloadManager.RemovePayload(payload); + } + _finishedCacheDeliveries.Add(payload.Id); + } + } + + private Dictionary GetEventFromPayload(Dictionary payloadAsDictionary) + { + return payloadAsDictionary[EVENT_KEY_EVENT] as Dictionary; + } + + private byte[] PrepareEventBody(IPayload payload) + { + var serialisedPayload = SerializeObject(payload); + // If payload is oversized, trim string values in all metadata + if (serialisedPayload.Length > MAX_PAYLOAD_BYTES) + { + var @event = GetEventFromPayload(payload.GetSerialisablePayload()); + if (TruncateMetadata(@event)) + { + serialisedPayload = SerializeObject(payload); + } + + //If still oversized, truncate the breadcrumbs + if (serialisedPayload.Length > MAX_PAYLOAD_BYTES) + { + if (TruncateBreadcrumbs(@event, serialisedPayload.Length - MAX_PAYLOAD_BYTES)) + { + serialisedPayload = SerializeObject(payload); + } + } + } + + return serialisedPayload; + } + + private byte[] PrepareEventBodySimple(IPayload payload) + { + var serialisedPayload = SerializeObject(payload); + + // If payload is oversized, remove all breadcrumbs + if (serialisedPayload.Length > MAX_PAYLOAD_BYTES) + { + var @event = payload.GetSerialisablePayload(); + + if (RemoveAllBreadcrumbs(@event)) + { + serialisedPayload = SerializeObject(payload); + } + + //If still oversized, clear out all metadata + if (serialisedPayload.Length > MAX_PAYLOAD_BYTES) + { + if (RemoveUserMetadata(@event)) + { + serialisedPayload = SerializeObject(payload); + } + } + } + + return serialisedPayload; + } + + private string Hash(byte[] input) + { + using (SHA1Managed sha1 = new SHA1Managed()) + { + var hash = sha1.ComputeHash(input); + var sb = new StringBuilder(hash.Length * 2); + foreach (byte b in hash) + { + sb.Append(b.ToString("x2")); + } + return sb.ToString(); + } + } + + private bool TruncateBreadcrumbs(Dictionary @event, int bytesToRemove) + { + var breadcrumbsList = (@event[EVENT_KEY_BREADCRUMBS] as Dictionary[]).ToList(); + + if (breadcrumbsList.Count == 0) + { + return false; + } + + var numBreadcrumbsRemoved = 0; + var numBytesTruncated = 0; + var lastRemovedCrumbType = string.Empty; + + for (int i = breadcrumbsList.Count - 1; i >= 0; i--) + { + numBytesTruncated += SerializeObject(breadcrumbsList[i]).Length; + lastRemovedCrumbType = breadcrumbsList[i][EVENT_KEY_BREADCRUMB_TYPE] as string; + breadcrumbsList.RemoveAt(i); + numBreadcrumbsRemoved++; + if (numBytesTruncated >= bytesToRemove) + { + break; + } + } + + if (numBreadcrumbsRemoved > 0) + { + var truncationBreadcrumb = new Dictionary + { + { EVENT_KEY_BREADCRUMB_TYPE, lastRemovedCrumbType }, + { EVENT_KEY_BREADCRUMB_MESSAGE, string.Format(BREADCRUMB_TRUNCATION_MESSAGE, numBreadcrumbsRemoved) } + }; + breadcrumbsList.Add(truncationBreadcrumb); + @event[EVENT_KEY_BREADCRUMBS] = breadcrumbsList.ToArray(); + return true; + } + else + { + return false; + } + } + + private bool RemoveAllBreadcrumbs(Dictionary @event) + { + var numExistingCrumbs = (@event[EVENT_KEY_BREADCRUMBS] as Dictionary[]).Length; + + if (numExistingCrumbs == 0) + { + return false; + } + + var truncationBreadcrumb = new Dictionary + { + { EVENT_KEY_BREADCRUMB_TIMESTAMP, DateTime.UtcNow.ToString() }, + { EVENT_KEY_BREADCRUMB_TYPE, "state" }, + { EVENT_KEY_BREADCRUMB_MESSAGE, string.Format(BREADCRUMB_TRUNCATION_MESSAGE, numExistingCrumbs) } + }; + + @event[EVENT_KEY_BREADCRUMBS] = new[] { truncationBreadcrumb }; + + return true; + } + + private bool TruncateMetadata(Dictionary @event) + { + var dataTruncated = false; + var metadata = @event[EVENT_KEY_METADATA] as Dictionary; + foreach (var section in metadata) + { + if (TruncateStringsInDictionary(section.Value as Dictionary)) + { + dataTruncated = true; + } + } + + var breadcrumbs = @event[EVENT_KEY_BREADCRUMBS] as Dictionary[]; + foreach (var crumb in breadcrumbs) + { + var crumbMetadata = crumb[EVENT_KEY_BREADCRUMB_METADATA] as Dictionary; + if (TruncateStringsInDictionary(crumbMetadata)) + { + dataTruncated = true; + } + } + return dataTruncated; + } + + private bool RemoveUserMetadata(Dictionary @event) + { + var dataRemoved = false; + var metadata = @event[EVENT_KEY_METADATA] as Dictionary; + foreach (var key in metadata.Keys.ToList()) + { + if (key != "app" && key != "device") + { + dataRemoved = true; + metadata.Remove(key); + } + } + return dataRemoved; + } + + private bool TruncateStringsInDictionary(Dictionary section) + { + var stringTruncated = false; + foreach (var key in section.Keys.ToList()) + { + var valueType = section[key].GetType(); + if (valueType == typeof(string)) + { + var originalValue = section[key] as string; + if (ShouldTruncateString(originalValue)) + { + section[key] = TruncateString(originalValue); + stringTruncated = true; + } + } + else if (valueType == typeof(string[])) + { + var stringArray = section[key] as string[]; + for (int i = 0; i < stringArray.Length; i++) + { + if (ShouldTruncateString(stringArray[i])) + { + stringArray[i] = TruncateString(stringArray[i]); + stringTruncated = true; + } + } + } + else if (valueType == typeof(List)) + { + var stringList = section[key] as List; + for (int i = 0; i < stringList.Count; i++) + { + if (ShouldTruncateString(stringList[i])) + { + stringList[i] = TruncateString(stringList[i]); + stringTruncated = true; + } + } + } + else if (valueType == typeof(Dictionary)) + { + var stringDict = section[key] as Dictionary; + foreach (var stringKey in stringDict.Keys.ToList()) + { + if (ShouldTruncateString(stringDict[stringKey])) + { + stringTruncated = true; + stringDict[stringKey] = TruncateString(stringDict[stringKey]); + } + } + } + else if (valueType == typeof(Dictionary)) + { + TruncateStringsInDictionary(section[key] as Dictionary); + } + else if (valueType == typeof(JsonArray)) + { + var jsonArray = ((JsonArray)section[key]); + for (int i = 0; i < jsonArray.Count; i++) + { + if (jsonArray[i].GetType() == typeof(string)) + { + var originalValue = jsonArray[i] as string; + if (ShouldTruncateString(originalValue)) + { + jsonArray[i] = TruncateString(originalValue); + stringTruncated = true; + } + } + } + } + } + return stringTruncated; + } + + private bool ShouldTruncateString(string stringValue) + { + return stringValue.Length > _configuration.MaxStringValueLength; + } + + private string TruncateString(string originalValue) + { + var numStringsToTruncate = originalValue.Length - _configuration.MaxStringValueLength; + var truncationMessage = GetTruncationMessage(numStringsToTruncate); + if (numStringsToTruncate >= truncationMessage.Length) + { + return TruncateString(originalValue, truncationMessage); + } + return originalValue; + } + + private string TruncateString(string stringToTruncate, string truncationMessage) + { + return stringToTruncate.Substring(0, _configuration.MaxStringValueLength) + truncationMessage; + } + + private string GetTruncationMessage(int numCharactersToRemove) + { + return string.Format(STRING_TRUNCATION_MESSAGE, numCharactersToRemove); + } + + public void StartDeliveringCachedPayloads() + { + if (_cacheDeliveryInProcess) + { + return; + } + _cacheDeliveryInProcess = true; + try + { + _finishedCacheDeliveries.Clear(); + MainThreadDispatchBehaviour.Instance().Enqueue(DeliverCachedPayloads()); + } + catch + { + // Not possible in unit tests + } + } + + private IEnumerator DeliverCachedPayloads() + { + yield return ProcessCachedItems(typeof(SessionReport)); + yield return ProcessCachedItems(typeof(Report)); + _cacheDeliveryInProcess = false; + } + + private IEnumerator ProcessCachedItems(Type t) + { + bool isSession = t.Equals(typeof(SessionReport)); + var cachedPayloads = isSession ? _cacheManager.GetCachedSessionIds() : _cacheManager.GetCachedEventIds(); + if (cachedPayloads != null) + { + foreach (var id in cachedPayloads) + { + var payloadJson = isSession ? _cacheManager.GetCachedSession(id) : _cacheManager.GetCachedEvent(id); + if (string.IsNullOrEmpty(payloadJson)) + { + continue; + } + + Dictionary payloadDictionary = null; + + try + { + // if something goes wrong at this stage then we silently discard the file as it's most likely that the file wasn't fully serialised to disk + payloadDictionary = ((JsonObject)SimpleJson.DeserializeObject(payloadJson)).GetDictionary(); + } + catch + { + if (isSession) + { + _cacheManager.RemoveCachedSession(id); + } + else + { + _cacheManager.RemoveCachedEvent(id); + } + continue; + } + + if (isSession) + { + SessionReport sessionReport = null; + try + { + sessionReport = new SessionReport(_configuration, payloadDictionary); + } + catch + { + // this will be internally reported in a future update + _cacheManager.RemoveCachedSession(id); + continue; + } + Deliver(sessionReport); + } + else + { + Report report = null; + try + { + report = new Report(_configuration, payloadDictionary); + } + catch + { + // this will be internally reported in a future update + _cacheManager.RemoveCachedEvent(id); + continue; + } + Deliver(report); + } + + yield return new WaitUntil(() => CachedPayloadProcessed(id)); + } + } + } + + private bool CachedPayloadProcessed(string id) + { + foreach (var processedCachedPayloadIds in _finishedCacheDeliveries) + { + if (id == processedCachedPayloadIds) + { + return true; + } + } + return false; + } + + private byte[] SerializeObject(object @object) + { + using (var stream = new MemoryStream()) + using (var reader = new StreamReader(stream)) + using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) + { + SimpleJson.SerializeObject(@object, writer); + writer.Flush(); + stream.Position = 0; + return Encoding.UTF8.GetBytes(reader.ReadToEnd()); + } + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs.meta new file mode 100644 index 000000000..563ab9425 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 85fbfb971190a4293b5a5b3ec9c1c71e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs new file mode 100644 index 000000000..3ddad0e6f --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs @@ -0,0 +1,60 @@ +using System; +namespace BugsnagUnity +{ + public class EndpointConfiguration + { + + private const string DefaultNotifyEndpoint = "https://notify.bugsnag.com"; + + private const string DefaultSessionEndpoint = "https://sessions.bugsnag.com"; + + internal Uri Notify; + + internal Uri Session; + + internal bool NotifyIsCustom => Notify != null && Notify.ToString() != new Uri( DefaultNotifyEndpoint ).ToString(); + + internal bool SessionIsCustom => Session != null && Session.ToString() != new Uri ( DefaultSessionEndpoint ).ToString(); + + internal bool IsValid + { + get + { + return Notify != null && Session != null && (NotifyIsCustom && SessionIsCustom || !NotifyIsCustom && !SessionIsCustom); + } + } + + internal EndpointConfiguration() + { + Notify = new Uri(DefaultNotifyEndpoint); + Session = new Uri(DefaultSessionEndpoint); + } + + public EndpointConfiguration(string notifyEndpoint, string sessionEndpoint) + { + try + { + Notify = new Uri(notifyEndpoint); + } + catch (Exception e) + { + UnityEngine.Debug.LogWarning( string.Format("Invalid configuration. Endpoints.Notify should be a valid URI. Error message: {0}. Events will not be sent to Bugsnag. " , e.Message)); + } + try + { + Session = new Uri(sessionEndpoint); + } + catch (Exception e) + { + UnityEngine.Debug.LogWarning(string.Format("Invalid configuration. Endpoints.Session should be a valid URI. Error message: {0}. Sessions will not be sent to Bugsnag. ", e.Message)); + + } + } + + internal EndpointConfiguration Clone() + { + return (EndpointConfiguration)MemberwiseClone(); + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs.meta new file mode 100644 index 000000000..aca4dda22 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 16485fcf45b8d4607a73bcab01ff7066 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs new file mode 100644 index 000000000..88a184789 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public interface IBreadcrumbs + { + void Leave(string message, Dictionary metadata, BreadcrumbType type); + + void Leave(Breadcrumb breadcrumb); + + List Retrieve(); + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs.meta new file mode 100644 index 000000000..cfb70fb43 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3065203dd97e041219582dbe916ef060 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs new file mode 100644 index 000000000..6ac0a87b5 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public interface ICacheManager + { + string GetCachedDeviceId(); + void SaveDeviceIdToCache(string id); + void SaveSessionToCache(string id, string json); + void SaveEventToCache(string id, string json); + void RemoveCachedEvent(string id); + void RemoveCachedSession(string id); + List GetCachedEventIds(); + List GetCachedSessionIds(); + string GetCachedEvent(string id); + string GetCachedSession(string id); + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs.meta new file mode 100644 index 000000000..a95ffcd7d --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8236e7a435c9241f78d1514ee2b1babe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs new file mode 100644 index 000000000..1c8522c5d --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + + internal interface IClient : IMetadataEditor, IFeatureFlagStore + { + Configuration Configuration { get; } + + IBreadcrumbs Breadcrumbs { get; } + + ISessionTracker SessionTracking { get; } + + LastRunInfo LastRunInfo { get; } + + void Send(IPayload payload); + + void Notify(System.Exception exception, Func callback); + + void Notify(System.Exception exception, Severity severity, Func callback); + + void Notify(System.Exception exception, string stacktrace, Func callback); + + void Notify(string name, string message, string stackTrace, Func callback); + + /// + /// Used to signal to the Bugsnag client that the focused state of the + /// application has changed. This is used for session tracking and also + /// the tracking of in foreground time for the application. + /// + /// + void SetApplicationState(bool inFocus); + + string GetContext(); + + void SetContext(string context); + + bool IsUsingFallback(); + + void MarkLaunchCompleted(); + + void AddOnError(Func callback); + + void RemoveOnError(Func callback); + + void AddOnSession(Func callback); + + void RemoveOnSession(Func callback); + + User GetUser(); + + void SetUser(string id,string email,string name); + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs.meta new file mode 100644 index 000000000..07f2c55b2 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bbc1343187f9c4c38ac7fce79b8bc0ee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs new file mode 100644 index 000000000..ba97edd27 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs @@ -0,0 +1,13 @@ +using System; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public interface IFeatureFlagStore + { + void AddFeatureFlag(string name, string variant = null); + void AddFeatureFlags(FeatureFlag[] featureFlags); + void ClearFeatureFlag(string name); + void ClearFeatureFlags(); + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs.meta new file mode 100644 index 000000000..ad39dbc7c --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8f4c20c029d9e418db56827c7087c68e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs new file mode 100644 index 000000000..5ee61baf6 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs @@ -0,0 +1,8 @@ +using System.Collections; + +namespace BugsnagUnity +{ + interface IFilterable : IDictionary + { + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs.meta new file mode 100644 index 000000000..689940118 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 381cde83fa40e452abb06f1e6710cfcb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs new file mode 100644 index 000000000..fbeed1dd0 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; + +namespace BugsnagUnity +{ + public interface IMetadataEditor + { + void AddMetadata(string section, string key, object value); + + void AddMetadata(string section, IDictionary metadata); + + void ClearMetadata(string section); + + void ClearMetadata(string section, string key); + + IDictionary GetMetadata(string section); + + object GetMetadata(string section, string key); + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs.meta new file mode 100644 index 000000000..594d5292b --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 72436bf4d33a74217b9f071dcc0ffcd1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs new file mode 100644 index 000000000..c2f7a6f6d --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs @@ -0,0 +1,113 @@ +using BugsnagUnity.Payload; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] + +namespace BugsnagUnity +{ + interface INativeClient : IFeatureFlagStore + { + /// + /// The native configuration + /// + Configuration Configuration { get; } + + /// + /// The native breadcrumbs + /// + IBreadcrumbs Breadcrumbs { get; } + + /// + /// Populates the native app information + /// + /// + void PopulateApp(App app); + + /// + /// Populates the native app information + /// + /// + void PopulateAppWithState(AppWithState app); + + /// + /// Populates the native device information + /// + /// + void PopulateDevice(Device device); + + /// + /// Populates the native device information + /// + /// + void PopulateDeviceWithState(DeviceWithState device); + + /// + /// Send the start session message to a native notifier + /// + void StartSession(); + + /// + /// Send the stop session message to a native notifier + /// + void PauseSession(); + + /// + /// Send the resume session message to a native notifier + /// + bool ResumeSession(); + + /// + /// Update the current native session + /// + void UpdateSession(Session session); + + /// + /// Get the current session info for sending with an error + /// + Session GetCurrentSession(); + + /// + /// Adds user data to native client reports + /// + void SetUser(User user); + + /// + /// Populates the native user information. + /// + /// + void PopulateUser(User user); + + /// + /// Mutates the context. + /// + /// + void SetContext(string context); + + /// + /// Setting Configuration.LaunchDurationMillis to 0 will cause Bugsnag to consider the app to be launching until Bugsnag.MarkLaunchCompleted() has been called. + /// + void MarkLaunchCompleted(); + + /// + /// Get the last run information from Android and cocoa platforms + /// + LastRunInfo GetLastRunInfo(); + + void ClearNativeMetadata(string section); + + void ClearNativeMetadata(string section, string key); + + void AddNativeMetadata(string section, IDictionary data); + + IDictionary GetNativeMetadata(); + + bool ShouldAttemptDelivery(); + + /// + /// Subscribes the Unity layer for session callbacks. Not many users use session callbacks, so we are only subscribing to the native side if necessary as an optimisation. + /// + void RegisterForOnSessionCallbacks(); + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs.meta new file mode 100644 index 000000000..cd4fe6293 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f04670df980184a0da9d1072ec39c05d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs new file mode 100644 index 000000000..8eda5b500 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs @@ -0,0 +1,10 @@ +using System; +namespace BugsnagUnity +{ + public interface IUserEditor + { + IUser GetUser(); + + void SetUser(string id, string email, string name); + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs.meta new file mode 100644 index 000000000..e1db142d4 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7644e264ca05743eb97dab3abdcf51fd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs new file mode 100644 index 000000000..c73a2e4ad --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs @@ -0,0 +1,13 @@ +namespace BugsnagUnity +{ + public class LastRunInfo + { + + public int ConsecutiveLaunchCrashes; + + public bool Crashed; + + public bool CrashedDuringLaunch; + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs.meta new file mode 100644 index 000000000..d0c621cfd --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b4b15cbf6b7a6423f86f5b9c46699f56 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs new file mode 100644 index 000000000..782dea66b --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace BugsnagUnity +{ + public class LogTypeSeverityMapping + { + Dictionary Mappings { get; } + + internal LogTypeSeverityMapping() + { + Mappings = new Dictionary { + { LogType.Assert, Severity.Warning }, + { LogType.Error, Severity.Warning }, + { LogType.Exception, Severity.Error }, + { LogType.Log, Severity.Info }, + { LogType.Warning, Severity.Warning }, + }; + } + + public void UpdateMapping(LogType logType, Severity severity) + { + Mappings[logType] = severity; + } + + public Severity Map(LogType logType) + { + if (Mappings.ContainsKey(logType)) + { + return Mappings[logType]; + } + + return Severity.Error; + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs.meta new file mode 100644 index 000000000..36f316ba1 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0574c5cee5d0e4c05b046390946e6aab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs new file mode 100644 index 000000000..8366f333a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs @@ -0,0 +1,103 @@ +/* +Copyright 2015 Pim de Witte All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +using System; +using System.Collections.Generic; +using System.Collections; +using UnityEngine; + +/// Author: Pim de Witte (pimdewitte.com) and contributors +/// +/// A thread-safe class which holds a queue with actions to execute on the next Update() method. It can be used to make calls to the main thread for +/// things such as UI Manipulation in Unity. It was developed for use in combination with the Firebase Unity plugin, which uses separate threads for event handling +/// +namespace BugsnagUnity +{ + public class MainThreadDispatchBehaviour : MonoBehaviour + { + + private static MainThreadDispatchBehaviour _instance; + + private static readonly Queue _executionQueue = new Queue(); + + + public static MainThreadDispatchBehaviour Instance() + { + if (_instance == null) + { + _instance = new GameObject("Bugsnag main thread dispatcher").AddComponent(); + } + return _instance; + } + + public void Update() + { + lock (_executionQueue) + { + while (_executionQueue.Count > 0) + { + _executionQueue.Dequeue().Invoke(); + } + } + } + + /// + /// Locks the queue and adds the IEnumerator to the queue + /// + /// IEnumerator function that will be executed from the main thread. + public void Enqueue(IEnumerator action) + { + lock (_executionQueue) + { + _executionQueue.Enqueue(() => + { + StartCoroutine(action); + }); + } + } + + /// + /// Locks the queue and adds the Action to the queue + /// + /// function that will be executed from the main thread. + public void Enqueue(Action action) + { + Enqueue(ActionWrapper(action)); + } + IEnumerator ActionWrapper(Action a) + { + a(); + yield return null; + } + + public void EnqueueWithDelayCoroutine(Action action, float delay) + { + StartCoroutine(DelayAction(action, delay)); + } + + private IEnumerator DelayAction(Action action, float delay) + { + yield return new WaitForSeconds(delay); + action.Invoke(); + } + + private void Awake() + { + DontDestroyOnLoad(gameObject); + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs.meta new file mode 100644 index 000000000..a5f66ddd0 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b94901a990dfa40a590326ef5aec3b71 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs new file mode 100644 index 000000000..480795662 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs @@ -0,0 +1,70 @@ +using System; +using UnityEngine; +using System.Collections.Generic; + +namespace BugsnagUnity +{ + public class MaximumLogTypeCounter + { + private Configuration Configuration { get; } + + private Dictionary CurrentCounts { get; } + + private double FlushAt { get; set; } = -1; + + private double MaximumLogsTimePeriod => Configuration.MaximumLogsTimePeriod.TotalSeconds; + + private Dictionary MaximumTypePerTimePeriod => Configuration.MaximumTypePerTimePeriod; + + private readonly object _lock = new object(); + + private void EnsureFlushTimeIsSet() + { + if (FlushAt < 0) + { + FlushAt = Time.ElapsedSeconds + MaximumLogsTimePeriod; + } + } + + public MaximumLogTypeCounter(Configuration configuration) + { + Configuration = configuration; + CurrentCounts = new Dictionary(); + } + + public bool ShouldSend(UnityLogMessage unityLogMessage) + { + var type = unityLogMessage.Type; + + lock (_lock) + { + EnsureFlushTimeIsSet(); + + if (MaximumTypePerTimePeriod.ContainsKey(type)) + { + if (CurrentCounts.ContainsKey(type)) + { + CurrentCounts[type]++; + } + else + { + CurrentCounts[type] = 1; + } + + if (CurrentCounts[type] > MaximumTypePerTimePeriod[type]) + { + if (unityLogMessage.CreatedAt > FlushAt) + { + CurrentCounts.Clear(); + FlushAt = Time.ElapsedSeconds + MaximumLogsTimePeriod; + return true; + } + return false; + } + } + } + + return true; + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs.meta new file mode 100644 index 000000000..7995f3700 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 28af8f6e70ded43138c4d0c07ab35f51 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native.meta new file mode 100644 index 000000000..48a8ea86e --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 71458c0d773474730ae75d0519328270 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android.meta new file mode 100644 index 000000000..9b75da80c --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f87d3e9c315a74b36984175d60bffca2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs new file mode 100644 index 000000000..a1f26b250 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs @@ -0,0 +1,57 @@ +#if UNITY_ANDROID && !UNITY_EDITOR + +using System; +using System.Collections.Generic; +using UnityEngine; +using BugsnagUnity.Payload; +using System.Linq; + +namespace BugsnagUnity +{ + class Breadcrumbs : IBreadcrumbs + { + NativeInterface NativeInterface { get; } + + internal Breadcrumbs(NativeInterface nativeInterface) + { + NativeInterface = nativeInterface; + } + + /// + /// Add a breadcrumb to the collection with the specified type and metadata + /// + /// + /// + /// + public void Leave(string message, Dictionary metadata, BreadcrumbType type) + { + Leave(new Breadcrumb(message, metadata, type)); + } + + /// + /// Add a pre assembled breadcrumb to the collection. + /// + /// + public void Leave(Breadcrumb breadcrumb) + { + if (breadcrumb == null || string.IsNullOrEmpty(breadcrumb.Message)) + { + return; + } + // Clone the metadata to prevent thread related exceptions + var metadataClone = breadcrumb.Metadata.ToDictionary(entry => entry.Key, entry => entry.Value); + NativeInterface.LeaveBreadcrumb(breadcrumb.Message, breadcrumb.Type.ToString(), metadataClone); + } + + /// + /// Retrieve the collection of breadcrumbs at this point in time. + /// + /// + public List Retrieve() + { + return NativeInterface.GetBreadcrumbs(); + } + + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs.meta new file mode 100644 index 000000000..4e7b49670 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 23f71a31750b74961b819a0816cede60 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs new file mode 100644 index 000000000..1ea0fb80a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs @@ -0,0 +1,27 @@ +#if UNITY_ANDROID && !UNITY_EDITOR + +using System; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativeApp : NativePayloadClassWrapper, IApp + { + internal NativeApp(AndroidJavaObject nativePointer) : base (nativePointer){} + + public string BinaryArch { get => GetNativeString("getBinaryArch"); set => SetNativeString("setBinaryArch", value); } + public string BuildUuid { get => GetNativeString("getBuildUuid"); set => SetNativeString("setBuildUuid", value); } + public string CodeBundleId { get => GetNativeString("getCodeBundleId"); set => SetNativeString("setCodeBundleId", value); } + public string Id { get => GetNativeString("getId"); set => SetNativeString("setId", value); } + public string ReleaseStage { get => GetNativeString("getReleaseStage"); set => SetNativeString("setReleaseStage", value); } + public string Type { get => GetNativeString("getType"); set => SetNativeString("setType", value); } + public string Version { get => GetNativeString("getVersion"); set => SetNativeString("setVersion", value); } + public int? VersionCode { get => GetNativeInt("getVersionCode"); set => SetNativeInt("setVersionCode", value); } + + public string BundleVersion { get; set; } + public string DsymUuid { get; set; } + + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs.meta new file mode 100644 index 000000000..66672d8e9 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 32c2de7c0657143918b661b048bd24b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs new file mode 100644 index 000000000..5366d9bd3 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs @@ -0,0 +1,19 @@ +#if UNITY_ANDROID && !UNITY_EDITOR + +using System; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativeAppWithState : NativeApp, IAppWithState + { + public NativeAppWithState(AndroidJavaObject androidJavaObject) : base(androidJavaObject){} + + public TimeSpan? Duration { get => GetNativeTimespan("getDuration"); set => SetNativeTimespan("setDuration",value); } + public TimeSpan? DurationInForeground { get => GetNativeTimespan("getDurationInForeground"); set => SetNativeTimespan("setDurationInForeground", value); } + public bool? InForeground { get => GetNativeBool("getInForeground"); set => SetNativeBool("setInForeground",value); } + public bool? IsLaunching { get => GetNativeBool("isLaunching"); set => SetNativeBool("setLaunching", value); } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs.meta new file mode 100644 index 000000000..85cf35655 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 148968734867a475c8721bd968272a7c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs new file mode 100644 index 000000000..315132989 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs @@ -0,0 +1,33 @@ +#if UNITY_ANDROID && !UNITY_EDITOR +using System; +using System.Collections.Generic; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativeBreadcrumb : NativePayloadClassWrapper, IBreadcrumb + { + public NativeBreadcrumb(AndroidJavaObject androidJavaObject) : base(androidJavaObject){} + + public string Message { get => GetNativeString("getMessage"); set => SetNativeString("setMessage",value); } + public IDictionary Metadata { get => GetNativeDictionary("getMetadata"); set => SetNativeDictionary("setMetadata",value); } + + public DateTimeOffset? Timestamp => GetNativeDateTime("getTimestamp"); + + public BreadcrumbType Type { get => GetBreadcrumbType(); set => SetBreadcrumbType(value); } + + private BreadcrumbType GetBreadcrumbType() + { + var native = NativePointer.Call("getType").Call("toString").ToLowerInvariant(); + return Breadcrumb.ParseBreadcrumbType(native); + } + + private void SetBreadcrumbType(BreadcrumbType breadcrumbType) + { + var nativeCrumb = new AndroidJavaClass("com.bugsnag.android.BreadcrumbType").GetStatic(breadcrumbType.ToString().ToUpperInvariant()); + NativePointer.Call("setType",nativeCrumb); + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs.meta new file mode 100644 index 000000000..ecf2328ac --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f07da5e637fb245cd977ded424b94979 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs new file mode 100644 index 000000000..53768a0f0 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs @@ -0,0 +1,168 @@ +#if UNITY_ANDROID && !UNITY_EDITOR +using System.Collections.Generic; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + class NativeClient : INativeClient + { + public Configuration Configuration { get; } + + public IBreadcrumbs Breadcrumbs { get; } + + private NativeInterface NativeInterface; + + public NativeClient(Configuration configuration) + { + NativeInterface = new NativeInterface(configuration); + Configuration = configuration; + Breadcrumbs = new Breadcrumbs(NativeInterface); + if (configuration.AutoTrackSessions) + { + ResumeSession(); + } + } + + public void PopulateApp(App app) + { + app.Add(NativeInterface.GetApp()); + } + + public void PopulateAppWithState(AppWithState app) + { + PopulateApp(app); + } + + public void PopulateDevice(Device device) + { + Dictionary nativeDeviceData = NativeInterface.GetDevice(); + Dictionary nativeVersions = (Dictionary)nativeDeviceData.Get("runtimeVersions"); + + nativeDeviceData.Remove("runtimeVersions"); // don't overwrite the unity version values + device.Add(nativeDeviceData); + MergeDictionaries(device.RuntimeVersions, nativeVersions); // merge the native version values + } + + public void PopulateDeviceWithState(DeviceWithState device) + { + PopulateDevice(device); + } + + public void PopulateUser(User user) + { + foreach (var entry in NativeInterface.GetUser()) + { + user.Payload.AddToPayload(entry.Key, entry.Value.ToString()); + } + } + + private void MergeDictionaries(IDictionary dest, IDictionary another) + { + foreach (var entry in another) + { + dest.AddToPayload(entry.Key, entry.Value); + } + } + + public void SetUser(User user) + { + NativeInterface.SetUser(user); + } + + public void SetContext(string context) + { + NativeInterface.SetContext(context); + } + + public void StartSession() + { + NativeInterface.StartSession(); + } + + public void PauseSession() + { + NativeInterface.PauseSession(); + } + + public bool ResumeSession() + { + return NativeInterface.ResumeSession(); + } + + public void UpdateSession(Session session) + { + NativeInterface.UpdateSession(session); + } + + public Session GetCurrentSession() + { + return NativeInterface.GetCurrentSession(); + } + + public void MarkLaunchCompleted() + { + NativeInterface.MarkLaunchCompleted(); + } + + public LastRunInfo GetLastRunInfo() + { + return NativeInterface.GetlastRunInfo(); + } + + public void ClearNativeMetadata(string section) + { + NativeInterface.ClearMetadata(section); + } + + public void ClearNativeMetadata(string section, string key) + { + NativeInterface.ClearMetadata(section,key); + } + + public IDictionary GetNativeMetadata() + { + return NativeInterface.GetMetadata(); + } + + public void AddNativeMetadata(string section, IDictionary data) + { + NativeInterface.AddMetadata(section,data); + } + + public void AddFeatureFlag(string name, string variant = null) + { + NativeInterface.AddFeatureFlag(name, variant); + } + + public void AddFeatureFlags(FeatureFlag[] featureFlags) + { + foreach (var flag in featureFlags) + { + AddFeatureFlag(flag.Name, flag.Variant); + } + } + + public void ClearFeatureFlag(string name) + { + NativeInterface.ClearFeatureFlag(name); + } + + public void ClearFeatureFlags() + { + NativeInterface.ClearFeatureFlags(); + } + + public bool ShouldAttemptDelivery() + { + return true; + } + + public void RegisterForOnSessionCallbacks() + { + NativeInterface.RegisterForOnSessionCallbacks(); + } + } + +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs.meta new file mode 100644 index 000000000..598cc1949 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4c2e45fc9344e4e9090c31b133d1c7f2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs new file mode 100644 index 000000000..d4bb9c072 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs @@ -0,0 +1,31 @@ +#if UNITY_ANDROID && !UNITY_EDITOR +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativeDevice: NativePayloadClassWrapper, IDevice + { + public NativeDevice(AndroidJavaObject nativePointer) : base (nativePointer){} + + public string BrowserName { get; set; } + public string BrowserVersion { get; set; } + public string ModelNumber { get; set; } + public string UserAgent { get; set; } + + public string Id { get => GetNativeString("getId"); set => SetNativeString("setId", value); } + public string Locale { get => GetNativeString("getLocale"); set => SetNativeString("setLocale", value); } + public string Manufacturer { get => GetNativeString("getManufacturer"); set => SetNativeString("setManufacturer", value); } + public string Model { get => GetNativeString("getModel"); set => SetNativeString("setModel", value); } + public string OsName { get => GetNativeString("getOsName"); set => SetNativeString("setOsName", value); } + public string OsVersion { get => GetNativeString("getOsVersion"); set => SetNativeString("setOsVersion", value); } + public long? TotalMemory { get => GetNativeLong("getTotalMemory"); set => SetNativeLong("setTotalMemory", value); } + public bool? Jailbroken { get => GetNativeBool("getJailbroken"); set => SetNativeBool("setJailbroken", value); } + + public string[] CpuAbi { get => GetNativeStringArray("getCpuAbi"); set => SetNativeStringArray("setCpuAbi",value); } + + public IDictionary RuntimeVersions { get => GetNativeDictionary("getRuntimeVersions"); set => SetNativeDictionary("setRuntimeVersions", value); } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs.meta new file mode 100644 index 000000000..2a7456768 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1cc711b0cc4284f808e50cae95261841 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs new file mode 100644 index 000000000..204c7e509 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs @@ -0,0 +1,18 @@ +#if UNITY_ANDROID && !UNITY_EDITOR +using System; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativeDeviceWithState : NativeDevice, IDeviceWithState + { + public NativeDeviceWithState(AndroidJavaObject androidJavaObject) : base (androidJavaObject){} + + public long? FreeDisk { get => GetNativeLong("getFreeDisk"); set => SetNativeLong("setFreeDisk",value); } + public long? FreeMemory { get => GetNativeLong("getFreeMemory"); set => SetNativeLong("setFreeMemory", value); } + public string Orientation { get => GetNativeString("getOrientation"); set => SetNativeString("setOrientation", value); } + public DateTimeOffset? Time { get => GetNativeDateTime("getTime"); set => SetNativeDateTime("setTime",value); } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs.meta new file mode 100644 index 000000000..9c42121d0 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f9eb034cff9204d38a17176b9b86af2b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs new file mode 100644 index 000000000..bd82ffefd --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs @@ -0,0 +1,39 @@ +#if UNITY_ANDROID && !UNITY_EDITOR +using System; +using System.Collections.Generic; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativeError : NativePayloadClassWrapper, IError + { + public NativeError(AndroidJavaObject androidJavaObject) : base(androidJavaObject){} + + public string ErrorClass { get => GetNativeString("getErrorClass"); set => SetNativeString("setErrorClass",value); } + public string ErrorMessage { get => GetNativeString("getErrorMessage"); set => SetNativeString("setErrorMessage", value); } + + public List Stacktrace => GetStacktrace(); + + public string Type => NativePointer.Call("getType").Call("toString"); + + private List GetStacktrace() + { + var nativeList = NativePointer.Call("getStacktrace"); + if (nativeList == null) + { + return null; + } + var theStacktrace = new List(); + var iterator = nativeList.Call("iterator"); + while (iterator.Call("hasNext")) + { + var next = iterator.Call("next"); + theStacktrace.Add(new NativeStackFrame(next)); + } + return theStacktrace; + } + + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs.meta new file mode 100644 index 000000000..8ec810816 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 907134a10b77b4fd3b2c86347442c2cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs new file mode 100644 index 000000000..692aaa9c4 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs @@ -0,0 +1,195 @@ +#if UNITY_ANDROID && !UNITY_EDITOR +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativeEvent : NativePayloadClassWrapper, IEvent + { + public NativeEvent(AndroidJavaObject androidJavaObject) : base (androidJavaObject){} + + public string ApiKey { get => GetNativeString("getApiKey"); set => SetNativeString("setApiKey",value); } + + public IAppWithState App => new NativeAppWithState(NativePointer.Call("getApp")); + + public string Context { get => GetNativeString("getContext"); set => SetNativeString("setContext", value); } + + public IDeviceWithState Device => new NativeDeviceWithState(NativePointer.Call("getDevice")); + + public ReadOnlyCollection Breadcrumbs => GetBreadcrumbs(); + + public List Errors => GetErrors(); + + public string GroupingHash { get => GetNativeString("getGroupingHash"); set => SetNativeString("setGroupingHash", value); } + + public Severity Severity { get => GetSeverity(); set => SetSeverity(value); } + + public List Threads => GetThreads(); + + public bool Unhandled { get => NativePointer.Call("isUnhandled"); set => NativePointer.Call("setUnhandled", (bool)value); } + + private Severity GetSeverity() + { + var nativeSeverity = NativePointer.Call("getSeverity").Call("toString").ToLowerInvariant(); + if (nativeSeverity.Contains("error")) + { + return Severity.Error; + } + if (nativeSeverity.Contains("warning")) + { + return Severity.Warning; + } + return Severity.Info; + } + + private void SetSeverity(Severity severity) + { + var nativeSeverity = new AndroidJavaClass("com.bugsnag.android.Severity").GetStatic(severity.ToString().ToUpperInvariant()); + NativePointer.Call("setSeverity",nativeSeverity); + } + + private ReadOnlyCollection GetBreadcrumbs() + { + var nativeList = NativePointer.Call("getBreadcrumbs"); + if (nativeList == null) + { + return null; + } + var theBreadcrumbs = new List(); + var iterator = nativeList.Call("iterator"); + while (iterator.Call("hasNext")) + { + var next = iterator.Call("next"); + theBreadcrumbs.Add(new NativeBreadcrumb(next)); + } + return new ReadOnlyCollection( theBreadcrumbs ); + } + + private List GetErrors() + { + var nativeList = NativePointer.Call("getErrors"); + if (nativeList == null) + { + return null; + } + var theErrors = new List(); + var iterator = nativeList.Call("iterator"); + while (iterator.Call("hasNext")) + { + var next = iterator.Call("next"); + theErrors.Add(new NativeError(next)); + } + return theErrors; + } + + private List GetThreads() + { + var nativeList = NativePointer.Call("getThreads"); + if (nativeList == null) + { + return null; + } + var theThreads = new List(); + var iterator = nativeList.Call("iterator"); + while (iterator.Call("hasNext")) + { + var next = iterator.Call("next"); + theThreads.Add(new NativeThread(next)); + } + return theThreads; + } + + public void AddMetadata(string section, string key, object value) + { + var existingMetadata = GetNativeMetadataSection("getMetadata",section); + if (existingMetadata == null) + { + existingMetadata = new Dictionary(); + } + existingMetadata[key] = value; + AddMetadata(section,existingMetadata); + } + + public void AddMetadata(string section, IDictionary metadata) + { + SetNativeMetadataSection("addMetadata", section, metadata); + } + + public void ClearMetadata(string section) + { + NativePointer.Call("clearMetadata",section); + } + + public void ClearMetadata(string section, string key) + { + NativePointer.Call("clearMetadata", section, key); + } + + public IDictionary GetMetadata(string section) + { + return GetNativeMetadataSection("getMetadata", section); + } + + public object GetMetadata(string section, string key) + { + var metadata = GetMetadata(section); + if (metadata.ContainsKey(key)) + { + return metadata[key]; + } + return null; + } + + public IUser GetUser() => new NativeUser(NativePointer.Call("getUser")); + + public void SetUser(string id, string email, string name) + { + NativePointer.Call("setUser", id, email, name); + } + + public void AddFeatureFlag(string name, string variant = null) + { + NativePointer.Call("addFeatureFlag",name,variant); + } + + public void AddFeatureFlags(FeatureFlag[] featureFlags) + { + foreach (var flag in featureFlags) + { + AddFeatureFlag(flag.Name, flag.Variant); + } + } + + public void ClearFeatureFlag(string name) + { + NativePointer.Call("clearFeatureFlag",name); + } + + public void ClearFeatureFlags() + { + NativePointer.Call("clearFeatureFlags"); + } + + public ReadOnlyCollection FeatureFlags + { + get + { + var objects = new List(); + var list = NativePointer.Call("getFeatureFlags"); + var iterator = list.Call("iterator"); + while (iterator.Call("hasNext")) + { + var javaObject = iterator.Call("next"); + var name = javaObject.Call("getName"); + var variant = javaObject.Call("getVariant"); + objects.Add(new FeatureFlag(name, variant)); + } + return new ReadOnlyCollection(objects); + } + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs.meta new file mode 100644 index 000000000..9101b9311 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c0594cb96fd4b40e7a3b6ad707f1ae0e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs new file mode 100644 index 000000000..d351aaf88 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs @@ -0,0 +1,1294 @@ +#if UNITY_ANDROID && !UNITY_EDITOR + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using BugsnagUnity.Payload; +using UnityEngine; +using System.Threading; +using System.Text; + +namespace BugsnagUnity +{ + internal class DisposableContainer : IDisposable + { + private List _disposables = new List(); + + public void Add(IDisposable disposable) + { + _disposables.Add(disposable); + } + + public void Dispose() + { + for (int i = _disposables.Count - 1; i >= 0; i--) + { + if (_disposables[i] != null) + { + _disposables[i].Dispose(); + } + } + } + } + + class NativeInterface + { + private IntPtr BugsnagNativeInterface; + private IntPtr BugsnagUnityClass; + // Cache of classes used: + private IntPtr LastRunInfoClass; + private IntPtr BreadcrumbClass; + private IntPtr BreadcrumbTypeClass; + private IntPtr CollectionClass; + private IntPtr IteratorClass; + private IntPtr ListClass; + private IntPtr MapClass; + private IntPtr BooleanClass; + private IntPtr IntClass; + private IntPtr LongClass; + private IntPtr DoubleClass; + private IntPtr FloatClass; + + + private IntPtr DateClass; + private IntPtr DateUtilsClass; + private IntPtr MapEntryClass; + private IntPtr SetClass; + private IntPtr StringClass; + private IntPtr SessionClass; + private IntPtr ClientClass; + + // Cache of methods used: + private IntPtr BreadcrumbGetMessage; + private IntPtr BreadcrumbGetMetadata; + private IntPtr BreadcrumbGetTimestamp; + private IntPtr BreadcrumbGetType; + private IntPtr ClassIsArray; + private IntPtr CollectionIterator; + private IntPtr IteratorHasNext; + private IntPtr IteratorNext; + private IntPtr MapEntryGetKey; + private IntPtr MapEntryGetValue; + private IntPtr MapEntrySet; + private IntPtr ObjectGetClass; + private IntPtr ObjectToString; + private IntPtr BooleanValueMethod; + private IntPtr IntValueMethod; + private IntPtr LongValueMethod; + private IntPtr DoubleValueMethod; + private IntPtr FloatValueMethod; + + private IntPtr ToIso8601; + private IntPtr AddFeatureFlagMethod; + private IntPtr ClearFeatureFlagMethod; + private IntPtr ClearFeatureFlagsMethod; + + + + + private Configuration _configuration; + + private bool CanRunOnBackgroundThread; + + private static bool Unity2019OrNewer; + private Thread MainThread; + + private bool _registeredForSessionCallbacks; + + private class OnSessionCallback : AndroidJavaProxy + { + + private Configuration _config; + + public OnSessionCallback(Configuration config) : base("com.bugsnag.android.OnSessionCallback") + { + _config = config; + } + public bool onSession(AndroidJavaObject session) + { + + var wrapper = new NativeSession(session); + foreach (var callback in _config.GetOnSessionCallbacks()) + { + try + { + if (!callback.Invoke(wrapper)) + { + return false; + } + } + catch + { + // If the callback causes an exception, ignore it and execute the next one + } + + } + + return true; + } + } + + private class OnSendErrorCallback : AndroidJavaProxy + { + private Configuration _config; + + public OnSendErrorCallback(Configuration config) : base("com.bugsnag.android.OnSendCallback") + { + _config = config; + } + public bool onSend(AndroidJavaObject @event) + { + var wrapper = new NativeEvent(@event); + foreach (var callback in _config.GetOnSendErrorCallbacks()) + { + try + { + if (!callback.Invoke(wrapper)) + { + return false; + } + } + catch + { + // If the callback causes an exception, ignore it and execute the next one + } + } + return true; + } + } + + public NativeInterface(Configuration cfg) + { + _configuration = cfg; + AndroidJavaObject config = CreateNativeConfig(cfg); + ConfigureNotifierInfo(config); + Unity2019OrNewer = IsUnity2019OrNewer(); + MainThread = Thread.CurrentThread; + using (AndroidJavaClass system = new AndroidJavaClass("java.lang.System")) + { + string arch = system.CallStatic("getProperty", "os.arch"); + CanRunOnBackgroundThread = (arch != "x86" && arch != "i686" && arch != "x86_64"); + } + using (AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) + using (AndroidJavaObject activity = unityPlayerClass.GetStatic("currentActivity")) + using (AndroidJavaObject context = activity.Call("getApplicationContext")) + using (AndroidJavaObject client = new AndroidJavaObject("com.bugsnag.android.Client", context, config)) + { + // lookup the NativeInterface class and set the client to the local object. + // all subsequent communication should go through the NativeInterface. + IntPtr nativeInterfaceRef = AndroidJNI.FindClass("com/bugsnag/android/NativeInterface"); + BugsnagNativeInterface = AndroidJNI.NewGlobalRef(nativeInterfaceRef); + AndroidJNI.DeleteLocalRef(nativeInterfaceRef); + + IntPtr setClient = AndroidJNI.GetStaticMethodID(BugsnagNativeInterface, "setClient", "(Lcom/bugsnag/android/Client;)V"); + + object[] args = new object[] { client }; + jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(args); + AndroidJNI.CallStaticVoidMethod(BugsnagNativeInterface, setClient, jargs); + AndroidJNIHelper.DeleteJNIArgArray(args, jargs); + + // Cache JNI refs which will be used to load report data later in the + // app lifecycle to avoid repeated lookups + IntPtr unityRef = AndroidJNI.FindClass("com/bugsnag/android/unity/BugsnagUnity"); + BugsnagUnityClass = AndroidJNI.NewGlobalRef(unityRef); + AndroidJNI.DeleteLocalRef(unityRef); + + IntPtr crumbRef = AndroidJNI.FindClass("com/bugsnag/android/Breadcrumb"); + BreadcrumbClass = AndroidJNI.NewGlobalRef(crumbRef); + AndroidJNI.DeleteLocalRef(crumbRef); + + IntPtr lastRunInfoRef = AndroidJNI.FindClass("com/bugsnag/android/LastRunInfo"); + LastRunInfoClass = AndroidJNI.NewGlobalRef(lastRunInfoRef); + AndroidJNI.DeleteLocalRef(lastRunInfoRef); + + IntPtr crumbTypeRef = AndroidJNI.FindClass("com/bugsnag/android/BreadcrumbType"); + BreadcrumbTypeClass = AndroidJNI.NewGlobalRef(crumbTypeRef); + AndroidJNI.DeleteLocalRef(crumbTypeRef); + + IntPtr collectionRef = AndroidJNI.FindClass("java/util/Collection"); + CollectionClass = AndroidJNI.NewGlobalRef(collectionRef); + AndroidJNI.DeleteLocalRef(collectionRef); + + IntPtr iterRef = AndroidJNI.FindClass("java/util/Iterator"); + IteratorClass = AndroidJNI.NewGlobalRef(iterRef); + AndroidJNI.DeleteLocalRef(iterRef); + + IntPtr listRef = AndroidJNI.FindClass("java/util/List"); + ListClass = AndroidJNI.NewGlobalRef(listRef); + AndroidJNI.DeleteLocalRef(listRef); + + IntPtr mapRef = AndroidJNI.FindClass("java/util/Map"); + MapClass = AndroidJNI.NewGlobalRef(mapRef); + AndroidJNI.DeleteLocalRef(mapRef); + + IntPtr booleanRef = AndroidJNI.FindClass("java/lang/Boolean"); + BooleanClass = AndroidJNI.NewGlobalRef(booleanRef); + BooleanValueMethod = AndroidJNI.GetMethodID(booleanRef, "booleanValue", "()Z"); + AndroidJNI.DeleteLocalRef(booleanRef); + + IntPtr intRef = AndroidJNI.FindClass("java/lang/Integer"); + IntClass = AndroidJNI.NewGlobalRef(intRef); + IntValueMethod = AndroidJNI.GetMethodID(intRef, "intValue", "()I"); + AndroidJNI.DeleteLocalRef(intRef); + + IntPtr longRef = AndroidJNI.FindClass("java/lang/Long"); + LongClass = AndroidJNI.NewGlobalRef(longRef); + LongValueMethod = AndroidJNI.GetMethodID(longRef, "longValue", "()J"); + AndroidJNI.DeleteLocalRef(longRef); + + IntPtr floatRef = AndroidJNI.FindClass("java/lang/Float"); + FloatClass = AndroidJNI.NewGlobalRef(floatRef); + FloatValueMethod = AndroidJNI.GetMethodID(floatRef, "floatValue", "()F"); + AndroidJNI.DeleteLocalRef(floatRef); + + IntPtr doubleRef = AndroidJNI.FindClass("java/lang/Double"); + DoubleClass = AndroidJNI.NewGlobalRef(doubleRef); + DoubleValueMethod = AndroidJNI.GetMethodID(doubleRef, "doubleValue", "()D"); + AndroidJNI.DeleteLocalRef(doubleRef); + + IntPtr dateRef = AndroidJNI.FindClass("java/util/Date"); + DateClass = AndroidJNI.NewGlobalRef(dateRef); + AndroidJNI.DeleteLocalRef(dateRef); + + IntPtr dateUtilsRef = AndroidJNI.FindClass("com/bugsnag/android/internal/DateUtils"); + DateUtilsClass = AndroidJNI.NewGlobalRef(dateUtilsRef); + + IntPtr entryRef = AndroidJNI.FindClass("java/util/Map$Entry"); + MapEntryClass = AndroidJNI.NewGlobalRef(entryRef); + AndroidJNI.DeleteLocalRef(entryRef); + + IntPtr setRef = AndroidJNI.FindClass("java/util/Set"); + SetClass = AndroidJNI.NewGlobalRef(setRef); + AndroidJNI.DeleteLocalRef(setRef); + + IntPtr stringRef = AndroidJNI.FindClass("java/lang/String"); + StringClass = AndroidJNI.NewGlobalRef(stringRef); + AndroidJNI.DeleteLocalRef(stringRef); + + IntPtr sessionRef = AndroidJNI.FindClass("com/bugsnag/android/Session"); + SessionClass = AndroidJNI.NewGlobalRef(sessionRef); + AndroidJNI.DeleteLocalRef(sessionRef); + + IntPtr clientRef = AndroidJNI.FindClass("com/bugsnag/android/Client"); + ClientClass = AndroidJNI.NewGlobalRef(clientRef); + AndroidJNI.DeleteLocalRef(clientRef); + + BreadcrumbGetMetadata = AndroidJNI.GetMethodID(BreadcrumbClass, "getMetadata", "()Ljava/util/Map;"); + BreadcrumbGetType = AndroidJNI.GetMethodID(BreadcrumbClass, "getType", "()Lcom/bugsnag/android/BreadcrumbType;"); + BreadcrumbGetTimestamp = AndroidJNI.GetMethodID(BreadcrumbClass, "getStringTimestamp", "()Ljava/lang/String;"); + BreadcrumbGetMessage = AndroidJNI.GetMethodID(BreadcrumbClass, "getMessage", "()Ljava/lang/String;"); + CollectionIterator = AndroidJNI.GetMethodID(CollectionClass, "iterator", "()Ljava/util/Iterator;"); + IteratorHasNext = AndroidJNI.GetMethodID(IteratorClass, "hasNext", "()Z"); + IteratorNext = AndroidJNI.GetMethodID(IteratorClass, "next", "()Ljava/lang/Object;"); + MapEntryGetKey = AndroidJNI.GetMethodID(MapEntryClass, "getKey", "()Ljava/lang/Object;"); + MapEntryGetValue = AndroidJNI.GetMethodID(MapEntryClass, "getValue", "()Ljava/lang/Object;"); + MapEntrySet = AndroidJNI.GetMethodID(MapClass, "entrySet", "()Ljava/util/Set;"); + AddFeatureFlagMethod = AndroidJNI.GetMethodID(ClientClass, "addFeatureFlag", "(Ljava/lang/String;Ljava/lang/String;)V"); + ClearFeatureFlagMethod = AndroidJNI.GetMethodID(ClientClass, "clearFeatureFlag", "(Ljava/lang/String;)V"); + ClearFeatureFlagsMethod = AndroidJNI.GetMethodID(ClientClass, "clearFeatureFlags", "()V"); + + IntPtr objectRef = AndroidJNI.FindClass("java/lang/Object"); + ObjectToString = AndroidJNI.GetMethodID(objectRef, "toString", "()Ljava/lang/String;"); + ObjectGetClass = AndroidJNI.GetMethodID(objectRef, "getClass", "()Ljava/lang/Class;"); + AndroidJNI.DeleteLocalRef(objectRef); + + IntPtr classRef = AndroidJNI.FindClass("java/lang/Class"); + ClassIsArray = AndroidJNI.GetMethodID(classRef, "isArray", "()Z"); + AndroidJNI.DeleteLocalRef(classRef); + + ToIso8601 = AndroidJNI.GetStaticMethodID(DateUtilsClass, "toIso8601", "(Ljava/util/Date;)Ljava/lang/String;"); + AndroidJNI.DeleteLocalRef(dateUtilsRef); + + // the bugsnag-android notifier uses Activity lifecycle tracking to + // determine if the application is in the foreground. As the unity + // activity has already started at this point we need to tell the + // notifier about the activity and the fact that it has started. + using (AndroidJavaObject sessionTracker = client.Get("sessionTracker")) + using (AndroidJavaObject activityClass = activity.Call("getClass")) + { + string activityName = null; + using (AndroidJavaObject activityNameObject = activityClass.Call("getSimpleName")) + { + if (activityNameObject != null) + { + activityName = AndroidJNI.GetStringUTFChars(activityNameObject.GetRawObject()); + } + } + sessionTracker.Call("updateContext", activityName, true); + } + + } + } + + /** + * Transforms an IConfiguration C# object into a Java Configuration object. + */ + AndroidJavaObject CreateNativeConfig(Configuration config) + { + var obj = new AndroidJavaObject("com.bugsnag.android.Configuration", config.ApiKey); + // configure automatic tracking of errors/sessions + using (AndroidJavaObject errorTypes = new AndroidJavaObject("com.bugsnag.android.ErrorTypes")) + { + errorTypes.Call("setAnrs", config.EnabledErrorTypes.ANRs); + errorTypes.Call("setNdkCrashes", config.EnabledErrorTypes.Crashes); + errorTypes.Call("setUnhandledExceptions", config.EnabledErrorTypes.Crashes); + obj.Call("setEnabledErrorTypes", errorTypes); + } + + obj.Call("setAutoTrackSessions", config.AutoTrackSessions); + obj.Call("setAutoDetectErrors", config.AutoDetectErrors); + obj.Call("setAppVersion", config.AppVersion); + obj.Call("setContext", config.Context); + obj.Call("setMaxBreadcrumbs", config.MaximumBreadcrumbs); + obj.Call("setMaxPersistedEvents", config.MaxPersistedEvents); + obj.Call("setMaxPersistedSessions", config.MaxPersistedSessions); + obj.Call("setPersistUser", config.PersistUser); + obj.Call("setLaunchDurationMillis", config.LaunchDurationMillis); + obj.Call("setSendLaunchCrashesSynchronously", config.SendLaunchCrashesSynchronously); + obj.Call("setMaxReportedThreads", config.MaxReportedThreads); + obj.Call("setMaxStringValueLength", config.MaxStringValueLength); + obj.Call("setGenerateAnonymousId", config.GenerateAnonymousId); + + if (config.GetUser() != null) + { + var user = config.GetUser(); + obj.Call("setUser", user.Id, user.Email, user.Name); + } + + //Register for callbacks + if (config.GetOnSessionCallbacks() != null && config.GetOnSessionCallbacks().Count > 0) + { + obj.Call("addOnSession", new OnSessionCallback(config)); + _registeredForSessionCallbacks = true; + } + if (config.GetOnSendErrorCallbacks() != null && config.GetOnSendErrorCallbacks().Count > 0) + { + obj.Call("addOnSend", new OnSendErrorCallback(config)); + } + + // set endpoints + var notify = config.Endpoints.Notify.ToString(); + var sessions = config.Endpoints.Session.ToString(); + using (AndroidJavaObject endpointConfig = new AndroidJavaObject("com.bugsnag.android.EndpointConfiguration", notify, sessions)) + { + obj.Call("setEndpoints", endpointConfig); + } + + //android layer expects a nonnull java Integer not just an int, so we check if it has actually been set to a valid value + if (config.VersionCode > -1) + { + var javaInteger = new AndroidJavaObject("java.lang.Integer", config.VersionCode); + obj.Call("setVersionCode", javaInteger); + } + + //Null or empty check necessary because android will set the app.type to empty if that or null is passed as default + if (!string.IsNullOrEmpty(config.AppType)) + { + obj.Call("setAppType", config.AppType); + } + + // set EnabledBreadcrumbTypes + if (config.EnabledBreadcrumbTypes != null) + { + + using (AndroidJavaObject enabledBreadcrumbs = new AndroidJavaObject("java.util.HashSet")) + { + AndroidJavaClass androidBreadcrumbEnumClass = new AndroidJavaClass("com.bugsnag.android.BreadcrumbType"); + for (int i = 0; i < config.EnabledBreadcrumbTypes.Length; i++) + { + var stringValue = Enum.GetName(typeof(BreadcrumbType), config.EnabledBreadcrumbTypes[i]).ToUpperInvariant(); + using (AndroidJavaObject crumbType = androidBreadcrumbEnumClass.CallStatic("valueOf", stringValue)) + { + enabledBreadcrumbs.Call("add", crumbType); + } + } + obj.Call("setEnabledBreadcrumbTypes", enabledBreadcrumbs); + } + } + + // set enabled telemetry types + if (config.Telemetry != null) + { + using AndroidJavaObject enabledTelemetry = new AndroidJavaObject("java.util.HashSet"); + AndroidJavaClass androidTelemetryEnumClass = new AndroidJavaClass("com.bugsnag.android.Telemetry"); + foreach (var telemtryType in config.Telemetry) + { + var javaName = ""; + switch (telemtryType) + { + case TelemetryType.InternalErrors: + javaName = "INTERNAL_ERRORS"; + break; + case TelemetryType.Usage: + javaName = "USAGE"; + break; + } + using AndroidJavaObject telemetryType = androidTelemetryEnumClass.CallStatic("valueOf", javaName); + enabledTelemetry.Call("add", telemetryType); + } + obj.Call("setTelemetry", enabledTelemetry); + } + + + // set feature flags + if (config.FeatureFlags != null && config.FeatureFlags.Count > 0) + { + foreach (DictionaryEntry entry in config.FeatureFlags) + { + obj.Call("addFeatureFlag", (string)entry.Key, (string)entry.Value); + } + } + + // set sendThreads + AndroidJavaClass androidThreadSendPolicyClass = new AndroidJavaClass("com.bugsnag.android.ThreadSendPolicy"); + using (AndroidJavaObject policy = androidThreadSendPolicyClass.CallStatic("valueOf", GetAndroidFormatThreadSendName(config.SendThreads))) + { + obj.Call("setSendThreads", policy); + } + + // set release stages + obj.Call("setReleaseStage", config.ReleaseStage); + + if (config.EnabledReleaseStages != null && config.EnabledReleaseStages.Length > 0) + { + obj.Call("setEnabledReleaseStages", GetAndroidStringSetFromArray(config.EnabledReleaseStages)); + } + + // set DiscardedClasses + if (config.DiscardClasses != null && config.DiscardClasses.Count > 0) + { + var patternsAsStrings = new string[config.DiscardClasses.Count]; + foreach (var pattern in config.DiscardClasses) + { + patternsAsStrings[config.DiscardClasses.IndexOf(pattern)] = pattern.ToString(); + } + + obj.Call("setDiscardClasses", GetAndroidRegexPatternSetFromArray(patternsAsStrings)); + } + + // set ProjectPackages + if (config.ProjectPackages != null && config.ProjectPackages.Length > 0) + { + obj.Call("setProjectPackages", GetAndroidStringSetFromArray(config.ProjectPackages)); + } + + // set redacted keys + if (config.RedactedKeys != null && config.RedactedKeys.Count > 0) + { + var patternsAsStrings = new string[config.RedactedKeys.Count]; + foreach (var key in config.RedactedKeys) + { + patternsAsStrings[config.RedactedKeys.IndexOf(key)] = key.ToString(); + } + obj.Call("setRedactedKeys", GetAndroidRegexPatternSetFromArray(patternsAsStrings)); + } + + // add unity event callback + var BugsnagUnity = new AndroidJavaClass("com.bugsnag.android.unity.BugsnagUnity"); + obj.Call("addOnError", BugsnagUnity.CallStatic("getNativeCallback", new object[] { })); + + // set persistence directory + if (!string.IsNullOrEmpty(config.PersistenceDirectory)) + { + AndroidJavaObject androidFile = new AndroidJavaObject("java.io.File", config.PersistenceDirectory); + obj.Call("setPersistenceDirectory", androidFile); + } + + return obj; + } + + private string GetAndroidFormatThreadSendName(ThreadSendPolicy threadSendPolicy) + { + switch (threadSendPolicy) + { + case ThreadSendPolicy.Always: + return "ALWAYS"; + case ThreadSendPolicy.UnhandledOnly: + return "UNHANDLED_ONLY"; + default: + return "NEVER"; + } + } + + private AndroidJavaObject GetAndroidStringSetFromArray(string[] array) + { + AndroidJavaObject set = new AndroidJavaObject("java.util.HashSet"); + foreach (var item in array) + { + set.Call("add", item); + } + return set; + } + + private AndroidJavaObject GetAndroidRegexPatternSetFromArray(string[] array) + { + AndroidJavaObject set = new AndroidJavaObject("java.util.HashSet"); + AndroidJavaClass patternClass = new AndroidJavaClass("java.util.regex.Pattern"); + + foreach (var item in array) + { + try + { + AndroidJavaObject pattern = patternClass.CallStatic("compile", item); + set.Call("add", pattern); + } + catch (AndroidJavaException e) + { + Debug.LogWarning("Failed to compile regex pattern: " + item + " " + e.Message); + } + } + + return set; + } + + private void ConfigureNotifierInfo(AndroidJavaObject config) + { + using (AndroidJavaObject notifier = config.Call("getNotifier")) + { + AndroidJavaObject androidNotifier = new AndroidJavaObject("com.bugsnag.android.Notifier"); + androidNotifier.Call("setUrl", androidNotifier.Get("url")); + androidNotifier.Call("setName", androidNotifier.Get("name")); + androidNotifier.Call("setVersion", androidNotifier.Get("version")); + AndroidJavaObject list = new AndroidJavaObject("java.util.ArrayList"); + list.Call("add", androidNotifier); + notifier.Call("setDependencies", list); + + notifier.Call("setUrl", NotifierInfo.NotifierUrl); + notifier.Call("setName", "Unity Bugsnag Notifier"); + notifier.Call("setVersion", NotifierInfo.NotifierVersion); + } + } + + /** + * Pushes a local JNI frame with 128 capacity. This avoids the reference table + * being exceeded, which can happen on some lower-end Android devices in extreme conditions + * (e.g. Nexus 7 running Android 6). This is likely due to AndroidJavaObject + * not deleting local references immediately. + * + * If this call is unsuccessful it indicates the device is low on memory so the caller should no-op. + * https://docs.unity3d.com/ScriptReference/AndroidJNI.PopLocalFrame.html + */ + private bool PushLocalFrame() + { + if (AndroidJNI.PushLocalFrame(128) != 0) + { + AndroidJNI.ExceptionClear(); // clear pending OutOfMemoryError. + return false; + } + return true; + } + + /** + * Pops the local JNI frame, freeing any references in the table. + * https://docs.unity3d.com/ScriptReference/AndroidJNI.PopLocalFrame.html + */ + private void PopLocalFrame() + { + AndroidJNI.PopLocalFrame(System.IntPtr.Zero); + } + + public void SetAutoDetectErrors(bool newValue) + { + CallNativeVoidMethod("setAutoNotify", "(Z)V", new object[] { newValue }); + } + + public void SetContext(string newValue) + { + CallNativeVoidMethod("setContext", "(Ljava/lang/String;)V", new object[] { newValue }); + } + + public void SetUser(User user) + { + var method = "setUser"; + var description = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"; + if (user == null) + { + CallNativeVoidMethod(method, description, new object[] { null, null, null }); + } + else + { + CallNativeVoidMethod(method, description, + new object[] { user.Id, user.Email, user.Name }); + } + } + + public void StartSession() + { + CallNativeVoidMethod("startSession", "()V", new object[] { }); + } + + public bool ResumeSession() + { + return CallNativeBoolMethod("resumeSession", "()Z", new object[] { }); + } + + public void PauseSession() + { + CallNativeVoidMethod("pauseSession", "()V", new object[] { }); + } + + public void UpdateSession(Session session) + { + if (session != null) + { + // The ancient version of the runtime used doesn't have an equivalent to GetUnixTime() + var startedAt = (long)(session.StartedAt - new DateTime(1970, 1, 1, 0, 0, 0, 0))?.TotalMilliseconds; + CallNativeVoidMethod("registerSession", "(JLjava/lang/String;II)V", new object[]{ + startedAt, session.Id.ToString(), session.UnhandledCount(), + session.HandledCount() + }); + } + } + + public Session GetCurrentSession() + { + var javaSession = CallNativeObjectMethodRef("getCurrentSession", "()Lcom/bugsnag/android/Session;", new object[] { }); + + var id = AndroidJNI.CallStringMethod(javaSession, AndroidJNIHelper.GetMethodID(SessionClass, "getId"), new jvalue[] { }); + + if (id == null) + { + return null; + } + + var javaStartedAt = AndroidJNI.CallObjectMethod(javaSession, AndroidJNIHelper.GetMethodID(SessionClass, "getStartedAt"), new jvalue[] { }); + var unhandledCount = AndroidJNI.CallIntMethod(javaSession, AndroidJNIHelper.GetMethodID(SessionClass, "getUnhandledCount"), new jvalue[] { }); + var handledCount = AndroidJNI.CallIntMethod(javaSession, AndroidJNIHelper.GetMethodID(SessionClass, "getHandledCount"), new jvalue[] { }); + var timeLong = AndroidJNI.CallLongMethod(javaStartedAt, AndroidJNIHelper.GetMethodID(DateClass, "getTime"), new jvalue[] { }); + var unityDateTime = new DateTime(1970, 1, 1).AddMilliseconds(timeLong); + + return new Session(id, unityDateTime, handledCount, unhandledCount ); + + } + + public void MarkLaunchCompleted() + { + CallNativeVoidMethod("markLaunchCompleted", "()V", new object[] { }); + } + + public Dictionary GetApp() + { + return GetJavaMapData("getApp"); + } + + public Dictionary GetDevice() + { + return GetJavaMapData("getDevice"); + } + + public Dictionary GetMetadata() + { + var metadata = GetJavaMapData("getMetadata"); + return metadata; + } + + public Dictionary GetUser() + { + return GetJavaMapData("getUser"); + } + + public void ClearMetadata(string tab) + { + if (tab == null) + { + return; + } + CallNativeVoidMethod("clearMetadata", "(Ljava/lang/String;Ljava/lang/String;)V", new object[] { tab, null }); + } + + public void ClearMetadata(string tab, string key) + { + if (tab == null) + { + return; + } + CallNativeVoidMethod("clearMetadata", "(Ljava/lang/String;Ljava/lang/String;)V", new object[] { tab, key }); + } + + public void AddMetadata(string section, IDictionary metadata) + { + if (section == null || metadata == null) + { + return; + } + using (var disposableContainer = new DisposableContainer()) + { + CallNativeVoidMethod("addMetadata", "(Ljava/lang/String;Ljava/util/Map;)V", + new object[] { section, DictionaryToJavaMap(metadata, disposableContainer) }); + } + } + + + + internal static AndroidJavaObject DictionaryToJavaMap(IDictionary inputDict, DisposableContainer disposables) + { + AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap"); + disposables.Add(map); + if (inputDict != null) + { + foreach (var entry in inputDict) + { + + var key = new AndroidJavaObject("java.lang.String", entry.Key); + disposables.Add(key); + if (entry.Value == null) + { + map.Call("put", key, null); + } + else if (entry.Value is IDictionary) + { + if (entry.Value is IDictionary dictionary) + { + map.Call("put", key, DictionaryToJavaMap(dictionary, disposables)); + } + else + { + var convertedDictionary = ConvertIfPoss(entry.Value); + if (convertedDictionary != null) + { + map.Call("put", key, DictionaryToJavaMap(convertedDictionary, disposables)); + } + } + } + else if (IsListOrArray(entry.Value)) + { + map.Call("put", key, GetJavaArrayListFromCollection(entry.Value, disposables)); + } + else + { + map.Call("put", key, GetAndroidObjectFromBasicObject(entry.Value, disposables)); + } + } + } + return map; + } + + private static IDictionary ConvertIfPoss(object o) + { + var stringDict = o as IDictionary; + if (stringDict != null) + { + return stringDict; + } + + var dict = o as IDictionary; + + if (dict != null) + { + stringDict = new Dictionary(); + foreach (var key in dict.Keys) + { + stringDict[key?.ToString() ?? ""] = dict[key]; + } + return stringDict; + } + return null; + } + + private static bool IsListOrArray(object theObject) + { + var oType = theObject.GetType(); + return (oType.IsGenericType && oType.GetGenericTypeDefinition() == typeof(List<>)) || oType.IsArray; + } + + private static AndroidJavaObject GetJavaArrayListFromCollection(object theObject, DisposableContainer disposableContainer) + { + var collection = (IEnumerable)theObject; + var arrayList = new AndroidJavaObject("java.util.ArrayList"); + disposableContainer.Add(arrayList); + foreach (var item in collection) + { + arrayList.Call("add", GetAndroidObjectFromBasicObject(item, disposableContainer)); + } + return arrayList; + } + + private static AndroidJavaObject GetAndroidObjectFromBasicObject(object theObject, DisposableContainer disposableContainer) + { + if (theObject == null) + { + return null; + } + string nativeClass; + if (theObject.GetType() == typeof(string)) + { + nativeClass = "java.lang.String"; + } + else if (theObject.GetType() == typeof(bool)) + { + nativeClass = "java.lang.Boolean"; + } + else if (theObject.GetType() == typeof(int)) + { + nativeClass = "java.lang.Integer"; + } + else if (theObject.GetType() == typeof(double)) + { + nativeClass = "java.lang.Double"; + } + else if (theObject.GetType() == typeof(float)) + { + nativeClass = "java.lang.Float"; + } + else if (theObject.GetType() == typeof(long)) + { + nativeClass = "java.lang.Long"; + } + else + { + var stringObj = new AndroidJavaObject("java.lang.String", theObject.ToString()); + disposableContainer.Add(stringObj); + return stringObj; + } + var androidObj = new AndroidJavaObject(nativeClass, theObject); + disposableContainer.Add(androidObj); + return androidObj; + } + + public void LeaveBreadcrumb(string name, string type, IDictionary metadata) + { + if (!CanRunJNI()) + { + return; + } + bool isAttached = bsg_unity_isJNIAttached(); + if (!isAttached) + { + AndroidJNI.AttachCurrentThread(); + } + if (PushLocalFrame()) + { + using (var disposableContainer = new DisposableContainer()) + { + var map = DictionaryToJavaMap(metadata, disposableContainer); + CallNativeVoidMethod("leaveBreadcrumb", "(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V", + new object[] { name, type, map }); + } + PopLocalFrame(); + } + if (!isAttached) + { + AndroidJNI.DetachCurrentThread(); + } + } + + public List GetBreadcrumbs() + { + List breadcrumbs = new List(); + if (!CanRunJNI()) + { + return breadcrumbs; + } + bool isAttached = bsg_unity_isJNIAttached(); + if (!isAttached) + { + AndroidJNI.AttachCurrentThread(); + } + + IntPtr javaBreadcrumbs = CallNativeObjectMethodRef("getBreadcrumbs", "()Ljava/util/List;", new object[] { }); + IntPtr iterator = AndroidJNI.CallObjectMethod(javaBreadcrumbs, CollectionIterator, new jvalue[] { }); + AndroidJNI.DeleteLocalRef(javaBreadcrumbs); + + while (AndroidJNI.CallBooleanMethod(iterator, IteratorHasNext, new jvalue[] { })) + { + IntPtr crumb = AndroidJNI.CallObjectMethod(iterator, IteratorNext, new jvalue[] { }); + breadcrumbs.Add(ConvertToBreadcrumb(crumb)); + AndroidJNI.DeleteLocalRef(crumb); + } + AndroidJNI.DeleteLocalRef(iterator); + + if (!isAttached) + { + AndroidJNI.DetachCurrentThread(); + } + + return breadcrumbs; + } + + private Dictionary GetJavaMapData(string methodName) + { + if (!CanRunJNI()) + { + return new Dictionary(); + } + bool isAttached = bsg_unity_isJNIAttached(); + if (!isAttached) + { + AndroidJNI.AttachCurrentThread(); + } + + IntPtr map = CallNativeObjectMethodRef(methodName, "()Ljava/util/Map;", new object[] { }); + Dictionary value = DictionaryFromJavaMap(map); + AndroidJNI.DeleteLocalRef(map); + + if (!isAttached) + { + AndroidJNI.DetachCurrentThread(); + } + + return value; + } + + // Manually converts any C# strings in the arguments, replacing invalid chars with the replacement char.. + // If we don't do this, C# will coerce them using NewStringUTF, which crashes on invalid UTF-8. + // Arg lists processed this way must be released using ReleaseConvertedStringArgs. + private object[] ConvertStringArgsToNative(object[] args) + { + object[] itemsAsJavaObjects = new object[args.Length]; + for (int i = 0; i < args.Length; i++) + { + var obj = args[i]; + + if (obj is string) + { + itemsAsJavaObjects[i] = new AndroidJavaObject("java.lang.String", obj as string); + } + else + { + itemsAsJavaObjects[i] = obj; + } + } + return itemsAsJavaObjects; + } + + // Release any strings in a processed argument list. + // @param originalArgs: The original C# args. + // @param convertedArgs: The args list returned by ConvertStringArgsToNative. + private void ReleaseConvertedStringArgs(object[] originalArgs, object[] convertedArgs) + { + for (int i = 0; i < originalArgs.Length; i++) + { + if (originalArgs[i] is string) + { + (convertedArgs[i] as AndroidJavaObject).Dispose(); + } + } + } + + private void CallNativeVoidMethod(string methodName, string methodSig, object[] args) + { + if (!CanRunJNI()) + { + return; + } + bool isAttached = bsg_unity_isJNIAttached(); + if (!isAttached) + { + AndroidJNI.AttachCurrentThread(); + } + + object[] convertedArgs = ConvertStringArgsToNative(args); + jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(convertedArgs); + IntPtr methodID = AndroidJNI.GetStaticMethodID(BugsnagNativeInterface, methodName, methodSig); + AndroidJNI.CallStaticVoidMethod(BugsnagNativeInterface, methodID, jargs); + AndroidJNIHelper.DeleteJNIArgArray(convertedArgs, jargs); + ReleaseConvertedStringArgs(args, convertedArgs); + + if (!isAttached) + { + AndroidJNI.DetachCurrentThread(); + } + } + + private IntPtr CallNativeObjectMethodRef(string methodName, string methodSig, object[] args) + { + if (!CanRunJNI()) + { + return IntPtr.Zero; + } + bool isAttached = bsg_unity_isJNIAttached(); + if (!isAttached) + { + AndroidJNI.AttachCurrentThread(); + } + + object[] convertedArgs = ConvertStringArgsToNative(args); + jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(convertedArgs); + IntPtr methodID = AndroidJNI.GetStaticMethodID(BugsnagNativeInterface, methodName, methodSig); + IntPtr nativeValue = AndroidJNI.CallStaticObjectMethod(BugsnagNativeInterface, methodID, jargs); + AndroidJNIHelper.DeleteJNIArgArray(args, jargs); + ReleaseConvertedStringArgs(args, convertedArgs); + + if (!isAttached) + { + AndroidJNI.DetachCurrentThread(); + } + return nativeValue; + } + + private IntPtr ConvertToStringJNIArrayRef(string[] items) + { + if (items == null || items.Length == 0) + { + return IntPtr.Zero; + } + + AndroidJavaObject[] itemsAsJavaObjects = new AndroidJavaObject[items.Length]; + for (int i = 0; i < items.Length; i++) + { + itemsAsJavaObjects[i] = new AndroidJavaObject("java.lang.String", items[i]); + } + + AndroidJavaObject first = itemsAsJavaObjects[0]; + IntPtr rawArray = AndroidJNI.NewObjectArray(items.Length, StringClass, first.GetRawObject()); + first.Dispose(); + + for (int i = 1; i < items.Length; i++) + { + AndroidJNI.SetObjectArrayElement(rawArray, i, itemsAsJavaObjects[i].GetRawObject()); + itemsAsJavaObjects[i].Dispose(); + } + + return rawArray; + } + + private string CallNativeStringMethod(string methodName, string methodSig, object[] args) + { + if (!CanRunJNI()) + { + return ""; + } + bool isAttached = bsg_unity_isJNIAttached(); + if (!isAttached) + { + AndroidJNI.AttachCurrentThread(); + } + + object[] convertedArgs = ConvertStringArgsToNative(args); + jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(convertedArgs); + IntPtr methodID = AndroidJNI.GetStaticMethodID(BugsnagNativeInterface, methodName, methodSig); + IntPtr nativeValue = AndroidJNI.CallStaticObjectMethod(BugsnagNativeInterface, methodID, jargs); + AndroidJNIHelper.DeleteJNIArgArray(args, jargs); + ReleaseConvertedStringArgs(args, convertedArgs); + + string value = null; + if (nativeValue != null && nativeValue != IntPtr.Zero) + { + value = AndroidJNI.GetStringUTFChars(nativeValue); + } + AndroidJNI.DeleteLocalRef(nativeValue); + + if (!isAttached) + { + AndroidJNI.DetachCurrentThread(); + } + return value; + } + + private bool CallNativeBoolMethod(string methodName, string methodSig, object[] args) + { + if (!CanRunJNI()) + { + return false; + } + bool isAttached = bsg_unity_isJNIAttached(); + if (!isAttached) + { + AndroidJNI.AttachCurrentThread(); + } + + object[] convertedArgs = ConvertStringArgsToNative(args); + jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(convertedArgs); + IntPtr methodID = AndroidJNI.GetStaticMethodID(BugsnagNativeInterface, methodName, methodSig); + bool nativeValue = AndroidJNI.CallStaticBooleanMethod(BugsnagNativeInterface, methodID, jargs); + AndroidJNIHelper.DeleteJNIArgArray(args, jargs); + ReleaseConvertedStringArgs(args, convertedArgs); + if (!isAttached) + { + AndroidJNI.DetachCurrentThread(); + } + return nativeValue; + } + + [DllImport("bugsnag-unity")] + private static extern bool bsg_unity_isJNIAttached(); + + private Breadcrumb ConvertToBreadcrumb(IntPtr javaBreadcrumb) + { + + IntPtr javaMetadata = AndroidJNI.CallObjectMethod(javaBreadcrumb, BreadcrumbGetMetadata, new jvalue[] { }); + var metadata = DictionaryFromJavaMap(javaMetadata); + AndroidJNI.DeleteLocalRef(javaMetadata); + + + IntPtr type = AndroidJNI.CallObjectMethod(javaBreadcrumb, BreadcrumbGetType, new jvalue[] { }); + string typeName = AndroidJNI.CallStringMethod(type, ObjectToString, new jvalue[] { }); + AndroidJNI.DeleteLocalRef(type); + + string message = ""; + IntPtr messageObj = AndroidJNI.CallObjectMethod(javaBreadcrumb, BreadcrumbGetMessage, new jvalue[] { }); + if (messageObj != IntPtr.Zero) + { + message = AndroidJNI.GetStringUTFChars(messageObj); + } + AndroidJNI.DeleteLocalRef(messageObj); + + string timestamp = AndroidJNI.CallStringMethod(javaBreadcrumb, BreadcrumbGetTimestamp, new jvalue[] { }); + return new Breadcrumb(message, timestamp, typeName, metadata); + } + + internal static bool IsUnity2019OrNewer() + { + using (AndroidJavaClass CharsetClass = new AndroidJavaClass("java.nio.charset.Charset")) + using (AndroidJavaObject Charset = CharsetClass.CallStatic("defaultCharset")) + { + try + { // should succeed on Unity 2019.1 and above + using (AndroidJavaObject obj = new AndroidJavaObject("java.lang.String", new sbyte[0], Charset)) + { + return true; + } + } + catch (System.Exception _) + { // use legacy API on older versions + return false; + } + } + } + + private bool CanRunJNI() + { + return CanRunOnBackgroundThread || object.ReferenceEquals(Thread.CurrentThread, MainThread); + } + + private Dictionary DictionaryFromJavaMap(IntPtr source) + { + var dict = new Dictionary(); + + IntPtr entries = AndroidJNI.CallObjectMethod(source, MapEntrySet, new jvalue[] { }); + IntPtr iterator = AndroidJNI.CallObjectMethod(entries, CollectionIterator, new jvalue[] { }); + AndroidJNI.DeleteLocalRef(entries); + + while (AndroidJNI.CallBooleanMethod(iterator, IteratorHasNext, new jvalue[] { })) + { + IntPtr entry = AndroidJNI.CallObjectMethod(iterator, IteratorNext, new jvalue[] { }); + string key = AndroidJNI.CallStringMethod(entry, MapEntryGetKey, new jvalue[] { }); + IntPtr value = AndroidJNI.CallObjectMethod(entry, MapEntryGetValue, new jvalue[] { }); + AndroidJNI.DeleteLocalRef(entry); + + if (value != null && value != IntPtr.Zero) + { + IntPtr valueClass = AndroidJNI.CallObjectMethod(value, ObjectGetClass, new jvalue[] { }); + if (AndroidJNI.CallBooleanMethod(valueClass, ClassIsArray, new jvalue[] { })) + { + string[] values = AndroidJNIHelper.ConvertFromJNIArray(value); + dict.AddToPayload(key, values); + } + else if (AndroidJNI.IsInstanceOf(value, MapClass)) + { + dict.AddToPayload(key, DictionaryFromJavaMap(value)); + } + else if (AndroidJNI.IsInstanceOf(value, DateClass)) + { + jvalue[] args = new jvalue[1]; + args[0].l = value; + var time = AndroidJNI.CallStaticStringMethod(DateUtilsClass, ToIso8601, args); + dict.AddToPayload(key, time); + } + else // parse for basic data types + { + if (AndroidJNI.IsInstanceOf(value, BooleanClass)) + { + var boolValue = AndroidJNI.CallBooleanMethod(value, BooleanValueMethod, new jvalue[] { }); + dict.AddToPayload(key, boolValue); + } + else if (AndroidJNI.IsInstanceOf(value, IntClass)) + { + var intValue = AndroidJNI.CallIntMethod(value, IntValueMethod, new jvalue[] { }); + dict.AddToPayload(key, intValue); + } + else if (AndroidJNI.IsInstanceOf(value, LongClass)) + { + var longValue = AndroidJNI.CallLongMethod(value, LongValueMethod, new jvalue[] { }); + dict.AddToPayload(key, longValue); + } + else if (AndroidJNI.IsInstanceOf(value, FloatClass)) + { + var floatValue = AndroidJNI.CallFloatMethod(value, FloatValueMethod, new jvalue[] { }); + dict.AddToPayload(key, floatValue); + } + else if (AndroidJNI.IsInstanceOf(value, DoubleClass)) + { + var doubleValue = AndroidJNI.CallDoubleMethod(value, DoubleValueMethod, new jvalue[] { }); + dict.AddToPayload(key, doubleValue); + } + else // last case, cast to string + { + var stringValue = AndroidJNI.CallStringMethod(value, ObjectToString, new jvalue[] { }); + if (!string.IsNullOrEmpty(stringValue) && stringValue == "null") + { + dict.AddToPayload(key, null); + } + else + { + dict.AddToPayload(key, stringValue); + } + } + } + AndroidJNI.DeleteLocalRef(valueClass); + } + AndroidJNI.DeleteLocalRef(value); + } + AndroidJNI.DeleteLocalRef(iterator); + + return dict; + } + + public LastRunInfo GetlastRunInfo() + { + var javaLastRunInfo = CallNativeObjectMethodRef("getLastRunInfo", "()Lcom/bugsnag/android/LastRunInfo;", new object[] { }); + var crashed = AndroidJNI.GetBooleanField(javaLastRunInfo, AndroidJNIHelper.GetFieldID(LastRunInfoClass, "crashed")); + var consecutiveLaunchCrashes = AndroidJNI.GetIntField(javaLastRunInfo, AndroidJNIHelper.GetFieldID(LastRunInfoClass, "consecutiveLaunchCrashes")); + var crashedDuringLaunch = AndroidJNI.GetBooleanField(javaLastRunInfo, AndroidJNIHelper.GetFieldID(LastRunInfoClass, "crashedDuringLaunch")); + var lastRunInfo = new LastRunInfo + { + ConsecutiveLaunchCrashes = consecutiveLaunchCrashes, + Crashed = crashed, + CrashedDuringLaunch = crashedDuringLaunch + }; + return lastRunInfo; + } + + private IntPtr GetClientRef() + { + return CallNativeObjectMethodRef("getClient", "()Lcom/bugsnag/android/Client;", new object[] { }); + } + + public void AddFeatureFlag(string name, string variant) + { + object[] args = new object[] { name, variant }; + jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(args); + AndroidJNI.CallVoidMethod(GetClientRef(), AddFeatureFlagMethod, jargs); + } + + public void ClearFeatureFlag(string name) + { + object[] args = new object[] { name }; + jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(args); + AndroidJNI.CallVoidMethod(GetClientRef(), ClearFeatureFlagMethod, jargs); + } + + public void ClearFeatureFlags() + { + AndroidJNI.CallVoidMethod(GetClientRef(), ClearFeatureFlagsMethod, null); + } + + public void RegisterForOnSessionCallbacks() + { + if (_registeredForSessionCallbacks || _configuration == null) + { + return; + } + + var addOnSessionmethodId = AndroidJNI.GetMethodID(ClientClass, "addOnSession", "(Lcom/bugsnag/android/OnSessionCallback;)V"); + var callback = new OnSessionCallback(_configuration); + object[] args = new object[] { callback }; + jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(args); + AndroidJNI.CallVoidMethod(GetClientRef(), addOnSessionmethodId, jargs); + _registeredForSessionCallbacks = true; + } + + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs.meta new file mode 100644 index 000000000..0f1c44491 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 92b7ddf70338f494f9cce8886f8c1bbb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs new file mode 100644 index 000000000..834166860 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs @@ -0,0 +1,290 @@ +#if UNITY_ANDROID && !UNITY_EDITOR + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativePayloadClassWrapper + { + + public AndroidJavaObject NativePointer; + + public NativePayloadClassWrapper(AndroidJavaObject nativePointer) + { + NativePointer = nativePointer; + } + + public string GetNativeString(string key) + { + return NativePointer.Call(key); + } + + public void SetNativeString(string key, string value) + { + NativePointer.Call(key, value); + } + + public int? GetNativeInt(string key) + { + var number = NativePointer.Call(key); + if (number == null) + { + return null; + } + return number.Call("intValue"); + } + + public void SetNativeInt(string key, int? value) + { + if (value == null) + { + NativePointer.Call(key, null); + } + else + { + var javaInteger = new AndroidJavaObject("java.lang.Integer", (int)value); + NativePointer.Call(key, javaInteger); + } + } + + public long? GetNativeLong(string key) + { + var number = NativePointer.Call(key); + if (number == null) + { + return null; + } + return number.Call("longValue"); + } + + public void SetNativeLong(string key, long? value) + { + if (value == null) + { + NativePointer.Call(key, null); + } + else + { + var javaInteger = new AndroidJavaObject("java.lang.Long", (long)value); + NativePointer.Call(key, javaInteger); + } + } + + public double? GetNativeDouble(string key) + { + var number = NativePointer.Call(key); + if (number == null) + { + return null; + } + return number.Call("doubleValue"); + } + + public void SetNativeDouble(string key, double? value) + { + if (value == null) + { + NativePointer.Call(key, null); + } + else + { + var javaInteger = new AndroidJavaObject("java.lang.Double", (double)value); + NativePointer.Call(key, javaInteger); + } + } + + public TimeSpan? GetNativeTimespan(string key) + { + var millis = GetNativeDouble(key); + if (millis == null) + { + return null; + } + return TimeSpan.FromMilliseconds((double)millis); + } + + public void SetNativeTimespan(string key, TimeSpan? value) + { + if (value == null) + { + NativePointer.Call(key, null); + } + else + { + SetNativeDouble(key,value.Value.TotalMilliseconds); + } + } + + public bool? GetNativeBool(string key) + { + var value = NativePointer.Call(key); + if (value == null) + { + return null; + } + else + { + return value.Call("booleanValue"); + } + } + + public void SetNativeBool(string key, bool? value) + { + if (value == null) + { + NativePointer.Call(key, null); + } + else + { + var javaBoolean = new AndroidJavaObject("java.lang.Boolean", (bool)value); + NativePointer.Call(key, javaBoolean); + } + } + + public string[] GetNativeStringArray(string key) + { + var array = NativePointer.Call(key); + if (array == null) + { + return null; + } + var arraysClass = new AndroidJavaClass("java.util.Arrays"); + + var list = arraysClass.CallStatic("asList",array); + + var iterator = list.Call("iterator"); + + var returnList = new List(); + + while (iterator.Call("hasNext")) + { + var next = iterator.Call("next"); + returnList.Add(next); + } + + return returnList.ToArray(); + + } + + public void SetNativeStringArray(string key, string[] value) + { + + if (value == null) + { + NativePointer.Call(key, null); + return; + } + + AndroidJavaClass arrayClass = new AndroidJavaClass("java.lang.reflect.Array"); + + AndroidJavaObject arrayObject = arrayClass.CallStatic("newInstance", new AndroidJavaClass("java.lang.String"), value.Length); + + for (int i = 0; i < value.Length; ++i) + { + arrayClass.CallStatic("set", arrayObject, i, new AndroidJavaObject("java.lang.String", value[i])); + } + NativePointer.Call(key, arrayObject); + + } + + private Dictionary GetDictFromNativeMap(AndroidJavaObject map) + { + var size = map.Call("size"); + if (size > 0) + { + var keys = map.Call("keySet"); + var iterator = keys.Call("iterator"); + var dict = new Dictionary(); + while (iterator.Call("hasNext")) + { + var next = iterator.Call("next"); + var theKey = next.Call("toString"); + var theValue = map.Call("get", theKey); + if (theValue != null) + { + var theValueString = theValue.Call("toString"); + dict.Add(theKey, theValueString); + } + else + { + dict.Add(theKey, null); + } + } + return dict; + } + return null; + } + + public Dictionary GetNativeDictionary(string key) + { + var map = NativePointer.Call(key); + if (map != null) + { + return GetDictFromNativeMap(map); + } + return null; + } + + public Dictionary GetNativeMetadataSection(string key, string section) + { + var map = NativePointer.Call(key,section); + if (map != null) + { + return GetDictFromNativeMap(map); + } + return null; + } + + public void SetNativeDictionary(string key,IDictionary dict) + { + using (var disposeableContainer = new DisposableContainer()) + { + var map = NativeInterface.DictionaryToJavaMap(dict, disposeableContainer); + NativePointer.Call(key, map); + } + } + + public void SetNativeMetadataSection(string key, string section, IDictionary dict) + { + using (var disposeableContainer = new DisposableContainer()) + { + var map = NativeInterface.DictionaryToJavaMap(dict, disposeableContainer); + NativePointer.Call(key, section, map); + } + } + + public DateTimeOffset? GetNativeDateTime(string key) + { + var nativeDate = NativePointer.Call(key); + + if (nativeDate == null) + { + return null; + } + + var timeStamp = nativeDate.Call("getTime"); + + var date = new DateTimeOffset(1970, 1, 1,0,0,0, TimeSpan.Zero).AddMilliseconds(timeStamp); + + return date; + } + + public void SetNativeDateTime(string key, DateTimeOffset? dateTime) + { + if (dateTime == null) + { + NativePointer.Call(key, null); + } + else + { + var mill = (dateTime - new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero)).Value.TotalMilliseconds; + var javaDate = new AndroidJavaObject("java.util.Date", (long)mill); + NativePointer.Call(key,javaDate); + } + } + + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs.meta new file mode 100644 index 000000000..ea189307e --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 944417e58a0a14851813f758402679f2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs new file mode 100644 index 000000000..5c73101c5 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs @@ -0,0 +1,29 @@ +#if UNITY_ANDROID && !UNITY_EDITOR + +using System; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativeSession : NativePayloadClassWrapper, ISession + { + public NativeSession(AndroidJavaObject androidJavaObject) : base(androidJavaObject){} + + public string Id { get => GetNativeString("getId"); set => SetNativeString("setId",value); } + + public IDevice Device { get => new NativeDevice(NativePointer.Call("getDevice")); set { } } + + public IApp App { get => new NativeApp(NativePointer.Call("getApp")); set { } } + + public DateTimeOffset? StartedAt { get => GetNativeDateTime("getStartedAt"); set => SetNativeDateTime("setStartedAt",value); } + + public IUser GetUser() => new NativeUser(NativePointer.Call("getUser")); + + public void SetUser(string id, string email, string name) + { + NativePointer.Call("setUser",id,email,name); + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs.meta new file mode 100644 index 000000000..a0b083acc --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 192bf151b1fc944a5bcb83594f3d2fe3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs new file mode 100644 index 000000000..9529bf027 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs @@ -0,0 +1,25 @@ +#if UNITY_ANDROID && !UNITY_EDITOR +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativeStackFrame : NativePayloadClassWrapper, IStackframe + { + public NativeStackFrame(AndroidJavaObject androidJavaObject) : base (androidJavaObject){} + + public string FrameAddress { get; set; } + public bool? IsLr { get; set; } + public bool? IsPc { get; set; } + public string MachoFile { get; set; } + public string MachoLoadAddress { get; set; } + public string MachoUuid { get; set; } + public string MachoVmAddress { get; set; } + public string Method { get => GetNativeString("getMethod"); set => SetNativeString("setMethod",value); } + public string SymbolAddress { get; set; } + public string File { get => GetNativeString("getFile"); set => SetNativeString("setFile", value); } + public bool? InProject { get => GetNativeBool("getInProject"); set => SetNativeBool("setInProject",value); } + public int? LineNumber { get => GetNativeInt("getLineNumber"); set => SetNativeInt("setLineNumber",value); } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs.meta new file mode 100644 index 000000000..67c32261c --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 81ca8751bffbd4cd980f9a234ef258ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs new file mode 100644 index 000000000..13fc4f1df --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs @@ -0,0 +1,40 @@ +#if UNITY_ANDROID && !UNITY_EDITOR +using System.Collections.Generic; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativeThread : NativePayloadClassWrapper, IThread + { + public NativeThread(AndroidJavaObject androidJavaObject) : base(androidJavaObject){} + + public string Id { get => GetNativeString("getId"); set => SetNativeString("setId",value); } + + public bool? ErrorReportingThread => GetNativeBool("getErrorReportingThread"); + + public string Name { get => GetNativeString("getName"); set => SetNativeString("setName",value); } + + public List Stacktrace => GetStacktrace(); + + public string Type => NativePointer.Call("getType").Call("toString"); + + private List GetStacktrace() + { + var nativeList = NativePointer.Call("getStacktrace"); + if (nativeList == null) + { + return null; + } + var theStacktrace = new List(); + var iterator = nativeList.Call("iterator"); + while (iterator.Call("hasNext")) + { + var next = iterator.Call("next"); + theStacktrace.Add(new NativeStackFrame(next)); + } + return theStacktrace; + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs.meta new file mode 100644 index 000000000..1ced8369e --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a074ad6387e74428686660ea9eb5ad0d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs new file mode 100644 index 000000000..cab59290d --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs @@ -0,0 +1,16 @@ +#if UNITY_ANDROID && !UNITY_EDITOR +using UnityEngine; + +namespace BugsnagUnity +{ + internal class NativeUser : NativePayloadClassWrapper, IUser + { + public NativeUser(AndroidJavaObject androidJavaObject) : base (androidJavaObject){} + + public string Id => GetNativeString("getId"); + public string Name => GetNativeString("getName"); + public string Email => GetNativeString("getEmail"); + + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs.meta new file mode 100644 index 000000000..6d4026fbf --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ed2a9f84fc6e448fa2b49fabca94969 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa.meta new file mode 100644 index 000000000..17c951d1b --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c1e6543038148419c989fdadffd0a2fd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs new file mode 100644 index 000000000..fcffbf8bf --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs @@ -0,0 +1,91 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using AOT; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + class Breadcrumbs : IBreadcrumbs + { + internal Breadcrumbs() + { + } + + /// + /// Add a breadcrumb to the collection with the specified type and metadata + /// + /// + /// + /// + public void Leave(string message, Dictionary metadata, BreadcrumbType type) + { + Leave(new Breadcrumb(message, metadata, type)); + } + + public void Leave(Breadcrumb breadcrumb) + { + if (breadcrumb == null || string.IsNullOrEmpty(breadcrumb.Message)) + { + return; + } + + string metadataJson = null; + if (breadcrumb.Metadata != null) + { + using (var stream = new MemoryStream()) + using (var reader = new StreamReader(stream)) + using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) + { + SimpleJson.SerializeObject(breadcrumb.Metadata, writer); + writer.Flush(); + stream.Position = 0; + metadataJson = reader.ReadToEnd(); + } + } + NativeCode.bugsnag_addBreadcrumb(breadcrumb.Message, breadcrumb.Type.ToString().ToLowerInvariant(), metadataJson); + } + + public List Retrieve() + { + var breadcrumbs = new List(); + + var handle = GCHandle.Alloc(breadcrumbs); + + try + { + NativeCode.bugsnag_retrieveBreadcrumbs(GCHandle.ToIntPtr(handle), PopulateBreadcrumb); + } + finally + { + handle.Free(); + } + + return breadcrumbs; + } + + [MonoPInvokeCallback(typeof(NativeCode.BreadcrumbInformation))] + static void PopulateBreadcrumb(IntPtr instance, string message, string timestamp, string type, string metadataJson) + { + var handle = GCHandle.FromIntPtr(instance); + if (handle.Target is List breadcrumbs) + { + if (!string.IsNullOrEmpty(metadataJson)) + { + var metadata = ((JsonObject)SimpleJson.DeserializeObject(metadataJson)).GetDictionary(); + breadcrumbs.Add(new Breadcrumb(message, timestamp, type, metadata)); + } + else + { + breadcrumbs.Add(new Breadcrumb(message, timestamp, type, null)); + } + + + } + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs.meta new file mode 100644 index 000000000..d807df7e3 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 21fa1c28f25754c7eb6a40b2ef1cbffd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs new file mode 100644 index 000000000..efe9f0945 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs @@ -0,0 +1,49 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public class NativeApp : IApp + { + + private const string BINARY_ARCH_KEY = "binaryArch"; + private const string BUNDLE_VERSION_KEY = "bundleVersion"; + private const string CODE_BUNDLE_ID_KEY = "codeBundleId"; + private const string DSYM_UUID_KEY = "dsymUuid"; + private const string ID_KEY = "id"; + private const string RELEASE_STAGE_KEY = "releaseStage"; + private const string TYPE_KEY = "type"; + private const string VERSION_KEY = "version"; + + internal NativePayloadClassWrapper NativeWrapper; + + internal NativeApp(IntPtr nativeApp) + { + NativeWrapper = new NativePayloadClassWrapper(nativeApp); + } + + public string BuildUuid { get; set; } + public int? VersionCode { get; set; } + + public string BinaryArch { get => NativeWrapper.GetNativeString(BINARY_ARCH_KEY); set => NativeWrapper.SetNativeString(BINARY_ARCH_KEY, value); } + + public string BundleVersion { get => NativeWrapper.GetNativeString(BUNDLE_VERSION_KEY); set => NativeWrapper.SetNativeString(BUNDLE_VERSION_KEY,value); } + + public string CodeBundleId { get => NativeWrapper.GetNativeString(CODE_BUNDLE_ID_KEY); set => NativeWrapper.SetNativeString(CODE_BUNDLE_ID_KEY, value); } + + public string DsymUuid { get => NativeWrapper.GetNativeString(DSYM_UUID_KEY); set => NativeWrapper.SetNativeString(DSYM_UUID_KEY, value); } + + public string Id { get => NativeWrapper.GetNativeString(ID_KEY); set => NativeWrapper.SetNativeString(ID_KEY, value); } + + public string ReleaseStage { get => NativeWrapper.GetNativeString(RELEASE_STAGE_KEY); set => NativeWrapper.SetNativeString(RELEASE_STAGE_KEY, value); } + + public string Type { get => NativeWrapper.GetNativeString(TYPE_KEY); set => NativeWrapper.SetNativeString(TYPE_KEY, value); } + + public string Version { get => NativeWrapper.GetNativeString(VERSION_KEY); set => NativeWrapper.SetNativeString(VERSION_KEY, value); } + + + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs.meta new file mode 100644 index 000000000..cd980b607 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: efa5384f5e15f4acbbe153a5ec52c093 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs new file mode 100644 index 000000000..8e66db510 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs @@ -0,0 +1,86 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public class NativeAppWithState : NativeApp, IAppWithState + { + + private const string DURATION_KEY = "duration"; + private const string DURATION_IN_FOREGROUND_KEY = "durationInForeground"; + private const string IN_FOREGROUND_KEY = "inForeground"; + private const string IS_LAUNCHING_KEY = "isLaunching"; + + + public NativeAppWithState(IntPtr nativeAppWithState) : base(nativeAppWithState) + { + } + + public TimeSpan? Duration + { + get + { + var timestamp = NativeWrapper.GetNativeDouble(DURATION_KEY); + if (timestamp == null) + { + return null; + } + else + { + return TimeSpan.FromMilliseconds((double)timestamp); + } + } + set + { + if (value == null) + { + NativeWrapper.SetNativeDouble(DURATION_KEY, null); + } + else + { + NativeWrapper.SetNativeDouble(DURATION_KEY,(double)value?.TotalMilliseconds); + } + } + } + + public TimeSpan? DurationInForeground + { + get + { + var timestamp = NativeWrapper.GetNativeDouble(DURATION_IN_FOREGROUND_KEY); + if (timestamp == null) + { + return null; + } + else + { + return TimeSpan.FromMilliseconds((double)timestamp); + } + } + set + { + if (value == null) + { + NativeWrapper.SetNativeDouble(DURATION_IN_FOREGROUND_KEY, null); + } + else + { + NativeWrapper.SetNativeDouble(DURATION_IN_FOREGROUND_KEY, (double)value?.Milliseconds); + } + } + } + + public bool? InForeground { + get => NativeWrapper.GetNativeBool(IN_FOREGROUND_KEY); + set => NativeWrapper.SetNativeBool(IN_FOREGROUND_KEY,value); + } + + public bool? IsLaunching { + get => NativeWrapper.GetNativeBool(IS_LAUNCHING_KEY); + set => NativeWrapper.SetNativeBool(IS_LAUNCHING_KEY, value); + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs.meta new file mode 100644 index 000000000..6c618de1f --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: effef202f1cba410792f668ac94f3196 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs new file mode 100644 index 000000000..6a283ea9c --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs @@ -0,0 +1,56 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using AOT; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public class NativeBreadcrumb : NativePayloadClassWrapper, IBreadcrumb + { + + private const string MESSAGE_KEY = "message"; + private const string TIMESTAMP_KEY = "timestamp"; + + public NativeBreadcrumb(IntPtr nativeBreadcrumb) : base(nativeBreadcrumb) + { + } + + public string Message { get => GetNativeString(MESSAGE_KEY); set => SetNativeString(MESSAGE_KEY, value); } + + public IDictionary Metadata { get => GetMetadata(); set => SetMetadata(value); } + + private IDictionary GetMetadata() + { + var result = NativeCode.bugsnag_getBreadcrumbMetadata(NativePointer); + var dictionary = ((JsonObject)SimpleJson.DeserializeObject(result)).GetDictionary(); + return dictionary; + } + + private void SetMetadata(IDictionary metadata) + { + using (var stream = new MemoryStream()) + using (var reader = new StreamReader(stream)) + using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) + { + SimpleJson.SerializeObject(metadata, writer); + writer.Flush(); + stream.Position = 0; + var jsonString = reader.ReadToEnd(); + NativeCode.bugsnag_setBreadcrumbMetadata(NativePointer, jsonString); + } + } + + public DateTimeOffset? Timestamp => GetNativeDate(TIMESTAMP_KEY); + + public BreadcrumbType Type { + get => Breadcrumb.ParseBreadcrumbType( NativeCode.bugsnag_getBreadcrumbType(NativePointer) ); + set => NativeCode.bugsnag_setBreadcrumbType(NativePointer, value.ToString().ToLowerInvariant()); + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs.meta new file mode 100644 index 000000000..89c1b8a04 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 13860ff7c9d954865bf725f8d6970914 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs new file mode 100644 index 000000000..bc63ecb99 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs @@ -0,0 +1,490 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using AOT; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + class NativeClient : INativeClient + { + public Configuration Configuration { get; } + public IBreadcrumbs Breadcrumbs { get; } + private static Session _nativeSession; + IntPtr NativeConfiguration { get; } + private static NativeClient _instance; + private bool _registeredForSessionCallbacks; + + public NativeClient(Configuration configuration) + { + _instance = this; + Configuration = configuration; + NativeConfiguration = CreateNativeConfig(configuration); + NativeCode.bugsnag_startBugsnagWithConfiguration(NativeConfiguration, NotifierInfo.NotifierVersion); + Breadcrumbs = new Breadcrumbs(); + } + + /** + * Transforms an IConfiguration C# object into a Cocoa Configuration object. + */ + IntPtr CreateNativeConfig(Configuration config) + { + IntPtr obj = NativeCode.bugsnag_createConfiguration(config.ApiKey); + NativeCode.bugsnag_setAutoNotifyConfig(obj, config.AutoDetectErrors); + NativeCode.bugsnag_setReleaseStage(obj, config.ReleaseStage); + NativeCode.bugsnag_setAppVersion(obj, config.AppVersion); + NativeCode.bugsnag_setEndpoints(obj, config.Endpoints.Notify.ToString(), config.Endpoints.Session.ToString()); + NativeCode.bugsnag_setMaxBreadcrumbs(obj, config.MaximumBreadcrumbs); + if (!string.IsNullOrEmpty(config.BundleVersion)) + { + NativeCode.bugsnag_setBundleVersion(obj, config.BundleVersion); + } + NativeCode.bugsnag_setAppType(obj, GetAppType(config)); + NativeCode.bugsnag_setPersistUser(obj,config.PersistUser); + NativeCode.bugsnag_setMaxPersistedEvents(obj, config.MaxPersistedEvents); + NativeCode.bugsnag_setMaxPersistedSessions(obj, config.MaxPersistedSessions); + NativeCode.bugsnag_setThreadSendPolicy(obj, Enum.GetName(typeof(ThreadSendPolicy), config.SendThreads)); + NativeCode.bugsnag_setAutoTrackSessions(obj, config.AutoTrackSessions); + NativeCode.bugsnag_setLaunchDurationMillis(obj, (ulong)config.LaunchDurationMillis); + NativeCode.bugsnag_setSendLaunchCrashesSynchronously(obj,config.SendLaunchCrashesSynchronously); + + if (config.GetOnSendErrorCallbacks() != null && config.GetOnSendErrorCallbacks().Count > 0) + { + NativeCode.bugsnag_registerForOnSendCallbacks(obj, HandleOnSendCallbacks); + } + + if (config.GetOnSessionCallbacks() != null && config.GetOnSessionCallbacks().Count > 0) + { + _registeredForSessionCallbacks = true; + NativeCode.bugsnag_registerForSessionCallbacks(obj, HandleSessionCallbacks); + } + + + + + NativeCode.bugsnag_setAppHangThresholdMillis(obj, config.AppHangThresholdMillis); + NativeCode.bugsnag_setMaxStringValueLength(obj, config.MaxStringValueLength); + AddFeatureFlagsToConfig(obj,config); + if (config.GetUser() != null) + { + var user = config.GetUser(); + NativeCode.bugsnag_setUserInConfig(obj, user.Id, user.Email, user.Name); + } + if (config.DiscardClasses != null && config.DiscardClasses.Count > 0) + { + var patternsAsStrings = new string[config.DiscardClasses.Count]; + foreach (var key in config.DiscardClasses) + { + patternsAsStrings[config.DiscardClasses.IndexOf(key)] = key.ToString(); + } + NativeCode.bugsnag_setDiscardClasses(obj, patternsAsStrings, patternsAsStrings.Length); + } + if (config.RedactedKeys != null && config.RedactedKeys.Count > 0) + { + var patternsAsStrings = new string[config.RedactedKeys.Count]; + foreach (var key in config.RedactedKeys) + { + patternsAsStrings[config.RedactedKeys.IndexOf(key)] = key.ToString(); + } + NativeCode.bugsnag_setRedactedKeys(obj, patternsAsStrings, patternsAsStrings.Length); + } + + SetEnabledTelemetryTypes(obj,config); + SetEnabledBreadcrumbTypes(obj,config); + SetEnabledErrorTypes(obj, config); + if (config.Context != null) + { + NativeCode.bugsnag_setContextConfig(obj, config.Context); + } + var releaseStages = config.EnabledReleaseStages; + if (releaseStages != null && releaseStages.Length > 0) + { + NativeCode.bugsnag_setNotifyReleaseStages(obj, releaseStages, releaseStages.Length); + } + return obj; + } + + private void AddFeatureFlagsToConfig(IntPtr obj, Configuration config) + { + if (config.FeatureFlags == null || config.FeatureFlags.Count == 0) + { + return; + } + foreach (DictionaryEntry entry in config.FeatureFlags) + { + NativeCode.bugsnag_addFeatureFlagOnConfig(obj, (string)entry.Key, (string)entry.Value); + } + } + + [MonoPInvokeCallback(typeof(Func))] + static bool HandleOnSendCallbacks(IntPtr nativeEvent) + { + var callbacks = _instance.Configuration.GetOnSendErrorCallbacks(); + if (callbacks.Count > 0) + { + var nativeEventWrapper = new NativeEvent(nativeEvent); + + foreach (var callback in callbacks) + { + try + { + if (!callback.Invoke(nativeEventWrapper)) + { + return false; + } + } + catch { + // If the callback causes an exception, ignore it and execute the next one + } + } + } + return true; + } + + [MonoPInvokeCallback(typeof(Func))] + static bool HandleSessionCallbacks(IntPtr nativeSession) + { + var callbacks = _instance.Configuration.GetOnSessionCallbacks(); + if (callbacks.Count > 0) + { + var nativeSessionWrapper = new NativeSession(nativeSession); + + foreach (var callback in callbacks) + { + try + { + if (!callback.Invoke(nativeSessionWrapper)) + { + return false; + } + } + catch { + // If the callback causes an exception, ignore it and execute the next one + } + } + } + return true; + } + + private string GetAppType(Configuration config) + { + if (!string.IsNullOrEmpty(config.AppType)) + { + return config.AppType; + } + switch (UnityEngine.Application.platform) + { + case UnityEngine.RuntimePlatform.OSXPlayer: + return "MacOS"; + case UnityEngine.RuntimePlatform.IPhonePlayer: + return "iOS"; + case UnityEngine.RuntimePlatform.tvOS: + return "tvOS"; + } + return string.Empty; + } + + private void SetEnabledBreadcrumbTypes(IntPtr obj, Configuration config) + { + if (config.EnabledBreadcrumbTypes == null) + { + NativeCode.bugsnag_setEnabledBreadcrumbTypes(obj, null, 0); + return; + } + var enabledTypes = new List(); + foreach (var enabledType in config.EnabledBreadcrumbTypes) + { + var typeName = Enum.GetName(typeof(BreadcrumbType), enabledType); + enabledTypes.Add(typeName); + } + NativeCode.bugsnag_setEnabledBreadcrumbTypes(obj, enabledTypes.ToArray(),enabledTypes.Count); + } + + private void SetEnabledTelemetryTypes(IntPtr obj, Configuration config) + { + if (config.Telemetry == null) + { + NativeCode.bugsnag_setEnabledTelemetryTypes(obj, null, 0); + return; + } + var enabledTypes = new List(); + foreach (var enabledType in config.Telemetry) + { + var typeName = Enum.GetName(typeof(TelemetryType), enabledType); + enabledTypes.Add(typeName); + } + NativeCode.bugsnag_setEnabledTelemetryTypes(obj, enabledTypes.ToArray(), enabledTypes.Count); + } + + private void SetEnabledErrorTypes(IntPtr obj, Configuration config) + { + var enabledTypes = new List(); + + if (config.EnabledErrorTypes.AppHangs) + { + enabledTypes.Add("AppHangs"); + } + if (config.EnabledErrorTypes.ThermalKills) + { + enabledTypes.Add("ThermalKills"); + } + if (config.EnabledErrorTypes.Crashes) + { + enabledTypes.Add("UnhandledExceptions"); + enabledTypes.Add("Signals"); + enabledTypes.Add("CppExceptions"); + enabledTypes.Add("MachExceptions"); + } + if (config.EnabledErrorTypes.OOMs) + { + enabledTypes.Add("OOMs"); + } + + NativeCode.bugsnag_setEnabledErrorTypes(obj, enabledTypes.ToArray(), enabledTypes.Count); + } + + public void PopulateApp(App app) + { + var result = NativeCode.bugsnag_retrieveAppData(); + var dictionary = ((JsonObject)SimpleJson.DeserializeObject(result)).GetDictionary(); + foreach (var pair in dictionary) + { + if (pair.Key == "isLaunching") + { + if (pair.Value != null) + { + var stringValue = (pair.Value as string).ToLower(); + app.Add(pair.Key, stringValue == "true"); + } + } + else + { + app.Add(pair.Key, pair.Value); + } + } + } + + public void PopulateAppWithState(AppWithState app) + { + PopulateApp(app); + } + + public void PopulateDevice(Device device) + { + var result = NativeCode.bugsnag_retrieveDeviceData(); + var dictionary = ((JsonObject)SimpleJson.DeserializeObject(result)).GetDictionary(); + foreach (var pair in dictionary) + { + if (pair.Key == "jailbroken") + { + if (pair.Value != null) + { + var stringValue = (pair.Value as string).ToLower(); + device.Add(pair.Key, stringValue == "true"); + } + } + else if (pair.Key == "osBuild") + { + device.RuntimeVersions.AddToPayload(pair.Key, pair.Value); + } + else + { + device.Add(pair.Key, pair.Value); + } + } + } + + public void PopulateDeviceWithState(DeviceWithState device) + { + PopulateDevice(device); + } + + public void PopulateUser(User user) + { + var nativeUser = new NativeUserVisitor(); + + NativeCode.bugsnag_populateUser(ref nativeUser); + + user.Id = Marshal.PtrToStringAuto(nativeUser.Id); + } + + public void SetUser(User user) + { + NativeCode.bugsnag_setUser(user.Id, user.Email, user.Name); + } + + public void SetContext(string context) + { + NativeCode.bugsnag_setContext(NativeConfiguration, context); + } + + public void MarkLaunchCompleted() + { + NativeCode.bugsnag_markLaunchCompleted(); + } + + public void StartSession() + { + NativeCode.bugsnag_startSession(); + } + + public void PauseSession() + { + NativeCode.bugsnag_pauseSession(); + } + + public bool ResumeSession() + { + return NativeCode.bugsnag_resumeSession(); + } + + public void UpdateSession(Session session) + { + if (session != null) + { + var startedAt = Convert.ToInt64((session.StartedAt?.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc))?.TotalSeconds); + NativeCode.bugsnag_registerSession(session.Id.ToString(), startedAt, session.UnhandledCount(), session.HandledCount()); + } + } + + public Session GetCurrentSession() + { + var session = new Session(); + var handle = GCHandle.Alloc(session); + try + { + NativeCode.bugsnag_retrieveCurrentSession(GCHandle.ToIntPtr(handle), PopulateSession); + } + finally + { + handle.Free(); + } + return _nativeSession; + } + + [MonoPInvokeCallback(typeof(NativeCode.SessionInformation))] + static void PopulateSession(IntPtr instance, string sessionId, string startedAt, int handled, int unhandled) + { + var handle = GCHandle.FromIntPtr(instance); + if (handle.Target is Session) + { + if (string.IsNullOrEmpty(sessionId) || sessionId == Guid.Empty.ToString()) + { + _nativeSession = null; + return; + } + var startTime = DateTimeOffset.Parse(startedAt); + _nativeSession = new Session(sessionId, startTime, handled, unhandled); + } + } + + public LastRunInfo GetLastRunInfo() + { + var lastRunInfo = new LastRunInfo(); + var handle = GCHandle.Alloc(lastRunInfo); + try + { + NativeCode.bugsnag_retrieveLastRunInfo(GCHandle.ToIntPtr(handle), PopulateLastRunInfo); + } + finally + { + handle.Free(); + } + return lastRunInfo; + } + + [MonoPInvokeCallback(typeof(Action))] + static void PopulateLastRunInfo(IntPtr instance, bool crashed, bool crashedDuringLaunch, int consecutiveLaunchCrashes) + { + var handle = GCHandle.FromIntPtr(instance); + if (handle.Target is LastRunInfo info) + { + info.Crashed = crashed; + info.CrashedDuringLaunch = crashedDuringLaunch; + info.ConsecutiveLaunchCrashes = consecutiveLaunchCrashes; + } + } + + public void ClearNativeMetadata(string section) + { + NativeCode.bugsnag_clearMetadata(section); + } + + public void ClearNativeMetadata(string section, string key) + { + NativeCode.bugsnag_clearMetadataWithKey(section,key); + } + + public void AddNativeMetadata(string section, IDictionary data) + { + if (data != null) + { + using (var stream = new MemoryStream()) + using (var reader = new StreamReader(stream)) + using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) + { + SimpleJson.SerializeObject(data, writer); + writer.Flush(); + stream.Position = 0; + var jsonString = reader.ReadToEnd(); + NativeCode.bugsnag_setMetadata(section, jsonString); + } + } + else + { + NativeCode.bugsnag_removeMetadata(NativeConfiguration, section); + } + } + + public IDictionary GetNativeMetadata() + { + var result = NativeCode.bugsnag_retrieveMetaData(); + var dictionary = ((JsonObject)SimpleJson.DeserializeObject(result)).GetDictionary(); + return dictionary; + } + + public void AddFeatureFlag(string name, string variant = null) + { + NativeCode.bugsnag_addFeatureFlag(name, variant); + } + + public void AddFeatureFlags(FeatureFlag[] featureFlags) + { + foreach (var flag in featureFlags) + { + AddFeatureFlag(flag.Name, flag.Variant); + } + } + + public void ClearFeatureFlag(string name) + { + NativeCode.bugsnag_clearFeatureFlag(name); + } + + public void ClearFeatureFlags() + { + NativeCode.bugsnag_clearFeatureFlags(); + } + + public bool ShouldAttemptDelivery() + { + return true; + } + + public void RegisterForOnSessionCallbacks() + { + if (_registeredForSessionCallbacks) + { + return; + } + _registeredForSessionCallbacks = true; + NativeCode.bugsnag_registerForSessionCallbacksAfterStart(HandleSessionCallbacks); + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs.meta new file mode 100644 index 000000000..63c22c9d4 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d95dffb7e9f724687baedd16e37878dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs new file mode 100644 index 000000000..53b0fcf89 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs @@ -0,0 +1,339 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +using System; +using System.Runtime.InteropServices; + +namespace BugsnagUnity +{ + [StructLayout(LayoutKind.Sequential)] + struct NativeUserVisitor + { + public IntPtr Id; + public IntPtr Name; + public IntPtr Email; + } + + /// + /// A binary image that has been loaded into the process memory, + /// usually in the form of a dynamic library. + /// + /// + /// This MUST be declared as a struct, not a class. It's supposed to be possible + /// to declare it as a class, but you get all sorts of weird marshalling exceptions + /// if you do. + /// + /// Strings and byte arrays should in theory be directly marshallable, but my experience + /// has taught me that this feature is flaky at best. Better to just declare them as IntPtr + /// and marshal them manually in a wrapper class. + /// + [StructLayout(LayoutKind.Sequential)] + struct NativeLoadedImage + { + public UInt64 LoadAddress; + public UInt64 Size; + public IntPtr FileName; + public IntPtr UuidBytes; + } + + partial class NativeCode + { + /// + /// Get the number of native binary images (dynamic libraries) that are in memory right now. + /// + /// The number of loaded images + [DllImport(Import)] + internal static extern UInt64 bugsnag_getLoadedImageCount(); + + /// + /// Get the current list of native loaded binary images (dynamic libraries). + /// + /// An array of NativeLoadedImage structs that will be updated to contain the image data. + /// The number of entries in images. + /// The number of entries that were filled. + /// + /// Note: Array types MUST be declared as [In, Out] or else you'll get all sorts of weird issues, + /// like arrays being truncated to zero length, or a single entry being duplicated across the + /// entire array. The compiler won't complain, either. + /// + [DllImport(Import)] + internal static extern UInt64 bugsnag_getLoadedImages([In, Out] NativeLoadedImage[] images, UInt64 capacity); + + [DllImport(Import)] + internal static extern void bugsnag_startBugsnagWithConfiguration(IntPtr configuration, string notifierVersion); + + [DllImport(Import)] + internal static extern void bugsnag_setMetadata(string section, string jsonString); + + [DllImport(Import)] + internal static extern void bugsnag_removeMetadata(IntPtr configuration, string tab); + + [DllImport(Import)] + internal static extern string bugsnag_retrieveAppData(); + + [DllImport(Import)] + internal static extern void bugsnag_retrieveLastRunInfo(IntPtr instance, Action populate); + + [DllImport(Import)] + internal static extern string bugsnag_retrieveDeviceData(); + + [DllImport(Import)] + internal static extern void bugsnag_registerForOnSendCallbacks(IntPtr configuration, Func callback); + + [DllImport(Import)] + internal static extern void bugsnag_registerForSessionCallbacks(IntPtr configuration, Func callback); + + [DllImport(Import)] + internal static extern void bugsnag_registerForSessionCallbacksAfterStart(Func callback); + + internal delegate void SessionInformation(IntPtr instance, string sessionId, string startedAt, int handled, int unhandled); + [DllImport(Import)] + internal static extern void bugsnag_retrieveCurrentSession(IntPtr instance, SessionInformation callback); + + [DllImport(Import)] + internal static extern string bugsnag_retrieveMetaData(); + + [DllImport(Import)] + internal static extern void bugsnag_populateUser(ref NativeUserVisitor user); + + [DllImport(Import)] + internal static extern IntPtr bugsnag_createConfiguration(string apiKey); + + [DllImport(Import)] + internal static extern void bugsnag_setReleaseStage(IntPtr configuration, string releaseStage); + + [DllImport(Import)] + internal static extern void bugsnag_addFeatureFlagOnConfig(IntPtr configuration, string name, string variant); + + [DllImport(Import)] + internal static extern void bugsnag_addFeatureFlag(string name, string variant); + + [DllImport(Import)] + internal static extern void bugsnag_clearFeatureFlag(string name); + + [DllImport(Import)] + internal static extern void bugsnag_clearFeatureFlags(); + + [DllImport(Import)] + internal static extern void bugsnag_setAutoNotifyConfig(IntPtr configuration, bool autoNotify); + + [DllImport(Import)] + internal static extern void bugsnag_setAutoTrackSessions(IntPtr configuration, bool autoTrackSessions); + + [DllImport(Import)] + internal static extern void bugsnag_setPersistUser(IntPtr configuration, bool persistUser); + + [DllImport(Import)] + internal static extern void bugsnag_setSendLaunchCrashesSynchronously(IntPtr configuration, bool sendLaunchCrashesSynchronously); + + [DllImport(Import)] + internal static extern void bugsnag_setContext(IntPtr configuration, string context); + + [DllImport(Import)] + internal static extern void bugsnag_setMaxBreadcrumbs(IntPtr configuration, int maxBreadcrumbs); + + [DllImport(Import)] + internal static extern void bugsnag_setMaxStringValueLength(IntPtr configuration, int maxStringValueLength); + + [DllImport(Import)] + internal static extern void bugsnag_setLaunchDurationMillis(IntPtr configuration, ulong launchDurationMillis); + + [DllImport(Import)] + internal static extern void bugsnag_markLaunchCompleted(); + + [DllImport(Import)] + internal static extern void bugsnag_setMaxPersistedEvents(IntPtr configuration, int maxPersistedEvents); + + [DllImport(Import)] + internal static extern void bugsnag_setMaxPersistedSessions(IntPtr configuration, int maxPersistedSessions); + + [DllImport(Import)] + internal static extern void bugsnag_setAppHangThresholdMillis(IntPtr configuration, ulong appHangThresholdMillis); + + [DllImport(Import)] + internal static extern void bugsnag_setEnabledBreadcrumbTypes(IntPtr configuration, string[] types, int count); + + [DllImport(Import)] + internal static extern void bugsnag_setEnabledTelemetryTypes(IntPtr configuration, string[] types, int count); + + [DllImport(Import)] + internal static extern void bugsnag_setEnabledErrorTypes(IntPtr configuration, string[] types, int count); + + [DllImport(Import)] + internal static extern void bugsnag_setDiscardClasses(IntPtr configuration, string[] classNames, int count); + + [DllImport(Import)] + internal static extern void bugsnag_setUserInConfig(IntPtr configuration, string id, string email, string name); + + [DllImport(Import)] + internal static extern void bugsnag_setRedactedKeys(IntPtr configuration, string[] redactedKeys, int count); + + [DllImport(Import)] + internal static extern void bugsnag_setContextConfig(IntPtr configuration, string context); + + [DllImport(Import)] + internal static extern void bugsnag_setAppVersion(IntPtr configuration, string appVersion); + + [DllImport(Import)] + internal static extern void bugsnag_setBundleVersion(IntPtr configuration, string bundleVersion); + + [DllImport(Import)] + internal static extern void bugsnag_setThreadSendPolicy(IntPtr configuration, string threadSendPolicy); + + [DllImport(Import)] + internal static extern void bugsnag_setAppType(IntPtr configuration, string appType); + + [DllImport(Import)] + internal static extern void bugsnag_setEndpoints(IntPtr configuration, string notifyURL, string sessionsURL); + + internal delegate void NotifyReleaseStageCallback(IntPtr instance, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] string[] releaseStages, long count); + + [DllImport(Import)] + internal static extern void bugsnag_setNotifyReleaseStages(IntPtr configuration, string[] releaseStages, int count); + + [DllImport(Import)] + internal static extern void bugsnag_addBreadcrumb(string name, string type, string metadataJson); + + internal delegate void BreadcrumbInformation(IntPtr instance, string name, string timestamp, string type, string metadataJson); + + [DllImport(Import)] + internal static extern void bugsnag_retrieveBreadcrumbs(IntPtr instance, BreadcrumbInformation visitor); + + [DllImport(Import)] + internal static extern void bugsnag_setUser(string id, string email, string name); + + [DllImport(Import)] + internal static extern void bugsnag_startSession(); + + [DllImport(Import)] + internal static extern void bugsnag_pauseSession(); + + [DllImport(Import)] + internal static extern bool bugsnag_resumeSession(); + + [DllImport(Import)] + internal static extern void bugsnag_registerSession(string id, long startedAt, int unhandledCount, int handledCount); + + //Callback Getters and setters + + [DllImport(Import)] + internal static extern IntPtr bugsnag_getAppFromSession(IntPtr session); + + [DllImport(Import)] + internal static extern IntPtr bugsnag_getAppFromEvent(IntPtr @event); + + [DllImport(Import)] + internal static extern IntPtr bugsnag_getDeviceFromSession(IntPtr session); + + [DllImport(Import)] + internal static extern IntPtr bugsnag_getDeviceFromEvent(IntPtr @event); + + [DllImport(Import)] + internal static extern void bugsnag_setStringValue(IntPtr @object, string key, string value); + + [DllImport(Import)] + internal static extern string bugsnag_getValueAsString(IntPtr @object, string key); + + [DllImport(Import)] + internal static extern void bugsnag_setNumberValue(IntPtr @object, string key, string value); + + [DllImport(Import)] + internal static extern void bugsnag_setBoolValue(IntPtr @object, string key, string value); + + [DllImport(Import)] + internal static extern string bugsnag_getRuntimeVersionsFromDevice(IntPtr nativeDevice); + + [DllImport(Import)] + internal static extern string bugsnag_getErrorTypeFromError(IntPtr nativeError); + + [DllImport(Import)] + internal static extern string bugsnag_getThreadTypeFromThread(IntPtr nativeThread); + + [DllImport(Import)] + internal static extern void bugsnag_setRuntimeVersionsFromDevice(IntPtr nativeDevice, string[] versions, int count); + + [DllImport(Import)] + internal static extern double bugsnag_getTimestampFromDateInObject(IntPtr @object, string key); + + [DllImport(Import)] + internal static extern void bugsnag_setTimestampFromDateInObject(IntPtr @object, string key, double timeStamp); + + [DllImport(Import)] + internal static extern string bugsnag_getBreadcrumbType(IntPtr nativeBreadcrumb); + + [DllImport(Import)] + internal static extern void bugsnag_setBreadcrumbType(IntPtr nativeBreadcrumb, string type); + + [DllImport(Import)] + internal static extern void bugsnag_setBreadcrumbMetadata(IntPtr nativeBreadcrumb, string jsonString); + + [DllImport(Import)] + internal static extern string bugsnag_getBreadcrumbMetadata(IntPtr nativeBreadcrumb); + + internal delegate void EventBreadcrumbs(IntPtr breadcrumbList,[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] breadcrumbs, int breadcrumbsSize); + [DllImport(Import)] + internal static extern void bugsnag_getBreadcrumbsFromEvent(IntPtr @event, IntPtr breadcrumbList, EventBreadcrumbs visitor); + + internal delegate void EventErrors(IntPtr errorList, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] errors, int errorsSize); + [DllImport(Import)] + internal static extern void bugsnag_getErrorsFromEvent(IntPtr @event, IntPtr errorList, EventErrors visitor); + + internal delegate void ErrorStackframes(IntPtr stackframeList, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] stackframes, int stackframesSize); + [DllImport(Import)] + internal static extern void bugsnag_getStackframesFromError(IntPtr error, IntPtr stackframeList, ErrorStackframes visitor); + + [DllImport(Import)] + internal static extern void bugsnag_getStackframesFromThread(IntPtr error, IntPtr stackframeList, ErrorStackframes visitor); + + [DllImport(Import)] + internal static extern string bugsnag_getSeverityFromEvent(IntPtr nativeEvent); + + [DllImport(Import)] + internal static extern void bugsnag_setEventSeverity(IntPtr nativeEvent, string severity); + + internal delegate void EventThreads(IntPtr threadsList, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] nativeThreads, int nativeThreadsSize); + [DllImport(Import)] + internal static extern void bugsnag_getThreadsFromEvent(IntPtr @event, IntPtr threadsList, EventThreads visitor); + + [DllImport(Import)] + internal static extern IntPtr bugsnag_getUserFromEvent(IntPtr @event); + + [DllImport(Import)] + internal static extern IntPtr bugsnag_setUserFromEvent(IntPtr @event, string userId, string userEmail, string userName); + + [DllImport(Import)] + internal static extern IntPtr bugsnag_getUserFromSession(IntPtr session); + + [DllImport(Import)] + internal static extern IntPtr bugsnag_setUserFromSession(IntPtr session, string userId, string userEmail, string userName); + + [DllImport(Import)] + internal static extern void bugsnag_setEventMetadata(IntPtr @event, string tab, string metadataJson); + + [DllImport(Import)] + internal static extern void bugsnag_clearEventMetadataSection(IntPtr @event, string section); + + [DllImport(Import)] + internal static extern void bugsnag_clearEventMetadataWithKey(IntPtr @event, string section, string key); + + [DllImport(Import)] + internal static extern string bugsnag_getEventMetaData(IntPtr @event, string section); + + [DllImport(Import)] + internal static extern void bugsnag_clearMetadata(string section); + + [DllImport(Import)] + internal static extern void bugsnag_clearMetadataWithKey(string section, string key); + + [DllImport(Import)] + internal static extern void bugsnag_addFeatureFlagOnEvent(IntPtr @event, string name, string variant); + + [DllImport(Import)] + internal static extern void bugsnag_clearFeatureFlagOnEvent(IntPtr @event, string name); + + [DllImport(Import)] + internal static extern void bugsnag_clearFeatureFlagsOnEvent(IntPtr @event); + + [DllImport(Import)] + internal static extern string bugsnag_getFeatureFlagsFromEvent(IntPtr @event); + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs.meta new file mode 100644 index 000000000..927d03cfd --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d3d6d07d864c846e691c2f0cf17761e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs new file mode 100644 index 000000000..bc103f01a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs @@ -0,0 +1,82 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace BugsnagUnity +{ + public class NativeDevice : IDevice + { + + private const string ID_KEY = "id"; + private const string JAIL_BROKEN_KEY = "jailbroken"; + private const string LOCALE_KEY = "locale"; + private const string MANUFACTURER_KEY = "manufacturer"; + private const string MODEL_KEY = "model"; + private const string OS_NAME_KEY = "osName"; + private const string OS_VERSION_KEY = "osVersion"; + private const string MODEL_NUMBER_KEY = "modelNumber"; + private const string TOTAL_MEMORY_KEY = "totalMemory"; + + internal NativePayloadClassWrapper NativeWrapper; + + public NativeDevice(IntPtr nativeDevice) + { + NativeWrapper = new NativePayloadClassWrapper(nativeDevice); + } + + public string BrowserName { get; set; } + public string BrowserVersion { get; set; } + public string[] CpuAbi { get; set; } + public long? TotalMemory {get => NativeWrapper.GetNativeLong(TOTAL_MEMORY_KEY); set => NativeWrapper.SetNativeLong(TOTAL_MEMORY_KEY, value); } + public string UserAgent { get; set; } + public string ModelNumber { get => NativeWrapper.GetNativeString(MODEL_NUMBER_KEY); set => NativeWrapper.SetNativeString(MODEL_NUMBER_KEY,value); } + public string Id { get => NativeWrapper.GetNativeString(ID_KEY); set => NativeWrapper.SetNativeString(ID_KEY,value); } + + public bool? Jailbroken { get => NativeWrapper.GetNativeBool(JAIL_BROKEN_KEY); set => NativeWrapper.SetNativeBool(JAIL_BROKEN_KEY, value); } + + public string Locale { get => NativeWrapper.GetNativeString(LOCALE_KEY); set => NativeWrapper.SetNativeString(LOCALE_KEY, value); } + + public string Manufacturer { get => NativeWrapper.GetNativeString(MANUFACTURER_KEY); set => NativeWrapper.SetNativeString(MANUFACTURER_KEY, value); } + + public string Model { get => NativeWrapper.GetNativeString(MODEL_KEY); set => NativeWrapper.SetNativeString(MODEL_KEY, value); } + + public string OsName { get => NativeWrapper.GetNativeString(OS_NAME_KEY); set => NativeWrapper.SetNativeString(OS_NAME_KEY, value); } + + public string OsVersion { get => NativeWrapper.GetNativeString(OS_VERSION_KEY); set => NativeWrapper.SetNativeString(OS_VERSION_KEY, value); } + + public IDictionary RuntimeVersions { get => GetRuntimeVersions(); set => SetRuntimeVersions(value); } + + + private IDictionary GetRuntimeVersions() + { + var versionsString = NativeCode.bugsnag_getRuntimeVersionsFromDevice(NativeWrapper.NativePointer); + var split = versionsString.Split('|').ToList(); + split.RemoveAt(split.Count - 1); + foreach (var str in split) + { + str.Replace("|",string.Empty); + } + var returnDict = new Dictionary(); + for (int i = 0; i < split.Count; i+=2) + { + returnDict.Add(split[i], split[i + 1]); + } + return returnDict; + } + + private void SetRuntimeVersions(IDictionary versions) + { + var stringVersions = new List(); + foreach (var item in versions) + { + stringVersions.Add(item.Key); + stringVersions.Add(item.Value.ToString()); + } + NativeCode.bugsnag_setRuntimeVersionsFromDevice(NativeWrapper.NativePointer, stringVersions.ToArray(), stringVersions.Count); + } + + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs.meta new file mode 100644 index 000000000..cb32ba2f8 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 56545493621014658bca3684e74708ab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs new file mode 100644 index 000000000..8f5e5e18a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs @@ -0,0 +1,30 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public class NativeDeviceWithState : NativeDevice, IDeviceWithState + { + + private const string FREE_DISK_KEY = "freeDisk"; + private const string FREE_MEMORY_KEY = "freeMemory"; + private const string ORIENTATION_KEY = "orientation"; + private const string TIME_KEY = "time"; + + + public NativeDeviceWithState(IntPtr nativeDevice) : base(nativeDevice) + { + } + + public long? FreeDisk { get => NativeWrapper.GetNativeLong(FREE_DISK_KEY); set => NativeWrapper.SetNativeLong(FREE_DISK_KEY, value); } + + public long? FreeMemory { get => NativeWrapper.GetNativeLong(FREE_MEMORY_KEY); set => NativeWrapper.SetNativeLong(FREE_MEMORY_KEY, value); } + + public string Orientation { get => NativeWrapper.GetNativeString(ORIENTATION_KEY); set => NativeWrapper.SetNativeString(ORIENTATION_KEY,value); } + + public DateTimeOffset? Time { get => DateTimeOffset.Parse(NativeWrapper.GetNativeString(TIME_KEY)); set => NativeWrapper.SetNativeString(TIME_KEY, value?.ToString("o")); } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs.meta new file mode 100644 index 000000000..409b71665 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 58a4a6deca75d4596b463300c45095ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs new file mode 100644 index 000000000..002c07f60 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs @@ -0,0 +1,46 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using AOT; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public class NativeError : NativePayloadClassWrapper, IError + { + private const string ERROR_CLASS_KEY = "errorClass"; + private const string ERROR_MESSAGE_KEY = "errorMessage"; + + public NativeError(IntPtr nativeError) : base (nativeError) + { + var stacktraceHandle = GCHandle.Alloc(_stacktrace); + NativeCode.bugsnag_getStackframesFromError(nativeError, GCHandle.ToIntPtr(stacktraceHandle), GetStacktrace); + } + + public string ErrorClass { get => GetNativeString(ERROR_CLASS_KEY); set => SetNativeString(ERROR_CLASS_KEY,value); } + public string ErrorMessage { get => GetNativeString(ERROR_MESSAGE_KEY); set => SetNativeString(ERROR_MESSAGE_KEY, value); } + + public string Type { get => NativeCode.bugsnag_getErrorTypeFromError(NativePointer); } + + private List _stacktrace = new List(); + + public List Stacktrace => _stacktrace; + + [MonoPInvokeCallback(typeof(NativeCode.ErrorStackframes))] + private static void GetStacktrace(IntPtr instance, IntPtr[] stackframePointers, int count) + { + var handle = GCHandle.FromIntPtr(instance); + if (handle.Target is List stacktrace) + { + foreach (var pointer in stackframePointers) + { + stacktrace.Add(new NativeStackFrame(pointer)); + } + } + } + + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs.meta new file mode 100644 index 000000000..d04ac4dd4 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1911f21508d3542709ba29afa3127b4f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs new file mode 100644 index 000000000..d944ab447 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs @@ -0,0 +1,228 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using AOT; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public class NativeEvent : NativePayloadClassWrapper, IEvent + { + + private const string CONTEXT_KEY = "context"; + private const string API_KEY_KEY = "apiKey"; + private const string GROUPING_HASH_KEY = "groupingHash"; + private const string UNHANDLED_KEY = "unhandled"; + + public string Context { get => GetNativeString(CONTEXT_KEY); set => SetNativeString(CONTEXT_KEY, value); } + + public IAppWithState App { get; set; } + + public IDeviceWithState Device { get; set; } + + public string ApiKey { get => GetNativeString(API_KEY_KEY); set => SetNativeString(API_KEY_KEY, value); } + + public string GroupingHash { get => GetNativeString(GROUPING_HASH_KEY); set => SetNativeString(GROUPING_HASH_KEY, value); } + + public bool Unhandled { + get { + var nativeBool = GetNativeBool(UNHANDLED_KEY); + return nativeBool.HasValue ? nativeBool.Value : false; + } + set => SetNativeBool(UNHANDLED_KEY, value); + } + + private List _breadcrumbs = new List(); + + public ReadOnlyCollection Breadcrumbs => new ReadOnlyCollection(_breadcrumbs); + + private List _errors = new List(); + + public List Errors => _errors; + + public Severity Severity { get => GetSeverityFromEvent(); set => NativeCode.bugsnag_setEventSeverity(NativePointer, value.ToString().ToLowerInvariant()); } + + private List _threads = new List(); + + public List Threads => _threads; + + private IUser _user; + + public NativeEvent(IntPtr nativeEvent) : base(nativeEvent) + { + App = new NativeAppWithState(NativeCode.bugsnag_getAppFromEvent(nativeEvent)); + Device = new NativeDeviceWithState(NativeCode.bugsnag_getDeviceFromEvent(nativeEvent)); + + var breadcrumbHandle = GCHandle.Alloc(_breadcrumbs); + NativeCode.bugsnag_getBreadcrumbsFromEvent(nativeEvent, GCHandle.ToIntPtr(breadcrumbHandle), GetBreadcrumbs); + + var errorsHandle = GCHandle.Alloc(_errors); + NativeCode.bugsnag_getErrorsFromEvent(nativeEvent, GCHandle.ToIntPtr(errorsHandle), GetErrors); + + var threadsHandle = GCHandle.Alloc(_threads); + NativeCode.bugsnag_getThreadsFromEvent(nativeEvent, GCHandle.ToIntPtr(threadsHandle), GetThreads); + + _user = new NativeUser(NativeCode.bugsnag_getUserFromEvent(nativeEvent)); + } + + private Severity GetSeverityFromEvent() + { + var stringValue = NativeCode.bugsnag_getSeverityFromEvent(NativePointer); + if (stringValue == "error") + { + return Severity.Error; + } + if (stringValue == "warning") + { + return Severity.Warning; + } + return Severity.Info; + } + + [MonoPInvokeCallback(typeof(NativeCode.EventBreadcrumbs))] + private static void GetBreadcrumbs(IntPtr instance, IntPtr[] breadcrumbPointers, int count) + { + var handle = GCHandle.FromIntPtr(instance); + if (handle.Target is List breadcrumbs) + { + foreach (var pointer in breadcrumbPointers) + { + breadcrumbs.Add(new NativeBreadcrumb(pointer)); + } + } + } + + [MonoPInvokeCallback(typeof(NativeCode.EventErrors))] + private static void GetErrors(IntPtr instance, IntPtr[] errorPointers, int count) + { + var handle = GCHandle.FromIntPtr(instance); + if (handle.Target is List errors) + { + foreach (var pointer in errorPointers) + { + errors.Add(new NativeError(pointer)); + } + } + + } + + [MonoPInvokeCallback(typeof(NativeCode.EventThreads))] + private static void GetThreads(IntPtr instance, IntPtr[] threadPointers, int count) + { + var handle = GCHandle.FromIntPtr(instance); + if (handle.Target is List threads) + { + foreach (var pointer in threadPointers) + { + threads.Add(new NativeThread(pointer)); + } + } + } + + public IUser GetUser() + { + return _user; + } + + public void SetUser(string id, string email, string name) + { + NativeCode.bugsnag_setUserFromEvent(NativePointer, id, email, name); + } + + public void AddMetadata(string section, string key, object value) + { + var metadataSection = new Dictionary() { + { key, value } + }; + AddMetadata(section, metadataSection); + } + + public void AddMetadata(string section, IDictionary metadata) + { + + if (metadata != null) + { + using (var stream = new MemoryStream()) + using (var reader = new StreamReader(stream)) + using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) + { + SimpleJson.SerializeObject(metadata, writer); + writer.Flush(); + stream.Position = 0; + var jsonString = reader.ReadToEnd(); + NativeCode.bugsnag_setEventMetadata(NativePointer, section, jsonString); + } + } + else + { + NativeCode.bugsnag_clearEventMetadataSection(NativePointer, section); + } + } + + public void ClearMetadata(string section) => NativeCode.bugsnag_clearEventMetadataSection(NativePointer, section); + + public void ClearMetadata(string section, string key) => NativeCode.bugsnag_clearEventMetadataWithKey(NativePointer, section, key); + + public object GetMetadata(string section, string key) + { + var metadata = GetMetadata(section); + foreach (var item in metadata) + { + if (item.Key == key) + { + return item.Value; + } + } + return null; + } + + public IDictionary GetMetadata(string section) + { + var result = NativeCode.bugsnag_getEventMetaData(NativePointer, section); + var dictionary = ((JsonObject)SimpleJson.DeserializeObject(result)).GetDictionary(); + return dictionary; + } + + public void AddFeatureFlag(string name, string variant = null) + { + NativeCode.bugsnag_addFeatureFlagOnEvent(NativePointer, name, variant); + } + + public void AddFeatureFlags(FeatureFlag[] featureFlags) + { + foreach (var flag in featureFlags) + { + AddFeatureFlag(flag.Name, flag.Variant); + } + } + + public void ClearFeatureFlag(string name) + { + NativeCode.bugsnag_clearFeatureFlagOnEvent(NativePointer, name); + } + + public void ClearFeatureFlags() + { + NativeCode.bugsnag_clearFeatureFlagsOnEvent(NativePointer); + } + + public ReadOnlyCollection FeatureFlags + { + get + { + var jsonString = NativeCode.bugsnag_getFeatureFlagsFromEvent(NativePointer); + var jsonArray = (JsonArray)SimpleJson.DeserializeObject(jsonString); + var objects = jsonArray.Select((item) + => new FeatureFlag(((JsonObject)item).GetDictionary())); + return new ReadOnlyCollection(objects.ToList()); + } + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs.meta new file mode 100644 index 000000000..95751e12a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2b60e9dc184d14782a443cb1a918f1a0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs new file mode 100644 index 000000000..bbe66af31 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs @@ -0,0 +1,121 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +using System; +using System.Collections; +using System.Runtime.InteropServices; + +namespace BugsnagUnity +{ + /// + /// Wraps a NativeLoadedImage to provide automatic and lazy marshaling from the native side. + /// + /// + /// We generally don't need the name and UUID except in specific cases, so we unmarshal + /// them lazily. + /// + class LoadedImage + { + public UInt64 LoadAddress + { + get => Image.LoadAddress; + } + public UInt64 Size + { + get => Image.Size; + } + public string FileName + { + get + { + if (CachedFileName == null) + { + CachedFileName = Marshal.PtrToStringAnsi(Image.FileName); + } + return CachedFileName; + } + } + public string Uuid + { + get + { + if (CachedUuid == null) + { + var uuid = new byte[16]; + Marshal.Copy(Image.UuidBytes, uuid, 0, 16); + CachedUuid = new Guid(uuid).ToString(); + } + return CachedUuid; + } + } + + public LoadedImage(NativeLoadedImage image) + { + Image = image; + } + + private NativeLoadedImage Image; + private string CachedFileName; + private string CachedUuid; + } + + class LoadedImages + { + /// + /// Refresh the list of loaded images to match what the native side currently says. + /// + /// + /// Note: You MUST call this at least once before using an instance of this class! + /// + public void Refresh() + { + // Ask for the current count * 2 in case new images get added between calls + var nativeImages = new NativeLoadedImage[NativeCode.bugsnag_getLoadedImageCount() * 2]; + var count = NativeCode.bugsnag_getLoadedImages(nativeImages, (UInt64)nativeImages.LongLength); + var images = new LoadedImage[count]; + for (UInt64 i = 0; i < count; i++) + { + images[i] = new LoadedImage(nativeImages[i]); + } + Images = images; + } + + /// + /// Find the native loaded image that corresponds to a native instruction address + /// supplied by il2cpp_native_stack_trace(). + /// + /// The address to find the corresponding image of + /// The corresponding image, or null + public LoadedImage FindImageAtAddress(UInt64 address) + { + int idx = Array.BinarySearch(Images, address, new AddressToImageComparator()); + if (idx < 0) + { + return null; + } + return Images[idx]; + } + + /// + /// The currently loaded images, as of the last call to Refresh(). + /// + public LoadedImage[] Images; + + private class AddressToImageComparator : IComparer + { + int IComparer.Compare(Object x, Object y) + { + LoadedImage image = (LoadedImage)x; + UInt64 address = (UInt64)y; + if (address < image.LoadAddress) + { + return 1; + } + if (address > image.LoadAddress + image.Size) + { + return -1; + } + return 0; + } + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs.meta new file mode 100644 index 000000000..2375bed37 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1da73d2c4d96846a191f28f516a5ef86 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs new file mode 100644 index 000000000..68498f61e --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs @@ -0,0 +1,111 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +using System; +namespace BugsnagUnity +{ + public class NativePayloadClassWrapper + { + internal IntPtr NativePointer; + + public NativePayloadClassWrapper(IntPtr nativePointer) + { + NativePointer = nativePointer; + } + + internal string GetNativeString(string key) + { + return NativeCode.bugsnag_getValueAsString(NativePointer, key); + } + + internal void SetNativeString(string key, string value) + { + if (value == null) + { + value = string.Empty; + } + NativeCode.bugsnag_setStringValue(NativePointer, key, value); + } + + internal bool? GetNativeBool(string key) + { + var result = NativeCode.bugsnag_getValueAsString(NativePointer, key).ToLower(); + if (result == null) + { + return null; + } + return result == "1" || result == "true"; + } + + internal void SetNativeBool(string name, bool? value) + { + var stringValue = value == null ? "null" : value.ToString(); + NativeCode.bugsnag_setBoolValue(NativePointer, name, stringValue); + } + + internal double? GetNativeDouble(string key) + { + var value = NativeCode.bugsnag_getValueAsString(NativePointer, key); + + if (value == null) + { + return null; + } + else + { + return double.Parse(value); + } + } + + internal void SetNativeDouble(string key, double? value) + { + NativeCode.bugsnag_setNumberValue(NativePointer,key,value == null ? "null" : value.ToString()); + } + + internal long? GetNativeLong(string key) + { + var value = NativeCode.bugsnag_getValueAsString(NativePointer, key); + + if (value == null) + { + return null; + } + else + { + return long.Parse(value); + } + } + + internal void SetNativeLong(string key, long? value) + { + NativeCode.bugsnag_setNumberValue(NativePointer, key, value == null ? "null" : value.ToString()); + } + + internal DateTimeOffset? GetNativeDate(string key) + { + var timeStamp = NativeCode.bugsnag_getTimestampFromDateInObject(NativePointer, key); + if (timeStamp < 0) + { + return null; + } + else + { + DateTimeOffset dateTime = new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero); + dateTime = dateTime.AddSeconds(timeStamp); + return dateTime; + } + } + + internal void SetNativeDate(DateTimeOffset? startedAt,string key) + { + if (startedAt == null) + { + NativeCode.bugsnag_setTimestampFromDateInObject(NativePointer, key, -1); + } + else + { + var dateTime = startedAt.Value - new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero); + NativeCode.bugsnag_setTimestampFromDateInObject(NativePointer, key, dateTime.TotalSeconds); + } + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs.meta new file mode 100644 index 000000000..154546583 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6648761212aa44a54a12b332f8b96995 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs new file mode 100644 index 000000000..0df946b4d --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs @@ -0,0 +1,43 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +using System.Runtime.InteropServices; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + internal class NativeSession : NativePayloadClassWrapper, ISession + { + + private const string ID_KEY = "id"; + private const string STARTED_AT_KEY = "startedAt"; + + public NativeSession(IntPtr nativeSession) : base(nativeSession) + { + App = new NativeApp(NativeCode.bugsnag_getAppFromSession(nativeSession)); + Device = new NativeDevice(NativeCode.bugsnag_getDeviceFromSession(nativeSession)); + _nativeUser = new NativeUser(NativeCode.bugsnag_getUserFromSession(nativeSession)); + } + + public string Id { + get => GetNativeString(ID_KEY); + set => SetNativeString(ID_KEY, value); + } + + public IApp App { get; set; } + + public IDevice Device { get; set; } + + public DateTimeOffset? StartedAt { get => GetNativeDate(STARTED_AT_KEY); set => SetNativeDate(value, STARTED_AT_KEY); } + + private NativeUser _nativeUser; + + public IUser GetUser() => _nativeUser; + + public void SetUser(string id, string email, string name) + { + NativeCode.bugsnag_setUserFromSession(NativePointer, id, email, name); + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs.meta new file mode 100644 index 000000000..a2bf73029 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5a4ff891cb02b4839a5e803dadaa5fc6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs new file mode 100644 index 000000000..85fc6f35a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs @@ -0,0 +1,51 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public class NativeStackFrame : NativePayloadClassWrapper, IStackframe + { + + private const string FRAME_ADDRESS_KEY = "frameAddress"; + private const string IS_LR_KEY = "isLr"; + private const string IS_PC_KEY = "isPc"; + private const string MACHO_FILE_KEY = "machoFile"; + private const string MACHO_LOAD_ADDRESS = "machoLoadAddress"; + private const string MACHO_UUID_KEY = "machoUuid"; + private const string MACHO_VM_ADDRESS = "machoVmAddress"; + private const string METHOD_KEY = "method"; + private const string SYMBOL_ADDRESS_KEY = "symbolAddress"; + + public NativeStackFrame(IntPtr nativeFrame) : base (nativeFrame) + { + } + + public string FrameAddress { get => GetNativeString(FRAME_ADDRESS_KEY); set => SetNativeString(FRAME_ADDRESS_KEY,value); } + + public bool? IsLr { get => GetNativeBool(IS_LR_KEY); set => SetNativeBool(IS_LR_KEY, value); } + + public bool? IsPc { get => GetNativeBool(IS_PC_KEY); set => SetNativeBool(IS_PC_KEY, value); } + + public string MachoFile { get => GetNativeString(MACHO_FILE_KEY); set => SetNativeString(MACHO_FILE_KEY, value); } + + public string MachoLoadAddress { get => GetNativeString(MACHO_LOAD_ADDRESS); set => SetNativeString(MACHO_LOAD_ADDRESS, value); } + + public string MachoUuid { get => GetNativeString(MACHO_UUID_KEY); set => SetNativeString(MACHO_UUID_KEY, value); } + + public string MachoVmAddress { get => GetNativeString(MACHO_VM_ADDRESS); set => SetNativeString(MACHO_VM_ADDRESS, value); } + + public string Method { get => GetNativeString(METHOD_KEY); set => SetNativeString(METHOD_KEY, value); } + + public string SymbolAddress { get => GetNativeString(SYMBOL_ADDRESS_KEY); set => SetNativeString(SYMBOL_ADDRESS_KEY, value); } + + public string File { get; set; } + + public bool? InProject { get; set; } + + public int? LineNumber { get; set; } + + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs.meta new file mode 100644 index 000000000..d731fb4f6 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 48a2743db403a41d6bb6ca9bae59ce0f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs new file mode 100644 index 000000000..ff17fb5d5 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs @@ -0,0 +1,50 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using AOT; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public class NativeThread : NativePayloadClassWrapper , IThread + { + + private const string ID_KEY = "id"; + private const string ERROR_REPORTING_THREAD_KEY = "errorReportingThread"; + private const string NAME_KEY = "name"; + + public NativeThread(IntPtr nativePointer) : base(nativePointer) + { + var stacktraceHandle = GCHandle.Alloc(_stacktrace); + NativeCode.bugsnag_getStackframesFromThread(nativePointer, GCHandle.ToIntPtr(stacktraceHandle), GetStacktrace); + } + + public string Type { get => NativeCode.bugsnag_getThreadTypeFromThread(NativePointer); } + + public string Id { get => GetNativeString(ID_KEY); set => SetNativeString(ID_KEY, value); } + + public bool? ErrorReportingThread => GetNativeBool(ERROR_REPORTING_THREAD_KEY); + + public string Name { get => GetNativeString(NAME_KEY); set => SetNativeString(NAME_KEY, value); } + + private List _stacktrace = new List(); + + public List Stacktrace => _stacktrace; + + [MonoPInvokeCallback(typeof(NativeCode.ErrorStackframes))] + private static void GetStacktrace(IntPtr instance, IntPtr[] stackframePointers, int count) + { + var handle = GCHandle.FromIntPtr(instance); + if (handle.Target is List stacktrace) + { + foreach (var pointer in stackframePointers) + { + stacktrace.Add(new NativeStackFrame(pointer)); + } + } + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs.meta new file mode 100644 index 000000000..9e43e517f --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1bb1a0fb00ee846098dee7d1f820dbf5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs new file mode 100644 index 000000000..8648b7abd --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs @@ -0,0 +1,23 @@ +#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR + +using System; +namespace BugsnagUnity +{ + public class NativeUser : NativePayloadClassWrapper, IUser + { + + private const string ID_KEY = "id"; + private const string NAME_KEY = "name"; + private const string EMAIL_KEY = "name"; + + + public NativeUser(IntPtr nativeUser) : base (nativeUser) + { + } + + public string Id => GetNativeString(ID_KEY); + public string Name => GetNativeString(NAME_KEY); + public string Email => GetNativeString(EMAIL_KEY); + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs.meta new file mode 100644 index 000000000..ef8d1d1ca --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1b9b4397f50834e789b943b20117240d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback.meta new file mode 100644 index 000000000..5f8928146 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7046155ab9e6d43b9ae08d59e6ccac4e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs new file mode 100644 index 000000000..dc95ecead --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs @@ -0,0 +1,67 @@ +#if UNITY_EDITOR || UNITY_STANDALONE_WIN +using System.Collections.Generic; +using System.Linq; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + class Breadcrumbs : IBreadcrumbs + { + readonly object _lock = new object(); + Configuration Configuration { get; } + LinkedList _breadcrumbs; + + /// + /// Constructs a collection of breadcrumbs + /// + /// + internal Breadcrumbs(Configuration configuration) + { + Configuration = configuration; + _breadcrumbs = new LinkedList(); + } + + /// + /// Add a breadcrumb to the collection with the specified type and metadata + /// + public void Leave(string message, Dictionary metadata,BreadcrumbType type ) + { + Leave(new Breadcrumb(message, metadata, type)); + } + + public void Leave(Breadcrumb breadcrumb) + { + if (Configuration.MaximumBreadcrumbs == 0 || breadcrumb == null || string.IsNullOrEmpty(breadcrumb.Message)) + { + return; + } + // Clone the metadata to prevent thread related exceptions + breadcrumb.Metadata = breadcrumb.Metadata.ToDictionary(entry => entry.Key, entry => entry.Value); + lock (_lock) + { + + if (_breadcrumbs.Count >= Configuration.MaximumBreadcrumbs) + { + _breadcrumbs.RemoveFirst(); + } + + _breadcrumbs.AddLast(breadcrumb); + } + } + + /// + /// Retrieve the collection of breadcrumbs at this point in time. + /// + /// + public List Retrieve() + { + lock (_lock) + { + return _breadcrumbs.ToList(); + } + } + + + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs.meta new file mode 100644 index 000000000..a0a8538b5 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 441e01541b4a94f149d63cf7325a1e1b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs new file mode 100644 index 000000000..ee44eb663 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs @@ -0,0 +1,298 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class CacheManager : ICacheManager + { + + private static Configuration _configuration; + + private static string _cacheDirectory + { + get { return Application.persistentDataPath + "/Bugsnag"; } + } + + private static string _sessionsDirectory + { + get { return _cacheDirectory + "/Sessions"; } + } + + private static string _eventsDirectory + { + get { return _cacheDirectory + "/Events"; } + } + + private static string _deviceIdFile = _cacheDirectory + "/deviceId.txt"; + + private const string SESSION_FILE_SUFFIX = ".session"; + + private const string EVENT_FILE_SUFFIX = ".event"; + + private const int MAX_CACHED_DAYS = 60; + + + + public CacheManager(Configuration configuration) + { + _configuration = configuration; + CheckForDirectoryCreation(); + RemoveExpiredPayloads(); + } + + private string[] GetCachedEventFiles() + { + return GetFilesBySuffix(_eventsDirectory, EVENT_FILE_SUFFIX); + } + + private string[] GetCachedSessionFiles() + { + + return GetFilesBySuffix(_sessionsDirectory,SESSION_FILE_SUFFIX); + } + + private string[] GetFilesBySuffix(string path, string suffix) + { + try + { + var files = Directory.GetFiles(path, "*" + suffix); + return files; + } + catch + { + return new string[] { }; + } + } + + public string GetCachedDeviceId() + { + + if (!_configuration.GenerateAnonymousId) + { + return string.Empty; + } + try + { + if (File.Exists(_deviceIdFile)) + { + // return existing cached device id + return File.ReadAllText(_deviceIdFile); + } + + // create and cache new random device id + var newDeviceId = Guid.NewGuid().ToString(); + SaveDeviceIdToCache(newDeviceId); + return newDeviceId; + } + catch + { + // not possible in unit tests + return string.Empty; + } + + } + + public void SaveDeviceIdToCache(string deviceId) + { + WriteFile(_deviceIdFile, deviceId); + } + + private void RemoveExpiredPayloads() + { + var files = GetCachedEventFiles().ToList(); + files.AddRange(GetCachedSessionFiles()); + foreach (var file in files) + { + try + { + var creationTime = File.GetCreationTimeUtc(file); + if ((DateTime.UtcNow - creationTime).TotalDays > MAX_CACHED_DAYS) + { + Debug.LogWarning("Bugsnag Warning: Discarding historical event from " + creationTime.ToLongDateString() + " after failed delivery"); + File.Delete(file); + } + } + catch { } + } + } + + public void SaveSessionToCache(string id,string json) + { + var path = _sessionsDirectory + "/" + id + SESSION_FILE_SUFFIX; + WritePayloadToDisk(json, path); + CheckForMaxCachedPayloads(GetCachedSessionFiles(), _configuration.MaxPersistedSessions); + } + + public void SaveEventToCache(string id, string json) + { + var path = _eventsDirectory + "/" + id + EVENT_FILE_SUFFIX; + WritePayloadToDisk(json, path); + CheckForMaxCachedPayloads(GetCachedEventFiles(), _configuration.MaxPersistedEvents); + } + + private void WritePayloadToDisk(string jsonData, string path) + { + WriteFile(path, jsonData); + } + + private void CheckForMaxCachedPayloads(string[] payloads, int maxPayloads) + { + if (payloads.Length > maxPayloads) + { + RemoveOldestFiles(payloads, payloads.Length - maxPayloads); + } + } + + private void RemoveOldestFiles(string[] filePaths, int numToRemove) + { + var ordered = filePaths.OrderBy(file => File.GetCreationTimeUtc(file)).ToArray(); + foreach (var file in ordered.Take(numToRemove)) + { + DeleteFile(file); + } + } + + public void RemoveCachedEvent(string id) + { + RemovePayloadWithID(GetCachedEventFiles(), id); + } + + public void RemoveCachedSession(string id) + { + RemovePayloadWithID(GetCachedSessionFiles(), id); + } + + private void RemovePayloadWithID(string[] files, string id) + { + foreach (var path in files) + { + if (path.Contains(id)) + { + DeleteFile(path); + return; + } + } + } + + private void DeleteFile(string path) + { + try + { + File.Delete(path); + }catch{} + } + + private void WriteFile(string path, string data) + { + // not using File.WriteAllText to avoid under the hood buffering. We want the file to be written immediately to avoid truncation in case of a crash + try + { + var file = File.Create(path); + file.Write(System.Text.Encoding.UTF8.GetBytes(data), 0, data.Length); + file.Flush(); + file.Close(); + }catch { } + } + + private string GetJsonFromCachePath(string path) + { + try { + if (File.Exists(path)) + { + return File.ReadAllText(path); + } + } catch { } + return null; + } + + private static void CheckForDirectoryCreation() + { + try + { + if (!Directory.Exists(_cacheDirectory)) + { + Directory.CreateDirectory(_cacheDirectory); + } + if (!Directory.Exists(_sessionsDirectory)) + { + Directory.CreateDirectory(_sessionsDirectory); + } + if (!Directory.Exists(_eventsDirectory)) + { + Directory.CreateDirectory(_eventsDirectory); + } + } + catch + { + //not possible in unit tests + } + + } + + public List GetCachedEventIds() + { + return GetPayloadIDsFromDirectory(GetCachedEventFiles()); + } + + public List GetCachedSessionIds() + { + return GetPayloadIDsFromDirectory(GetCachedSessionFiles()); + } + + private List GetPayloadIDsFromDirectory(string[] files) + { + var names = new List(); + var ordered = GetCreationOrderedFiles(files); + foreach (var path in ordered) + { + try + { + names.Add(Path.GetFileNameWithoutExtension(path)); + } + catch { } + } + return names; + } + + private string[] GetCreationOrderedFiles(string[] files) + { + try + { + var orderedFiles = files.OrderBy(file => File.GetCreationTimeUtc(file)).ToArray(); + return orderedFiles; + } + catch + { + return new string[] { }; + } + } + + public string GetCachedEvent(string id) + { + foreach (var path in GetCachedEventFiles()) + { + if (path.Contains(id)) + { + return GetJsonFromCachePath(path); + } + } + return null; + } + + public string GetCachedSession(string id) + { + foreach (var path in GetCachedSessionFiles()) + { + if (path.Contains(id)) + { + return GetJsonFromCachePath(path); + } + } + return null; + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs.meta new file mode 100644 index 000000000..7e477c824 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a87e151e29d7f4254a06ff27758d05d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs new file mode 100644 index 000000000..c90957861 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs @@ -0,0 +1,175 @@ +#if UNITY_EDITOR +using BugsnagUnity.Payload; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using UnityEngine; + +namespace BugsnagUnity +{ + class NativeClient : INativeClient, IFeatureFlagStore + { + public Configuration Configuration { get; } + + public IBreadcrumbs Breadcrumbs { get; } + + private bool _launchMarkedAsCompleted = false; + + private bool _hasReceivedLowMemoryWarning = false; + + private Metadata _fallbackMetadata = new Metadata(); + + private OrderedDictionary _featureFlags = new OrderedDictionary(); + + public NativeClient(Configuration configuration) + { + Configuration = configuration; + Breadcrumbs = new Breadcrumbs(configuration); + Application.lowMemory += () => { _hasReceivedLowMemoryWarning = true; }; + if (configuration.FeatureFlags != null) + { + _featureFlags = configuration.FeatureFlags; + } + } + + public void PopulateApp(App app) + { + } + + public void PopulateAppWithState(AppWithState app) + { + AddIsLaunching(app); + app.Add("lowMemory", _hasReceivedLowMemoryWarning); + } + + private void AddIsLaunching(AppWithState app) + { + bool isLaunching; + if (Configuration.LaunchDurationMillis == 0) + { + isLaunching = !_launchMarkedAsCompleted; + } + else + { + isLaunching = app.Duration?.TotalMilliseconds < Configuration.LaunchDurationMillis; + } + app.IsLaunching = isLaunching; + } + + public void PopulateDevice(Device device) + { + } + + public void PopulateDeviceWithState(DeviceWithState device) + { + } + + public void PopulateUser(User user) + { + } + + public void SetSession(Session session) + { + } + + public void SetUser(User user) + { + } + public void SetContext(string context) + { + } + public void SetAutoDetectErrors(bool autoDetectErrors) + { + } + + public void SetAutoDetectAnrs(bool autoDetectAnrs) + { + } + + public void StartSession() + { + } + + public void PauseSession() + { + } + + public bool ResumeSession() + { + return false; + } + + public void UpdateSession(Session session) + { + } + + public Session GetCurrentSession() + { + return null; + } + + public void MarkLaunchCompleted() + { + _launchMarkedAsCompleted = true; + } + + public LastRunInfo GetLastRunInfo() + { + return null; + } + + public void ClearNativeMetadata(string section) + { + _fallbackMetadata.ClearMetadata(section); + } + + public void ClearNativeMetadata(string section, string key) + { + _fallbackMetadata.ClearMetadata(section, key); + } + + public void AddNativeMetadata(string section, IDictionary data) + { + _fallbackMetadata.AddMetadata(section, data); + } + + public IDictionary GetNativeMetadata() + { + return _fallbackMetadata.Payload; + } + + public void AddFeatureFlag(string name, string variant = null) + { + _featureFlags[name] = variant; + } + + public void AddFeatureFlags(FeatureFlag[] featureFlags) + { + foreach (var flag in featureFlags) + { + _featureFlags[flag.Name] = flag.Variant; + } + } + + public void ClearFeatureFlag(string name) + { + _featureFlags.Remove(name); + } + + public void ClearFeatureFlags() + { + _featureFlags.Clear(); + } + + public bool ShouldAttemptDelivery() + { + return true; + } + + public void RegisterForOnSessionCallbacks() + { + // Not Used on this platform + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs.meta new file mode 100644 index 000000000..f620df8a9 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ebb53897d29494385aa9e89fbf856633 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS.meta new file mode 100644 index 000000000..7bda75bf3 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f3fd7a12ee9864c09a51c0999c464742 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs new file mode 100644 index 000000000..6441546d1 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs @@ -0,0 +1,9 @@ +#if UNITY_STANDALONE_OSX && !UNITY_EDITOR +namespace BugsnagUnity +{ + partial class NativeCode + { + const string Import = "bugsnag-osx"; + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs.meta new file mode 100644 index 000000000..a19374468 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 648bbb01d634845c7a8f344cf33a6c3a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows.meta new file mode 100644 index 000000000..64805d0f8 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e0ce650d35347466daac220980bfb25a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs new file mode 100644 index 000000000..013a342e2 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs @@ -0,0 +1,222 @@ +#if UNITY_STANDALONE_WIN && !UNITY_EDITOR +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + class NativeClient : INativeClient + { + public Configuration Configuration { get; } + + public IBreadcrumbs Breadcrumbs { get; } + + private bool _launchMarkedAsCompleted = false; + + private bool _hasReceivedLowMemoryWarning = false; + + private Metadata _fallbackMetadata = new Metadata(); + + public NativeClient(Configuration configuration) + { + Configuration = configuration; + Breadcrumbs = new Breadcrumbs(configuration); + Application.lowMemory += () => { _hasReceivedLowMemoryWarning = true; }; + } + + public void PopulateApp(App app) + { + } + + public void PopulateAppWithState(AppWithState app) + { + AddIsLaunching(app); + app.Add("lowMemory", _hasReceivedLowMemoryWarning); + } + + private void AddIsLaunching(AppWithState app) + { + bool isLaunching; + if (Configuration.LaunchDurationMillis == 0) + { + isLaunching = !_launchMarkedAsCompleted; + } + else + { + isLaunching = app.Duration?.TotalMilliseconds < Configuration.LaunchDurationMillis; + } + app.IsLaunching = isLaunching; + } + + public void PopulateDevice(Device device) + { + device.Manufacturer = "PC"; + device.Model = SystemInfo.deviceModel; + } + + public void PopulateDeviceWithState(DeviceWithState device) + { + PopulateDevice(device); + if (Application.platform != RuntimePlatform.WindowsPlayer) + { + return; + } + MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX(); + if (GlobalMemoryStatusEx(memStatus)) + { + device.FreeMemory = (long)memStatus.ullAvailPhys; + } + + // This is generally the main drive on a Windows machine + // A future enhancement would be to determine which drive the application + // is running on and use that drive letter instead of defaulting to C + if (GetDiskFreeSpaceEx(@"C:\", + out ulong freeBytesAvailable, + out ulong totalNumberOfBytes, + out ulong totalNumberOfFreeBytes)) + { + device.FreeDisk = (long)freeBytesAvailable; + } + } + + public void PopulateMetadata(Metadata metadata) + { + } + + public void PopulateUser(User user) + { + } + + public void SetMetadata(string section, Dictionary metadata) + { + } + + public void SetSession(Session session) + { + } + + public void SetUser(User user) + { + } + public void SetContext(string context) + { + } + public void SetAutoDetectErrors(bool autoDetectErrors) + { + } + + public void SetAutoDetectAnrs(bool autoDetectAnrs) + { + } + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, + out ulong lpFreeBytesAvailable, + out ulong lpTotalNumberOfBytes, + out ulong lpTotalNumberOfFreeBytes); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer); + + public void StartSession() + { + } + + public void PauseSession() + { + } + + public bool ResumeSession() + { + return false; + } + + public void UpdateSession(Session session) + { + } + + public Session GetCurrentSession() + { + return null; + } + + public void MarkLaunchCompleted() + { + _launchMarkedAsCompleted = true; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + private class MEMORYSTATUSEX + { + public uint dwLength; + public uint dwMemoryLoad; + public ulong ullTotalPhys; + public ulong ullAvailPhys; + public ulong ullTotalPageFile; + public ulong ullAvailPageFile; + public ulong ullTotalVirtual; + public ulong ullAvailVirtual; + public ulong ullAvailExtendedVirtual; + public MEMORYSTATUSEX() + { + dwLength = (uint)Marshal.SizeOf(this); + } + } + + public LastRunInfo GetLastRunInfo() + { + return null; + } + + public void ClearNativeMetadata(string section) + { + _fallbackMetadata.ClearMetadata(section); + } + + public void ClearNativeMetadata(string section, string key) + { + _fallbackMetadata.ClearMetadata(section, key); + } + + public void AddNativeMetadata(string section, IDictionary data) + { + _fallbackMetadata.AddMetadata(section, data); + } + + public IDictionary GetNativeMetadata() + { + return _fallbackMetadata.Payload; + } + + public void AddFeatureFlag(string name, string variant = null) + { + } + + public void AddFeatureFlags(FeatureFlag[] featureFlags) + { + } + + public void ClearFeatureFlag(string name) + { + } + + public void ClearFeatureFlags() + { + } + + public bool ShouldAttemptDelivery() + { + return true; + } + + public void RegisterForOnSessionCallbacks() + { + // Not Used on this platform + } + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs.meta new file mode 100644 index 000000000..79b8236cf --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc25087b9318d42c790f992aa5f6f65c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS.meta new file mode 100644 index 000000000..803d4101a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 873a88e9bbf6b45818bd0e61077a7961 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs new file mode 100644 index 000000000..1ceb74c72 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs @@ -0,0 +1,9 @@ +#if UNITY_IOS +namespace BugsnagUnity +{ + partial class NativeCode + { + const string Import = "__Internal"; + } +} +#endif \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs.meta new file mode 100644 index 000000000..ac76a123c --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b31af7543d0a14bc7ad8628f213898c9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload.meta new file mode 100644 index 000000000..8e5051347 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 97462a2e3688241f989210801e2cbe78 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs new file mode 100644 index 000000000..8be172765 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +#nullable enable + +namespace BugsnagUnity.Payload +{ + /// + /// Represents the "app" key in the error report payload. + /// + public class App : PayloadContainer, IApp + { + + private const string BINARY_ARCH_KEY = "binaryArch"; + private const string BUILD_UUID_KEY = "buildUuid"; + private const string BUNDLE_VERSION_KEY = "bundleVersion"; + private const string CODE_BUNDLE_ID = "codeBundleId"; + private const string DSYM_UUID_KEY = "dsymUuid"; + private const string ID_KEY = "id"; + private const string RELEASESTAGE_KEY = "releaseStage"; + private const string TYPE_KEY = "type"; + private const string VERSION_KEY = "version"; + private const string VERSION_CODE_KEY = "versionCode"; + + + public string? BinaryArch + { + get => (string?)Get(BINARY_ARCH_KEY); + set => Add(BINARY_ARCH_KEY, value); + } + + public string? BuildUuid + { + get => (string?)Get(BUILD_UUID_KEY); + set => Add(BUILD_UUID_KEY, value); + } + + public string? BundleVersion + { + get => (string?)Get(BUNDLE_VERSION_KEY); + set => Add(BUNDLE_VERSION_KEY, value); + } + + public string? CodeBundleId + { + get => (string?)Get(CODE_BUNDLE_ID); + set => Add(CODE_BUNDLE_ID, value); + } + + public string? DsymUuid + { + get => (string?)Get(DSYM_UUID_KEY); + set => Add(DSYM_UUID_KEY, value); + } + + public string? Id + { + get => (string?)Get(ID_KEY); + set => Add(ID_KEY, value); + } + + public string? ReleaseStage + { + get => (string?)Get(RELEASESTAGE_KEY); + set => Add(RELEASESTAGE_KEY, value); + } + + public string? Type + { + get => (string?)Get(TYPE_KEY); + set => Add(TYPE_KEY, value); + } + + public string? Version + { + get => (string?)Get(VERSION_KEY); + set => Add(VERSION_KEY, value); + } + + public int? VersionCode + { + get => (int?)Get(VERSION_CODE_KEY); + set => Add(VERSION_CODE_KEY, value); + } + + internal App(Dictionary cachedData) + { + Add(cachedData); + } + + internal App(Configuration configuration) + { + Id = Application.identifier; + ReleaseStage = configuration.ReleaseStage; + Type = GetAppType(configuration); + Version = configuration.AppVersion; + } + + private string GetAppType(Configuration configuration) + { + if (!string.IsNullOrEmpty(configuration.AppType)) + { + return configuration.AppType; + } + switch (Application.platform) + { + case RuntimePlatform.OSXEditor: + case RuntimePlatform.OSXPlayer: + return "MacOS"; + case RuntimePlatform.WindowsPlayer: + case RuntimePlatform.WindowsEditor: + case RuntimePlatform.WSAPlayerARM: + case RuntimePlatform.WSAPlayerX64: + case RuntimePlatform.WSAPlayerX86: + return "Windows"; + case RuntimePlatform.LinuxPlayer: + case RuntimePlatform.LinuxEditor: + return "Linux"; + case RuntimePlatform.WebGLPlayer: + return "WebGL"; + default: + return string.Empty; + } + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs.meta new file mode 100644 index 000000000..9affe474d --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 64b9b637f625f45a0bb5c6bfaaa68c47 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs new file mode 100644 index 000000000..cd2929c07 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +#nullable enable + +namespace BugsnagUnity.Payload +{ + public class AppWithState : App, IAppWithState + { + private const string DURATION_KEY = "duration"; + private const string DURATION_IN_FOREGROUND_KEY = "durationInForeground"; + private const string IN_FOREGROUND_KEY = "inForeground"; + private const string IS_LAUNCHING_KEY = "isLaunching"; + + public TimeSpan? Duration + { + get + { + var millis = (double?)Get(DURATION_KEY); + if (millis != null) + { + return TimeSpan.FromMilliseconds((double)millis); + } + return null; + } + set => Add(DURATION_KEY, value?.TotalMilliseconds); + } + + public TimeSpan? DurationInForeground + { + get + { + var millis = (double?)Get(DURATION_IN_FOREGROUND_KEY); + if (millis != null) + { + return TimeSpan.FromMilliseconds((double)millis); + } + return null; + } + set => Add(DURATION_IN_FOREGROUND_KEY, value?.TotalMilliseconds); + } + + public bool? InForeground + { + get => (bool?)Get(IN_FOREGROUND_KEY); + set => Add(IN_FOREGROUND_KEY, value); + } + + public bool? IsLaunching + { + get => (bool?)Get(IS_LAUNCHING_KEY); + set => Add(IS_LAUNCHING_KEY, value); + } + + internal AppWithState(Dictionary cachedData) : base(cachedData){} + + internal AppWithState(Configuration configuration) : base(configuration) + { + Duration = TimeSpan.FromSeconds(UnityEngine.Time.realtimeSinceStartup); + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs.meta new file mode 100644 index 000000000..da9c9e852 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: becbe2fef97684835b88855b313b1c2a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs new file mode 100644 index 000000000..ce1da2ab7 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace BugsnagUnity.Payload +{ + /// + /// Represents an individual breadcrumb in the error report payload. + /// + public class Breadcrumb : PayloadContainer, IBreadcrumb + { + // Notifier spec specifies Message, but the pipeline is still expecting the legacy field name + private const string MESSAGE_KEY = "name"; + private const string TIMESTAMP_KEY = "timestamp"; + private const string METADATA_KEY = "metaData"; + private const string TYPE_KEY = "type"; + + internal static Breadcrumb FromReport(Report report) + { + var message = "Error"; + var metadata = new Dictionary { }; + if (report.Context != null) + { + metadata["context"] = report.Context; + } + if (report.Exceptions != null && report.Exceptions.Any()) + { + var exception = report.Exceptions.First(); + metadata["message"] = exception.ErrorMessage; + metadata["errorClass"] = exception.ErrorClass; + metadata["unhandled"] = !report.IsHandled; + metadata["severity"] = report.OriginalSeverity; + message = exception.ErrorClass; + } + return new Breadcrumb(message, metadata, BreadcrumbType.Error); + } + + internal Breadcrumb(Dictionary data) + { + Add(data); + } + + /// + /// Used to construct a breadcrumb from the native data obtained from a + /// native notifier if present. + /// + internal Breadcrumb(string message, string timestamp, string type, IDictionary metadata) + { + Timestamp = DateTimeOffset.Parse( timestamp ); + Metadata = metadata; + if (string.IsNullOrEmpty(type)) + { + Type = BreadcrumbType.Manual; + } + else + { + Type = ParseBreadcrumbType(type); + } + Message = message; + } + + internal Breadcrumb(string message,IDictionary metadata, BreadcrumbType type) + { + Timestamp = DateTime.UtcNow; + Metadata = metadata; + Type = type; + Message = message; + } + + public IDictionary Metadata + { + get + { + if (Get(METADATA_KEY) == null) + { + Metadata = new Dictionary(); + } + return Get(METADATA_KEY) as IDictionary; + } + set + { + Add(METADATA_KEY, value); + } + } + + public string Message + { + get { return Get(MESSAGE_KEY) as string; } + set { Add(MESSAGE_KEY, value); } + } + + public BreadcrumbType Type { + get { + var stringValue = (string)Get(TYPE_KEY); + return ParseBreadcrumbType(stringValue); + } + set { Add(TYPE_KEY, value.ToString().ToLowerInvariant()); } + } + + public DateTimeOffset? Timestamp { + get { return (DateTimeOffset)Get(TIMESTAMP_KEY); } + set { Add(TIMESTAMP_KEY,value); } + } + + internal static BreadcrumbType ParseBreadcrumbType(string name) + { + if (name.Contains("error")) + { + return BreadcrumbType.Error; + } + if (name.Contains("log")) + { + return BreadcrumbType.Log; + } + if (name.Contains("navigation")) + { + return BreadcrumbType.Navigation; + } + if (name.Contains("process")) + { + return BreadcrumbType.Process; + } + if (name.Contains("request")) + { + return BreadcrumbType.Request; + } + if (name.Contains("state")) + { + return BreadcrumbType.State; + } + if (name.Contains("user")) + { + return BreadcrumbType.User; + } + if (name.Contains("manual")) + { + return BreadcrumbType.Manual; + } + return BreadcrumbType.Manual; + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs.meta new file mode 100644 index 000000000..3c101f36d --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac8e759fc39e64d86848bf039f3312fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs new file mode 100644 index 000000000..58e339308 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs @@ -0,0 +1,51 @@ +using System; +namespace BugsnagUnity.Payload +{ + /// + /// Represents all of the possible breadcrumb types that the Bugsnag API supports. + /// + [Serializable] + [Flags] + public enum BreadcrumbType + { + /// + /// A breadcrumb with navigation information. + /// + Navigation = 0, + + /// + /// A breadcrumb with request information. + /// + Request = 1, + + /// + /// A breadcrumb with process information. + /// + Process = 2, + + /// + /// A breadcrumb with log information. + /// + Log = 3, + + /// + /// A breadcrumb with user information. + /// + User = 4, + + /// + /// A breadcrumb with state information. + /// + State = 5, + + /// + /// A breadcrumb with error information. + /// + Error = 6, + + /// + /// A manually logged breadcrumb. + /// + Manual = 7, + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs.meta new file mode 100644 index 000000000..daf069cdc --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8abe7f3405bcf4ac7a167654b9c25c3d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs new file mode 100644 index 000000000..fcc22becc --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using System.ComponentModel; +using UnityEngine.Events; +#nullable enable + +namespace BugsnagUnity.Payload +{ + public class Correlation : PayloadContainer + { + + private const string TRACE_ID_KEY = "traceId"; + private const string SPAN_ID_KEY = "spanId"; + + internal Correlation(string traceId, string spanId) + { + TraceId = traceId; + SpanId = spanId; + } + + public string TraceId + { + get { + var @object = Get(TRACE_ID_KEY); + if (@object == null) + { + return string.Empty; + } + return (string)@object; + } + set + { + Add(TRACE_ID_KEY, value); + } + } + + public string SpanId + { + get + { + var @object = Get(SPAN_ID_KEY); + if (@object == null) + { + return string.Empty; + } + return (string)@object; + } + set + { + Add(SPAN_ID_KEY, value); + } + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs.meta new file mode 100644 index 000000000..0493e2505 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f8ceb948d44054eacb24fd49250f8fac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs new file mode 100644 index 000000000..9c6259415 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text.RegularExpressions; +using UnityEngine; +#nullable enable + + +namespace BugsnagUnity.Payload +{ + + public class Device : PayloadContainer, IDevice + { + + private const string BROWSER_NAME_KEY = "browserName"; + private const string BROWSER_VERSION_KEY = "browserVersion"; + private const string CPU_ABI_KEY = "cpuAbi"; + private const string ID_KEY = "id"; + private const string JAILBROKEN_KEY = "jailbroken"; + private const string LOCALE_KEY = "locale"; + private const string MANUFACTURER_KEY = "manufacturer"; + private const string MODEL_KEY = "model"; + private const string MODEL_NUMBER_KEY = "modelNumber"; + private const string OS_NAME_KEY = "osName"; + private const string OS_VERSION_KEY = "osVersion"; + private const string RUNTIME_VERSIONS_KEY = "runtimeVersions"; + private const string TOTAL_MEMORY_KEY = "totalMemory"; + private const string USER_AGENT_KEY = "userAgent"; + + + public string? BrowserName + { + get => (string?)Get(BROWSER_NAME_KEY); + set => Add(BROWSER_NAME_KEY, value); + } + + public string? BrowserVersion + { + get => (string?)Get(BROWSER_VERSION_KEY); + set => Add(BROWSER_VERSION_KEY, value); + } + + public string[]? CpuAbi + { + get => (string[]?)Get(CPU_ABI_KEY); + set => Add(CPU_ABI_KEY, value); + } + + public string? Id + { + get => (string?)Get(ID_KEY); + set => Add(ID_KEY, value); + } + + public bool? Jailbroken + { + get => (bool?)Get(JAILBROKEN_KEY); + set => Add(JAILBROKEN_KEY, value); + } + + public string? Locale + { + get => (string?)Get(LOCALE_KEY); + set => Add(LOCALE_KEY, value); + } + + public string? Manufacturer + { + get => (string?)Get(MANUFACTURER_KEY); + set => Add(MANUFACTURER_KEY, value); + } + + public string? Model + { + get => (string?)Get(MODEL_KEY); + set => Add(MODEL_KEY, value); + } + + public string? ModelNumber + { + get => (string?)Get(MODEL_NUMBER_KEY); + set => Add(MODEL_NUMBER_KEY, value); + } + + public string? OsName + { + get => (string?)Get(OS_NAME_KEY); + set => Add(OS_NAME_KEY, value); + } + + public string? OsVersion + { + get => (string?)Get(OS_VERSION_KEY); + set => Add(OS_VERSION_KEY, value); + } + + public IDictionary? RuntimeVersions + { + get => (IDictionary?)Get(RUNTIME_VERSIONS_KEY); + set => Add(RUNTIME_VERSIONS_KEY, value); + } + + public long? TotalMemory + { + get => (long?)Get(TOTAL_MEMORY_KEY); + set => Add(TOTAL_MEMORY_KEY, value); + } + + public string? UserAgent + { + get => (string?)Get(USER_AGENT_KEY); + set => Add(USER_AGENT_KEY, value); + } + + internal Device(Dictionary cachedData) + { + Add(cachedData); + } + + internal Device(Configuration configuration, string deviceId) + { + TotalMemory = SystemInfo.systemMemorySize; + Locale = CultureInfo.CurrentCulture.ToString(); + AddOsInfo(); + AddRuntimeVersions(configuration); + Id = deviceId; + Model = SystemInfo.deviceModel; + } + + + + private void AddOsInfo() + { + + // we expect that windows version strings look like: + // "Microsoft Windows NT 10.0.17134.0" + // if it does then we can parse out the version number into a separate field + var matches = Regex.Match(Environment.OSVersion.VersionString, "\\A(?[a-zA-Z ]*) (?[\\d\\.]*)\\z"); + if (matches.Success) + { + OsName = matches.Groups["osName"].Value; + OsVersion = matches.Groups["osVersion"].Value; + } + else + { + OsName = Environment.OSVersion.Platform.ToString(); + OsVersion = Environment.OSVersion.VersionString; + } + + } + + private void AddRuntimeVersions(Configuration configuration) + { + RuntimeVersions = new Dictionary(); + RuntimeVersions.AddToPayload("unityScriptingBackend", configuration.ScriptingBackend); + RuntimeVersions.AddToPayload("dotnetScriptingRuntime", configuration.DotnetScriptingRuntime); + RuntimeVersions.AddToPayload("dotnetApiCompatibility", configuration.DotnetApiCompatibility); + RuntimeVersions.AddToPayload("unity", Application.unityVersion); + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs.meta new file mode 100644 index 000000000..a73cedbf3 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6a5a0d457acf849208ab76b680016c5d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs new file mode 100644 index 000000000..d5e83f172 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +#nullable enable + +namespace BugsnagUnity.Payload +{ + public class DeviceWithState : Device, IDeviceWithState + { + + private const string FREE_DISK_KEY = "freeDisk"; + private const string FREE_MEMORY_KEY = "freeMemory"; + private const string ORIENTATION_KEY = "orientation"; + private const string TIME_KEY = "time"; + + public long? FreeDisk + { + get => (long?)Get(FREE_DISK_KEY); + set => Add(FREE_DISK_KEY, value); + } + + public long? FreeMemory + { + get => (long?)Get(FREE_MEMORY_KEY); + set => Add(FREE_MEMORY_KEY, value); + } + + public string? Orientation + { + get => (string?)Get(ORIENTATION_KEY); + set => Add(ORIENTATION_KEY, value); + } + + public DateTimeOffset? Time + { + get => (DateTimeOffset?)Get(TIME_KEY); + set => Add(TIME_KEY, value); + } + + internal DeviceWithState(Dictionary cachedData) : base(cachedData) { } + + internal DeviceWithState(Configuration configuration, string deviceId) : base(configuration, deviceId) + { + Orientation = Input.deviceOrientation.ToString(); + Time = DateTimeOffset.Now; + Id = deviceId; + } + + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs.meta new file mode 100644 index 000000000..6f7658b5b --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ba7c8b9dc400a4493b73f81b7c9cd8ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs new file mode 100644 index 000000000..e5711a405 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs @@ -0,0 +1,294 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; + +namespace BugsnagUnity.Payload +{ + /// + /// Represents a set of Bugsnag payload exceptions that are generated from a single exception by resolving + /// the inner exceptions present. + /// + class Errors : IEnumerable + { + private IEnumerable UnwoundExceptions { get; } + + internal Errors(System.Exception exception, System.Diagnostics.StackFrame[] alternativeStackTrace) + { + UnwoundExceptions = FlattenAndReverseExceptionTree(exception).Select(e => Error.FromSystemException(e, alternativeStackTrace)); + } + + internal Errors(System.Exception exception, string providedStackTrace) + { + UnwoundExceptions = FlattenAndReverseExceptionTree(exception).Select(e => Error.FromSystemException(e, providedStackTrace)); + } + + public IEnumerator GetEnumerator() + { + return UnwoundExceptions.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + private static IEnumerable FlattenAndReverseExceptionTree(System.Exception ex) + { + if (ex == null) yield break; + + yield return ex; + + switch (ex) + { + case ReflectionTypeLoadException typeLoadException: + foreach (var exception in typeLoadException.LoaderExceptions) + { + foreach (var item in FlattenAndReverseExceptionTree(exception)) + { + yield return item; + } + } + break; + default: + foreach (var item in FlattenAndReverseExceptionTree(ex.InnerException)) + { + yield return item; + } + break; + } + } + } + + /// + /// Represents an individual error in the Bugsnag payload. + /// + public class Error : Dictionary, IError + { + internal HandledState HandledState { get; } + + internal bool IsAndroidJavaException; + + private const string ANDROID_JAVA_EXCEPTION_CLASS = "AndroidJavaException"; + private const string ERROR_CLASS_MESSAGE_PATTERN = @"^(?\S+):\s+(?.*)"; + private const string NATIVE_ANDROID_ERROR_CLASS = "java.lang.Error"; + private const string NATIVE_ANDROID_MESSAGE_PATTERN = @"signal \d+ \(SIG\w+\)"; + + private const string ERROR_CLASS_KEY = "errorClass"; + private const string MESSAGE_KEY = "message"; + private const string STACKTRACE_KEY = "stacktrace"; + + internal Error(Dictionary data) + { + foreach (var item in data) + { + if (item.Key == STACKTRACE_KEY) + { + var stackArray = (JsonArray)data[STACKTRACE_KEY]; + var stackList = new List(); + foreach (JsonObject jsonFrame in stackArray) + { + var newFrame = new StackTraceLine(jsonFrame.GetDictionary()); + stackList.Add(newFrame); + } + _stacktrace = stackList; + } + else + { + this.AddToPayload(item.Key, item.Value); + } + } + } + + internal Error(string errorClass, string message, StackTraceLine[] stackTrace) + : this(errorClass, message, stackTrace, HandledState.ForHandledException(),false) { } + + internal Error(string errorClass, string message, IStackframe[] stackTrace, HandledState handledState,bool isAndroidJavaException) + { + ErrorClass = errorClass; + ErrorMessage = message; + _stacktrace = stackTrace.ToList(); + HandledState = handledState; + IsAndroidJavaException = isAndroidJavaException; + } + + + private List _stacktrace { get => this.Get(STACKTRACE_KEY) as List; set => this.AddToPayload(STACKTRACE_KEY, value); } + + public List Stacktrace => _stacktrace; + + public string ErrorClass + { + get => this.Get(ERROR_CLASS_KEY) as string; + set => this.AddToPayload(ERROR_CLASS_KEY, value); + } + + public string ErrorMessage + { + get => this.Get(MESSAGE_KEY) as string; + set => this.AddToPayload(MESSAGE_KEY, value); + } + + public string Type { get => "Unity"; } + + + internal static Error FromSystemException(System.Exception exception, System.Diagnostics.StackFrame[] alternativeStackTrace) + { + var errorClass = exception.GetType().Name; + + // JVM exceptions in the main thread are handled by unity and require extra formatting + if (errorClass == ANDROID_JAVA_EXCEPTION_CLASS) + { + var androidErrorData = ProcessAndroidError(exception.Message); + var androidErrorClass = androidErrorData[0]; + var androidErrorMessage = androidErrorData[1]; + var lines = new StackTrace(exception.StackTrace, StackTraceFormat.AndroidJava).StackTraceLines; + return new Error(androidErrorClass, androidErrorMessage, lines, HandledState.ForUnhandledException(), true); + } + else + { + StackTraceLine[] lines; + if (!string.IsNullOrEmpty(exception.StackTrace)) + { + lines = new StackTrace(exception.StackTrace).StackTraceLines; + } + else + { + lines = new StackTrace(alternativeStackTrace).StackTraceLines; + } + return new Error(errorClass, exception.Message, lines); + } + + } + + internal static Error FromStringInfo(string name, string message, string stacktrace) + { + var stackFrames = new StackTrace(stacktrace).StackTraceLines; + return new Error(name, message, stackFrames); + } + + internal static Error FromSystemException(System.Exception exception, string stackTrace) + { + var errorClass = exception.GetType().Name; + var lines = new StackTrace(stackTrace).StackTraceLines; + + return new Error(errorClass, exception.Message, lines); + } + + public static Error FromUnityLogMessage(UnityLogMessage logMessage, System.Diagnostics.StackFrame[] stackFrames, Severity severity) + { + return FromUnityLogMessage(logMessage, stackFrames, severity, false); + } + + private static string[] ProcessAndroidError(string originalMessage) + { + string message; + string errorClass; + var match = Regex.Match(originalMessage, ERROR_CLASS_MESSAGE_PATTERN, RegexOptions.Singleline); + // If the message matches the "class: message" pattern, then the Java class is followed + // by a description of the Java exception. These two values will be used as the error + // class and message. + if (match.Success) + { + errorClass = match.Groups["errorClass"].Value; + message = match.Groups["message"].Value.Trim(); + } + else + { + // There was no Java exception description, so the Java class is the only content in + // the message. + errorClass = originalMessage; + message = string.Empty; + } + return new[] { errorClass, message }; + } + + public static Error FromUnityLogMessage(UnityLogMessage logMessage, System.Diagnostics.StackFrame[] fallbackStackFrames, Severity severity, bool forceUnhandled) + { + var match = Regex.Match(logMessage.Condition, ERROR_CLASS_MESSAGE_PATTERN, RegexOptions.Singleline); + + var lines = new StackTrace(logMessage.StackTrace).StackTraceLines; + if (lines.Length == 0) + { + lines = new StackTrace(fallbackStackFrames).StackTraceLines; + } + + var handledState = forceUnhandled + ? HandledState.ForUnhandledException() + : HandledState.ForUnityLogMessage(severity); + + if (match.Success) + { + var errorClass = match.Groups["errorClass"].Value; + var message = match.Groups["message"].Value.Trim(); + var isAndroidJavaException = false; + // JVM exceptions in the main thread are handled by unity and require extra formatting + if (errorClass == ANDROID_JAVA_EXCEPTION_CLASS) + { + isAndroidJavaException = true; + var androidErrorData = ProcessAndroidError(message); + errorClass = androidErrorData[0]; + message = androidErrorData[1]; + lines = new StackTrace(logMessage.StackTrace, StackTraceFormat.AndroidJava).StackTraceLines; + handledState = HandledState.ForUnhandledException(); + } + return new Error(errorClass, message, lines, handledState, isAndroidJavaException); + } + else + { + // include the type somehow in there + return new Error($"UnityLog{logMessage.Type}", logMessage.Condition, lines, handledState, false); + } + } + + public static bool ShouldSend(System.Exception exception) + { + var errorClass = exception.GetType().Name; + if (errorClass != ANDROID_JAVA_EXCEPTION_CLASS && errorClass != NATIVE_ANDROID_ERROR_CLASS) + { + return true; + } + + var match = Regex.Match(exception.StackTrace, NATIVE_ANDROID_MESSAGE_PATTERN, RegexOptions.Singleline); + return !match.Success; + } + + /// + /// Validates the logMessage excluding previously delivered reports + /// + public static bool ShouldSend(UnityLogMessage logMessage) + { + if (logMessage.StackTrace == null) + { + return true; + } + // Discard any messages matching native Android events as they are captured (and more + // accurate) via bugsnag-android. Any Java `Error` generated from a POSIX signal is + // discarded. For Unity 2017/2018: + var match = Regex.Match(logMessage.Condition, ERROR_CLASS_MESSAGE_PATTERN, RegexOptions.Singleline); + if (!match.Success) + { + return true; + } + + var errorClass = match.Groups["errorClass"].Value; + if (errorClass != ANDROID_JAVA_EXCEPTION_CLASS) + { + return true; + } + + var message = match.Groups["message"].Value; + match = Regex.Match(message, ERROR_CLASS_MESSAGE_PATTERN, RegexOptions.Singleline); + errorClass = match.Success ? match.Groups["errorClass"].Value : message; + if (errorClass != NATIVE_ANDROID_ERROR_CLASS) + { + return true; + } + + match = Regex.Match(logMessage.StackTrace, NATIVE_ANDROID_MESSAGE_PATTERN, RegexOptions.Singleline); + return !match.Success; + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs.meta new file mode 100644 index 000000000..a5bafedd0 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f4324a713e39c4ad2b464645ab126cc1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs new file mode 100644 index 000000000..ccad20d28 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs @@ -0,0 +1,388 @@ +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.Linq; +using UnityEngine; + +namespace BugsnagUnity.Payload +{ + public class Event : PayloadContainer, IEvent + { + + internal Event(string context, Metadata metadata, AppWithState app, DeviceWithState device, User user, Error[] errors, HandledState handledState, List breadcrumbs, Session session, string apiKey, OrderedDictionary featureFlags, Correlation correlation, LogType? logType = null) + { + ApiKey = apiKey; + OriginalSeverity = handledState; + _metadata = metadata; + HandledState = handledState; + LogType = logType; + _appWithState = app; + _deviceWithState = device; + Context = context; + _user = user; + _errors = errors.ToList(); + Errors = new List(); + Correlation = correlation; + foreach (var error in _errors) + { + Errors.Add(error); + } + + _breadcrumbs = breadcrumbs; + var breadcrumbsList = new List(); + foreach (var crumb in _breadcrumbs) + { + breadcrumbsList.Add(crumb); + } + Breadcrumbs = new ReadOnlyCollection(breadcrumbsList); + + if (session != null) + { + if (handledState.Handled) + { + session.Events.IncrementHandledCount(); + } + else + { + session.Events.IncrementUnhandledCount(); + } + Session = session; + } + _featureFlags = featureFlags; + } + + internal Event(Dictionary serialisedPayload) + { + ApiKey = serialisedPayload["apiKey"].ToString(); + + var eventObject = (Dictionary)serialisedPayload["event"]; + + if (eventObject["unhandled"] != null) + { + Add("unhandled", eventObject["unhandled"]); + } + else + { + Add("unhandled", false); + } + + if (eventObject["severity"] != null) + { + Add("severity", eventObject["severity"]); + } + if (eventObject["severityReason"] != null) + { + Add("severityReason", eventObject["severityReason"]); + } + _metadata = new Metadata(); + _metadata.MergeMetadata((Dictionary)eventObject["metaData"]); + + _appWithState = new AppWithState((Dictionary)eventObject["app"]); + + _deviceWithState = new DeviceWithState((Dictionary)eventObject["device"]); + + _featureFlags = new OrderedDictionary(); + if (eventObject.ContainsKey("featureFlags")) + { + var flagsArray = (JsonArray)eventObject["featureFlags"]; + foreach (JsonObject flag in flagsArray) + { + var featureFlag = new FeatureFlag(flag.GetDictionary()); + _featureFlags[featureFlag.Name] = featureFlag.Variant; + } + } + + if (eventObject.ContainsKey("context")) + { + Context = eventObject["context"].ToString(); + } + + _user = new User(); + if (eventObject.ContainsKey("user")) + { + _user.Add((Dictionary)eventObject["user"]); + } + + if (eventObject.ContainsKey("breadcrumbs")) + { + _breadcrumbs = new List(); + var crumbsArray = (JsonArray)eventObject["breadcrumbs"]; + foreach (JsonObject crumb in crumbsArray) + { + _breadcrumbs.Add(new Breadcrumb(crumb.GetDictionary())); + } + var breadcrumbsList = new List(); + foreach (var crumb in _breadcrumbs) + { + breadcrumbsList.Add(crumb); + } + Breadcrumbs = new ReadOnlyCollection(breadcrumbsList); + } + + if (eventObject.ContainsKey("groupingHash")) + { + GroupingHash = eventObject["groupingHash"].ToString(); + } + + _errors = new List(); + var errorsArray = (JsonArray)eventObject["exceptions"]; + foreach (JsonObject error in errorsArray) + { + var newError = new Error(error.GetDictionary()); + _errors.Add(newError); + + } + Errors = new List(); + foreach (var error in _errors) + { + Errors.Add(error); + } + + if (eventObject.ContainsKey("session")) + { + Session = new Session(); + Session.Add((Dictionary)eventObject["session"]); + } + + if (eventObject.ContainsKey("projectPackages")) + { + var packagesList = new List(); + var packagesArray = (JsonArray)eventObject["projectPackages"]; + foreach (var item in packagesArray) + { + packagesList.Add(item.ToString()); + } + _androidProjectPackages = packagesList.ToArray(); + } + } + + internal void AddAndroidProjectPackagesToEvent(string[] packages) + { + _androidProjectPackages = packages; + } + + private OrderedDictionary _featureFlags; + + HandledState _handledState; + + internal HandledState OriginalSeverity { get; } + + private string[] _androidProjectPackages; + + private Metadata _metadata { get; } + + public void AddMetadata(string section, string key, object value) => _metadata.AddMetadata(section,key,value); + + public void AddMetadata(string section, IDictionary metadata) => _metadata.AddMetadata(section, metadata); + + public IDictionary GetMetadata(string section) => _metadata.GetMetadata(section); + + public object GetMetadata(string section, string key) => _metadata.GetMetadata(section,key); + + public void ClearMetadata(string section) => _metadata.ClearMetadata(section); + + public void ClearMetadata(string section, string key) => _metadata.ClearMetadata(section, key); + + internal int PayloadVersion = 4; + + public string ApiKey { get; set; } + + public Correlation Correlation; + + private List _breadcrumbs; + + public ReadOnlyCollection Breadcrumbs { get; } + + internal Session Session { get; } + + internal LogType? LogType { get; } + + public bool Unhandled { + get { + var currentValue = Get("unhandled"); + if (currentValue == null) + { + return false; + } + return (bool)currentValue; + } + set => Add("unhandled",value); + } + + internal bool IsHandled + { + get + { + if (Get("unhandled") is bool unhandled) + { + return !unhandled; + } + + return false; + } + } + + public string Context { get; set; } + + private AppWithState _appWithState; + + public IAppWithState App => _appWithState; + + private DeviceWithState _deviceWithState; + + public IDeviceWithState Device => _deviceWithState; + + private List _errors; + + public List Errors { get; } + + public string GroupingHash { get; set; } + + public Severity Severity + { + set => HandledState = HandledState.ForCallbackSpecifiedSeverity(value, _handledState); + get => _handledState.Severity; + } + + + + private User _user; + + public IUser GetUser() => _user; + + public void SetUser(string id, string email, string name) + { + _user = new User(id, email, name ); + } + + internal bool IsAndroidJavaError() + { + foreach (var error in _errors) + { + if (error.IsAndroidJavaException) + { + return true; + } + } + return false; + } + + HandledState HandledState + { + set + { + _handledState = value; + foreach (var item in value) + { + Payload[item.Key] = item.Value; + } + } + } + + internal void RedactMetadata(Configuration config) + { + foreach (var section in _metadata.Payload) + { + var theSection = (IDictionary)section.Value; + foreach (var key in theSection.Keys.ToList()) + { + if (config.KeyIsRedacted(key)) + { + theSection[key] = "[REDACTED]"; + } + } + } + foreach (var crumb in _breadcrumbs) + { + foreach (var key in crumb.Metadata.Keys.ToList()) + { + if (config.KeyIsRedacted(key)) + { + crumb.Metadata[key] = "[REDACTED]"; + } + } + } + } + + public List Threads => null; + + internal Dictionary GetEventPayload() + { + Add("app", _appWithState.Payload); + Add("device", _deviceWithState.Payload); + Add("metaData", _metadata.Payload); + Add("user", _user.Payload); + Add("context", Context); + Add("groupingHash", GroupingHash); + Add("payloadVersion", PayloadVersion); + Add("exceptions", _errors); + if(Correlation != null) + { + Add("correlation", Correlation.Payload); + } + if (_androidProjectPackages != null) + { + Add("projectPackages", _androidProjectPackages); + } + var breadcrumbPayloads = new List>(); + foreach (var crumb in _breadcrumbs) + { + breadcrumbPayloads.Add(crumb.Payload); + } + Add("breadcrumbs", breadcrumbPayloads.ToArray()); + if (_featureFlags.Count > 0) + { + var featureFlagPayloads = new List>(); + foreach (DictionaryEntry entry in _featureFlags) + { + var flag = new FeatureFlag((string)entry.Key, (string)entry.Value); + featureFlagPayloads.Add(flag.Payload); + } + Add("featureFlags", featureFlagPayloads.ToArray()); + } + if (Session != null) + { + Add("session", Session.Payload); + } + + return Payload; + } + + public void AddFeatureFlag(string name, string variant = null) + { + _featureFlags[name] = variant; + } + + public void AddFeatureFlags(FeatureFlag[] featureFlags) + { + foreach (var flag in featureFlags) + { + AddFeatureFlag(flag.Name, flag.Variant); + } + } + + public void ClearFeatureFlag(string name) + { + _featureFlags.Remove(name); + } + + public void ClearFeatureFlags() + { + _featureFlags.Clear(); + } + + public ReadOnlyCollection FeatureFlags + { + get + { + List list = new List(); + foreach (DictionaryEntry entry in _featureFlags) + { + list.Add(new FeatureFlag((string)entry.Key, (string)entry.Value)); + } + return new ReadOnlyCollection(list); + } + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs.meta new file mode 100644 index 000000000..73ca55642 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 977dcf713462c4b378fb1f39e61a5f42 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs new file mode 100644 index 000000000..e5d2073fd --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; + +namespace BugsnagUnity.Payload +{ + public class FeatureFlag : PayloadContainer + { + + internal FeatureFlag(Dictionary data) + { + Add(data); + } + + public FeatureFlag(string name) + { + Name = name; + } + + public FeatureFlag(string name, string variant) + { + Name = name; + Variant = variant; + } + + public string Name + { + get => (string)Get("featureFlag"); + set => Add("featureFlag", value); + } + + public string Variant + { + get => (string)Get("variant"); + set => Add("variant", value); + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs.meta new file mode 100644 index 000000000..0d131608f --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 821389b10d3884058921bd3177c45a28 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs new file mode 100644 index 000000000..818ac2ee9 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs @@ -0,0 +1,151 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace BugsnagUnity.Payload +{ + /// + /// Represents the various fields that can be set in the "event" payload for + /// showing the exceptions handled/unhandled state and severity. + /// + class HandledState : Dictionary + { + /// + /// Creates a HandledState object for an error report payload where the exception was not handled by the application + /// and caught by a global error handler. + /// + /// + internal static HandledState ForUnhandledException() + { + return new HandledState(false, Severity.Error, SeverityReason.ForUnhandledException()); + } + + /// + /// Creates a HandledState object for an error report payload where the exception was logged and Config.ReportExceptionLogsAsHandled is true + /// + /// + internal static HandledState ForLoggedException() + { + return new HandledState(true, Severity.Error, SeverityReason.ForHandledException()); + } + + /// + /// Creates a HandledState object for an error report payload where the exception was handled by the application + /// and notified manually. + /// + /// + internal static HandledState ForHandledException() + { + return new HandledState(true, Severity.Warning, SeverityReason.ForHandledException()); + } + + /// + /// Creates a HandledState object for an error report payload where the exception was handled by the application + /// and notified manually and the error severity was also passed in to override the default severity. + /// + /// + /// + internal static HandledState ForUserSpecifiedSeverity(Severity severity) + { + return new HandledState(true, severity, SeverityReason.ForUserSpecifiedSeverity()); + } + + /// + /// Creates a HandledState object for an error report payload where the severity for the exception was modified + /// while running the middleware/callback. + /// + /// + /// + /// + internal static HandledState ForCallbackSpecifiedSeverity(Severity severity, HandledState previousSeverity) + { + return new HandledState(previousSeverity.Handled, severity, SeverityReason.ForCallbackSpecifiedSeverity()); + } + + /// + /// Creates a HandledState object for an error report payload that is being generated from a Unity log message. + /// These are always attributed as a handled exception due to the fact that they do not crash the application. + /// + /// The unity log message. + /// Severity. + internal static HandledState ForUnityLogMessage(Severity severity) + { + return new HandledState(true, severity, SeverityReason.ForHandledException()); + } + + internal Severity Severity { get; } + + HandledState(bool handled, Severity severity, SeverityReason reason) + { + Severity = severity; + this.AddToPayload("unhandled", !handled); + this.AddToPayload("severityReason", reason); + + string severityValue; + + switch (severity) + { + case Severity.Info: + severityValue = "info"; + break; + case Severity.Warning: + severityValue = "warning"; + break; + default: + severityValue = "error"; + break; + } + + this.AddToPayload("severity", severityValue); + } + + internal bool Handled + { + get + { + switch (this.Get("unhandled")) + { + case bool unhandled: + return !unhandled; + default: + return true; + } + } + set + { + this.AddToPayload("unhandled", !value); + } + } + + /// + /// Represents the "severityReason" key in the error report payload. + /// + class SeverityReason : Dictionary + { + internal static SeverityReason ForUnhandledException() + { + return new SeverityReason("unhandledException", null); + } + + internal static SeverityReason ForHandledException() + { + return new SeverityReason("handledException", null); + } + + internal static SeverityReason ForUserSpecifiedSeverity() + { + return new SeverityReason("userSpecifiedSeverity", null); + } + + internal static SeverityReason ForCallbackSpecifiedSeverity() + { + return new SeverityReason("userCallbackSetSeverity", null); + } + + SeverityReason(string type, IDictionary attributes) + { + this.AddToPayload("type", type); + this.AddToPayload("attributes", attributes); + } + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs.meta new file mode 100644 index 000000000..56b7c2236 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d6cda0efd00cd4a5b8fb35fc1b2fefa5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs new file mode 100644 index 000000000..be74c4682 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs @@ -0,0 +1,16 @@ +namespace BugsnagUnity.Payload +{ + public interface IApp + { + string BinaryArch { get; set; } + string BuildUuid { get; set; } + string BundleVersion { get; set; } + string CodeBundleId { get; set; } + string DsymUuid { get; set; } + string Id { get; set; } + string ReleaseStage { get; set; } + string Type { get; set; } + string Version { get; set; } + int? VersionCode { get; set; } + } +} \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs.meta new file mode 100644 index 000000000..200529121 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a423f26378b5b490990afc732a42fc2a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs new file mode 100644 index 000000000..411163cca --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs @@ -0,0 +1,12 @@ +using System; + +namespace BugsnagUnity.Payload +{ + public interface IAppWithState : IApp + { + TimeSpan? Duration { get; set; } + TimeSpan? DurationInForeground { get; set; } + bool? InForeground { get; set; } + bool? IsLaunching { get; set; } + } +} \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs.meta new file mode 100644 index 000000000..30ffb4ee3 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 42170bb7871b94cb4b1509e2ac9bfc21 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs new file mode 100644 index 000000000..b1f3ecef9 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace BugsnagUnity.Payload +{ + public interface IBreadcrumb + { + string Message { get; set; } + + IDictionary Metadata { get; set; } + + DateTimeOffset? Timestamp { get; } + + BreadcrumbType Type { get; set; } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs.meta new file mode 100644 index 000000000..15ddddc10 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 06e3e9fa743a24a2cb71168d0f89c4d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs new file mode 100644 index 000000000..7d14c75d8 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace BugsnagUnity +{ + public interface IDevice + { + string BrowserName { get; set; } + string BrowserVersion { get; set; } + string[] CpuAbi { get; set; } + string Id { get; set; } + bool? Jailbroken { get; set; } + string Locale { get; set; } + string Manufacturer { get; set; } + string Model { get; set; } + string ModelNumber { get; set; } + string OsName { get; set; } + string OsVersion { get; set; } + IDictionary RuntimeVersions { get; set; } + long? TotalMemory { get; set; } + string UserAgent { get; set; } + } +} \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs.meta new file mode 100644 index 000000000..36bea36d1 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cb2cdcac2919f451da8643a324a97070 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs new file mode 100644 index 000000000..83b916553 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs @@ -0,0 +1,12 @@ +using System; + +namespace BugsnagUnity.Payload +{ + public interface IDeviceWithState : IDevice + { + long? FreeDisk { get; set; } + long? FreeMemory { get; set; } + string Orientation { get; set; } + DateTimeOffset? Time { get; set; } + } +} \ No newline at end of file diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs.meta new file mode 100644 index 000000000..f49de43ce --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c78348ed417504fa28a099eb4ffd0543 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs new file mode 100644 index 000000000..9a31a81ec --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace BugsnagUnity.Payload +{ + public interface IError + { + string ErrorClass { get; set; } + + string ErrorMessage { get; set; } + + List Stacktrace { get; } + + string Type { get; } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs.meta new file mode 100644 index 000000000..88c85aaae --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9ecf4b0a22a8b4629b702270e32f1e94 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs new file mode 100644 index 000000000..95b9c33e6 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public interface IEvent: IMetadataEditor, IUserEditor, IFeatureFlagStore + { + string ApiKey { get; set; } + + IAppWithState App { get; } + + string Context { get; set; } + + IDeviceWithState Device { get; } + + ReadOnlyCollection Breadcrumbs { get; } + + List Errors { get; } + + ReadOnlyCollection FeatureFlags { get; } + + string GroupingHash { get; set; } + + Severity Severity { get; set; } + + List Threads { get; } + + bool Unhandled { get; set; } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs.meta new file mode 100644 index 000000000..0794cd617 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5623ec2a90caa4ce08973403d38959b5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs new file mode 100644 index 000000000..6d500f8db --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BugsnagUnity.Payload +{ + public interface IPayload + { + Uri Endpoint { get; set; } + + KeyValuePair[] Headers { get; set; } + + string Id { get; set; } + + PayloadType PayloadType { get; } + + Dictionary GetSerialisablePayload(); + } + + public enum PayloadType + { + Session, + Event + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs.meta new file mode 100644 index 000000000..f1a2a4e5c --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e62034581331540a4837cae71d5b59c9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs new file mode 100644 index 000000000..e5117aaad --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs @@ -0,0 +1,15 @@ +using System; +using BugsnagUnity.Payload; + +namespace BugsnagUnity +{ + public interface ISession + { + string Id { get; set; } + IDevice Device { get; set; } + IApp App { get; set; } + DateTimeOffset? StartedAt { get; set; } + IUser GetUser(); + void SetUser(string id, string email, string name); + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs.meta new file mode 100644 index 000000000..956b0eea9 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5d098594352284940bcb0c14c9b45ffa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs new file mode 100644 index 000000000..25255ad49 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs @@ -0,0 +1,30 @@ +using System; +namespace BugsnagUnity.Payload +{ + public interface IStackframe + { + string FrameAddress { get; set; } + + bool? IsLr { get; set; } + + bool? IsPc { get; set; } + + string MachoFile { get; set; } + + string MachoLoadAddress { get; set; } + + string MachoUuid { get; set; } + + string MachoVmAddress { get; set; } + + string Method { get; set; } + + string SymbolAddress { get; set; } + + string File { get; set; } + + bool? InProject { get; set; } + + int? LineNumber { get; set; } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs.meta new file mode 100644 index 000000000..909a11be9 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ae9d334ec831b46e49a74dc62e14938e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs new file mode 100644 index 000000000..c394f9bd8 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace BugsnagUnity.Payload +{ + public interface IThread + { + string Id { get; set; } + bool? ErrorReportingThread { get; } + string Name { get; set; } + List Stacktrace { get; } + string Type { get; } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs.meta new file mode 100644 index 000000000..0f4703e1b --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0667c9f858a62469b972cac3764d30bf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs new file mode 100644 index 000000000..a43dd1a95 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs @@ -0,0 +1,12 @@ +using System; +namespace BugsnagUnity +{ + public interface IUser + { + string Id { get; } + + string Name { get; } + + string Email { get; } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs.meta new file mode 100644 index 000000000..fd62d9678 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c1ea7cd0243246239b17c7d749fc9f2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs new file mode 100644 index 000000000..706657294 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs @@ -0,0 +1,126 @@ +using System.Collections.Generic; +using System.Linq; +using BugsnagUnity; +using UnityEngine; + +namespace BugsnagUnity.Payload +{ + public class Metadata : PayloadContainer + { + private INativeClient _nativeClient = null; + + public Metadata() + { + } + + internal Metadata(INativeClient nativeClient) + { + _nativeClient = nativeClient; + } + + + public void AddMetadata(string section, string key, object value) + { + AddMetadata(section, new Dictionary{{ key, value }}); + } + + public void AddMetadata(string section, IDictionary metadataSection) + { + if (metadataSection == null) + { + ClearMetadata(section); + return; + } + if (SectionExists(section)) + { + var existingSection = (IDictionary)Get(section); + + foreach (var key in metadataSection.Keys.ToList()) + { + var value = metadataSection[key]; + if (value == null) + { + ClearMetadata(section, key); + } + else + { + existingSection[key] = value; + } + } + } + else + { + Add(section,metadataSection); + } + if (_nativeClient != null) + { + _nativeClient.AddNativeMetadata(section,metadataSection); + } + } + + + + public void ClearMetadata(string section) + { + if (SectionExists(section)) + { + Payload.Remove(section); + } + if (_nativeClient != null) + { + _nativeClient.ClearNativeMetadata(section); + } + } + + public void ClearMetadata(string section, string key) + { + if (SectionExists(section)) + { + var existingSection = (IDictionary)Payload[section]; + if (existingSection.ContainsKey(key)) + { + existingSection.Remove(key); + } + } + if (_nativeClient != null) + { + _nativeClient.ClearNativeMetadata(section,key); + } + } + + private bool SectionExists(string section) + { + return Payload.ContainsKey(section); + } + + public IDictionary GetMetadata(string section) + { + return SectionExists(section) ? (IDictionary)Payload[section] : null; + } + + public object GetMetadata(string section, string key) + { + if (SectionExists(section)) + { + var existingSection = (IDictionary)Payload[section]; + return existingSection[key]; + } + return null; + } + + internal void MergeMetadata(IDictionary newMetadata) + { + if (newMetadata == null) + { + return; + } + foreach (var section in newMetadata) + { + var sectionkey = section.Key; + var sectionToMergeIn = (IDictionary)section.Value; + AddMetadata(sectionkey, sectionToMergeIn); + } + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs.meta new file mode 100644 index 000000000..f61db76e5 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a471a3d8705cd4b538b2e8b282a02893 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs new file mode 100644 index 000000000..4e3e1495b --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs @@ -0,0 +1,53 @@ +using System.Linq; +using System.Reflection; +using System.Text; + +namespace BugsnagUnity.Payload +{ + class Method + { + private readonly MethodBase _methodBase; + + internal Method(MethodBase methodBase) + { + _methodBase = methodBase; + } + + internal string DisplayName() + { + if (_methodBase == null) + { + return null; + } + + var builder = new StringBuilder(); + + var type = _methodBase.DeclaringType; + + if (type != null) + { + var declaringTypeName = TypeNameHelper.GetTypeDisplayName(type, includeGenericParameterNames: true); + if (!string.IsNullOrEmpty(declaringTypeName)) + { + builder.Append(declaringTypeName).Append("."); + } + } + + builder.Append(_methodBase.Name); + + if (_methodBase.IsGenericMethod) + { + var genericArguments = string.Join(", ", _methodBase.GetGenericArguments() + .Select(arg => TypeNameHelper.GetTypeDisplayName(arg, fullName: false, includeGenericParameterNames: true)).ToArray()); + builder.Append("<").Append(genericArguments).Append(">"); + } + + var parameters = _methodBase.GetParameters().Select(p => new MethodParameter(p).DisplayName()).ToArray(); + builder.Append("("); + builder.Append(string.Join(", ", parameters)); + builder.Append(")"); + + return builder.ToString(); + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs.meta new file mode 100644 index 000000000..b5e62c5cd --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 789f75e994b094388b232a695988595d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs new file mode 100644 index 000000000..1329c7940 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs @@ -0,0 +1,46 @@ +using System.Reflection; +using System.Text; + +namespace BugsnagUnity.Payload +{ + class MethodParameter + { + private readonly ParameterInfo _originalParameterInfo; + + internal MethodParameter(ParameterInfo parameterInfo) + { + _originalParameterInfo = parameterInfo; + } + + internal string DisplayName() + { + var builder = new StringBuilder(); + var type = _originalParameterInfo.ParameterType; + + if (_originalParameterInfo.IsOut) + { + builder.Append("out "); + } + else if (type != null && type.IsByRef) + { + builder.Append("ref "); + } + + var parameterTypeString = "?"; + + if (type != null) + { + if (type.IsByRef) + { + type = type.GetElementType(); + } + + parameterTypeString = TypeNameHelper.GetTypeDisplayName(type, fullName: false, includeGenericParameterNames: true); + } + + builder.Append(parameterTypeString).Append(" ").Append(_originalParameterInfo.Name); + + return builder.ToString(); + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs.meta new file mode 100644 index 000000000..2a77617ad --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4005cecbf8124479dafa3aaa0a95d247 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs new file mode 100644 index 000000000..ff80889d8 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace BugsnagUnity.Payload +{ + class NotifierInfo : Dictionary + { + internal const string NotifierName = "Unity Bugsnag Notifier"; + internal static string NotifierVersion = typeof(Client).Assembly.GetName().Version.ToString(3); + internal const string NotifierUrl = "https://github.com/bugsnag/bugsnag-unity"; + + internal static NotifierInfo Instance { get; } = new NotifierInfo { + { "name", NotifierName }, + { "version", NotifierVersion }, + { "url", NotifierUrl } + }; + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs.meta new file mode 100644 index 000000000..51031ef93 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fcdfa0196078d4575a3afaf391f47b0c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs new file mode 100644 index 000000000..ddd6516ba --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +#nullable enable + +namespace BugsnagUnity.Payload +{ + + public class PayloadContainer + { + internal PayloadDictionary Payload = new PayloadDictionary(); + + internal PayloadContainer() + { + } + + internal void Add(string key, object? value) + { + Payload.AddToPayload(key, value); + } + + internal void Add(Dictionary newValues) + { + foreach (var entry in newValues) + { + Add(entry.Key, entry.Value); + } + } + + internal object? Get(string key) + { + if (Payload.ContainsKey(key)) + { + return Payload[key]; + } + else + { + return null; + } + } + + } + + internal class PayloadDictionary : Dictionary, IFilterable + { + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs.meta new file mode 100644 index 000000000..08ce580dc --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 258a803f4e44f4714974d901ad759c67 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs new file mode 100644 index 000000000..46770f481 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; + +namespace BugsnagUnity.Payload +{ + static class PayloadExtensions + { + /// + /// Adds a key to the Bugsnag payload. If provided a null or empty string + /// value will remove the key from the dictionary. + /// + /// + /// + /// + /// + internal static void AddToPayload(this IDictionary dictionary, string key, T value) + { + if (value == null) + { + dictionary.Remove(key); + return; + } + + switch (value) + { + case System.String s: + if (!Polyfills.String.IsNullOrWhiteSpace(s)) + { + dictionary[key] = value; + } + else if (dictionary.ContainsKey(key)) + { + dictionary.Remove(key); + } + break; + default: + dictionary[key] = value; + break; + } + } + + internal static U Get(this Dictionary dictionary, T key) + { + dictionary.TryGetValue(key, out U value); + return value; + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs.meta new file mode 100644 index 000000000..19fd11495 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 91624a3553740459680088e42ac66ffe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs new file mode 100644 index 000000000..afe638783 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using UnityEngine; + +namespace BugsnagUnity.Payload +{ + public class Report : Dictionary, IPayload + { + + public Uri Endpoint { get; set; } + + public KeyValuePair[] Headers { get; set; } + + internal bool Ignored { get; private set; } + + public string Id { get; set; } + + internal Report(Configuration configuration, Event @event) + { + Id = Guid.NewGuid().ToString(); + Ignored = false; + Endpoint = configuration.Endpoints.Notify; + Headers = new[] { + new KeyValuePair("Bugsnag-Api-Key", @event.ApiKey), + new KeyValuePair("Bugsnag-Payload-Version", configuration.PayloadVersion), + }; + Event = @event; + this.AddToPayload("apiKey", @event.ApiKey); + this.AddToPayload("notifier", NotifierInfo.Instance); + } + + internal Report(Configuration configuration, Dictionary serialisedPayload) + { + Id = serialisedPayload["id"].ToString(); + Endpoint = configuration.Endpoints.Notify; + var apiKey = serialisedPayload["apiKey"].ToString(); + Headers = new[] { + new KeyValuePair("Bugsnag-Api-Key", apiKey), + new KeyValuePair("Bugsnag-Payload-Version", configuration.PayloadVersion), + }; + this.AddToPayload("apiKey", apiKey); + this.AddToPayload("notifier", serialisedPayload["notifier"]); + Event = new Event(serialisedPayload); + } + + public Dictionary GetSerialisablePayload() + { + var serialisableReport = new Dictionary(); + serialisableReport["id"] = Id; + serialisableReport["apiKey"] = Event.ApiKey; + serialisableReport["notifier"] = NotifierInfo.Instance; + serialisableReport["event"] = Event.GetEventPayload(); + return serialisableReport; + } + + internal void ApplyEventsArray() + { + this.AddToPayload("events", new[] { Event.GetEventPayload() }); + } + + internal Event Event; + + internal Session Session => Event.Session; + + internal bool IsHandled => Event.IsHandled; + + internal string Context => Event.Context; + + internal List Exceptions => Event.Errors; + + internal HandledState OriginalSeverity => Event.OriginalSeverity; + + public PayloadType PayloadType => PayloadType.Event; + + public void Ignore() + { + Ignored = true; + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs.meta new file mode 100644 index 000000000..58c4a757a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fa21703a719af4d208549cb6569ae49d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs new file mode 100644 index 000000000..620fbe90d --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +#nullable enable + +namespace BugsnagUnity.Payload +{ + public class Session : PayloadContainer, ISession + { + + private const string ID_KEY = "id"; + private const string STARTED_AT_KEY = "startedAt"; + private const string EVENTS_KEY = "events"; + + public string? Id + { + get => (string?)Get(ID_KEY); + set => Add(ID_KEY, value); + } + + public DateTimeOffset? StartedAt + { + get => (DateTimeOffset?)Get(STARTED_AT_KEY); + set => Add(STARTED_AT_KEY, value); + } + + public IApp? App { get; set; } + + public IDevice? Device { get; set; } + + internal User? User { get; set; } + + public IUser GetUser() => User ?? new User(string.Empty, string.Empty, string.Empty); + + public void SetUser(string id, string email, string name) + { + User = new User(id, email, name); + } + + internal int HandledCount() + { + return this.Events.Handled; + } + + internal int UnhandledCount() + { + return this.Events.Unhandled; + } + + internal SessionEvents Events + { + get => (SessionEvents)Get(EVENTS_KEY)!; + set => Add(EVENTS_KEY, value); + } + + internal bool Stopped { get; set; } + + internal Session() : this(DateTimeOffset.Now, 0, 0) + { + } + + internal Session(DateTimeOffset? startedAt, int handled, int unhandled) + { + Id = Guid.NewGuid().ToString(); + StartedAt = startedAt; + Events = new SessionEvents(handled, unhandled); + } + + internal Session(string providedGuid, DateTimeOffset startedAt, int handled, int unhandled) + { + Id = providedGuid; + StartedAt = startedAt; + Events = new SessionEvents(handled, unhandled); + } + + internal void AddException(Report report) + { + if (report.IsHandled) + { + Events.IncrementHandledCount(); + } + else + { + Events.IncrementUnhandledCount(); + } + } + + internal Session Copy() + { + var copy = new Session(StartedAt, Events.Handled, Events.Unhandled) + { + Id = Id + }; + return copy; + } + } + + internal class SessionEvents : Dictionary + { + private readonly object _handledLock = new object(); + private readonly object _unhandledLock = new object(); + + internal SessionEvents(int handled, int unhandled) + { + this.AddToPayload("handled", handled); + this.AddToPayload("unhandled", unhandled); + } + + internal int Handled => this["handled"]; + internal int Unhandled => this["unhandled"]; + + internal void IncrementHandledCount() + { + lock (_handledLock) + { + this["handled"]++; + } + } + + internal void IncrementUnhandledCount() + { + lock (_unhandledLock) + { + this["unhandled"]++; + } + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs.meta new file mode 100644 index 000000000..b024fd425 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6e5a0c1b89048426eb2a8dee25a4e5b6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs new file mode 100644 index 000000000..e1bb08a44 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace BugsnagUnity.Payload +{ + class SessionReport : Dictionary, IPayload + { + + public Uri Endpoint { get; set; } + + public KeyValuePair[] Headers { get; set; } + + public string Id { get; set; } + + public PayloadType PayloadType { get => PayloadType.Session; } + + private void SetRequestInfo(Configuration configuration) + { + Endpoint = configuration.Endpoints.Session; + Headers = new KeyValuePair[] { + new KeyValuePair("Bugsnag-Api-Key", configuration.ApiKey), + new KeyValuePair("Bugsnag-Payload-Version", configuration.SessionPayloadVersion), + }; + } + + public SessionReport(Configuration configuration, Session session) + { + SetRequestInfo(configuration); + this.AddToPayload("notifier", NotifierInfo.Instance); + this.AddToPayload("app", ((App)session.App).Payload); + this.AddToPayload("device", ((Device)session.Device).Payload); + var sessionObject = new Dictionary(); + sessionObject.AddToPayload("id", session.Id); + sessionObject.AddToPayload("startedAt", session.StartedAt); + sessionObject.AddToPayload("user", session.User.Payload); + this.AddToPayload("sessions", new [] { sessionObject }); + Id = session.Id; + } + + public SessionReport(Configuration configuration, Dictionary cachedReport) + { + SetRequestInfo(configuration); + this.AddToPayload("notifier", cachedReport.Get("notifier")); + this.AddToPayload("app", cachedReport.Get("app")); + this.AddToPayload("device", cachedReport.Get("device")); + this.AddToPayload("sessions", cachedReport.Get("sessions")); + Id = cachedReport["id"].ToString(); + } + + public Dictionary GetSerialisablePayload() + { + var serialisableSessionReport = new Dictionary + { + { "id", Id }, + { "app", this["app"] }, + { "device", this["device"] }, + { "notifier", this["notifier"] }, + { "sessions", this["sessions"]} + }; + return serialisableSessionReport; + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs.meta new file mode 100644 index 000000000..b6d4646d0 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9b476c05ced11445ea4faf9bbf31a4a2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs new file mode 100644 index 000000000..d98bd02f4 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs @@ -0,0 +1,189 @@ +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text.RegularExpressions; + +namespace BugsnagUnity.Payload +{ + /// + /// The supported stacktrace parsing formats for Unity log messages + /// + internal enum StackTraceFormat { Standard, AndroidJava }; + + /// + /// Represents a set of Bugsnag payload stacktrace lines that are generated from a single StackTrace provided + /// by the runtime. + /// + class StackTrace : IEnumerable + { + public StackTraceLine[] StackTraceLines { get; private set; } + + internal StackTrace(StackFrame[] stackFrames) + { + StackTraceLines = new StackTraceLine[stackFrames.Length]; + for (int i = 0; i < stackFrames.Length; i++) + { + StackTraceLines[i] = StackTraceLine.FromStackFrame(stackFrames[i]); + } + } + + internal StackTrace(string stackTrace) : this(stackTrace, StackTraceFormat.Standard) { } + + internal StackTrace(string stackTrace, StackTraceFormat format) + { + string[] lines = stackTrace.Split(new[] {"\r\n","\r","\n", System.Environment.NewLine }, + System.StringSplitOptions.RemoveEmptyEntries); + var frames = new List(); + for (int i = 0; i < lines.Length; i++) + { + if (format == StackTraceFormat.AndroidJava && i == 0) + { // Skip the first line as it isn't a stack frame + continue; + } + var frame = format == StackTraceFormat.AndroidJava + ? StackTraceLine.FromAndroidJavaMessage(lines[i]) + : StackTraceLine.FromLogMessage(lines[i]); + + if (frame != null) + { + frames.Add(frame); + } + } + StackTraceLines = frames.ToArray(); + } + + public IEnumerator GetEnumerator() + { + foreach (var frame in StackTraceLines) + { + yield return frame; + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + + /// + /// Represents an individual stack trace line in the Bugsnag payload. + /// + public class StackTraceLine : Dictionary, IStackframe + { + private static Regex StackTraceLineRegex { get; } = new Regex(@"(?:\s*at\s)?(?(?:\(.*\)\s)?[^()]+)(?\([^()]*?\))(?:\s(?:\[.*\]\s*in\s|\(at\s*\s*)(?.*):(?\d+))?"); + private static Regex StackTraceAndroidJavaLineRegex { get; } = new Regex(@"^\s*(?:at\s)?(?[a-z][^()]+)\((?[^:]*)?(?::(?\d+))?\)"); + + + public static StackTraceLine FromLogMessage(string message) + { + Match match = StackTraceLineRegex.Match(message); + if (match.Success) + { + int? lineNumber = null; + int parsedValue; + if (System.Int32.TryParse(match.Groups["linenumber"].Value, out parsedValue)) + { + lineNumber = parsedValue; + } + string method = string.Join("", new string[]{match.Groups["method"].Value.Trim(), + match.Groups["methodargs"].Value}); + return new StackTraceLine(match.Groups["file"].Value, + lineNumber, method); + } + return new StackTraceLine("", null, message); + } + + public static StackTraceLine FromAndroidJavaMessage(string message) + { + Match match = StackTraceAndroidJavaLineRegex.Match(message); + if (match.Success) + { + int? lineNumber = null; + int parsedValue; + if (System.Int32.TryParse(match.Groups["linenumber"].Value, out parsedValue)) + { + lineNumber = parsedValue; + } + string method = string.Join("", new string[] { match.Groups["method"].Value.Trim(), "()" }); + return new StackTraceLine(match.Groups["file"].Value, + lineNumber, method); + } + // Likely a C# line in the Android stacktrace + return FromLogMessage(message); + } + + internal static StackTraceLine FromStackFrame(StackFrame stackFrame) + { + var method = stackFrame.GetMethod(); + var file = stackFrame.GetFileName(); + var lineNumber = stackFrame.GetFileLineNumber(); + var methodName = new Method(method).DisplayName(); + + return new StackTraceLine(file, lineNumber, methodName); + } + + internal StackTraceLine(string file, int? lineNumber, string methodName) + { + this.AddToPayload("file", file); + if (lineNumber.HasValue) + { + this.AddToPayload("lineNumber", lineNumber.Value); + } + this.AddToPayload("method", methodName); + } + internal StackTraceLine(Dictionary data) + { + foreach (var item in data) + { + this.AddToPayload(item.Key, item.Value); + } + } + + public string File + { + get + { + return this.Get("file") as string; + } + set + { + this.AddToPayload("file", value); + } + } + + public int? LineNumber + { + get + { + return this.Get("lineNumber") as int?; + } + set + { + this.AddToPayload("lineNumber", value); + } + } + + public string Method + { + get + { + return this.Get("method") as string; + } + set + { + this.AddToPayload("method", value); + } + } + + public string FrameAddress { get; set; } + public bool? IsLr { get; set; } + public bool? IsPc { get; set; } + public string MachoFile { get; set; } + public string MachoLoadAddress { get; set; } + public string MachoUuid { get; set; } + public string MachoVmAddress { get; set; } + public string SymbolAddress { get; set; } + public bool? InProject { get; set; } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs.meta new file mode 100644 index 000000000..fe4764e35 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5a4269800c95c4079a3a5ab2e7861cb3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs new file mode 100644 index 000000000..f8b7cca77 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs @@ -0,0 +1,87 @@ +using System.Collections.Generic; +using System.ComponentModel; +using UnityEngine.Events; +#nullable enable + +namespace BugsnagUnity.Payload +{ + public class User : PayloadContainer, IUser + { + internal UnityEvent PropertyChanged = new UnityEvent(); + + private const string ID_KEY = "id"; + private const string NAME_KEY = "name"; + private const string EMAIL_KEY = "email"; + + + internal User() + { + + } + + public User(string id, string email, string name) + { + Id = id; + Name = name; + Email = email; + } + + public string Id + { + get { + var @object = Get(ID_KEY); + if (@object == null) + { + return string.Empty; + } + return (string)@object; + } + set + { + Add(ID_KEY, value); + PropertyChanged.Invoke(); + } + } + + public string Name + { + get + { + var @object = Get(NAME_KEY); + if (@object == null) + { + return string.Empty; + } + return (string)@object; + } + set + { + Add(NAME_KEY, value); + PropertyChanged.Invoke(); + } + } + + public string Email + { + get + { + var @object = Get(EMAIL_KEY); + if (@object == null) + { + return string.Empty; + } + return (string)@object; + } + set + { + Add(EMAIL_KEY, value); + PropertyChanged.Invoke(); + } + } + + internal User Clone() + { + return (User)MemberwiseClone(); + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs.meta new file mode 100644 index 000000000..7f36d2da3 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5a5431b7e62ff40a39e8bb3ad4564ae6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs new file mode 100644 index 000000000..178d04c56 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using BugsnagUnity.Payload; +using UnityEngine; +namespace BugsnagUnity +{ + public class PayloadManager + { + + private static List _pendingPayloads = new List(); + + private CacheManager _cacheManager; + + private class PendingPayload + { + public string Json; + public string PayloadId; + + public PendingPayload(string json, string payloadId) + { + Json = json; + PayloadId = payloadId; + } + } + + internal PayloadManager(CacheManager cacheManager) + { + _cacheManager = cacheManager; + } + + internal bool AddPendingPayload(IPayload payload) + { + try + { + using (var stream = new MemoryStream()) + using (var reader = new StreamReader(stream)) + using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) + { + SimpleJson.SerializeObject(payload.GetSerialisablePayload(), writer); + writer.Flush(); + stream.Position = 0; + var jsonString = reader.ReadToEnd(); + _pendingPayloads.Add(new PendingPayload(jsonString, payload.Id)); + } + return true; + } + catch + { + // If payload serialisation fails ignore the payload + return false; + } + } + + private PendingPayload GetPendingPayload(string id) + { + foreach (var payload in _pendingPayloads) + { + if (payload.PayloadId == id) + { + return payload; + } + } + return null; + } + + internal void SendPayloadFailed(IPayload payload) + { + switch (payload.PayloadType) + { + case PayloadType.Session: + CacheSession(payload.Id); + break; + case PayloadType.Event: + CacheEvent(payload.Id); + break; + } + } + + internal void CacheSession(string reportId) + { + var pendingSession = GetPendingPayload(reportId); + if (pendingSession == null) + { + return; + } + _cacheManager.SaveSessionToCache(pendingSession.PayloadId, pendingSession.Json); + RemovePendingPayload(reportId); + } + + internal void CacheEvent(string reportId) + { + var pendingEvent = GetPendingPayload(reportId); + if (pendingEvent == null) + { + return; + } + _cacheManager.SaveEventToCache(pendingEvent.PayloadId, pendingEvent.Json); + RemovePendingPayload(reportId); + } + + internal void RemovePayload(IPayload payload) + { + RemovePendingPayload(payload.Id); + if (payload.PayloadType == PayloadType.Session) + { + RemoveCachedSession(payload.Id); + } + else + { + RemoveCachedEvent(payload.Id); + } + } + + private void RemovePendingPayload(string id) + { + _pendingPayloads.RemoveAll(item => item.PayloadId == id); + } + + internal void RemoveCachedEvent(string id) + { + _cacheManager.RemoveCachedEvent(id); + } + + internal void RemoveCachedSession(string id) + { + _cacheManager.RemoveCachedSession(id); + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs.meta new file mode 100644 index 000000000..d9e118d67 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fa829d6c2cc1444bcbee92e29f51073f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs new file mode 100644 index 000000000..0d40f65d0 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs @@ -0,0 +1,81 @@ +using System; +using System.Linq; +using System.Reflection; +using BugsnagUnity.Payload; +using UnityEngine; + +namespace BugsnagUnity +{ + internal class PerformanceHelper + { + const string BUGSNAG_PERFORMANCE_ASSEMBLY_NAME = "BugsnagUnityPerformance.BugsnagPerformance"; + const string GET_PERFORMANCE_STATE_METHOD_NAME = "GetPerformanceState"; + + static MethodInfo _getPerformanceStateMethodInfo; + private static bool _isPerformanceLibraryAvailable = true; + + [Serializable] + private class PerformanceState + { + public string currentContextSpanId; + public string currentContextTraceId; + public PerformanceState(string currentContextSpanId, string currentContextTraceId) + { + this.currentContextSpanId = currentContextSpanId; + this.currentContextTraceId = currentContextTraceId; + } + } + + internal static Correlation GetCurrentPerformanceSpanContext() + { + if (!_isPerformanceLibraryAvailable) + { + return null; + } + + try + { + InitializeGetCurrentContextInternalMethodIfNeeded(); + + string result = (string)_getPerformanceStateMethodInfo?.Invoke(null, null); + + if (string.IsNullOrEmpty(result)) + { + return null; + } + + var performanceState = JsonUtility.FromJson(result); + + if (performanceState == null) + { + return null; + } + + var correlation = new Correlation(performanceState.currentContextTraceId, performanceState.currentContextSpanId); + + return correlation; + } + catch + { + // Silently handle case where performance library is not available or out of date + _isPerformanceLibraryAvailable = false; + return null; + } + } + + private static void InitializeGetCurrentContextInternalMethodIfNeeded() + { + if (_getPerformanceStateMethodInfo != null) return; + + var bugsnagPerformanceType = AppDomain.CurrentDomain.GetAssemblies() + .Select(assembly => assembly.GetType(BUGSNAG_PERFORMANCE_ASSEMBLY_NAME)) + .FirstOrDefault(type => type != null); + + _getPerformanceStateMethodInfo = bugsnagPerformanceType?.GetMethod( + GET_PERFORMANCE_STATE_METHOD_NAME, + BindingFlags.NonPublic | BindingFlags.Static + ); + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs.meta new file mode 100644 index 000000000..f657e0d2d --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 55605402ccceb4bc68d6704f39cea8d0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs new file mode 100644 index 000000000..e877fc832 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs @@ -0,0 +1,19 @@ +using System; + +namespace BugsnagUnity.Polyfills +{ + static class String + { + internal static bool IsNullOrWhiteSpace(string s) + { + if (s == null) return true; + + for (int i = 0; i < s.Length; i++) + { + if (!Char.IsWhiteSpace(s[i])) return false; + } + + return true; + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs.meta new file mode 100644 index 000000000..8a8fbb8f8 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 17ed9e2263a0341a289f86ee3f4e8bba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs new file mode 100644 index 000000000..2f58d0bf5 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +namespace BugsnagUnity +{ + public static class PostProcessBuild + { + + class XcodeProjectInformation + { + public LinkedList Lines { get; } + + public LinkedListNode CurrentLine { get; private set; } + + public XcodeProjectInformation(LinkedList lines) + { + Lines = lines; + CurrentLine = lines.First; + } + + public void AdvanceCurrentLine() + { + CurrentLine = CurrentLine.Next; + } + + } + + public static void Apply(LinkedList lines) + { + Apply(lines, Guid.NewGuid().ToString("N").Substring(0, 24).ToUpperInvariant()); + } + + /// + /// Apply the required changes to the lines of the xcode project. + /// + /// Lines. + /// Symbol script upload UUID. + public static void Apply(LinkedList lines, string symbolScriptUploadUuid) + { + + var info = new XcodeProjectInformation(lines); + + while (info.CurrentLine != null) + { + ProcessBuildConfigurationSection(info); + info.AdvanceCurrentLine(); + } + } + + /// + /// Processes the build configuration section. Here we need to enable two + /// build flags relating to certain exception types. + /// + /// Data. + static void ProcessBuildConfigurationSection(XcodeProjectInformation info) + { + if (info.CurrentLine.Value.Equals("/* Begin XCBuildConfiguration section */")) + { + while (info.CurrentLine != null) + { + if (info.CurrentLine.Value.Equals("/* End XCBuildConfiguration section */")) + { + break; + } + + // if these flags are not set at all should we add them? This is all + // that we used to do and we did not handle them not being set at all + if (info.CurrentLine.Value.Contains("GCC_ENABLE_OBJC_EXCEPTIONS") || + info.CurrentLine.Value.Contains("GCC_ENABLE_CPP_EXCEPTIONS")) + { + info.CurrentLine.Value = info.CurrentLine.Value.Replace("NO", "YES"); + } + + info.AdvanceCurrentLine(); + } + } + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs.meta new file mode 100644 index 000000000..6cf562ce3 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 48442eaa9e346462ea7f18e8cbe6e9cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs new file mode 100644 index 000000000..5ee9832b7 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs @@ -0,0 +1,188 @@ +using BugsnagUnity.Payload; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("BugsnagUnity.Tests")] + +namespace BugsnagUnity +{ + public interface ISessionTracker + { + void StartSession(); + + void PauseSession(); + + bool ResumeSession(); + + Session CurrentSession { get; } + + void AddException(Report report); + + void StartManagedSession(); + } + + class SessionTracker : ISessionTracker + { + Client Client { get; } + + Session _currentSession; + + public Session CurrentSession + { + get + { + return GetCurrentSession(); + } + private set => _currentSession = value; + } + + private Session GetCurrentSession() + { + if (ShouldManageSessions()) + { + var session = _currentSession; + + if (session != null && !session.Stopped) + { + return session?.Copy(); + } + return null; + } + else + { + return Client.NativeClient.GetCurrentSession(); + } + + } + + internal SessionTracker(Client client) + { + Client = client; + } + + + public void StartSession() + { + if (ShouldManageSessions()) + { + StartManagedSession(); + } + else + { + Client.NativeClient.StartSession(); + } + } + + public void StartManagedSession() + { + var session = new Session(); + + var app = new App(Client.Configuration); + Client.NativeClient.PopulateApp(app); + session.App = app; + + var device = new Device(Client.Configuration, Client.CacheManager.GetCachedDeviceId()); + Client.NativeClient.PopulateDevice(device); + session.Device = device; + + session.User = Client.GetUser().Clone(); + + foreach (var sessionCallback in Client.Configuration.GetOnSessionCallbacks()) + { + try { + if (!sessionCallback.Invoke(session)) + { + return; + } + } catch { + // If the callback causes an exception, ignore it and execute the next one + } + } + + if (Client.Configuration.Endpoints.IsValid) + { + var payload = new SessionReport(Client.Configuration, session); + if (Client.PayloadManager.AddPendingPayload(payload)) + { + Client.Send(payload); + } + } + else + { + UnityEngine.Debug.LogWarning("Invalid configuration. Configuration.Endpoints is not correctly configured, no sessions will be sent."); + } + + CurrentSession = session; + } + + public void PauseSession() + { + if (ShouldManageSessions()) + { + PauseManagedSession(); + } + else + { + Client.NativeClient.PauseSession(); + } + } + + private void PauseManagedSession() + { + var session = _currentSession; + if (session != null) + { + session.Stopped = true; + } + } + + public bool ResumeSession() + { + if (ShouldManageSessions()) + { + return ResumeManagedSession(); + } + else + { + return Client.NativeClient.ResumeSession(); + } + + } + + private bool ResumeManagedSession() + { + var session = _currentSession; + bool resumed; + if (session == null) + { + StartSession(); + resumed = false; + } + else + { + resumed = session.Stopped; + session.Stopped = false; + } + return resumed; + } + + public void AddException(Report report) + { + if (ShouldManageSessions()) + { + if (_currentSession != null && !_currentSession.Stopped) + { + _currentSession.AddException(report); + } + } + else + { + Client.NativeClient.UpdateSession(report.Session); + } + } + + private bool ShouldManageSessions() + { + return Client.IsUsingFallback(); + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs.meta new file mode 100644 index 000000000..6b3e1f75a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aabb7aa0096804851b0ccac9598b9416 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs new file mode 100644 index 000000000..455d706ff --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace BugsnagUnity +{ + /// + /// The Bugsnag API defines these three severities + /// + public enum Severity + { + Info = 0, + + Warning = 1, + + Error = 2 + } + + static class LogTypeExtensions + { + /// + /// Used to stop the dictionary boxing the value types + /// + class LogTypeComparer : IEqualityComparer + { + public bool Equals(LogType x, LogType y) + { + return x == y; + } + + public int GetHashCode(LogType obj) + { + return (int)obj; + } + } + + /// + /// The LogType enum from Unity doesn't have its enum values in an expected + /// numerical order. This allows us to map them to something that we would + /// expect. + /// + private static Dictionary LogTypeMapping { get; } = new Dictionary(5, new LogTypeComparer()) + { + { LogType.Log, 0 }, + { LogType.Warning, 1 }, + { LogType.Assert, 2 }, + { LogType.Error, 3 }, + { LogType.Exception, 4 }, + }; + + internal static bool IsGreaterThanOrEqualTo(this LogType logType, LogType log) + { + return LogTypeMapping[logType] >= LogTypeMapping[log]; + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs.meta new file mode 100644 index 000000000..b11a2acd0 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4ad81466bd7584b28989213795381be0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs new file mode 100644 index 000000000..438a8db3a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs @@ -0,0 +1,2190 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) 2011, The Outercurve Foundation. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.opensource.org/licenses/mit-license.php +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Nathan Totten (ntotten.com), Jim Zimmerman (jimzimmerman.com) and Prabir Shrestha (prabir.me) +// https://github.com/facebook-csharp-sdk/simple-json +//----------------------------------------------------------------------- + +// VERSION: + +// NOTE: uncomment the following line to make SimpleJson class internal. +#define SIMPLE_JSON_INTERNAL + +// NOTE: uncomment the following line to make JsonArray and JsonObject class internal. +#define SIMPLE_JSON_OBJARRAYINTERNAL + +// NOTE: uncomment the following line to enable dynamic support. +//#define SIMPLE_JSON_DYNAMIC + +// NOTE: uncomment the following line to enable DataContract support. +//#define SIMPLE_JSON_DATACONTRACT + +// NOTE: uncomment the following line to enable IReadOnlyCollection and IReadOnlyList support. +//#define SIMPLE_JSON_READONLY_COLLECTIONS + +// NOTE: uncomment the following line to disable linq expressions/compiled lambda (better performance) instead of method.invoke(). +// define if you are using .net framework <= 3.0 or < WP7.5 +//#define SIMPLE_JSON_NO_LINQ_EXPRESSION + +// NOTE: uncomment the following line if you are compiling under Window Metro style application/library. +// usually already defined in properties +//#define NETFX_CORE; + +// If you are targetting WinStore, WP8 and NET4.5+ PCL make sure to #define SIMPLE_JSON_TYPEINFO; + +// original json parsing code from http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html + +#if NETFX_CORE || NETSTANDARD1_3 || NETSTANDARD2_0 +#define SIMPLE_JSON_TYPEINFO +#endif + +using System; +using System.IO; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +#if !SIMPLE_JSON_NO_LINQ_EXPRESSION +using System.Linq.Expressions; +#endif +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; +#if SIMPLE_JSON_DYNAMIC +using System.Dynamic; +#endif +using System.Globalization; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; +using BugsnagUnity.Reflection; + +// ReSharper disable LoopCanBeConvertedToQuery +// ReSharper disable RedundantExplicitArrayCreation +// ReSharper disable SuggestUseVarKeywordEvident +namespace BugsnagUnity +{ + /// + /// Represents the json array. + /// + [GeneratedCode("simple-json", "1.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] +#if SIMPLE_JSON_OBJARRAYINTERNAL + internal +#else + public +#endif + class JsonArray : List + { + /// + /// Initializes a new instance of the class. + /// + public JsonArray() { } + + /// + /// Initializes a new instance of the class. + /// + /// The capacity of the json array. + public JsonArray(int capacity) : base(capacity) { } + } + + /// + /// Represents the json object. + /// + [GeneratedCode("simple-json", "1.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] +#if SIMPLE_JSON_OBJARRAYINTERNAL + internal +#else + public +#endif + class JsonObject : +#if SIMPLE_JSON_DYNAMIC + DynamicObject, +#endif + IDictionary + { + /// + /// The internal member dictionary. + /// + private readonly Dictionary _members; + + /// + /// Initializes a new instance of . + /// + public JsonObject() + { + _members = new Dictionary(); + } + + public Dictionary GetDictionary() + { + var dictionary = new Dictionary(); + + foreach (var item in _members) + { + if (item.Value is JsonObject json) + { + dictionary.Add(item.Key, json.GetDictionary()); + } + else + { + dictionary.Add(item.Key, item.Value); + } + } + + return dictionary; + + } + + /// + /// Initializes a new instance of . + /// + /// The implementation to use when comparing keys, or null to use the default for the type of the key. + public JsonObject(IEqualityComparer comparer) + { + _members = new Dictionary(comparer); + } + + /// + /// Gets the at the specified index. + /// + /// + public object this[int index] + { + get { return GetAtIndex(_members, index); } + } + + internal static object GetAtIndex(IDictionary obj, int index) + { + if (obj == null) + throw new ArgumentNullException("obj"); + if (index >= obj.Count) + throw new ArgumentOutOfRangeException("index"); + int i = 0; + foreach (KeyValuePair o in obj) + if (i++ == index) return o.Value; + return null; + } + + /// + /// Adds the specified key. + /// + /// The key. + /// The value. + public void Add(string key, object value) + { + _members.Add(key, value); + } + + /// + /// Determines whether the specified key contains key. + /// + /// The key. + /// + /// true if the specified key contains key; otherwise, false. + /// + public bool ContainsKey(string key) + { + return _members.ContainsKey(key); + } + + /// + /// Gets the keys. + /// + /// The keys. + public ICollection Keys + { + get { return _members.Keys; } + } + + /// + /// Removes the specified key. + /// + /// The key. + /// + public bool Remove(string key) + { + return _members.Remove(key); + } + + /// + /// Tries the get value. + /// + /// The key. + /// The value. + /// + public bool TryGetValue(string key, out object value) + { + return _members.TryGetValue(key, out value); + } + + /// + /// Gets the values. + /// + /// The values. + public ICollection Values + { + get { return _members.Values; } + } + + /// + /// Gets or sets the with the specified key. + /// + /// + public object this[string key] + { + get { return _members[key]; } + set { _members[key] = value; } + } + + /// + /// Adds the specified item. + /// + /// The item. + public void Add(KeyValuePair item) + { + _members.Add(item.Key, item.Value); + } + + /// + /// Clears this instance. + /// + public void Clear() + { + _members.Clear(); + } + + /// + /// Determines whether [contains] [the specified item]. + /// + /// The item. + /// + /// true if [contains] [the specified item]; otherwise, false. + /// + public bool Contains(KeyValuePair item) + { + return _members.ContainsKey(item.Key) && _members[item.Key] == item.Value; + } + + /// + /// Copies to. + /// + /// The array. + /// Index of the array. + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + if (array == null) throw new ArgumentNullException("array"); + int num = Count; + foreach (KeyValuePair kvp in this) + { + array[arrayIndex++] = kvp; + if (--num <= 0) + return; + } + } + + /// + /// Gets the count. + /// + /// The count. + public int Count + { + get { return _members.Count; } + } + + /// + /// Gets a value indicating whether this instance is read only. + /// + /// + /// true if this instance is read only; otherwise, false. + /// + public bool IsReadOnly + { + get { return false; } + } + + /// + /// Removes the specified item. + /// + /// The item. + /// + public bool Remove(KeyValuePair item) + { + return _members.Remove(item.Key); + } + + /// + /// Gets the enumerator. + /// + /// + public IEnumerator> GetEnumerator() + { + return _members.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// + /// An object that can be used to iterate through the collection. + /// + IEnumerator IEnumerable.GetEnumerator() + { + return _members.GetEnumerator(); + } + +#if SIMPLE_JSON_DYNAMIC + /// + /// Provides implementation for type conversion operations. Classes derived from the class can override this method to specify dynamic behavior for operations that convert an object from one type to another. + /// + /// Provides information about the conversion operation. The binder.Type property provides the type to which the object must be converted. For example, for the statement (String)sampleObject in C# (CType(sampleObject, Type) in Visual Basic), where sampleObject is an instance of the class derived from the class, binder.Type returns the type. The binder.Explicit property provides information about the kind of conversion that occurs. It returns true for explicit conversion and false for implicit conversion. + /// The result of the type conversion operation. + /// + /// Alwasy returns true. + /// + public override bool TryConvert(ConvertBinder binder, out object result) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + Type targetType = binder.Type; + + if ((targetType == typeof(IEnumerable)) || + (targetType == typeof(IEnumerable>)) || + (targetType == typeof(IDictionary)) || + (targetType == typeof(IDictionary))) + { + result = this; + return true; + } + + return base.TryConvert(binder, out result); + } + + /// + /// Provides the implementation for operations that delete an object member. This method is not intended for use in C# or Visual Basic. + /// + /// Provides information about the deletion. + /// + /// Alwasy returns true. + /// + public override bool TryDeleteMember(DeleteMemberBinder binder) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + return _members.Remove(binder.Name); + } + + /// + /// Provides the implementation for operations that get a value by index. Classes derived from the class can override this method to specify dynamic behavior for indexing operations. + /// + /// Provides information about the operation. + /// The indexes that are used in the operation. For example, for the sampleObject[3] operation in C# (sampleObject(3) in Visual Basic), where sampleObject is derived from the DynamicObject class, is equal to 3. + /// The result of the index operation. + /// + /// Alwasy returns true. + /// + public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) + { + if (indexes == null) throw new ArgumentNullException("indexes"); + if (indexes.Length == 1) + { + result = ((IDictionary)this)[(string)indexes[0]]; + return true; + } + result = null; + return true; + } + + /// + /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . + /// + /// Alwasy returns true. + /// + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + object value; + if (_members.TryGetValue(binder.Name, out value)) + { + result = value; + return true; + } + result = null; + return true; + } + + /// + /// Provides the implementation for operations that set a value by index. Classes derived from the class can override this method to specify dynamic behavior for operations that access objects by a specified index. + /// + /// Provides information about the operation. + /// The indexes that are used in the operation. For example, for the sampleObject[3] = 10 operation in C# (sampleObject(3) = 10 in Visual Basic), where sampleObject is derived from the class, is equal to 3. + /// The value to set to the object that has the specified index. For example, for the sampleObject[3] = 10 operation in C# (sampleObject(3) = 10 in Visual Basic), where sampleObject is derived from the class, is equal to 10. + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown. + /// + public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value) + { + if (indexes == null) throw new ArgumentNullException("indexes"); + if (indexes.Length == 1) + { + ((IDictionary)this)[(string)indexes[0]] = value; + return true; + } + return base.TrySetIndex(binder, indexes, value); + } + + /// + /// Provides the implementation for operations that set member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as setting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member to which the value is being assigned. For example, for the statement sampleObject.SampleProperty = "Test", where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The value to set to the member. For example, for sampleObject.SampleProperty = "Test", where sampleObject is an instance of the class derived from the class, the is "Test". + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown.) + /// + public override bool TrySetMember(SetMemberBinder binder, object value) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + _members[binder.Name] = value; + return true; + } + + /// + /// Returns the enumeration of all dynamic member names. + /// + /// + /// A sequence that contains dynamic member names. + /// + public override IEnumerable GetDynamicMemberNames() + { + foreach (var key in Keys) + yield return key; + } +#endif + } +} + +namespace BugsnagUnity +{ + /// + /// This class encodes and decodes JSON strings. + /// Spec. details, see http://www.json.org/ + /// + /// JSON uses Arrays and Objects. These correspond here to the datatypes JsonArray(IList<object>) and JsonObject(IDictionary<string,object>). + /// All numbers are parsed to doubles. + /// + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + static class SimpleJson + { + private const int TOKEN_NONE = 0; + private const int TOKEN_CURLY_OPEN = 1; + private const int TOKEN_CURLY_CLOSE = 2; + private const int TOKEN_SQUARED_OPEN = 3; + private const int TOKEN_SQUARED_CLOSE = 4; + private const int TOKEN_COLON = 5; + private const int TOKEN_COMMA = 6; + private const int TOKEN_STRING = 7; + private const int TOKEN_NUMBER = 8; + private const int TOKEN_TRUE = 9; + private const int TOKEN_FALSE = 10; + private const int TOKEN_NULL = 11; + private const int BUILDER_CAPACITY = 2000; + + private static readonly char[] EscapeTable; + private static readonly char[] EscapeCharacters; + private static readonly string EscapeCharactersString = new string(EscapeCharacters); + + static SimpleJson() + { + var escapeCharacters = new List() { '"', '\\', '\b', '\f', '\n', '\r', '\t' }; + + EscapeTable = new char[159]; + foreach (char item in System.Linq.Enumerable.Range(0, 32)) + { + escapeCharacters.Add(item); + EscapeTable[item] = '!'; + } + + foreach (char item in System.Linq.Enumerable.Range(127, 32)) + { + escapeCharacters.Add(item); + EscapeTable[item] = '!'; + } + + EscapeCharacters = escapeCharacters.ToArray(); + + EscapeTable['"'] = '"'; + EscapeTable['\\'] = '\\'; + EscapeTable['\b'] = 'b'; + EscapeTable['\f'] = 'f'; + EscapeTable['\n'] = 'n'; + EscapeTable['\r'] = 'r'; + EscapeTable['\t'] = 't'; + } + + /// + /// Parses the string json into a value + /// + /// A JSON string. + /// An IList<object>, a IDictionary<string,object>, a double, a string, null, true, or false + public static object DeserializeObject(string json) + { + object obj; + if (TryDeserializeObject(json, out obj)) + return obj; + throw new SerializationException("Invalid JSON string"); + } + + /// + /// Try parsing the json string into a value. + /// + /// + /// A JSON string. + /// + /// + /// The object. + /// + /// + /// Returns true if successfull otherwise false. + /// + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + public static bool TryDeserializeObject(string json, out object obj) + { + bool success = true; + if (json != null) + { + char[] charArray = json.ToCharArray(); + int index = 0; + obj = ParseValue(charArray, ref index, ref success); + } + else + obj = null; + + return success; + } + + public static object DeserializeObject(string json, Type type, IJsonSerializerStrategy jsonSerializerStrategy) + { + object jsonObject = DeserializeObject(json); + return type == null || jsonObject != null && ReflectionUtils.IsAssignableFrom(jsonObject.GetType(), type) + ? jsonObject + : (jsonSerializerStrategy ?? CurrentJsonSerializerStrategy).DeserializeObject(jsonObject, type); + } + + public static object DeserializeObject(string json, Type type) + { + return DeserializeObject(json, type, null); + } + + public static T DeserializeObject(string json, IJsonSerializerStrategy jsonSerializerStrategy) + { + return (T)DeserializeObject(json, typeof(T), jsonSerializerStrategy); + } + + public static T DeserializeObject(string json) + { + return (T)DeserializeObject(json, typeof(T), null); + } + + /// + /// Converts a IDictionary<string,object> / IList<object> object into a JSON string + /// + /// A IDictionary<string,object> / IList<object> + /// Serializer strategy to use + /// + /// A JSON encoded string, or null if object 'json' is not serializable + public static void SerializeObject(object json, StreamWriter writer, IJsonSerializerStrategy jsonSerializerStrategy, IDictionary seen) + { + SerializeObject(json, writer, jsonSerializerStrategy, seen, new Dictionary()); + } + + public static void SerializeObject(object json, StreamWriter writer, IJsonSerializerStrategy jsonSerializerStrategy, IDictionary seen, IDictionary filters) + { + SerializeValue(jsonSerializerStrategy, json, writer, seen, filters, false); + } + + public static void SerializeObject(object json, StreamWriter writer) + { + SerializeObject(json, writer, new Dictionary()); + } + + public static void SerializeObject(object json, StreamWriter writer, IDictionary filters) + { + SerializeObject(json, writer, CurrentJsonSerializerStrategy, new Dictionary(), filters); + } + + public static string EscapeToJavascriptString(string jsonString) + { + if (string.IsNullOrEmpty(jsonString)) + return jsonString; + + StringBuilder sb = new StringBuilder(); + char c; + + for (int i = 0; i < jsonString.Length;) + { + c = jsonString[i++]; + + if (c == '\\') + { + int remainingLength = jsonString.Length - i; + if (remainingLength >= 2) + { + char lookahead = jsonString[i]; + if (lookahead == '\\') + { + sb.Append('\\'); + ++i; + } + else if (lookahead == '"') + { + sb.Append("\""); + ++i; + } + else if (lookahead == 't') + { + sb.Append('\t'); + ++i; + } + else if (lookahead == 'b') + { + sb.Append('\b'); + ++i; + } + else if (lookahead == 'n') + { + sb.Append('\n'); + ++i; + } + else if (lookahead == 'r') + { + sb.Append('\r'); + ++i; + } + } + } + else + { + sb.Append(c); + } + } + return sb.ToString(); + } + + static IDictionary ParseObject(char[] json, ref int index, ref bool success) + { + IDictionary table = new JsonObject(); + int token; + + // { + NextToken(json, ref index); + + bool done = false; + while (!done) + { + token = LookAhead(json, index); + if (token == TOKEN_NONE) + { + success = false; + return null; + } + else if (token == TOKEN_COMMA) + NextToken(json, ref index); + else if (token == TOKEN_CURLY_CLOSE) + { + NextToken(json, ref index); + return table; + } + else + { + // name + string name = ParseString(json, ref index, ref success); + if (!success) + { + success = false; + return null; + } + // : + token = NextToken(json, ref index); + if (token != TOKEN_COLON) + { + success = false; + return null; + } + // value + object value = ParseValue(json, ref index, ref success); + if (!success) + { + success = false; + return null; + } + table[name] = value; + } + } + return table; + } + + static JsonArray ParseArray(char[] json, ref int index, ref bool success) + { + JsonArray array = new JsonArray(); + + // [ + NextToken(json, ref index); + + bool done = false; + while (!done) + { + int token = LookAhead(json, index); + if (token == TOKEN_NONE) + { + success = false; + return null; + } + else if (token == TOKEN_COMMA) + NextToken(json, ref index); + else if (token == TOKEN_SQUARED_CLOSE) + { + NextToken(json, ref index); + break; + } + else + { + object value = ParseValue(json, ref index, ref success); + if (!success) + return null; + array.Add(value); + } + } + return array; + } + + static object ParseValue(char[] json, ref int index, ref bool success) + { + switch (LookAhead(json, index)) + { + case TOKEN_STRING: + return ParseString(json, ref index, ref success); + case TOKEN_NUMBER: + return ParseNumber(json, ref index, ref success); + case TOKEN_CURLY_OPEN: + return ParseObject(json, ref index, ref success); + case TOKEN_SQUARED_OPEN: + return ParseArray(json, ref index, ref success); + case TOKEN_TRUE: + NextToken(json, ref index); + return true; + case TOKEN_FALSE: + NextToken(json, ref index); + return false; + case TOKEN_NULL: + NextToken(json, ref index); + return null; + case TOKEN_NONE: + break; + } + success = false; + return null; + } + + static string ParseString(char[] json, ref int index, ref bool success) + { + StringBuilder s = new StringBuilder(BUILDER_CAPACITY); + char c; + + EatWhitespace(json, ref index); + + // " + c = json[index++]; + bool complete = false; + while (!complete) + { + if (index == json.Length) + break; + + c = json[index++]; + if (c == '"') + { + complete = true; + break; + } + else if (c == '\\') + { + if (index == json.Length) + break; + c = json[index++]; + if (c == '"') + s.Append('"'); + else if (c == '\\') + s.Append('\\'); + else if (c == '/') + s.Append('/'); + else if (c == 'b') + s.Append('\b'); + else if (c == 'f') + s.Append('\f'); + else if (c == 'n') + s.Append('\n'); + else if (c == 'r') + s.Append('\r'); + else if (c == 't') + s.Append('\t'); + else if (c == 'u') + { + int remainingLength = json.Length - index; + if (remainingLength >= 4) + { + // parse the 32 bit hex into an integer codepoint + uint codePoint; + if (!(success = UInt32.TryParse(new string(json, index, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out codePoint))) + return ""; + + // convert the integer codepoint to a unicode char and add to string + if (0xD800 <= codePoint && codePoint <= 0xDBFF) // if high surrogate + { + index += 4; // skip 4 chars + remainingLength = json.Length - index; + if (remainingLength >= 6) + { + uint lowCodePoint; + if (new string(json, index, 2) == "\\u" && UInt32.TryParse(new string(json, index + 2, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out lowCodePoint)) + { + if (0xDC00 <= lowCodePoint && lowCodePoint <= 0xDFFF) // if low surrogate + { + s.Append((char)codePoint); + s.Append((char)lowCodePoint); + index += 6; // skip 6 chars + continue; + } + } + } + success = false; // invalid surrogate pair + return ""; + } + s.Append(ConvertFromUtf32((int)codePoint)); + // skip 4 chars + index += 4; + } + else + break; + } + } + else + s.Append(c); + } + if (!complete) + { + success = false; + return null; + } + return s.ToString(); + } + + private static string ConvertFromUtf32(int utf32) + { + // http://www.java2s.com/Open-Source/CSharp/2.6.4-mono-.net-core/System/System/Char.cs.htm + if (utf32 < 0 || utf32 > 0x10FFFF) + throw new ArgumentOutOfRangeException("utf32", "The argument must be from 0 to 0x10FFFF."); + if (0xD800 <= utf32 && utf32 <= 0xDFFF) + throw new ArgumentOutOfRangeException("utf32", "The argument must not be in surrogate pair range."); + if (utf32 < 0x10000) + return new string((char)utf32, 1); + utf32 -= 0x10000; + return new string(new char[] { (char)((utf32 >> 10) + 0xD800), (char)(utf32 % 0x0400 + 0xDC00) }); + } + + static object ParseNumber(char[] json, ref int index, ref bool success) + { + EatWhitespace(json, ref index); + int lastIndex = GetLastIndexOfNumber(json, index); + int charLength = (lastIndex - index) + 1; + object returnNumber; + string str = new string(json, index, charLength); + if (str.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 || str.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1) + { + double number; + success = double.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + else + { + long number; + success = long.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + index = lastIndex + 1; + return returnNumber; + } + + static int GetLastIndexOfNumber(char[] json, int index) + { + int lastIndex; + for (lastIndex = index; lastIndex < json.Length; lastIndex++) + if ("0123456789+-.eE".IndexOf(json[lastIndex]) == -1) break; + return lastIndex - 1; + } + + static void EatWhitespace(char[] json, ref int index) + { + for (; index < json.Length; index++) + if (" \t\n\r\b\f".IndexOf(json[index]) == -1) break; + } + + static int LookAhead(char[] json, int index) + { + int saveIndex = index; + return NextToken(json, ref saveIndex); + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + static int NextToken(char[] json, ref int index) + { + EatWhitespace(json, ref index); + if (index == json.Length) + return TOKEN_NONE; + char c = json[index]; + index++; + switch (c) + { + case '{': + return TOKEN_CURLY_OPEN; + case '}': + return TOKEN_CURLY_CLOSE; + case '[': + return TOKEN_SQUARED_OPEN; + case ']': + return TOKEN_SQUARED_CLOSE; + case ',': + return TOKEN_COMMA; + case '"': + return TOKEN_STRING; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + return TOKEN_NUMBER; + case ':': + return TOKEN_COLON; + } + index--; + int remainingLength = json.Length - index; + // false + if (remainingLength >= 5) + { + if (json[index] == 'f' && json[index + 1] == 'a' && json[index + 2] == 'l' && json[index + 3] == 's' && json[index + 4] == 'e') + { + index += 5; + return TOKEN_FALSE; + } + } + // true + if (remainingLength >= 4) + { + if (json[index] == 't' && json[index + 1] == 'r' && json[index + 2] == 'u' && json[index + 3] == 'e') + { + index += 4; + return TOKEN_TRUE; + } + } + // null + if (remainingLength >= 4) + { + if (json[index] == 'n' && json[index + 1] == 'u' && json[index + 2] == 'l' && json[index + 3] == 'l') + { + index += 4; + return TOKEN_NULL; + } + } + return TOKEN_NONE; + } + + static bool SerializeValue(IJsonSerializerStrategy jsonSerializerStrategy, object value, StreamWriter writer, IDictionary seen, IDictionary filters, bool applyFilters) + { + bool success; + switch (value) + { + case String s: + success = SerializeString(s, writer); + break; + case BugsnagUnity.IFilterable filterable: + if (seen.Contains(filterable)) return SerializeString("[Circular]", writer); + seen.Add(filterable, true); + success = SerializeObject(jsonSerializerStrategy, filterable.Keys, filterable.Values, writer, seen, filters, true); + seen.Remove(filterable); + break; + case IDictionary dict: + if (seen.Contains(dict)) return SerializeString("[Circular]", writer); + seen.Add(dict, true); + success = SerializeObject(jsonSerializerStrategy, dict.Keys, dict.Values, writer, seen, filters, applyFilters); + seen.Remove(dict); + break; + case IDictionary dict: + if (seen.Contains(dict)) return SerializeString("[Circular]", writer); + seen.Add(dict, true); + success = SerializeObject(jsonSerializerStrategy, dict.Keys, dict.Values, writer, seen, filters, applyFilters); + seen.Remove(dict); + break; + case IDictionary dict: + if (seen.Contains(dict)) return SerializeString("[Circular]", writer); + seen.Add(dict, true); + success = SerializeObject(jsonSerializerStrategy, dict.Keys, dict.Values, writer, seen, filters, applyFilters); + seen.Remove(dict); + break; + case IEnumerable enumerable: + if (seen.Contains(enumerable)) return SerializeString("[Circular]", writer); + seen.Add(enumerable, true); + success = SerializeArray(jsonSerializerStrategy, enumerable, writer, seen, filters, applyFilters); + seen.Remove(enumerable); + break; + case sbyte _: + case byte _: + case short _: + case ushort _: + case int _: + case uint _: + case long _: + case ulong _: + case float _: + case double _: + case decimal _: + success = SerializeNumber(value, writer); + break; + case bool @bool: + writer.Write(@bool ? "true" : "false"); + success = true; + break; + case null: + writer.Write("null"); + success = true; + break; + default: + if (seen.Contains(value)) return SerializeString("[Circular]", writer); + seen.Add(value, true); + object serializedObject; + success = jsonSerializerStrategy.TrySerializeNonPrimitiveObject(value, out serializedObject); + if (success) + { + SerializeValue(jsonSerializerStrategy, serializedObject, writer, seen, filters, applyFilters); + } + seen.Remove(value); + break; + } + return success; + } + + static bool SerializeObject(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable keys, IEnumerable values, StreamWriter writer, IDictionary seen, IDictionary filters, bool applyFilters) + { + writer.Write("{"); + IEnumerator ke = keys.GetEnumerator(); + IEnumerator ve = values.GetEnumerator(); + bool first = true; + while (ke.MoveNext() && ve.MoveNext()) + { + object key = ke.Current; + object value = ve.Current; + if (!first) + writer.Write(","); + string stringKey = key as string; + if (stringKey != null) + SerializeString(stringKey, writer); + else + if (!SerializeValue(jsonSerializerStrategy, value, writer, seen, filters, applyFilters)) return false; + writer.Write(":"); + if (applyFilters && filters.Contains(key)) + SerializeString("[Filtered]", writer); + else if (!SerializeValue(jsonSerializerStrategy, value, writer, seen, filters, applyFilters)) + return false; + first = false; + } + writer.Write("}"); + return true; + } + + static bool SerializeArray(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable anArray, StreamWriter writer, IDictionary seen, IDictionary filters, bool applyFilters) + { + writer.Write("["); + bool first = true; + foreach (object value in anArray) + { + if (!first) + writer.Write(","); + if (!SerializeValue(jsonSerializerStrategy, value, writer, seen, filters, applyFilters)) + return false; + first = false; + } + writer.Write("]"); + return true; + } + + static bool SerializeString(string aString, StreamWriter writer) + { + // Happy path if there's nothing to be escaped. IndexOfAny is highly optimized (and unmanaged) + if (aString.IndexOfAny(EscapeCharacters) == -1) + { + writer.Write("\"{0}\"", aString); + return true; + } + + writer.Write('"'); + var hexSeqBuffer = new char[4]; + int safeCharacterCount = 0; + char[] charArray = aString.ToCharArray(); + + for (int i = 0; i < charArray.Length; i++) + { + char c = charArray[i]; + + // Non ascii characters are fine, buffer them up and send them to the builder + // in larger chunks if possible. The escape table is a 1:1 translation table + // with \0 [default(char)] denoting a safe character. + if (c >= EscapeTable.Length || EscapeTable[c] == default(char)) + { + safeCharacterCount++; + } + else + { + if (safeCharacterCount > 0) + { + writer.Write(charArray, i - safeCharacterCount, safeCharacterCount); + safeCharacterCount = 0; + } + + writer.Write('\\'); + + if (EscapeTable[c] == '!') + { + IntToHex(c, hexSeqBuffer); + writer.Write('u'); + writer.Write(hexSeqBuffer); + } + else + { + writer.Write(EscapeTable[c]); + } + } + } + + if (safeCharacterCount > 0) + { + writer.Write(charArray, charArray.Length - safeCharacterCount, safeCharacterCount); + } + + writer.Write('"'); + return true; + } + + static void IntToHex(int value, char[] hex) + { + for (var i = 0; i < 4; i++) + { + var num = value % 16; + if (num < 10) + { + hex[3 - i] = (char)('0' + num); + } + else + { + hex[3 - i] = (char)('A' + (num - 10)); + } + value >>= 4; + } + } + + static bool SerializeNumber(object number, StreamWriter writer) + { + if (number is long) + writer.Write(((long)number).ToString(CultureInfo.InvariantCulture)); + else if (number is ulong) + writer.Write(((ulong)number).ToString(CultureInfo.InvariantCulture)); + else if (number is int) + writer.Write(((int)number).ToString(CultureInfo.InvariantCulture)); + else if (number is uint) + writer.Write(((uint)number).ToString(CultureInfo.InvariantCulture)); + else if (number is decimal) + writer.Write(((decimal)number).ToString(CultureInfo.InvariantCulture)); + else if (number is float) + writer.Write(((float)number).ToString(CultureInfo.InvariantCulture)); + else + writer.Write(Convert.ToDouble(number, CultureInfo.InvariantCulture).ToString("r", CultureInfo.InvariantCulture)); + return true; + } + + private static IJsonSerializerStrategy _currentJsonSerializerStrategy; + public static IJsonSerializerStrategy CurrentJsonSerializerStrategy + { + get + { + return _currentJsonSerializerStrategy ?? + (_currentJsonSerializerStrategy = +#if SIMPLE_JSON_DATACONTRACT + DataContractJsonSerializerStrategy +#else + PocoJsonSerializerStrategy +#endif +); + } + set + { + _currentJsonSerializerStrategy = value; + } + } + + private static PocoJsonSerializerStrategy _pocoJsonSerializerStrategy; + [EditorBrowsable(EditorBrowsableState.Advanced)] + public static PocoJsonSerializerStrategy PocoJsonSerializerStrategy + { + get + { + return _pocoJsonSerializerStrategy ?? (_pocoJsonSerializerStrategy = new PocoJsonSerializerStrategy()); + } + } + +#if SIMPLE_JSON_DATACONTRACT + + private static DataContractJsonSerializerStrategy _dataContractJsonSerializerStrategy; + [System.ComponentModel.EditorBrowsable(EditorBrowsableState.Advanced)] + public static DataContractJsonSerializerStrategy DataContractJsonSerializerStrategy + { + get + { + return _dataContractJsonSerializerStrategy ?? (_dataContractJsonSerializerStrategy = new DataContractJsonSerializerStrategy()); + } + } + +#endif + } + + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + interface IJsonSerializerStrategy + { + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + bool TrySerializeNonPrimitiveObject(object input, out object output); + object DeserializeObject(object value, Type type); + } + + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + class PocoJsonSerializerStrategy : IJsonSerializerStrategy + { + internal IDictionary ConstructorCache; + internal IDictionary> GetCache; + internal IDictionary>> SetCache; + + internal static readonly Type[] EmptyTypes = new Type[0]; + internal static readonly Type[] ArrayConstructorParameterTypes = new Type[] { typeof(int) }; + + private static readonly string[] Iso8601Format = new string[] + { + @"yyyy-MM-dd\THH:mm:ss.FFFFFFF\Z", + @"yyyy-MM-dd\THH:mm:ss\Z", + @"yyyy-MM-dd\THH:mm:ssK" + }; + + public PocoJsonSerializerStrategy() + { + ConstructorCache = new ReflectionUtils.ThreadSafeDictionary(ContructorDelegateFactory); + GetCache = new ReflectionUtils.ThreadSafeDictionary>(GetterValueFactory); + SetCache = new ReflectionUtils.ThreadSafeDictionary>>(SetterValueFactory); + } + + protected virtual string MapClrMemberNameToJsonFieldName(string clrPropertyName) + { + return clrPropertyName; + } + + internal virtual ReflectionUtils.ConstructorDelegate ContructorDelegateFactory(Type key) + { + return ReflectionUtils.GetContructor(key, key.IsArray ? ArrayConstructorParameterTypes : EmptyTypes); + } + + internal virtual IDictionary GetterValueFactory(Type type) + { + IDictionary result = new Dictionary(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanRead) + { + MethodInfo getMethod = ReflectionUtils.GetGetterMethodInfo(propertyInfo); + if (getMethod.IsStatic || !getMethod.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(propertyInfo.Name)] = ReflectionUtils.GetGetMethod(propertyInfo); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (fieldInfo.IsStatic || !fieldInfo.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(fieldInfo.Name)] = ReflectionUtils.GetGetMethod(fieldInfo); + } + return result; + } + + internal virtual IDictionary> SetterValueFactory(Type type) + { + IDictionary> result = new Dictionary>(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanWrite) + { + MethodInfo setMethod = ReflectionUtils.GetSetterMethodInfo(propertyInfo); + if (setMethod.IsStatic || !setMethod.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(propertyInfo.Name)] = new KeyValuePair(propertyInfo.PropertyType, ReflectionUtils.GetSetMethod(propertyInfo)); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (fieldInfo.IsInitOnly || fieldInfo.IsStatic || !fieldInfo.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(fieldInfo.Name)] = new KeyValuePair(fieldInfo.FieldType, ReflectionUtils.GetSetMethod(fieldInfo)); + } + return result; + } + + public virtual bool TrySerializeNonPrimitiveObject(object input, out object output) + { + return TrySerializeKnownTypes(input, out output) || TrySerializeUnknownTypes(input, out output); + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + public virtual object DeserializeObject(object value, Type type) + { + if (type == null) throw new ArgumentNullException("type"); + string str = value as string; + + if (type == typeof(Guid) && string.IsNullOrEmpty(str)) + return default(Guid); + + if (value == null) + return null; + + object obj = null; + + if (str != null) + { + if (str.Length != 0) // We know it can't be null now. + { + if (type == typeof(DateTime) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTime))) + return DateTime.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); + if (type == typeof(DateTimeOffset) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTimeOffset))) + return DateTimeOffset.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); + if (type == typeof(Guid) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid))) + return new Guid(str); + if (type == typeof(Uri)) + { + bool isValid = Uri.IsWellFormedUriString(str, UriKind.RelativeOrAbsolute); + + Uri result; + if (isValid && Uri.TryCreate(str, UriKind.RelativeOrAbsolute, out result)) + return result; + + return null; + } + + if (type == typeof(string)) + return str; + + return Convert.ChangeType(str, type, CultureInfo.InvariantCulture); + } + else + { + if (type == typeof(Guid)) + obj = default(Guid); + else if (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) + obj = null; + else + obj = str; + } + // Empty string case + if (!ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) + return str; + } + else if (value is bool) + return value; + + bool valueIsLong = value is long; + bool valueIsDouble = value is double; + if ((valueIsLong && type == typeof(long)) || (valueIsDouble && type == typeof(double))) + return value; + if ((valueIsDouble && type != typeof(double)) || (valueIsLong && type != typeof(long))) + { + obj = type == typeof(int) || type == typeof(long) || type == typeof(double) || type == typeof(float) || type == typeof(bool) || type == typeof(decimal) || type == typeof(byte) || type == typeof(short) + ? Convert.ChangeType(value, type, CultureInfo.InvariantCulture) + : value; + } + else + { + IDictionary objects = value as IDictionary; + if (objects != null) + { + IDictionary jsonObject = objects; + + if (ReflectionUtils.IsTypeDictionary(type)) + { + // if dictionary then + Type[] types = ReflectionUtils.GetGenericTypeArguments(type); + Type keyType = types[0]; + Type valueType = types[1]; + + Type genericType = typeof(Dictionary<,>).MakeGenericType(keyType, valueType); + + IDictionary dict = (IDictionary)ConstructorCache[genericType](); + + foreach (KeyValuePair kvp in jsonObject) + dict.Add(kvp.Key, DeserializeObject(kvp.Value, valueType)); + + obj = dict; + } + else + { + if (type == typeof(object)) + obj = value; + else + { + obj = ConstructorCache[type](); + foreach (KeyValuePair> setter in SetCache[type]) + { + object jsonValue; + if (jsonObject.TryGetValue(setter.Key, out jsonValue)) + { + jsonValue = DeserializeObject(jsonValue, setter.Value.Key); + setter.Value.Value(obj, jsonValue); + } + } + } + } + } + else + { + IList valueAsList = value as IList; + if (valueAsList != null) + { + IList jsonObject = valueAsList; + IList list = null; + + if (type.IsArray) + { + list = (IList)ConstructorCache[type](jsonObject.Count); + int i = 0; + foreach (object o in jsonObject) + list[i++] = DeserializeObject(o, type.GetElementType()); + } + else if (ReflectionUtils.IsTypeGenericeCollectionInterface(type) || ReflectionUtils.IsAssignableFrom(typeof(IList), type)) + { + Type innerType = ReflectionUtils.GetGenericListElementType(type); + list = (IList)(ConstructorCache[type] ?? ConstructorCache[typeof(List<>).MakeGenericType(innerType)])(jsonObject.Count); + foreach (object o in jsonObject) + list.Add(DeserializeObject(o, innerType)); + } + obj = list; + } + } + return obj; + } + if (ReflectionUtils.IsNullableType(type)) + return ReflectionUtils.ToNullableType(obj, type); + return obj; + } + + protected virtual object SerializeEnum(Enum p) + { + return Convert.ToDouble(p, CultureInfo.InvariantCulture); + } + + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + protected virtual bool TrySerializeKnownTypes(object input, out object output) + { + bool returnValue = true; + if (input is DateTime) + output = ((DateTime)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); + else if (input is DateTimeOffset) + output = ((DateTimeOffset)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); + else if (input is Guid) + output = ((Guid)input).ToString("D"); + else if (input is Uri) + output = input.ToString(); + else + { + Enum inputEnum = input as Enum; + if (inputEnum != null) + output = SerializeEnum(inputEnum); + else + { + returnValue = false; + output = null; + } + } + return returnValue; + } + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + protected virtual bool TrySerializeUnknownTypes(object input, out object output) + { + if (input == null) throw new ArgumentNullException("input"); + output = null; + Type type = input.GetType(); + if (type.FullName == null) + return false; + IDictionary obj = new JsonObject(); + IDictionary getters = GetCache[type]; + foreach (KeyValuePair getter in getters) + { + if (getter.Value != null) + obj.Add(MapClrMemberNameToJsonFieldName(getter.Key), getter.Value(input)); + } + output = obj; + return true; + } + } + +#if SIMPLE_JSON_DATACONTRACT + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + class DataContractJsonSerializerStrategy : PocoJsonSerializerStrategy + { + public DataContractJsonSerializerStrategy() + { + GetCache = new ReflectionUtils.ThreadSafeDictionary>(GetterValueFactory); + SetCache = new ReflectionUtils.ThreadSafeDictionary>>(SetterValueFactory); + } + + internal override IDictionary GetterValueFactory(Type type) + { + bool hasDataContract = ReflectionUtils.GetAttribute(type, typeof(DataContractAttribute)) != null; + if (!hasDataContract) + return base.GetterValueFactory(type); + string jsonKey; + IDictionary result = new Dictionary(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanRead) + { + MethodInfo getMethod = ReflectionUtils.GetGetterMethodInfo(propertyInfo); + if (!getMethod.IsStatic && CanAdd(propertyInfo, out jsonKey)) + result[jsonKey] = ReflectionUtils.GetGetMethod(propertyInfo); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (!fieldInfo.IsStatic && CanAdd(fieldInfo, out jsonKey)) + result[jsonKey] = ReflectionUtils.GetGetMethod(fieldInfo); + } + return result; + } + + internal override IDictionary> SetterValueFactory(Type type) + { + bool hasDataContract = ReflectionUtils.GetAttribute(type, typeof(DataContractAttribute)) != null; + if (!hasDataContract) + return base.SetterValueFactory(type); + string jsonKey; + IDictionary> result = new Dictionary>(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanWrite) + { + MethodInfo setMethod = ReflectionUtils.GetSetterMethodInfo(propertyInfo); + if (!setMethod.IsStatic && CanAdd(propertyInfo, out jsonKey)) + result[jsonKey] = new KeyValuePair(propertyInfo.PropertyType, ReflectionUtils.GetSetMethod(propertyInfo)); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (!fieldInfo.IsInitOnly && !fieldInfo.IsStatic && CanAdd(fieldInfo, out jsonKey)) + result[jsonKey] = new KeyValuePair(fieldInfo.FieldType, ReflectionUtils.GetSetMethod(fieldInfo)); + } + // todo implement sorting for DATACONTRACT. + return result; + } + + private static bool CanAdd(MemberInfo info, out string jsonKey) + { + jsonKey = null; + if (ReflectionUtils.GetAttribute(info, typeof(IgnoreDataMemberAttribute)) != null) + return false; + DataMemberAttribute dataMemberAttribute = (DataMemberAttribute)ReflectionUtils.GetAttribute(info, typeof(DataMemberAttribute)); + if (dataMemberAttribute == null) + return false; + jsonKey = string.IsNullOrEmpty(dataMemberAttribute.Name) ? info.Name : dataMemberAttribute.Name; + return true; + } + } + +#endif + + namespace Reflection + { + // This class is meant to be copied into other libraries. So we want to exclude it from Code Analysis rules + // that might be in place in the target project. + [GeneratedCode("reflection-utils", "1.0.0")] +#if SIMPLE_JSON_REFLECTION_UTILS_PUBLIC + public +#else + internal +#endif + class ReflectionUtils + { + private static readonly object[] EmptyObjects = new object[] { }; + + public delegate object GetDelegate(object source); + public delegate void SetDelegate(object source, object value); + public delegate object ConstructorDelegate(params object[] args); + + public delegate TValue ThreadSafeDictionaryValueFactory(TKey key); + +#if SIMPLE_JSON_TYPEINFO + public static TypeInfo GetTypeInfo(Type type) + { + return type.GetTypeInfo(); + } +#else + public static Type GetTypeInfo(Type type) + { + return type; + } +#endif + + public static Attribute GetAttribute(MemberInfo info, Type type) + { +#if SIMPLE_JSON_TYPEINFO + if (info == null || type == null || !info.IsDefined(type)) + return null; + return info.GetCustomAttribute(type); +#else + if (info == null || type == null || !Attribute.IsDefined(info, type)) + return null; + return Attribute.GetCustomAttribute(info, type); +#endif + } + + public static Type GetGenericListElementType(Type type) + { + IEnumerable interfaces; +#if SIMPLE_JSON_TYPEINFO + interfaces = type.GetTypeInfo().ImplementedInterfaces; +#else + interfaces = type.GetInterfaces(); +#endif + foreach (Type implementedInterface in interfaces) + { + if (IsTypeGeneric(implementedInterface) && + implementedInterface.GetGenericTypeDefinition() == typeof(IList<>)) + { + return GetGenericTypeArguments(implementedInterface)[0]; + } + } + return GetGenericTypeArguments(type)[0]; + } + + public static Attribute GetAttribute(Type objectType, Type attributeType) + { + +#if SIMPLE_JSON_TYPEINFO + if (objectType == null || attributeType == null || !objectType.GetTypeInfo().IsDefined(attributeType)) + return null; + return objectType.GetTypeInfo().GetCustomAttribute(attributeType); +#else + if (objectType == null || attributeType == null || !Attribute.IsDefined(objectType, attributeType)) + return null; + return Attribute.GetCustomAttribute(objectType, attributeType); +#endif + } + + public static Type[] GetGenericTypeArguments(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetTypeInfo().GenericTypeArguments; +#else + return type.GetGenericArguments(); +#endif + } + + public static bool IsTypeGeneric(Type type) + { + return GetTypeInfo(type).IsGenericType; + } + + public static bool IsTypeGenericeCollectionInterface(Type type) + { + if (!IsTypeGeneric(type)) + return false; + + Type genericDefinition = type.GetGenericTypeDefinition(); + + return (genericDefinition == typeof(IList<>) + || genericDefinition == typeof(ICollection<>) + || genericDefinition == typeof(IEnumerable<>) +#if SIMPLE_JSON_READONLY_COLLECTIONS + || genericDefinition == typeof(IReadOnlyCollection<>) + || genericDefinition == typeof(IReadOnlyList<>) +#endif + ); + } + + public static bool IsAssignableFrom(Type type1, Type type2) + { + return GetTypeInfo(type1).IsAssignableFrom(GetTypeInfo(type2)); + } + + public static bool IsTypeDictionary(Type type) + { +#if SIMPLE_JSON_TYPEINFO + if (typeof(IDictionary<,>).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo())) + return true; +#else + if (typeof(System.Collections.IDictionary).IsAssignableFrom(type)) + return true; +#endif + if (!GetTypeInfo(type).IsGenericType) + return false; + + Type genericDefinition = type.GetGenericTypeDefinition(); + return genericDefinition == typeof(IDictionary<,>); + } + + public static bool IsNullableType(Type type) + { + return GetTypeInfo(type).IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); + } + + public static object ToNullableType(object obj, Type nullableType) + { + return obj == null ? null : Convert.ChangeType(obj, Nullable.GetUnderlyingType(nullableType), CultureInfo.InvariantCulture); + } + + public static bool IsValueType(Type type) + { + return GetTypeInfo(type).IsValueType; + } + + public static IEnumerable GetConstructors(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetTypeInfo().DeclaredConstructors; +#else + return type.GetConstructors(); +#endif + } + + public static ConstructorInfo GetConstructorInfo(Type type, params Type[] argsType) + { + IEnumerable constructorInfos = GetConstructors(type); + int i; + bool matches; + foreach (ConstructorInfo constructorInfo in constructorInfos) + { + ParameterInfo[] parameters = constructorInfo.GetParameters(); + if (argsType.Length != parameters.Length) + continue; + + i = 0; + matches = true; + foreach (ParameterInfo parameterInfo in constructorInfo.GetParameters()) + { + if (parameterInfo.ParameterType != argsType[i]) + { + matches = false; + break; + } + } + + if (matches) + return constructorInfo; + } + + return null; + } + + public static IEnumerable GetProperties(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetRuntimeProperties(); +#else + return type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); +#endif + } + + public static IEnumerable GetFields(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetRuntimeFields(); +#else + return type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); +#endif + } + + public static MethodInfo GetGetterMethodInfo(PropertyInfo propertyInfo) + { +#if SIMPLE_JSON_TYPEINFO + return propertyInfo.GetMethod; +#else + return propertyInfo.GetGetMethod(true); +#endif + } + + public static MethodInfo GetSetterMethodInfo(PropertyInfo propertyInfo) + { +#if SIMPLE_JSON_TYPEINFO + return propertyInfo.SetMethod; +#else + return propertyInfo.GetSetMethod(true); +#endif + } + + public static ConstructorDelegate GetContructor(ConstructorInfo constructorInfo) + { +#if SIMPLE_JSON_NO_LINQ_EXPRESSION + return GetConstructorByReflection(constructorInfo); +#else + return GetConstructorByExpression(constructorInfo); +#endif + } + + public static ConstructorDelegate GetContructor(Type type, params Type[] argsType) + { +#if SIMPLE_JSON_NO_LINQ_EXPRESSION + return GetConstructorByReflection(type, argsType); +#else + return GetConstructorByExpression(type, argsType); +#endif + } + + public static ConstructorDelegate GetConstructorByReflection(ConstructorInfo constructorInfo) + { + return delegate (object[] args) { return constructorInfo.Invoke(args); }; + } + + public static ConstructorDelegate GetConstructorByReflection(Type type, params Type[] argsType) + { + ConstructorInfo constructorInfo = GetConstructorInfo(type, argsType); + return constructorInfo == null ? null : GetConstructorByReflection(constructorInfo); + } + +#if !SIMPLE_JSON_NO_LINQ_EXPRESSION + + public static ConstructorDelegate GetConstructorByExpression(ConstructorInfo constructorInfo) + { + ParameterInfo[] paramsInfo = constructorInfo.GetParameters(); + ParameterExpression param = Expression.Parameter(typeof(object[]), "args"); + Expression[] argsExp = new Expression[paramsInfo.Length]; + for (int i = 0; i < paramsInfo.Length; i++) + { + Expression index = Expression.Constant(i); + Type paramType = paramsInfo[i].ParameterType; + Expression paramAccessorExp = Expression.ArrayIndex(param, index); + Expression paramCastExp = Expression.Convert(paramAccessorExp, paramType); + argsExp[i] = paramCastExp; + } + NewExpression newExp = Expression.New(constructorInfo, argsExp); + Expression> lambda = Expression.Lambda>(newExp, param); + Func compiledLambda = lambda.Compile(); + return delegate (object[] args) { return compiledLambda(args); }; + } + + public static ConstructorDelegate GetConstructorByExpression(Type type, params Type[] argsType) + { + ConstructorInfo constructorInfo = GetConstructorInfo(type, argsType); + return constructorInfo == null ? null : GetConstructorByExpression(constructorInfo); + } + +#endif + + public static GetDelegate GetGetMethod(PropertyInfo propertyInfo) + { +#if SIMPLE_JSON_NO_LINQ_EXPRESSION + return GetGetMethodByReflection(propertyInfo); +#else + return GetGetMethodByExpression(propertyInfo); +#endif + } + + public static GetDelegate GetGetMethod(FieldInfo fieldInfo) + { +#if SIMPLE_JSON_NO_LINQ_EXPRESSION + return GetGetMethodByReflection(fieldInfo); +#else + return GetGetMethodByExpression(fieldInfo); +#endif + } + + public static GetDelegate GetGetMethodByReflection(PropertyInfo propertyInfo) + { + MethodInfo methodInfo = GetGetterMethodInfo(propertyInfo); + return delegate (object source) { return methodInfo.Invoke(source, EmptyObjects); }; + } + + public static GetDelegate GetGetMethodByReflection(FieldInfo fieldInfo) + { + return delegate (object source) { return fieldInfo.GetValue(source); }; + } + +#if !SIMPLE_JSON_NO_LINQ_EXPRESSION + + public static GetDelegate GetGetMethodByExpression(PropertyInfo propertyInfo) + { + MethodInfo getMethodInfo = GetGetterMethodInfo(propertyInfo); + ParameterExpression instance = Expression.Parameter(typeof(object), "instance"); + UnaryExpression instanceCast = (!IsValueType(propertyInfo.DeclaringType)) ? Expression.TypeAs(instance, propertyInfo.DeclaringType) : Expression.Convert(instance, propertyInfo.DeclaringType); + Func compiled = Expression.Lambda>(Expression.TypeAs(Expression.Call(instanceCast, getMethodInfo), typeof(object)), instance).Compile(); + return delegate (object source) { return compiled(source); }; + } + + public static GetDelegate GetGetMethodByExpression(FieldInfo fieldInfo) + { + ParameterExpression instance = Expression.Parameter(typeof(object), "instance"); + MemberExpression member = Expression.Field(Expression.Convert(instance, fieldInfo.DeclaringType), fieldInfo); + GetDelegate compiled = Expression.Lambda(Expression.Convert(member, typeof(object)), instance).Compile(); + return delegate (object source) { return compiled(source); }; + } + +#endif + + public static SetDelegate GetSetMethod(PropertyInfo propertyInfo) + { +#if SIMPLE_JSON_NO_LINQ_EXPRESSION + return GetSetMethodByReflection(propertyInfo); +#else + return GetSetMethodByExpression(propertyInfo); +#endif + } + + public static SetDelegate GetSetMethod(FieldInfo fieldInfo) + { +#if SIMPLE_JSON_NO_LINQ_EXPRESSION + return GetSetMethodByReflection(fieldInfo); +#else + return GetSetMethodByExpression(fieldInfo); +#endif + } + + public static SetDelegate GetSetMethodByReflection(PropertyInfo propertyInfo) + { + MethodInfo methodInfo = GetSetterMethodInfo(propertyInfo); + return delegate (object source, object value) { methodInfo.Invoke(source, new object[] { value }); }; + } + + public static SetDelegate GetSetMethodByReflection(FieldInfo fieldInfo) + { + return delegate (object source, object value) { fieldInfo.SetValue(source, value); }; + } + +#if !SIMPLE_JSON_NO_LINQ_EXPRESSION + + public static SetDelegate GetSetMethodByExpression(PropertyInfo propertyInfo) + { + MethodInfo setMethodInfo = GetSetterMethodInfo(propertyInfo); + ParameterExpression instance = Expression.Parameter(typeof(object), "instance"); + ParameterExpression value = Expression.Parameter(typeof(object), "value"); + UnaryExpression instanceCast = (!IsValueType(propertyInfo.DeclaringType)) ? Expression.TypeAs(instance, propertyInfo.DeclaringType) : Expression.Convert(instance, propertyInfo.DeclaringType); + UnaryExpression valueCast = (!IsValueType(propertyInfo.PropertyType)) ? Expression.TypeAs(value, propertyInfo.PropertyType) : Expression.Convert(value, propertyInfo.PropertyType); + Action compiled = Expression.Lambda>(Expression.Call(instanceCast, setMethodInfo, valueCast), new ParameterExpression[] { instance, value }).Compile(); + return delegate (object source, object val) { compiled(source, val); }; + } + + public static SetDelegate GetSetMethodByExpression(FieldInfo fieldInfo) + { + ParameterExpression instance = Expression.Parameter(typeof(object), "instance"); + ParameterExpression value = Expression.Parameter(typeof(object), "value"); + Action compiled = Expression.Lambda>( + Assign(Expression.Field(Expression.Convert(instance, fieldInfo.DeclaringType), fieldInfo), Expression.Convert(value, fieldInfo.FieldType)), instance, value).Compile(); + return delegate (object source, object val) { compiled(source, val); }; + } + + public static BinaryExpression Assign(Expression left, Expression right) + { +#if SIMPLE_JSON_TYPEINFO + return Expression.Assign(left, right); +#else + MethodInfo assign = typeof(Assigner<>).MakeGenericType(left.Type).GetMethod("Assign"); + BinaryExpression assignExpr = Expression.Add(left, right, assign); + return assignExpr; +#endif + } + + private static class Assigner + { + public static T Assign(ref T left, T right) + { + return (left = right); + } + } + +#endif + + public sealed class ThreadSafeDictionary : IDictionary + { + private readonly object _lock = new object(); + private readonly ThreadSafeDictionaryValueFactory _valueFactory; + private Dictionary _dictionary; + + public ThreadSafeDictionary(ThreadSafeDictionaryValueFactory valueFactory) + { + _valueFactory = valueFactory; + } + + private TValue Get(TKey key) + { + if (_dictionary == null) + return AddValue(key); + TValue value; + if (!_dictionary.TryGetValue(key, out value)) + return AddValue(key); + return value; + } + + private TValue AddValue(TKey key) + { + TValue value = _valueFactory(key); + lock (_lock) + { + if (_dictionary == null) + { + _dictionary = new Dictionary(); + _dictionary[key] = value; + } + else + { + TValue val; + if (_dictionary.TryGetValue(key, out val)) + return val; + Dictionary dict = new Dictionary(_dictionary); + dict[key] = value; + _dictionary = dict; + } + } + return value; + } + + public void Add(TKey key, TValue value) + { + throw new NotImplementedException(); + } + + public bool ContainsKey(TKey key) + { + return _dictionary.ContainsKey(key); + } + + public ICollection Keys + { + get { return _dictionary.Keys; } + } + + public bool Remove(TKey key) + { + throw new NotImplementedException(); + } + + public bool TryGetValue(TKey key, out TValue value) + { + value = this[key]; + return true; + } + + public ICollection Values + { + get { return _dictionary.Values; } + } + + public TValue this[TKey key] + { + get { return Get(key); } + set { throw new NotImplementedException(); } + } + + public void Add(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void Clear() + { + throw new NotImplementedException(); + } + + public bool Contains(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public int Count + { + get { return _dictionary.Count; } + } + + public bool IsReadOnly + { + get { throw new NotImplementedException(); } + } + + public bool Remove(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public IEnumerator> GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + } + + } + } +} +// ReSharper restore LoopCanBeConvertedToQuery +// ReSharper restore RedundantExplicitArrayCreation +// ReSharper restore SuggestUseVarKeywordEvident diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs.meta new file mode 100644 index 000000000..139a73427 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c8f11e68121df43a1b024bd316561d0a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs new file mode 100644 index 000000000..737055c18 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs @@ -0,0 +1,9 @@ +using System; +namespace BugsnagUnity +{ + public enum TelemetryType + { + InternalErrors, + Usage + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs.meta new file mode 100644 index 000000000..b1abb8717 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2653a63709d4f41d9bb84f65a32e92a6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs new file mode 100644 index 000000000..3289b824a --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs @@ -0,0 +1,10 @@ +using System; +namespace BugsnagUnity +{ + public enum ThreadSendPolicy + { + Always = 0, + UnhandledOnly = 1, + Never = 2 + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs.meta new file mode 100644 index 000000000..aec7cbc0e --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93aa4e4b6db8745cdaa40823367c9cad +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs new file mode 100644 index 000000000..1cd66d703 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs @@ -0,0 +1,36 @@ +using System; +using System.Diagnostics; + +namespace BugsnagUnity +{ + // A simple timer used internally to avoid thread complications when using the unity Time API + internal class Time + { + + private static object _swLock = new object(); + + private static Stopwatch _sw; + + internal static Stopwatch Timer + { + get + { + if (_sw == null) + { + lock (_swLock) + { + if (_sw == null) + { + _sw = Stopwatch.StartNew(); + } + } + } + return _sw; + } + } + + internal static double ElapsedSeconds => Timer.Elapsed.TotalSeconds; + + } +} + diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs.meta new file mode 100644 index 000000000..a70e8a52e --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d881b215b5354b98856aee8f4ecbb20 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs new file mode 100644 index 000000000..026b35f50 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs @@ -0,0 +1,38 @@ +using UnityEngine; +using System.Collections; + +namespace BugsnagUnity +{ + /// + /// Manages events related to application state such as whether the app + /// is in the foreground or background to improve report metadata. + class TimingTrackerBehaviour : MonoBehaviour + { + + private void Awake() + { + // Make sure that the tracker persists accross scenes. + DontDestroyOnLoad(gameObject); + } + + /// + /// OnApplicationFocus is called when the application loses or gains focus. + /// Alt-tabbing or Cmd-tabbing can take focus away from the Unity + /// application to another desktop application. This causes the GameObjects + /// to receive an OnApplicationFocus call with the argument set to false. + /// When the user switches back to the Unity application, the GameObjects + /// receive an OnApplicationFocus call with the argument set to true. + /// + /// + void OnApplicationFocus(bool hasFocus) + { + Bugsnag.SetApplicationState(hasFocus); + } + + void OnApplicationPause(bool paused) + { + var hasFocus = !paused; + Bugsnag.SetApplicationState(hasFocus); + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs.meta new file mode 100644 index 000000000..daa9da481 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 17f6449af62ba488e8a673cef12f29be +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs new file mode 100644 index 000000000..7d373a48d --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs @@ -0,0 +1,161 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Text; + +namespace BugsnagUnity +{ + class TypeNameHelper + { + private static readonly Dictionary _builtInTypeNames = new Dictionary + { + { typeof(void), "void" }, + { typeof(bool), "bool" }, + { typeof(byte), "byte" }, + { typeof(char), "char" }, + { typeof(decimal), "decimal" }, + { typeof(double), "double" }, + { typeof(float), "float" }, + { typeof(int), "int" }, + { typeof(long), "long" }, + { typeof(object), "object" }, + { typeof(sbyte), "sbyte" }, + { typeof(short), "short" }, + { typeof(string), "string" }, + { typeof(uint), "uint" }, + { typeof(ulong), "ulong" }, + { typeof(ushort), "ushort" } + }; + + public static string GetTypeDisplayName(object item, bool fullName = true) + { + return item == null ? null : GetTypeDisplayName(item.GetType(), fullName); + } + + /// + /// Pretty print a type name. + /// + /// The . + /// true to print a fully qualified name. + /// true to include generic parameter names. + /// The pretty printed type name. + public static string GetTypeDisplayName(Type type, bool fullName = true, bool includeGenericParameterNames = false) + { + var builder = new StringBuilder(); + ProcessType(builder, type, new DisplayNameOptions(fullName, includeGenericParameterNames)); + return builder.ToString(); + } + + private static void ProcessType(StringBuilder builder, Type type, DisplayNameOptions options) + { + if (type.IsGenericType) + { + var genericArguments = type.GetGenericTypeDefinition().GetGenericArguments(); + ProcessGenericType(builder, type, genericArguments, genericArguments.Length, options); + } + else if (type.IsArray) + { + ProcessArrayType(builder, type, options); + } + else if (_builtInTypeNames.TryGetValue(type, out var builtInName)) + { + builder.Append(builtInName); + } + else if (type.IsGenericParameter) + { + if (options.IncludeGenericParameterNames) + { + builder.Append(type.Name); + } + } + else + { + builder.Append(options.FullName ? type.FullName : type.Name); + } + } + + private static void ProcessArrayType(StringBuilder builder, Type type, DisplayNameOptions options) + { + var innerType = type; + while (innerType.IsArray) + { + innerType = innerType.GetElementType(); + } + + ProcessType(builder, innerType, options); + + while (type.IsArray) + { + builder.Append('['); + builder.Append(',', type.GetArrayRank() - 1); + builder.Append(']'); + type = type.GetElementType(); + } + } + + private static void ProcessGenericType(StringBuilder builder, Type type, Type[] genericArguments, int length, DisplayNameOptions options) + { + var offset = 0; + if (type.IsNested) + { + offset = type.DeclaringType.GetGenericArguments().Length; + } + + if (options.FullName) + { + if (type.IsNested) + { + ProcessGenericType(builder, type.DeclaringType, genericArguments, offset, options); + builder.Append('+'); + } + else if (!string.IsNullOrEmpty(type.Namespace)) + { + builder.Append(type.Namespace); + builder.Append('.'); + } + } + + var genericPartIndex = type.Name.IndexOf('`'); + if (genericPartIndex <= 0) + { + builder.Append(type.Name); + return; + } + + builder.Append(type.Name, 0, genericPartIndex); + + builder.Append('<'); + for (var i = offset; i < length; i++) + { + ProcessType(builder, genericArguments[i], options); + if (i + 1 == length) + { + continue; + } + + builder.Append(','); + if (options.IncludeGenericParameterNames || !genericArguments[i + 1].IsGenericParameter) + { + builder.Append(' '); + } + } + builder.Append('>'); + } + + private struct DisplayNameOptions + { + public DisplayNameOptions(bool fullName, bool includeGenericParameterNames) + { + FullName = fullName; + IncludeGenericParameterNames = includeGenericParameterNames; + } + + public bool FullName { get; } + + public bool IncludeGenericParameterNames { get; } + } + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs.meta new file mode 100644 index 000000000..8444a1079 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5540806ff0d224c3ba5d2450d2188b49 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs new file mode 100644 index 000000000..102ff73d4 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; + +namespace BugsnagUnity +{ + public class UniqueLogThrottle + { + private readonly object _lock = new object(); + private Dictionary Counter { get; } + private double FlushAt { get; set; } = -1; + private Configuration Configuration { get; } + + private double UniqueLogsTimePeriod => Configuration.SecondsPerUniqueLog.TotalSeconds; + + private void EnsureFlushTimeIsSet() + { + if (FlushAt < 0) + { + FlushAt = Time.ElapsedSeconds + UniqueLogsTimePeriod; + } + } + + public UniqueLogThrottle(Configuration configuration) + { + Configuration = configuration; + Counter = new Dictionary(new UnityLogMessageEqualityComparer()); + } + + public bool ShouldSend(UnityLogMessage unityLogMessage) + { + bool shouldSend; + lock (_lock) + { + EnsureFlushTimeIsSet(); + shouldSend = !Counter.ContainsKey(unityLogMessage); + if (shouldSend) + { + Counter.Add(unityLogMessage, 0); + } + else + { + if (unityLogMessage.CreatedAt > FlushAt) + { + Counter.Clear(); + FlushAt = Time.ElapsedSeconds + UniqueLogsTimePeriod; + shouldSend = true; + } + } + } + return shouldSend; + } + + class UnityLogMessageEqualityComparer : EqualityComparer + { + public override bool Equals(UnityLogMessage x, UnityLogMessage y) + { + return x.Condition == y.Condition && x.StackTrace == y.StackTrace && x.Type == y.Type; + } + + public override int GetHashCode(UnityLogMessage obj) + { + unchecked + { + int hash = 17; + hash = hash * 23 + obj.Condition.GetHashCode(); + hash = hash * 23 + obj.StackTrace.GetHashCode(); + hash = hash * 23 + obj.Type.GetHashCode(); + return hash; + } + } + } + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs.meta new file mode 100644 index 000000000..334616971 --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d711c9ab9c79940ac9af4d8e61db2697 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs b/BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs new file mode 100644 index 000000000..832f8712d --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +namespace BugsnagUnity +{ + /// + /// Represents a log message received from Unity + /// + public class UnityLogMessage + { + public UnityLogMessage(string condition, string stackTrace, LogType type) + { + CreatedAt = Time.ElapsedSeconds; + Condition = condition; + StackTrace = stackTrace; + Type = type; + } + + public UnityLogMessage(Exception exception) + { + CreatedAt = Time.ElapsedSeconds; + Condition = exception.Message == null ? string.Empty : exception.Message; + StackTrace = exception.StackTrace == null ? string.Empty : exception.StackTrace; + Type = LogType.Exception; + } + + public string Condition { get; } + + public string StackTrace { get; } + + public LogType Type { get; } + + public double CreatedAt { get; } + + + } +} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs.meta b/BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs.meta new file mode 100644 index 000000000..01b36b71f --- /dev/null +++ b/BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 79983a3ef884641788f93342b893099c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/Resources.meta b/BugsnagUnity/Assets/Resources.meta new file mode 100644 index 000000000..8c2f82519 --- /dev/null +++ b/BugsnagUnity/Assets/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 791f8cdad4b71435785366a13fbc74a3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset b/BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset new file mode 100644 index 000000000..8b391db30 --- /dev/null +++ b/BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset @@ -0,0 +1,65 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3e0efee821abb422baf5bb3728925f09, type: 3} + m_Name: BugsnagSettingsObject + m_EditorClassIdentifier: + StartAutomaticallyAtLaunch: 1 + AutoDetectErrors: 1 + AutoTrackSessions: 1 + ApiKey: 227df1042bc7772c321dbde3b31a03c2 + AppType: + AppHangThresholdMillis: 0 + AppVersion: + BundleVersion: + BreadcrumbLogLevel: 4 + Context: + DiscardClasses: [] + EnabledReleaseStages: [] + EnabledErrorTypes: + ANRs: 1 + AppHangs: 1 + OOMs: 1 + Crashes: 1 + ThermalKills: 1 + UnityLog: 1 + EnabledBreadcrumbTypes: + Error: 1 + Log: 1 + Navigation: 1 + Process: 1 + Request: 1 + State: 1 + User: 1 + LaunchDurationMillis: 5000 + MaximumBreadcrumbs: 100 + MaxPersistedEvents: 32 + MaxPersistedSessions: 128 + MaxReportedThreads: 200 + MaxStringValueLength: 10000 + NotifyEndpoint: https://notify.bugsnag.com + NotifyLogLevel: 0 + PersistUser: 1 + SessionEndpoint: https://sessions.bugsnag.com + SendThreads: 1 + RedactedKeys: + - .*password.* + ReleaseStage: + ReportExceptionLogsAsHandled: 1 + SendLaunchCrashesSynchronously: 1 + SecondsPerUniqueLog: 5 + Telemetry: 0000000001000000 + VersionCode: -1 + GenerateAnonymousId: 1 + SwitchCacheType: 1 + SwitchCacheMountName: BugsnagCache + SwitchCacheIndex: 0 + SwitchCacheMaxSize: 10485760 diff --git a/BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset.meta b/BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset.meta new file mode 100644 index 000000000..f9a7a71cc --- /dev/null +++ b/BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 72f8fe8e836cc417b9ea1722f6c2e183 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/Scenes.meta b/BugsnagUnity/Assets/Scenes.meta new file mode 100644 index 000000000..80cb43280 --- /dev/null +++ b/BugsnagUnity/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4d58f9efde5b243799c1f36d2c1cb26d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/Scenes/SampleScene.unity b/BugsnagUnity/Assets/Scenes/SampleScene.unity new file mode 100644 index 000000000..4bc852e91 --- /dev/null +++ b/BugsnagUnity/Assets/Scenes/SampleScene.unity @@ -0,0 +1,768 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &494610500 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 494610504} + - component: {fileID: 494610503} + - component: {fileID: 494610502} + - component: {fileID: 494610501} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &494610501 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 494610500} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &494610502 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 494610500} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &494610503 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 494610500} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &494610504 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 494610500} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1173133381} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &519420028 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 519420032} + - component: {fileID: 519420031} + - component: {fileID: 519420029} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &519420029 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 +--- !u!20 &519420031 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 0 + m_HDR: 1 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &519420032 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &854009149 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 854009150} + - component: {fileID: 854009152} + - component: {fileID: 854009151} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &854009150 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 854009149} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1840475927} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &854009151 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 854009149} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: TEST + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 0 + m_fontSizeMax: 0 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &854009152 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 854009149} + m_CullTransparentMesh: 1 +--- !u!1 &1173133380 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1173133381} + - component: {fileID: 1173133383} + - component: {fileID: 1173133382} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1173133381 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1173133380} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1840475927} + m_Father: {fileID: 494610504} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1173133382 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1173133380} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1173133383 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1173133380} + m_CullTransparentMesh: 1 +--- !u!1 &1255953785 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1255953788} + - component: {fileID: 1255953787} + - component: {fileID: 1255953786} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1255953786 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1255953785} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1255953787 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1255953785} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1255953788 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1255953785} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1303533344 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1303533346} + - component: {fileID: 1303533345} + m_Layer: 0 + m_Name: Testing + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1303533345 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1303533344} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 897a36415339c44b289e83eb1547c69f, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &1303533346 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1303533344} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 970.03516, y: 521.37, z: 5.1463275} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1840475926 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1840475927} + - component: {fileID: 1840475930} + - component: {fileID: 1840475929} + - component: {fileID: 1840475928} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1840475927 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840475926} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 854009150} + m_Father: {fileID: 1173133381} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 472.4227, y: 254.04} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1840475928 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840475926} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1840475929} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1303533345} + m_TargetAssemblyTypeName: Testing, Assembly-CSharp + m_MethodName: Throw + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1840475929 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840475926} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1840475930 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840475926} + m_CullTransparentMesh: 1 diff --git a/BugsnagUnity/Assets/Scenes/SampleScene.unity.meta b/BugsnagUnity/Assets/Scenes/SampleScene.unity.meta new file mode 100644 index 000000000..c1e3c88e1 --- /dev/null +++ b/BugsnagUnity/Assets/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2cda990e2423bbf4892e6590ba056729 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/Scripts.meta b/BugsnagUnity/Assets/Scripts.meta new file mode 100644 index 000000000..c10ed56c3 --- /dev/null +++ b/BugsnagUnity/Assets/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 921c75e83050e44efbcaeee501d6fec2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/Scripts/Testing.cs b/BugsnagUnity/Assets/Scripts/Testing.cs new file mode 100644 index 000000000..91e64edff --- /dev/null +++ b/BugsnagUnity/Assets/Scripts/Testing.cs @@ -0,0 +1,11 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Testing : MonoBehaviour +{ + // Start is called before the first frame update + public void Throw(){ + throw new System.Exception("This is an exception"); + } +} diff --git a/BugsnagUnity/Assets/Scripts/Testing.cs.meta b/BugsnagUnity/Assets/Scripts/Testing.cs.meta new file mode 100644 index 000000000..884fbc9c8 --- /dev/null +++ b/BugsnagUnity/Assets/Scripts/Testing.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 897a36415339c44b289e83eb1547c69f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro.meta b/BugsnagUnity/Assets/TextMesh Pro.meta new file mode 100755 index 000000000..f9da8b5e3 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f54d1bd14bd3ca042bd867b519fee8cc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Documentation.meta b/BugsnagUnity/Assets/TextMesh Pro/Documentation.meta new file mode 100755 index 000000000..afa527ac5 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Documentation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8e7e8f5a82a3a134e91c54efd2274ea9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf b/BugsnagUnity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf new file mode 100755 index 0000000000000000000000000000000000000000..c2ea2d278785aa03d590f89fabdb0f30ad0976e9 GIT binary patch literal 694398 zcmcG$1y~i&+deKWr64ISf;6WO2PCAWyE_gg-6_&YiPD`C5`rM8C?(w~p&-&A2#Bck ze-G;SrD36i9^y1xA3RS)fQLQ~;#R0)c}xS&#xKC`15s zlf{4qB?xChBEUwXqNHd?OH5TPzkf)Hyj{^&Kb`~?Bqaj>{6LT_XJ;&qztSKAaLC`% z1ThW7eE!G>g`%K;OG6?Ne@hb(5cq2v3=9+eTN)DbxBB1^_}|(Ghr-~0EejX;dp{5` z$luz65D@rV8WMu~Ti=iZe{TyC1^ruF1fT+cPZIz}=`Ul2f-a&Tz##mkEEEAo{5=i+w|+noDCA%3149t-zl}2(<7NNpo4c!- ztv%Y6ln8KI4ZvSnP%tP+-O0%va8)21i#kZo(aH(%RG@Cmg_MD?q@)DUP$@|mTmU8w zg+nADQc?nNNeC1sC?yD!mJt<}K_Vm(5OF~iTmT^mheJ`)P-$s6SXxp-Mp{rDi4Zjc zsk)*)&s-mv5W4DUD-CxC7EEga*C%pwH*0xQRb54T9{zg}8bM?X|3w2g2OnzzH4K0wd^mG%l$` zKF8e`5?+N`r9WA{OtvR;HwJJlKAjv9KU9$Q0K`!5XdnMw-$nfGKI& zwK_8CdGDLa8`VZvN(}a_&6l30Q7DqL0mICv-L6aol=mbkXa?r28HE%8|C{asl(jA@$)EwNfz( zj&vSeU0(c*-CC-}JJ)SIpNeN%_TjqMbzCd?VEXnV7|g{*-w-b24hMrR?;H;%C(mNx zZf}!Omam=*!9Sm)ruq^m?}l6{_LcT#)u4DY*+?Ch3<9+femn@3)rIR%h?}X&qLf)~ zTFqrzpDSb!n#3xH1qbDH$D%L1#;PPh5`U(rrEN$(tu~%BkI!!2ARDg=9!?W%eaS8| zzaptp>>qy8VR`NHSA+ysc}6-#I-M>ZHGjRC-5e(wH`v9ieH}i!|znhTpiqi2_@-d@8RI+#sb5*yQQs#yOS#m1S%@}kFM%yiS{;t zAiw|vz>I$REFAH3R)S$5O&@3U*<1nX7(iHn4d9929NB!`9OKCh?IC!u0Y=i0;qSEV z1v?Nr<^pfHsLX;zmD!zhIOhmWi9h^PC(b7OFY+>TwB|%R@@Z*sft1W#Z($Gs=ndu+ z;4^nu4>ZsPCA7PlrJ1`K01W`#0nngoW{q|Ot^jZbt~7vb7Ves^X!IGFVETngKI?-d zP|V)R8l-KD_CmV?Lt}+@MLSxcF+(P0>x#B;w{>y^DMHmnfzK}{1eo)WVHS6FmvHhn z0P_R20z1Guz_)-P@NEQ=ut%dU|MjkFVVCuep@~tC{`lUBJvh zRX~>k{s8)>j&^hMaQ)E@X>WH~4R-*DfG){ufPtq0JOSj9)qt>|AZOQ337ck)BN3%6GF_oS@7^q0q)yYBw?QQ@9ViJ%h+S?s) z4FJV44PXKPw8f9sy0Jh(ny$7E|JtcD3t?>e`_N;a^V2yb%-qnJc7qfY^pzy!c_aX5 zLA$!~siUnu?9E(3(vAS~+B#Z;bZi~P9o=mIb1h@*>gFzKW9G^NFbt*!DYTn~tF1F; zQlP*;x~OROGYbR?G~2`69pmzvfWw`&O4CWp(H4X2EGX#DQNY|kYmJVrrMr!r0Ynf1 zL|2$V?EjAqc{cc97MK9$@t6&U1md0lVS`~}F<^uLJpRfL7yQvqIKa_x07U+%3l71| z?LRyp<1aslUtCUu#mday4Goe|0x3JWI+)pmB*j@E{9urZ>e<``j!Hn#sUiO3N<+!a z?G}*J5g16!X#K}CK^DN=1&TR2|D4i)JP%`xU(a*1IP-A`7zvUzbH0hTwYG6*K|sJD zjQKFP_yFF=kgl~GfLsV9>dYPz82{n}f*H(R76=4|0=~dVqqCbbW)8OYKAb;2hwDcg z5QPA)4*h{17?UcSIiUZ|$uRc;gh9Jo*!&s;d)9oPM8_@wW*N~=9$)$;bSdvv}9-=328zjLk2}=30bWajmSX!;VDVHMRK0lQr6(ly>hu z+;~<{a#E(n$0y|awP*b{9wS;wp^ih18|U_g;uI58s`T0*+Yldo86M4nB~!-T)vm)! zfz%=oAra4}qnONyb_jOH12@c@>qywLvy~Z>Z^quA#$~*^C}9bC`i^!9JZgO~Gmq9D zc#ZwCi?%;DSdNn>Pan47W6+{$6WP1>f$B?D8OUoXTDj3qCsWBGGJ1qMcHGo3Zk^$@ zmR4!*_5ql|!(PHy@N3s=iSqY~qT>mt*>|89xRjn#Fa-HWo3ipMIJVj|-%*WU{%+n) zWnNqKF|DQyRyOM3S8&T3q9JcIv`|@-e7fQ}njnfb?vk{nnC|vE3rjNe6A1(Ury#b8 zz2y2po~>z15_t>WRmG=8wyGC&f+0ZY4P}8MFu?L_L!vO80|P_Pc1$W1fnb53BX{2ecdp z`%xAN$X+NQU!Xu~1R$HBfV>q1_!X0mgkp}EI$(gPgabKXKdY(t z4A>|@5dDGIfSd(ks27M4IDgg#a&tDbK!eO2oB{SWbF>6GW1<;*w3YjhGgl1IgDjjJ z9LzvAKF&61M-Y(H*2xm&W^d+Z1HurByO$Hl-3Ey9KyJ3)Kwf(wY_kTG6-I`MgCszb zASsYENCqSex(Sj4DS#9~0B3266{^fILB7Aa9Tl$QR_|;pC3CG`Bx%CD(6U1Q62?F8Uc{ z{2(F-;8lE3z>E+u;5)$B{E3LpCL{}HMgryr|G`H$Wm^ca`2KAYdGq3xBX`3*?D`l$obW~BIGkk)ShG= zr_n_Hu0`_gw{9>ipLZ{tOjev{Njnv^C-_e<(>&gF_fq-z$@To8-buiE>)1t(Z(sas z0zLOnka2;p1xadn-q|g^aE_5N$=ES)yTGsV*4Wd?aBJmI;oa_j+v7u8!?b1M*4h+) z!_Fd74OpgxHqDOy^8*p%GG3CIz>nPTJW+Ll>0D(rCiAbQ^XRtvxd+~htX(k5J|25Kq_EEZC7jN9DcP5}ALSC64w;W1A7@=dNg1i93{iRD^*^JU*S@umfQ#^W z69wRkN-ziA8ip^Uc9 zLlL8uC=qIJ*j}mhq;uNk-}53x40rm4r_srmcm%TQ}Q z-nvpXCdQ!TyIGr}2i32XH0;~QPD%-e1CGf=8_5>X?k+T+HgW*fhq#Yt_m4D%aqr&% z>5L_$bmeqz>i$Mk81(p8sQQhr{vOt2R`32qS5WAGp{pM<>MTnAovxtp-{W~C>d!z7 z2T0=wks$#ZL7YJ$hE@O)z^sS;)!~pdQ0x6hOBoG2)as%xEhz}0jg#l}?NT5v!Kz(575dnY_hDd?q?<(PJ ztp7{`g5ZB8fxn{vpCR5C?do)f@K%7L1zFj8qW^;D7&KQpLvpqMV7WGc=6^@>|BB=P z8{|g(L~aN$_&|sL4Y>g){WEg^h?FpnbcWpj=+*xnxq-;wpLGNj_1~cz^1F_}tZM(7 zWB;xr;D|p%cS5h-!VNO%ZwFDv*P>Yr)*s2=pk=s@1zK+LUdFL3-8^qDSGyE;di!8K zog}9D4f&%NnT}d388e;}UJ1Q{9eGm`-HZ*5u^*s@78LKUWWEqJpsw6ZUps-H3at3{ zeI9$+WK`rlyVrT8j63C29t6^O`8>koIzy{P@@b?)q*0*j#X#htY|7T-h3}UK@^ap_ zR%lm}c2a(+U}~CJnfv^F({`fh+l;%PyvQl{?e`sXQTsk}X;wC`(d8LrA5SQs*xj#8 zDw`dB+9UD)1_#{JU&TxP*?x(7`wb*hb*e5pQ;lltH+PgC8}xeaRnrv53! zoH^#ubdsQ;xMg(Jb{p*zQjU z+a3oUX6~iLO&gB^(ADZ&y!(%!ivgBj6ZOB!`5!|6|6R|YmHRz$?vN-e^n&_a{Z$!f&K}ukpdWM`eTCw`T}@60;FI75`G4_2w?FA zAt(UAF(zimK=>c||2RWpz#G7h9~uGytVtjMC>Jnh=2j>TbMLV+W?SheCNQlR1lod0 z1>XOiFi(P`5Ws2}gat16rzN1Xg{Qw-P+Re)xW4kAE%;;IF|Z2#n}k9E?6r!m-+@=(!-Js4?2bc*)sDrXstCtXRySKY?*R`ajikk`PEgLVWGl zmaW;6px+zIu_&-Aj^MZ4ZLKweod_#UEbCs>%TBLP87=8ln*64xm3G9(m)+qF(eZL< z8vV!{c(Q zuRU(LxERsK{!w8p#qBc#z`0fI231$DgZC6xQ?fTG4Aym5CxZ>|l-lOmmRjUl{Mb3N z3_kOH&-TA)MIFui^?s(P@=|L1mFNNjf{Srm9^Q{Fs3Umem>7i5f5h997{nfIH5Pwd zr8C5{kyM&;f_D-I>}YZ0J89DK(y73%y-1b%9QS$X>CNqXp_lP4i@zkFHyFgjWs zp`wz*Bq|c%`~A0swQ#J%G`1N1Y4T;SxD2-#+t6YMSU-PJ9q~a!P55naDY5lezUFf# zHZ!;WiFyIp{SOiTyAQyC`2NqhC;7WiSSFEbQch5HT2E$OzQHhmp{CW`T4!JN{<&b* z3Mworu^R>PC3s`fH?C-@sYXUwkC#vtjg%ld21^k6)z#hNF?5P-)jN0Sn&z#|=VfE1 zBIR%nm|wniJMgq{7+g!MS=sd4YW#Nl+w5t>y_G&uhQZzSu2PHQm^2~Nqx{eLBO6CP zOP~vPqjwc2V^wEY(a76Wx#}0w_r9!YWZWsaVY!Ez{1|3PY(2kkQmjm?CKTwR*S#?x z7Iz!(m~qF&MJ_HansGtCm(ey_o;zx}f8d@=;XvBL_H^R)o~WMa9_}b2izm^`$%RP+ zTro<6w|#bwSY;m+RM}8>?rbcu#U=Pu5)76KPslFjqxjPo%u)OUDGIwwP(1#(DfDe~ z&q*Ayy|Vn;4!0A&i*3^c9PDd;e+QM$SWc@;6@|!VjP_|QYhTfGCfqcC@jcmFb0cxS z(97TNJO8%GJk7e!^2D52Tj0aMtkYMHb^@>7KD{G~RfePgg1{?hB*6OHt z<5_!XEAbkpSWpSz?AocBnVn!Ko*r=Utiw@uli+WF|xZo9&o1dABtB`Nvh4-?_pc9*_xOg%HIub|jV z|LmG!P(Ul^II9&D!-2XGZEPEqf%nmu5vuvFh@>NJXHKsCz7#0x%kx7t)~od~j|U?? z=Xk=h4(kHuW^O5&RmUzXe7;6wSsq4+TyDy{GU>i(pw%RLPHmN-GDMu9-F@W7N|}Nl zrSvP$-WOTZ8QT<9RM+ZrzH>hZ@sWL5Akc4g9FSAGEWjt?InQpC-~?`V$wJ+|f&aa; z^2XAOJOgr8bqAfe8+ql&I&sYh#SrCYAvN2FHwu~_IWg{O2fdNd!&V|Qh-bGieebDO z-~GOd_jo<{LWBg@+XewUgkf13v*K3{QG+ET0pJEzekUlu({kM>{lK91PY ze8?&_Y}(g8$;`4gy{av)LU%K040K_JENadVTyulaqK|aY?LkrClbnk;obQi9%I$Z)=faRkQ ziG!mq$A_E91P|=cTLm7QB)frg0rCY?lnNojCmNfTQI(lJD<~tu!l=(8_|vU%PT#k1 z^_e1X7Eoi6vnJ8zS1Fr!y{`_wGNNinWjz=Iq}d?A+y5|Ml>%q#?zkqOk;UDVTqe3%Z8-i^js%PUT#7f*F(@c zNRY!&SKNic#2BU1t9S*IJOuT!7k1#d(i_nc#aZGzH%%{t%mo#4FVjhsJG;AAVOwpU zx7g!{#-N@&K#(x7BK9?wZy*x-(yh~V!?K%jbJKm|;@==`hRpT3+LRB4p9GXcM{lh4 zUfdl~w_Yp)hczCb>K3YFy_T2wAfWS&>DaJAaHFRpFC}cDf6KVZB4ktn6;1RiR2gKp zl_L_`A{L>x^$5K{Qfd ziWsq5rK8#|m`%-6W#}e8EF*}Ued%y``(Xb*!BalBs0ogU5%YV@UYd!=EXTECfnRQ} z^tm^@>RXv>XIWI2BK9hwLz1g-SS$yhp`( zmDP8?M%`oyj9vaP>!@y@;3{vjmf@c?o^jDji`F5Af@jiEw}n&B>oUbLPSIO5Z;owt z^RZ@kVEgw$SjOWjwTHMj+pgffPSZxQ*~svheqyk_vCK0(ypX}#{XB-6}s>;x}u4H}soO?Px@0^6TCWN^8pVmNaOKJ8{lLU-)mY*qWdl zT}pUl*=tH(s)#$LfZcqQ?pmicejV!ZjqM9p$R#6R%U+)}!F6II%(zz}_9BtH-F8)`o(Lyg_p4@;iU`}S;xjHG5AwrV#d$v)2&!#_!yAm+8- zc+vTP+?ojWb@JL9kv9-Ma@GqL+8~-LIdp<~Y!;xzPxE(r2kEHehPC;241Ktbl<#`t zR_K5{PWH>|-m=FHGD586r&_+jr}o$muJ8wSw#oNOfBkwyC@w!P&4VrV(52~%=bp9- z`|v%|z?dP~teaB)*usyQ1w_UVv&-LBPlT&~O};uLViY!XH2l0Q$5KXGxrZ+4yHj16 z@UZM9v4DUsAoQTjpAuEKf0_JDX~q(C9?IckiUS+p00m>tuH8Tcc9IMd|Sq z&2`0#x?GP+Y_-a5*%WLDZi5$QE#zX3ViSU~X?#Q9Z86(yUOss!nAr?%mTS4_EOaou zT{@J6x33nwfnc&E)ml7HXr)04TNa5VqI=Q3hx7RI;4`uNcIGOE?54swnF;2EuosLD zQh9_PZdUr-AK<{5 zYb1M$FP$uYoXK_UHZ5(bqZ*SR9J)&qc=~l`y4Amcjp&uBv;-)?&-+_3$^yhswGc8h z?VWVFUfl+1;e5FqJ7fH*W{|xznaqu)$5Znyn~v*>FA74|wr>;o=hHBCyV!iA%DKOr z#b(77MsDkNUB93K^rU@YAEJy^KM)Re!~0m~V)Dq7VCyp3LOpMZ{3YAx#N)gtPb^BB z8XwkwJn*cQK8apceYMWLG>28E8Hk5-H^?)~u}G8*n#xx;8j(zo zgXoxca*1Eu&Gfn{wU{k{>b{m)GNf3i7!H|B<@)I8qbtemT%vtKZz~xFsb=R(DB*D= z(Z0;`27E%dOFfZ?%h=&ESJZZ{#2i{fc1h4(?Lpz=`Cv4`SH5hq^O;_)y__L0NXI1X z>3N5SYG07Dd8AM>7qM0NaEV;!yS8H)&1rH2@i@48=Zj%D-&Hc{CXcZaS?c1Qo{`Lv zm*&;4N>1b>KE2r~aTYPQ9^8MDS>t2fc0FuQXWBzxSD>6JP`UJ$q|(~9n z^!BYX3-ccCyG#Z)BixtWUp13+1ab5c$d34cwxwkCIfUijGZK<#v)W{aH%v31PE(?k6hjC;3Pf1r*>j0>|lno+oLwr*o*&_o?6c7>Wj!aDT36; zSA?4s&gYvN*H&*`iEX`#O`-6UQg>i`jR>`(wzJ!=-7)w+T&O32$9FZfOoNtzi-OWY!WZxMQBvVod_? zZDG$VE_cR8bQ}+3;i*VP;=Wa@#q)B%;T2ea!PrBP%07U$oX{1Uu#zS9EsJW%!GNSfzjoHR{t~pC5r7_sAQV%MI+8=QsudJS$P1 zd@-Mfxb~>y$>yNwOUtl=Ev_))SyUIggDL7MuUbS8the0<+&p}YX1Xxc(y|l6>&a5S z6D}UzWYbH+qukB)rZ)O^{(Z&nBAj`$0js)Un$K%b9&~=-eF$2A9+UV*D*FDH`520P z(CQS{9>>K1NKOD4w?d{DUSA1`|oAW~%XlL!$uVcq*JQDdwp>j{I zBVE?2FK2Y}8O!s~WaZs|eKE0WQ_FMS*D+vTfN=OlR)aj-D{g((82BX_yT$V#={N*~ z3$1gYRwl_(G^C}A?rV7D4|3x^`Yx&XwILgyfOSUbeY)c*n>5?C@t%~P1O8kt zc#o27Bb(~&+k2XmD*e?u-C!lh;UkXbbB;WCCjTfLF^d@gQHwySg$(zJQY&9C)AO>Lw@5%5LP<@>t}h&9Xy^()YzP~M$EWWaQ!rUEpDP$b0KYB z!5Or{4Rpg%J^51pF+Dk@YV7;cgqaFy@g^ic- zc!~Z$eY0fcsGlJ^Q)~Jf ze{?&WuPC#RFHP`y+O49)&NhyXt^s&Iw4%E&pEI2#s(>@QNM0`&q9QC=N zWQ~$4H!m2W*>>IzBH3P}$#SLGyp&z@>fW98;@7M8(~n$63vDXxvTY@6BWjyag4dNi zxIMW&Ui3%^RMhKEVaRtY&TRW!`xyyYYK8E*(vyqZFzYGRo?2HQoxz znB^OAXfmicWcW6y-K(`e%I#~CB=k_eLFMtM%ZAI7uO-O!rAb1}@qP8+W>3#cUW~)Z zw1_emX%?rYhMfk89knf7W|Glc|M1`v0nF5HGiTQw(SO5m8<*;1R^XxPxEYXQaNy_1oF~{gySGYQnN!O5r7Dv=6N%?v**9qN3|m~2Q{Ju( zARUSuD?}2P4EXl!OhjfZBSagh>3CV&W`j*{hK!-XI2I63u7PGv#j+ODNW`1#c~^)# zZgBSTaU@`MBrVWpM(62S(pfJ`TB23^3d{luzJ?n!R^*=M()OB@rGp;U)j{7UGNHKX ziS(YE`enDc(DpL~c8#2ya1yVSDErVq9i^=H=`$W-hln4R<6MNrqrOA7u3(kaK-AH~ z97@MnosE81(5I8&ZM__A*yT=GYVSrtrPgeanah=%(z6M%{!4caZw^%Yne8iaUfIm)(BH{Bg$tZ!|a8~Edjc!2Mf`JZ(j+0 z$1#h3a_g}O*%Ceo+!7kN7s7-)h?V*5`;5Ihp7yL??P{SWwiC=*zr`3yamc@Exw!6D z0lFQxvzJA)U?IN|&)yjP>_ZTCV0rOJgS-MgV$b|=QH0Hze<2|zTXtP z+O#9}DYs;Gpp@%Fg~Wu$t1K$}AtWm8`Nqw=As0Tq9VCue>g}D)=Gq~ZDy~3mzYJS- z*WIMPt*)@g$IHYJV@(~u<{^An^}0QJj+f_4zT6)9QbF&I;W5_JOSk)` zZAoNmQ$0-yeGn%*kX{m{b<2T;$~M*5-e7@O?Q2a!{dub!&jja)}j!B z@Mb#QZCo2Y{eZCh){3v?+V1j$gPyrvcy@=NFT9#@*Ru4;PbPbxOcH{3Jj6W8c7mHH zlHXiRBw{*xVO6UpcyR7~BBw5Pjzq&excW#xU#S4QGw{7dhzzP^P8@Y%f|8*3b5)0W z{S_K{Dx30Aqxv#Gx=@~p4@r?}ZFMK{=VrZ_d)2S-Y&;4WD+|wi)zj6&NGl<+BJ25*XU98=5+SI6t{%eWtOE%~(LG8~}@7Qu;ZPmP1hBrf^Yd3xA{fv(z zxrB6bNe)jQN5{S5XtDS2AFGjiInh^L!*SbyOIJUUE6dBjZF17vJdTr^<~nv-)~$Mu zZhZ4oMy>0E^3QZhEm^y{9yTSdryD)JKSrX(gA?q0jV*y37j^|l9daHUk`}{4(x%y6 z$$_BgI*$$W&b?tr6~~04?zap%XK}@F9z^jKiswi&j-#I*;beqQ&b!Lwd1>zp7Gnu) z-tofiTSiT)SjJV2k<#t1&R+9)qV$${pB4X3M}jIo z*33n$2kCSRHP8mzIiFc34T+XhT`)Pe38{_>-5A zxR)8H^6R4hQk#KEte+^E~DAn{}8@rLBd%2wCL)^6tW7!|C1p7wn`;3 zPnWS{TMZjdTt~TzlF{GHpv`#4TvQ`ex3)2&KUz3-`nA3(ZQrWV$*PV+Az7%D#*#EX zP47Epx^oay!IKKjUY#$ruWr*8x_jrvmB*UmPMWUoZ;KI5HH@aO_{ArLD_4#^eH*#6 z+0dmBOjA4%{aUIar>J#qh*s)|R*Yid!Ne;e&;q`cg1^H2%}NiqubK%ZJsE>hRl)Dc|Zwk}w?}Op+J#a%CE>algN#_Ar$#seH;gY~lL0 z5#BO)y3bt2ZN@4UDn~UP^Y%@_z6(z8vqk9@gYF)0M;SdU)@sb|4e-yE>EwR*K#aD< z*2drq_CSlE1+3Zg*j#o{?^Wc$%+ec)3s*IWD74Er6WMifAK%@%JW*Pk;EU4~yDwlS zJRsk%QnyRPxhn8j{fUxPq~o|SLzx8W+hscucX>KnQsa{;&%vy8`%VQZnhW^?1Yo+U zFAwpS?r{xgckIxzz+5j+eu}@mtF);CakfT$Jh&>Wi4crkA}-MzGYWqP<$S|<*?8Tt zIzGn3H=-|0`ITg4utT4D^3Wnwp?1yP!Q?c=7F`r?cOgi+jj$!kiEf7fYINMO*4yZ~ z?`-|Dvrh^8h01tH)pIm}fLryOYJ1%a{g3GnRowzjCq2KdMxi}7@+RKd>KFt>Qyv{f z(LFi#Wp$|D(T}L-x^vW;G-cZ!`sr(SF!8Pfm%^Lkq#>dkuvU*J?LvtI$5~HYoMs-8 z9SETNM>bF8(%508&MC%-K?@kpg5A#dr)#%s2-c-DiK#8GWHS+0foU$;C`+k7oF5Lp zpUOg>Gc|mj42!&g_nAnM8KTgA9=%uM1O@T5wNR0xo6I_$r zNO+N5$38o!cGEMZlDt9aDlxVBuHfS*%n{o7<*hzZkL zd@$dP2$n&?Te%FE1(nR)E~=+~32skPl2$Ja(8hP3|4b5`nVWiWq`E4Qqa(GyE+6{PA&1XHaiZN`wq z?N#i^E{V!(qa@TXhE5{QM5jJ^zfWzA8+hb-w+`Ns+Dfp*as*xGjuza>6<-bZaKESB z!nGZ5Yx7vlLUHe)BEst?7>^n1{svE>d!3tlUzWO~y1=*0tmdG+K>GMSrIDm%9}Az zX)$-dIW9N!csIJ%p_a-PP_+Q?=32PCnQp(b0Pfe|11qD^5v6l-qu+kY< zHost~PK?ZEBk~p(F3%;WrUo-{pATkBH0-enc2gDQua1%PPteSl+{_NVN}E2oVoCyvR(A8C`(58JuAo%rPLD$W4Qy`nSK zm6qWmLcZ>-QW@lfo zEHQt5h*ze-XZHL<^5p8Ow}NsQdgtI$?@{bl%2EZ7vo7D=u(0H6CwX4_&+?y!2ktl?a({^N_k5JcCJ8>a>QsEGoVk8YkI}90jcLK6| zoaPR)Vtkzl+u$JK(NA4dq@{0fU!6~#Qp8SJP3i+JC4Xc%p?{ew)srM=l?J%6&Co|VsHcb2_ zC_Fy*c-%PRRlutWZ{`dZWoKp7>ea)=1N$ApkFfdcQ{O<10>{C}qT9DFd6>V{y^_71 zv)D9zYJz2W2WINmZ2Dj%fA4A4b^Y2QYR3q*!?EMI6%FjC-wQ$st1=>tgQ%`4xZoefAr>cI?d0p62es!0Z&N!mW zn5M1k9y4)x#yUyM&^A1{QQAEIj{Vel$Hxi|Cx#QxGIOMV;Nk@*8&&PwpW1Y+_+^~F zY#k@C>JW!(xJAELNWDe(?#hhqbr{R*Hrn8KBYm_6zHbqFF|J-!^-Qku)a)}HyQb<) zp_0!Ci{Ll5`N)<~4groUi&Y+`E9*rHMuqgQ-@&Z1Rc9zIJv@4S=?Z3>&A& zp!desJIDBLjrCxIZ1%gbZ=t;M)SwJQpIf?3$b}1(%Fj8*ESBLhIJ7O}pyNF*zBowy z+&q(RwL0>ZE`sortM#^q?JjEwGphhgbj0Jkc{Cxl=jHZUeN=*uh?74*3x5}+ep}_Z zQ6WmsUQ2V*_af0)bMbMNh4V?S*m&=QoHnK7?Y2^NIt%v-5Pbc8mSkr9%=)|}KO+hXT*-E}Zd8;>Sj%{`=wy`YDC z-DALu`>@s|1JyPR7ogw_B?C)vC7PbUscX~GUwDdl)%JZ$8FpKoE`)qVB`XM7^DGI< zr<3PRsnRl?!95%1I$1ie%o(oms8hZT{^(X2QBqUD=*5cMl9C(jnc5;PQlZjXBDQE} z)v$uf=H)AVZ_zf6;in_ak|Z+C>Q(NgQHGKvNj+bCurEOOfYesx35T(W<+sX%Lc@ZE~8f|G8#4WYr1}wyzyv*>gg%E4Of+nLM%byv&(#<+x#Px-jy(e9vox}3wBlOM(_b>;LQc(b6 zy=LW-P>W1JveH%R`DQ{rT7`PfjBrv5umTfwq-KQvS)uAZzkxVZGf=KJPVD18kd zF4Kj5Vvb;nxG6Cc=x@)#nj81t-=^23R9|A^ezI~(sTaC4SZKc{zcuSFMRh#?!Oh^T z8=-F`4a5$n4NV%w0-xIsMD^k78EWj^ynY;c>~gM-)VcVRynHbJwh(;cG_yjB(54hG5{gl&}vH*&JPmeW@JK!dvhHa8w~ z?ae)$xg?dOafiNCYkZ|k49_-}Zi=2mfvW2u>UrPy{=l&emf}`vzN44f-=B#wXG8L~Gi~8QvAria755np2m?VQs?lJw$R_a$Ftz`GSUzBJ%fRodk zyApECmwULs1uWW*FQIv8Nm|E!zb0scbP0_ZJ})+-QVeLE^zs)fuBRzx#(;H*TjV$9 z+l-hDtJH4WYj)HKzbuZMi#N4YTzQ~V__DMq-Bl>9ge2UZ4>v7y5*AgDZ*CqC*^Oi?k22avFTQY-PiOX-=>ScuB`)xtzAJV1;-@Spm_O@fl){9@+O= zZ*xk?M%>eVH{8;uby@lQfGz41k||;niZ33xXbS(1tmop*ru6Ul*doa><2~v2bdR}S zEUls{!Ngg*P>H1rbJa9loSf_(x_4Ku4e}Ci z@niTSr`&fAW@g=qLLKDPD6 z!QM^joUE7Y6WiTSAp4e+f?p{SeOMux2E3vd8y+5BRGP7)^}asTkho>fUBWr*ppokS z$|(L5&)R;q5j>*)$0LMlz}c{Rs+)hVcH%vNH-Q(wf|$E=XKnPo;#YXvZ5Smk5o;ZVd?OzI3&M79rOo@y z&jNd$j&(9O)OT^ZZ)ZMxH+7h~67*?{xw+ld_hmx*3Ii&nvMQ0oS6^__4O|Tc zTu9v5@Bw>YZ8KeLj`F~Ct0bAe;GB0Ro-86G{hS=b*M<8Z6#3;5w#-MuE6R_D&22m{ zX9RU~K7E+;RwJ{x>TU3Yq+3Q=Urz9fPO?&88<{f=!FDQ<7xbo89*s9X=tyzkd#l}A zxpCd^!=oIFZ+$j_qpo2jrl++Chqu8Ccf`iEbOZ-;xG4a zcaj*(oMf9Okav)u&Azm|(h{7#c_&+^>GN;`-?;aafH~VbQ12{^$hW=DB2mb*TjicI810MTTCkv^K4Y`l- zRifa!jI9w?mn!Qd>vv@9NTvo(9uvjjoS+@~R|zfNytV!gqH0gS6=Wb3D7B|rxpqGe z(UKtp*% zIbSELb<0F0!7C=-ns;fq#lGG4&@1&l9POnkV~DtH`6%n1YWADJ=$gv@gBpSzT`NIJ z!pvz;ij%SWrJ1RBTN6!5v|Hai^Rwa%VTqp4-aD3P7Q`l9L%d-0+I4z3O)2EU`H=mq ztIXnKSC4?a1r`m|XYuUYp*6Y>*3Q>c7@(@*D+46=MBk^*u?2)v@vmhur>xpNShWyK zv?+OgG0;$|(9TE(ti~6#9}e3VxZ0=`vh3Oj<)ajj)!Zat zDtQ`}i-%=UK~Bb-JQ5PjNtSP}K%RsX=4$g`ZKi*otGHNykn7arQ{PL!t#{x2wr0Jy z{BUs3NtjZBS^CQ5y_{}W$X_7i&h;Fg_jJ-(Q`*NnH-LYGIAi*New^O%Q@hjkbC&e! z0kh#53Qec*>BkaT#h0mwdW54s-%jlB-+a}3Sk^binS*DlT<^jE^@3-U8Yzn`<9_~3 z!^>#O7V2}GOtmyZFE<;@LUI`JRO>!?H#7+O`95T?z1Y;Wa(Y3N?mqv6Sa-@XvWWA% zONzWHvTefQsl3_>+C{6~&h(_daqRT%`?fm?3t^dUkufAIlh0`rqH<`-vtWXdw75#9 z!%n)(Mm`^Jhig<_H3=HEx95GTT!@ZVpIHIDNjRQ2XOLrSwVg-4BUZ z%<>BFTWVEZ$@I6kv43Hj{nWqlZDZB#ye!r5a@Cc=>;z$Ud1-!=^GWnIyF}?d!&_={ ztSf8pZxE|JqkD1w-rKH%96CD=UYZtHrs0GnTQmJ~M#lYvLc(?reyz}Ik!e$9aN2pF zl=!yL)h|9224#lhIJH)8DI-fo1MR*o*!@l|s&dt+&k;@XBTk3eFapy6z=?!|AjxhoKc$ck^* z?_1KTfCHm;WS;bf9ge!M@G1l6NM`UD6sIY>7-G?WX4Gc*neT?j=*i$~@s<=>6sq zeLl8^Of??drJ8>Kts`xq>J|@?)>OA%f z2-;j*S!PgVw~tI8@6nKtnxn7mYmnl>{^B36?0+@(``yA>@mQ?sD3=NR((k8V_9%5V zPG^^!zIbc1%Km@sy=7Qk%a$&@Sg>#pPH-o<1=nD~Az1KW!Civ8yE_Dj;O_1&!8JI+ zCAfSm$=;`T_uYN&InUQm|GM>qxu{uHbCiuSs^+Zs&3>dpg^HhNVd0$zSQ9A*ERR8E z!z-J0)qHD$ZS5Qo7ZdI8>FcF}4bCTLRcWC&^xIabAFd zAxod4!rPi_FSfw9jmc^}T2@m0Bs-eccwxFbN8jM|jnwLK16oI4$!<7iwoaUb@9st} z<90g&TYI_oB2VXJ;c;m7@m~9J)U4h0G5j^m8n^w;K>sW5W*5d1k0)0t0gV|a!wU{I zxQTG3X2c3}`WCm-K!Qh|?1l%uk2>u(2Skyc&N~mM3wAK;d%>ZJPY>8$a)dAM_NIxD z%$+wXi3D!HCS*Ro^tcN(u5Y(HXS@3J{265(V*vJvK#*Bl=tTV?QC{DV&?~(HhJ1t6 zKR3jA(AHLfPgo##7pfJNz6XJ_lSUdn#7|pKJbMtsXet>o|KoJF-v039D`Lr@f;TVe zd%9Je;jTz!A&SUDQH?41!Z?lnVM!E&Frj*qZ!&FiHKt_t11=lwrSE(%BQE1=wBM6B zNY*Njs)2V}_XbX*zln6i1fn3evpj5^UVUr()^gEK#QoadXwUa^tVk+)nQ6IMxqEHL zbLcCKj2n1Hd`l`6Ut>YXs6-MSv@P{5d>>vIm76kw3xl_DP3y_Ta>Vg|FrVP@V(_(95DN%O*+{o?x50tq`OW2n+evxAv1@ z)YQU3q!NB!n%g|k{%&R+7eAALJywD3!js~*!e&%DLXJ_$a3&sxC90)b74^>PCY(9;{`Q;MIqE{vW4`MK|w0%y|?RAzRt|EP$2+0V5r>!+;2BTuno2~Fo8QdM}U}y?Y zp4Ie)<-+Q%vY^hR6(fIZ;aPSde^}636{bV_#7(UNWC(jb+$#;S$Vn>Z3qoA0!QM0S zeAI+exOj+z`dRt_$Z$S{rFr)xS^ zWHs;cNSbw_wUA7<=$V)-3-gVZXCk`k6n%dvQ4mlv>K|51}(~n#2)bKCzFXlShY{Jx-M$*Mx+* zEwv9m>=nq_?GQu$_S6KxxETn7a!iXvkC3c?8g%*L&xYGOX=f<~mk^9%C&8&VndPE} zGF20gP=)r0)(88cDln?fi6F=-52@#MCk(bQpM;#NrATg!&=*+OT7TWIOBuq@zL$<| zCnRDK-V-o^YumQ%uE%`4*UgE;LifHrd$aA@tj5Soo5j|bI1~=dcq35d`r}B@9eGN z`QxOL!b8x{Mg5#z>??8(O>5nRmC9+~ayL7JS^C;mFKu6*=a8Sh^r3!8^{K7W0o{7l zRm>Juu7Zfz5k`MBs#A>4H<7|yk=rN3AFjKcK%i4TfW9V((+6Z#@ve0@^r_3XrmJi z=(-wr#yIsP5_}xnaH??OZ#~q1>3lvIL5TIAyqA)W|Mc$Xr+r_ji}5ht<|-QO^?i?s zA`2njfGvc;z{ZM3OZ9@6)C7nsMCC<8SdxWx_wk4J%Kg}h$F*y{MAu>nv7{pA3p8#Ez1;q^lCYk4M;kM^ z882E|yIHUc$Qf(hRHSGXZL1PA51r{cax;fLRVJ8BaYpbxmJKC}$@D~HVvS_vWQHZ> zwCi}4HrwoL`udlabgIe4Uu2|wh8uf3OHrm>H!sCXPa(>R6Z=_GZbU+Qj)KxTJT)(T zOj7FWjTt(6EUZr)ww@F^oe*L@DL;8oGzPObxewfj08BJf(Gij$0d=(ZW*8us~&Hb_E2=%MxaANaiG`X4iIw6 z{pjEzlx5*TVpCx~k zQ*?Bynsn8|V$S9w_JLyTO4{-hNySt4=ge`+P;%_z0ZCh&7Pps>5s$nCW4dg2Y42}x zlFPWO^y>@hKJ>KIrdETly)D@8m=3iki5>7IO+Ha6?~sqyZ6TwMtP#J(Q$o;)XEaWp zAY|7b2ocr-(mV2cy51jRe`|2j^;i_+Wvuvdhvody>jrB|H^7w=K4S0F>3*!4HT1zg z!AE@bG#1b3CNFO^cB^%LYgP92G4vU#l#e!@3OaP10=h4tv-;B`g=jG9PB%9Q*Ph`p z=1v^vdO_LY?Yk1}uI}x~Eak#Ffk{UV5-uGM1WrJhfm}m^FU+wV%pcdv^L&#a60hIm zwfUK596+cxp18h3d5x6NLSJm)Z{0U_w3H1Iq3zG>n^QBCX0W3@!!5*Rmu%& zE9f)uZ{V*}Bat9p7q>b}s#*J}G>f&8n8|22h4_QNbiEBpZUTDl+Hf-s2w_MAm+G^l zmIXu0v^mjN+_bx4gS>;+8B+%vEsCkX&Q5N8rQ$?V)oWQE_yI&vuPD89tH&~} z-pnS=YM39GGCG5wS0Hw7!IN97#AA8!;lLROl1%#t1ce~t>=Ve@&`iAlpa45Z^xLKA z`?RGHqIFnuF)|umsISLDs@qTkr2ZW?ttVWL=^+aPTCgWHp9=c?ALqEL<+| zLChZrVi$(sSf)477~3^vMP_T@Kql>NxQn`8Q{Q))iifA+y@JQQ_*i-LAkd7=sFlU2 z*-j&)HfZfog?097Le7GA)7w9)%JLg^Y@&$V0J8nXJO8p`{!$}R_v$T6;#V^7DBQ-# zo<~$ILm$&qv$L9|LpxcQd4Frk!{`I%o$wFvX+gLir47tfj8gNcBKWx0(U16DJ$fYR1uq=3tGpVc zF%`I!decQ!?GsdM7T=Bdg2BdIJbBr900fjdUfl&f?EF~sAKY1cw1DNq2Fg6VYzoS# z<7C%gvHd(ByQ$&T6AktxtVRp+VVdg?SKl*8$cCvsxrd)?y~E}nva-T)$!b46rC)QZ zYOd6nQA}i_pn8^47*)|zWDT=ONJF|a?>BuhX9sU_gIQ_s=%6$!gNX>yEOpwiZ(4TX zUlWY1-;lBVv5DA8>bU%Yl~!08XUkvc25m7_!25GLlCliD=`FiQ>9Ec#^P4a++V0mL zVYCt&G{sBnSSXH1>##)jZ28VPA0kTfs&zCsMZEc%b*Or^6Kl!y7#E9tWlKlY)#Q9f zy%Wp5Rc12PSmhEElM{;~x}cllO#&R7wkBpn+=pN)YgZ+1VMcVwFqk&3LSi7hP^=}e zQsNmgs)Zafd12u&+{hohoLF3sr#lggSIur!@>S94_2!d|_ngKk%@&JN#N7m^n^Mx( zFoL_vjNUK5yNS0Pon_6_aKv&a15n^@JLke!PTd|L{J@WEXC7{n%uH>pd)7a$W_p&V zVBIygd`e$971+T^URbmmB4$;kPavSX5sd?BgDydR2Td}a8Kg2Y7(w%rm8iyt7Z5(B(#SZeqGf)mIRI~`-;3S z)SX|ko7|klF6|4$YN!jA3U~TS=RrG+I@!e4OuBT2+VU+0Wl%WHuaPb4{$zkGMgEAI zo^H8p$MNVca;y?QbI-!^uqd(a^wfR~O1%MyVT`c7!>{*4cT)*)r+opnxox*5GtTOi zhI+(*e5rN%*gY+`)%N9~ti+YUVdpT$-HC(TaoA#cbdkVaqEntqTI;xe>N;c}TG3;b zi=;_G+>2uPB<<>jz?%pb?bZ&rAI)idRvA2b#zwL*V&Cm`b2;o)@jv!)?PNQ zthuVUBUH-p4BcrYS@b#?W|5tH`VIsL>L!HWt#mIc%&M!?_trN)*&|c)!5y{Gwdn0S zF(@2WC(pH2ueDS=;Zo;d+rP%Hj~|%fhU`X&DckT+t%kR{8CA=_PrZHprADK-Y30Hd zTSkr6^YY#!t7h#)s>A|(gkW3IjbSB`v{UTl4(*lZsg~p+%hI)lAnQwS$xWw4BFEX3 zuJ4HQjt9rfU)$uzE?{`57sP-UM{@qQV%KOs6qub zc+HE1ybCiN@M%9me37R}?;UwYU}xN?piE>oH_qaMl4GKqpmk#IWzqtIJO|FL26IN& zy}od-Z5y3%LDRFYmS#n)JrGmCV7coUH9-z_bE(?|age$oU3 z8lmV_{d_g;I-ke7W`Qayys?5zwZ(Ulans>O%+Ep;tu$MZE2qDc#HlA6gjp>-rWPAb zsV^gzLT4x&%({cfWh^6`lE%(uf{~fC_p*0w<}O_yv$r^ni)wZxCFw#jE^(s;V>^#_ zC*-Ebjg+5N9|B?Y)^td<`nAj|o9o1uP&JGU;jbTd1Z*=x7oIlR`O9DAjyg5SiCSOR zqgEUpC~Mryq#qOTTILY7_E5X@`~%%};zvK0%;tKn?1f0TL?#NM$M{xHh6HfngjEld|wh!kgw)!%#wKi@0t> z?esT$HeUm_LDck*k63bC4hc3a^-CKzrXx(OBwn8K)@PQ!E7d8k%dAg37~B?O^X^)U ze5a1JS1?p;ge-+-@|^OY6UW*dUjQTPL~^Lh9vz9tb^3OV&_bNYl~`?68s=rQ4@QEd z4QfnLU%zJ;$$9GCCz+f@Id8U;#vtJumI%7&;j;M@F5UGe-nKYODLzy#c0$|oyofWD!>p}+oa7vpg(+X-Eb?2CYY&8_b*!^u5F(nOPdIBsrecr=Jr z=MPoAAOK7Y!K8oF%0Hot{sb5L|BrzG8zAq0761OfVBY^i4+cX>{e-+{{sqDXhW!7x z!0f@S2>&LS{lA0&!^R0FBKZrdw~~xi8WU>k#j91cT#VVns?@g%$hYz{#a#4!%E|^E zPzAbC0yT@CYs^tdMKzN{FlK!hXR9qXRYVP4qcZ2QU$Fgz-EV6nV+!t1P;?RN>zz=p zVUN#sL7q5I(1Z1l@QjoawpWLIp9m`KU1TbyI@`)NMxj4pKOkR-;n{0)t!jJYzkIWF zx5NR=kDRp$si=b~BO5{j(dxaWM^F%=m2d^UEl*dOV%xGSM#n3qqp>-v#DgfKHMM?o zN%f4zyVJS(;+qUVNj!sudr#|9-xpjbl66FfLv}aTfC{4AdS%zkiJQZ`&;(?hVB(8tx2PIbgA^A^{n{!WnKN=vkE(y z#0iSw;W;B31lIxat=Uj1-4Z-+%lXC>&^JR=72eMi8j565jEk}B#)VC#GkA40d7}90*1Sb7;|rNz20AQ}7_;pCHXCE!DN%qNA&(^w5p<_J zG1g)qw%t4f=Z)3K({mqgaJmIc9Wf^9kdEBUGaM6ubb$u@ZzkKncH)!cpCJXgMU6`V zg)sV^Mv3A`F~FNVC-Ma&Iyn2HQNpLhK}M4_98NVPE0qhis7+MPHRPot*FKgjxz9OI z{<2z*=HZLU4Czg7N#m}pYu7mHw%p|E35f`<_b@z-KY+7LlOb{Daq_Jz^3+z)3n3#3 zX>@xCYU8tPdu?~T4#`#*k>++nwgcz=*BmAe)MZ5YsB#7RdSeZ`!b~&`6iM(Rq*$SF zlu)rz%7bV=w&Jhll>%E-C~8CtKM=D67sMdn)F5N*2W6aXoTPX;2+nhgVPG_?_g}e& zykjcN&dwK>^Ew?PDt%;yuYh*MddD_WYCbPYfFTpUNb^RzD5lOxKI~G0O?CCC1~peu zlwES8UB0-&(rRS2ziM>m4DoW!%pM#ho19#-_MPXtS|YHmS=yYQ`u)W^Inc#xvd5^s{Y#8yKw&k_c#6bm(R_G ze!Fm7oLqlFV&heDYTpTe?@K3?(1kP#`8o{SJ))E=h%i~j&$xykkU!l=aF~CF zq}{xJ+_JkY^*p38n6P@e;)R=Y2?KE-C=BxDF@ z;)Jv;*@=_yhI2!GU-fFh+lUkV8l81dPih|@I~Nhjp1?V6>$7pH_MuPKE64rTJ(3e_ zy{DH%uEHP9JRgxZv-{cA1IpTFz}{}1rY{DxHgU$U~lnPq;n z%=~7Y`7ajtFT^rGS!RCv+rRAZPq6!+5Q*S_z{E1l|Hum-p#OzfhEYxKgDIGz2h3X| zW&uw6JKImDp8t+;2FywDZ`$a;tiJyHZ$_Azxc(Dl?pM_{s|_(!5ApBMOmdhW16A!7 zQfP|8#M!NdT;F(WX9lr3uw8VOmX^22+iTtDBbLazX;sUJp@5FRPR%9Xx-vCs%ilzy zP`|Mft48wwVt?w$^xk|EYHVEGYGVr$QO4G>{#5LB>@B7>#OB%d3>0)?G@mj*t{dHn z-ZozjHEnwkA#~WBfURyA6OuG4y&7QBhzWxUNZGnq-pPh1ZFOiEh-wHE4MEZ7zHp5f zKU;XXLZ~uVftL%UxA%9l2>D=mqJ?3jl0<=}*1AsX+JDz}_ma&xH{kIoc96ex#F#GQ zcs*U6C@*~0xKMT;68pNBL0f#Mh%-~hnDyeBV|7iBw&=tp2BhUjPcDBzzz@ zRz|`G}2R} z95Qs_ACHkkpXyVZ(CstDqOpsIpp&SUv>+0TcDqmEECkEpnDPkXgcZ6(soyut7GX$K z<@r7YzL8%zQ`D=BQ1Db4N2+F{(N%~H;lc{M)@TYnmJ))R^UxoZR3S{r(4~jy+51eV^u9f2 zJYU9O8XWOJlxC$<4QbwoP}W&#;s_ozhbEwbdwcmlLMnoZ0Nn!SO9a<*E43~`LjNu* z6$z4BKaW`DNBHPBUAspE^4q9ajz@89!ndwx3&t`aKDqBT?x*C4)8h9`&xC zJ2uKsn(9GVB-_{M(v3m#SwRzeX1531*c@Lw&rI|&#fN1Z0;P2)h237ERUIOikrm{Z zbJ^C_J=`Gp86AglSZ3qS1pavB%Hf?aFO2Qy3_UrrmItFF$eV+{XY^Ei@yH*tc6AHZ z_B}SBm+K_luuLbTO!B!sPVA}=3EI0EqKCRWmla@c*)_!2P+lMOm1nGwODD|Z1q>jl z4>~<~SWK8-8@Uy0eOG_c_i297q06NY`e|E;NYZ7KHRIA#_6f7>sJ-R5onX}$j~Vb; zD3An={luw}{`_FY)I`@H7zJ+we1hQ=Qo5umHFwUr9hM2eWXg>EHx}V9+Y&;SmR4Z) zu%D}4MaKUD^YDk({ipUp+}6s$n)nYkm;X6RvVYH5{Ks1DU$zyDk``bdF%hl5HyPl& zVDs^75&F-p2bd!D-?Sco?nG!X|3Xbx1ly=zM))TU)z5ANUw_dOfUm!HzraHLGJRTq z`bod~xYN^q1Q||HX-HHnO+)Af)k+4{WwBtY)Fz}A_~|}KZwss z3Z!29MoeFspg)UG3&04-zzDc^4RazOTJPN22WdZJ^RrY0LN5|%YrKzTG3ZFXHY+vuPh#onxRuu2V^EkgjF5bMib_14dnQbQGdq-u2~$ zJvkGn$i2YzpwX)v#fK0S#euU3#H&gTA*k01SmVT^nFII|;yB7U3>~F(msc`1Iky0Q z$^yD?jADctA!4u-+fdN$hNu*FYFmRNy(Z|T`qz&nz{GsBS^R)Q%G%;g23tPH5*uxb zIIW8;TZOEJ9vrX_B7uSah$Su z0-h-IM%H>mglFZ|GGcz05nIMp6Gdb~`a zRVAaN<5dmau5ElU!pRF@Gdrv_Z zR0ODNKwGz27h?Nm>+%t&<-ss77HU&H)2b3LT3YyhN2N042saRnu?142o^9}GD`P?H z1`8e@Qj+cOABj)w!&uofFp#~R(W_EsvcOfhr}SRn&RD6tZ5T|Kdf_93Vx=g4TN#@8 zN)~}fpoz(MO1tW_!3jmre44!i5gC=vMHJlzhZLQHb%iY zw8WSsqEjv=oQQshmC=IjiZPqT^tSe_{uAjvp|`-1#k9S@gnxV(X52Hq-#sH5LyMO` zy7A(Wv!s(w9S^(udDhtX=ZF^6Z@U%2Z8?|5H0VL(IhQAuL{TD^V&L;ui%X?-`TPrR z$X$!H_1!~C5co!X>4>)qRC!%MI2&5d<%VoaVMzPMYtyq5vHGw{6^xWD0@VSP{fzg_ zPvVogAGo#OZtty5z56~{{;~D*VYa$o6GI4Wl`WKv`N=9y@#||b?`nO_AjvlRyBiei zr)_wKDfKp?!9u$OOnv9VwXZDx91f_IU)XfUQABREELnx4gqnPf(%ObM^DB+i!+0QN zPCyn^6-k4Q*WXo3B8jH7+V;Z-E~TyHHZe;0J^@$` zm#n+S&Qz$?uOEyeNIqOKM`ZqJ;LGgaz6-)sppUFE%Wsyc?n%EiCU&l+1A!Nf1Qk!I zUvsE8KMal7z=bNXx{|@VifQ5oSCva!d{P_f=hJ84JlWl&G1k=U9Lc(?2*iS#V)I6y z=Y0O=W=~srqIK<%sQ81+^ON4)XZ7$~bKXgor9evlrJuy3;pggvCmi>C+`x)vQLhBwl6qG)xt~a`(RhO zZ0=;N?$Sy&d!FKFi5upstNe&`JxtmS39V~rpfim~NIg>G_Xg+jsjArnAekTDDp}o& zT2Hd@cn{Kcu~Qr{%H*CC=&`hXFs=)&k0?>Z&y!xvmBGEV-1oVc1O8~poD*@B&xVx` z@0j3!2c*FpHH>%*tKU#l*1<+IvmnZ2yo=K57L<59hMop5MAq#Dxj+4#Jbv6wMhaU- zj&p1?;zh?8@)IOnt6$_J>NAak3{J`?;a7LsnjKu&F=fmnu^E%lMyZ`QrrpeW&~p@F z2c6F#8~}dJ9sJ+;QNL(y{xGb=YF))uLCnK0H*UDDu7cJQvLq`*R zLvdTZPk(adz7cu%2dVQPY>g~nTz$!3WUgT5RWRo>n55=c0VWoP_O>Sae=_JYGl41c zelftP{p0(sUw+AN==eWYv%jhFelkP+he>~)e?A5v3xRpq4FLv#pW%54AOZmXBS3pz`(-7!hqo5!2u5OcR=~$`n&>w0tkU$8X>?!-~)jW05rgJ4`2!a z0RaGjK);^z`wtuhxO5OS3@khXD)`>dpe^$I3IP0h4-Os;{RIXl7B&tp9tkNKIRzyZ zH4QD8i<=G1tH8;{EhH@RMpR5(Lh`MGqS8BM6;(C$_j(`n4GfKpKbn}@fT;!@9G#p$ zxp@2d`uPV01_g&i$Hd0PCnP2%r+m)N$<50zC@dDl?k<&UfDo7=nRMF8wisRaP-UVjSx#}(yy;&0+6 z|0ZtgZ{nu^ChqIs#LfIo-0a`P&HYW>|C0~p`Tw;a%JbiizrXv4^sfYr|B7N$6c+|_ z7XG9%mj8n){J+cflRO-()_&25|I$u>>chX%-2a;z5zK?j^$(T!lO7nn68g2C{gdnE zU(=7^lUb_wav17ZZO{J6g~19hoXBLFI$hl2$<;C)5 zMth<$^~=YQZ381mlk zthJ|%32NLg)*ci;y>~ynNmPnqs%cTaWs-hXB`zr`i7WSXe%GFVF@Es+9RdH;^3>u2 zW=c#8YSU%!=kC8GdKmVUHlBU!v>Ck9?r?pz_A(>pCG1*&r(TkZL1au!3`@qtw-YOA zW3l`L10}QZ?Wa_c92V$SNkOkseEF8}Xk~^;M@7j*;_^YjRjJT2k~9tyjMWN0?3%xx zY2JseYLJf{0KJZQ6b-H|OOjWH3P^ui(m$uF-t|Li&qqN`wc&`6Q=+pTuQ3xfJa?6tO?$cf3Sey( zW9cS+m&Cd0L9RN;mUs_j`Ys&GtJ6f>Xzz7z*0*nZpf=L?F|cQ1)j;0*9k+yL>U;kt zpzfOMs&n3-G8ricVLQHa++Q_tLb!)tE&52WA#Z>5hg>$O9_5?{bFB@J>%B+vhAfO; zT1YEc9bbV;lxQA=_^D&sd#w%@r)cB43vN*tjWmt@`tqFUmmdI@E`ENfdX_8-*Itj_+jNi3x{By;2N&k1LOW zYv{;|Q;o4!Hr6#_ZBKIJqdUX^7vJ5U zv3G%%u6KQ))*SZyZ~z8+BTF(-fnmBi*PNZhR^RE13}YwC1;@IogINn2^F11kG5%>l=q-l4MFUgH_T#(3M4{cbI7-dm$ykXEoUT`S6F}xBYQ` zdc~BV3#N_>4@p~m2BFGagaYO0$e_|Z_@<}K7aJXfM#&m|+^`ogRLK?`Tk_Fnva>M` zqvk$O(JIv9?q*oKo1W5xkFBBdvuYVyXN07L_*>Vsl~JNE?uIDGl6@7fAtEslE|xr& z^b0n${me`H;XSDl;N)eCf$~QKPLoW)rh26X7 z0{cEe565`zX5DaptpIXzz$`e#i*ts>5|;;=^4<&APIFWz)YS7g(^S7JeU zdEfmaib;BgoGF;LWHM&X+3U-(=e~N!B7k%#ZdF|)D79npxLalfXOkyDi{3F3bAGI zvUjBc<_^@X|NSdAoGGJ8Rh>~!mFm9DOOADiuaYg=F2@A>V)znqk}p$roj)(bt=PYA zd3j(srOeYgtbVuB(U_weBQf;CfI&*<)A>8`@%V44^^{N?27vxq$HU6jmmUr%%rUE_ z9I_BI{+rZwk-0KopHNi#~G0sh^VT5!Cq|4@pjJcGT)l2aI7ir zP`kLP#ivX`giZHN#Iykq@Mg$xqxc`~b<2ZRevyQkQA8p$RLw)%%O^&c-Qt%D zT=pBCdXO{ORy`j=^qm@~wF%pvlN!GsZo~`reVZCCM-47~2$8t?WPatO-F9`fKA;rc zc|-%)QaOtZPbSXG-P~V~){JU-1xrEDY@YVUjXk?A06}+YH4xAEa3CxcejtU*XF6E7 zxSU*_M96)ei|GLeJ)kH7BA`EM&G}frYtv9?pP3=q=aglMdfwvwcd4rqVkZ z^^X=^OayI~lIRQ$#0vVQ+2x~A>@V=@#pqZYd)*UyhfN$=bx8avJ!;CzRLESROy!fs zI_U;InOzl=)G#A%{lxoxqWGw2$@4_XAk}uM3#~;;7f7A5zLl^DL8u!p=wQEH%P!_8 zG3a{@b3&-u%;!JZ9I}STcOBuJLlusKAL^HBE&4<5`4+Xxs$JwkJrUn4=1x;D{8emH z9d9$mgv0jT-szqlu9-@3fW@j=$>}1;aXaOGF`eu8ItFU4WKe_uUDKB?N<7>2o^a!t zpg@-9D$OF>PXI}zK;BIU${HmCWi1Q(CuB)$pqAQiI>oftvgz+@w6zIwri zDSmM9JxEzB4FjcX6#aqdiOt_EGCK`}mvl0VPGRUR+Q|2DuMIjncwttub65f#4V7dD z^m0V(@~;WrdtZn;J>Ln@kMd-L zM)+oxDcr?WIzSi)wL#Kev69;;Dk^RYQ_1Qw(=+cYC1$e$)l$;*cn8T^-2k3`m6HGgBj+W2I(HTCd0 zjhdR0$R1vvoO2H&E2{$IFF!Xhl3rV_TB%82Y5k_Fe_3E&wyxhvn3;_!0;NXCXi7B6i zjW(P>|B8X3Z`&plsF(TT)cURqOPk-5Buaj-{*)Y^U_!@9jk9zt%5)erp~jy}9@X~F zbuIS#t5V&)$x{;sU}~)2X({lp?K?5@(u;0uST$UJ+%^rhT?uM-2^= z`<*>Ei26eh7es#~QF%$pa=n#~zJ3n1A8Xf<<8D-i!5}&($okXE0)UIFK14e31pDiE zOM7_KRWn(Lv(imuE= zjb49${{~(UB|!&RCe@M(`J38-Crg9QSFG(@w>fHzI7at4#2i?vevHC?%@s=|LN(;4Bu9e-{axtY-3~N z@UUdYlpu6|b@l1=8>B!+F{mfKhoiRq0xI27JAmN`>W6nmz4+eC%j{WZRb4}DCobDP zXlOfF(qNa9Ls!I5P5wN_qWk3f&NlTs4zg!G;oV(1KaiK$!}#{;X@%jmIY%&pY3<_0 z?szcrfQ=Ls4JRMpc0c<9g1yFw#ym`Ss`_^C%*8akm|uUJ(sCNgyQX$Hd>nKuEjXd#hBmAl$p1LB6ppL8^_#mdrvRs-w-)xWo&Uw|j$^BoCUIVT4PhpepZ z&DlHp^&jsdOz8Bc7t~hvJ&da6kmJ+pMNem{ThlId-kLHBGQ3C{apKz5-`l|OBX&MH z^bJS;4j4&2YJ>fR0JUZ`@X$u2`|JpQLKnD81w5ZL%ja~OqDmpucgxGlp8E4tzO-(s zX=w0pb8qxd*LltM?8w!_q65x5fP(b0W1hF?hE7gS<3_Ho_YV)txX(Whuy5}#_ow+H z-sVl2bKKgfc?op^4YcN;i%}8DDgg4sy}iBd76bX~OW;LgyXW)8E(!q+2K<(nIg%r% zii!$eIJ5vV0@E7}FIeKl*m*iY2M_^J`_;5I6D(ZlCU`dDrA>jd@U(@t=b#*;G@q+~dL{a|~ zJ^?BCuC}%|1c{57sD6XEs&MY$fs+m(nEkUk@E?U8k(!&E|0AZ>g9K}SZEg1-k4u(E z`ZM)(u{Q`HfuRQYi2O&Co$ha;QevAx(m81diX0etz))7R64n)+;?)+ci00QjSxqF1MI2 zK11BiX|ez%4>aIQTfby@MYvBdwcPw8ZKa>?K58G1Wqh`nCQ%&)oSAIZA3V$I>*`$6 znM4sPR$MVJYXs+4I)OrTa5(uFa|8#yKp*tmKsqysobD%na0PlSIe)mcPJTp1+q(F4 z3pZUYSO`^uMJCmK>@upYuw)-v8lU!h-Tk}A_{_b_!j>5Kii@I*oWp?|=!)2t3%s-K zy-#*BCa{~wc`5x~AF&3seDnG?Xq<`q{vJIsY8xR=q;u!s+j zj%weR78TLl!YS2yHN?*6UpZuCP5Tb_?%fHFFOk_JyC@tay{ceIZhpyS59!Ml*3Pq& zeJSic*m`1)k5~q3f$8P13Tg#pP9?re9$AX|G!S!vumLn@3UHDq zWWYN4_R~o>xHTO&h_P^ph!QiIz-k2A@V6QnjT~_KR^t<`hA>g&e!(dqTyvV(z@yet zFNBcPR?zBoO^`S>g$0|Q`TW`oto(Z3uOBVdH@(kFh0q>O4j@q*xV;beFsaR{DC)ke z7C>mo(Js8-t=wo@*`XkIb<%?{OqaI6c9B!3x{-CBd7EqBuS>RACOZbS9|j-*vxv)14!cWrAP@Ur!^T3~{9U?dJ(@A$xfS|gGV z*JAStL1JvY5grS$SV7Q#c2+ryHG#*U*CVQc2J|9Q0~Aus0>#C}D+Jpm)VxX%VC>S7 zV}RiKR@4iDpy~Y)yluW^i=GMssQsL@Y6vy&!QW&7+`)ByuiZ0g&HP z1<)Lm=7$uKJG&?wSP$y|`F%6qvuCUmgEF z0%o4PzIt`WH;`T0Y(5TKJ?nKDKO~OnK$muYSZ&AUrG2HErn)-G62vbFLrkZZ5S*iK zw&~Xm+yo()qh13Lyv!)AUTBEXgTHw=R?E_4h&}Q;*M=790;jD9#2$LTj2Lip9N_BZ zuNQ%*gTjZZzQ?TY)D1i=6<>D+xR9KnYk~8EEebn3yMRD@P0gF%RhCzg3Bj@!nU~Un zLx55}sOgKa+0`%$Q}Er-Y@Du(Y{`!L0y%;IDIloI3k24kSlHN!iHY$)tCyf0`=s45 zW<_=Q3E@Vc%aL&%D;A{;@8cG0)CrVQCvg4kWfL|I0YQ3NT3UL#mYN#zAGH&m(ewrR zy}BB%7}<4%0s2p?YL1B0zjUl=e+v|I)+P5j#-S6oCm zikVy^2=p$7ws%f&Co`}+$E>ZHJ59rbAjF%Fbe3IL=C(pz62uT)l6 ziboQnA&iWU{u((WMMi>jx_H|!A&>!!of=v4)SRS%EEFSUR$}l#RxJb_FE_Gsb8~|` zg_U(P2;jw!qx{FnU2d@1oGsPp0g;iB4dLS=qPYGxC8pkP{5rJpvvYH1wTs8c3`d7p?0$BrN>1^f4Q z{xS_9?Nm|+Jvg>SvG&5hi~|DjV!pE&RtTz0aMi=~014SV9=Xg7|MS3yMlb-S+qq8A z3C6Ufw*4CIPX_nP$TStG=BOjbsw2?81XcBf-X{=y{w-4WxWAv=Sp`TvM8|?Hn>7h1 z*c_{$RnxWW99cG564#DKxB?H+EnL!}KPnRgDmlFJ$*A`dNYK9qS~B0R7ki8GL*B|V zVbTH0pss+B0b`APOjzqN^O@ZnKZouL#FeI_uOR(;CRjrjM=Nwt&_xmas;?KZ{Q}7| zgE#$IKq<;G+(@M$l6ju5@)nUds3Sh=9|=1v0C0L(PW!U|$GFt2xUYSU<{+l42#ACH zU3Dh9D0uR@=zT%P-vW07tC%z(0BjI{^bl&KNt_)NC*UK@uew`+HQ6EXS5|y*=Qno% z)rEGK13-WQhTkm>*1lB;|8`Qxy81uIA=u?ARguJgjTgSTslVNt29?S0&dtZydaMHx zv;BOSxDqiff#vnc8QmZR+YO?(5ehx>2+}HXk4q*f-+{YAbF7UP{E+OVWSRX%g{43B1%b_fvnK3jav<{uEM+sj0TdTeSNI=dPz}- zBSl*yI9F+2Pla@;+02x!jiO831x%OSJzi;!B;<2B-x{1QkP}5FBp`^-m@~AIG8C5^ zdW@X-R1b7`zmCUICXSSaprE{Fh>OJpN5Ts%t+XVFa)yYV7awJDVc{9ctpWp_ZI^6jIsfG=dj{Jvqj3g%{19 zW__xacj2Wm>xw4hgc2g~D_pB!_e7(mJ_H>AuPPMiMyHGX^C=p{9u;YpyclquT|ix6 zGj&Hla3{-d#WD)S5~Iive>szT)HI~6TWh_K2sr8l=Ks7G0&*m?gr+{5c=`KD8iw9C z#f;nlz{MX4yg?h#x}b0X8~pFOV5tGJDs>^0emx&x_d8V|5U}F|k`~%+3I_p3KnO`b zV-ENTfFy)J8U(o2C|5~7B5~wM{kZUD1SK%_? z=*q2qcX1d7VAt_m=r~aJTT7k@_nZ%HRRAy9H_GmbhQCW)t6Wm(VtDncPLK|wzW%{( z*Ss5;MV9VomZ)s*y<+EyJya{$=vi;;bngr8(7e22U)xdqu**h_{b`@;y?*a}Su@@; z6aF{*VF?p2{3-R%+5sRaHNn^w_;;q>B{#!(^B=wUNa#-_TN%}eQ)TkOI~~y6=plxf z8d;h{Kh>RPJ-$9f<7Iy@Pw8eVT}7jMlu;fsFnSU2KduTFRq^%KR`6j_XjCvSRqvTWFq%XgAgRDL1ch;eg8<3s^^^zwRK0|1l2#N zQVMM`M}Gy}AO3Q?Tn2FQ{?+^|hzNk17yn{gZ{FZ{AnQVS<&&}?=;DL>wNn?O0c(YB z;u@yaX;VkGdzXsh&GnC)?WHe@b)>K_eD5)-C#Hd|*RioEte(87vb*>F)|^jQ7H9#i zJ|B&BA>^|PK-#V8$dng0OawArkDD7)&3AP;5s<&{64RY-4aRnNcNf6bY7l?d^W8%h zK$Z%=7+-xj_`n1Yo1N|r67;U<=CxIq4|I_+6{Z5j-(a-|#>pcmegi zU9XS%+-{iAJFCbhx_~(qah%PkMyd#&IR8k&<8=InG>9AMz$2dwqMU9NfR_rE!(P2K zog{)*Y;iW?yV=h@y||=W3aRw;h}DorH4^v7+T%{>aCCK@E%;df_}beH6>HC)+v#N0 z{c7!l za9#)K(VX2kVvk_!Kzn1@)ILjDJsRt!5sw7PcGWGsr;`^$>IW)km4ke46ZO>IJ~$rB z?1T;r5%-1)sH1osmOj&kz3{`GRIjwDb3}L}M)pmNaWTOAkw*?vDop&7;jwlw6 zUtW)u@v1>x!zCn*%1qnMZ;8Y|xYuDJ^kBBCb@iHOgB14X%sl2KGb#izb-f?t=mc?a z;X#@z77$;oPsULY5K3wh)yarg`@rH-~t=(M+ zZ0vpo-u6O$cBR9tu&7JWCMIJzks^B|XNn-PF<*xtH_DF%CZAgXcI!SZphyKjdz_0+ z_lgQcZJvzN9XyRcV~vk%lW#IUedN3OCL^yVjhZ6Q6i0Dhf{`eyUzK(e4; zkK8qWtcY{Ip1kPprD7xwas;moK-?PZvDgXd{~vpA8I@PFZ4Ev+!Gdeh5Zr^iYalp* zV8KIhhu|&&f)m_bgS$Jy-7O)wOVBRfbLDiObMH9aqrY$T7=8DjBu}=~uDxp2TC>)i z)%I|B;n&m03?)+ix&rcK_~k1K%<#6%-f)NpkL}PI!f%n!SKdCHc{&}A-faGPussa# zs|w&s!uXq=3NV6kRPL49%!`_y9*e#_yP05JE;}De_6DG0NaxiMQ=AO(eg;L5vJgK1 z28UDu5#A)P5(c@58NU%O4ahFSgNC8uz_2{|s+o~d`fv8hb*Hh{a5+<#mFhgla@#uD zvfc+}B`g1}XPwgz_dQwZbWv#Q&p3~So^QlpN}gR#VIXcazMZ1m0}Tx6slBb-z9 zeb|O>BZgYH`(vn%@6Enxz7xi)@V-lNtlGh$O0#>h_#H{7?9R=7GfJ0kDZp+~Mla#H z$HPdh6_uh^h+}iaad9r-I}WWxed5nrl~j$R#Q{(6Wm z{`g0}^Lu8p)CGo?Xv?0sAQc@t#@hB9&A6a)fr0`12i!JJW6L{f$?qo9A|(+nd3f{8 zMDM?Zw+z&pnlWFTLpKn%R>7U})X1VJTrf@;AX_x2g+)|jBWrsZVid=xW0Q`Ul-4jP zx~pEG9OUK=V^ZTFo1x;)u{ix8HaVN9(b;GM{?YA>RwnYIO0@KL-S%1AEwYlWV3#LgEO!2W)i<5 zW#YEstLCj*VtJ7$zVku4I0XD0H_ z2L9~#hIiSOBnZmptE1!|b(eE1ESQ&AA}VrRyeCU|c@pWst7}%C*B|9(Rt{Iz;1+C{ zqIy!(x5ZQZXGd3u+BI~0rgpm)rbej_j`Npvtl*H)?5tQWXvkt2@%*w*tf#FYmw;)) z3)^o4q&pjd5H*!5ILOkXCxVFxxSD!GV&qRW^DgBRf+2k(E;^%aqD5rctM zNH#=I16<$7&(E)`OH3j_NKg=W^c)%@Nyb)u^xW;Jw=E@b^sQ|0;oiwmokp&OgevJc zYcQJM>}oL{a1&3bU3uD_e)tt>I=SQih>zB{+RE5zBbkW*bXr%kv*FXX7B^{e<0F3a zYg3;$$^W*mC)fGHlJy0Ge+b6?b4iNp*^j}%5k>ZwY*T+gUtaI~Kx_LjpX{ZBA_?`u z>`kYp1LcCD&lSWnSO5P!DF;d}g1c*l;^GJ7cFzZJHECUUd9$!Dm_U(cl=kB$zS(}D zVR$8|<1$$+;e{W3oo|R!|2V7S+JSbm0mA$DR*RC@ferZ!+G3pJ{>M$67#ujw@Gbcg za8rtl9Ei_$X}r(O*yWiUxaDaE<8$A+D)L;>(=O!Egq(SCvjld%HVq8?^=L}+vnv{_ z_)&s6BI|l!C=_SujaIx$r9#VUO&F^mG6Wqy5Sbx9rdWdU1&STfv6-vgI@| z?d<|W(2PyqI?g9IQ;pR8hRhcv>FPS~b)K$F?t+6LLNCLagc-Xv6uer|%{lwId**Nm ztJHSXYvrZ%`%lh2O~~_BA(dx-*)%*w+LL@u0zH=T8bi(p2HG9qVwf(tUqhn_VOkrj zVdriQH|(i=wx=wiO@^hW?(XQU5uPb&j?c5Tw`9DSj)E#(a3lso@RJ{Zyq-ViPrnFG zlH`bQPbWp|-iJx+qGpSyT+BIP32`M>i=QsMYHEh7d!aFF0|oIFcJ?V=g3Eh)%JZFz zAG<1?&Y}gmx7^$myx)|fw!KQ-R~}e1l~a^*1^7M7>{86P@@x!7NF9r(Blm{88IH&J&DOY#7i)zDtX##e(716=baK_Nz}`!iGhTJs>2UU z#5T-|_bcZ6{-ell#oy%YWv*p}hH7SIYVU9N|H+&+u<2w3oEq95G<{@n>`3ZXJ zcrguF+V`r@$JIKrH~SF8`I!r>q!9W>sm}5v=ZdlH_vbhLvh%Ivvlj;7IFOO#X6XBC zt0`MMc=d@4 z<{?~16FUYMoc7sM)jjf9)q`rb~v@j*VFP?qe^-oTUDiWs7HqaUAmhUS6ft6HO-|$ z8e3ReGLz$W9lm7W#dMGuHniV5D9JT@CM*0Zc23_876>2HX{Wc^Rb`0m)$O=SsYVWr z9X4Bm(|${Jf$Md$QiBsG|>s<%NTW ztxq(0Pp+C&!!GW;a5$6VPw=dl&NJ6PE{?3NPFsY&F&>fP?N~Tf$(CE8-{SunC3|E| zX-x~*g;rhRO}a~c9`thMQ_%`9-n-Y`NlFR@ky`nU0dl2l&oA^ghuBmQPsrewAscDq@+j|~D`cg4%H(uf^ndC= z#}X_tEO5h_zF?@yLN1VL>dGALDe`2S(@R>>)GtR|cpBFG42sa&5bqhkR5)3)b~qBn zHE4(h^8e-6BEMBSNHT;EITnHk$+%#zt#Y#!5B|Jq=|NX70LHD>TR*-}U)y0WQR^X) zQUoT5EEq*&Znf*s)vUjJFvtmv3|CaCqD*a0XHlZCuiOUZx1{3`c45Kb+?$U^7PpG2 zWn|?FtZ-Jn=HMbY6W4yt3H8*ds+y+ux!qv~HM|6n`Wmi@F2!`I>MJ2sR?4Stm0bvYzP%lowh!fkNHq@gy9Da6e}1i z2aZhbv1ydlA8cP1MQGSoQDhC7Qd2erWUHIA}OofHxOQW}>A$>=WH2 z;OByzyA)NQH6@vFX|Oh8uZ%C)2W$FkSZUHE9frbdN<^B{q4)L#%D%1HSN9m(+^3F$nU0sFCZaY z()6QLru5@uc3lel7*fyGy4~mJ$i4>soTh0P`p&&fAh^lL;hBnOX%t-O{^agP65L-VDtH%B$Us5y|ty`@dJvfj1Cc%Pss$0rb_^}ypx|yk6yI92q z8LIsQACrw9K@c*#I1H0wD!f-Q1h#wT5c;OZTZ9?mPj)?}narlHg*NdP{Q~~Efs+1k za^ULk3s;V`$=7)mXJD{VNI#QO&jw;Ea4|{L5rZdA^YE6XSUP zkoRX?Pa^mE%j9kF$To^)s@V`u;+voZwqj}xp=WgTEgVhY5>T^St0+;I;9;Le%qXt5 zu!g};#P5+Db0PfJ)G)KKMNQuC+s5F??n(YK#nO6j^C7{kt|Y1MLCk2%O8JaNWS8BT zCLi`d={*M%C~%jB(Rgj)A~v;+6z%<=1UmMx*`=ttVyB0WOlzfYDbsO&zv>l-)<*v8 zfp5q7!f1rB+fbfNm3k{x;t+O504DJ-3tm59u!BNhqo{!YcRRKr#kDXsrA z=FH!z(TJ&l+VLlPjF`Np9MF$bwfkTN^h@lFtqfiNMr!$sF#MmoAFO{bh4MH4^4}P+ z|F003|E3`KuMn93Mw_|91pt*8ltZ z7k_=7C!W-MR8 zWaOEN3jIGb?kzQIMeKt3zakx99>!Gr(6Fug{NZ$Ea7OJu>6w0ok0+;H=1JqO3{`-n z&y=v+ak`T6<}n5;*WXRpa$}y|`{ztzgFdw5uOXpu4Y|!}RQT6;YRWW;buyKK1k58= zc=l(%PH&J3a6F+tew3CIn}{Sf$zX-45IFAqI>)$Fy2a5vAM)kpp>ad$pf4V3^WvEs z^Yw@RE(#w6Tw4zu>G1~wQdb+uCKS0t?XXkG4^g5-YmA}qG&zg$vopuUo%}UiT(~rA zA0t2Ub)V`i?KgIR{vNbW0=s*8my9_@NaK?kQZ8-Ip$O-u+A*0y!p-DT0Be4HyZ>?J z?De2DVio73P`r>l9c=ES(&w8f0p`{{?>-uy=yz7!4BOa~=_jKGV_{A}L zm&g_mdnAtav^nJysy5U!`>@d+ zyBK--`zXd<(Q$?`*=5sF5wY)7f^})@@drhJs&wVMjzJ5R$qp}Rc$q5Bgu>?)Iu(c; z_ozf|eYJ`v^gy*-KP+<*`COmPUnrJR_CP+vr+IKHeo?hMtB^&xjMzH6vA@86cu1J# zrfH{BQJb78qfVCmy|XjK1m@YPf^v;^LC#eo#A|MyI^KfU**dn#_~S3FHM_c%tw=M~ z)gs@Q8TpF8BJ3|K8f=VW9%IBO>D%61-$JI=_4_kcbt{pR zOfG;erjUR96Y_$$^Vxi@=tdw35ryIBoj~n$eke9i(|ONKz9_tpx`T(ozu7ntM#6R| zSU**ZmPtYX*ot7~>wKQ?`0;|#s_i033A0`iHR}bv4_(J10;emJ(Ijs~w%f@&VWToi zN}Kn_Ax_zwuUm8_=BO#&s+(y|PG&HdUg(!yxmxjVrbG-;;m$e2bap}!re%fH(U?TW z2k$73)3wr^F|cWzY-MEk{+RN38-#P>7_&tY7e$*VMN*?h7}!{6I?mLpW+;oA+rK0q zDPSJJZqrC7$)?L*^ZS=<6;Feq(V&Z)rPPnGjf?T|5PgllFr5G?vQmj@GKgSeiULdM znw!oYPOn~SR$E5*x|u_M+pNTaetYV+0(#r*_6a*n>?Su<=jEhfqx)q+RmS(!zSOn0 z?3dSB(r>GT%{R04hC(9jME%!z@~c=C2p&m!Dp?gij4i*JdLih%&8;xbdE6Dw{CTej ziaDUMm@M2VSNCj6)RA~x4uJ{v>ORf`nWs&Iz}WqUyG|;V=6CQemrrxaD5+}%7Wsqa zVPGl6?)%RNUxq!$kyQyV=$ZFF{~;Rc+zDp>c#_=8&yAAqCrCtJ-s7fWAMn|K7j?fQ zL+~YTYb-p;39%!yKDRnFyKYeZwWqrMrUs3T4wqg8vhUb5HbGZH?^q3ir?ugq5BM%5 z@D3qF++P}f+|t?0>u|N>t}*A8Z}jgN+aY-Q&@TUMKK?t2qW_Az^)EA7*;(2DB_``@ zR?h#RZ8;h^xY`*1ZG!rzOjee^6Q}rJ$z&D!8iqwQOxAxwWPSWc9_v4$5kCGS zi}mpzNv!{bgZcQ66xPRoWU&5EyCDB|{7--VM^F5Zef_&l{3EUR@t?AK|4#SmUvcvP z4_UoWp8CIG_5O>q0~x=fIQ!Dhy zQjObHE04d68zz0N_L}2t-ul-Mxi+hbu~hWJvto_95rL}}`$G?%`{lEwq@?dvRi-8; zREWN0!P_yQ#Ergk^@ous?k`uaY(x!2M>;8(%W9DWM16#9-oQIKIT3MM z1V=`u_ql?{rD45Dy?@~jYl=je=Kgr)HMAydR#ftH?7)VV996<&>6^_LK;qhZgB zgV|Nj$4IXSKdus~xBKBZ zcv{7o^J{Rf#eO<#Gk)Bc!#4Z+uk)C?-*T~>BBM)&G!`o-MBLTAjkZ>|RmHK(U`Dk>@x8*%|& zZ}6-B)?JURRggXCqsZ3c8(&SuKlObs4=gKe)fW z(t*LOm#dff47e2K`1p4d_tZ7Ss;a8eW_FGT;Ra1*ADxx!)nVC`7(C89QVEsjNyFNZK zAxeaW<2!K@>*ZSIzoTr93j*j2h*cgz$ zSZb}72d|fxm&d~~VL-uj}w4D?a0t%8juQ}$Kbt?muqzhlB% z!D^az+`g5U5BOkhJ$hl!fz^oygU7D2F1GS#+`++tWoml5$IZgRA`!73qq(JJo_x** z2^RWL>V*)k-s1cB?@w?bhO=cl-*ru-q!9QU8yl5ZSwzrL+$3=&7*)_bS$iy1=EGwo z7)klv@4BvsX9*Ila#{p%J!?;X{YYjC!fcSsm?+p=SX?AvWyS&aZD6LmfVO5-LtNX9 zhBNN;VaT*|Mkw97#h!)jsE#@LTcTEGxO4;T=pW~!{=$O-p@yvPsg#V;QdGwsPi2KW@H4dx6yIWCd`(4NVeMZ-pxS?l8tY&`n(CfTti)w6T5bMYinw9 zvg^XItK^ccQGg+E+}x9WA3?0XPxJY%y?dVJ{C5d?c~mhI6O%8bHC&Bgt@-YUP0VSH zhp78(@v$Ily=?`Q3+SWV)(^g9_`2+sBSl1YmncJ@lHL@zdgi&;8=gBE$mogM9?5*L z))$qqwl4Rt-E0ea)UdHR<|MHJhWvfGw^!1&nixxwRdjCLj$Qy>qFNyTVKSvx=qLM# z$&5nNek41KYtQ|~ySaJ!^o=N$MI{QhMru~91+*UywzfXCVq4>JI6x(xareF1M@h-R zZX?YQLPA1CjZLO@8i%xWV=K#qzELwihd3pL!iACYMa|#V2?gD&V z{Sw_4t(hX=op6d4pKav7tD6_(&mLde(O3Rx{l@BcXJh1ZWUCyF1+qdZ>X4ZrwuZ8v z-jN-Pk^v5OePbgp3rj^!O_PwRKWrY;4%)TK%#73uvImIyxq1{M5N1xHezi zBid~TD=!=mt&KnhGg;_(*#0AKY05%`IYC-Z4yCl7oLpF39L^@-JOv4XA;!jr8JL_* zv}rnMy=1HGHyWj&P62<1jz2v+yUnbsy(l0cu->tp6c-2AH8d2~HrUw-Ee4b@N)Xyk z1Ca4-i1o<>Ul0=$2*tm)4*aY#lzjl4fUT`93$SGZp+{o_nB#X^TBpv^=&)f?-@-Jc zFHQD5pq~9i$dW@7#|xm;Tf&QKJ96>S+j{>w(j+!MUUu5)_hoy#u%4b?20s38w6Kp> zR=sT`jO?-smO+BpI5?R*vpt8V`5(6b#FPN@bo@)HvfAdv{&4*MK%!Lb!%gd$bYv0SrpM51HYKQaxLF4fpwldZw|HQ7E z>_d=8yZR#6@C#qvi{Of7qV3emYAAdop8_nzJGAMDRbDm&dKDnc!1VY zJpkXStD_@Ou4n;O&S057`+C$K#8K#HVzdhi=&&MpMP!!Lh`#UKzScg4R|2tF2Y>$j ziI0yjRxed12hkGl^WQ8}^%)t$wwBM4kS3<5FHTNEA|eE3z{LzCV;>4w*$D<65KTFTh2~RbyK$+kotlj zuQ3!&exLc)=txKySH2ZShpmJ?xw>+;v8jlI3Vi7D{05Xrv~8E9)?hJAaLAlW88DTH zInxB_3$Wl^P&Jx$q(2xQ%Q21vN zxEB)CdqaD9^2sj5`1oT`z|LpOYw@f9Of4@nrstdiPR6OMn44XZiQ#5%_@y^^e7-Vm zvczbbK+~sLCSpZ(b*G()SAVuxBt-GHx~GdZii?Wgsg!iz95=fc0eZBBMNS9vfdzea zZLI-nA1;`CIAU>~mImtrl zHwpD;ve^WIWArDhrFsl}OsXmxr5IaD(UwtQG+$mi^)VGd9`VH2XjG*w zT^L@~S}vL-Fr}0Pl(D>i-BmJ{8m2&@5~+(xz}*jud#5(&DDg9-Zm6lL@vc&goYd}dZw@o6-5#rWt9h zxGy@P)y9|v-xc87k`WvmzI{6yLCm*be(eBQL<4XNS>x^P5J&xj7=uW%w-gmbidT1c zi;u&jXT$kkt4WV_d8wZ2=yhUnTnuJ6hX)67Nb2Sbl*n{hOK2UZa*rF0f+e(%c?oAr=EhE*pftW1v}iD<+eB2%G=Kiee2_la%uSCwNWxm#i2s zzXh|DygU`2GV{ULR_;$`pfHcdrtIM01aZw!K}8*tST<1XMqZwuuo5N$&#(T_!~Ft%1iKdh*%jG3rkTu`9TVqSEJB8hnu!W9Hjyn1WBl9S%hkiIfJ zaHM_1DqwFhn}sU*iU>n5*n(F&Y3vFX z9i^}_KA$2x8v2Y~&*^-ZS0%53;%UEA-SKIVs^EYg%ggF=W57>5CL=L|!%WeQDp-+0 zV%O5rQq(kBOOU8X-1_uul)%QZ#2E3}2wZjG%L({@7=rOi z$@%`qQFZf}4S!_(Wv~A4RDGv?5`3$44}sgG*{Z5?J<~MJVpAtLTfV-_E8N%@HuU7= zMl^k|w|zt3Sy5+6XP?{OWiOR^hbAW{|5Sl$NTrJntt=~xxQ@jZqeN${TtZu%`_w4E z4hdN^fcMw?P2UrkO_95V$w$T`h?(X;;OH&R#^g7_BZ6*MjfgNsXMvq~ov&Xd$4nJy zo-?QO0!vNW5^_p)V?gsAb0jW1^u*G*vMu&^Y=A!kvN-{54e4I`sP`tVqn2owCwaS~ zU4kkIbl`irVH@CKaMgR!P%b`HA0Aqfo5Rx&*tfn@MTN$4uUGDQ&3b;PPco@1vP4pP zzE7JNr8m-~Giv%?5o73pox9D>n&K?5KJ{xxLAGi|BpueD907L!yBN7AUozd@rW}v; z9Hj4Asl?X%6e_`4lzBFg#`ozyb_u>_{*$7qs+tu9s0uGE3A-ul@O@*Jc@i^EKx*^? zq2cJwn>XUd8R#3L;xNdsduOmmuzl6K4>uAEM9uvs5FfMfWP)P5#cfGm4 zjf`??YvZGaeJLoV&4nZi=In_sk)c@2{Y_w2X84g2(*gtG312Y1koqHA)<-NaFVB`( zP5+WMFo1Ih8@{VlDGzlZLyu=FGdj84$v;Rp=9B-hc%HeG*}Nz`)h_$(%hx@L)wzKQ z9a+{26~Bg#bdTL1H+rtvb(`NjdR|TN@AS%UJJE63;yQ@PODBhN0b8+HLgPNdd`4~+ zi6driQ5JeS2(^tPMV&wyyy--dLgL_GE`49UxUk^BA0_tuE`1E!)lYr^yLO|SveuV! zJ}jL3lQ#KBZH|h`7nOr7TT*=FGKb=w>*O|@=$j~LXbT^sdMfXL0)zm!Q-Z~l$@ELh zv-ZC<5tqvQ9T!A7LcfisKD*U96CBEP?B}8RvTNZA@j0B&!sH~@K~STue=BBLw9^S3 zp4tv&bgsX*1&B;@tE#G0qM=jS;H-;YF0rwExj68Eaxj-mlwV7MDbQ6#sg7~U%fyh7 zosb=l{{~Ic8M4p~Rd74M`WWTeD)Z=h`=jdI`o`7dCcTu*N@|Y~`JJJi9VXo-7J(3p zsphUJlFpSc5<;DrI=Ysq)izTvb>8gktjgzLRYpce9Ppa6;v;+|9+2{<_xssRPL%ouFB*HYqid^h ztW;&!raLdZHBnT7>mW2V)GQpkNv<}8E@xSvmkDi{IJ|aCr10)rfD0v>`d6$z+(a#f zS6Yg=2Bw7jVY~)5_}Mizjwdq@cfvojr%QYtBAG2j^K5V;_0=$G4!{Ji4ff8RlsOPj z*4uyEK3S-+r6_#u0!!LsN604a0Qc)bV)+%8;j1q=-1(9|4L`|A=;dhKk?>nu zZT-nv*?qCbQZXsau@L&1z5Yz5w>|9Aj!q6AO_o1gI^MVrQa5mLSGd;;z`nzF%T&_Q zDSg@0*!bHgW;)T;p3nOgrX8O`N3`gOXanrKeyL{-I?Tw3Fm=M3yx#r_jmuZhO6QN@V! zoKsWRXQHpbYhauCHU2km?Q@Ln&z8#WHb=$+N3NbrC62EtlG?A$PqCP*OskacH%wm` z`WF2&%?DRls=WXOre8>J2z%gozwF_}CvdL#?;+x2(&t8?@bK<*@!79SfCaala1OsG%p{0P^6BN|<2u0mB41WEQyx4Jke7sQeX#it#aKk(Z0jO!%`X!)M*VNWtUR|w%7%=j$OMBogP(VYT zlL`(eFAktFoUV2FwYj-~gW-Am0L$6j+`E+}g_E}tG_`-7Pm&HXu`)LwOkPweoC3ID zSgHTh%gmKO<|i%)MQjqVQxsCshKLr@EXgc>#V40<4aANMtqq@G@gwL>I3e#sF=VGA z$XoqGeP??0snKfI^q?+zzt(MawD0*Zhs%AQ+4-8$J>K@`RMgbdrVD70c!r5uQzIjW zI|(TLN@)(3*Dj5veWhOr*_mDSN{-FQIMN;0CWmkT3SF?0s=c= zlNXnk%HLFc5&7h+@ExGcyjEiL^tQ!?=5M~lme zfxZ11_>}f`cA}YIg#aWa&j&J{$MYSPwn@u3^6~(&*n`T<$=L$@dW?i2M69DVfWG+n zKv_CCIRU_5vJDx6o2pu^6Xq1ai;n2v=-A?RLANmt8cqE+jpo}Bcuy3^CsJE+~}G-x+BHvk^oDb$UF{2m2f2nZ~J_W+trlB@bI>4qeC03Yk@ z6kWDcQi@_CzGs5Gb5I_40@4i!K$Zu03qX#*f~>ZO5}0xBYCg>Z$m_=CCVVtqsBh_# zh*Z#hESk^2)XAw<&yZQCk=>1QJubqz;ujjK43_M$GgNz4Ojhk@5D*LY7r8k*UnO%{ zSKCD>I5%6iWlA^#__upRtyulzda6ETefx{^@!VV@d|_vwJ066Ax6tgfghWp&pEHm+ z0%Aj@i6Akqzn9&Mp?+I!@8EEru}U z$_RlgJ35j)WMyT6sF1p%V#dMmzZw-<>+IwNVr(Y8R`-kDX&+%>a>rXR9ICdf>*^kr z7l#H1*W`E14qnG;)tY9|3!csb?-sR*it@fN5i zhU{nl&nf?(?w7XtOCYmxdv%n5O9jNcU5?i}9`0|qmoGCjGXa%-bYvv&RuCwmE5@k( z0&H8?y8FG^au90p4rEJ3J|IA(xk~4zjpF`*A#`TdG}NSiq;+=$2gyk`FQICxcvM(~ zf_NoaueOdmL0AI+-6&*a7ePJ_JbEfn$%2ANlRCcR@C2$~M|Cab<;+}Mb=ld5AU%SH zd==cS05>WgZku%af#&M!nyE;$%moX%4oWIv1JX_IE0(hxdiLUtM=+3Mm^e+3H0MQ) zGVMYsZ--S_$QlA&)eZmAlTXaKMT0(R6nNs@e@jz6fyW;JU)Wv4kDzA@=wUz*QgW9G3JKg z6u3&@>LgHv2Y~lFMNm~&zr4I`OmHar4R$?rWA7NiYR+LX??PohSxW^WG&+Tac6TRobX*5R8?M@fX@*ulZU@lov2oNt8yq<`m?l=V+Q&_yAY^IRHf z&MM?#2)F(KEX&>OH3^fg>F)0DJFF|e2ToN3L`Mfej|!wZ&fdl0(Z6S71S6#)Uf7yW zzR5H^*S*S@#bNbkd|z7+^@7)-psZ{}p6N*k?|S8OxyktvM{-i$H-_4U)@0ETO&2gI zmZ-CL-dr8#e|c>>a<^9zBYh@eYkRWN@)@`v>R%KkC)bLf791yk0MLmYtA}p@fD~w? zf+=fsjmQ^5g)omoLegzecL|I(i}%W7O|EAqA3qkpr@l=^cuq1!V*KNN=alBhj~`ZV zyC*cXuSU{^NY8cwxb0R`QZjrruB=II`xc?>ptWTjGll;qH_qlhx{b&C6Z+cDXE}{H!QWki@V*kLFXPz?H(lM-B;Y}m`P+lW51Jg z=5uuK?i9w-JID7H(q35f1n}H}#tIH>n@Ss7g7_?g<=(-K#<=}nubyR7J)D!J<-tG< zbzI4Dg7%_g={n2$=AR$6eMENvUx`q~^l+v6)rtRL>I)ia*|st^J_#&dHHNgZV2t&>+zBtm~-30fg6=DcgBi~ zg71!d>dQLU`3L1B9&s+#=YHozyvmV2yvo*7`VJ&qBmr8^nIC?WON1e$b}#2Wm^MBu zD=hqYe{fu0hn~FFZWFGZJRx1Tfgzv=j4bZYaJAp zm8B(WEY{?xN+7pR9xXGnQMc9!__AHRrhfbe-mV!w<7x08_J5i!OGVr)iqoGP$g=sv zD*nmRQZ2q_d}ihs8lS`OudT#&8)|gRv89DlsH!N=KSDeadBJG*?k%>*oyG?b zu1_|3Cj_v6qj**6$l!Ak!fA`xLiKovP$&t<7kE=-`ATkbvQqdeX->JYvQiyN z!quUNGcV~ChR7K$X{3B1BdoJs?`ckd&T@wHE8)EtZ{OrL$w)vLUPb!SlIrYESy|bk zXHjE){oL%}!EvuPa>@Rbt(CJw8U+?A3Y9=6_9r_fG+4VuzJh_-Is*{L)Ru#h=1?e2 zs}1r_jDqxMQOA^T%6JjIFj;Acd5wA8FwpGm?Y|*HArzz(u1r(IgF&;pFmH>S;4>)m z>iW*sutkwqGbG~~qe|I(Jh|F9%v5KD^`4AS#uF*O`?ebBG-f)wQ<8Tuek>bY_I$Ys z@^3F9(!v<9$=8yky{uBo<47>-ooS*rH#hw@E`g)?D!!GwcBZ#DHKlsfCEcoSH7h62 z+$&($lzoQ1Yxb^iOw`r&kGT+bT~pHm@!0aQ`fpb#LH|h$+1+<@C_W4L1U|~~v#=I{ zFfLYmqkhmEKL!U4kZ`kZg*iuuhQz$#cMO-UxK$94R`W?`@TY_51S`v}o zpXsLXu#%U)KYG@)m3eJ$Zj#n|yIQ#pE;7QFj5GxiUH7VaJ zT`PSdSAn%_$nlFKsf1v_4IL~gB5|${xSsuzag|gVWQhX$s^1JcqF>21<3A5wblm=c z$s24~LQL9C5V(Kd1$51!sDgg5M68{)kJ31yY@5h# zpwLwGro%NxilR6paXY}by_unJd-SCR*fh@yvCB$-tnfF|(&5>x-PGsGQt3BuwwQ{` z)!ks14)q(BxAXCKUP?<#uRRP>lfNOFn4D~RYCUl(Gd;aZEK`KYX3;MPTRwlX1)GE% z)x@u|y1GdGSc$~sLPA2cv@*OZSG|3GZ&SFV9G^|%;)0zeao-Q?7B9S0R8kUA7Gu^7 zDgV*~ZEtL1!rPj7t_h8*sz3*|4Fvd%uYu6)#GSC7qGJ2_;K)cXL1o6EUGH}lHXX2x z%;5DSiGy86&E0p-^4U;(2K{E8Z4;j27bQNpjmNLvO(^eWeHL=bB4}lu?-u5*Uh}~f z;lcae{HBHdjo}cuUMjCHe)3|UK^GngF~Lz1(lwgOH@mG@co0+0(a$-=mMRMc55Ekj z6S|0s!ixg}3YE7I7{9de2%FE35BGdEy__tF9uY+GsPf#{7 zv3x{9Q4!LW@6%NeX6;=Stlem@A15Q7{+299MMbqd{TE6nf(t%pV9aW($D*wj7YjIk zE3+(F>Feu{o$1#vx3{-vY;cf9$aN{Jb5Mih$*=v8S`K zIu3qCAjlyHE`Em0T|Mcd++LPy+&?bddAtTURbO)=vU+??zO*ti0qs~<-2n(27t; zWX2a4)|II#|9KEJ_;;U@hH*Be+Vg$rgryi2`c5O(e{hgTl~4)Vp2TUn0HzR(13UQOiZ=3mSSdL1&m;*f2nC_GJlaoo>a(lspYe?fkD=gIPtR*%YBd!gRLoS zU^16EVF;)RLEgMyKQBaZxPRyJCIwGRnLf*>pM-)zTuwL3{+-ghh*>6ouBJ zo&n$-mUlI4vp>o-t4zRr0_J2ySy#|4Q7@&G&6Mt7Clt>rdO=DMNh*}4@gW(@@srEC zQ?jxtJbjDBQhgL^68lF?B5GL^@>+5HTmy)k=i`INbdehP<~Z{1?)+?@$!9goHFDnr z3>(z^HFZ6LEIF3r(ycofLo5gl6e5+-AfUaFHtmD4PNx4F0CJALo}Le;I}^E$QNov& zC+m`PWzi@%TjR9eg_vGm9YDd>*Ip} z!rL|upZ&!Ru@9pJD(M#I#&G+6YTs!ct+pkEM}gVfa)%V@)>$t%PTxmmHLVL2se1wS zWT-QH6`MfCG3*u+E*-4js_*Xo)$-na+xU*|$GJXo5ISQax;=fc6tF#-{_=RVu)@)h zcli|&SZFo*k@U*W&W=q!%9Y>5*w~i7r#0IIWQV(3S38q^9$ANISB>{S+a5~kmm75a z-=+&HMTdZ@6U*@YYz$>ioaNu+*)J(596qUkJA=Hhz2=EY{qFITQJ=V{lHYEtA9PK= zLaLUE%BC?>F`NP#rR&|b?Kh>MY>&l>dOUS2=jxZgXUj>Q`|_q5QoVGuW1GNwn%N(Y zYi|k0cNLI6ZK{doV-mH!IeLw<;WUBwTd}d&NfdkFtLrMjjR%K@+Gz%hBqM%awwkQB z|D3JTSm`tLi4m;Bra^B4*bV@K`KpLHA9{nHlh*DSje7Idy~n_=Gki@&C23Uen~iA} ztUsK{3IxVo?{8{!gBOgPaqS$QS18AQY977#bG8j&8eD8_%2%&;IAP}Ncx*PhpY_l5 zaKS}7@;!Fj_kSe^izAE*9oASKcAqme)l1%eXfbA&DDRV>b>YFuvpV8lYDmpjQBa5& z<9qBkBjk%&lzCdU0ltNSk`Y;9%bdG_lE0Fj8p+f{)V4tO_` z!jml+PROwf62IDqeFZhOX|SwM58}JCGsjP|dC|=Pd>hfnWg8tHcK9|l4*ipLdF$>s z)H5T!z!+|B4IqQu6^Q!zcugc@OtV9&&GWudey9H+A}PYA>8hYe{?F-8g6$Y6gz zFq4gR_tN(&r(jqD7!TO1i^v*8YRZ^N3OOJkz{q{#2CT@QzsKrt^$$=)A?A%;fQU{q z^7(eDYinDmJdjvjk*L+sf-*$9)MsW{7Pg_uWw!h{GsFnuFtsQ3G%!-t0|ya^ICVt+ z7+@ZFxv;N4CIV7*CBuFveDoktlIerWO*bW1L1{aau~pc6Nrfvxa1HZ$Sv8eT*zR4-@v$g9#|Tdy?#5f>H~KHkBa z$^hS&nK{y|N#rFhEfDZOYJ1vCFZ~2qWp}su{j3uf7S{ONaFT1d+bex<2h<{=4s;(2 zSRaM4m6Z|4r#cca2P}NzQz%SNC-ndYsyB?&iCjrCLXwdr2Rl2ihf6%f3e+rxl-{+E zXUlx?K510XucA0P3(UZWnnSY~1b+AtA1@yZx|wxn`ReqvGo3bu5vwG?KOkVd4%DNJ z$z;L${&sp9jQaNT^fGasJ#`twV^gc3&c`Paa)1s;I)NMpgpubWi?%&spu!tfkT*p^ zUs(oX>9xE##5T6c+je8-O~u;@RP2DPxE{Y(#3xYK70(W9pp3%D$Gg^jNGf1wME3F9 z<}atcU-H$Yf-Y-^hk`jgQ)=i2T}$7+ZaxA$tp595i-17m#HGK#KR}W*0U-Yi%$O{> z)*Ia+0Jg)TdLu0_ujW-&K)Y58f;^74+}xklA1A?Vx#OKtZP0^+qUuGPQ(|T=VySU8 z#J9_}QqioEpPS3W%d4fS33e}3BC+C{!OVfHZn^y_7w?lu^_-BrqXQuGV0w(rFZzy| z{v^UKlrAWLRajn3#OK7|80JqF1mKt)l5zdO7MJzT98a+G#F$8DSC^%w<=eZv*FSCT z?07xzTr^Cn!-!rB9<`@O5ZgQ0;B%N`ZzXWVb5Ys<8B9t7(U6%evVH%$SP;6B4wsP+AiNEB}Z@hg4aWosQYnPC{4y(VpOKM~bf@ccQ5^FpV2mU|mi+%Sx* z6sm%E07d=|UN=h8(ujkMC_YoeDLgTUkbxqQ!(8G;^ycIo;#~spj8VJ(D;LAj6sSH0 zksyFH<|_?@Sh_@V&3=31I6692qMWn4jw#O2D2?&*@u{SNWglIdMnxrEpO);~6ao9% z>=r+gvc^1LCR@Kr%h*1A=;Q<5WKV~a&Ypz@E%yl8x8JgcS65e8MplM~iYqF<%0%L% zbD*a$OvvRf8JmX=7+u#Nob*S%{3wKK<*D_!63W~YzQ&PIK#3(pk|!uD%!w@k1CH{(5iAVY@}bZX+9P^ffrSxT zdiu?S0lteA9{XcPP(i3n7YAcXL!NOExw!BS-Ytn=b#uHcNE+>DX0%Lc1RwwF*I13H z5(X0bHJRzb11NF==ASH$qkO2Dx$pwYY}|jf3la1G25WK;%g+A?dv6(*)!MZS(~W?n z(v2vMNOw0#2#9odBOu+NfJjM$AfbTLB_PsBic*r2(o&M&z_r%1-)}$fvyZ+1zZ`3M z6L-vc&1;T0$9ax%L+qm4@D5zG&faLOFPkq%KI+Tc+usqLEt*Qp4CA56XhuY%l~oR% zKN?!$8L|}pNS-U@08Gt5oJSx0^ghRn5=nA#aY0;cO7ctDgo4Ks2W=1S$Bh5omxUNj zsx!qufBpokk-}!c2i`V_=LP=IVFVu4`#)Es?xOam0JGcl^fXIcX{p^K$472%JloDh zgQ&kzQ%c!KRc%xBL<}E3+*|t1$wKBOTS7oa7Ri6KHIvw5&VtO_vBJl4{{`!gZihap zld|nxd2N7*wlkJ~WuHbVaUY&EM~6_bfQ?|P{$3WS@fuOX}6Vr5nXT9`+kndpE$A1Mn^~V zZZADmczd(u`Z0E2Z@+0_So&?1IO{lPw9raseCa?OE>q;Hbd`Ix(hhA&OD(5U-*dkn z0xdq>-+sIz$aCTHg=?Onp56^2qEJ2*W?I^ydpXX$!;=F-9?s63(d|$J-TvOF`}ava zLrNm!GHoBVO{#vlvT0E3k++F*oeq-lgTCs*pZ6l+)MDS;=>{k$D>Fpsn>v1>e-yRzY5PVaTlBxkt*Pf+FCAuFHSmn1L8jiRNqrgc|lG#-_iLy#hilLY% zITBSv&U?5$o1L9KJ39L7^d34>#}^tJHfoVv6LCKVhW4-z1xkcCVJq9`T1&2vWo6NZ zJwrMnIEB*bxmZ+Sv4ps*sE=g3`mwxHIQA2z6ecn(wVc{oukQ^WvW1(#)z-X!T-eGn z9>9Q#v5I{4w)lPw%>Q~@2(PZn5zRH}eo<}DmJU*0yZ~1RF%1x~(a_Ofzj}pnbZIMY zhN}84;)t4ocgu!)fEOn?&ar3iDbEM@8-jyJmpFgzFFeswVQwEtMzTHTasT?>s;8oJ92m?k_qjYFk|I*YDq(ckJhlLynp^ z$>|(8*w_vZ4{ItaTD5c4hrZX?PjEx-DapCPc86PATif5?Uw+^(w}f6zhm559?dQxRf^g~ilQ`XS+mh1V00wr9Sl>yRh&(+7 z`4Aac^Q^2a$O>1jodPDuvM2*QBVk+E<|%^Qpm(sdvYHOa)B>RL6|&5$ePCv0rbj6$DXFQc3F?BKw8Es>l@5#HHaB(>pl-wU+K`ua%*FYIS zs910v_hDD;jrR5MwbdFX2lU?FUeE0rN-C;nC&B^(X;UptP18L+3I&=1LPEM)S`~sc z9{Z$S{r&dpx4CKN+(mp(ltZ~%y2Kdb+!vot+;v z`*^@P<~L}#o9a!LeWnuG^wED(?*rp^+@s9}-UCcf@VelXeJ_d6Fq1M9)(SFBAU8

m3Q;=QTkEgmSLT9?%&51lcdF)ijpPlZ)$7H`dI&^BQNAdGSHC9%}vPl zN93WObYlIa^W8gl`X5JM8a(%5&6^c81q4JzX_#6tA`6!{umZ&wfc}x|b51-*NF@@wj)MrPI;-ruD(zT-7 z=#ySn`I<7Ea(BYw(!E2mptQlJH+-G_gOO^qTj{o6#;?qPfR60Wue*H~+-b*riwg@k z$;qJ%x${%~;lo(7>ltxz9B0qSaL_(1RaI3rH3`RbfMzZzFk>{}hXhRnQ)ib9kv)+? z!0wrVV*$U=nKh|Z#C8&c}S|YRZll|fRxjAF6agxH=r_UOGq)H1B5)ioTPC4b0 zIz4K!REvHq{P@fpu$d7@-GN-GX(CD$a%Se~Ta&12I_ID7!A)gk<9xO`^?2kEP_t_N zr_?mUQ&UsFN5_32o6R96zsiX~t_dh41YY`Y5236V{44hiFf+27Hx~?KYvM?`+(17E z*WB$SP8dV_Te*`zfkuUfvc<;mYH?oPi_BXK8$0=i8Ia+S?N%+LZ~3d53?O8pt*_C*G|-!*#suQ0F-rrH}Quy66JeSAX+z>3}@N zx-nF|3iv9o4kZ=w4a*;WxUMli-TCd?Ju|P)IlPd+53fw=dIQ&)vp0~ZZ@)3Ow9LD; zS@VJ@MI6O1`S+WL^{%rsPuK;Rh6mtcSz0}#78{^StgSr)NG+jzbNqvuwX^)kP41gd z6$}#VM6C0ECBadJBs$nQP5^=a1VRRPEq4Wlo`+9c{B}q3t0}V<>EBgXYun1bLK!~T zSi6sjEjCG7NlrB%_hX>$((`dcwpzCEuC)WR?3>|(U*oBvVbq&36S#3Za;{d>0gb}n z2j2~AjCiW8!2KY$k0*Sx%dCKv9FF|_bdkx?J6dc+aPeYlY0W3$}NCuj!-8TCl1a8-t3Ryr7Mc1b%1+85Nbkby!s<4TdD&AAw0X z-iYT7XOMl=FE-J*KcIC;LF7Mz9A+CMIG(=l`+%J*%1Z{oLMmvbOFX81UpYs;bEr@r4;(DaBI8fXl=5m^3C<2yF&R%dDyA z5ct%m8-F3fT6L%DRX6A7ha`B(j%&zW6B8ERxbC1^I)?ArM(amPlX-Y>&_O85nfaz{ zk~~aIPfrgk>|^I7eT6m6=O74`t`y=CsAf#{*ZS@^fcrXI&kC;RmSD^QQR#cLEaPp`jsw zJNX=^S*(-OYq1BqBE-GD`D@rg6EN|r8Jv-Y{TT4nT46$~qs*WyY+@3@)E~;hvjxY<$DiFIM zb}!25*#`^y-sU${zfeBArU(C$u&`kCuK@tFj^iVu`{ZnFSUBuL^H>pwh(Nb6%E>UQ zl$A}Gn*v@XSgLHyGrfuO$MSL(3?PKuzNjLTGwjXOvLX5;J3qCSuI}mY-xBlnnJ;Py zQQjG2*b13Hd_Ah-7D_1~>=g`$YRyY`5Y}|GzYp~jz;zfwyC(&rlTfqn^7i~iexw&C%lXlX@Uo$8bX$a#U7r^T8inLA!#(hf0K+QlEk{Z@;0 z*WSs=N>DG&L%0`$%+T~~o=}7NL-FWpeKvnb2yP7Y^;xZJ3JaNrqMLu?p8;f;r}^MP z(XjP6>HL+T;g=B4EZnxCvGaDPZ$64HXgU~??HE?rjRS#X6*+S5L&zow{Lixib$#TYcdz(HPKkig#y`D0c5<7@hm z^M@a3X}N#AM)nb<_zA-@s-TY~esR_JzCOE0n}a>*Ue3$6+lZ;C1B67*XV=y)cd^4c zC2Xlh5ZdIOf9>StGo!fV)}()41`#Gy6$>ss zH>syLKhR5^p8Xd4y7yZt%s|vE_={*m;K;}b7zzk4Wu>K84^G1LzVuWcUN`;lgj|nT zPOYC<*XH!#=QnLuZMb#S)YKsQgh~id3PXP9wSNF&#Zqrl3Wrh6gF6tjJdl5@6T`#E z;{XiGxU{|9xH#(FjCn!>(I+q3P|M%GHH3MO00HA0N7lm41{NFjfmfMTbL+czWY4nj zgG#F?k+4ljDQumb)a2!Nz;IN8VOcX@oSk7g>*?*)WFg}Fy0Ewih%XB1LQB}sI3LLN zP8C6n20;Jyi`7-@ujn-+-@j+Rd>PFV+}+*1ylm-Nm6L-YyOaL$M>KXussQrV_LncG z0ct9_%AbX24K6>_ezl6mVfTLckV3Z~>Ua>+#9%FuypAH1r5sF6CEJf37gKSJ-%0Q1 zZR024?T(-(KI0E9rWEpQy#UP{NK(@VAf5%g0+l(tYW4V@h7U`7T-;pmKwYe?v6nHW64}Z(o`LVg~*oL&k5cs zWI4=yd@Fqc*YxIb=e1%j*2C99mmrO$v2*Kr&d8TPPUmZE{VDn~+8wR66;HSn|F zKJ+`V=6#u(nyRO3qK6}=7TKyj>BxICVGM9?*BBd90|>a)9d+1Av=)d_Vt0cX>GWH} z7Z`K6a=1hzlV~t75Q&u$IHYlJYKULgK%ozQJ~Tx4E!d(`oBh#qT;|jH*2jsN$2luD zKl``@x_&t^t9A~!TRWIcnw-DqKDT^(x76;*PlLQD~veL`Y05bGK*7Rhm>a zTCqSz7it3Cn_`b_4SRexdTyp z10CWvsGnY!d@7p=bq1>B8gT1tXF~*mcwMrx8Z)uaJ_K(9P_CVLZvhZko&gUx_bW{sD1;jFEIRH@yLMu(1lr$;YKMF6?94Cp931GX;s!y( z-Fx>&6`nEnN4#Y|LpmHe)Ri6kUgJP6Y6WlaQ&48Cbj()zeMAHh-ZnS27%2zO z-ezcNYv)$Je$D(mJ2Eoz&6_&|uc5rjC<`n**?YhVcx%{5V#R#-ZqnP$%*;%PcD&6Y z9e@qHVPbPtt^6|g)yF2e^*80sv(M`L;Xk)eXxqos!($Jm7Wn7JUqE&Nb;^gk{#Jaj z59%8l=tK(bET>hn35*b^y89G_Zx3KIoM!VfAF_!ua=5>=Vv zH29y;hdl{$u2V|-z7TiziL8kU1l$^UrK>WCB*9ANHpPBI)Xd|>@>W| zM|yf`Nl6|fIM$NrxhwL{ju{$LfG~z;1)E9OoMz{>=2ks9q{Ceo5%@j0J$re2etJ2M zseV^Zmca^E zS!M}&v2$`d59i5zl&|UNFWPLAwcL-=mf$~12>)?5ReMR+S4)jn=_eI2k%cTV4XYRM z_}X&T)5u5`h=G3oBqt*)DlP_5_Qg^Q{yk-fl)j~#Pc8lY&LA~|NLLFwWZcb|03mUP zr2$q;4U9&G_)_@J9UQb4wKrJZ^>MuNN8ic=$a_;-TKw9^T6G)z&Lyidjp-|2!=~Eg zPU{DylWr02cQ(*(K%n6X;uxdzjGgq@xy{X|65bav=l0+|!1%u}ziamunnLJRqpXA# zZxRh18q_*&!szIRr%_Qh_Vz@QC2zxxra(NA0gAuOOx%z%bJ=Sa=_qJcEZk|Q@*(a4 z7iVj;*<$&Ad=JHL1c=>mkfNPbtsoGxZB*ESY(TQpLoidZAUZDYbt5qe$>IK$jS-(; zQykzL=AoexFV0L#s5gjHTI%azp3At8F#9&H=RX{4CXIk#&tJ88k zY8(rnlXAS#FCLTXv3EyDVaxGx`#x^Gazw5sa}6MeNOU|F8ZfgC)+q(@hN^-B++w$& zo_i!G7+naehjksggrV|OfR`U!Ez{dgsC0SzN)8qq)Pbx5*Eia!U}wkquR}Qp(*#Rc zumQD;`Q-OjUpxoYc};Pe~SNGchn&SL-LDr|D5>hrGfT;rdddT?%5iH~PW9K7Kg_hyRAMM*s!a zR#w|I#cOjithcC$rD24N>-8qEEeaS@kZOxUT|mwa<1L|M&nm5zx=T1+BHUBT9@abe zq=w1MT7E|0=t|w-{)$Hc%NN-Ufh&!&gO_K&O=EX=Z?CPR&&X`4)bM%Ty3gqeu1o}z zJHF2|l$CJnMhu$CEqCCBOE#;$L{wR&*{8r9zy)h2ZgUEl^6N~BJ0@AyLP4BU_zt9q z`0dPe!SIu@(7#zhV*%EP(7NDo`0p4ogWm<7)^?o=h+4zLxn5+PHbP zzof3xziM9;RYQ0OaaaiK#1^M9HxkxO7gU!p`qO!cVx^~6klBHigeNJpoqetSVU{T& zx?uI~jq5lI&S8<~bKR4Uvl#BlEj0;{A3`+A!NGxt7Y8piYV>?sQrlQV@9McVy|%bm z387rB#~b#`^lV59{AIHD$C^{#qCK3=DNp>nkZL zLT@U#AwY%j1h@+&JzJCh(6k^)@h&tKfPNP*U$V;Y?`14}`t%93LS*14fpZTe{g5Y% zowz6~|PrYNV0-HJD_ZDA2+&&8TsS<$0jFQDEi*d!nzfC?mh3d92ZD)N+@3+x81 z5>WYi?BKxWiJw<%Kk*(2PkZ~MK{fQ4K^1O%CLUM0QSlcDwtl}1F_`}TT_a$3L8gH@ znD*8!%mbzn&U{il({hv6X28|(8GIhA?m~tSV4*RjslY9w*$vE0OH+sv2F-Cwk2wJ4 zb+)`W2dY8x)A{KWO(Qlo_TsQ7x)-WY#oEn*qSf{F;GglY-s)8rg1XvGnb`w%3OSYe zFr}<^ou9w%>KvdZz<(!0RM=;K6|!iZ@<-pt$GaD$GF2lO2)RgZ-qhFDKIjd`_;hsb z&;s}$KvCXknW?fNyx$Lr1f=`c5Xa%91~{l9j{mCn`|YZ(j(-O6ym8Xc4U8s4fd%`I z83|oruUqj_1uEAd%m*j%Nq;p9Uv|JHb+{3jxG0!74|gpX{#*rsgn;%(UvacCF$#3M zw-HZYQSyz^^6`6H`+U)_V&3g6yAS5ISQ0*(f`9LPD%NJ@@|@`v-=GPusf% z3KJVXenK9f020Xd_`8q^^WQGc&SK!931|U@;TJmYY?ClP!Ox5Ey8sGtH|t}+R2Uqa zn278IaTV+0LR>3UHZ)es3JSt_mO6)_DMEqM?s1+>jJIV6MQF|ETL`{aUBJCn=BO** zzklPJN!f-pk3YcVBQtJ2*{M3O5?W3!+`V5@zpIi5Y(2^G)g`eGP&;B&fEgL@o&w$i z6j6eU^7Y>tVIYvz(P{C2dqw~|RUkd1oA_*U;2G?3$rXVIF9nVS^KYk8Az=8{KP(%w zEmpLP3kf-GyXqO0x3I7P)puBJ=&M0EDDJkC)U_yOKFsl`iF3Clsx4N$iKstQ2+QBW zYB2i#)NkTI0ct-{8bp>`w{lOgk>1}|4y=rF^ElS;|9mcXIz~mP?b+!f6GDTAuP((P zscwoPYclo8m;kBUEu||E0|{%-pI#H0zy%58fee*F2N#3-Lq@u~B73g~3M35;jbnxB zRgHRyBhrZ@#~)Q3Uh-{HpNFM4*U$K_45ZEDxZN1wU{2(*`tU1#+i%v(|ESTT*73V! zqGd_VA|q-eXImrl%*QvH&Aqi`l#;+8hJb_Nwu9dsYF$X6Ni z%kcvJ7gt6*+JXoxEVVz?pHhnoJ$iBgd7DGCE%e$iwg!8g+|6Uw9~x!iXQ&HIcjpju z?VOxeTJpNW&se=J!fUWsoC`ti0YDy9?Zu7nJOff#{#tO;;=`TSjg9F)^{sG@am?H+ z`6ttOtdz$N0S#yx7WO;F&rUTc@JVuVk&y{YPd9k-L}Zzi{o&63{vCGqw5165 z#iy~~{Dvn0C6NfO<$J4BnzPA@7gjv^%nSAy#l9qzl^`?-|JX<&m5ZNvW8tUqYH$(T zwW=x+Xem`$N$3;YEne$#>zF@BsSCWPkGp%7Bo5Gk0oEF7h>MK{Q`Jva+6r6{@DU4+ zHC0vJvgD@EbVFul9-aBBso`a10m(sU2g}Ro^=Q;ZM-kGFTk5-W+qo>>l>J=*UQMZEs)SMa7#~ z+paia`xTP-kKjV;N>Nzb2tD!!pIYs?sb7SJwFq#gAH`7D0^0nmvzRP2YS|2Dr%%vP)C1LXU`uh51fgVzx?w|x(aQ#v|=8z>0%x-_o`+I9^ z>x}TzA{Ci8B62%e0R_5(OBs-!cL;@>SHx;QE8!h-Dyfo^~M7(bK=nq#s^$hf?EZ zc2p~g{VVxARx9hwNQ-0(&s$foiqFcT0_R5%39X7^VwB|NkHrZ%18>B-oVS1cSdmE& z{brT|`jPlF88ni3s#HI5_i;DAFrIWIZ}p|yx+?jBLc!K{9T1OEVnpOrMrLLytQ_+3 zfrK+Vf}H>T!veVh!E7HJ00B2(Ha$H8c^G7^&|*+3e^^}bSTo=>uGSJSnxVv1R{H&u zQ_m$sx{waL)83v9s7o(j@O1@robBd!$!7NWka{=FAD`*66HQNFXDA6PsJ?0u$!k)9 zqHa0eAqJl4omrQ^BM$gh&JZGTt|9!rf(y$FT(KHLacd4G$&d7m@8Wr?cIqobn$B~Z`bUsM`dgw|-C!>EbVSN&?K=&nb;-eXT_Tc~~#X0CHN0bLli0W}WD z%)C35R=}*m#$xMhWR%^~atX;b=RB!4T?wm8yQ_HG{1z!O@w_ceEx+x)ktBv_i5~=| zJYH|V;=yL@r3-a)`^Zl$NiU>(rAEqcdW4fi(efn(tx9WgE4iXP?|+FB&448ge4pcL z;NG>gWE-S`6hKLdr{|v!wY9YcBoR^zrZYN@lCvKGghRW|YuBy;?(DbSd;~XVG!)0d zOY6T)Hu|K*r~@tP`=zIm>vF+LW*<6_xzxpfLo(qwP- zC=QtGbsa*BUNlTU(yFndY$cSY+O8OF&3r5+1c9e zINRIVh1`iD0hL6p?N|x8>e)uGa=KwoLBTmZ6iA&CHcCjZ`tG5hO_Jr(#A>uvEE8 z6msilKQJ2<6|pW4@ZzYYjCXJ8>$3CMB@~fpRhP%HR|2zxy7iksMrHrr@i~wPWXzRn5mebMf&s0PT zT1&B!D9;O;l*}u<9bRYYUDtcm+fPDFa_D&^uN&@!1M5p@`Bfj5me>JU$gnj@%I0p9 zSp5j~F*a_64pBWlx1j3+)YkS(H%O#@!N!%AmYx$>*xWSK)qQO|F*(^_g7_ms{}Eho z1EGlzhLMmSw&EPZ-3k!hlG6E5Zk|aIW1>E5Jj+gGQ7BeUli{J!i%eRZy9)9z+D-qMhoVh}G)8Ko z5QQzAYe?Zn0s9FG7B%}|JgZMU(Hi8{)Vd6pr4eu+Q6d_LhgU#)E+j-gCGdRkAQ8|1 zsNe=N`K{+gy*KokP1CB?Eh{5)OZxS1Do;5e!wv*27eGMBrRu&x74&X&AYwn@hM-Z< zyni3i8iDJZX*@0G`=eU1L8&pO zuPKcNgE1sX(D&wTmVBo1S!!zI#f9FN03t*8BvcOT0Dg|640$Mfai^O4vsp` z8)33QkR?M6m_x{+7L<@R*vmPUm7{=`wzZjruM_NG9jf^Rn#tf+xKH$$}P> z96oZ?2bYZyX-k^CbweRS-QdbWuGx6zCCE+_A+PKGI!6Kp;b zfeX=ly7vvAs;#NLpJZ3!_FD`G?*Y}m_7&(sG%dhmjCNl*= zA6R_OwXH2rH#cPFWkBU17p@|TrOU|7JOvoz^b}6qsT*y;Y2tlBZLMzkHz-Hi&otG8 zhCbmk=GhY;pO;q$l)~{S679GkhC!+!A+&d+#jHJc*kjieShJ!9Vm-EvUp5qtW(Q{i zE`Rm(SgB>Jt{+H9NIc*gyur-;nshL`1=gp)q=+n@h;{PW2_`OX$1A{>p=u^9O!4dE zWu;L8mxhJj13eT}LB~#A_B&FXjuH< zPUIH=^1(z38UP>x)lL!;5?HyP`U&Ob*Gj_ls+=)dld#h8MwtBo9^^6=fa)`R)M~|t506U67SPrv&QkL8=_D?d&A_Dc zRf@B}mTh`lp&MyY^*Q--IyA#Bdst7mUh*!tZETGA-RabOZqs6@=+zk`J_{G1Na=}h z6cMre_J$V8P^<5Urwy~WWKC`Lu&JFAHq~qOxfP)rC+1FY3=6~~Ze1?)big50Pw~IC zlek{O8i5z+i{BTFij9^f8n)LrN3(xxRw{%*WPtNzp(E7!6k0|m;N)k6P%JqmB?K*( z-X=m-@0#e>p&^h4AG22By3VKl-J>4Uh8jO%d*^(dzv;0NUoQm62;yt>g z_y^t{cZ8D{+avDr^SSew^PUJ26w=MEONy)fAE0muie{V*wt~Ak@85H?uwW!mhTdYZ z%?nI!Yc}K3ME&(zFjxkvOKuO5l&?#mw;^F!BIPC447YD$g&}PtvB-Y`pAktA#lEBo zDc|y{vSV#kmGqC`U=B3K&a2P~*+p*W!_Kc??YZ#;X{}2#f(+O9%lr8GImPW@c{s7) zT=5H9%JF^@d&pdixf8EHr1{PHA(K=*XTYvdPK<5ZH2WsX9m8^+QM%{o<^`!P*oj{eAZnrTGBl*TZg@*0BrU9`iHbgvjR2`ipAF8p?jbb4CgK#{ zn;#ldw;>l6*`X>v;R1*d;|9!61tL zGDsa?B{H-wZTe0#!wGlE6Mw26c|KCu$z(FtEcX5OSs}EPz5it#`gv=-Sq12Y(tmkh z@Atu;kB5jGKYJoWT`n|v`lzeladq{N5BDtk>`Lqa*9?43u@?dLym(fJMv{4|YTzn< zq7(6&cTvi;g`z5B?{$n5T9V(|0(qF>N`hJL2fbsrX2qqh8xHIouXGW1Y(jtml^K~& z5m#Lsgjb=>Ge;+<0Kgw@+wNOjUYyHs zCm;bQG_&4z*&Zx;Txw(w5EO^4A82R6Uqnl!NGciFce*-HpU{77q@FL| z)AAxtz82DFTP|*HN#(Xx#RAPQWFLamt@-+JypkVOv`5N4Kyqkbx}*`i*fCRf$N4bA z%2dlEbSs{;^|#9j(1eG=w4ImP(rbtE_NT+T*gRMZB+6Dg zi{5)f@zN9*qZSSUXrf@(bXf%f#!y>^vOY2>x8I5y15-{iFS*AY;5&fVc+tOF zz~TV%Ti$L1m4Nv8MY%OC=sOhuVqq!r2Su?E3(*FHLvlt&Y(z;^6y^sIH-9XFJ}1sJ zdUp_$DS(zv97MKD?>5#y0fG%WGLx+15&RHB#Oy>rs+HhrQ6V7%K`Eq%Gud00pDgq- z$Di9+xt_ilOzwMyHF{&~a_K_a<@C6%|6N+=JA@d?E!;z@*;k^7uL=s_daXqG1}t-b zMs-B6n%inabzN!PhA03xZVEJzaeh;uKfitT%6$6Q$#||7YYbM5;AFK|qi>zEK@f5) zE)f>07alwR)<-8Spcso?cU(C(Yu%m4hq~^Eh1AYK!!N{)DFJ?dejK#FAMrA#a1r=FKu8MNbUA+^*BpW~GC#5x-ZhF^&0>@SH^<9Y zK~h?!W93FI7kFK~XcP#49dOX1PO%nNSg_kE^Hbo7LP_T$-E0#1uRkJ!rWg#sn0oz_ z&e$8HCf34j7k4ds^eX^#>ifIE+HY`j%Z>@ zp=eIU%kLE?$ZTNu)o7Vx;xjTfKsR7&`rdnY0a{J0Itgo!b}pT-Gd&dmA4M^6a12gO z8BEPwEPOL^X^2ey^Qm$7nex@xeSY*V^<9Njf7^z?K6!r3sYQjV78x>S-~dWrbbwK>jT<)5mt|w)p^i@Btb7tMS=_muW`tk* z-{a#mRqKcDXH88&FnLAz>)?R+`C~`NvbeaovUy7k8Vdaa&H3u!4Gg1d{kK-4kgS6} zs;a2KfF9b-qd0SWA1Ek^F{y3>r&d!a{2Cr!S3mX-SKCi@N-a_$r?{X0nCcl0?gs{QV>0#$BFJGUpWqML54MoX4n+f=L4bRRRwIr}I zt7bquV>Gc4jVOY8MQLdi*S+XyEX&@fy0S`2*lY`4-Ww0X3D-gUpR)@M$w0RZRr>X` zI3Ra_M3Ie+iAhwI#dCfv7cM7lYHB|+`;DX8Y<0cFwjW*MzV-Hp(Wm5!Q`0OhT>E~J zdOufw9(fFWgZ|ZohYB9%A=*jWFQ;x&6qL=>DQ9uk8&1YHMzr{Gj0IvfaebYh>S0ZFN#9a&w>s5AXcl5yZD)L&=(oO z0Ic)rGAsVvYn`$ffx#StUwEj6sgaP7pe8AQ`VKkeD5XszfnPwNczykqCr-rnTq}YG zj0zP12(d2xizKln+kUpMZ^4u6w9Kevl|o!#9wr9_ehvk?C-?uUb^^@c@e+<+EB7V^Buy#MJ5$EgMRA9OyLg_S@fAxGzj z3R0ivx8j=;7!pKZTG8*DCOyEs?x}Yd=XoGUAQm=>gzeL&r^pTM!6Ud>bTr7p7;ghP zZYz3_DyO4)R;DY8z4b3vu)E~BH#6OQ)Nhz^!zy+D_fpUNPKMi-fY;Wg@QOfq>++Ms z{j~0Z7a7nS0N1r*Uanm}5r7_ku|h)a_+0JM(kcC^S1SEqA-w}cIU#}I1K!bmosYP9 zV2L85J+bK1{yX864gTjoFGiRw?NdDIACEu1alL)CMdYrMJyhdPVU6_nbAkhYGbJg8 z85f)uvJ$(!;Vs*vD$0WhQG<(vLyfE`VUYg%7GOqjSMRB=5&0QH6R;#jh8bX^_m4j_ zes)_5m`+r_7iW*Vk3U5ba*sat_AVN;9liqswz}uW$**3$ij2faJIEoQse&4q7*Zhy z-}d5sm!@6a2rwE;fci|D9Z8~Gk;=^YkK_9EM=p$i2 zU)Ia*8hVg6o|Tx`F2X}gD?wJ|@?dVA^!oMSeCe56nZf0Dyf;B10m%jkgK*5t*lyp( zzU>7)6{C2Rj`7#r>#|)-i3di;$0MasL^K{Xda7889Dk4h0SMtQ=5C_4V+FiXVR@TA)GvVxU0OO?GwT~CN=9N6v3D^LxYdib z81T6Lwxaiy$Xvm1pzG*)s=G=63bm(5)w+G&41v8|nTdTR_ zFm=G>p8B6(iLqP_9T=x3n!*gG*}#k5Jd^+x3;@xh$f4okK93&*UD?1l4Q2OQcj--) zRpZUOsz!wh_AnbDHE)#rfs5^8;J{CPbRp_!MD?-Y)-KNELODX@p@r=MU z@v;2;Ss*CS-gCNOzRQ~%QvHqp374+D*RjBM0}i2CW5o(|rGzr$uQF`TOlTDX-VxZ~ zB*ese{+_S69Hhi*zF)pOpTXP2bN?FM+f4oPw2SbF`WN0A3m@Otz0&s{g=Mz)O>Z6T z0Qs7gC>l<(IF5Up`^{}*CUuB>E{CUn))MD7%c9$ryPTMIjyv{p_Y+S+r0|CLlXD?7 zz)XJe;*Q??PkWV8KLD@(U^92R+(@W$f~9LoYIlYtcCxvR2OS3V{IzSIxlDw)REi4& z_u8o0r}`Gp%l9}xu~IR$&ezA(1bu&x_NB0RG%ak7DMfE`H+>twX65R-H&UQP%BKG! zJA3dnfgGA7kY516`b)$M*pbfjl1@%e5S#m00@?xg{yA0^j4-+J(y&-7JR)Mz&|A!n zMsU%>1;rRQoa9#1l%m1z0|o*4D!9#|$wS!fdSJbSp6B&NV;XkkS?}iV{q;jNycE#) z-rGO>rMT^_z1TifREI}Ie*5P3FgqtwVF@rYpv|ZT_}{4L==ICTKC>JI55$yq`t|Vj zX<27DC_SJb4&)O1pbeapO zNq|VYiw$r6`ey?}L)_+F5n5s3&mPC7-`f7c3UeFk>+7KfA5`*x9UWN>Jj+0z1j9~p zl7>8d!0DJvRh!P&i0@j zS?pR*seM;Vluh>HtXk#3SNF3_&maO$?e8Na?@c?R0aAec{<=}d_ALrVBC-hiojkph zgP923aZh#B`VKn$ARVVlKWj%k{!JU{6pO`TQn$X-!IoczLhnwv01udI zuzy0w$E$Xc&}T3~Rf!m*N1~K&1u%&CJ3WK`V5%Ws2KtA|hffsNEHy`cj<_b2uki+G z(yk?=({VU>>zs_$T75XN{ALw!oa9uYHs_@7|J)FFFik8#s<9OV=gAP%C9M$%vL^2H zM&CL%$_Nv{N~D`0d1@-?pxUZTGszqmP90QW<{$c1>XVYcX_e6C3dUp89iqW&yt3~^@2;tAk@v$}UO@PWp6M*`yUOLvV zq1<-4aHn5m$WvecrB3PR!NC--$txRF72<_%EQO3LRfL1H-rE@BGpha92F9Mx{CMpl zl-s(r)g&d6wt)$SgN5}`#OtcwQ24pl6n)-5npVCKxCN<|zYaDwHh?nSjl(NaV`gOL z1;e;Lb#|J5?w8Xeixgh@=&X9csau%hxhZ`7x+*VSQ0;*5MHO~zV6iO&4rH`4Fdc{y z$S!VKf*#TLJzAvEl-pt~69m)pAvB~Fo|c8~ZA*XcO9!VxhfI&3y+Yrc8#Jw&eF8XO zdEGh=Z(#WIJ|qkd33=O$PYH4IS_hk65*|+-O7ZygZNvm_f$jU2o6eeAr zx<|E<=ggOnRZdEqpP#8_+6+sVBnO!`y3{o`3JD1OJ~=5Fv$ZRikpuk6{lg#v5H9V? z6H;ZB?;-NgYNsQ0c!F5yG{p2uPINBu4wOV6FLM6)kbwWc53!8e1oRp!%oI3c*FYc; zdLT|A%PR_P3D@3=?oL?*{%} z4X?i%$u2C+A$6Za+QQSu%tA^#yg?-RGj==lt{i)$B?*FnEF%m(kTTuFh5S>IZlV*Pp5NS3ht= z9R1fHv^Z(F{`FFIS0}Uk7VZWd>e8|tS{B~!e@!%&GURxmW@>9;cJ;op4)BV<-&O&> z=jOS3qbsrvho;lj!O?JX+;?~NFmwOwOx)m9;F{Pt{Kqrax*DCVZenHeUoO$rn*M!> zWNqx-EnGQd?cu$pEzF$EEjW}d9If1~;f;BDL`B`)T`f!;aIxg0GIR}{(iQQa9F?cO z?v<}6BMEt@rLFi&qgv&~VW$K2NU5#E*TWhzmN$uYEf)h7mhTMcbI#-M#99qxr3ttl zt{Cqx&je|6IU9TOG|ccjr(F}hCc9GqTR+tHp^DTA5uVVqF%cwViwfT z_h5z7{azVuzT433?HeVAb0NRB`r?`Dnt!QlxS$orak{Z!bu;((*OEVWEN{~XJ?0ou zNoJzca6V$$le?8AxR^>Y=iK&=`FM8h0e(nhR|Rv&EiO*WQ^xS0L_ArfVd|NqVG(QB z@=r{h$qpWEnhp!BS8EHxbKDCiwX}AUq4^gvdT2GL^XRe6ki^_#ccfavG7Wy=kHRUpJwG;Mfb<{{7Ogs zCAw53M8w|IJ^Dp~PIgL-%x3<6onqPvXY1)v+i5t?O{oUr%9VEy8Pi1_xNNX`nHEdf z%C3vXq58d3zY%UjHOw4$lYT|-sM9(_PDf>6XVj{0NiY0Wt6`z}OQOudVg8g@)RxS} z=DWFT%8{pKtLL3<=9Zl0S=s~h$Z>g8+6QsV+(SX{%Aa6xdW*10-in<}!^^JTxN$^& zYUr%N?U2Hy)3?>`T$7ACCss|uf?l?$InhzsK-_U6$=n}(srA}*{2e#(__tS2D7qzHJTdge zsNCHgu)%3~Qs1n_>swzIxl>D|cDAFHm1QDByNdQ{x3HV=;Q86kD3;6_)!FVyqwtt zaGzO*J#se8-3ls|p%?jPvmB}Gc;u~EjXF*)Ki5g$`qW?P&e)BIbA!E=Lkbs3rPZu) zd)ML~t_l0;(eI+G<;0z-=zmI4Q8~aSz&0mI5o#N}jm~&~H1MGQ+Zthf`>XZ@^oiQ2 zS3WWr@77b8n>ps1tXMG|v?q4a=P#swW=5A1bLfez6dL zu%4(8g~|_IB`=&Ol@qfvBd?M}-7hHZ#*n>Z z4li9q1PXVW(F&bz)1*A;qdXhuKs)DLa7pTTnX}-|WE@r#8@+R!Mc0*tATS$i`r%$8H95@wAX~vUdXKW8v;< zWA-n<0ipiCW;1)3x?lMp1qX0Ie}xNw`#KI?8*^|ncmL}+=F9QREre?l5Jp%anE#ny zeL007g#e({-(R4HMM6dax-l{e>Q&z?6o5(p{z8Y&Tj;2mFt7m&^NM%|UqEU3^L609Nqr%M*sM~|C$p0zj;6&zPkc^|8jvUCT?~#e;lzU$Nm2&e<&Zdk@8qwOP8b* zQG);tNp`q32mc-p3+nZ7k9d_xnn(q8B^2{_dMJ0qUBo@jqdsc} zq1uwi ziM>O>_S|jGnw`5|!uIoi?kRTTrM@3Gj%4e$;&%P$XO5gDO(h3D(s7j4V24Qti90K! zL0JphO-9DWWp_P>kIN#Y$ULX;L$SiTndNtR6wo&(Ze4OU3)q>9^EkhE%#+Mb_0grn-ue5QPh`p!=i$tDl`Eb`RLz6jnbV5cQ zi89b7)b0i*8nj-%sv#vI$x22$v&V-i@OFC=E2nr3GmW#i_)_@_DohgB29Se>0a3k- zqX|K68WAA*=wxp04*G>{VFLY!7Y=J(KbUEg0m|G@W$uiJIIz2Db$>FhjT=j-)+9?#==JRWxggJMWP zo8uyJ@ed8{1^49MKE>PD7LJY@Mn=@xF!{V0qs#&srAEL(0dqGfvUWSy$TcpQE3dTY z-yv#gxm7NZ;kf9scj?zb(0Smex~gV1{TF_}=NEUUA}^Ar`I09c@9-60o89J6LqO~Z zrQ|3H;M+$YAi!OwiE|%YTw=Fcros8M+u(k+P~OkMnHHBXIje<>gB+W-H_v|!{_##g zPP&&%RXmzCv1_}f8%b6Xw)WM1X=`iPb*~BlF^c(%3?weQoJ&}N0rb|W;g3MBOx%41 zx1O1u?TkxKehHmRfR}(?L1E=Vh@a{l>n=0`IV34$xNf~~Gj+8%aH&{2cyM0r_wu;r z!+9>QJ-w9IzMR9nyhGQsN48h~z9(oT4G$U=yn#GJr*ge)~FX^_LSXDl8mQ}U`jI`dR!P>MF3b`ygfDYvi?>rcii zcn6sIAULJ*0@TMK2Zffm+H2l#;A{EB&5aXSV%_Xy! zfJ>vQ6y)pRq8hwEC@F3Z9Z}Ob$m0XGAL*x<+m;0y?7{XnHUo={GDKXZ2gc=F8BXFp zB_GViN*$P*FMc*pOP%glJanOAt=?pl)wXq5Y(;vp2Q;H|(2|gJvcHs(=_sP4e1j#I z)IJ=qgwWiFP^+p=0%|%3F}N{5tvS4$o^SXNik~`6D{+nK-H;kLjorL4MeCg)M$uZ@ z1P%#M)56G_4+aW@#~?!;k0L<>m${rCy2CE$DQbv>i)gCfrgL$|wzf(&eVB5oe%$KQ z`0*nNrUSZxRmUm7p+la&crp6NBgMysWf20;k#{sIRV6& z`X3$zR1Zb8<41oT86oHexSwOB6Wh@J8kh{bYNF&)S}qbc6IJNzDGHI*L1z8bX)IVZQbJvSh&S{+MYXimx4@^t{J`Bz#YEO=N9E}YQ(1)< zFDioTR@=fa^&K5|h3FjNM*cY8+pGAphL%)=Uv_5PnNt!|p+>UsVlu5)`iJ0%FxdU;&j^~TZ5dED|5WGr17EJ`2jdpQ zuO+ZLk(VH@uM|G2|0X4oJ3hBzs%7&+)!}qwWyCwC^#Qvbu6h~%khK(qNN@v%O_{S~4!-C-A-8)a#;(Y7};AQ?y5`7CI|C}4_Iyc;JkLEHDwHi z8RAXp_jg`|dTS5mB4H5#Y6>6R%QvMjEzHn%AsutyLzxIYGB!CK>{FqdskhaXQdQxLS-?w&T8W`^?alJDvMd(JfsPs3id>mh`PX#$P^ysn(5 zURzIHcNcMas8ODvPYXiNlMb<*qNK>9`rlg ziffru)ny;x6Lo7TOieFN_~d`wLhi1rY_~28@dO}{1T8fKn4QK?o=8?`*r8T%*=J7Q z8Fhg=is-l8?O6~C$efihT!lV8^7@w^$0Zq`g9O1pm{vgesl^D@(hb6OzNv<+tb0!O zgdnZ@^5xIo9wcE%slXrRq8oc!#4mVr@Wbo6Rd>*mMuO&i3ym0F{}Lkw&tha~$f&X| z_qdO?YG#cAUd$Ig{^rRiQ+uE=cC)pc(Zir9@R(S`a{YH;?Gvy@R6V>$gkFWdcXR|2 zgvtce(2FkLWI?6a$4+xfOX$RwI});o##T}YUK z@Ra_1>f1LJvm8w=tsHqUHz>gl6y+_0L8HL7IkX8;O`f!rlw+uHpHElRQP%vOf>e>r zyx(8TjP~!#c{!I@n#1`1&>#N#Lap1W3Lx)l29rOnhMt}~C~5zG=TnfS_g^9L7Xxxb0iAX=MA2FIe7h+5y3o;SE)eno;%Dn5L1${R2?+eJ>UBb_WDvvBCZP9R|4V?r1wbx zDLx%0eb*G5@H$KL2T893cFAUs9l&CI>ex=h*pHnDyQoDSgNH`TB!e!bqon@MQ8Yy% zD=Efe$e7aSQa*&UMm5DVmJPyujmKW>o*ImXg(2P8ND^_)kg3qsqHn~-C>AreI^>P@(T-GPx#81G{vz=wZ<;a;M=-7V{ zGnGl;Kw+ETPJlCrgvwZzZ8g&P;|1XJ;z`}dJNZ-;@4s`<{*KR10MUYda_2d`s;?=r zL*LrH8uEYpbITD`#!|%(`}Qn9Nk022G6%a9(5V6_oE-z7w7$n>iwu!T&@5=wvNkJu z3<$x;#AN0tW=?+1_knr;-jsC!R4yjlcVsLbcZGzs-Z;tH-&}u|Co;qwVHfNU z&N+#Yb0?hlG<0dq0=Jr4a{|Pl@{%%Th@LS z#HS-kaRJr%OG&ROHL%_}vMBU}18!`ogmd_c>6Bzz3T6yG+mdZOMUsFqV)Un<+!mF0=QDIhct7b(!4h$_}chpXgHDTJBIN{38GbiVQ63t(FnX= z=wx>;LbxfB5qt0Bx|s)z9nbs+c#SIBex|b#(5O^-_u5!NPL~%KWzsGK-7^f5G~?K! z1r;1Y$UW3Bc(#~BA`Q5(}a;v=d+Ja`;WCdWd=T{TC5n0el$ zwu}p>c4v1%}}<>m$6;L zIZ+1+9n4-4^hQjy8+yG2cz>SO0JD?P7L#+prS*}9m<5gmYlxF6lT2&qGa@Yu9%5O= z%3`Co-d5J>*QO8^qVJZstH+3@O->XrQDH)$+0M^|>R zbvr56WTg4YsFjfh@eoo_q|NyS)9=uR^tV|>xjL0G9Hf8qBn5-d;vQVBC11MRwBC~v z!tp&Po%Y2RllJQzmI6nVCZo&%=fptk;7QqZ9fQi7`06zFRNXA~l!0;cqDk3Tpc@*j z#vO>ll()ztT9K7U!@bk{m28A8P`7(~C8}a zZ-<5mZIEGhm1!2>4`i8$PG!GKt#A(xGmd*6JS<;et7QF67L)at;3@N+o}`-m(8P|M z7wVNihjxs2eIT>?NYMC`>ZR||gv3Vg{WW(EVW%6eGHS}H5yEh<*v%1$?2ue%bci9B zv$ZRa*dIh)BUfTeWO=>n&Xh*y8eE}#UW1sOb(M&fBRtC-BYPR7Hb7Rl(#=vA$nq^R zO62)tMw`cXD<^5H2Kl}#i8HEf%Xcm_I<69}LYTm;O>9rq8CU})McfnZu5OurWi|eO zW=nacg7t(jmJ!Z10=?<)onK!^@azV?GGOkSJ;El$2$+S?E@W7fQ*bLu`8)SL3<}*1 zmUsEV{&rBA=7aZ9``xv40gM+V%yR;KZ~h=(p}N{WNK#u$Ln|`Y!K;b$EXXESxIb}! z_kzNeq74_=(Sv^>cyV{lN~q{4kn5b?w;~bAINsX4T9J7{hZanrq)Hlfbf)9ebkF_c&7tD7#|(yil0GMQVQQ4Y^36VnE{$Mmo+1d5kgK&rESBTUwoh z8TkbRNypMjm~2V0`g#5SPG+`U{JK3lIlMDjadGH&@^X-^@vcavPlF`-BQmdSO#tvR zH#aq{2gH3zdg&tWe~ZLfT)pF+?1*e5`lEiO>y1x%ak0_r?-_{s2dj^lnnMEHpXVgn zT$py~9^tm#YzYz^Sggg_6j4`M9E107swT+hFkbK%@Np|dFYvy_QmcJO?5IPW;5(zM zXUfA_Nzo|q_2>A1R_lOWvS5L9L9ZDGJ`6^^d{%i%1DW*x#}Z74e68D>nL)#x#SssQ zyxE_=L}%R$QRn%Iqe|6-A@*jI{C%R(LhvRwB?)JKG+qH#A(1Z)PLhe38;+}5>Ty5~ z<8Tq4&V6@6^X}F03eAA0TP#$l5mDTjT*kV(72ps>F!3yVSUP16ca1!f4#$$a>2Lf z9oZ=E{H+0b)M+AbrS{l(TP!uX%xkNQ>w_PkbQ%tIng4BfY3@rz;}C4Q=IQCPusgTC z7vhi5d-+mS!LtfuZ}$-nS11BBm3JWC&JLtr@FUd$ejIQf|NeOhyz$7ub)#99iRsUrTPHzgrD_?V%8M^*ZiD@C?N$5<(m3=!S4I5Rh9YAtlX~fyk72 zDF8ugAyadaztA;}Tt2+AsnyjT9vy-6axLcHAML@k!-F>h;Y!1)hyenw zeTXq_^YVlrF2eQ!zTcoNUzk(hdl=1L_wV=VGEpoc!GACnpH zIZRt2>r=PtycS3M2!FaBZi!BRs~z1GYbRu7WBXzSVEFf36IUp1t}_Kx(<)^J1cZl{ zodahGa;~t^uXUL6ZFF7yts8xD!*m;^vM4_X38|Y9iVK$#bi+UkD=jNiJE^o0M`3vz zQD7mpFd#O4JpX)Gc%gtV0}@TLK?$o_Nt;UDe3HowaYsMUeOv$3-?eF!dFNS!@H{q-s18YK5X z^WaRqejLvCc$im#cknsDI-|H~>X~UycLx12h#Z@D*3^vUp*`n8dE}}!?*0-mj7v*d zH@-v55$+&|HBj1;pFuJxw7gC{Pof|Urf=?$nqJCh?47uo6=VsUnDahq67*tOPKfrX z{7HbXLVADL1GPOTE~m~L3Sz1L5-$&rBgi4EagJ8^_+;Oft>6aj-|i8BO4%%@o1!eQ zz46$cnMuMd?(FlSK;aTAw)R#~=t&p%kOHfeq-0qV9E=;z?{7koOAYu~4iaZC;KG7I z1>~^cV^#Q6f|>?#Jm03{WWiu`fDfrnS0<~Dj+9prFq0wat*4=pgM5=2`G)h0>G-H6CY=(p#*aP;wc ztUraiNAQ*Vaf{a%{O0Uz#*-%~mFsyq$N_RXAC&gdEF_BQXy&3jN_#~P{41e77K*pE zILeG10=1nE?!v<{ca+Mo|B>jk|Nme4|MYcf`*sM9Qm{P~p0a|h1N7z{5NEPBe+aS8 z!0Q|x87VlGLP5FIh|~QE?v|JJ=U_R7QbTMYS1INK3q@JDZ05_egun0z{dQ;`YS!B^ zJlnxQ$xF5Uz}j4Ssg6KJ@k@bVz;SmJzR>^O6e{--a2|&h{fbbIilR*K_UNuJ;MjKR zTObl&Shyad72tSu4dt!WuS$5K(&4sA_s;~NJO^jeyf8Y-aahU+0cpPrp9TBr6%!Zv zrX4htU9<#)R~a6ND;|)Nzw078$`Tew^@+sJ)tZ=hN`QjGUo?t4d6-%yPeY1_3Aej! zw#M*L?;PpxnsKW`u++PTzwV3jv{H85@1BmTr+qQnJtrY9B2u(`epad7fe-B$>Sb|e z2eu9bXvw1*y#zZ3NI&KA*>>Uc?k%N5 zR3g}R{X!w7G+o4L#VR!YF?_;rt*@GSmN7qBjnYXc2*S_ZyEbx{w&Dvn;rMq@#nN!q z2>MgZ>M@f+pSOr|F$6Gq7|We(Hs51dGXAx-<+`k81dA#pIh7$hJ3Ha149&H!C0i)pAW@Vi6Zv`i(JqXK%<%jJj(}%rdjpws&lb@mKBuLsL zJ^)P$aDb;RaWvunkuFBNl$KU*Lp@96c0`F{p&o+H3} zRiIyMcQO5xEwVKbCVXnD%i=%)`tSfNNamHr>{!}eDXH?pcMw?T=TGu$&18Hl>$sWJ z_>-sRLz-o_so0bR*TNK$Il6fTC8e-vRld6Q(r%wzxVXDYzmO>f=auJAtQE4a3!Xjj z5O?$G?z~58azN=X{dg8}WpqdCFOZ|RX}1X^%1>k2Zz50h$6YpiP3)T+Fx9qXt+h=#iKjfhuI28|^Xh-^RSNE~^~9vF&J=$@ClZnnvE z@9|fV>_qv#^_9c*PB1Aw2yfibO8kmaGrzDQ#OaKo18T4TM? z-*X*uz&p`rQ`sgZeJh4L=YH3x&trSw2-wp6h;n*EdBh*wvZA6f^>e$marf~-CIPxLLcC~Ty50=xn7Rsh(p-y`Z$E}} zCvj2c_1Ik&)p9XxKN5a+S}_YzFJc0SR7%E1#VSfGUiiX>2@lQU>^G+yi2;Kuw~o)8 z%v&_X48pUnb8D9yQ9P(iAW8SYTJFh;;NDXTI&Z7Jmca}7TDnJQL3}I1F5>x#Y7hTJ zXGC(5F)pPj`#GdlB+wBzc(BKU!6j(r5EhEJ^5659ew!d5S?r`sxmC|$`hgm6ucUKx z?r*YR){lzEWPxO2D@|74+>E3ho8Q%2e~Bs;JZX3T*P|J{fLY3$0b1{;(d|OfJRLSi zgRZT79vn2oxsh{vPYANT<@_->%;z0Mw6XO%{`(OiTQp3gn#WAxzF8J}a!SBK3D+BH zVfDMh_OtSy8w2cg7#~fF+pf`n!us0I@CIAF-bJ_A{BI3}qUL{>GQ>4hi1GL4n4%!7 z&!q^8xLMRU){fG;*n^B7(H0(zlljt=cc%xr?GT0|pD}0q@#2V((kssr1*l-w!145cO`t^`8$S>Xi-nn0XE{%B@I5A={vo&zp%t&n5~On-W4Z${K9;C< zyo^&~D$Pn-3khuh#MQSp%4{bC;iA}G4yI$p>o{}Uzo(t2ysOHTRaL+9lve0@q0eob zHqNgVQfx3QD=RNu46-q*QbWi^%hkK5P3Pt0)Q;zgmRT+N>FOjN%rNVin5UEU_P((( zjs$5EEh9uC0U1$D`v~$$AEt@Kx?P`yu%QyA8%D#%rL&JTG&NiL-kq8XE26gCiroH>JDC@_Og)^DS) z6T5~km#OK=@6l{=8DrvLC%P%3bV2am^qNUAGOproztE6C`h8SP%z2C_5eR%dF>)v< zv>&3N1!Y7iFj?V5Fa+9`_@b>WD*k7IVj=biP1_(Lqyf=XCx$e02mDSi0Pl+ z*cWvePr5!80q#2Yv!cC`>(X_kZ9P~eOTPCevL_p4SmEv;H~5s+(-0`#Z zC4V=;oy*A>_x~K0A!?=N-z#=vc~T06#(`@b;p8C92S4jtd~*(vwmJ6Ov|%1B=viwW zj?EBJATt`Yd`Rc71%F#cw5d&pqc>qYNJU`WHFoveq#ekg(O3^~LlNF6Ge=P6!TF_3 z|NL_H?A0B3QN1O1YKO}^jB^VU6W8488#?pl0Bd3=+duyDeKQ#lKY?dJ<-ps7{<;ft zio1{s^-7+NEz=d)?jMGx$9>T)DqoShnanguuIyZX8T#|l@2s$=6Uie;ZHT#@RSU`C zN=k&3d|BW*240U&bR#0sd=BzjVR{Ge6Oh#!_*JxSsWL)l$Ggi=Pk252l6eUw zNeLqyl`C2Gh{(wkGBPfJwLmdCKkpc}Al(s@^~RHb0rHZ+LD3N0y-y!0)R^uf4v0pk zQR$EDa{WkT0c&Cvy!R9#`&rmRh-d8=hves}083papJ-XXdI&(?EkylJR~TWY)GILU zpFos|?2n}8S5DMgUJw)lnLXfQ-Ck^aaZZMP74Qy0;J5ANtYHFnbEto=d1JB=L8nG9 z?F(6okSLflBu{(&gZ&nqhauy{5iNUO2<;{t6`Y&58oo*2+@2#y2C2s!#JVT@J^B#5Dx&d`6FO6vC9bJ;yr%LyI}i1q3E6nC9_g zG{2Od<5LU4;uK~VnDt=;K=miZV^O4037q;(T-{k}4KCufO+?KoH`UCQ8|Qn|pv5qD z46b6x;S=30F>-VJ1Ap}Z7vCo>vDxlY=;b(fw|E~xO|PhZkOoc9YOB!(iU7gL8{A@! zODJq-5TP=qyiMxnfxhDYr<&uEn)?d)0R_LON^yoG8Nnmu z8DOzNHMf;075fgN{}^ZrAm+ogaB3QQLtqCsX>dgCy>Uz7?pj`DCDG5Pe)dwEE*m#6 z@u|B1zP!AU#Cq6vH((2~BKLIkrgo;?fd$4^pYF%oZVqb-_eSBicM=INF$QR4)0gwu zoaSZ85>oN~(Trc@Iic#IMXk7ZoS3kH-X?v<9 zoWJ+Or72WT2X4%&1y3o4Iswbevty@Z&9K~8h=~RYJqM2(=Jn|cdXK(>sm63a+T)cC&o2mkao^!(-HsjhVwC$iFSg3=Y_p~>RkiKr?*{HvGy%8~4z4;whR>fxx zfw?5suT6)O_#w&j<@rgi@$1=V9ygp_2`jY{o_`ws133oJrnx~z2H^o4LTKOWMIBeV zulIlL5ypsd6Tj?s>3_=z!x3)vju)gI&fZxD0K|COVj-wd(Wf@;DN0`8up=_pm|m!@ zt{y!me%WtLB_4-RxtiL*+QJ1m3$d2ecP~k_xMxCz1qB_Q$)uUb?Ds%tOJ{KG z?p*h~cO)gvaNYtvU!&?28j-UDo5SO0LXaV+91k}&4=*nSgZctu3z|r@QSCag3Wq!z zNfXVLilVyv3l4sD7hCEOlnG;f$e0JwrrY!T1@FKZ$uVMjLtu1x*fn`*{Mrxx`R`}z zsMnvFgvN=8=tFcRn5VrV;y-K5phFV~zD;Ty{mAH)XvgNGq7pSoLdK2#eiBI+z&d!N zuwjF$Py6Y-(>+0*Rz7R`xyF|9hdWchwsmk8sBX!jcWk!~olqD-@C{M`9 zzmu!Tr<+b$E27i$2fyvdp)w8(%G!MH7$1r`|G`XNCM9vKJ;GeLw1`v*<1X%C7X?pI zL+Pfa@JP(LY|niI-6yhc=5E4ALn=SM7JHALZ#UMriuFt#R-{a=O&t?M7#$T=NvSof z&zSCRHs<|T$*Qb(af7hN51-=RM?e5dCNU8aCB?2WsXcvNdu!$`1_nN3fB-STj|MPH z;2(U7ME1hhOi$r1f{VENKk~G5BMp$J=d%LTblAxtX!5W8y?gg|H%OEyF=TAUT)8c(yFuZ6|?x)UH+aIe;<&+N_Z42 zBvfP#U(^hN-5{*Pmy{HRq}M+2Z_FRZV#MDE5Byh#`To zRk5}cYkyX;P6&X2_y-dSzv$v}JUZl;ANE-tpzy-hFa{EWdSdG)9J=1;X6dMVGV zFy}ncDP1D7uDOqXCpORzYxsE9A}QH4aTpvN44vd`XvqJB9g{Er#Y%TLwCzY)Rh8A$ zbp6VUZZFkAk$1N(KmW&nIM5sZSv6)oICwgKxAQ(&+sfGM9}S8B5?-kMq+OVwFDfQx zXkY-YHcdJQ;jbil7&R@YKOVdfNMa?VV(jRE&OB_7@r5NHNir?Hy-%exrPPj!D@v)w z-MQQ%gBil09g{~lZW`L+x!jrO3xI?%na-{*NbG!gc6R3nWZR4Ro_Xq9u|-nfk=kj` zjHY#Qb)>v&O9t^J?}2pxcQ7Rdsv+z9xGw$6a$!Q}yJ)lQ!O^smgIip0QJ1%DaF|p> zDXRh=NzKjoU^UD1kG~Aw_g=UfwpvAvDjpA2+-e=GvJ8^(j<>(9-x;Wgf=YC6jNx?oaOK z=3a$&Aoy}j<14%77|_|YGhpmv%-*D-X&lg!dzvQcQkUBjL|5Ka5Xj>cG-)5-M|mw3 zDVFN%y4Tq=J8S3@efwc@&K2ljVPpYP^(!mis>G0I-X+SMop_KxXJH#L@a(t&xz``d zY$J{D;A?of5W(9MwJBT~T=!K-k6!I2(Z~Wy5D{~M(dO3rR6^Y<6*+mxpgVLCZ9@;p zL1KxbC>oX%=`IjLjKOl=1cL!5aXbzx7i@nA7>wNJRW^xzv9yg^g`k!#Ym)1KNfis0nndmfB25^MbVi6)aJ>(8US_>*B zqoQi?^3mAZoiR(PPU>tqdr)fn;{l|_;PYE4GFg6peyEGhZv0k#N^{2&4|5;$`-1P? zlmhHe>I=o2o13s|Byt-G!EPIHC!T2RFpQAyNNr#rTVnSjsc0ZkuQz39;+@KmPKuQ+g7p@v&Fmfq5884ug)A;W8wn`YgZ)^9g~AGI{N zFKzuYOU{1n&l0zY+b=TPCBWm(ZY(Xm&CGmQ3noz}CMGzn0JHAVBgz-|maTJY(>-j@ zUNQJSeagu4B#YYR`oy(a0t@rxfy69{sa#@aMb&gM@>}JPc?uf~ToaHDuK06}r2EfXQE|`Jt%s1=*_d`Tq zOQ7U8>zcGpsC~SKG^%&YL86l|!6E$5P;J4c@N4*JZ$3WP_ft_-Wtnvtdpq>wBh5FH z&0o~Iwq{V~2T^@b8-{t|E%^W151*21YiX_gZnQmL5i@=hET+#WMGtrMzUjG>(-YgyOz>kjP4j^DwKv-UA4EiUml}YHMj97qs)v z__1JMucKYPERhcj+yDErP+nb)BU|kB6-eY8nt=L;fR>W3i7eZSR?5 zs85F-(X$9{+t7~);swSy3@k<6X?49RHhOgFRl#XbuX7pj#?8eA(dbgBRSdmdnEf@x z#Ehb>QH9Q4l<%Zt=Sp?M#2m^}$Q`{wf!-^L%#j=a5fCi+s5+84S5AuiGxuV}#RB}y z&U!(QV_%~2(5L2GZiS`ltgEI_3q9An6ZcsRchLR~;bC26WxH;+#@IZNbp+t-D=yv)2fgApu44mY2;n0N7ALN5i;NtCe)f2~8$=6o z2>{jsKzYg||JjzXYMIcksZVb%7!!xeFQ3HdSJ;-6?)kCsV88L6RS3&5P*Dz2fNKua zB{&tXTfgv|{i0i-fsTo3JE}A!Iq~H^zCx2J1jxdK9jaToAO)=o_2z=~GIm~iVTZYJ zQZ_>)qh>L2*mR+q!=(OHU#O%%JMwNFs4B9(u?R@020(0+5x`l1+^2^gQkedUf1DH- z#6TeL;Njpf8&Rl-h6)gTBd_iQ2o*MPtc7S4oYG7iUJ5E(?#(*7v~ zRid#la>Hi85oSja%;tGCo|W$9IeQlgUoJ1p1J_45a2BA+X`=Nby`N8l|G4kX&8}ae z8|!tf_E>-hxyoLmql-R~5EV^Ew0-(CH!z@*uLWsV`Z_w5VhnBv6n(?Pb{d=l3`?$( z-Y2TT{B8Zz!VaJOc3K-m<|cV~2tMC8q~f~v?)N}{zoVn$qZY3#R!MG?rmLC3Z24z8 zNu-zIt46Q0<2~1iXQCgWO^{!hf6B9;AoL`iHXW`NoHRk)AiLoBAa1IDvfRcBQfRj? z-1SrOa}JeB?5*lBYSI-UhZGVlU-&`z-a1IVA{%4*dAW}j@zTl<*^o?l;W<>Fk5Z2c zwx2XOX8-qnMJDJ7CZT6Y_?p?;a=bK5aS()ak%C=>ql=5U^Y_<>KJsymvyOLxD)chq z>P)a9KOXh|{S8h|PMb-$pS)H+7fW)rplWa$Vk*`zO!u&gMZEuc!@jfbh<=`N;_%jk z_mKVzCm97rMMxbyzoMmvGd%!Wsu2~s-7RccK2KCLA^~oBc?@bpo$ku}yZgb)d__dO zD%H8@!S5|G>KJoaD?cAb6SA@fWj!|JK?~<&e&eBU#k4gf|5NR2;&|fSZx)xXJ@@lV zn`{O{fAO@Ms7JVz?)aqrPWSWc$?W~QHv|a3V<8}p0m~Q0kh_~2j~~A=CrOKm;XR86 z;(hB6h@AzdNn{Ur<^ufFCjGw4Ff;+5R)Nfp%*b!=Ow=J?MEuN}!YXVhfyH6TWoILf zP4(5mcrE}$J!Wncyori#`ko{&PD)Jdw1;?+P4U9G&GKPHnZ(O8Pw34|IOvaL%gvF| zs!_AC&E1~Gc&K;&Sr{HF6C1}fB;w`7;XlfC6g`6k0)hBDIpYPV*(`GEt1}VUHK7X$ zg_mL3A&m6`e`lXT&y13aYQ;#gE{1~tD)|e(bC;7C32gc4iWk1bnw6TW7F*-%#W^|g z>9<$5c5|Pk(Nb6BIj=5d66l!}UpRT9|A@H2NtrkaqCPnK`gQGLrX=0z-_iVh#Jjpz zEz&vZ9Z#O0UU++&ot4H)-q!KrCR|z$KRZJ+z+#yzrx?xX>WU5PQY9r99RFKtq}bdN zcenNo-{G=H^BZ5Qi$2);8mTUS{Gm>?ZVtXz1A3LbL)rU8Pb!RCNi=8XdZ(v_ z%{_XT2!sCn_R1fSH1VG~dV+YG^TRVs%beTDx_Gk0d+0vz|9*Jf=)Ab_ibs@nd<4EM zORH#l=@GiP`uZbism1mqXIjmz9hEzg0#s2dMsW?2);Yfu;9Uj9+1ogL0|EUBlnkyq zt|}@6kE7ar_9k*`X){)tt7>a?ZI$xS$Ny|?XkW*bo~5X!rdy8rKGJaM{<10aVWz~M zwLP2Shw(qZXOemKrh@Z66z$#V zDyxHMg!F{i>ILG*hHnnu!5?~2=ir+8Tz*Qtlai7JEJ8&(0$#_CoJU||Gc@#@>&7SC zSCakDt3K@gQZjg-UDT#oDX4mK^G{zi?U1o!B|E(G#L3kwzm+Bt>*|}Y8=}itv8wy> z1txOJV*h~RX_RzyzSbfCK;lCG3?}`A{{xS&eqwNa#Au(0Dslv8m>uAbGdIkSJokoH zb{=`$fc)(C#?l-BNqw2IWuuqeM@x{(Q%bGar%-<>C}40vWHD|95+Iy8i;`}?;`K`1 zvhTQDdjKlP2enNMA|B}Nf*=Y;uSZnX$xZz6lGL9eq?1^ewHHqP4AF?N7v0Yn;NTcE zC|N0l};E3z2&VqYni` z`XNxpNu~JGKa|f>he$)%F-}Nl?<|~^A#HC4YMh_YjY>X&)5_ShUtog-ugdZ3_O@?x zbHl=$Jsk@^|M2P>9qy3#SsmFK0KLXh8^53A6Yha;`J-#+?S$kC`0!_YaKulZdm6ZiM5rAIdu&v5giabNBY9<0jZ&m2TWdz%v;}~KT~GXw$K=5fUS(UF54?I=3X=j!X-W{ zTU#7~k!L$zEp#tGmezoW0L1bpj{S>^ZU3O&P-`ct>*>?R?8^+|V_2r{N&uP{gk4a( z7iA3`zzX`&<}XaY&_6q;2L8SR8vE8k1G9m*6V-Kg@l8l5+=b8HNZN<_yM)lrhR`Lh zU6F%eR|%9W|KgtdiS|1%$RMK@&h|x>>3ks{5I>(_&GLxQ0~+b{?_Zha#`O4lQuHcQ zY+LbXj|(T&T!LvuB|HM*ty&8*{R#O5JP??mKwk&w4gzvuIte!K{{IHSj`gMdcF@!r@LH0sn?0Q1l`5@_X;4SVfSnhFc{)H1&Yr1!+66UN^2NV}yG(~;&kne( zVg|`>5`$1=2B&7;2{u|jycbbx$nEO@#f_1nA%}GxfL6vLTK*E9LCY{l>(Qg4aqAh1 z8mSP&KnN#$B)fIZ(nIq@piqX@qGMLd1P&8L^U%R!0c-tdyiv+6VcF7(vY zr%?>pqJaqexO#CtH_ZR75?w9()i|fv|5g(k#w(}VTY9(vGDQ19|5g>>w{=5kx#N!j zp43S|*@<5KisdJUn3pV3an1bD&~szt=m3_7<4?{GayoiHamn+=jg8Aa+)zFlTY5>9 z4rRyRyIHwx=uX*nsh@v>2@|G@`C2#0$u0OOX;d##PMx8;gl?22mPg7EuX^X!9eYqv#w73W z#l+C>r7e>hNxh2iz^DM2383tu1x#f6x*i@jSg|o4d6ZkVv{zM8MrRNOl-AH*!+lCY zWBcO8LuKV%SU9R-VcB@Ly12l82KW&zb~2%_E32!}@kOUtX$#qm@q*Ld>3uMxL8G7K z0^mPivFaw~=hIVCB6tGd1$f@TlA1gM^(?F_FqwN^Yq(Z#!A~Q}cun6%Jcn#r=4vUzn4OuP21Z#M*xd@^ zqWrvb#nRQsvaYDm_~;ZQKDd{r&!2NXOSakmR=oyLHRUr1;O&||gro!zih_;}BqsJS zs-kUiT)rkn%D~!?Aym9Dx%iPSqqawf`I`B1Xy;YY=Nex zzrqM;!9%BnF$z@4g2@FN=b+%lXB>e}OxAB>Ozmd6mmy=D@)UygE!RN%pZeMIEC%lW zkrzW|B3`oS}m`&HjarjSSTroPFE4 zfo@kZDYZVee^<9JStPjsHB~-ta6LDfQmv_ICfzJ_nF@U@e%El$2zk|I`3a>EY{k z-B|}gs@N~k=XQ>?F*AaKTLZARH*{9W(ckO^-eNLr4_&#H#h=A5^*Vt88yl5e6@^zG zpGxx{i6%O8;JdLgrs+V7YF!@Vcld0l%k3}Y(vP#&Y&M7ZMf-lgU{miMakaL8I{Wne zqrkak+1=9TuQrV?|6=Y(+o3bUn2D5}T;cA(4`+D_^@#iVvW5z}6MMspgFm71f1C>u z+)MEre@@_#lRRnU3hc6W&MPCLYn&=8P>m)xTtO(kg#~pR%uh*VqZH#{&OrCR4z~4; zvoT_S!ahYs&4oA7tpWUEmJQKwZbo(xb)beNF`t4~TETxF#A-AbMN&ve><-5E_l|?&U}K;VFO*izeU^x%;rgz=v%{KWo&2H4kr%v6~D~a z*;7kd!uB91E32L^rtk$Yy7C{x!a(qbMC#n49X%^c1NK>VbzvdfyUf?GUjsgBq!7lN zw-iBTrzi}XfU+meH>}w1-c2Y&rl+Svwd45=jstMRZauZRnpRFNef6?=-~N}D>g=<| zLFner31in6jnFrL|%oBFYX1d`n!b1#KHnMD}epY>l&LpqUUNikKR?elXaaoID>ha?QP~N+B0arzzDnU zja*$u`}J}6YXSF&=>HFx`yK;PHx>ZBvq)%Vz2omWdcCfT^oPDR=t|cWP;UhOz(#6b z>)2qN<+;WXdgUX?LBUNXoHaHuNKQy_o4|v#-0U@FM~5^`1augKGXl+JY)&(C+Oun3 z9Wvqnk`(=o|5x)5$Eq(Jg8IGyy1@aMU~zX64YJD6ik&eL{N-(01^%XnTyp4-9h0gL~~ zio4IhLMVhmE&5tWF_LWT5U6j+g_hK&sPJ$bJ3BJjlCn?}1ehn%!10%!jvrM1Op(AM z6&=%xT_E{XImp%T;%s9vQ##j2=&|%oKk1wHa*VU;mBiw<%__Ta8j$S;YV7^|h?tnd zX7U?10Cx>*%)RA}`y>40cNiG%73-{U)z{StTt;ru#-d7V)IUh%0RyghH@@rv_!Srh5n7%#w3-ni_kw{xb`7mwN74wP#vv*f zJ20n2m3LY}NRMaXby7h%IpsF1@#gO2B;0aB0^Tp1uQnp*r%O#>hlq1H79TOU4%90J z@rJsJ3Or)BVV--WBo|*)-N2@9K5e>no(aiW0l6OV_R16ds4-C*-L}=boxca_iZB9Aw z^o`NLV-2?)>p5&jPIGjUUh*DY^pbuTb0x`EcZ`m|I=27xl(J0a> zf%4y7cow+9(6F+KQTbunAMeNloHyug3zXP15L0Kl@b&7Pz8g{$I%|j zV2@lRXx1McRB+YH0gm%AzOm5>-N-|H4ATp3jDJ=}+Fn)~|)2W=g^CKgNO#?Kpm zd7Yl%D}=GS5_v_VuZ3DSV>8TdyMiuUw&h_8s@gik0nPOhd|1uy*_=X8xiFoE>uH9y zcmN-Q$esd~sEds$5dNE~`2Sf2O+`7vf*S%u;XlWyX(CSWYaJwj@fsT+&-S3?yQv!9 zAp7uf$31p^kretG!>jnB@H$d1)NyfGC${-a1+L*xIbk@3FrO|%6)TTeL*oHe5}~ZZ zP9{Ou;|w!WEU{Y7EfTyH$B@_OOZ~GBi`cI3+v;NBd0o|Nfvk^#E?nyw~C0-WO9of4xUg9HN$tGThU>~Z7APoL7-s(=3y{R|3q zaO(pg4zj7>fdCi6E6^^K3~bN(LTEw4{ksq<0C^WFDICfN`)Mn{{06TOCG3-+xd)Mc z(5uy6eDt-7vUDW`?HsvFF_K^#hct8P4d6YPF-Y?1xAKw1#KbUxguex90TDH2TI33k zQM(LGzFykfbGsAe)Z2ag2!f~m1B!q;=Ia5KE<#V;uFgiqQ&4REO$joZo1fS8+gnj+ zVhd!vef#YNTlW*RR0Mw|Qj-)dk?Lc2Q+>!$6=V zu^lFs*Z&d`X}J0fFcT2rN|TZRC^Vd+^(u_#XJ-0W<i!uF#O^*K zIJ5x$2S}8++7@bTNVSLIAOXjHYpCP!lKkw|QD=TP`uug)&>%X4dfqf)a|`;?Nut#oQ0BuX&~3P$L8Lh1lr-K9N?i2oc#roiSpIzr&=LaKA9E#eLnc9P zR~8nPM=SJ&QAp@U>gysoUvhf-(MER(Z?OH-j6x#TzZ+%uxwtsT?tu2c#s1NgCsAGf zq6KkHo!w|N-#`SiGgB4x?b%-^M@MPcp@|ux3nLPk#IOg1#v%JcI>?)>N-hfsw47kkG!3Xz_cJv6~}pKqghUnQn{sx8q2 zLg0gQI&H_bWug&QFNGQF*28n~>6C5>>29PXB_srd`)BQa_POUi&-rjaEEnjEG3FTajb93V`(0gk@GJ|| zdJOyr8dbi@FnqXE`IA$=5ns*>guy*7 zvB9sA#D6OAi6wyo0o|?cb@8}G!IL-PK0X(%HZ@ zrPp*cwfUCL8uBDxzt)fECRf&LMvq8EkDRqVvr6LKrTpuc+*r5ZwlR>njO9Q&z|Ii; z$h7Gw`Iq~mv&U(@agFu7M6^j^^$HzIJx6Oj!$Mn;N@H)$-TM-tAchUgy2}z6-5i9G zq19g2YJczvik131M!8CDK3Q&%|6)tO3^pdh@Jr}V@VKu^ffhV7fc%SHrPUYbi1n)_ zR_5**^Qv;O*d@vjdY&c3%r`bR8_ikW{+G-y#{Siq8@9RN_5dIcSbH(OhhZQJ`?UF? zVdeFHUVVM?ww5W@8J3}A1>a2KBU6R(6F>tRhK1bE@X`}r<+#S$*hx$KB`3dn|6X|g z4%_Sf-@hNSv8{Vbx1+8FIIesQopc|b29!knLk%y~*k;u@c-jrKr>mo5r34npfC1JT z`WhY@3PV-@-Onwc1%Wx@hjn#j*kFHU3KOo z?K>naO9Aq5`Jjbaj07N0V89?I&gV`()PPuPPnb67SZRoX0vZmo#6=M#95eOK?CWX; zI%}`MMEEiVg|(w!qS^ZoARW+vZo)_ntzhoJ1NEl8x3wMW?nb*kZpMuA;0lmn1hc7u0cqIkgJ<74tDLRsha)Cm-tm zfx4W18Iop+HEaQpqQNi-DXOcTx-?K=nX$A$?F!_>Qv5MS>}_7CeRfX+KcpPZaUn!- z9X&Z?mm&5_Z-2-AXK!!slCa~1sz`^&Yn7xzsZ^<`pKoZyNm9uSsQ@AElPE4aI){0D zPGkAY{4cJF83%fqORbfu?d20r+&w>gU@V7)raW0jprB1qin7TOYb4S|u`P z_%yU;NiA>ZFD&L`sS$C%q147A!JwEJae9+}aUV!TE-O=zK$mhV0Mb*2kh^=MtmZ|| z-K|E<{sr1pkZn*Vp6veXB|n~p#=UZ)4OkXUBRWigwYr3M z&*4QHYWKIjt*tcm0p!iBdG;gms?aLOKB|1)!PUoAAEP&8P1fQ@vv))JfkOdWp#bq1 zB}PO}fW8z-j101=fym1@_!!L)_;GE(L5FPzr2X?!~0T=e$r0583M#oO)Kd3o@uTPC%~^^VKe<+Dq5Hln#X z0%+LIsk(`XC`qQF*63Lf^ zInptE@%NAqdPnWQ%P5QT5)> zNbPzWQW#$XYV4Vs$}^jo!=TK{XaU9J>CMehFfGWjeCH)iA+ue(y;$P%-W_7%WsCUu zcqkx`6-6|`^9Cx9+r_?|l?YaVr%xaC{MVa8Sv4Suu(hDSq+u_-Tm>K;;yR(t5pZYsUyY~m zw3Cw_XZ0WYTFXk?x(?Lpzh^>%9w@ zB=rw}o`!>Ry|zpdAT-Tfq}nG z_lM^}zVMk-VId)Dwx2ZV6fp)duh1QmR}}?Qb3S6W|2X z`nwEVZ@HVxZ%!dW-X~a3%L40UK2bY&G1C^Juv-1v*#SxYM;ycsj0wF&4Y28ICkV+PSnD)Qb*-G6SG%$r+=Mph;@Q`#W#nGux$er!Jl z1A@HCvwK87OxyjSY%Y2vEc}us9??GNM z$gIR;w~o(YEKq-1%w?|TTNrl z7o+LlDQ>FiLj!L`g%ef*8&MqJv~g2x&YkT@6S6Vl1FgkN=ZpA@&DM})mB%})0>`|`Kph& z8la^E*ZY;=bdz=R%P$Rneb?W$_ zD!kS3x0H!nmX^}6(<3iWxG^!&(Mx|e7m;W5`%YfR-|`~eft>`58-G+hFMmc(`_RAu zjvpyj9^)K@MN+cM!dvk^o}Gc7o^6EmX>>k`+AwsjI>S5#sfnr2P3t^0mBkWY0%ifK z>#?yV3m6?FP`reR#HQxo{~cG)($A-h)?$ue+z-t6#mH#TKGBUyr8ei0my2mP_-A;? z-=$5Yqa^Z?-^0Q|^4InJ9Vu^I{Tl|)s&gmQuX2it-P-F?2-rIJ5%v82OJRF1C`dNT zA2oO!jq7omLyAns6qVmgs>NWCSfylA5tv!nuXRsh)(RQ!K)`YV1cbd*?If_EJi%Uw z{eT;SM?vMq3qWi533d}7HUIrRn#i8}?B3Lek2m)K))&IE{_=h{x`gUk)CiF;YHmM= zGI5{Xs@8i@{W%y0j3EL1zM?N_a;bVV17IG~bNlcATO*5|I|^t6fpy!T7>fv@7ooGI z*9UR4$$kxkHr4#195srMm-hrHv1_g(y$l2;R7O-a3M{!(*i-82QjVS&e}otbNGtSw zROFI@rG!-^bk_@P$-n`#3tH8H6S5j}J)@#x6wp%W2ln5>-^VynboDZnQI~V#)F6Tf zly5VlhQtLB0Y?WY3ygRO)p+kTb z9~Czh%V*f0a=EYg!|VZUU;74R5KRxdQ275pKl$Di;HV;4w5o368Pk{wIWMON+S9Jwt|q)488b$K_@JMCJ-f(a4|X| zu)l!DP)J1HEcDZ?w7tz7i;;*s!r%_@Ag2L8u+Q*TKTDgMbUu&&K;4|ajQ{kBM*LdA z5QbFV3Nf}knT9W=>Vd|U-{Za~Ll`#H7t(AMLZ#{WIC0qp^b8vm0Har{hZyG1PafYB zQ7zSi`$py5aI-xqO6n@)go9+^m4mh zUVA-il{>?iroT4ihmoT)Fb*^bQV^13s-r_ea_Nn;NPnb~r?~+pB2XVxpe;j`~eizgGc#Wh$Adc3Ggkge|6Q%KH5J(Mt^ZW8 zuBoh)TK({W9hI)@X6b}%C%fOYe{|HI8G)bJvL-D+OYpm-kB^T->XJ=88y8>NXtGs2g;=Awso^5g!^Q90&7Y1h5B z6_R&2MzGP_$H>H_qovKx%h{bOTd6NDK07=6_g&)kMnriICo3c@4CnT3ZwhdPkda|x zMo%EXs)gKHTl+qNHj}bXqF+w~#e-;8e56V(Ryg0<*ARY9#36LJ43(nhWJ1FGR5{WO zm<oTkv#!!K}wTkN?n8rNSJ}7!k-ikkX%W@s8j@i+)Eo-}Oa}038 z-EzboRU=U&xn1=77gq^#vzyM}Ox+CBwwL$17gi{oStVOKRu%jfW zioDm78~c_e-UlNv2=hm6Vw|2r-Tk#;cNq1csN2cI=-JjDy{Fua%*-G9^tpik8bdV- zGnEz>NA!>DTU%;*k@tL9>k>*;Jpq5TXnkRPef3xFS0oZ>LR0H3)-7Qq4^If}0fFMM znTE2m_xBFwjE#+r2l>=QPwq%~^E{9f9w zvnJOJW&NJ>>t=n+oFh@Uj~u~^_w?19Sx~iR!iF_3r_Q+d@lb?R{3D^u?e?G_Cjc~& zv#Hqq1OvuUYl?yvGB~%ti0FY*P9iI=#|Yp%fY-RuCXC_30pz!&-5i*Jh=>*0O;yMp ziir8K7Pv}YAjn9xLu(b6k`fwF7!-873CzuHg^+V%OQrb`F^(K$>BQc54<0y-_fLai zgXXS&+Sv%64$+cDB*n(fL%SDsu=%h`>yhbG=)w!Ygm&7HlF66lYvEzP&aZ43HR$5?F7X z8MYiO;{mVR^dq6m3pt{`f8GbVTU%B2){~970f@}em;1T5*K~xKGRx1$$A^Xb@Bibb z%wi+(HNlb;cGD$%xtvP~w#adu#Y2KZl?5*Db6@Zx0?bSiSK9F^s&4?F0(Ra#$6MPRcI<56X4DLQ0mH;!U09X65Q zC%#Q_4>YwZg8n$TxZVAjtM(QhwNq#vTr;RO3te6QnzPfx%NrZelHy+!&Yde(R+fnv zIWsYF0?P&yo7Y`T&Tg&~#hQ}0zUIgE?2bIIb-U~T)6ReR4m*A9EGW-fBcyb{Ix^jy zV}H9ObkN%EX=`g|Edaa>2#&Z*Atrb0jmv^Aw0PMiuo@4#KZ{0(I5) zhrz)ZCcPikWu898Wc}gnvZLWoxCP$-i~|TH1K%>R^jnGHAntCvB@-GF68&5T*Y=&P zzpRvjf#t~JBzu+N&#gj>el+nHX1|(7KaxF}onvg~{Oum7xxKM{`gULv@~a6?dnU9#ptWy*Xy4aCFy93{1X8ktFr9;UZ^??0aqIlCfB@h& zbiBN3Q?EcB5TyY?WJF;^eh`vY8r+~7p{lK11z~#LW6}bi7=P!AP5Cl$x@6G3KClan zJ)#t%gnBpNB;_v3kmFC|Tg4;!`1uRAwz8eD0)8#EASgqvDnCGowaH@=#3ro2)7{*1 z-V;zWpxh-Rd-|p>R5xPH<3BU6Z+(D%AcbiQ^>g$ZpH@a}AYz92zRZB$11NYf&}VR5 z)2;e9!|on^TIDOmx+%!XiJ9TiAE}BP>T{KJe>2jyEm!*-%bT%(aM1cRnk3TD$D^C; z^GWA}!62Ypg13DG|LqNpawDO8vn8S+x*+-sBCy4YmJvO5hhE1-{mH_JM4eSQn&QMI{aZBLosU z6Nr)TX1Hwvh$!shBYM#0_p`xn{-ef=;zQ>}=}{(k;h?G@KR-4p*R6m`&=nUGj0Rx@ zH1Ye6j)6He=UM;6=*v8)@3DOa+q_~_8O|q|y+gQK0XU?=D=ELNiDZIi@7JtMcCRp7 z8Mq1_(bM7{p=%qo6k8G5bT`55#jVl@Oi}I1<8U7mZA0S*VL`#st z3wn{~^puy@e5+7HawI5++xnx?`IJJsIe0zS#6);>mUuAkM+NE&EazWyJi#@|1nZ>9 zn$v{)JACPG@7|H7`KTBf8_!!d4%>ZB%}PfzLg0)LV#Iq~T(dV-_G!^o5T}PP8j4=> z$1U0&l!5_|yFpDV-|TICm-j9~@TDP@ z5=BK?n&9g3Y1syn*gq#4M6==vgs^XJ$nK2+aIXRa z=7ks^J_KRx>k?!DOJrrc0rtxor43XR(-{XDPL9J)<8K0+n$psr`Z?xGwibWA1{BAg zE1`;;d!SM%sW|EJyF;S}U3f~U|7Fys1Cj~SOIVJrT%2A*a6IfOG2`5y zoa$X;%MqN%;iUTd`niLJC8G{6$$sR_eGkAU%T+0W6gO9q-db};7Cm~UW5`9D=&Hv> z(QlCa=h*KK&tl8BYb*d&TO1RluL$qOZ@bh|Yqz2xDk!CM5uZL-bN$-w^L9gZi+06{ zdaY}}#-EF45F~W-PM;PxC7LyPrBwpl>bWE4kvDH7S`Bs-Q);2f!^;!`0>4ELKE9hi7 z==svqw&FX0O^fi{+a7$KJ3W>%*YCd>T=Ow&FPI>{kO8-|2-dX)@hb$ zn0T#ge%&+@$0J@C*BZFM_SaP!5p5GHWZc)pwX@#Ax-#Q&6NB$0^lf=|#WU&l5W^cm zcm-@ToWL#)qP6uMz9X^On{b$kM`&4(Cg|0C6`~HqOO1L6cBC|d0Nig|TO1nV0B{u6 zREp=Dp-565X;X>u+pAy;N?_2?0sx*= zNaDV2lk$s+oQ~*jfZTqT=1gT51tB5CVm)}o%*`D`r~^_g(FYafgSQiIOI?ii#V7sT zI^Q(DNSpbqZhe5J~7zbfbP9-Evm zf*;@M)|)psNue0qiOA9gT+uNkzF#!n^hVhS9T+X;0VrbSwGp)tqD8q7WjE$jiXXfUnQPODH%4o8dlW!PO#qyV}< z(&Y^y2c-l%qJKFkNY}IdE5wrQ?V98lj%6jhcaA)82 z3g+wPerCzP?QwCnEfKe393ER<_$wUo8)pBj%Ur9W3^T#na- zJ1=x=cGQ#L$K(YXK6zbrv+NyGxs!LBHleqjbPv z)kMsKzLFE-upZl+EcAAWtxk6fR`dzfy|Gw^ z{gtRCQ*CwulbbKg7bIc5!h2}`yR$W)KqXLWyDU*`4|}zg!dY4_Jq#W0kjg0jLTJTm zYoGiH`lnTvixjU!vC1!##czHTuDh;Sd|odMQnPx`0w1#BJ2%l=qW44yVUr*8TuKr+ zpRKE}{XZ^9Wq+BHU!-AvZ>}YIpRT18fb(QS?l+rj?9EH%F*jS)jfI+B*;+M?jb#Oy za7PvzQ`t=7!aXeRgIf2`bd%#StfZlVo?0@Am^385NgkvlWkbk8s8U58@y{$mxq2i0 zUq^c)?c<6gP??iGO zGx4o|*2)!pm#>>W8h<{@o=p)gkdFy1&Lg4oj{zZmq|V?d?=9=E0MKneDVo)t)kyqJ z(Elqa(Bnf-15{*nX-Sxw{R}2%Q38u5&^td|2hxPec$i}?U|Bpu4TX;c^IhST>_sUY z`XA!sCm}Z5HyV5hwqKyN<|~0u>^m2i{Zl(<=kTDQ$U#kd&P4jV^cb}a&JJKlx~vC~ zON0PH>zKm?THZ)(0vKZjr~-g5fP9FI&`l`O zGPaMCSI7<8+?7ifrNwL%=H-oZYk^o6aBm*GLalDI9-Tnm!94qZfWd1y6_LxM-`_`8 z1q;8LFObk7Q|X40DDobB4yFAMzmZ&(==ukH)%a7Y{nCx4BI@W^7`RBlJG&i<@}(4K z3LOK6hc=uP=Vd&$qSd1CW@-!=;;s#w=OjNr89-QQiz}=gQ&Qzk%Da~pRATl`@W5nL zD*8;pk?hEJ<>e>k_ME0KW#24Rw6vR8r|y)(X5sPVFIjZ35-0vK84zy%U#iB*<)QyLSjQN?#$)-z4Iy7&;4DtWC7}VSZnMd3-MRS+DR;Q=4@{L_`a! zQAtrjfj;^~#E!Pw4fl(66DX03*j7UssA0O0;rNZ>dr#W}HS6^I1bni9F+5iGq&T*+ zvQ0i2$Yn8IiRPj{;A^HNdLp1IrMl&hF` zl$6^d^qmA3FJ#E*yV)R*Vy`2J@K1VF)DIV4qM9SR-W8&3e8C_YMVqE6QMCq?Ml}xe(+*zSX&v|f>^K|Mx3MsUG2y7Yik;_Gd z>HxowVNR9q3X_J7V}Q4q8Oj^0cwcHg@(yCiH|`u-R3jLCatNas8`Ak;O6Bn!ODe)w%I1)Y z%Ty)w`CW2FmpE2Q)EvT@ihz*>E(h{&Gt2;)^jkaY4dy_kp!EBzC_6hr%7?i0bae9T z;b;oT_R5@(%*jyLkWu|vRyDnG=>A~Qts{PY4}go&it0cDXS=C`Afi%FcJ>-XjKxji zVSn|VSJ&Wv6ekMPmRVvOY#*`{yH~{1%0JV*lwqhb4H5URwJY|!);9&m(2lH$)I!qF z_-ji%2wrxs92^`p<=YIn7JBoXPN*-g5#0GCN*=6W#C>?bRnBlLN0PvX7w6C+y^4S2 zw!V@H>Fwl%oOZYhuF>L}^0z~sWywtDn_s?+i8M}_ACOHoY`^Q}K9%sKNkov%T9)gO z$|Jw1h}#*Or8->fgPdx!x%4bo?P1MkLgdbJ{-vPcoqm5S5~dSN#w`8-_~;6{CAxOA zd%1YbHIj~A*vlq#BJ9;{b5mV;3<~|{32sSYdMjDoS`(H1HkL|BMGWK z32ty7EGch5#A9h(`7~NZ4dFk7f{?ofxn<-TEF$!dFryLB^ zKhJJPWGmZyG+7%GOVNH!HlqG?L1qatx3re-llJmpuraUfP-PG0*U)RVMsXBG*%22u zcBgZeA1k1?EJKSbDCMwr#+{{H70SE=5U|b8R{rZU0~Cy$mR$Kn2?GO~O*VT&DjLU1 zQ?kwo*vVsww_I^%=jPrpPeoSoyyXwjU1sw&B6#F4Xu4KI2Y&1aKf8cot(-sU>7i|1 z|GsD0j)o zu2I^u&@#U(vTYc@(^y-Z@YHfpTcm%Q7v1Y#IiDNDZzj@mW$Zc{9==v#llYbo^BC(+ z>9I1wHQ%+l6#2Ol<}JWk(Y3p$e@YzQ-R@zLPT$SgCb=0^UmjbUO|(#&p{JsTgTws* zi{!OqFQ*jwUQ2ezXZ4cYvVuGZlaK1VAA5>-lZ^M)vs;D~Qc^#luUQfB3n#4TfD|_V zlGcc-Vi+%$+)p8k?RfP_g+1yqW?0uW(s@~0FaZu$#q0*iFb7f7iPIU>Hc0q02hT_T znAFie;~8uk+V#?)oyE`Tty*?TZ0Mo}m+Ir*tQqurC>yAMrH;dJcn1lK!? zPwE*}C%jwa{DZ_lEJs?Au)*mlgt=_`BE`#v57cG%zlxyhSq?(`#mW7VF1ou#bwtOJ z`PYZe@Q)vP{E291H^!CLmAc;in4>m!;_Ob2s>(9`dZ;OSJ6BUlNi5M?Q={X#cQn%Z z@iE1%pT1A}6$5sH2!t}rt3~=|W9Urr0+K)aT&5GB9OvFD4;o@H-jr3AdC$GvE4WsaZ}udsXohiq^8J7s%PLkgV}X?()>3ZFHn zmbWMMO1io>F>KzMcF}$?OyKT6y2_>`&?1+kXJ5gV~T z*#@XrXb^8C(l@K0qb61*4<0b2yC`SyM%tRMY?au09TL zOI%c~KQTdqvTIAd4>9kj2wFjvJ+F*sTEW+nzFl`0Jmgoir}x5#x@f0bTc!Xi5MlAS zz(WdI(cMI%_FEnlQ$7#=s!h5ZVbXUXu1wS}HYWlNaIpM|O!Gceseqk29M;H1B#xAF z8+uqe&@H<)vm4)&)pc}4MxvF7q?MZxOu7dDI^9^vRaM8phcD|&5uC-?d)?ZTPzR&n zqICecB_Y+OLYAACH|)1BJV(c3pMzIsC*e<)bn`shv|!J50;ge9He+yBD7njBvXxZ; zI=$<)m5HQpvyAP+t3?KUh2Q87m1P9Y`2D-!PAY`Ajy`SRHzw14RrYq6dGT=T{>91P3{PRQ#*pQJnO%r?T=N7a z7JL9P@#Koi#?Rlir~RV*_2*J|&_`)=o^r=-Y_}p~$dTR)DeIW%)V7^t#0-C9(e*t3G_W^wU-XT@@6T`DJen?K8NyS~ z_Wz!Q3sQQVY?`KDUx;4&O%^%{q)E)c?I^hkF)wme87*|NbLEf81ZqI-;OOjpq}zMx zX-QqU(X9HUk?FK&caQQI@BN|AxD~8#fvShC3Y2Pqyd7-Us5!GkXu;(P9QqLJ5;eIE z9+Ai4Qh%0zMkm3R)9o2p+2!Ol=8HpRnl8s}u9lw<7P5*8y*r40yjb^5_o&Q4(BpFU zj#UIJAD4Ln9aM6g2n5vNYbx6 zBzjft`?$$4YC_UKcA*6HKl|7?l6{KoSYMFc;s{cvJcYz^(A~ipp5%370J4CpYZXt( zSR1{9Bng-Sv&&T^lhs+lMho3=?iW!HUw^_Q&2=)q{T=hohz?o4M90mp{< zi}@O;biz>g?7j*VHW!6JQA$?Ev%Ec@Jtw;=yZYg`Euq@h@*`KUd(;Y-LAz>SE8*nfbBOZ)B*`@kL9aC9UOq{EfER%sMYkg38oVRPs91mNugi4T zIbRw(lRvhbtffK^^}nn4+7{tK=G#Tt1Z8o$?-@Z4*lKSX(Qu?r7=Osmpb-f)2zfat zJ$9IaC{6waM9|<-)4E%a{ zIzRZQu`j+X6qFtE(e#m&Vmh#CoVEnrMd??;;|8^rrBvv|ZH0nzp8n5apLik-9`NM@ z$)IJWf_b0g6KtGhmhVO$8CGp6pUax=OIJQFic!r|vJtEi^-$+}b6|67d`0BO=eZr3 zOsdZEhAg?}KI@b#t!HPK)-cg#W!K7#qYr-=Tp+h$2!aidhvv{dZo!lPh6Gl5~bmMW0H zk6XV!K0K7*#tA9>D*A&DT9I#tD(Mgs*!EKi9v>a`egDoQQgRo~laPRbz)SW^=bLBQ zQ|KPZGpgvky~`m@nm4a z5CwkmI1G<}M~BUcX5*gh%IbJj2G*Ma4I);YR@q>7l-tCum$lMH?LqX88EK);G?$RX zyy&|N?1c&PTvs##TN}BebqIXPJebdvLw0258_d=Z9 z>j@h%OC`}2Z8hl^T}D^4i^*9|so2vo)m-ZxStU`>^vv~uPm2>nH)7fn#(`ZJ>29xZ zD1C?KXK;pLLd>Wl!t(cN9YcK1OGvl2Y)ANvk0Hmv@VG4Cvx1A-v(JvX*3r9szUiz_ zo;}lUa_9eJXkg&9JM$9E3ol>3U2gNs$e{W>4EcZ&1cnbsI^j#}@EOwCKnSZVu!BYh z9RQAtG&9K{a?h- zPPd8{_&u%KQrHavv>3PS-tfUC)qSR{JggO>m*F}{VyIHD8&`cR zmy*>3nxvkD551FhIf{+HPMJ%fEg<& zG?30??SpLcB%>WnHoA?j(!9c*tBbkaOn_J%>oA@g>`g`{H`04>8eH0lBv$@buTcM( zel)(?@>4UU=8ScI?~$NmPn7YQ;b$K5pI6f~16rBDxj>7H&>sw?(!ax>WO1=W3_i3Q zacfE;1S}!e=nq8;>=R0CJ#U{L%);qXr-3&b-&A$n=ez9C&7+mQcC4SHEC+OVxa4lpW%7$9!?X0rVPC=brIa z(*rIH$*pYkM+z<{57JG?qVZmIT)moYgeiP1faz6PY9?#$;w`JU!8lcwl}esmNm?jm zpIrFfdbrKT-@F7>PNx$`^+ajluCKvBW6;qme%*J9>OV4g0WVDL@974?>%f_r1jC+5r4!qk*p0iP7F;B+o?+ME>c zQF_F}6tfE`SOxHB%f{eSPgcm~1C>pIGxa_i5mHFy6i(#?=|sDlcfSk4a`G)@mV*>5 zIoi6Z04ZMnk0q<~7_v#p$svuGvNvy`jed#f*OE0eF_wxBK;WW&^`nTO4F!{~s-%;- z7e*qFmzyOw4BTLq1%+_UIlxsdq>53OextW6u_9JEU?{X^&+@L|d$)3DT3ZCDDodIOYuxN^kVJ1*`TCr%q+(+*rUWOaYT|4hhEU>Zx<#6k#iF+%6NSSBsu- zRDw7YcXxNtK)HO@hASjrDTY*4*(8Y}AK64{{(#$^#B#KEDRk>PpBz38<%*XSCf%{Xj z#Kd6Q-o?n@Q%LhaKL@N7WcWUIaelt4FV(7@h3~&nQ3zo02n43(zKHu-T1N+t<+Oh% zeE@sNLz|MjMuJHoXaK=>RYI;w{WpuqjTqQT>x0rTP*vSWJAD^G4Tx#1o(UghfVh14 z-Y+bO(9!w*g*PxH5O(Z(ZbtXH7jJ~Oyv>sSZsvh8S@HREwf^D?%uYvl$9Q{t81;!fI^&4*0)D_;THm9mr95JT&%n#5MVxY?+=MorK?VisRT;)5zSWE-_uyuI(0cDe)HpOEf() zEkAm9BCxB&oCFpOYbAMa0~%h=6cy*^V|Bg#49cE<(K%_6emUS{K}AKio+_n==<2^` z?%4n1mjF{}b$r7@ZOgbR#MZ-)k%I>?wGMNQ}+f^AYBTRTWGwVcL*ZDz(t@^0=fHofjF~?`&bqx zg103Zy*J3yUVZT&(H8`Z0|aUN`ckcMB`Wmm>j=%ljtw0h9YKHpV+A3T8U$<@#H6O) z_iO;P=|$yM>3#Fk@egGN#DAz!e$7;|2ogH~LY?}xSf58B;Uv}JInC~t&Kt!M`jkk% zU0o{j2MvZ8Rd$M52BH8XK98fL>Lgy0RA7ibUeqH~tRL>pW;INdD%{EO)A+!i$zbr0qT|coW;}uwzjpfTXG|CWLSYro+j0-p)U7`i zra&W#E;L{FMKhf5j|JdzJ@KW&1LEB~4O@`+?*YnQfd~XA}-LgeL zSHaB3%N$!ylFj3BeloJM2c7u1^UTzDV-suM$>b`IdOSF%rfua;$vPa8rvc$r_$Psw zfEr9tOd6Ek-Et?hxzq9${4z$HY|nJ!4o0p)n*N2p%vtp|v&EQAA#NW?ppGH->FUbk ziCeQ2gM?Dkz2c($d_Ex|?*3mLv(b6-FR0Z#wRClVr5~lIqQYLP){eCrJire|8?NVaZs)HU^gDiJEZ&o zx&6-t+|xK6wnm&r-e)4xYt#))xqo>V(!QIBUZKgPv$zPQ#l{lbwTkK@@rD@+q>_Am z&4%{0TUqVb$ui{^bFd7d`oOYm-}KDs)vM&6-P;dJB6q=Xczpc!HNUVhs~|p?kdQkd z_kw~fg38=kjGbh`=^uazc>DYXphgRn&5wxnS|7)bMC1JyO2l&7C_{Ahnxa99k&vXis;Y5%+}1@O4Fqd%o9LGYsg}AQ zqa;DO1dtg>7;}5_@=F+9@cUoS2zrV0A2>BHdfM80*?3FZObQCMtR^aS>BltI;Nswb zk$36)m%_rWy}hvR72X9APEI>nWKphi2SdY8nVE?6Lz9yXf(Mvh)BCJoeQ5OzcCeAP z(u~;xqW#CLvT7s~t_@sz7#gJl7e-U+9X+N5w@!T~x94Z4=fj%-FJg{alGvx&SPK-tjl2xK0oqjXf!as`7M zWDk5JBoMB>F$&1gu8#66n->9eJFY%g3(qJWIO(*3|prNzCWk)nqAjU#LVcz0G@ZqyrJ zxF#G+;A~mp?B=d7-VdFh@TZD<{=$`}7b1dyxo`nChOxDggQLB%z7;n7WMg1~&BaZ{ zL3Q(kkPy4%3w9}ECv!t%$!D5R*E=8fsW`d+^|C6)4mNM?4UHY( zyro?nWnVbzI~v2!vM)HO_&ERd7}*z`RD2x&{465EE&~S!4^ZXQy?F$j7n~;i0uSN5 z`3(R0g$q=a|N2>#gNpM%PgSzFF??a{_=;UgN`_t4*u{}u-b&xpSW=r^L(#y(*zo3c zWvt*C|9)9{`1uj%%?sT`EwHQD+#DPg2m1?0`?rRU|2h)~Do!4_LgrTg>ly!Z#gyQE z{;vymb9HX6_A5>h)vGM4bJQpSchM#k(4#@42eW>j1d zX)hx3?>h)XE~rR-)_PV3@BN)2&xAY)B&}d)6*1+EvXu#|P}+zOBDB(F^phj>4brq< zYIPSA=hvjm%}eIH#PmYO1`>r$2m0MpSv|F9OTU=%S}r_fwYT4SU| zQIvJD?GU@3Wfs-r>d*Ke(taJQ{kP|KOPKeUh7kL{`-@D?^^>a$JGRDF>uzUN#7x~S>XyrzIQ?WzcOLpo7MS%4yW?)(e|k_=Q{(Q* za;ASUxqeEKX4OeOrG_{BC+0ilnKC+B!u!r|TLiBKOJ9qkQ`xGina$$R*7+t6zFxFH zc*<*3!85;Y*wgjN=)jC6%ZpiGVQe_apV)@}dP=J^-F z$dnS3W!z!k+gf)vE?+rxZqL{MZL`~Kdx|F=RmD`2x$e@3&Sk!x+n=e1=WR^a#vf>c zR^%2(s4c1WI_K?FkP#Z1nvb1MnQ+tegP%@Dbr=F42xmX!4aMvm;}cpAu$VbzP0?6J zs*?t63o?f6;GESI79Ajpu)V>FRT%4(VhQu}F=vh`sz-RfxFr86ta*K~WlupLSFJcF zn3?^>LC*)tuT0oPDLpKxRhrzG9Ns_l`({cvAwRA8OV$(|E%Ass+m)f}G?^0Wu3-k>WeA$)rRyXGOIO9ZF?B`hv zpEW3XDEV1z$Vmu~%DAItVo>m(+;Q~zv3}o%R7L8sUKk_;c4B@_`h@Uj>MH^9*Z$At zOVWm|ENQW5cxHGQNRl+grymv(Cf=0ac^N*njaM?ro{@JU8GDkO?$ndOfd7nsd8Y78 zWI&o4QxBhNuW`U%4F6{loA*3dWZCu(zqF_|%BjH65CWQni?yf)}h_2w=Tz-|4R9$KJ884&;B2U4J4$GWtQ%q^8X!+8~&tIn|!}K zIcT?--}b!ug<9TXmVQ?L@*`fZf}S@MZ_#&dz5O^sUlm;+LCEyIGUTDZc0y$_tlY?!yyxfy6r_wzX4b?kr)yGYWx0P7&<#-=;yIW6Qfuju-%X$9{Z@O6 z_Z67Nivr|%WYP$oCTYc$>4Nc|Lt(nM4}Jc_g8Si2;@4HV>-WE|`S>d<6W}@p;3b@vkY7LQI z{n8d-@os+4?udhZeP3GT(7=;6`$gk#p5Tf!qx7|g^jCYapH;s3tmgaNNmHcM+JE&f z~USSVK$Yl!=1u0iG5_-Pg5hPc03eHx}WKOe{de3-s5jDL>aVj z&?qiT>3Wbi`^7jO#VY6R!H_q$j|U|TTl zx#Z)KC+iXzk=h>@6l{aVtNV|VUw@m^U*WrVQP(iOK)3vmu;-47m3%=Irnv@JUusJy zfqcXRV$ws_?nnE=W$9Zh+XR2z8YZ!1lk(OSb9pSeQM%pQ@e!P5b%utZ!iv#vz>lNa zub5zXj&&~3zO?i`)_bkx+;yQRWZ~p$x8L5KD{o|+-Jr!+pdVH|oIf-&3opLkG?j0T z8hh$gCiXNjny1fzYmmX!V*c&U6h;cwj=}dDHU9jpvlsDwmO_n zJ{#BAc2yjH%@;ta&x)q`GTZg2C1GScS(s(($(Q@(B@E84Ds!I?DP8-&5k=jf{q%?6 zVm-;8p3IjpEblG9))TMPG{K=iRT&3rPW()7#v5e#-!ACk^zzpYp%om~Q`_Rpy0kn# z#Ih$k;@FFBh`bD}VVh_ni*A28>yZ7?=jBWKO1s|*b=R0L7HD7SG*8>}k;xe_y!n~I z`)qAWHNY|d*^5`ASE_XKh7kipRre_LUnBJ~~YU_9}146kL`#Ha1^XN!Np zIBm~-xSo`Y>)_H#EA&bo!EdPD$B~a;C%jnZfW?qdHEASlF3qWTA>pH)AFA{atHhg} z;@pl1vnd|b--N|%W1=|IFr4@a)3;qa~)hWA_AU8L0xU(2HH3uHl~ZDlvR zb?eK*+Gbq4K7%b6*C1cokFT?(_D-_Kb0l(V!-^Wc(+kzl{B=&TFcit!C5g_pj5cUS z4Py`f6k83ss2S;LVgdWX@FNCMWJE3`A!VkIku6-q2ll3Lv`TH2fMgLQh{Qz>k|ZNJgCxmOP+p;X?{m)m_kZs_Z}ieB`NIqO!{rdXAtnyh^{{fk^gj(X)PFmo8n*71HkR&||8Pd65t4|9E)T(R z7Q{nGCpSri44Wlzacw2R|CfiMY%ITuxId6#Q@A|AVyL0Ta?{z>mgNS&D4(^Uuo&=A z`2}xCh>42xvIq$Xib4g%p@M>Zg2IwQB9bCPm)u{M8=EXXi?pkaoutk!r9W;4_GH-X z-Q8Uzp-_-#%kL%3@9cUHDhNLMLj{DOLPC6?1fQF?le;B?&&iGbvWnkz+_H7Ec6D%Z zcW`!MxvbOD%GtwRhK&uJXZf=y4_*GM+{umqSFiZ3ogYFGmM&01egWt|7q+qftE`KM ztK+X`*jPht9c>?8y49e(;J=gygQlVJ*Cl^j{lkaHxv6i%Rc713G9*U)li=%_J<)t)1J)La+ zkd?p2^Uua;Xh^C!xw%_9S=*}Il3@d#;dgMbk+iWBw6qft7w5YnVJXUIcSFRM&r-rp zoX=WFOv2XITHIPhNaCNWxaDl^aVb=PR$=q+SE1?ZaL>WX(((VOs=vA?dDGd^*;NC) zu*k3p|7z%^R7irGfL8t*6d5+be;hZw6i`Qx%fXUi6BD|m{)Gx&{{BZ1qyKf0f0VfE z`_h8^VMBCnAN}6@ZBiT^ew|`r`K76nme#*}XniT*wl=?-2d?~m z(&7I^4F0Oc%ib0Y;s0C*{wnO|Z0GI;-o_Q~fv57nP&Mcuy@Xzx#y`6$4gD_zA^oes zKiN`n-S1<-M$6)ZEB>4vWbyxQ-no2h|IfSwp2lzK_+tkB&%E>J6#Sog=Wk}U|I9mo zcrpK(cYe9U|Cx83o&LRfNBD9X`Hy)A=HTw8W$Sv=`Js!m6POuU#G$|3nP2|H9}Dxh zT`j$#e=N`5x~cca;;gc*!##Vjv@IbHRr$4e4%M**Yqt)bw!bO>eulfNgY}G~!>cQfM}4 zm)pf8+D$ZoGw{a-2#heUU;>2bE0|c9RL7Vg!{Lt&2YeXC!NS7_8y?~B4WJPI+AgNi zFwvkFjc5e8Xzl18=xAhU7p-W6Xz1u@XjoXk?(_Q>9y+KU3mXR)pMVscyWHS6fB!{8 z`|}(gJ{dU$B^5PFA~!_E#3dvZU^j0mD&1CAQPtMb1z`sU zhDOGgR@OGQcK7TZ?mu#MbNBG{LUe~9w?%w{v;nDHQ z>Gz8XG~CNp%b_&{{@G~o_oDw_cL)A;cko|#hyHbU_+NKN{&jcsUw6O!>+b*G?mPZB zZs4zPF8_u)>fD9_#k~AL0=~&Sy!@2(-zl*hi}0m3dpvXk|6MB4pIZFSA6foAJr)!J z-=_XalYf2Bf&Qt<8kTMkSbmuooqtoUm7i`V;^|U2&~=2vmXu0{sm2v3uk&gfM30NJ zcZl0omosHltXDDJg*|rVx>vC&`O#uK>+V zty?s_0m^9HuW})?*HMI@O`ugQ#lCwdDn_O1cSu9Hn)bpmGca^pcuk>N)cih`KeqHf zP~t1T6r@Ar4kUe-4>`eKU_)tfy@?(`(?SmcA1i!bb`=M6$%NnItokl9qrpQxGo%Fk_w_5Wa4rTBZWb zBnfu_;2!2hw+>fO_-$y-W5to~)ZFRO3A^d9&tJa$00MHj74Q0()EXB>19}ZSym{Jy zg_EZM{!uLt+`M+_Z~-KH&&>r!TY<=`GAmjh?)a`thV+{*?(XMD?`Hw^1!bEFV`cP@ zjWGZ>3t~3__BDO6SkIcoTu_u4UGE0z=S$$;#~u&9EHAH=E)+L>vvLCvi^6gs*eLx@ zx@0dg0Hv<<9)rs@TC?^69xH8seyqi-iDfsv6ygO0YgOvJbKitXn5n~O`|zV&ib zcDa(ghlgQ(i5y*x8hoKcIOoX#_@kNur-k}{?+OnfQW`JAYSX=t4Yh*#Hs?epx|D#B zE(sYNz@7Cxv1%wOFaDo)y^jLvyt&uNOi1(yLv;De{{T4!dMtP}u#xWIKmJTs%DI$mjM(;Y}K%m{IEu;;3M zXoX*Bt$lGGlMWEBO9iw)l$Tq3@M@;sc_3PHq}`gV=o08;bEglTk!)oX;8j_*MPxiw zFkIyNNprXe0MN(KxG*w^TZ_&-&(xJL0~;NPhYpeu)FwYj2vQ73pM=$k`%_-!*%JA;mZvIUIRC4l9&hI-hk$)tv4W1B7W1@MviG zYV8$B=W>LDP(=ntM!+JMm6fHv+3zloCEmu5$8)fmR9+r{OS?u3luB_j(6bFNPgF4L zioMN0I6l5jCPgQHF73KUbpkXGD=eJzv)mtOwThAIIY>TiWd zCVY0hR2u7`DBk)-&c(&%*#WEvccv5oj1aL3?c7dB!9m*4`Lnsk4|kBPCrwgz0yIB4 zZejmiH6I~(VDQRB*6+I>pzysi#AH{!inULM#An0Wrh$Ld4EfZ^oMsL!i7@3C^XLZ2 z8g|3o{i}s-U(`Tg(=9dt@dAMM@o{m1ah#)7N0Q+WMv9-lgvrFT%1U;%en;=n#SE zEr6OU>`w`T;31H_p*4^_0}##IB2wYJei7!QgIG^P<-r}Lk&jJ4q+yI8v#c)-Ev==@ zGgJPrKd0RUP=p&06DVK?7^CPtiA_nF1Zl!9f$0EK>)ofd&_2=-`r&m#pthr82 zgVwbiueWRs;$Uao<%| zegdouNJ(jE2!O#b3IWJGm$>*?XD6Ne~ah zKz*nCNPS}@$l=kq%N4nX69rSSw0s0IN#EV#yr2*8?_I0wN~*FmGPuMV1jOE> z>AqN5vb9wO42o&IGD+g^w{v3jHE!#g4D@Ff{VF33 z9Stpg@?f{g>T>VWwhMvK?j-XfkaCSWdM2^eFr}I^oSk?dlGjt-Cp?5hnFFGtl{5DC z`UUha-#)l;Lsc;zq)+BnH z1Ra#UvIw=}1DMr$wl*5$wyMzT_N|oG9w@^JtHPEAtipG z{^iSQ)!EjMj^x^7lM1h7nJJ%li_@}IMHh3x16 zN-vOh2dFjy=&6tN>$VmU63U+#nR3a}bh4AVKfAYIsZqTBXy|^0EWmUCNU15Fxo+Ka zA@?hc6T922+{P%)Fin|u*yMT8;Wns_`uYdOqIn#G{V{%RQc~2{VLkaWfW(X-MNo z(Xq(RAmZGsDiunFrn*gVt^QVW!JX#iy|GuMgsF>ISF9cBplUr-@OCc@C`gV31J!Fc zWLJ&?#233IT3mIAT{arRdf(GBQ~rznwv-(VE~?13i&Eh<6YOg*IXXcwD`yv3T+6%; zV@UU6WWUO-#z>t^tp|E&get4bS)F#3wbObs5t!Bm_L6a*w-zw?EuewwhZ%RBJ(H&u zyu@FpnyL3SXx@R=1Zx+HIezdt>-BVKcx+p3h4tR1vXZ^?r5wZY!;opGhL%z%0h2>) z3WfDA!`W8RkWytfQd|TEYtCI>;^4=TrCo+?jWj9k-Q?ws-4@a)0)+R$>cHWbZIDg% zgMs+G8`=PPZPV)!6mX|<;k3ymI_Q3!PiUgI1bGX?(yEebk&*@)G@Gfd%{3}fUW8UP z8vt9k+VRIhH}#JqM^m{B?4P0 zabFG2As53FP7Fa(&a|E-F}IhETEw~q-@aUL&S1`@W=w~pL3h4pHJy|Q8_r>|V8CCP zoEmaR5gaY-Vwv&3A6V#5;tlzn!STU$IaxgubC!ecsTRx9?#WA3Ni_rYcQSeicJ6N3 z6z`5u9X$fT&;0=M%@eOGn|=Wxbr&oP^pN{28XV-_AUD-x-1}%VX?ELu3Q*xuTIm+) zk2@Y|AWqjlyF1aQYNg%zx{G)<+?lh9g)l0?+RM;-3pmR%N7fFM%E#}QOMT;y>8KwRC0+udY1!e}Psyf!_MJwh)sar+FXsM%k} zd_wK3r}dh;cXY*Q@&?M4?(>1?sJwWxA)ywM%F;O zz2=bw2LDRgj~vo78ZvTFraWm=hoQu~PQ1=maNu}D*m z9=w|tS2x@4P-PPZu#iXOSQR*O$Mr1{)Gn_pluxf71SWo-tCEwXy>lm%KakL0J39J% zmfczY`1;leiFUMn_ANUpn%fc)yqmUGTilrZON8jGap0R+*7<(1_NY6yc zi!f+*3>x9{#{U@niCzp0>=?bfQb)_$xckwMrOnFyZn^e6$U`m-uVMSc!YJwlOFz3} z{(?>7Rm!M53?Osm^X}dn)G0IeO^JHa59)iJI6RX7=-$fZA0k@#U&KkG#sA158r1vpTJZZi8 zl#;77X|k7!hxCOjYJBy;1jSlsDBKbNw_l9)WhfzhlU<=q@9l|`ZA zl$|?tOy-rPX`bmU+fU!i?TXd7Cs2ULxbsFUKU?S}J6;XlPV>r+yc~A$?#B9i5qQFD zo;r0+hr0gi>t7I-LK0Qt3`~jF=61b(Wog){)s}@sD6tft&qa3Le^h1W)F6lJgLjL3 z-i8j*xkdRnvKd}v`hY>+qUL2I;Y#llHn29aGsvh(OzhLB=Fos%=LqQv)R9I}sW^t+ z9B5Sf^pzmfjkZ@mtx0)R`G&$m7JjHPcia^yo2tbv24ZG}<>#A=wrfUn%daknDwsm` zMfT)3xLI3)?c%v>BcxuQi!w4>M`B8`K*s^M3r@%xIlkilh92um6M`!_f-BTAV%-RRKCYJ2X;unMwgNI%xR zZs$_TUj6XT_M`S5jY;=4*m2<5l<*K3UidYe(&~52h^F7ui(6(G<(*cQ6W0Uqu-{}V3ng@MR_-OGu?+*I8#PJO zZIr(5u@5hzX1WK7Qs z8Zls(-z^l&A2!Z$)hK?hw&F;JD=#&G0VSk^dU1-tSI-{+^%GW`$69^@HB7a~hYA(I zGST4fl5w3@!jopiiC;Dd(4b8&LCtESICV>Ecg0l>Gp0{S&Xz|~Bx{uB15&k!#sUj+ zk7s-cu72PM>1REti7OB2GipzgVUK!aDg=Rlr#!{DzOmwW@NU<=24P+-wlPg?fet_V z+IP5BH@4Za?-3xhA>D983bk%sXvlvrV%esiM#HXUz=nl%7lA=@`xzBN@JADYA~%&Q zmW?VeYdlHw_{dD4=R!=fYgEnYmQbTTa* zprdWKdNjev@5mklT_U+Ba@$I|{L1t|$g?cfAA;ru3Kk1VzP#~7SXt-+pVszXy%U|ox}c2FdBCNr z$gMmI#~p>w={ssZ#tqd@>F6eEnYRsC+HL+iIR}`tvu3v&8XyE%R?pZyA)Qp>_df+E zk2;7T6Zom=on|+7ae@b2#F?UU7S?=gw8Bu7g@^5n)@Rkn!_2Y`QP_*8_VuRkyb6Ed zg^a(JoAK%xzkeqB`Zz4^&Nk6&-G`oyS3hYM>uKEUF1;m57hR3=uWfl)F`=O}7O8M^ z-#^Bs?TX?B|dt|!9VoIfIj9XxLD zCT<32ZXck6K6PX@<8?b4^!COw3@bk#u&S71Gzj1SjuS)OiWN; ze?tCY3xN|~*)7L59f>8Zqvn|#J8wq&KfvFM333wbSa~3)W}ZVyiNeTt-T6(BTq7y* zN`>QVE+O8G8Xb|#t^vl5M}dU0oZY=H^$hCNjRgMvevHzdJ}f%bGwNTvcJ){(HL=(p zy@zhPpY`ZpvlgL0R7xH#xX^)AtMezQwzWbm0~PcXEr(ZjU0Ze#^ZV96=a#pS9}RqB z=ijJcDQa_Hjf61nScw|-dR{wTPVp9{Rx+tanxtGv+4`UR0TaWihP26jL$vq znRRh{Hc@h~D}0=%gt!eJEQjB(*HK$m>(t{U*Ek8bbY_|JtmUJQ?6etNCH$aI;)A|y zBZLnNwX%xE+}Cjb_Ov;_cX2uFw7EM82#)hU4piL4lcDqoX4(-O@y0$!HEU>{NGYz# zW`1X3?*!!^Ad;Y->&5`*HmLjX8t(H0Z`1aJVe?)2_`}`024AN;4e}{%o+O)uxsiE4 zONM+3D?Z!o5Y;tx(bvjYFtV6FlDe@X&+_qiBlIJ5o(!?sI{dn@{0#m#Ja9~D z_)q%z9oI`8JDY<6^1_ZqGSjv|GiIHj=VY!DiaH`Ictk#e0@&@2AAtq9#xmFO;wk6P zvF?UlA>(%|8`G`<7$*8>L#|$!me^k&VSbeMG-slV$x*$U1Z^)5wdbWG?3n(U(Y@g& znc7HTZB@Sm zeuYwS<{RtE*zpDTCNqqAEpfW&_Qjn<^?+WQRz83j6dPiScl{@ zWe(CzftbX}Fd#F`!32OI-W);p=!mUBR!5cVdgu%Np(-y=2BTEblnw`y6TeJl!bPt5 z-b8{nT){!^BnKD-xPbs{&?=^7Smrw&^-N@ zjuAuo6A2tGcQJgLSSj#f#d=)Blm*!mk1czM!zY&yyr)(Nmu79J|K+msr96RmAoB>0Xo;KD(xxw23Id#lGUEh7Ky$nC;IfKeS1 zw@g=4He;4hJM?p}S{4q3ebZ0kH6J{D2-u?0^#poA7@gb$SsaInBt^CA%xevQJFGQj z3Lm=napD6~sc1lld(@J$pGE>NJoZTrEc0aR=g-UB% z)~5T(WrVUgWt7exSv~-i->O2Y#0oZli#x5Cx=S8&GiP)a16uUefBT`(E8ejEW%p{M zcgJYmD+n-|?Hv2nnmc+9jjY%TY}FI*oavyF-Vf`9y7H!x+>V3k$mjDC&^W{@yHs#V7A`ZXFMea)SJeI;$=gy;} zHv@DYN-GzeUkscV5cF6(nsp+&&xl?*A+NpczZu?7et%VlbWpf<`^@1;{PQz?9!0lK z_{k?a#jJs)fcu*Lpf8huj=(vlBws8vAwD*C)3yM3$RpMrwx!zh1x3!q!bqJ0txS~GOYC(0tee4t z$wq~}(Y--?3nWU7YHUd=Un7zVh3Ie*4l_s2IMyO@^X?KxPWrWr-+zAaLCmDTX6ZXozx36KBR_t%Y0gWYyQ=sV^X2ucL`sF7&Bl)6 zelbu|;@cFv-R_bmRouf}Bc2sA=+JL7q~_aBlBxVGgvw2vlJ#}W>9eE9B$0=flC#e^ zhf;o$UQ`WinN`*--{;ZI=MWA(v0Y(fI6iIWQl{o*A9WHak!%N3sfjXGf!>P{)2Hif z38Yq~h8)!MzsGC8t-H1{^11WACY*yj=y~U|>(v4l6)MG{53eoNu_=Q6Z0w9`ht`fx zF<4(G+K8stbDPDl=iH}Q%pYQ&CTxEtx7cP^Hep4<_gPb$1s{Jbj>KVB(kKKs(y0jrx4R|Z!x5l z7C3ztgA3@!*!|b<-Y-Ud!rh8tq-P_IkW4P=^s`O)@kVfLdy8KkDU$9*_ zzVsomsVPmmxTQ1^8>INptWqt^lvjoat zy8dS)$((JeRL^Mby!$|U4|4H3?^{u+cvn7;yUIBMyW~5F9}LiUSh;Hl*s57s_KXE@ zmho@gr(z28Ypvv!rs<5FZ2 zZP=eIR5DSf2JiPnT_sc0Y>O9m-Nh+S7uwqQ>iYBfKj>==h6Fu;&SAw+Mqqci+^bLBHRf{8@7xF>#A%5|2*q~h?Jry9 zJmzlR$GEvNDdVVMT`h;QVn~ArOv%+d${v#;Xg?>2wFpjhd*qpL=?|V-u_Y<^JXMT? zWIp+_;Z=QQG<{LIgQh>DF%qUirg}qc#{VNk+Hh{UZrRPdgtgiT#i| zNa(yTHM?2a(J|dJG`~jGZGUkhG&^H05(P|Aj>8}S2ncy>;&~16_5v;i$Q7Nz_p)rB7Eb=qShu<53vi&%||9bO|raiPH(d)c!Y$nF8duIB>2&1U; znLTvwsxEJye>D4fx}oVDP-H`+Lac9XHm6I9k@vXnzI;J{+x(j%ZvtLjs*E(0IRL*7 z_f)h>ON1)H_JZ{3RdU)10_d}#l-nPa3T*|VpRGbY!&{b*Ffp2xMG~si?S!g*`OPt) zuOy_Q(@oiOuQd}=4(HJqaT&2kY%g}oCK&H+Oi%lcr1wnz&@Pn9uW(YWP%75z%|KCUpWQ}izE^@VOp>fB0m%DEh)_YaUgYOKk z%@XAj&qicI7Q$Mv>D5Kgbp7tGKz#}S@ipHD3%=TlKu&$@lryeyW zhk6Z{BPMw-4UHT5DE2zDM#Kp@q6F46Y$M~B?(Pc3KQ-fQ$$T}->{*4fs~vJI6F>&v zaSr6WZ>;trl`kY{&YSFM>yyUraWMHWzP}&i*lpZ%$!JTg7X%Chji7 zWx2MUOfX!IKwefnH5OJpOwvyL>~RcBHDwGHQY;@O+tR$&YpgZu zKgjpIhLHF|WDYsDjYKqs^kE zCskV3{CUFbre$0CBMhXapi#+9{CF7U?UJTejxlaWnxK4$To6)WhM+FfT{5lj>ui0R z`s&pr)y#n;LPVafj?U2F;OW}=<~zqvX08OS3mA_qRUR2VdTPq4d;RW62z=fBdE;u7 z22t+E+=R~wN5#=j^ur3Gd6Qdom@R}=;YGv-mA!a-4nijCMU2na?V~uW-mbsSefzPv zrmV&^^F@4Dq*^xCo1oOXDRl)-Xc`V*e7AL8c3G06WLlDX=2f2`7+6zsPS;w(EGPeH zX{07p?p(gEdZz0M_H*QXb}lRyBZ3T9XnTqJ$&)EX&cy3_svbEtx%k`+C~X60p`^(a zDJedbUz%um#q6>Rk%Sq^)J=9RhLJV8h4<4>YUwV1#1|$m6#E{3*>3o;1vL*iyJuf& z9zb!H=WJE~z2z&U;e4~aFDom68GJovWF+d)?DIp4?rqZAlf{zVV{2~dOO<52^C51B zbpp`ffiMVdsDH?Cw;Z#aB8nw)en`zKsPZU7C|?9St_c$*po?26AImmJAS7IlX>=;# zy?~*uVj27H)>|$E{a`o?Ucm_MVOTCw*W`go<@n&FZTTe5*3F|qxs!~~{r%gn7hdD? zs1vebf<5>gQK;!vcJ?a~S(pOq;#4U}X6I#)m`BPw;0^MY#z_AEURTU&|H_VL7dB9E(rg45;<=JDmzb?n1NSKSPlU z)E#+=A=yjWHlN_DlmY~CZC0*^y!J+FCX++#6}?%k(BEA+Ze(Bn-uGVFm22ArQeil*2{y7TX6vXq z58t2QgU^%$AhuYzy>hUJc^Jgo1w)Z)+3V3U9yHrM($N_dF94viYe`!4ctYjdxNc7u zo(xB-7U&qfeIO65_>K%N9Umq{mbxEI)Hp_O)%$leK5y~3h%wWp`_kdfS0uzZ0b@XtQOS#EpHHHfK2*vDBX`;Nk+hdj4c(b5UR6U=69+{a zmf6pxM;H9rLST$nG!`ZAhglFQ&+_T>=k9JOWn^STgsNKiOI6z(O=x>qLVNDV(W9ei zCX>7o%hHL5cVdQQJ~-^#rRg7A?S=TWJ!CNn$*hcWRAT z2->Lw?+?xtFg+n` zxe8Pdw!XZpJ4{f<_5N_-s>IV5>YRPQIa7S$cRq=<&>{7kWe-v-lur2X`rda;h4e&GX= z42Vl)eJS3-pyQT^2@;qGGe6?mluz)53x8`Hgw4{tOKi5w1Fin7STg(P5zk5H*Y6fG z5yi*{%kuh&?0pie0O-bK+rwdp8!}FPxO0pzBA+Z293FtUym?sm&hg{zYY%DWd{dFY5aNj>|IW- z+4~$}(|?f6Yr(rZ_S`9-{n%83KFm7Lu?++5orLX7uRYnW?LKiH_Z@UM!-2H6;SR5 z;L-pGAAWVSWu?^jP1hu8n^{@hu#k{O(x4rA$xY&W=~q5fIQ!#=MazckWCnf$aj(Z% zI8xtk-D>=bgM9n|7(AOh(5yvp6Tvwml*a}&(H<2iFc+ocn=faEwgvb9&dl?PQ84BxIw&v`^Y4D6bo+IhYUC=rV*zy>REKw<$qScPE+JVFclK; zbfDH0eZLOy{XQ^E5ae6eTBPhd$$ls#yDPkor64N_@VwSHHl*|kOK8VlIQxK-r-;X1 zRr0N*@dmjOI60OC|h zQ4v5+)>-cYxWy&`8)nguzO}F!08V{7Z|G6=6bH2bF)QW|6g0#l6FwK?3b0QBqY7a2 zrOVZS4)_1rj|6n)8p_J{4i17Ty;h|sfVgDakkC7F+gl0ct6WoCdzD^+H779Z!ATketr|j1i`7)q@-xKgPZy{4m+W+ zJ7y@P2f#-LlypA@FgsKFry|YMWhlYn=#>Zp5U=0R=gIf2Ec&THRG4E2*PStsr zg9TM5C%|(5-HL39h(*p)fTlmmpMbQxEfNBtXWz3jV^)ob&=nOIZ$&i>z)+9SYb=Cdd$)rziL!El;gg*;8o?onm(l5SO=cL#s z1JP)JUmkG00wS~-Axx4@G{6fcIx6;2&T+pOP^iCo^9Def@i#k5TOmFL7B~Td0tbir zA~FN0P64G_7~1SZhL^Xp6Vs+|j&=jLL`qUpfTUj;#CjSV)1~x%`osm`p2^6=vwC{e zMLS0T3D70mZd0AqWu@1zH$8Q*vB9KAh(7IW4L(4kOpI`ZF-ZzXj13IJ9ZUlnKG#0O zwgypqfTMcHpRn~mm4`9{a9T}~Mc#&{6PrQB)pE15 z8KgXUIXQv&;ow{qjWGgnh(v&=cG_N~Or==K*u*4@7Va}Za0EM%Cj_)q&67=>ZfG|g7ac^7d&MDP8eb%Y=p zU_`RTep+^IZF&cRoy)UOM=BPMyuHhfx+5n1uq_l#gJU2R9rlH0)8&v2yKdDs<^Z-+ zGWkuM*-{Kd6c-NIchQn&JmshnkYA+>W*j6Ss~U3@wa28VitDtolMm#4u}WSe31TQQ zMaSOEkz%H+3$n<^9r3X}z6`5Ow>Sib_DFnl>t09Rj%@0g>C1U-s8lV8*~FFJ;orCw zb`2$d88&>907Z_ogA9y$YeUrL3y^rRbHn^#f#cT^5Y94iV%SUHca++aDOTyro%F?Riq^|89BM@ zLhI89Uy9cbkulcwKk)nuqfZn-U$KKT0jFI8I(o7)zFA`5+&b1pB6xdN<^Z^|tN5;{ zx#$+-fPetN8>Ft@1CV}YqEC;mk%ovlil*on0&)X$Bcs!_%d6k0t*-lCF@S;~Vu1Px zXoB0?+CoD^tp>aADI6>)73p`|2*Dv<>M&R{KvV{?JL6+xC*L<#!m)Y*389^xosyE$ zYgxaV!ouzVTZ+dR{$1f=VE~XE1S+L7^xtwtAWk~QT1t@K9f4jpuCC-wt*w9#ctMJF zCm)ihW`TMZ6JxF0v9S=dwCgVqgI#z099-#DP%q8jKA&ScM_hJ1l39DkMN`ZaN}F-vV=DHbiXao7lnLLR(~N zYARq^2fgxssR{U2YaP|gF1ms4e@zdw?WH%F66`DZU*R0{}*w2#QT2V1E;DBCA=mm!7+i{26fAt|&H3y+U zs;;3ipK%M>t{wUAz9h_yu9$J^73*uRaJm; z37*9mpWr+XH3U*BVwlTH+yWPPg1w2@jSJas`F`dxV=F@QOLb1LoZ~vvTzcg6(H}IK zFc!o2_V=mq+Xe^8x1O|RC(aU^L+5~VN7@aNS`Lvim64FC8V{aibUDc_n+FegQf>h` zdW3|fzI>@?VDPn}Ecp5IvTbx9S11{G?8g=5=8Ws?3A{89SKU48Sp^REk`7?!ffkWL zH%Wbk+5*vfnXPA=VV9xRnkC3b)uuiSp2y{jx(Mdae*9fPAR!b;9QAlHkI zHdee6p`fz0XNdBhxU>_u8XtRkTUyRT1_G^!*OwO?yjrs$(#FrflHY1dX106uYYHTbiCua^|^bHNUm{8~C0jtjs0WA68*w|`mcM&9O;8j8bH5u9CvrnIJ zQ(E8W>2Zg?adUO8v&BshG;aYa2U1S*hEA{Hh{Q55G3ClUo4Ztdz%VHwA@S4#uwMxZ z?xv9wS|nm;e_$faV8K+m{i+LLr)s zKLKwMQxh{zpdp|g>FVwd;3URUuK)`_3=B(`6DQzsA2VTVlo1gTd38w6#N;HJGCua> zmRB6n98qct=^PVCR^aSQle!ky3E}-$*9w9=N%cgZvGkn2|g5F*Hm<7H$*toUAN% zNl7}n03f>{su`eRXTZVB74U>zQd{S_goWcY*se^j9wIAUi0!~YdlVEF($mr!{hJdx z4)8-k>@JW3b~ZL3Sb&SCP>*}O&IJ0(lCV(_-z#h2)35ou5b$IFp09nI0gH~gdHNf5 z%XARIT)t4>ucy!Tb!7!`Ajy)2hqlZc!r?2Iqi^43BlPqZ5JNJYYB+A}mB)s>)J6J* z`UMA)(>))kAeUkW!NxVSE@}C#&H)s))6x5}R1t7tmgXe`BcrZ=k*Y0pR-o7TW9oJ%HEW3A-u}1z7;J*d>6h%0nR*kze?^|5Mmk zv40!(_1ED3@u2^Ea92Sw(f_cYOLW2>4iq@GVlS&WTJ|kg~ zxw1y9yr&sVOW#9dk8Am&O0UU}Hh^0Zefy&;E9r@hSH7Bs=~LJq-PAz=kfrv5NutI36l`EQvEo0&MY}G=f;(HS291Vt?z&AizZJj<(RqR zOWWcm-d+CIr37nHn$I$RJHxbdlj&`IpsR_+gIN4?J^3vyn%Py76&|=npQ1L#tRrSe zz_)5#$xx=(Q!y#co;QW5ch;8Ju z@vSb>Ny0m66pjt@FnNQXc5ENzk&x$YNko>u?z>qHe{stv@V4ap$@?_=bB*O#dRTp3 zLus;>JoSwv^W9DXodavh3NNb&%DbQ?HA)trVQPeLKzd zht4YWmp#_}vL2kKuAA?-Q+WI4h}T^&zL&wAg zWUbyUYEVQGogOy4b-~m(ecN^1thpQcrTyFJ35%`x(MajcI+w%SZn5~Da&ntoh4s5{ zG+IN)(PeVGzx&^HOvqB+s!~7oi1;ErH%5B4fP6@O)kxFeLH5TiD&uF=YIGf`MN8+R z6h~6el=3+7k3DX^upk*+w7Gl5kE?&8gm5>?hlt!}s)IX{8COV*4-&Z?tLW*ORA#ix zhz?O@lRB7C_6uw%&=gSh;3rBtY|YhGU=LAH31*~sbRM)v_rE{5+KqjnG9DOv?cS9Y z9yQ@L?YpV0u3g)`E+CX&poS@T`8KZpTi05R1Fnj?;WkvR5X=H=*{ z>At}Tp7~r?KAu$0%^@AbZ56x4`j;P!lNO>4uyw}6`{uIovN$QIWTnKFkG)0TU!fZ` z;5IOP;$0}`r*T$#-uJXOZ2i^lk#cm#wK`A6vq2SS`npjqdJ>cU$y`#iL_y(l{5fO( zM0;Dwcltc3Tw0RE@zHM9JYrn-eNEZ2{@61H_vB+ymgAbnryuo_S2E#3<4&I6KDIyb z=G!TvJDqS3uX-rYcd!(0srw~<%_yfl@y4gpU|B+Qgiu0=S@vz5D#zwKBOE2N=;IKG zw71%s|1_r8@HU0SCQcDnd&dz zfBkd(_m5pa=QJl}9%@dOUYFx!cyXdpDtxV#d`s+#FPAJW_7yR_{%}cw{NyBx4uKg< zT!jzhM?5YUUHgTqtIfP!`@Ag|4x(WUv+dz3W2=iJbk{zV#Va8OA5$zWaN{1~%Ir7a z*!oG;B=W;JKg6U#ZA?>D+3|Caq2G$#u1WfYT(y_4SjO8~qV|j%&Y$6D_fb^KY4!{2 zEne4stdQ(HnMFc}DYs^Mp4=Q4_=5isRuG|>3rSyoV{9b0;Ldf`iL_7&A(t?Fr-|vs z{hAC6pH)mG?||oK%tH#o)eHrbrTp*Ru&Uxpxz?G!iJ1kEt4T&B2r`Lv zzsyQbSCU0p;Rf|b**}Zq9373+zx!n1-lv^?P7VtePl`i|v+vKp%Qj==&P-3-#w4Wp z;wzJ!`d;SMN>+>?)d#ziT{L!2nR8ZnwxAYF7g8v5m=--zAZ{bJ($I}1TVBi2Gla-~gl?0!JmCy}7Yg-W;J}Y56 z8$K}!I|-ZrhrPEBtE$`E{pl`|?v_|I(%oGWix3vwjevr5cXv0axCj9Or9nViLJ3Jh zX%GQH_zivbe)hBX?|I+zoO7M)z0P~i<`2QeWX?6`8s9O-oa4SfH?I}1fB@g`I8{I} z{WE6h|Ku+IGyLdZ-qrsF_|bobll~KaREYP#7C-uzFZ}OB(LckF{%b4!edGTF@uU2I zkL3Uaseg|<{~mY#0jB;N0sOxSe)L~!4$K@x|Bf2`Gm!P4ZvXFb=P!2VkqiGiepHC}ui!@o?+X6|TKH?=)BPP<__vgY{{%n!hX<7Z1^Ce?h+hB3 zkNy!(`fvQ`AFsy0;8y>XDEfy$lfP17|Eok%P#6ChQS`5sCNHlbFYh0U^XJo$e-!6$ zMA6@p@&2C2^4BW$CsA}q>z)(IK!S0}rX}weKM*-Ym{85QlJh80JKc{G+ogn5)uH4J zI~uEsy>yLkMFy|sQ7`gZ#Lz{lMXC;q8DSWG&bbBQ4Qkqj;}vCo)#Cz*g3SADBt8=U z5)bW{Uwv!;SoiAv!E+~06Ges;WgtP62jA9aAmBTv-of&#h1AZ+-LQvO8}+@L+E>-* z7B~3Td`95|-_TKlLs{V)TtpBkmQyZH<=9BUeI`Pc^qyb8QEm>vg$A=h&KG`slr3aR z8!GkAMvz7fP9}l}>jV>rM5vRz=tV)mLI^JpM%^REqHjLmCL`V|;CIgL&x+otD5EHQ`Yh6q48{m(0+vXVy>@bDh12}o{K1;=Ii8T)GUVJzn&r-1PbjLM5zy8d7#NtCEX+T*+8Qqy zBulAKdEXe6h0z5+&Mnra1z z6mM}`(%ddVj4bn2v|5)Q-Ct_g8F*^m^7==B820{;b+b%GpqkmW0MeXSFAH(;fL`~s z{TYz$DA!y%3bl6t6y03ieZm-&nmVJ#fmL_)$dIcauMcz}E{m-x3U4;j8{jY*k5HQ^ zw5ZlMqm)8&1j$?Q-t)edx>%`aEmbY+vgl~0(-w97>l1sPE&0yfD_tSTm=Xd{!-(6i zr-+R(N`{fN07gmV^5+opDS7NuS|U87yU*!D0kuK1D4 zqkcj$#TLQ`PW3PQrABN_^o{!Iy7nWcfzI_k)mLGkyn=S7;|a$XNJ`G`SMwgOc&cm_ zx+3IUR%qyGM%vHkyu9E@@XUgOy|c?Lb!W+;w4pdVi|$g$JxinZA3>LO-5-LLA3hWj zvu4JR#%}J=(zOvA92U#VxDkq3fJp7R%ewK0t-c3lUoD*p zFi=`W{35p_=l8spW&v1s3~kKQ>rg$=@e7$gAX$XJ@Ga}w+-HAL*NEvckjyON z8@BXDYQ$O&-sSB~Uc*6vjg7>TL~HHK8j+H>LmSMEa9BuGRAl`2j?X{f^c$j0R+oSH^O)qTv&4z8-b1q6%xz=ra$ThCr&kQkKm)CPS2`WbM*$mC}^Yw$DERTcFZ;L!$0-AIMr4<0D! z0_|fZ5)>#eiLfHnS=6+&xPkKi^XC};hxKXnM=@Ot#{KBnWId`xio{tXFC3;>x=l)e zlIG3kG2m^2eg!Nc|KuDdW79L=QyuC-q;DI6pr)g9tD0}C z27INa5(4n2R^8LJ)KxJte*QAu8YaS_wM~fT&%YCf$+X|XK+%2@d?!FJhZqTB9|XjI zqFXhfqXhD=wSMfpQ4oPX7HY~DVCRt+fSvkU5rt$j79UbP4CI3{89(g_4^JXzIPc%T zzlbkURe`PsRIQ@LB3d@Kwt(qJg&bgOV^dF;rGC{|ULFTdZWNPbf-#jnd*D$iQ4JIe z8~ehT9!X90*LjDc;#g19X zhCf0ZP1LQimf^}dw^LCe4N+){MN%u(%fSt^8JP-21*#x+F0RaxO~M!^DXEWpK8@!< zXa@v6Q`6H&B6sihgEKlBPfg`QinAw1&6Ka zMdMpq7W5KKF?uOHQ;Nr}s3k?E%HUu}F(E(1ly>K`_S?c3j1{B z3g(S|c5ef?!to@>a+-TPhlXw~@0ToI=GOtOWBc^Jw^#}>q2dP=62upMu$UjE@||(T zE!LJW2RFBagM;UjGu7<+!C{z(JagT+3Am@HCAf*v^|R5@{gxKa-SoYvtljga22Wnx z{or{2t^tA;nSOBMgkxn}@{X(%g@)qeXEdadNpGW(*<6zr<~D#T3Q50!$R0 zO^fAgus!<1V=HF$M!EGo}X`V$5!B1y~0-h(h!$#h;})LK7r8uczVb?Jz(@D#xi z1?dV5XrY9Er5?KtpOKl_GKd1lrV;n!A;5sGc)nz3XScoST!}Fbr?levTZvFA(eML<=$kihfOP?ScyMFUss1PrI?K}m>qTPcC#~VXcT1D61s}T6r@R;!pJ8C9CGE-4e>9G?xS{q;rWJXLQu+-tIMoZ8n zBEREddsBny)0eJS8!v-3Ti;|Hs$A)i8qDg7NL#h~rnh+})`Y1TGP=eZ$$Jlu^F3_z z*=WLO!nM5i=C@}H0Z}|*tHJ1xoFveoMAf0I-PJ4UaCL&DNC%TJo5b%LUBC^)b~PkL z>wk65%ZAo*Bkcy==mxw4GjecS_J`pVg)@+$4B8I{twcvO18=hd(vR$@#9IDK%u=bl`Jt<$5XebZZ0l}nS0M% z(9TKrWwVb4TJNuTH?YPQ-y=Yyi=$HLZF<(tr}Tpb_R?pMBFGyI4p-Md`~z`kHb6fL zB;vSbdY``iLjqIPZY*EK{~ILe)HY^9p*m%g2;7kl1lhvZ5FPtc(T7pH zy+IxyH0cLs2T1BrELq`Q9bKiTmuexKU}y#(u;7U8Go3KPN;bWcZ2G12O%vv>$F0I>z~p87ZX&sQm2RY_(TtFlcAj_ttcg=aJYsXLtG)eD-O>VoE%b*I*7aOFcI z((Egb%cO#(0tZ#gXFKigNrutb$H=k2HMJ?&WNyVlw=P$fid??ApY}6@5-hxM>+-Hp zH$2ZIiat}TrMWiV9UC@VZO_gj$iU`?{{!gZa+*d7e{#$G-|j>yvG`5a|J$Quj} zB#ZDnWk&;k$b+R_4egC15Bz=eIQWAVgwZquiso)buVkZ*ELL=v-c`G~9l^qj{)jbF zk3;`Ke^WMdT1eZSfM{b2{_+N<6W-g+aZ(n2?v-3rdxh6?8QbT}O9wGmZaP)+QAHF#EBl4nNW zX&_%V9=*xP{eWDJWCAQaS@Fze*4i1W3Z|n%t6pDHOC6h|JP`R)D_H9#>zIn!8B}I= zWcZ_vZ(YkP(DUI0z2`|Vq;R7*p5pV_6QS26{?8SUX^y?yDK$!X~8PG`FtJV z_M@ptBg@OntE=?9XzQ!(k`-M@x_X>kkmZhtUj5J#)e6G&U@|&XA`5xP%=ugSIQmZS zzWCf1zW1z~lzzsVqX!$?=>>%#ODyA*Mk=%G3SZ)McJw>h7@|Xq6V~`CVP-~~ngBoP zhK#M-?e?j3iobO~KaV?g2Ghxju;Q3g+1B=nXbapEb>=lln38vw%U6}_(tT#gd#A5j z--|foiA`6iT=zybt_KBsCr_i}(>0$JLI{!!Zp*D^Ss%g=D=N7%1ZcSJ-Pa8jGYE79 zEI4x2geZuVv3Z{2t`6|G_bDL8jpbd(0Dui9?Q7`KoWTkO=Jvs(P$M&=)|UwSnIu`6 z2{!Z6GyNqP>KHPuL>B6076$58{lPSwu>pFigl_yQThElg<^=Y7V6P? zQVn7sGA4#sVnQ)gAKs}7jY&0_(p(_=932U|NRFQ^=C@IH>)qK8$WSRORv!H~gxk98 z$k<{0V{=yUrx;KS{*Pg(2S>SD0@d}9zrZSYd)S4 zPOY|e#Y)~A`AKRRpaJ$iq@Jou*BJRLT$pz>Um1x>QvzSR4)DdnD zyH8KT$<2K`!ku!@M~vIkQGn_}99JuAn?le$`dySFKu9^Ch|krvIGOhhUyF9<*5PL$ zh{>oi362b%iJWAennWJ`u*mpK46d`kF5K58Wplv`{K2aF@VT>q_MnS7z^- zG}d*vrS>xnJF+g^kEdxrul^3@&iYZd%<@>f(~|gjy~ML>;z8c{o+onDL#kk5t+mj%Y`Uh^)hu3I5r66g;o^25Gw#~|CJBdl?>d$ z_-_$$f>E{oLX@fzb(KR?LbGB_KZHZcYV zznVyb-g9Ogw|*ZUVYN_!VYH3DO|T-5h&tG?p%%)$_Oduq$U)K34T9v?ii~gOy(P|@#ohh0vz@(ML_~NRgnE|CbA?Vq3I2#V9)bxHT(}tu5$~$tB2Pg&oFQpIdx$@p_Y<5Pv1qnQL0tM z?MnT`#<5U1O3;imU@0azg{1xt3ugjl+mH60Jv?9h=Vy5#WtGCX7@DSfiiad!j95k0 zJR$QmB0|&D)NF0R^o(l&QLAudb2rgr!TzgP01<=&=lySZ_i*>g>q6rZX)dA+wlq^o4~5o8FZt_ zE_^)5Uzo;_HJfHzLOW$T+!4<6X))haqrCPUF@iN=dhgWdrnL$;gop~QBY9!LBoIOC z!|PW;t%f){9qh5PA2jZ*^2=tFYD<=NA!(_PG-YPmm~{2g_Gl;)pw{g)FiVa`z6bXn zm}T9i{F#hU;OkZ>8;astEtezvq+P*Y%cQyuSqYX6ubt#@(nE@A+~A#wfMVrAgcumUPb9J? zc660lL|D9GLDm3e=D7D zdnRLSK00$$#={yVU7b$j!sG@XQpcXVhoR!53J#^&P76)3FdR;<2dap*}=!kOANVi!JV;GS0`U?2*P;N`b9N?j%Hz-MMc7*QmNjaeD^_VNFKDUY1?>5~*FB z-QvRWgF{Op^O%Wq3NQVuMC{ba(|gn!VVj)m76c6ru-A<4x&2D-;Qny0$(X!XsBy2PMXGb!k1}~<{e^eK& z@EJvdRnux-w&IpH1fn{@9JEE6_GBo4cM!TQ7RwH99&jVqMdROFMn1_mFVtd5%i%@l zBa7=HNvk3G0Mf<6d)f0Il$pvGU zBAL+P-0rgEcA-(RlD!|wN)pRFw4!8cq^c~(|E2Bq&U2x;ycyf2=Py;okfm(KV7(NO zs)V0CBY5~gLnB<3@4eD>i+e;@)7J=r1W!yabYsW1 zd@yQl7XfP8=NY1AIx$sa1nk2S;Oj-=4p2;msoH1S1S?#X*JRZ3v{hQ&30&du{o@CB z3j#uM*5bYLMLK@8RTUDzLiw9CMrsC`tLaq=QFs`?W>m9w!zC7us7nYA6m)n{C@s3P zU^>WvyGnzp8-9yR%Fx+@2eUM|;+%kS^xomrtjnPJQmNJzlIUnW`5$`ShK~opLu^l` zXk0Pc=I|X&LYlblc}4V7A*V0N>%z#&x;2U_u^K!Vw3nL{(|WlBNAgFCx56g-?fW>g zN<+ysg5{CIOx4($w51_Uo9tn+(MXEY=`lxPSjQM%F4T8iU5P!d%?bZ>G(Haw|{rIELQ#~8|?kv6~pqNDbTQNnWF2_a-7EcF-| zF%dk2cPwMlSNaWD*yu?*-sF7F@jw2yvGK`z%bKyl$CiAUO1}ZCu{vzR)<7n(LBd0f zkeuW#jygmpM8?(C6$Gx$x4rblt%vRoF@7U>er9~Y_RU);bhOUAg=TecbFXm{n8p3e z&J?-1x#Js8TI(L*VqqPho-+S-aP-@1W@ct!K{Si2SW;)8<{djr=HjAhG^z?V6;ewv z?yF+f5UqDLj+ymc?5uY12$ggX)pR~g)jGT$lEzyWw`R7U-0<5ZLs7!}WV3taA(%s$ z%96TwYd$-CW{vRl-TbtP`bSh!3?^Y*@XurN)bGA;M7NZo4o5-@5to0a>!qURLqaOn z2$Tuh=S&C60}xY&w4n*<$goI=0ZWEznU!$8G#iHG;}rUGzM2uNEWjHY%@cAP$>ap= zjf3Tc^`wvS>nH1jV&Vz3->JY_;ku%K!=y)VrpC#h$KQ@h7RSuT01~0-++^s>RCR62 z?daT8G*p0x8kqVwwVa)uy}iAO@I5Ivm`v3um{XKjNXXE}EV`$NWArSAMl{Wz(2~D8FaUj>jgp%5-!v8-it3OEsHpXiq1-{HHy7N-{hMX z-HwirbNTHOquSBi2Jm_C=zn`NQT0%|sEI>uBH;-DnTci5NXtyARMlZ-VP*i$E}Ge( zdnjyypGg2B0Eu6a<}j6)SCm&NEoCTUN+D#Da>pJn-5kk6M?n!55xF=&H|_BAI6Pfh z*_kV}9DkDa{M}LqX4D~Lm>&i2m{v?s-uFwVzDQh3_C%T=r!&t@=ivNO5rQ!a(#nu< zk!+~X-UofKcu7TpBSJT-tgimfUgSyjjAMrCi!k)&)#DT>d8nGo3V~z~Lk~kr4?Oyu zX@x{csO6gU$B%Jyy)T;F-kucO2TF85U|K70$@$UDzA{b>xFY{Rj;tZ)xBYr@&ui=L z=bgPB^nk3rw|Bq4{QHsP`;Rr=2&J-O@{!nt>ORw9w6c(tX)BF3e6zmEdz|e@6Cq2V zl+l=aN0(wqmZ5)A2kl95!aD^f!kL*bMcz^}GEF@;3g%h|(}j|ThK2>2bC>H$k6)Rd zIk?e+kKmSb?UtLwV&SXD+Oh3<{thZ^icr$k?QLk)^L5|tfAj;OH&Ia;0`ZlA(`T%s zb5yWN5Z6BzRA_BIFW#JQ zd$6k0b2%WG?EU%!4mW33fASp+}@x@&+}z|pXDL|Re=0VA5TwqZf>FXTcA1ty(`rxvr0Rha-trILr^V^NVWv!VF%sBUibknuUR#<52AMB!nV^ZN0HFbe zRS{yvici-Td7mL-)_0&z0$3cOmr4VcIU-&x$0`Ew7mbaK^#RL|ziy|LxY$FW@ZyS! ze(M{6)0vo<_$Uzr!faQIdQR=aEbHgz=6>b{0;(1`qns#wS_b}y{J;w(?o3Fg_hu6? zfBO5Tu3+QF&sAVA_Ejq_N5LX<_+zv1KKD?RW6 z=%FDkKCs*r8HtwW25!y+!Ez6P@`1JRpC@4mR1qgxA?9f2__=*xr6(;lRTE5WBD49f zdrs_VOuvBaPeVPu>_tYadSNlK^~{oxK{A_LF`IEqPu8;8!?Ws`LLFTFn#Hd(p$WjeUH^rH?EQ*P7p#N>U?V^srS z6yr;_M{7yJPwFe9A12=tK)K>WT_9RzkCTz&U9XA##IpLXI8R(nv1O49Pn>+5-ig~72>qDawzL+J7- z_@?Bd<$sA2;%Z<^qJ9mQsDcR0;{fWVu#hIr-x@;V4Ps{%7*dLgXg@SVNP2QZMCrT= zG!6Y$x+-#W(K(-C2u$?TRpJ;i&=U<<)}tvy`VOX+mlGW^hL%A`92XZi{cu8>G%ULZ zPxkrbEPXw}bV_rxAO^~i3drVW{Jjk5z%Pi)nOPsgQZGR%slANNkp5N0JoWMM@f~;9 z%!`h-;w(Kq*AM#nK#?8=AuO*^aD?^A67;3Z{#m_OGCDr#gM(RsjJgu2aey5(d4>i- zQ{#gqfj^qQ)zME)O)X`F3yq(NjR;pHxMBQN-?Ma?0L=o%ZGhAPJQ*P#9(Zwaa6%gN zY3#ReKCjHoK}#PGLu(@=dUPKJ3|8*4*5dfx5 z_c>xM?d+_A9H78mmaK2PE~tZi>&aHNgDcb3e$M{WPQ z!5BP<%_@vnLaYH2Aqk*-$Ym6P)-hpZ#>HV1or^F+>%JEI!(klZhE=;)Ht;@6-rbV# zmzO5S#;OmLZ-eNc&)&pd(iO7x-x zZh@T0=H^{Nf0m5v!|M)r7^`rE9{U4d-?NB9HNiaawBX*)WAHRVA%J}d)LPZJln}j7 z1k{uEK$SML=Xvq?wY7K%GHRs#8lhzI89zkxdR82E#lE@uCt1%LAM z>y2D@)&B)%LcU*@)yB`kR#e-;&&K(mOzixE|FtIezkK0;_oe@-iTz(%>F*o= zA82A1;Q9BsW9jz5TY}+NJN%n-``_@CUtOKEtC#417Zdxx)ZG8j#Qta7|9jl|i=*Jb z$DRMZCieda#~t2(j5~kDVyon7@$m0nS$R1lWc{B4QF!GI9!f21X`kmOHF$?7V#ZfS4d8EFvl+D<`j@sHCi-s-t^PPv5{0YGiC- zX=QC=YiIA^=;7(*{lLf9@8P46(6I1`$f)R;*p$??^o-1`?3~<^(z5c3%Bt#`+WLmZ zrWegEtuNcUdwTo&2L|5^4Np!@znhtzn}7ddb!~lP^V8P$=P!px$0uJ;znz_5e82gC zfbsK9OCfXy|NgH3_5DwtW9>%b7pha`w+&ocpsE z|GT`;Kl8W$BG>+nEc;iA?|;?b4oc?lHLK`s;cfH3RJB6`#dbh7lLk9~0DIFyP4L%b2CSpdeL%;Eb>vcOlBi zE1@W)4;~We$v^zQ!W(9^REMI%Ijc0~xZV4q&2_P9!FqaN9)#hN-Jo4&+;(;QgP2qa6}w1Ct8++#8DD?6X< zG+0gb4r>z`Bw4@fx>xIK+pL#gje(7A(qumgLJ;ny-UGH->8*jtft3}QS5&sSe^O@8 zF%Ohtx^=OqoS9dyxhp^Z$L3&t=e6I>1^(I1H~PS^ffHKA!H-m|BCiAktiXcn^nOfb zKI1A*w#bAO?1CEd9Jf8wT*V_sx5OE&Qmly8c~|4t0`xrU_a}O_U+;hZgvXZ8ZVMF` zv{Td9pHZLZ`#yMZaD8z(DfMG(Uq0-ILD5`Pq}!Fk{wjEme=$fhn;0G4^&C7ccSaaF zTiOQe`G?3L{$lfNZs#i?tb^s2v#(#%2ZzBb;>8&oJG=3#N2fgz*a<~(d2#)gi#$wB z<)55!`Rr=PnOImpZEV2tY9YjUKs)So5zl>ee`;acDIeVhB(NMp;!oby+=Gx)Q;$Y& z?CrS(WVbOt05pWB^{4C4$jYOlqD;BmCIsOl-1(hwi(a%V?DIhYsy9wH58l}PHUeM) zaP`y-!psu5es)+dSoPFa0}F)}QED%*8j2utGZtpC_{3fkEp7|@>+6lGZNOXoex2doE94q<<&o8%5W`~EFW$S}&huWCO& z*=3(RFcI%0gHt0xqw0xfS%~52@p+n{iJ`Ig@7wv}_WgianoDt{)5M z1aP(L8JY}ApkjM<196slYvRsa9d|wfI)@t4S-0Ppoi7)aJHwkC(!-MtWkPiyh4s9Z z8B*ZlG>GvycsRM@eaxI&#!xHZXOhO+kNJYCl8n-w3?6Z#dg{c2rC&1fU>Vz7MsFv+#WUqzXE&+_vnO3nV^8;$pJ#S;(F^L!t2K{veud5POOmtu!@&0 z57B1|A?35~g$&gXbRk`U)g8JZrNdrn8!KDxeD+Sb5%P;D2R`Ms#vV@5x=*+?ecZ4ClIGc!Jr6m(0)6Mt*QdTqWgn?$z97p9 zF@QAWjuAvgl^U-c-#}MbVFPQw_CXEnw*&Ss9y-fS zXlkmW=})jqnQ`%qu*4__23tXLGIIJ)yQ#IU4!2-sT_dD4;t?+m@8oZM$flk*OeeXNq{xpL>ZT%R zs!!PavfB{AlkXN2lPHq|7O;(WOg_9mS6axr={VnPDIzJl{G9tH`4DOTNJvPqC+ajvkLTCw(O#>X(q=Q9I|>{+tT*3ZU0uDBVB0~fdd9efEZ3%#k{ zlbH}xbF~>n4Gqju*uhwUnbJaMZNmdi!UH{XH4jTowrtY*eFJJF;*GJpHV;2dbmag` zJe3O6rZ{+~s3_}Tf1jpRbYcbmMUVJ9V;I^p&RnO=Lf3ILzzn>jf6MdQ7e=Z^Qj6WK zE-d}Wr}(C46T#8O!}qp&ejf7)IonvjTK=Da?tQ-G5dE1)#r7MbYeuKM0m-CBk-nM z_jch5QbHBepFx8=OzO=NeFTxk!ol(O@(SCDbo;!w_u#9$aw8{EZSShBhzXKi7l~2+ zuJ`EY>+V35b}3ZUh*#?;c|~FYI9D*hwjs(RZnjhdQwiXAb1o^)9(C7jMnFaVf@D&U z+DtWzdWO=_#6;*|pqC_NN0=!^hcN94f_qHrBUVxOQNz0p;zC1vP?7aQtX9MNS)75% zpULW$i852FguF97CTr0~PeX_1zUCV`74TmSR9jO@Cd1@S=g&Jk*o6cXSK{>%OmvoU zBaW)gJY_vy#~|u1H(eMq0z>f#MB;B&`bM5N&wAtg5;bC=$e+YaREp z5d=r6sHxqK>;FdC=oCA@)<6iu7NiE@k?s)bSP^)4}sFAoh31yYVr zo0}lQ4_2Z#*MkB>C*EaKYR z#hPVVv>y8VOZgol;9h+{KmWCZ9y=95()xZIn^aB&3|h$cfS}UYx(NtE8QqJC=G0^c zCqMl2nm z#>fABQ#8N7sV)+yZoYlt=HyS|+AyG|4m{||-DBPpSZhSBtf;F?M8?MBWGlpM4yXK> zGcQYVr9wojS#r?{u&9nklYwEDKGjXv zo#%+y6;vNB)}EiaUqncBSKB&^kQ38)bWp>T_MYJq=i|-2rLdORV>3SGK2C}R#R}b_&0|0Y`2PJ-ofHcTnyN?X@+-5TPj7Sj`xTmF5PYB1)_N-KqtJ5!z=dV~yP27cpZPHbq0{HCAdU~PP%tqt z4n0}~goHSNAahcfpWljyj0j6XO$}QtoIN5>E-*k@xFvXZcekfURuF{g0qc3LnCBe~ z58#10X9dgZKrkouYoBCmMMJ*WXPe(!O+e!x;o4_=&a@4lhMT2E}Wo6}kqutilR=+<(s5|yKFEs^4k5jP>Sy@?dkXA6OEeCoV$`fq-K(MI4xU`h;1cdCp zFMRvvqX)!Ff6Zw!1 zJiZwjGTa&B-r@FodU}g*hAx^K8+W|1@VraCjiAsKgQy216!;xCPK9ztEmBfL0m$DjXxdhlNt6_{u{z{0idy}h61sL$IZ)^A}vyHQmRTy z5ZevQCeO21G3C(dDYCzGbaed8S4vt4wes@19f7;-=n5KDoiq#Z{!U|9k>Q|4$m*Dw zjNt8UWrl_#>HXAUs9N{~gbT>E(>Vcm7;qaV41D~9FJCOz!G{d&NDUqi4xa&&s?Wc) zZ20)NVaQtcLa5Kmj~3FG#F*Xt`n6=o6TgbN8&gs$ZcgsI6bYlY>jqJa4R^AcGgO(g zMvh1y(9LxgnE>r;D9}&!^ax{v>_>~vumT-DJ)->qA3;IENIoza_xJTdxVRdA%vTKb z_gknjf03h>0OLIn#a=T65}TNq%%2jG5{r@S1zo)!rnX<^YF+v`H^|+2;d(2e^Yt!J zFPe5gU+wEdiM_yjHtWncI{x1MXWJ%Q3*<6C&~Nc0@x+!!bU*i6AImy1w8=5Q;{Y4E9fe z4BmksTc-*km&C81z{CVdWCVwTt&<6}XkJFpbr1!-QBzZMV@6I*X)yWl;R8rNy!!D2 zl~;xU3EI+;g+u5Or&y-*Q|2hn$Jg-sb>U7@OiYNb>AGC#+xIJgkp!k=E8hXNE$H;i z%#D~+QSYid;8C@;wf#(lE1jNxcAl# z!HOuYsEDAJ&FFd6c6FZY{)dttx!)?_KJsbQn1U%hJ;DbY<3$O}TXz?k*U@vi^O`MDoZ;J{!opu|>Eidyj$ zpwBEXXHx#O_|gk#+SVk-Qcw&A%QMo`g$u@>i%-aJ9Uk)NbJKvDiTcqU<=$1jkn;bl zb+3phIskD3^8EpQ5YXtX1rTx%9-IP2qrbnHk5*k)aBVI7ZU>FTBc`b^Dhur#5E;mD zzJ~NPH6ueG3iXRRXNJ|jFy32PDTXD0lDP^uSzBLEOG`U_^yBMSfrZ-?6vH+gX+x&m z@1I8rT1#?ocUQC^6uCeMDAw57e-`_3FchfYK>ix4Q(v1+LdYe_tRF_MB_nDJ z4E^2W;@i9RcS1$y{iIr8P9SM44aCJ!QjUC+);4&e?{4QA*Dfss)zfRLe_j8>!^9l` z<^ZCCB4GeeR-lka+_p=vrKt%7xM9pjA7n}#$+Y~cYksu9QrE@uc47cq)85v0eiOHN z>;>{Z6BNT<-oNp>@7~eW0ia`hJ3ExuB-lsmI0wB1NdQKdHq_M70f91ljufuE(*N1! zsDgCvd;Pe434+-ffqV@DiEo^kpU(!OxG`3Cb}U~jF-l5GIr48Em>z!Motpvic>7AT z)#UZy!IQ-hTMwP1wY4=s!7%T84s>&NHZ}@yMf6sMLy^mL6O0&Se|2^B;@YPZj-xEo zSNXW;NCJ~F^!Y2FsU8;`%yM>;d18BzQQ@ICE3o4E`};o-y-yGF`To8MwI}v!#r&R+ zFbZ?*j3c!bC{4lE&a$El=^twVsdLS|0XB}4U}La z+Ig}DVc5@2=6^3*0!wLEdJI{dUjy_Ni%RR)zcN&Jcaor>$n0Y7WS*tUV7Xe{06Ll2 z!{dz#wXCJREugYp`Pk=CC-i;C0Zgb}efGh#L ztwdU>>#K_siE)v0Jd}D`pY|mfPg8SqU0q$^&*;`)C%uULkrQZ!J0I-K0s{p|N6bk} zTVHow1vg&Gnwlh_U(;bF0?Eo^55DMWXpHXMWJo~l6O)pvDl5^@&=i%Fe7(J+vjkT; zSCj(m?W@bn`#yUIZicXkf`>jyil;qoo5;woQ*v_1QGn7`6o7)zwdiD8Kzwak=4~9z zvF?#W0PnedN3%5%lp#n593LMCa=^j9zUZuGd_G}eU;+RYbl^vCq13NUtog{X_)*R|vPOnDAv}ACuAdJM44=%XR!ohLyJ?+-M@D)&SVi`$ zEugajBM!*>jk`Z2cjuut=Epw_wxDPC6CFJ0D*7$Q6YO}F(+S7#ZN5y4%F59*j>Oz1=9NIq3)I#20+P0VJrnc~lidL> zYT*08w?UWgdN6S3<;C3=FIe}5Rpl1=SjXvi8Dkhk9b`sFV+7D)*xK3EOC5W(z}Ufc zRaI4mPxI!eU(p8!H*A2J&AgCAz8oYfM1tLfw6OZ4=ig{ifLmxtNL67*DF9fcYT0IXZnM9{6aYnt%LRc0f|D;|1 zwwW;@fpHUR(2T6fMG9G;jlKYrlhAdsR=e9J`mT_dP})w@z4sXwuB!ojIr;wkIXV1i zZ-0!vVx1-!goDP~WlVa*7=VxMMoJVlxFhDJia zC3xuAP5$lCEXmJjfYrmm2!Ef8^kW4N5Yi_Qo-e%_+uwKn6ux(I0e1*3$je(;Uaq_U zVJG?h`}fLB$Gq>Mrl$GX+3>=K$gmPa?yU`E4dJkEx}Qhu3}G)OiT!f;A+!?Y9FpOH zxyrY;8IsTmqUu4=>-4T}!{3`~Zk;zG;E~z)#BiZ(7p!A-ImKZlH~)X^y$4iOS-J)) zIYWU&K{80rIVTAM5(Fv9S&*Cr0m%r61j!%*0xC&@ACB!yY79jS*z)?ICbirefIwUfA9STgj0^Y1RXABW!~mTAiZwJkqL}OoHWB7 zmF}YmsflE~n5)ZyNz_5s^ZxTUR?9rRGfkgHT zDG_AUsT7Ry)8)3Uj^E60kUTamRGd*lIALhnKD2~y!@MV2$cw4yfaXY`h%i=wKSfZ& z+bT)V8CgC3;ZL^P8c&;#P{eehp{Fk|D}z;O7{xHaKdi5xLu99?<6N^6BOB-AR>JID1gqm#zisO~ zn1mvW6Vm*oi?vwFwqkdPu$475@S3d896>+x-JD5HN(!s)T2yy8oa?t8gW@kNEiDaX zq7J?v!MQ>B;|y-^&9g@}>LxG5?&;z(?7~tcI9VR0goLtZzkMz(y|_?&zpic%T;3rm zLg*+hEsedqk3&osa?VBuh`V=h-@d(2(r|kqpLbLvq3`7TsOri}0bX9BHTc6?Qbu>A z&n2ETs41Zc2XV0~X{h!=497;Y1~l@Z8e8pd;|J$#l1C*a`n!mxaQXhxQQZp{P!_@S zbntj<`5u{*3%Fe4t-5}&2TEX_exL{j5zM?a?8!meA3T>#)$u*%pSy{9~F6_=1O-{669hjSI8 z*vI$p1AtmFdBt!S;nC>(F=yD`$=Uf(FJLPLrNMSDxaWkS;?#N}6QiGp0a~rDLDW>u4w1Ge?;dd0aC8#AN8sZln2#c*5Q z+fl=#9Xh9yzvFqi!b6oz`&SKlrzQN@_Mv|j++ z|2%KY!PWsz&o(Td6sRRID-@^^;L=_Z+xYG7v$N@VrmPlbd(WQSngoNZ>v%05}ft%bAjOnzRAME!V+C+Ytj#}g`rA=J$Z6h z5=KB3GZcG}sKc_Nq6arNoPo2{zy-6I^IBR+ol9LEqowIyJ1~HzzcO3;2$3Rw=`55Y z+U&_4mI8N%D{X3F@<)@*37K=+G5?EA!EOzIQQdS5&J0gznecMh+A0m=UYlK-Ctk_$-*|3_|U ze{}pm2lV~J(f@5ga#2wcNg+{tab8<{dn@oj6OrJRu(btWG$9d5Yhh7qK`UF4e*+}{ z4^Q#0faHJrRR13U^!-aWG%%spUf#fJF@Lw=Rf90LO z^3Gp*=MTNp{$WJ_m3Q2{-Mk#!+@+M=oZURN0n{tYEc_!uqKF4lklgHCy{)_*-CSjv ze@6Hp?<4i?yxg39e!ed*Bmh7Bf~eoWee}}5KjgO~3|$?80`fa9(vQpe;iC1o@BNLU zgj8{Kv2*qMaZSSDvx(w`{r1IOeeCK!W&wmEX`mcfHVgi2(NG|j{ zH#8Ac;`^jlQ3F@ShfFe*zEw zyP*hpa3d#Og8_<*ifGpg!Z4nO;4*Uwg~&`qhB=J#s_l?iqw^^m)SSS28M4Gj zlA4Z=QH#xL$WzX5DJrMGezZ-)VEJ_T>5D9`+PR7Kgl+@t*39@P_4XO0_92;tswflcla@;>a4K?ZRApM0Z4*d>sdFZ1saqbi>fXvUu~mcara@F(PiTReone zPo%n6=fJ{KWGJu@({xfuj4YF;*l2e?N;gIv8Zb? z%Ev?d#>qqU9Q$S$@#y1LWO{{0waImle z!8J)=!OP97Ifs(;C}o$El9IZjky2u`RFPo(q8)>e2aq>2xPy1ZN4dq&=?vd*lWc*bFPc;NejEhCS_ zZ9P_-!*5OgL=kU#V%PXBT25H>=RA9JET29rbgH~k;UpNEV6%vbq=;XC{OzP4AcitC zhVDp{jI5Vj*-+#eugbDvBy4$MFjaKZZB!iukEmVdUtdp@{=mb_8JXj(IeX)o%gYv! z@Dh}NfJszb`sn><3N!p*i+(~kH@CNVy(%vhRTm-xJ7B9XtPP7Z;sETcjvVR7lai9+ z8KmPaJYgMNYFfU&>a6I)U)nY;BA1i()YgThgp+i1 zw=k7+7PdTdHV!)mDoaO4PD^_fEjDvxaC37Vu<^*tT<5aUc}AiWFkP*t3OK($_sB@A zmHyjcjp)i^e zH;z9L<2><|n0fEqXI~mR?z!IQ&=D8+74C7TFxoF9b{ca_cnEB3hgLtBBEhT9!Xub< znx>*g6wmToz5B2pG&lL`)#T@#SLizRi}(bD*&_oQ1C>u61XQutA)c3^N*?LJjBZ8+naGMrg|UQiBb~|rS;{N z;eX{QR5b5Z=+5wZb2C*2n}tzaS8rKdZ@1YoFS8r%p1&384AR=5jYGwQnv;OwDJ@S; z*!bMsq5IdxR-GG0JaX076H8&^X2Y$=^UI4(Y5W%6hjU^MR%n;*hn5lr__(`MGgT;% zH!X;(xd>~->lLUjDwW8Y559`Jf0=^k9C=Z$XULN$*8vq=Q6VQM*N`rVp@x^BC>e1M zWB^%$W_Lb)BJa&J9q8|0xTH40y=R8ZBbz2ROf@t~uE&qWN+tC40TZu=eGYFx%0=J2 zskD@unpPFAA$yMtPJ>LyayzPy1n(A~cqS+G&v1($UnE_Fr*u zcIM$iQtpl&ChVP6=Co!Dt?L1-6n9j4Z@3-AI7lYyPG=;OM>hf@wp}Bea zDAr{*R~=o}F%`YQz(brf7*+#MpFX$z=w;RDy{#i;o+!(2(ZCw;)KB9>n{7iUdLC{E ze+<#!RXW_w9#zU1mHqEkZ2_+D~;!4Zl zP*8f$=5URikDEuhSz9m3yu7q1>SRQ@v=}OA(@RJXxaenxDD9-9D=8Hcg^Z>{jhr6i zu=NQ0j_=prN0Aw?-H9$*vo&Ihi)3S$deB-|zHBNzeRT9P=tE%CtxX4|kRW^lJz0=s zM907YNN&k)CW0shf^7WI=|tibwkKrTxTBWSObAL&MXYQe_~!xi6hACSO#1dppYdcB{MO@j2Sf& zxzwq1WLSAH4M9B4)y3ud*PScNsNYx0y5ViahFtHewJfYVg5Z?;Vs5*$1B7f z^d^Riy!cEWbQktdH7bHw33YOqC@J5N+>U<7n|S7U|J@loF>z7t-7WCF>Z%4@`xJHD zfPUxPTuWJv!NEQ3tF9_rAD`uX=aW6H^M?I2J^{|Vm?Mm9J4;`^ur3-I4sU-s2Bo#N zcjF`R#1B89T^ zY5~&0vcVtbKus?*?lak`PVdh5?<(4^`uKoCUTNv0H&%)407+Wh=h>foSq-XwbH$_e zm6h%qwyaLDVGP@W`l78nhcPo-&x|TYh=}bY9*venbwW}gJAIl6<6Kf&TCdIChgSiR z9VR9WVpKY_!BA;vWCXS4?&!#w&e&;r;@Zyl`Bo#qyE#r3@Ev`7yT}5-W_z0_1~hr; z=|)}`c8lvSOdqw>R^8ifJ~NNkw?;#aK)A1d$}~Ta3*2&_Yw%Ei72x~vB>2rc6m-ELil!g^?(JKJm`-QV_L9?JVJYayS#!tUS*b{1;6}{u zmA<%m1aQIim6dMivS=<05kbMl(g$--2eMz8nFULDD6x_iuQv-aSpmZ3+QFX7Oii)H z^2u5zuA%lXAwTXJ-LeFjGTooGB>^ogTvt~&R9928@>H4HfKi8jE;vtNPCC&3peEb7 z5kk|zYBCtjz!qxR0CbGaQZaBujI^Q8Mn_89gIFT4cmb)NK+@9{VLQ_7`{5$pqxMS$ zC2p719s>N_-gEH|!S_?SMQi{%T^q^_f9RPE!_`%ml9CdHUOO`Y!#gr^el7vDQZs~k zc${A~`9N>(xdcLNlGD3%BMLcljn~yOqXtO|Toof3DPyg?f(NMB0R9)tOlh^4@o?X= zs+O)29=wOocMvfCHm%7`|=<8493NBJPZD z*yLcz5{+ob%xA;z`5dXRauL_y1LcgT7t7$y26gp|VgZ~LbG}DtZEp5r$sYL89_w1O zYsty0lFu?7b901uGlip$eW{f!)f&6@!~pxYd<2@KvSzCL$f z6P72Z8gWk);mu5}Oq5@fjP9X9DwR&|2q&c|x*Hf7%|5D2*BqQEx?Z=a-+|R-CL=@| zJ8T~t6LSqr%H%byZ&LzN`0Zi=)wnRh-nAQ?GUOt(IH^5nsT zRZ7JT0zNWRt_I77*eHLY` zOJ+n5;-Pb-b3GthSYd~86SN8=n!9ekiE~bjLFUt#e&-JCPcx5vHO8Ce)*g{sE9@wbF@X2HpQ>P4NZQvM(r|Zo zS69bXMkD-58=b9$;m1j|G{0d zt$liGY7S0L4+%PkYk9FNfDpaBVS=nG69x!7fJIm`va%qS82h59Kk?ExWu+pZrvb=V zC1x5m@nR0+{uorn02~J##AzvS+}WwBs;bph`~6Va1wiqQVm&Aa0+y&~s&wpueJgUh z;)=8L%K0<*137_71ak*4L6&cz;6TCTJ|DlwObKK9@=dLXvNWU?QATXR1BA-yB&PO< zxw-S@*6=MI&Cj9MAGWVnyLrF1_A{XHoB>@G%}47c4~!MxI1F@j_A_Tl7lZ`_blqPZ zKD73byW72UzkPE{xO|=An!!L002)5l&dAr*`_d6BDw8QoD6F57#|Z8eJVs)bMOykG zt6JTeEk6}zRhE~*LVJU{S=x-_=}9~Yf0Y^ra&Tj&9=>z zl9bfRzWpHFG3rX*r|&&v^z^S^zI>N|{N^^mTtQJ0965=$sOK<}o!@S5PQL#PxLDdY z7u=adN8BH`du&rNu%aWe%J8>V2CSOYUDs>ZXmX<)@0_NRrv)aPww6|l|L2m122dcJ z-0k*+zzQJdAZ#<%H4;Wjt^G{l%jEc2a#1&KOxwb3|LlC()on;HQVpZ-J~pCL~0?dW^=Ln)>^oe5zrO;@%Tf_F@3YC&T4-*Cc29*Y(hS^;S82L-H;VyXQ zpesrPpYZQBkBs~g6DqBtRlY{`&FAi<7vZ*MA2)NL#6;;&d|2YkR744i-v5WNq2vv^ zql@w6{bc1RRnZ0()dCM&+iqrBUBYuqPeDvLLOQJ3&%%RDF$JKwoB(^ObPw@^ z=+d*JD%P*a0~|+?@(l_K0^%n;O4B2hkZz1upn^leS$BZ{CJz_@RiHQIgcyG2+4kG973rR}SD8J@RgWQ60&#bEhI8k^9f|PU&P}#&*!JWLa@^XwIcHCoMz4-i! zqvItrv+wPw(+INq_$;+kX`VlSJ}Br2XfNjGITuSmpRWS`v?n_nkQwms@OE!eUd2-O zn=3Nl!j+Vjy({}3h$WnyoJU7T0J4KAC{^}{rX{?u;cH_c52~RN)3vzYk734&gM%Y$ zGv9gB?k<|nWtj)0TH4w$;vZ>-u2|y{62j13XabpYpnBQc9DUqb4habX=+r{l(vr1U zGRy%kTo49zVnCO*h)Cut1qH3Eo|D4Y-s=$ovnAXXmDqelgk-yKM&-GFgNz9XiW$X z=Ek5*N-rd1?T{|Zu@BVIk7BQ%9Dje3=kfyuzjUJ5>5y>4pn5$1N)$Yfeg(ygJ!%>t}bb5X)~k7dN6PUBGly6lz6+1JBilgdqCrCD3RW|Ngqy6lc)76V75A^xk(vg5A1OB9vva%#r=J4vLPu?wv zp5ET2*=bv#I3U6`W53V?xuveY{@7a_dLy9aZ&px13bzQp^yXBPy78lnsP?tM{sj+> z95qCNpY=iZc+VI{%KH$h-rn9yn)0%uw;$HCu3IT8hwvr+xKa-Ez^Z;UGJ?gIFdSlg z!em`^baV_24M{Q3y>E9Th!dMsNkJ{RTfEo4T9I)&8*rFeG(W;cVflGFlr->WM;&H` zjKBaPd_vZyq7x+#tmKWXf~B&CgQ+m^Y~dmbeOe(V!5$c9(87{-IRsAUlL;r z+C?5WTgW63`(M3!h1=WLx2+7^J!KgIfsjMF%N}goP7o{ttmz(RgQKX14bC zKh*)#3Il_QCUSK?$`)9q!Cva{fCUBsxU#dd9_D`cJaDu=Sn?yxQ^!(NL7YtWW9r2T zPgIYYT3};U!Hqy@Asi97{TM1w&ys2gV6v#jo@l*w5wm#Ou_JU}?0%4kj6sYA69{f=4tW;_-MH%L@LO8U%2 zNiOdI65LN2`S)Tk<K<0(`<#a=w&@c%H zZNACJDabYG-C)v!F%qe+uHOFRYxas>+Njm^qkA&-6I&nyuV06|v;?8$d%Q`HDgm7h zWLlD^gw6T+OCZS(T**0}`T%!#fs6SrJe-`1*+|n17g&&Ab0T_(fym-eI|JjInEvkj zykx>hj~+qngWl|wyM}3$UQPh31Xphz+db)8VUQSM_@(tUp>LhLp9Rx_({;{~Sl1DC z?H!#j-hZyV_YCz_5I7VRLYkWcU}a}5aAze3rz?PrQd(G4)UMXJP4X0!-4IY6iybMG zzb;2Pe&|G;PacTCvhLe=VkGE~WRwoH>JShSF}SD8k$P_WF$HB`bhy zKDuf<9Zi6J!`&L6pgVpHdn@uReqtqJmKJI)kyCnj;-aDy=g=1IGWL!n41S? zu)*8=UZTO%y}eQ^%;ig5!UK8z5HiU22qJIb9f{}^VnV!~BhiDzBx zWI??u1UefmsdCUD2$hz8zJ=+w4OT>MNoXC;0ahNL_VKJQAg#Wd2}SeqZ0!1en4_Vl zMqapJ^N@FA8`)@8h4hv(gKkcYK}fhrF3q=OvELb12(1#SL`q3{gYzXm!3UVueEB#p z@BKFMdmZBu!;pQoY5}YdW#r@>-TB*nMjLj*I>FtP6cI78w2TbulP6g&TcN>of@GTA zR$9s}A%UWlH2C`Z5>W2CP;;d|?d$6s94sv?jPP0i>>n*gk3zA>83F!y4-{xXHbgCf z9uV->clYTIzI{{Lh0=6tw;v}EOKn<0W zlG5Cr7E*ArbaHcZGmLIKvS(lb?=vgm99*3pHxCa7EhB$61HWf*usk7fa9=g{9LkeZ zvnR(?gS0picGt7APg`3H)(Wb~HCXq7R0))zm((vl^+%13=^3zFJbID(#;ybFva^;J zSn8lziSJxfFx>JO8WdSjrgkAZ=KYS$DmfQavU?P^-2VNOA52R|U? zL188STA;=3Ct zRC)drzl5PW5qW@3BQ7!V2-v}#G1S+8ynXJIMZMd+YVZW`kV|rWterNVPfzzd&Lq%( zwG=spn)t~55*D~&T?f$dUZPSV#8G`1J$qAOy8p1Qbs@zi_hNn?o9 za)HzpB=2G3!gcNe_$tc#e{zsb2&AT`hpu;#t(1p-w~u6eF4D^Q%BgQpVSUG~`=V8? zG0?&=C6@>YZos@2KT@gKpfl}ZCE_{Gb1MOAkyF|^#;=Md;|Xa!I{p?Ko}O;4R7WGD zw7$SYNzlZUauv!zSlZzv6cC6w`6Kpu!uWPq`GeSjOGeqLr+6tW4d zp8@!BN z=$o0n8XvbwA;iUI^7#2ySiK)Cb&C&#Sh8~SusUFFCs%gvG}|VIRZdJzeGRk+BVs~zH+Fthe|K^5GP2Cy8SyjMt5l<7AVf6K(TOh5it+ljn z$waboaNw3aUL_BcY%9HN{SZRiLlUjRfHRO{UjiP zPBJXNKj^r#4#%P$HY0#i1jh#ZS>giM^2{V}ei#1W8SECGebp`?Pi%epa?FaIPe3rk z@Wi}rHO126&>v=8OsD6ZfpQHNE3midyD=TQL?@~Pc2?a{CMRwK2d~ZdBmK(Yk1r9` z2nv$B^-(^gP(@YsL1Ez>TOB4{t??sQnC+}Y^Yg%jspyQ=0x({9bgW+1I#Esd40F29 zLuIkGwFR6LYr(Y@LLiww7^d-S1@qUtOX(Ppz>2h5jURCj4u%noOlM?3Z$|HQUD*vO zSqQlKtcX#qta3<50SOBNe;fF3J3YUBdZ%r|l;Y)Z)m!Qngr~^d2cy5IgMYbJ$dpZDp;~{aY2vKK7W3R*d(VD z9pzEHw{Zzdbt24sE*R99&uHHnx%rt0@PQsR z{3j+T1i!^4;kOyTlCzzi?LYmivYV?nUqiTmhpP3h$y1AQD?g ztABc^F6zobTT}#fi~9U1te}sljh&Z_4F6d_Z?y}6O0rIoP^VILflvH$CJlHE3r47uYPbk8ivGL;4HqG3yIBU#{tAR-B1DNHHUSJUo5H?&)OD z>%;HF#jzB9H;eP%GvYZ9NC{uIAE7&<)0TT>Q}a}fdf1hnL7ZB9d@Oxzg_(P)&p|KG z_anQngXc-v`*xwP+l~dEs1%S0H<%qGJ}JwGyv5P77yjO{;i2N-bDLSol#H=+E`&7R z{>~UO505!V_&}~HE3Vvi(JJ}CrBGx@yYQj|&*W^ymywmd9sipSZ=Zy8Q?QmZ4%A~O z8)eW{oxoCR(CU)C)wU|6ocq*|6K!A2GedK2EGcQPu`elV~7v!{n+;e zJ7ofIl^&5fno)RQZs%iT;_wxOd56&VzU6HS)M&td!Q<4#ougfAdT>j!Za~7p*gCK+ zHC8A_D4JbEc(zbd@{Y)TzP_-lm0Hg);Ca=@q?QS}8k1Buze*L?d&G2IS@FZn1qBz5 zt!V;$xrYIcI%v{5iVOa&mZ!^dn$}jIWD3@Dy=Y6odv*iw`TBE<9k(I$Mvf&jQyHR_ zF8M(m0yFuA{P1aUoI5oJJyr;<*Nl?JwZ;z^4M>zyHGM-Ex7x!-EDydN(z@ zBin`XufCSAYuT5P%sNRQ>RtS*GW+trVsKLRJ@w5;E2hOC3zZrRe(#-7N0eNQp2IDc zjw2~X@Qge46g1$3e;Ui@BLCd{mj`543b)2xH^ zP!{f9iRiU7{*x`e=<-YLdAHuQoz0|4+VqmWSVz^f8lt2!9Xek70$ct5%Lh9ri`4JM zXMJRSfpuOxjv)H711xQPmY!VV`7|>mFSYej!kAF~E3(PFknUS~)V;Q5iHqN^n3`@@ zocFS3u&a1tgXU5YrW{%9>pRZ-VnI~#S#@B@D^fA+gsM8M4^NrVcCE}_RId`x3@z(s zVe~4GU#@r@*zI;Yy)jel*7W0cfe&n_>$L9rM_CMhqG4|<<6!*8R~k|=;aZd@ptXsG z6;DnyfjBw1bqS}hieQ)gDq?0S>qxZDhv5uf)@6S|_0QP61shRaKBV`bzo(5yMi$$9 z6&CM3UDUOi-y{sU?(-mYUR5GBK`)d1E@GK(IN4zvV{>ZTI*yEH^UCq7F)4!*+$NIN z0`0tICx&~kQm=alxp~VuaYdAs+AL2Lsm;^``=kp5z9ZS$0Ki~?2k*b(}><$jx#TJ1R7`y&tDDb^@j6&fosjmr`$7vUi<+Qk{t z^G8h-PBoI=oIQ~+h(^=%UgpWAB zI~(zajb0b?g@+&j82LDe^5n;{$)a8^_K|+|F0y(|Fhg7Q7KW;|HS<0 zkB$F8&;#Vbkq_)=2iK{lSk8G`gf%K~dgv_t3q`z4P$ue8PtkzBnJabTFC4OecABT85 z$ucXV{=kUT)@4+7^R#0W)?_?IlR13-wR0HfsV%jYZ1=jM5tUl2BA_yvUc!MF^L;Ptu& z)Hy$1S1* z%D?8Uic0*)oYfzR?>E-mzvry}&N$_N!2BrZ&zc|o@IE?m!d&@pK0^Oj&5!FT9O9KuC1Ln>wf%2s)CDqe(XKl~A7jPJzFnS|rNX>D9 z>vev)af8FtYMum@xW}~vX@zqPS>I27ufDk1^h~SIt?gTDrWId?)!V3ta<7Bhj+z3R z=7YX%3fge|{-;+aaDU4L_Nnl%qY-W2C9{pL6A=|>8`6o6zL{}a_)b!iCp9(8O~J3! z)8yB=o+jD)E(waLZxATN(PwS6xNSHWs}$2zZ$(MIvkd`)nH zB^4Xno1#K}G)Am`^IP|M)r}c18JKWzs)?rJpWswjx8`x_FeIQMb!;oGj)iY3;!GdZ zmcu5F0gfvpuCvRwXh~f^CkMw3La<%%#He8lHaQa7etf^pq$J5N65qa*_wLSlGYx-{ zmiWC%4$i1JE)4yT9BlXn^>qreIda!`7Q2Gw0{8iI;b0a$lL?nV<(kN426~s5pg$TK z8Vc&!u+{5PWM7hoq} zdm{EDZrviZ9@5GF`0=9~Y+aM%Yu?oCUkfPR0|`Md;L8AN`Xswn|I?wc>Te1@AS15N zUNKj+w`n9q7}r z#~Mcz7kH0@n|D^P0Rx*-$?ncfV179PZ_L$;JQh`#ztCTmGPq!dp)v3>d;G;roz-`2 z(5GE;b8(EkRm0$FbgBCcg@qBq=0(}1MDm&#g~+6KJgjgF_T_Al70k7m@pro>*Q0zLiDCCZfm!J zm&~`wh2|f}_G_qXb%szb5;7l^Jmp%lcx;Qu93?SEP!K1vjCh7?d1145Ow~tGlQ5h7 zR^0ttq&*8N3g4c_D_bwjbv2Otf1T<*Z+F zM`!qaZ*LOQ!?XSx@xmh}tddBH_>;b~Kv>?y>004kv|5aQ0w7+q-L#MNa{fb$ENrQD zSWW~l3weim@6O;w0-~UN2D*W4v;$KyKN*Fo{yqgDKmh7yND0Ur@c}VX3>?G-91T+a zx99I;3r&>+Ead8GR$c%mYUSw@bJk8#;$qcdC^^~esb1Y+%I)Y81H`&Gi7HjP@t*z-8HH2Xa;;yq{l)0(zW;TN%&pxOp{4WcJ3Fp zl$p}r%MfuS+o(ADl)8Fl#`_)-2(iDYu&^*Pi88aeq{m5)uR*^Au#UqogQW6_@eR|* zYSF-t9V=%JBF*jUjlsaUBq(>t>nXLu$Hx~fG7SRjC`D;!hoSy{g>}t!;AmIW6p~vo z`9F-(693vtOSIxl)H_hFK-k^u$0nzFbnE&dV6qm{$WNUzHZtn_T6nJ&ZHgm0Y09<& zlwcKcFkCo!cqVKPglC@nZdTy$apg<}9FXf^9i$w!l0M=+Ott2x*%<(ij5FJ9b<8tj zj0YyIam%y=C(;roCR9x(eC`negbG0Nw*?sWws$|X#NZ$=8jIOIC6~BOp^TsLEz?OD zU{qMSxDq{`VM-HGIK8)MgfqUe^{{o5fIKtHO5&F#hw!VUYf=ME1IcHkB_wcJBKMit z=Y3PUv^>u|H!(?zN%x_1ZS#C5+*iLQGB1ON!iFrBNJq6|fwAtR-zvYCok-i%UsE(hsIcUOIi zG&vzuJ0Elr#vU@;IBIqtVpbuwY9o_8B^+~R&^h~)Y-u!25=&Wp6z?RKS>xm1wCbQg z%sh$GWKcJ5YHp6Z&#Pjd_(Z|VeKNnWkS;Q!gwe)|AXcv?5~P8{NJ@AiC@Z6({>MV@ zG)y+MmB-Wyd5=St5mf&H7&z-B)@~`lYVY^sO^(XjZm(Ou_B)4kY}K$$ugrwee-3i; zCiLIM)Zi^oQQVkHrfHM4A0X`n2yINI1wULnlDFQJ80cg3jD+IKF zv;pb@d@}sr?m|%=60_W*EuOb7`1lBig#IuelaPF|oBKk-h=irnAY_re?EN?*A|ePJ zhjGuGUEhA-|7$zU=2C&`gB6}z%64!v?nUl zX)yn6Y`66`*l++(wo}3iD3PB5FADrH1ddM}V!^=E*H_+Wom|ObsXJzf>HcFGY&@Wah03@lc;7nK{dM0(>0CfgYYjQXS4)H>r zy0g~lo2O2V&E2i878Yg#m{-&BC}{#f=y8S6n-e2X+b2NJ;+H!zKO}w_E=ea2<5uDErkwa=G)B9<)ci(t6wzai^&kG`~?rs%tCIs%zabHkoWOvnlkHe0l%@j2s&hK3?{m%I%J2U^=P*6FKxsJOk9136^`ciVc5(w zTwuyQeLrbnw&n8Cr%X<+$*awUvn6$H4BB4n(vv=|~svieL;l!Qghzp!_2$u~9BCWoTe6f$L=Hu8G+gIh|?} zak~0=ZKV-SF>y{Q1C3-FoQ~x2q%o3PgX_T!AXg{^Tb?)y6HIANE}+d$Py6Xi(`0;- zebtFi!JhUkR~~#o@;WNa=f0m79W13OhSH zC|iTqSZS$~v9Yn2S9L1(w=6b!DXCLbR8fR>LYMsf{J@1J6+202h4R2wr(S`jO!uoZ zLKE=umX>+sdn%BrfIbAs$t$%@ZEXyi)8{Zw`wx&15`sk<(7fFMI_&6J48-m;XZlWI zXwZ4aUVr@1L^oI9i9l5zFCx~Q6>OOsp*Jr}^bQXW?tc12h=-^6vONr#ohVNuhQ#BA z1x5m>FRZH|*mdWYfDmoH#N@o9Ir>(zq4=qYV*Wm*c;0%B$NW2c>d z83?pJJy`RmSp7t{B~ud$WKnb0xf#9$FYL|CPM_~e5@Dl!qV5WG$vvRPx)zm{Z9w=l zrCWyHn4eQzR@S|4-vMQva~6110N&n`j1sv0eEj@sXG1qBh6?7ROhV2-?9vXo-C#bK z50Kks!YYy(QDRW1iM@G~u^y;Cz%=Smc;K&1#Ol${yB9-KufPL(6P=O_@<9_E{FD4?g0@I-zH^f9ms~GE*n25-^%6QWU8_U3^3W=y42E&Kru+>-S z;a~)Sjfp8CEqzCbgdzI|-PKKq@KN7K+v|a+yr91t;6e<|Z2goMfos9zSNU>PUCM`m zp=DSy&fUq~)iu79uTtsZ!-rUHVJ5l*TP*v$M`a6ArYw*x^Ya0}y<~LYfnu8!%aS%m zO6+Z{Q#wSrL`qcU-4NW}ie5^4`}S>44t=e099A?N131(yQBz@IFF~yekXD|Iq$IHF z6_A%tXuI(UL10~AU}2H)94jDyXh=&1=m=o^;L!m#do}@i`*6IXn~BM6(A@LM$;ey< z{z|$XKoQFaAIZEw2fP~>HN$W-lG*ree!JGGRmS@1Grg{oMaWOs^$~Q9CXnoHtgV5K z1t{Q3!;Yiq9zjpL_+o6pt&%4=BxOaR=gP|K`Dg#?t>7~!D`r)&)3IC zTT|1?)wS-qLey1)W;~%xt$VtFNj4GVUUC?H=Y8(}W1!mio;W3;qPx+;gFVlSBDDnU zl~q@J!N3m=ZhO_l22N5XC0DGh6dzq&mh0~6x#XBv;X%*})Cb^x30$JozA1qZym}z6 z`uctWKK-%FZ{abpzVN{Vx!@x@+GKDggIcKBCl;{WK)8*!nS6iRvz-OpYst~JV=cwEO$$(0>qq~_y!-VIM_~d7xG;Ibl4KQYpx=`WW zS&n{^z-v&)B5VN|*+FC&oDKJznr8a?aGIG6uo4*LSD|l5a=&o2vttuu;Q@M2y!JSl z#93G{Xmy4`RR<7yp+bdAvtjo6N0Jl0WN zpixM7`Oab+d#T+N*S>F>7hH8ZlfN$Y5H$M`v~$zfb3?iV=y!2(4A$34bn`EN95n7Z z5aQyt-?xOS*%NOHVK!D>~ z;ucVqg0COEcRT*3y#=dJW~KS2wo< z@&pFf;N*F&*QOKm+(5`f-0G0oqrLR{u!M8PN(*O5T|3S_7068AgAw`f6PD|rBH$Qs4v@M*I#B=f{VbdZQhZ6G>^!DI(U zw!iZC5T8wmbZ^{#M!KyLsTvc3W&B9=cZ(+X^{W_fvfUb7&#bK#oe%>yfk1MjOQRi3 zm;(Y1d`)b?OVUg4n|AT}g6~JoQ*$^`xF9f)&3H8)2ctTq5ivwO&l~pHsUCu%%Oh!} z$L;if2S7BNb8*g?=u4U0j@DGZt zCtP%4WOgv8`Vo~7X5a)y18!PO_#Edezl3T{V2`#hZWke`f0j*NgCip&7BWYNN%A~5 z7nTk^ewuXQAp328nsn8o-1w}B;0%gLl)oMnW>AHRox8`n_?)F45fLW@j%lKzwahe$ zg!)TA-wKOtX>C0Uw^b0Tdy@u<4klcgS~tYVq(Au#9q&1nYa#O6=XMH!1Y|OefG0vq zN}50~D-`Sris}+jX|STxTX2y?^4d$0fQzEP2^}WDDzn5 zwu^@hDJi*12Ud!MfoX7JcOnNztcoewaGv%p(lACVAEuk=;k0C;ss%-F3As*TP*df- zRKc`$)D^sKMX!SsH_&hUI$(c%$ZZ#=Md#Z{=|t%V`?20D3qktD*-~FFP8K%@zNh2! zSU;WqO4msfd^bTl0n`vC@7zrw!pHaY@-k_@%KN=9rp_JeGfDqXAe#8G{qD=gr~d8= zE{k(up_G@B$|!cQT4a z*?_%U8DLqu?|#IN5lEop>f|)rCizTAk4;y!|9ha3ryu)tNALOwOWc!unz zOYIs65bkZx_E|pmn|@UH;T0?!qpa5?SXQ$xe&#)ZwAtu&rnlUznV4S2;k~jS%W)(m z#6>7&HPqED#h}`N*?NQ**e;gs0gW>GAsZXpJ;`&^b*)*2<#lyeqm`wUWP%Ps$b}oE zD;y0J+j+2;j>pjrA|H%>KC3dwBS4k)lE%OUs-6B90unme5+2zOu_v$;tjOD-=6l{< z$#Hj5oOsl0rp6Iw08=gf&s#x>smbTPfZqWylSLn`o0OE6>IGa}Zn?G#t>SzgNa>ou zPktHg4hufXxt8uZun6GZ+uaRK64mtX`F%~0r+~|3zHu+GHs03OHZO{2(_G+4n%RzXT8nyy%nBE@7|kx$&yc`nx*E=UHr7TZ%J<^#>c}uuBw{6juRlx z=RLiuWV6^Axh^|+zGklT;^&SlIyI4P$9Z4SCvi$1JB%?8UL1a44z}FFrEl9$RB<9F z(?I$Qh@>EvQDDG&{xBv#KmW%5q?G60#!C>|GHna`jw39e#p&&bD*~J^|55GKIR-_^xkzSKN@;Aj1CQF% E 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

Phf_!`cm)mjg@=!xv_%(czrwmNh&_ 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 fr)3ZFUV&*721m)l!jmcN8xw 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�BewIm~1i1qDi>|wQD|Q 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≦`0o(@JB0sERu3zfUsRNu(xa|rA`ieJ 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 Y&|?BN{_*!W3tm6{caJds=Lh%wJ%~ewUjP6A literal 0 HcmV?d00001 diff --git a/BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta b/BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta new file mode 100755 index 000000000..f2fc81400 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: e3265ab4bf004d28a9537516768c1c75 +timeCreated: 1484171297 +licenseType: Pro +TrueTypeFontImporter: + serializedVersion: 2 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 1 + characterPadding: 0 + includeFontData: 1 + use2xBehaviour: 0 + fontNames: [] + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources.meta new file mode 100755 index 000000000..cfc142f38 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 243e06394e614e5d99fab26083b707fa +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials.meta new file mode 100755 index 000000000..8a0111247 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 731f1baa9d144a9897cb1d341c2092b8 +folderAsset: yes +timeCreated: 1442040525 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat new file mode 100755 index 000000000..5bc142c4e --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat @@ -0,0 +1,106 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LiberationSans SDF - Drop Shadow + m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3} + m_ShaderKeywords: OUTLINE_ON UNDERLAY_ON + m_LightmapFlags: 5 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Cube: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FaceTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 28684132378477856, guid: 8f586378b4e144a9851e7b34d9b748ee, + type: 2} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OutlineTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _Ambient: 0.5 + - _Bevel: 0.5 + - _BevelClamp: 0 + - _BevelOffset: 0 + - _BevelRoundness: 0 + - _BevelWidth: 0 + - _BumpFace: 0 + - _BumpOutline: 0 + - _ColorMask: 15 + - _Diffuse: 0.5 + - _DiffusePower: 1 + - _FaceDilate: 0.1 + - _FaceUVSpeedX: 0 + - _FaceUVSpeedY: 0 + - _GlowInner: 0.05 + - _GlowOffset: 0 + - _GlowOuter: 0.05 + - _GlowPower: 0.75 + - _GradientScale: 10 + - _LightAngle: 3.1416 + - _MaskSoftnessX: 0 + - _MaskSoftnessY: 0 + - _OutlineSoftness: 0 + - _OutlineUVSpeedX: 0 + - _OutlineUVSpeedY: 0 + - _OutlineWidth: 0.1 + - _PerspectiveFilter: 0.875 + - _Reflectivity: 10 + - _ScaleRatioA: 0.9 + - _ScaleRatioB: 0.73125 + - _ScaleRatioC: 0.64125 + - _ScaleX: 1 + - _ScaleY: 1 + - _ShaderFlags: 0 + - _Sharpness: 0 + - _SpecularPower: 2 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _TextureHeight: 1024 + - _TextureWidth: 1024 + - _UnderlayDilate: 0 + - _UnderlayOffsetX: 0.5 + - _UnderlayOffsetY: -0.5 + - _UnderlaySoftness: 0.05 + - _VertexOffsetX: 0 + - _VertexOffsetY: 0 + - _WeightBold: 0.75 + - _WeightNormal: 0 + m_Colors: + - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0} + - _FaceColor: {r: 1, g: 1, b: 1, a: 1} + - _GlowColor: {r: 0, g: 1, b: 0, a: 0.5} + - _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767} + - _OutlineColor: {r: 0, g: 0, b: 0, a: 1} + - _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1} + - _ReflectOutlineColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta new file mode 100755 index 000000000..fbd2cdb60 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e73a58f6e2794ae7b1b7e50b7fb811b0 +timeCreated: 1484172806 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset new file mode 100755 index 000000000..e907cc735 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset @@ -0,0 +1,343 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2180264 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LiberationSans SDF Material + m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Cube: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FaceTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 28268798066460806} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OutlineTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _Ambient: 0.5 + - _Bevel: 0.5 + - _BevelClamp: 0 + - _BevelOffset: 0 + - _BevelRoundness: 0 + - _BevelWidth: 0 + - _BumpFace: 0 + - _BumpOutline: 0 + - _BumpScale: 1 + - _ColorMask: 15 + - _CullMode: 0 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _Diffuse: 0.5 + - _DstBlend: 0 + - _FaceDilate: 0 + - _FaceUVSpeedX: 0 + - _FaceUVSpeedY: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _GlowInner: 0.05 + - _GlowOffset: 0 + - _GlowOuter: 0.05 + - _GlowPower: 0.75 + - _GradientScale: 10 + - _LightAngle: 3.1416 + - _MaskSoftnessX: 0 + - _MaskSoftnessY: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _OutlineSoftness: 0 + - _OutlineUVSpeedX: 0 + - _OutlineUVSpeedY: 0 + - _OutlineWidth: 0 + - _Parallax: 0.02 + - _PerspectiveFilter: 0.875 + - _Reflectivity: 10 + - _ScaleRatioA: 0.90909094 + - _ScaleRatioB: 0.73125 + - _ScaleRatioC: 0.7386364 + - _ScaleX: 1 + - _ScaleY: 1 + - _ShaderFlags: 0 + - _Sharpness: 0 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SpecularPower: 2 + - _SrcBlend: 1 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _TextureHeight: 512 + - _TextureWidth: 512 + - _UVSec: 0 + - _UnderlayDilate: 0 + - _UnderlayOffsetX: 0 + - _UnderlayOffsetY: 0 + - _UnderlaySoftness: 0 + - _VertexOffsetX: 0 + - _VertexOffsetY: 0 + - _WeightBold: 0.75 + - _WeightNormal: 0 + - _ZWrite: 1 + m_Colors: + - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0} + - _FaceColor: {r: 1, g: 1, b: 1, a: 1} + - _GlowColor: {r: 0, g: 1, b: 0, a: 0.5} + - _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767} + - _OutlineColor: {r: 0, g: 0, b: 0, a: 1} + - _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1} + - _ReflectOutlineColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5} +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04, type: 3} + m_Name: LiberationSans SDF - Fallback + m_EditorClassIdentifier: + hashCode: -1699145518 + material: {fileID: 2180264} + materialHashCode: 462855346 + m_Version: 1.1.0 + m_SourceFontFileGUID: e3265ab4bf004d28a9537516768c1c75 + m_SourceFontFile_EditorRef: {fileID: 12800000, guid: e3265ab4bf004d28a9537516768c1c75, + type: 3} + m_SourceFontFile: {fileID: 12800000, guid: e3265ab4bf004d28a9537516768c1c75, type: 3} + m_AtlasPopulationMode: 1 + m_FaceInfo: + m_FamilyName: Liberation Sans + m_StyleName: Regular + m_PointSize: 86 + m_Scale: 1 + m_LineHeight: 98.8916 + m_AscentLine: 77.853516 + m_CapLine: 59 + m_MeanLine: 45 + m_Baseline: 0 + m_DescentLine: -18.22461 + m_SuperscriptOffset: 77.853516 + m_SuperscriptSize: 0.5 + m_SubscriptOffset: -18.22461 + m_SubscriptSize: 0.5 + m_UnderlineOffset: -12.261719 + m_UnderlineThickness: 6.298828 + m_StrikethroughOffset: 18 + m_StrikethroughThickness: 6.298828 + m_TabWidth: 24 + m_GlyphTable: [] + m_CharacterTable: [] + m_AtlasTextures: + - {fileID: 28268798066460806} + m_AtlasTextureIndex: 0 + m_IsMultiAtlasTexturesEnabled: 0 + m_ClearDynamicDataOnBuild: 1 + m_UsedGlyphRects: [] + m_FreeGlyphRects: + - m_X: 0 + m_Y: 0 + m_Width: 511 + m_Height: 511 + m_fontInfo: + Name: Liberation Sans + PointSize: 86 + Scale: 1 + CharacterCount: 250 + LineHeight: 98.90625 + Baseline: 0 + Ascender: 77.84375 + CapHeight: 59.1875 + Descender: -18.21875 + CenterLine: 0 + SuperscriptOffset: 77.84375 + SubscriptOffset: -12.261719 + SubSize: 0.5 + Underline: -12.261719 + UnderlineThickness: 6.298828 + strikethrough: 23.675 + strikethroughThickness: 0 + TabWidth: 239.0625 + Padding: 9 + AtlasWidth: 1024 + AtlasHeight: 1024 + atlas: {fileID: 0} + m_AtlasWidth: 512 + m_AtlasHeight: 512 + m_AtlasPadding: 9 + m_AtlasRenderMode: 4169 + m_glyphInfoList: [] + m_KerningTable: + kerningPairs: [] + m_FontFeatureTable: + m_GlyphPairAdjustmentRecords: [] + fallbackFontAssets: [] + m_FallbackFontAssetTable: [] + m_CreationSettings: + sourceFontFileName: + sourceFontFileGUID: e3265ab4bf004d28a9537516768c1c75 + pointSizeSamplingMode: 0 + pointSize: 86 + padding: 9 + packingMode: 4 + atlasWidth: 512 + atlasHeight: 512 + characterSetSelectionMode: 1 + characterSequence: 32 - 126, 160 - 255, 8192 - 8303, 8364, 8482, 9633 + referencedFontAssetGUID: 8f586378b4e144a9851e7b34d9b748ee + referencedTextAssetGUID: + fontStyle: 0 + fontStyleModifier: 0 + renderMode: 4169 + includeFontFeatures: 1 + m_FontWeightTable: + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + fontWeights: + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + normalStyle: 0 + normalSpacingOffset: 0 + boldStyle: 0.75 + boldSpacing: 7 + italicStyle: 35 + tabSize: 10 +--- !u!28 &28268798066460806 +Texture2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LiberationSans SDF Atlas + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + serializedVersion: 2 + m_Width: 0 + m_Height: 0 + m_CompleteImageSize: 0 + m_TextureFormat: 1 + m_MipCount: 1 + m_IsReadable: 1 + m_StreamingMipmaps: 0 + m_StreamingMipmapsPriority: 0 + m_AlphaIsTransparency: 0 + m_ImageCount: 1 + m_TextureDimension: 2 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 1 + m_MipBias: 0 + m_WrapU: 0 + m_WrapV: 0 + m_WrapW: 0 + m_LightmapFormat: 0 + m_ColorSpace: 0 + image data: 0 + _typelessdata: + m_StreamData: + offset: 0 + size: 0 + path: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta new file mode 100755 index 000000000..42dd6acd8 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e498d1c8094910479dc3e1b768306a4 +timeCreated: 1484171803 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat new file mode 100755 index 000000000..cca8ce893 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat @@ -0,0 +1,104 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LiberationSans SDF - Outline + m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3} + m_ShaderKeywords: OUTLINE_ON + m_LightmapFlags: 5 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Cube: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FaceTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 28684132378477856, guid: 8f586378b4e144a9851e7b34d9b748ee, + type: 2} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OutlineTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _Ambient: 0.5 + - _Bevel: 0.5 + - _BevelClamp: 0 + - _BevelOffset: 0 + - _BevelRoundness: 0 + - _BevelWidth: 0 + - _BumpFace: 0 + - _BumpOutline: 0 + - _ColorMask: 15 + - _Diffuse: 0.5 + - _FaceDilate: 0.1 + - _FaceUVSpeedX: 0 + - _FaceUVSpeedY: 0 + - _GlowInner: 0.05 + - _GlowOffset: 0 + - _GlowOuter: 0.05 + - _GlowPower: 0.75 + - _GradientScale: 10 + - _LightAngle: 3.1416 + - _MaskSoftnessX: 0 + - _MaskSoftnessY: 0 + - _OutlineSoftness: 0 + - _OutlineUVSpeedX: 0 + - _OutlineUVSpeedY: 0 + - _OutlineWidth: 0.1 + - _PerspectiveFilter: 0.875 + - _Reflectivity: 10 + - _ScaleRatioA: 0.9 + - _ScaleRatioB: 0.73125 + - _ScaleRatioC: 0.64125 + - _ScaleX: 1 + - _ScaleY: 1 + - _ShaderFlags: 0 + - _Sharpness: 0 + - _SpecularPower: 2 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _TextureHeight: 1024 + - _TextureWidth: 1024 + - _UnderlayDilate: 0 + - _UnderlayOffsetX: 0 + - _UnderlayOffsetY: 0 + - _UnderlaySoftness: 0 + - _VertexOffsetX: 0 + - _VertexOffsetY: 0 + - _WeightBold: 0.75 + - _WeightNormal: 0 + m_Colors: + - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} + - _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0} + - _FaceColor: {r: 1, g: 1, b: 1, a: 1} + - _GlowColor: {r: 0, g: 1, b: 0, a: 0.5} + - _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767} + - _OutlineColor: {r: 0, g: 0, b: 0, a: 1} + - _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1} + - _ReflectOutlineColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta new file mode 100755 index 000000000..88d633488 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 79459efec17a4d00a321bdcc27bbc385 +timeCreated: 1484172856 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset new file mode 100755 index 000000000..c7b0771e6 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset @@ -0,0 +1,7821 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2180264 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LiberationSans SDF Material + m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _MainTex: + m_Texture: {fileID: 28684132378477856} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _ColorMask: 15 + - _FaceDilate: 0 + - _GradientScale: 10 + - _MaskSoftnessX: 0 + - _MaskSoftnessY: 0 + - _OutlineSoftness: 0 + - _OutlineWidth: 0 + - _PerspectiveFilter: 0.875 + - _ScaleRatioA: 0.9 + - _ScaleRatioB: 1 + - _ScaleRatioC: 0.73125 + - _ScaleX: 1 + - _ScaleY: 1 + - _ShaderFlags: 0 + - _Sharpness: 0 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _TextureHeight: 1024 + - _TextureWidth: 1024 + - _UnderlayDilate: 0 + - _UnderlayOffsetX: 0 + - _UnderlayOffsetY: 0 + - _UnderlaySoftness: 0 + - _VertexOffsetX: 0 + - _VertexOffsetY: 0 + - _WeightBold: 0.75 + - _WeightNormal: 0 + m_Colors: + - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} + - _FaceColor: {r: 1, g: 1, b: 1, a: 1} + - _OutlineColor: {r: 0, g: 0, b: 0, a: 1} + - _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5} +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04, type: 3} + m_Name: LiberationSans SDF + m_EditorClassIdentifier: + hashCode: 231247347 + material: {fileID: 2180264} + materialHashCode: -1183942120 + m_Version: 1.1.0 + m_SourceFontFileGUID: e3265ab4bf004d28a9537516768c1c75 + m_SourceFontFile_EditorRef: {fileID: 12800000, guid: e3265ab4bf004d28a9537516768c1c75, + type: 3} + m_SourceFontFile: {fileID: 0} + m_AtlasPopulationMode: 0 + m_FaceInfo: + m_FamilyName: Liberation Sans + m_StyleName: Regular + m_PointSize: 86 + m_Scale: 1 + m_LineHeight: 98.8916 + m_AscentLine: 77.853516 + m_CapLine: 59 + m_MeanLine: 45 + m_Baseline: 0 + m_DescentLine: -18.22461 + m_SuperscriptOffset: 77.853516 + m_SuperscriptSize: 0.5 + m_SubscriptOffset: -18.22461 + m_SubscriptSize: 0.5 + m_UnderlineOffset: -12.261719 + m_UnderlineThickness: 6.298828 + m_StrikethroughOffset: 18 + m_StrikethroughThickness: 6.298828 + m_TabWidth: 24 + m_GlyphTable: + - m_Index: 3 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 4 + m_Metrics: + m_Width: 9 + m_Height: 59 + m_HorizontalBearingX: 9 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 28 + m_GlyphRect: + m_X: 555 + m_Y: 816 + m_Width: 9 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 5 + m_Metrics: + m_Width: 25 + m_Height: 19 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 31 + m_GlyphRect: + m_X: 775 + m_Y: 922 + m_Width: 25 + m_Height: 19 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 6 + m_Metrics: + m_Width: 48 + m_Height: 59 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 471 + m_Y: 170 + m_Width: 48 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 7 + m_Metrics: + m_Width: 47 + m_Height: 70 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 64 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 161 + m_Y: 212 + m_Width: 47 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 8 + m_Metrics: + m_Width: 70 + m_Height: 61 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 76 + m_GlyphRect: + m_X: 409 + m_Y: 10 + m_Width: 70 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 9 + m_Metrics: + m_Width: 53 + m_Height: 61 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 437 + m_Y: 90 + m_Width: 53 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 10 + m_Metrics: + m_Width: 8 + m_Height: 19 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 16 + m_GlyphRect: + m_X: 975 + m_Y: 961 + m_Width: 8 + m_Height: 19 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 11 + m_Metrics: + m_Width: 24 + m_Height: 80 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 146 + m_Y: 673 + m_Width: 24 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 12 + m_Metrics: + m_Width: 24 + m_Height: 80 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 189 + m_Y: 671 + m_Width: 24 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 13 + m_Metrics: + m_Width: 31 + m_Height: 30 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 33 + m_GlyphRect: + m_X: 495 + m_Y: 984 + m_Width: 31 + m_Height: 30 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 14 + m_Metrics: + m_Width: 42 + m_Height: 43 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 50 + m_HorizontalAdvance: 50 + m_GlyphRect: + m_X: 972 + m_Y: 330 + m_Width: 42 + m_Height: 43 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 15 + m_Metrics: + m_Width: 10 + m_Height: 20 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 9 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 583 + m_Y: 992 + m_Width: 10 + m_Height: 20 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 16 + m_Metrics: + m_Width: 23 + m_Height: 7 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 26 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 399 + m_Y: 925 + m_Width: 23 + m_Height: 7 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 17 + m_Metrics: + m_Width: 10 + m_Height: 9 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 9 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 657 + m_Y: 958 + m_Width: 10 + m_Height: 9 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 18 + m_Metrics: + m_Width: 24 + m_Height: 63 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 695 + m_Y: 409 + m_Width: 24 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 19 + m_Metrics: + m_Width: 42 + m_Height: 61 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 532 + m_Y: 249 + m_Width: 42 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 20 + m_Metrics: + m_Width: 38 + m_Height: 59 + m_HorizontalBearingX: 6 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 915 + m_Y: 501 + m_Width: 38 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 21 + m_Metrics: + m_Width: 40 + m_Height: 60 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 596 + m_Y: 329 + m_Width: 40 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 22 + m_Metrics: + m_Width: 42 + m_Height: 61 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 417 + m_Y: 503 + m_Width: 42 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 23 + m_Metrics: + m_Width: 45 + m_Height: 59 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 725 + m_Y: 252 + m_Width: 45 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 24 + m_Metrics: + m_Width: 42 + m_Height: 60 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 724 + m_Y: 330 + m_Width: 42 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 25 + m_Metrics: + m_Width: 41 + m_Height: 61 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 912 + m_Y: 262 + m_Width: 41 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 26 + m_Metrics: + m_Width: 40 + m_Height: 59 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 438 + m_Y: 830 + m_Width: 40 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 27 + m_Metrics: + m_Width: 42 + m_Height: 61 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 733 + m_Y: 648 + m_Width: 42 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 28 + m_Metrics: + m_Width: 40 + m_Height: 61 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 856 + m_Y: 484 + m_Width: 40 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 29 + m_Metrics: + m_Width: 10 + m_Height: 45 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 45 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 897 + m_Y: 819 + m_Width: 10 + m_Height: 45 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 30 + m_Metrics: + m_Width: 10 + m_Height: 57 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 45 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 429 + m_Y: 287 + m_Width: 10 + m_Height: 57 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 31 + m_Metrics: + m_Width: 42 + m_Height: 43 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 50 + m_HorizontalAdvance: 50 + m_GlyphRect: + m_X: 846 + m_Y: 341 + m_Width: 42 + m_Height: 43 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 32 + m_Metrics: + m_Width: 42 + m_Height: 29 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 42 + m_HorizontalAdvance: 50 + m_GlyphRect: + m_X: 227 + m_Y: 281 + m_Width: 42 + m_Height: 29 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 33 + m_Metrics: + m_Width: 42 + m_Height: 43 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 50 + m_HorizontalAdvance: 50 + m_GlyphRect: + m_X: 972 + m_Y: 392 + m_Width: 42 + m_Height: 43 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 34 + m_Metrics: + m_Width: 42 + m_Height: 60 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 733 + m_Y: 728 + m_Width: 42 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 35 + m_Metrics: + m_Width: 74 + m_Height: 74 + m_HorizontalBearingX: 6 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 87 + m_GlyphRect: + m_X: 10 + m_Y: 10 + m_Width: 74 + m_Height: 74 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 36 + m_Metrics: + m_Width: 57 + m_Height: 59 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 828 + m_Y: 103 + m_Width: 57 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 37 + m_Metrics: + m_Width: 46 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 542 + m_Y: 486 + m_Width: 46 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 38 + m_Metrics: + m_Width: 55 + m_Height: 61 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 509 + m_Y: 88 + m_Width: 55 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 39 + m_Metrics: + m_Width: 51 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 655 + m_Y: 252 + m_Width: 51 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 40 + m_Metrics: + m_Width: 47 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 629 + m_Y: 409 + m_Width: 47 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 41 + m_Metrics: + m_Width: 43 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 53 + m_GlyphRect: + m_X: 789 + m_Y: 259 + m_Width: 43 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 42 + m_Metrics: + m_Width: 57 + m_Height: 61 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 67 + m_GlyphRect: + m_X: 904 + m_Y: 103 + m_Width: 57 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 43 + m_Metrics: + m_Width: 48 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 495 + m_Y: 407 + m_Width: 48 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 44 + m_Metrics: + m_Width: 9 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 552 + m_Y: 919 + m_Width: 9 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 45 + m_Metrics: + m_Width: 36 + m_Height: 60 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 43 + m_GlyphRect: + m_X: 797 + m_Y: 569 + m_Width: 36 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 46 + m_Metrics: + m_Width: 50 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 458 + m_Y: 326 + m_Width: 50 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 47 + m_Metrics: + m_Width: 39 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 497 + m_Y: 816 + m_Width: 39 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 48 + m_Metrics: + m_Width: 59 + m_Height: 59 + m_HorizontalBearingX: 6 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 71 + m_GlyphRect: + m_X: 97 + m_Y: 955 + m_Width: 59 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 49 + m_Metrics: + m_Width: 48 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 562 + m_Y: 408 + m_Width: 48 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 50 + m_Metrics: + m_Width: 59 + m_Height: 61 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 67 + m_GlyphRect: + m_X: 583 + m_Y: 89 + m_Width: 59 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 51 + m_Metrics: + m_Width: 46 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 669 + m_Y: 491 + m_Width: 46 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 52 + m_Metrics: + m_Width: 59 + m_Height: 76 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 67 + m_GlyphRect: + m_X: 10 + m_Y: 103 + m_Width: 59 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 53 + m_Metrics: + m_Width: 52 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 461 + m_Y: 248 + m_Width: 52 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 54 + m_Metrics: + m_Width: 51 + m_Height: 61 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 288 + m_Y: 273 + m_Width: 51 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 55 + m_Metrics: + m_Width: 50 + m_Height: 59 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 52 + m_GlyphRect: + m_X: 527 + m_Y: 329 + m_Width: 50 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 56 + m_Metrics: + m_Width: 50 + m_Height: 60 + m_HorizontalBearingX: 6 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 655 + m_Y: 330 + m_Width: 50 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 57 + m_Metrics: + m_Width: 57 + m_Height: 59 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 273 + m_Y: 195 + m_Width: 57 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 58 + m_Metrics: + m_Width: 85 + m_Height: 59 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 85 + m_GlyphRect: + m_X: 103 + m_Y: 10 + m_Width: 85 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 59 + m_Metrics: + m_Width: 56 + m_Height: 59 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 58 + m_GlyphRect: + m_X: 175 + m_Y: 955 + m_Width: 56 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 60 + m_Metrics: + m_Width: 54 + m_Height: 59 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 56 + m_GlyphRect: + m_X: 582 + m_Y: 169 + m_Width: 54 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 61 + m_Metrics: + m_Width: 49 + m_Height: 59 + m_HorizontalBearingX: 2 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 53 + m_GlyphRect: + m_X: 427 + m_Y: 404 + m_Width: 49 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 62 + m_Metrics: + m_Width: 18 + m_Height: 80 + m_HorizontalBearingX: 6 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 232 + m_Y: 671 + m_Width: 18 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 63 + m_Metrics: + m_Width: 24 + m_Height: 63 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 375 + m_Y: 951 + m_Width: 24 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 64 + m_Metrics: + m_Width: 18 + m_Height: 80 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 223 + m_Y: 393 + m_Width: 18 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 65 + m_Metrics: + m_Width: 38 + m_Height: 31 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 38 + m_GlyphRect: + m_X: 630 + m_Y: 870 + m_Width: 38 + m_Height: 31 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 66 + m_Metrics: + m_Width: 51 + m_Height: 6 + m_HorizontalBearingX: -2 + m_HorizontalBearingY: -12 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 497 + m_Y: 894 + m_Width: 51 + m_Height: 6 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 67 + m_Metrics: + m_Width: 19 + m_Height: 13 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 456 + m_Y: 997 + m_Width: 19 + m_Height: 13 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 68 + m_Metrics: + m_Width: 45 + m_Height: 47 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 669 + m_Y: 648 + m_Width: 45 + m_Height: 47 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 69 + m_Metrics: + m_Width: 40 + m_Height: 63 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 738 + m_Y: 409 + m_Width: 40 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 70 + m_Metrics: + m_Width: 38 + m_Height: 47 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 43 + m_GlyphRect: + m_X: 908 + m_Y: 579 + m_Width: 38 + m_Height: 47 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 71 + m_Metrics: + m_Width: 40 + m_Height: 63 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 797 + m_Y: 403 + m_Width: 40 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 72 + m_Metrics: + m_Width: 42 + m_Height: 47 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 785 + m_Y: 337 + m_Width: 42 + m_Height: 47 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 73 + m_Metrics: + m_Width: 25 + m_Height: 62 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 25 + m_GlyphRect: + m_X: 538 + m_Y: 168 + m_Width: 25 + m_Height: 62 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 74 + m_Metrics: + m_Width: 40 + m_Height: 64 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 86 + m_Y: 872 + m_Width: 40 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 75 + m_Metrics: + m_Width: 38 + m_Height: 62 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 430 + m_Y: 666 + m_Width: 38 + m_Height: 62 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 76 + m_Metrics: + m_Width: 9 + m_Height: 62 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 19 + m_GlyphRect: + m_X: 852 + m_Y: 567 + m_Width: 9 + m_Height: 62 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 77 + m_Metrics: + m_Width: 17 + m_Height: 80 + m_HorizontalBearingX: -3 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 20 + m_GlyphRect: + m_X: 145 + m_Y: 773 + m_Width: 17 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 78 + m_Metrics: + m_Width: 40 + m_Height: 62 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 44 + m_GlyphRect: + m_X: 856 + m_Y: 403 + m_Width: 40 + m_Height: 62 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 79 + m_Metrics: + m_Width: 9 + m_Height: 62 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 19 + m_GlyphRect: + m_X: 880 + m_Y: 564 + m_Width: 9 + m_Height: 62 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 80 + m_Metrics: + m_Width: 64 + m_Height: 46 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 74 + m_GlyphRect: + m_X: 378 + m_Y: 222 + m_Width: 64 + m_Height: 46 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 81 + m_Metrics: + m_Width: 38 + m_Height: 46 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 630 + m_Y: 805 + m_Width: 38 + m_Height: 46 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 82 + m_Metrics: + m_Width: 42 + m_Height: 47 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 972 + m_Y: 264 + m_Width: 42 + m_Height: 47 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 83 + m_Metrics: + m_Width: 40 + m_Height: 64 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 145 + m_Y: 872 + m_Width: 40 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 84 + m_Metrics: + m_Width: 40 + m_Height: 64 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 329 + m_Y: 666 + m_Width: 40 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 85 + m_Metrics: + m_Width: 23 + m_Height: 46 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 926 + m_Y: 816 + m_Width: 23 + m_Height: 46 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 86 + m_Metrics: + m_Width: 38 + m_Height: 47 + m_HorizontalBearingX: 2 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 43 + m_GlyphRect: + m_X: 956 + m_Y: 740 + m_Width: 38 + m_Height: 47 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 87 + m_Metrics: + m_Width: 23 + m_Height: 56 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 55 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 388 + m_Y: 672 + m_Width: 23 + m_Height: 56 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 88 + m_Metrics: + m_Width: 38 + m_Height: 46 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 45 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 495 + m_Y: 919 + m_Width: 38 + m_Height: 46 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 89 + m_Metrics: + m_Width: 43 + m_Height: 45 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 45 + m_HorizontalAdvance: 43 + m_GlyphRect: + m_X: 226 + m_Y: 329 + m_Width: 43 + m_Height: 45 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 90 + m_Metrics: + m_Width: 63 + m_Height: 45 + m_HorizontalBearingX: -1 + m_HorizontalBearingY: 45 + m_HorizontalAdvance: 61 + m_GlyphRect: + m_X: 655 + m_Y: 188 + m_Width: 63 + m_Height: 45 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 91 + m_Metrics: + m_Width: 43 + m_Height: 45 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 45 + m_HorizontalAdvance: 43 + m_GlyphRect: + m_X: 737 + m_Y: 188 + m_Width: 43 + m_Height: 45 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 92 + m_Metrics: + m_Width: 41 + m_Height: 63 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 45 + m_HorizontalAdvance: 41 + m_GlyphRect: + m_X: 609 + m_Y: 640 + m_Width: 41 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 93 + m_Metrics: + m_Width: 35 + m_Height: 45 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 45 + m_HorizontalAdvance: 42 + m_GlyphRect: + m_X: 968 + m_Y: 806 + m_Width: 35 + m_Height: 45 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 94 + m_Metrics: + m_Width: 27 + m_Height: 80 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 164 + m_Y: 113 + m_Width: 27 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 95 + m_Metrics: + m_Width: 8 + m_Height: 80 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 22 + m_GlyphRect: + m_X: 181 + m_Y: 772 + m_Width: 8 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 96 + m_Metrics: + m_Width: 27 + m_Height: 80 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 227 + m_Y: 182 + m_Width: 27 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 97 + m_Metrics: + m_Width: 44 + m_Height: 11 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 34 + m_HorizontalAdvance: 50 + m_GlyphRect: + m_X: 333 + m_Y: 832 + m_Width: 44 + m_Height: 11 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 98 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 99 + m_Metrics: + m_Width: 10 + m_Height: 59 + m_HorizontalBearingX: 9 + m_HorizontalBearingY: 45 + m_HorizontalAdvance: 28 + m_GlyphRect: + m_X: 349 + m_Y: 195 + m_Width: 10 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 100 + m_Metrics: + m_Width: 38 + m_Height: 60 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 915 + m_Y: 422 + m_Width: 38 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 101 + m_Metrics: + m_Width: 45 + m_Height: 60 + m_HorizontalBearingX: 2 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 669 + m_Y: 569 + m_Width: 45 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 102 + m_Metrics: + m_Width: 40 + m_Height: 40 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 48 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 733 + m_Y: 807 + m_Width: 40 + m_Height: 40 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 103 + m_Metrics: + m_Width: 50 + m_Height: 59 + m_HorizontalBearingX: -1 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 358 + m_Y: 357 + m_Width: 50 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 104 + m_Metrics: + m_Width: 8 + m_Height: 80 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 22 + m_GlyphRect: + m_X: 306 + m_Y: 766 + m_Width: 8 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 105 + m_Metrics: + m_Width: 40 + m_Height: 69 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 223 + m_Y: 492 + m_Width: 40 + m_Height: 69 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 106 + m_Metrics: + m_Width: 25 + m_Height: 8 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 931 + m_Y: 961 + m_Width: 25 + m_Height: 8 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 107 + m_Metrics: + m_Width: 61 + m_Height: 61 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 63 + m_GlyphRect: + m_X: 277 + m_Y: 90 + m_Width: 61 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 108 + m_Metrics: + m_Width: 32 + m_Height: 33 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 32 + m_GlyphRect: + m_X: 784 + m_Y: 870 + m_Width: 32 + m_Height: 33 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 109 + m_Metrics: + m_Width: 42 + m_Height: 34 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 39 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 972 + m_Y: 454 + m_Width: 42 + m_Height: 34 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 110 + m_Metrics: + m_Width: 42 + m_Height: 24 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 32 + m_HorizontalAdvance: 50 + m_GlyphRect: + m_X: 972 + m_Y: 560 + m_Width: 42 + m_Height: 24 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 111 + m_Metrics: + m_Width: 23 + m_Height: 7 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 26 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 583 + m_Y: 890 + m_Width: 23 + m_Height: 7 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 112 + m_Metrics: + m_Width: 61 + m_Height: 61 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 63 + m_GlyphRect: + m_X: 357 + m_Y: 90 + m_Width: 61 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 113 + m_Metrics: + m_Width: 50 + m_Height: 4 + m_HorizontalBearingX: -1 + m_HorizontalBearingY: 65 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 862 + m_Y: 961 + m_Width: 50 + m_Height: 4 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 114 + m_Metrics: + m_Width: 24 + m_Height: 24 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 34 + m_GlyphRect: + m_X: 687 + m_Y: 906 + m_Width: 24 + m_Height: 24 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 115 + m_Metrics: + m_Width: 43 + m_Height: 52 + m_HorizontalBearingX: 2 + m_HorizontalBearingY: 52 + m_HorizontalAdvance: 47 + m_GlyphRect: + m_X: 607 + m_Y: 487 + m_Width: 43 + m_Height: 52 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 116 + m_Metrics: + m_Width: 27 + m_Height: 36 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 792 + m_Y: 815 + m_Width: 27 + m_Height: 36 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 117 + m_Metrics: + m_Width: 27 + m_Height: 37 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 687 + m_Y: 796 + m_Width: 27 + m_Height: 37 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 118 + m_Metrics: + m_Width: 19 + m_Height: 13 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 545 + m_Y: 997 + m_Width: 19 + m_Height: 13 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 119 + m_Metrics: + m_Width: 43 + m_Height: 63 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 45 + m_HorizontalAdvance: 50 + m_GlyphRect: + m_X: 593 + m_Y: 247 + m_Width: 43 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 120 + m_Metrics: + m_Width: 40 + m_Height: 70 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 46 + m_GlyphRect: + m_X: 208 + m_Y: 770 + m_Width: 40 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 121 + m_Metrics: + m_Width: 10 + m_Height: 10 + m_HorizontalBearingX: 9 + m_HorizontalBearingY: 28 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 996 + m_Y: 932 + m_Width: 10 + m_Height: 10 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 122 + m_Metrics: + m_Width: 16 + m_Height: 18 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 622 + m_Y: 958 + m_Width: 16 + m_Height: 18 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 123 + m_Metrics: + m_Width: 24 + m_Height: 35 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 687 + m_Y: 852 + m_Width: 24 + m_Height: 35 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 124 + m_Metrics: + m_Width: 29 + m_Height: 33 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 31 + m_GlyphRect: + m_X: 835 + m_Y: 877 + m_Width: 29 + m_Height: 33 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 125 + m_Metrics: + m_Width: 42 + m_Height: 34 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 39 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 972 + m_Y: 507 + m_Width: 42 + m_Height: 34 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 126 + m_Metrics: + m_Width: 67 + m_Height: 59 + m_HorizontalBearingX: 2 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 72 + m_GlyphRect: + m_X: 498 + m_Y: 10 + m_Width: 67 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 127 + m_Metrics: + m_Width: 68 + m_Height: 59 + m_HorizontalBearingX: 2 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 72 + m_GlyphRect: + m_X: 10 + m_Y: 955 + m_Width: 68 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 128 + m_Metrics: + m_Width: 66 + m_Height: 60 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 72 + m_GlyphRect: + m_X: 584 + m_Y: 10 + m_Width: 66 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 129 + m_Metrics: + m_Width: 43 + m_Height: 60 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 45 + m_HorizontalAdvance: 53 + m_GlyphRect: + m_X: 903 + m_Y: 183 + m_Width: 43 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 130 + m_Metrics: + m_Width: 57 + m_Height: 74 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 74 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 829 + m_Y: 10 + m_Width: 57 + m_Height: 74 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 131 + m_Metrics: + m_Width: 57 + m_Height: 74 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 74 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 905 + m_Y: 10 + m_Width: 57 + m_Height: 74 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 132 + m_Metrics: + m_Width: 57 + m_Height: 75 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 75 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 10 + m_Y: 673 + m_Width: 57 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 133 + m_Metrics: + m_Width: 57 + m_Height: 75 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 75 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 10 + m_Y: 767 + m_Width: 57 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 134 + m_Metrics: + m_Width: 57 + m_Height: 72 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 72 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 88 + m_Y: 113 + m_Width: 57 + m_Height: 72 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 135 + m_Metrics: + m_Width: 57 + m_Height: 75 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 75 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 10 + m_Y: 861 + m_Width: 57 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 136 + m_Metrics: + m_Width: 82 + m_Height: 59 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 86 + m_GlyphRect: + m_X: 207 + m_Y: 10 + m_Width: 82 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 137 + m_Metrics: + m_Width: 55 + m_Height: 78 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 10 + m_Y: 576 + m_Width: 55 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 138 + m_Metrics: + m_Width: 47 + m_Height: 74 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 74 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 84 + m_Y: 580 + m_Width: 47 + m_Height: 74 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 139 + m_Metrics: + m_Width: 47 + m_Height: 74 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 74 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 157 + m_Y: 487 + m_Width: 47 + m_Height: 74 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 140 + m_Metrics: + m_Width: 47 + m_Height: 75 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 75 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 157 + m_Y: 393 + m_Width: 47 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 141 + m_Metrics: + m_Width: 47 + m_Height: 72 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 72 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 150 + m_Y: 580 + m_Width: 47 + m_Height: 72 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 142 + m_Metrics: + m_Width: 19 + m_Height: 74 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 74 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 227 + m_Y: 859 + m_Width: 19 + m_Height: 74 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 143 + m_Metrics: + m_Width: 19 + m_Height: 74 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 74 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 265 + m_Y: 859 + m_Width: 19 + m_Height: 74 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 144 + m_Metrics: + m_Width: 28 + m_Height: 75 + m_HorizontalBearingX: -2 + m_HorizontalBearingY: 75 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 981 + m_Y: 10 + m_Width: 28 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 145 + m_Metrics: + m_Width: 25 + m_Height: 72 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 72 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 216 + m_Y: 580 + m_Width: 25 + m_Height: 72 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 146 + m_Metrics: + m_Width: 58 + m_Height: 59 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 751 + m_Y: 102 + m_Width: 58 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 147 + m_Metrics: + m_Width: 48 + m_Height: 75 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 75 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 210 + m_Y: 88 + m_Width: 48 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 148 + m_Metrics: + m_Width: 59 + m_Height: 75 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 74 + m_HorizontalAdvance: 67 + m_GlyphRect: + m_X: 10 + m_Y: 388 + m_Width: 59 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 149 + m_Metrics: + m_Width: 59 + m_Height: 75 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 74 + m_HorizontalAdvance: 67 + m_GlyphRect: + m_X: 10 + m_Y: 482 + m_Width: 59 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 150 + m_Metrics: + m_Width: 59 + m_Height: 76 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 75 + m_HorizontalAdvance: 67 + m_GlyphRect: + m_X: 10 + m_Y: 198 + m_Width: 59 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 151 + m_Metrics: + m_Width: 59 + m_Height: 76 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 75 + m_HorizontalAdvance: 67 + m_GlyphRect: + m_X: 10 + m_Y: 293 + m_Width: 59 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 152 + m_Metrics: + m_Width: 59 + m_Height: 73 + m_HorizontalBearingX: 4 + m_HorizontalBearingY: 72 + m_HorizontalAdvance: 67 + m_GlyphRect: + m_X: 751 + m_Y: 10 + m_Width: 59 + m_Height: 73 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 153 + m_Metrics: + m_Width: 40 + m_Height: 39 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 48 + m_HorizontalAdvance: 50 + m_GlyphRect: + m_X: 838 + m_Y: 819 + m_Width: 40 + m_Height: 39 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 154 + m_Metrics: + m_Width: 63 + m_Height: 65 + m_HorizontalBearingX: 2 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 67 + m_GlyphRect: + m_X: 669 + m_Y: 10 + m_Width: 63 + m_Height: 65 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 155 + m_Metrics: + m_Width: 50 + m_Height: 75 + m_HorizontalBearingX: 6 + m_HorizontalBearingY: 74 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 88 + m_Y: 392 + m_Width: 50 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 156 + m_Metrics: + m_Width: 50 + m_Height: 75 + m_HorizontalBearingX: 6 + m_HorizontalBearingY: 74 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 88 + m_Y: 486 + m_Width: 50 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 157 + m_Metrics: + m_Width: 50 + m_Height: 76 + m_HorizontalBearingX: 6 + m_HorizontalBearingY: 75 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 88 + m_Y: 297 + m_Width: 50 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 158 + m_Metrics: + m_Width: 50 + m_Height: 73 + m_HorizontalBearingX: 6 + m_HorizontalBearingY: 72 + m_HorizontalAdvance: 62 + m_GlyphRect: + m_X: 157 + m_Y: 301 + m_Width: 50 + m_Height: 73 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 159 + m_Metrics: + m_Width: 54 + m_Height: 74 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 74 + m_HorizontalAdvance: 56 + m_GlyphRect: + m_X: 88 + m_Y: 204 + m_Width: 54 + m_Height: 74 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 160 + m_Metrics: + m_Width: 46 + m_Height: 59 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 57 + m_GlyphRect: + m_X: 734 + m_Y: 491 + m_Width: 46 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 161 + m_Metrics: + m_Width: 44 + m_Height: 63 + m_HorizontalBearingX: 6 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 53 + m_GlyphRect: + m_X: 545 + m_Y: 564 + m_Width: 44 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 162 + m_Metrics: + m_Width: 45 + m_Height: 64 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 324 + m_Y: 583 + m_Width: 45 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 163 + m_Metrics: + m_Width: 45 + m_Height: 64 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 333 + m_Y: 749 + m_Width: 45 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 164 + m_Metrics: + m_Width: 45 + m_Height: 63 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 478 + m_Y: 485 + m_Width: 45 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 165 + m_Metrics: + m_Width: 45 + m_Height: 62 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 61 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 250 + m_Y: 952 + m_Width: 45 + m_Height: 62 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 166 + m_Metrics: + m_Width: 45 + m_Height: 60 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 733 + m_Y: 569 + m_Width: 45 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 167 + m_Metrics: + m_Width: 45 + m_Height: 71 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 70 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 260 + m_Y: 580 + m_Width: 45 + m_Height: 71 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 168 + m_Metrics: + m_Width: 71 + m_Height: 47 + m_HorizontalBearingX: 2 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 76 + m_GlyphRect: + m_X: 661 + m_Y: 94 + m_Width: 71 + m_Height: 47 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 169 + m_Metrics: + m_Width: 38 + m_Height: 64 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 46 + m_HorizontalAdvance: 43 + m_GlyphRect: + m_X: 427 + m_Y: 583 + m_Width: 38 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 170 + m_Metrics: + m_Width: 42 + m_Height: 64 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 436 + m_Y: 747 + m_Width: 42 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 171 + m_Metrics: + m_Width: 42 + m_Height: 64 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 484 + m_Y: 567 + m_Width: 42 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 172 + m_Metrics: + m_Width: 42 + m_Height: 63 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 608 + m_Y: 558 + m_Width: 42 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 173 + m_Metrics: + m_Width: 42 + m_Height: 60 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 851 + m_Y: 262 + m_Width: 42 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 174 + m_Metrics: + m_Width: 19 + m_Height: 63 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 838 + m_Y: 737 + m_Width: 19 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 175 + m_Metrics: + m_Width: 19 + m_Height: 63 + m_HorizontalBearingX: 6 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 418 + m_Y: 951 + m_Width: 19 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 176 + m_Metrics: + m_Width: 29 + m_Height: 62 + m_HorizontalBearingX: -2 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 980 + m_Y: 104 + m_Width: 29 + m_Height: 62 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 177 + m_Metrics: + m_Width: 25 + m_Height: 59 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 794 + m_Y: 737 + m_Width: 25 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 178 + m_Metrics: + m_Width: 42 + m_Height: 64 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 487 + m_Y: 650 + m_Width: 42 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 179 + m_Metrics: + m_Width: 38 + m_Height: 61 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 61 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 915 + m_Y: 342 + m_Width: 38 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 180 + m_Metrics: + m_Width: 42 + m_Height: 64 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 548 + m_Y: 646 + m_Width: 42 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 181 + m_Metrics: + m_Width: 42 + m_Height: 64 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 497 + m_Y: 733 + m_Width: 42 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 182 + m_Metrics: + m_Width: 42 + m_Height: 63 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 672 + m_Y: 714 + m_Width: 42 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 183 + m_Metrics: + m_Width: 42 + m_Height: 62 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 61 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 314 + m_Y: 952 + m_Width: 42 + m_Height: 62 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 184 + m_Metrics: + m_Width: 42 + m_Height: 60 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 972 + m_Y: 185 + m_Width: 42 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 185 + m_Metrics: + m_Width: 43 + m_Height: 39 + m_HorizontalBearingX: 2 + m_HorizontalBearingY: 48 + m_HorizontalAdvance: 47 + m_GlyphRect: + m_X: 965 + m_Y: 603 + m_Width: 43 + m_Height: 39 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 186 + m_Metrics: + m_Width: 50 + m_Height: 49 + m_HorizontalBearingX: 1 + m_HorizontalBearingY: 47 + m_HorizontalAdvance: 53 + m_GlyphRect: + m_X: 357 + m_Y: 435 + m_Width: 50 + m_Height: 49 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 187 + m_Metrics: + m_Width: 38 + m_Height: 64 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 558 + m_Y: 729 + m_Width: 38 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 188 + m_Metrics: + m_Width: 38 + m_Height: 64 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 615 + m_Y: 722 + m_Width: 38 + m_Height: 64 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 189 + m_Metrics: + m_Width: 38 + m_Height: 63 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 799 + m_Y: 485 + m_Width: 38 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 190 + m_Metrics: + m_Width: 38 + m_Height: 60 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 956 + m_Y: 661 + m_Width: 38 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 191 + m_Metrics: + m_Width: 41 + m_Height: 81 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 63 + m_HorizontalAdvance: 41 + m_GlyphRect: + m_X: 86 + m_Y: 673 + m_Width: 41 + m_Height: 81 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 192 + m_Metrics: + m_Width: 40 + m_Height: 80 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 86 + m_Y: 773 + m_Width: 40 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 193 + m_Metrics: + m_Width: 41 + m_Height: 77 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 41 + m_GlyphRect: + m_X: 269 + m_Y: 670 + m_Width: 41 + m_Height: 77 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1997 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 43 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1998 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 86 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1999 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 43 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2000 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 86 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2001 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2002 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 22 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2003 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 14 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2004 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2005 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2006 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 17 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2007 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 7 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2008 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2009 + m_Metrics: + m_Width: 4 + m_Height: 65 + m_HorizontalBearingX: -2 + m_HorizontalBearingY: 54 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 204 + m_Y: 871 + m_Width: 4 + m_Height: 65 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2010 + m_Metrics: + m_Width: 20 + m_Height: 70 + m_HorizontalBearingX: -10 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 267 + m_Y: 770 + m_Width: 20 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2011 + m_Metrics: + m_Width: 21 + m_Height: 70 + m_HorizontalBearingX: -2 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 260 + m_Y: 393 + m_Width: 21 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2012 + m_Metrics: + m_Width: 21 + m_Height: 70 + m_HorizontalBearingX: -19 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 282 + m_Y: 482 + m_Width: 21 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2013 + m_Metrics: + m_Width: 48 + m_Height: 6 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 25 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 862 + m_Y: 936 + m_Width: 48 + m_Height: 6 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2014 + m_Metrics: + m_Width: 48 + m_Height: 6 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 25 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 929 + m_Y: 936 + m_Width: 48 + m_Height: 6 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2015 + m_Metrics: + m_Width: 86 + m_Height: 6 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 25 + m_HorizontalAdvance: 86 + m_GlyphRect: + m_X: 103 + m_Y: 88 + m_Width: 86 + m_Height: 6 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2016 + m_Metrics: + m_Width: 86 + m_Height: 6 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 25 + m_HorizontalAdvance: 86 + m_GlyphRect: + m_X: 277 + m_Y: 170 + m_Width: 86 + m_Height: 6 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2017 + m_Metrics: + m_Width: 22 + m_Height: 62 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 36 + m_GlyphRect: + m_X: 862 + m_Y: 181 + m_Width: 22 + m_Height: 62 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2018 + m_Metrics: + m_Width: 51 + m_Height: 15 + m_HorizontalBearingX: -2 + m_HorizontalBearingY: -4 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 288 + m_Y: 353 + m_Width: 51 + m_Height: 15 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2019 + m_Metrics: + m_Width: 9 + m_Height: 19 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 19 + m_GlyphRect: + m_X: 612 + m_Y: 995 + m_Width: 9 + m_Height: 19 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2020 + m_Metrics: + m_Width: 9 + m_Height: 19 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 19 + m_GlyphRect: + m_X: 640 + m_Y: 995 + m_Width: 9 + m_Height: 19 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2021 + m_Metrics: + m_Width: 9 + m_Height: 19 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 8 + m_HorizontalAdvance: 19 + m_GlyphRect: + m_X: 1002 + m_Y: 961 + m_Width: 9 + m_Height: 19 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2022 + m_Metrics: + m_Width: 9 + m_Height: 19 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 19 + m_GlyphRect: + m_X: 686 + m_Y: 949 + m_Width: 9 + m_Height: 19 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2023 + m_Metrics: + m_Width: 23 + m_Height: 19 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 967 + m_Y: 894 + m_Width: 23 + m_Height: 19 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2024 + m_Metrics: + m_Width: 23 + m_Height: 19 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 580 + m_Y: 916 + m_Width: 23 + m_Height: 19 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2025 + m_Metrics: + m_Width: 23 + m_Height: 19 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 8 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 580 + m_Y: 954 + m_Width: 23 + m_Height: 19 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2026 + m_Metrics: + m_Width: 22 + m_Height: 19 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 622 + m_Y: 920 + m_Width: 22 + m_Height: 19 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2027 + m_Metrics: + m_Width: 38 + m_Height: 68 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 303 + m_Y: 865 + m_Width: 38 + m_Height: 68 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2028 + m_Metrics: + m_Width: 38 + m_Height: 68 + m_HorizontalBearingX: 5 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 300 + m_Y: 387 + m_Width: 38 + m_Height: 68 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2029 + m_Metrics: + m_Width: 24 + m_Height: 23 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 40 + m_HorizontalAdvance: 30 + m_GlyphRect: + m_X: 819 + m_Y: 929 + m_Width: 24 + m_Height: 23 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2030 + m_Metrics: + m_Width: 64 + m_Height: 9 + m_HorizontalBearingX: 11 + m_HorizontalBearingY: 9 + m_HorizontalAdvance: 86 + m_GlyphRect: + m_X: 661 + m_Y: 160 + m_Width: 64 + m_Height: 9 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2031 + m_Metrics: + m_Width: 21 + m_Height: 63 + m_HorizontalBearingX: -2 + m_HorizontalBearingY: 52 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 876 + m_Y: 737 + m_Width: 21 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2032 + m_Metrics: + m_Width: 21 + m_Height: 63 + m_HorizontalBearingX: -19 + m_HorizontalBearingY: 52 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 916 + m_Y: 734 + m_Width: 21 + m_Height: 63 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2033 + m_Metrics: + m_Width: 20 + m_Height: 70 + m_HorizontalBearingX: -10 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 388 + m_Y: 583 + m_Width: 20 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2034 + m_Metrics: + m_Width: 20 + m_Height: 70 + m_HorizontalBearingX: -10 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 397 + m_Y: 747 + m_Width: 20 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2035 + m_Metrics: + m_Width: 20 + m_Height: 70 + m_HorizontalBearingX: -10 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 360 + m_Y: 862 + m_Width: 20 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2036 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 17 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2037 + m_Metrics: + m_Width: 82 + m_Height: 61 + m_HorizontalBearingX: 2 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 86 + m_GlyphRect: + m_X: 308 + m_Y: 10 + m_Width: 82 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2038 + m_Metrics: + m_Width: 12 + m_Height: 22 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 16 + m_GlyphRect: + m_X: 427 + m_Y: 363 + m_Width: 12 + m_Height: 22 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2039 + m_Metrics: + m_Width: 26 + m_Height: 22 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 30 + m_GlyphRect: + m_X: 730 + m_Y: 907 + m_Width: 26 + m_Height: 22 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2040 + m_Metrics: + m_Width: 35 + m_Height: 22 + m_HorizontalBearingX: -4 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 30 + m_GlyphRect: + m_X: 730 + m_Y: 866 + m_Width: 35 + m_Height: 22 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2041 + m_Metrics: + m_Width: 23 + m_Height: 34 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 39 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 883 + m_Y: 883 + m_Width: 23 + m_Height: 34 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2042 + m_Metrics: + m_Width: 23 + m_Height: 34 + m_HorizontalBearingX: 3 + m_HorizontalBearingY: 39 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 925 + m_Y: 883 + m_Width: 23 + m_Height: 34 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2043 + m_Metrics: + m_Width: 28 + m_Height: 59 + m_HorizontalBearingX: 9 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 43 + m_GlyphRect: + m_X: 583 + m_Y: 812 + m_Width: 28 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2044 + m_Metrics: + m_Width: 35 + m_Height: 5 + m_HorizontalBearingX: -3 + m_HorizontalBearingY: 68 + m_HorizontalAdvance: 29 + m_GlyphRect: + m_X: 968 + m_Y: 870 + m_Width: 35 + m_Height: 5 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2045 + m_Metrics: + m_Width: 44 + m_Height: 59 + m_HorizontalBearingX: -18 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 14 + m_GlyphRect: + m_X: 799 + m_Y: 181 + m_Width: 44 + m_Height: 59 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2046 + m_Metrics: + m_Width: 10 + m_Height: 62 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 62 + m_HorizontalAdvance: 24 + m_GlyphRect: + m_X: 322 + m_Y: 474 + m_Width: 10 + m_Height: 62 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2047 + m_Metrics: + m_Width: 20 + m_Height: 70 + m_HorizontalBearingX: -10 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 399 + m_Y: 836 + m_Width: 20 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2048 + m_Metrics: + m_Width: 20 + m_Height: 70 + m_HorizontalBearingX: -10 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 794 + m_Y: 648 + m_Width: 20 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2049 + m_Metrics: + m_Width: 22 + m_Height: 70 + m_HorizontalBearingX: -11 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 833 + m_Y: 648 + m_Width: 22 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2050 + m_Metrics: + m_Width: 22 + m_Height: 70 + m_HorizontalBearingX: -11 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 874 + m_Y: 648 + m_Width: 22 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2051 + m_Metrics: + m_Width: 22 + m_Height: 70 + m_HorizontalBearingX: -11 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 915 + m_Y: 645 + m_Width: 22 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2052 + m_Metrics: + m_Width: 20 + m_Height: 70 + m_HorizontalBearingX: -10 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 0 + m_GlyphRect: + m_X: 456 + m_Y: 908 + m_Width: 20 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2075 + m_Metrics: + m_Width: 47 + m_Height: 61 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 60 + m_HorizontalAdvance: 48 + m_GlyphRect: + m_X: 351 + m_Y: 503 + m_Width: 47 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2090 + m_Metrics: + m_Width: 70 + m_Height: 33 + m_HorizontalBearingX: 7 + m_HorizontalBearingY: 59 + m_HorizontalAdvance: 86 + m_GlyphRect: + m_X: 382 + m_Y: 170 + m_Width: 70 + m_Height: 33 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2179 + m_Metrics: + m_Width: 52 + m_Height: 51 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 51 + m_HorizontalAdvance: 52 + m_GlyphRect: + m_X: 358 + m_Y: 287 + m_Width: 52 + m_Height: 51 + m_Scale: 1 + m_AtlasIndex: 0 + m_CharacterTable: + - m_ElementType: 1 + m_Unicode: 32 + m_GlyphIndex: 3 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 33 + m_GlyphIndex: 4 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 34 + m_GlyphIndex: 5 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 35 + m_GlyphIndex: 6 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 36 + m_GlyphIndex: 7 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 37 + m_GlyphIndex: 8 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 38 + m_GlyphIndex: 9 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 39 + m_GlyphIndex: 10 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 40 + m_GlyphIndex: 11 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 41 + m_GlyphIndex: 12 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 42 + m_GlyphIndex: 13 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 43 + m_GlyphIndex: 14 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 44 + m_GlyphIndex: 15 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 45 + m_GlyphIndex: 16 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 46 + m_GlyphIndex: 17 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 47 + m_GlyphIndex: 18 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 48 + m_GlyphIndex: 19 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 49 + m_GlyphIndex: 20 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 50 + m_GlyphIndex: 21 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 51 + m_GlyphIndex: 22 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 52 + m_GlyphIndex: 23 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 53 + m_GlyphIndex: 24 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 54 + m_GlyphIndex: 25 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 55 + m_GlyphIndex: 26 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 56 + m_GlyphIndex: 27 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 57 + m_GlyphIndex: 28 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 58 + m_GlyphIndex: 29 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 59 + m_GlyphIndex: 30 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 60 + m_GlyphIndex: 31 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 61 + m_GlyphIndex: 32 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 62 + m_GlyphIndex: 33 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 63 + m_GlyphIndex: 34 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 64 + m_GlyphIndex: 35 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 65 + m_GlyphIndex: 36 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 66 + m_GlyphIndex: 37 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 67 + m_GlyphIndex: 38 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 68 + m_GlyphIndex: 39 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 69 + m_GlyphIndex: 40 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 70 + m_GlyphIndex: 41 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 71 + m_GlyphIndex: 42 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 72 + m_GlyphIndex: 43 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 73 + m_GlyphIndex: 44 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 74 + m_GlyphIndex: 45 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 75 + m_GlyphIndex: 46 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 76 + m_GlyphIndex: 47 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 77 + m_GlyphIndex: 48 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 78 + m_GlyphIndex: 49 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 79 + m_GlyphIndex: 50 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 80 + m_GlyphIndex: 51 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 81 + m_GlyphIndex: 52 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 82 + m_GlyphIndex: 53 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 83 + m_GlyphIndex: 54 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 84 + m_GlyphIndex: 55 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 85 + m_GlyphIndex: 56 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 86 + m_GlyphIndex: 57 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 87 + m_GlyphIndex: 58 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 88 + m_GlyphIndex: 59 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 89 + m_GlyphIndex: 60 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 90 + m_GlyphIndex: 61 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 91 + m_GlyphIndex: 62 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 92 + m_GlyphIndex: 63 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 93 + m_GlyphIndex: 64 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 94 + m_GlyphIndex: 65 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 95 + m_GlyphIndex: 66 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 96 + m_GlyphIndex: 67 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 97 + m_GlyphIndex: 68 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 98 + m_GlyphIndex: 69 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 99 + m_GlyphIndex: 70 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 100 + m_GlyphIndex: 71 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 101 + m_GlyphIndex: 72 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 102 + m_GlyphIndex: 73 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 103 + m_GlyphIndex: 74 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 104 + m_GlyphIndex: 75 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 105 + m_GlyphIndex: 76 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 106 + m_GlyphIndex: 77 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 107 + m_GlyphIndex: 78 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 108 + m_GlyphIndex: 79 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 109 + m_GlyphIndex: 80 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 110 + m_GlyphIndex: 81 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 111 + m_GlyphIndex: 82 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 112 + m_GlyphIndex: 83 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 113 + m_GlyphIndex: 84 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 114 + m_GlyphIndex: 85 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 115 + m_GlyphIndex: 86 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 116 + m_GlyphIndex: 87 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 117 + m_GlyphIndex: 88 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 118 + m_GlyphIndex: 89 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 119 + m_GlyphIndex: 90 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 120 + m_GlyphIndex: 91 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 121 + m_GlyphIndex: 92 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 122 + m_GlyphIndex: 93 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 123 + m_GlyphIndex: 94 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 124 + m_GlyphIndex: 95 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 125 + m_GlyphIndex: 96 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 126 + m_GlyphIndex: 97 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 160 + m_GlyphIndex: 98 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 161 + m_GlyphIndex: 99 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 162 + m_GlyphIndex: 100 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 163 + m_GlyphIndex: 101 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 164 + m_GlyphIndex: 102 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 165 + m_GlyphIndex: 103 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 166 + m_GlyphIndex: 104 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 167 + m_GlyphIndex: 105 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 168 + m_GlyphIndex: 106 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 169 + m_GlyphIndex: 107 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 170 + m_GlyphIndex: 108 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 171 + m_GlyphIndex: 109 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 172 + m_GlyphIndex: 110 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 173 + m_GlyphIndex: 111 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 174 + m_GlyphIndex: 112 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 175 + m_GlyphIndex: 113 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 176 + m_GlyphIndex: 114 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 177 + m_GlyphIndex: 115 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 178 + m_GlyphIndex: 116 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 179 + m_GlyphIndex: 117 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 180 + m_GlyphIndex: 118 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 181 + m_GlyphIndex: 119 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 182 + m_GlyphIndex: 120 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 183 + m_GlyphIndex: 121 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 184 + m_GlyphIndex: 122 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 185 + m_GlyphIndex: 123 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 186 + m_GlyphIndex: 124 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 187 + m_GlyphIndex: 125 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 188 + m_GlyphIndex: 126 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 189 + m_GlyphIndex: 127 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 190 + m_GlyphIndex: 128 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 191 + m_GlyphIndex: 129 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 192 + m_GlyphIndex: 130 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 193 + m_GlyphIndex: 131 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 194 + m_GlyphIndex: 132 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 195 + m_GlyphIndex: 133 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 196 + m_GlyphIndex: 134 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 197 + m_GlyphIndex: 135 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 198 + m_GlyphIndex: 136 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 199 + m_GlyphIndex: 137 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 200 + m_GlyphIndex: 138 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 201 + m_GlyphIndex: 139 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 202 + m_GlyphIndex: 140 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 203 + m_GlyphIndex: 141 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 204 + m_GlyphIndex: 142 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 205 + m_GlyphIndex: 143 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 206 + m_GlyphIndex: 144 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 207 + m_GlyphIndex: 145 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 208 + m_GlyphIndex: 146 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 209 + m_GlyphIndex: 147 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 210 + m_GlyphIndex: 148 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 211 + m_GlyphIndex: 149 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 212 + m_GlyphIndex: 150 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 213 + m_GlyphIndex: 151 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 214 + m_GlyphIndex: 152 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 215 + m_GlyphIndex: 153 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 216 + m_GlyphIndex: 154 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 217 + m_GlyphIndex: 155 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 218 + m_GlyphIndex: 156 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 219 + m_GlyphIndex: 157 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 220 + m_GlyphIndex: 158 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 221 + m_GlyphIndex: 159 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 222 + m_GlyphIndex: 160 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 223 + m_GlyphIndex: 161 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 224 + m_GlyphIndex: 162 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 225 + m_GlyphIndex: 163 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 226 + m_GlyphIndex: 164 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 227 + m_GlyphIndex: 165 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 228 + m_GlyphIndex: 166 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 229 + m_GlyphIndex: 167 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 230 + m_GlyphIndex: 168 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 231 + m_GlyphIndex: 169 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 232 + m_GlyphIndex: 170 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 233 + m_GlyphIndex: 171 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 234 + m_GlyphIndex: 172 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 235 + m_GlyphIndex: 173 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 236 + m_GlyphIndex: 174 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 237 + m_GlyphIndex: 175 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 238 + m_GlyphIndex: 176 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 239 + m_GlyphIndex: 177 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 240 + m_GlyphIndex: 178 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 241 + m_GlyphIndex: 179 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 242 + m_GlyphIndex: 180 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 243 + m_GlyphIndex: 181 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 244 + m_GlyphIndex: 182 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 245 + m_GlyphIndex: 183 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 246 + m_GlyphIndex: 184 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 247 + m_GlyphIndex: 185 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 248 + m_GlyphIndex: 186 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 249 + m_GlyphIndex: 187 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 250 + m_GlyphIndex: 188 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 251 + m_GlyphIndex: 189 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 252 + m_GlyphIndex: 190 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 253 + m_GlyphIndex: 191 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 254 + m_GlyphIndex: 192 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 255 + m_GlyphIndex: 193 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8192 + m_GlyphIndex: 1997 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8193 + m_GlyphIndex: 1998 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8194 + m_GlyphIndex: 1999 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8195 + m_GlyphIndex: 2000 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8196 + m_GlyphIndex: 2001 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8197 + m_GlyphIndex: 2002 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8198 + m_GlyphIndex: 2003 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8199 + m_GlyphIndex: 2004 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8200 + m_GlyphIndex: 2005 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8201 + m_GlyphIndex: 2006 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8202 + m_GlyphIndex: 2007 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8203 + m_GlyphIndex: 2008 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8204 + m_GlyphIndex: 2009 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8205 + m_GlyphIndex: 2010 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8206 + m_GlyphIndex: 2011 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8207 + m_GlyphIndex: 2012 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8210 + m_GlyphIndex: 2013 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8211 + m_GlyphIndex: 2014 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8212 + m_GlyphIndex: 2015 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8213 + m_GlyphIndex: 2016 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8214 + m_GlyphIndex: 2017 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8215 + m_GlyphIndex: 2018 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8216 + m_GlyphIndex: 2019 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8217 + m_GlyphIndex: 2020 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8218 + m_GlyphIndex: 2021 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8219 + m_GlyphIndex: 2022 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8220 + m_GlyphIndex: 2023 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8221 + m_GlyphIndex: 2024 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8222 + m_GlyphIndex: 2025 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8223 + m_GlyphIndex: 2026 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8224 + m_GlyphIndex: 2027 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8225 + m_GlyphIndex: 2028 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8226 + m_GlyphIndex: 2029 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8230 + m_GlyphIndex: 2030 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8234 + m_GlyphIndex: 2031 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8235 + m_GlyphIndex: 2032 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8236 + m_GlyphIndex: 2033 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8237 + m_GlyphIndex: 2034 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8238 + m_GlyphIndex: 2035 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8239 + m_GlyphIndex: 2036 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8240 + m_GlyphIndex: 2037 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8242 + m_GlyphIndex: 2038 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8243 + m_GlyphIndex: 2039 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8244 + m_GlyphIndex: 2040 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8249 + m_GlyphIndex: 2041 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8250 + m_GlyphIndex: 2042 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8252 + m_GlyphIndex: 2043 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8254 + m_GlyphIndex: 2044 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8260 + m_GlyphIndex: 2045 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8286 + m_GlyphIndex: 2046 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8298 + m_GlyphIndex: 2047 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8299 + m_GlyphIndex: 2048 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8300 + m_GlyphIndex: 2049 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8301 + m_GlyphIndex: 2050 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8302 + m_GlyphIndex: 2051 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8303 + m_GlyphIndex: 2052 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8364 + m_GlyphIndex: 2075 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8482 + m_GlyphIndex: 2090 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 9633 + m_GlyphIndex: 2179 + m_Scale: 1 + m_AtlasTextures: + - {fileID: 28684132378477856} + m_AtlasTextureIndex: 0 + m_UsedGlyphRects: + - m_X: 0 + m_Y: 0 + m_Width: 93 + m_Height: 93 + - m_X: 93 + m_Y: 0 + m_Width: 104 + m_Height: 78 + - m_X: 197 + m_Y: 0 + m_Width: 101 + m_Height: 78 + - m_X: 298 + m_Y: 0 + m_Width: 101 + m_Height: 80 + - m_X: 0 + m_Y: 93 + m_Width: 78 + m_Height: 95 + - m_X: 0 + m_Y: 188 + m_Width: 78 + m_Height: 95 + - m_X: 0 + m_Y: 283 + m_Width: 78 + m_Height: 95 + - m_X: 0 + m_Y: 378 + m_Width: 78 + m_Height: 94 + - m_X: 0 + m_Y: 472 + m_Width: 78 + m_Height: 94 + - m_X: 0 + m_Y: 566 + m_Width: 74 + m_Height: 97 + - m_X: 399 + m_Y: 0 + m_Width: 89 + m_Height: 80 + - m_X: 0 + m_Y: 663 + m_Width: 76 + m_Height: 94 + - m_X: 0 + m_Y: 757 + m_Width: 76 + m_Height: 94 + - m_X: 0 + m_Y: 851 + m_Width: 76 + m_Height: 94 + - m_X: 0 + m_Y: 945 + m_Width: 87 + m_Height: 78 + - m_X: 488 + m_Y: 0 + m_Width: 86 + m_Height: 78 + - m_X: 574 + m_Y: 0 + m_Width: 85 + m_Height: 79 + - m_X: 659 + m_Y: 0 + m_Width: 82 + m_Height: 84 + - m_X: 741 + m_Y: 0 + m_Width: 78 + m_Height: 92 + - m_X: 819 + m_Y: 0 + m_Width: 76 + m_Height: 93 + - m_X: 895 + m_Y: 0 + m_Width: 76 + m_Height: 93 + - m_X: 971 + m_Y: 0 + m_Width: 47 + m_Height: 94 + - m_X: 93 + m_Y: 78 + m_Width: 105 + m_Height: 25 + - m_X: 78 + m_Y: 103 + m_Width: 76 + m_Height: 91 + - m_X: 78 + m_Y: 194 + m_Width: 73 + m_Height: 93 + - m_X: 78 + m_Y: 287 + m_Width: 69 + m_Height: 95 + - m_X: 78 + m_Y: 382 + m_Width: 69 + m_Height: 94 + - m_X: 78 + m_Y: 476 + m_Width: 69 + m_Height: 94 + - m_X: 74 + m_Y: 570 + m_Width: 66 + m_Height: 93 + - m_X: 76 + m_Y: 663 + m_Width: 60 + m_Height: 100 + - m_X: 76 + m_Y: 763 + m_Width: 59 + m_Height: 99 + - m_X: 76 + m_Y: 862 + m_Width: 59 + m_Height: 83 + - m_X: 87 + m_Y: 945 + m_Width: 78 + m_Height: 78 + - m_X: 154 + m_Y: 103 + m_Width: 46 + m_Height: 99 + - m_X: 200 + m_Y: 78 + m_Width: 67 + m_Height: 94 + - m_X: 151 + m_Y: 202 + m_Width: 66 + m_Height: 89 + - m_X: 147 + m_Y: 291 + m_Width: 69 + m_Height: 92 + - m_X: 147 + m_Y: 383 + m_Width: 66 + m_Height: 94 + - m_X: 147 + m_Y: 477 + m_Width: 66 + m_Height: 93 + - m_X: 140 + m_Y: 570 + m_Width: 66 + m_Height: 91 + - m_X: 267 + m_Y: 80 + m_Width: 80 + m_Height: 80 + - m_X: 347 + m_Y: 80 + m_Width: 80 + m_Height: 80 + - m_X: 427 + m_Y: 80 + m_Width: 72 + m_Height: 80 + - m_X: 499 + m_Y: 78 + m_Width: 74 + m_Height: 80 + - m_X: 573 + m_Y: 79 + m_Width: 78 + m_Height: 80 + - m_X: 651 + m_Y: 84 + m_Width: 90 + m_Height: 66 + - m_X: 741 + m_Y: 92 + m_Width: 77 + m_Height: 78 + - m_X: 818 + m_Y: 93 + m_Width: 76 + m_Height: 78 + - m_X: 894 + m_Y: 93 + m_Width: 76 + m_Height: 80 + - m_X: 970 + m_Y: 94 + m_Width: 48 + m_Height: 81 + - m_X: 267 + m_Y: 160 + m_Width: 105 + m_Height: 25 + - m_X: 217 + m_Y: 172 + m_Width: 46 + m_Height: 99 + - m_X: 263 + m_Y: 185 + m_Width: 76 + m_Height: 78 + - m_X: 372 + m_Y: 160 + m_Width: 89 + m_Height: 52 + - m_X: 339 + m_Y: 185 + m_Width: 29 + m_Height: 78 + - m_X: 368 + m_Y: 212 + m_Width: 83 + m_Height: 65 + - m_X: 136 + m_Y: 663 + m_Width: 43 + m_Height: 99 + - m_X: 179 + m_Y: 661 + m_Width: 43 + m_Height: 99 + - m_X: 206 + m_Y: 570 + m_Width: 44 + m_Height: 91 + - m_X: 222 + m_Y: 661 + m_Width: 37 + m_Height: 99 + - m_X: 213 + m_Y: 383 + m_Width: 37 + m_Height: 99 + - m_X: 213 + m_Y: 482 + m_Width: 59 + m_Height: 88 + - m_X: 250 + m_Y: 570 + m_Width: 64 + m_Height: 90 + - m_X: 259 + m_Y: 660 + m_Width: 60 + m_Height: 96 + - m_X: 135 + m_Y: 763 + m_Width: 36 + m_Height: 99 + - m_X: 135 + m_Y: 862 + m_Width: 59 + m_Height: 83 + - m_X: 165 + m_Y: 945 + m_Width: 75 + m_Height: 78 + - m_X: 171 + m_Y: 762 + m_Width: 27 + m_Height: 99 + - m_X: 198 + m_Y: 760 + m_Width: 59 + m_Height: 89 + - m_X: 194 + m_Y: 861 + m_Width: 23 + m_Height: 84 + - m_X: 217 + m_Y: 849 + m_Width: 38 + m_Height: 93 + - m_X: 240 + m_Y: 942 + m_Width: 64 + m_Height: 81 + - m_X: 255 + m_Y: 849 + m_Width: 38 + m_Height: 93 + - m_X: 257 + m_Y: 760 + m_Width: 39 + m_Height: 89 + - m_X: 296 + m_Y: 756 + m_Width: 27 + m_Height: 99 + - m_X: 293 + m_Y: 855 + m_Width: 57 + m_Height: 87 + - m_X: 304 + m_Y: 942 + m_Width: 61 + m_Height: 81 + - m_X: 651 + m_Y: 150 + m_Width: 83 + m_Height: 28 + - m_X: 461 + m_Y: 160 + m_Width: 67 + m_Height: 78 + - m_X: 528 + m_Y: 158 + m_Width: 44 + m_Height: 81 + - m_X: 572 + m_Y: 159 + m_Width: 73 + m_Height: 78 + - m_X: 645 + m_Y: 178 + m_Width: 82 + m_Height: 64 + - m_X: 451 + m_Y: 238 + m_Width: 71 + m_Height: 78 + - m_X: 522 + m_Y: 239 + m_Width: 61 + m_Height: 80 + - m_X: 583 + m_Y: 237 + m_Width: 62 + m_Height: 82 + - m_X: 645 + m_Y: 242 + m_Width: 70 + m_Height: 78 + - m_X: 216 + m_Y: 319 + m_Width: 62 + m_Height: 64 + - m_X: 217 + m_Y: 271 + m_Width: 61 + m_Height: 48 + - m_X: 278 + m_Y: 263 + m_Width: 70 + m_Height: 80 + - m_X: 250 + m_Y: 383 + m_Width: 40 + m_Height: 89 + - m_X: 348 + m_Y: 277 + m_Width: 71 + m_Height: 70 + - m_X: 278 + m_Y: 343 + m_Width: 70 + m_Height: 34 + - m_X: 290 + m_Y: 377 + m_Width: 57 + m_Height: 87 + - m_X: 419 + m_Y: 277 + m_Width: 29 + m_Height: 76 + - m_X: 448 + m_Y: 316 + m_Width: 69 + m_Height: 78 + - m_X: 517 + m_Y: 319 + m_Width: 69 + m_Height: 78 + - m_X: 586 + m_Y: 319 + m_Width: 59 + m_Height: 79 + - m_X: 645 + m_Y: 320 + m_Width: 69 + m_Height: 79 + - m_X: 348 + m_Y: 347 + m_Width: 69 + m_Height: 78 + - m_X: 417 + m_Y: 353 + m_Width: 31 + m_Height: 41 + - m_X: 347 + m_Y: 425 + m_Width: 69 + m_Height: 68 + - m_X: 417 + m_Y: 394 + m_Width: 68 + m_Height: 78 + - m_X: 485 + m_Y: 397 + m_Width: 67 + m_Height: 78 + - m_X: 552 + m_Y: 398 + m_Width: 67 + m_Height: 78 + - m_X: 619 + m_Y: 399 + m_Width: 66 + m_Height: 78 + - m_X: 685 + m_Y: 399 + m_Width: 43 + m_Height: 82 + - m_X: 272 + m_Y: 472 + m_Width: 40 + m_Height: 89 + - m_X: 312 + m_Y: 464 + m_Width: 29 + m_Height: 81 + - m_X: 341 + m_Y: 493 + m_Width: 66 + m_Height: 80 + - m_X: 314 + m_Y: 573 + m_Width: 64 + m_Height: 83 + - m_X: 319 + m_Y: 656 + m_Width: 59 + m_Height: 83 + - m_X: 323 + m_Y: 739 + m_Width: 64 + m_Height: 83 + - m_X: 378 + m_Y: 573 + m_Width: 39 + m_Height: 89 + - m_X: 378 + m_Y: 662 + m_Width: 42 + m_Height: 75 + - m_X: 387 + m_Y: 737 + m_Width: 39 + m_Height: 89 + - m_X: 407 + m_Y: 493 + m_Width: 61 + m_Height: 80 + - m_X: 417 + m_Y: 573 + m_Width: 57 + m_Height: 83 + - m_X: 420 + m_Y: 656 + m_Width: 57 + m_Height: 81 + - m_X: 426 + m_Y: 737 + m_Width: 61 + m_Height: 83 + - m_X: 468 + m_Y: 475 + m_Width: 64 + m_Height: 82 + - m_X: 474 + m_Y: 557 + m_Width: 61 + m_Height: 83 + - m_X: 477 + m_Y: 640 + m_Width: 61 + m_Height: 83 + - m_X: 532 + m_Y: 476 + m_Width: 65 + m_Height: 78 + - m_X: 535 + m_Y: 554 + m_Width: 63 + m_Height: 82 + - m_X: 538 + m_Y: 636 + m_Width: 61 + m_Height: 83 + - m_X: 487 + m_Y: 723 + m_Width: 61 + m_Height: 83 + - m_X: 548 + m_Y: 719 + m_Width: 57 + m_Height: 83 + - m_X: 597 + m_Y: 477 + m_Width: 62 + m_Height: 71 + - m_X: 598 + m_Y: 548 + m_Width: 61 + m_Height: 82 + - m_X: 599 + m_Y: 630 + m_Width: 60 + m_Height: 82 + - m_X: 605 + m_Y: 712 + m_Width: 57 + m_Height: 83 + - m_X: 659 + m_Y: 481 + m_Width: 65 + m_Height: 78 + - m_X: 659 + m_Y: 559 + m_Width: 64 + m_Height: 79 + - m_X: 659 + m_Y: 638 + m_Width: 64 + m_Height: 66 + - m_X: 662 + m_Y: 704 + m_Width: 61 + m_Height: 82 + - m_X: 714 + m_Y: 320 + m_Width: 61 + m_Height: 79 + - m_X: 715 + m_Y: 242 + m_Width: 64 + m_Height: 78 + - m_X: 728 + m_Y: 399 + m_Width: 59 + m_Height: 82 + - m_X: 724 + m_Y: 481 + m_Width: 65 + m_Height: 78 + - m_X: 723 + m_Y: 559 + m_Width: 64 + m_Height: 79 + - m_X: 723 + m_Y: 638 + m_Width: 61 + m_Height: 80 + - m_X: 723 + m_Y: 718 + m_Width: 61 + m_Height: 79 + - m_X: 727 + m_Y: 178 + m_Width: 62 + m_Height: 64 + - m_X: 789 + m_Y: 171 + m_Width: 63 + m_Height: 78 + - m_X: 779 + m_Y: 249 + m_Width: 62 + m_Height: 78 + - m_X: 775 + m_Y: 327 + m_Width: 61 + m_Height: 66 + - m_X: 787 + m_Y: 393 + m_Width: 59 + m_Height: 82 + - m_X: 789 + m_Y: 475 + m_Width: 57 + m_Height: 82 + - m_X: 852 + m_Y: 171 + m_Width: 41 + m_Height: 81 + - m_X: 893 + m_Y: 173 + m_Width: 62 + m_Height: 79 + - m_X: 841 + m_Y: 252 + m_Width: 61 + m_Height: 79 + - m_X: 902 + m_Y: 252 + m_Width: 60 + m_Height: 80 + - m_X: 962 + m_Y: 175 + m_Width: 61 + m_Height: 79 + - m_X: 962 + m_Y: 254 + m_Width: 61 + m_Height: 66 + - m_X: 962 + m_Y: 320 + m_Width: 61 + m_Height: 62 + - m_X: 836 + m_Y: 331 + m_Width: 61 + m_Height: 62 + - m_X: 846 + m_Y: 393 + m_Width: 59 + m_Height: 81 + - m_X: 846 + m_Y: 474 + m_Width: 59 + m_Height: 80 + - m_X: 905 + m_Y: 332 + m_Width: 57 + m_Height: 80 + - m_X: 962 + m_Y: 382 + m_Width: 61 + m_Height: 62 + - m_X: 905 + m_Y: 412 + m_Width: 57 + m_Height: 79 + - m_X: 962 + m_Y: 444 + m_Width: 61 + m_Height: 53 + - m_X: 905 + m_Y: 491 + m_Width: 57 + m_Height: 78 + - m_X: 962 + m_Y: 497 + m_Width: 61 + m_Height: 53 + - m_X: 962 + m_Y: 550 + m_Width: 61 + m_Height: 43 + - m_X: 323 + m_Y: 822 + m_Width: 63 + m_Height: 30 + - m_X: 350 + m_Y: 852 + m_Width: 39 + m_Height: 89 + - m_X: 365 + m_Y: 941 + m_Width: 43 + m_Height: 82 + - m_X: 389 + m_Y: 826 + m_Width: 39 + m_Height: 89 + - m_X: 428 + m_Y: 820 + m_Width: 59 + m_Height: 78 + - m_X: 487 + m_Y: 806 + m_Width: 58 + m_Height: 78 + - m_X: 784 + m_Y: 638 + m_Width: 39 + m_Height: 89 + - m_X: 787 + m_Y: 559 + m_Width: 55 + m_Height: 79 + - m_X: 784 + m_Y: 727 + m_Width: 44 + m_Height: 78 + - m_X: 823 + m_Y: 638 + m_Width: 41 + m_Height: 89 + - m_X: 828 + m_Y: 727 + m_Width: 38 + m_Height: 82 + - m_X: 842 + m_Y: 557 + m_Width: 28 + m_Height: 81 + - m_X: 870 + m_Y: 554 + m_Width: 28 + m_Height: 81 + - m_X: 898 + m_Y: 569 + m_Width: 57 + m_Height: 66 + - m_X: 955 + m_Y: 593 + m_Width: 62 + m_Height: 58 + - m_X: 864 + m_Y: 638 + m_Width: 41 + m_Height: 89 + - m_X: 905 + m_Y: 635 + m_Width: 41 + m_Height: 89 + - m_X: 946 + m_Y: 651 + m_Width: 57 + m_Height: 79 + - m_X: 866 + m_Y: 727 + m_Width: 40 + m_Height: 82 + - m_X: 906 + m_Y: 724 + m_Width: 40 + m_Height: 82 + - m_X: 946 + m_Y: 730 + m_Width: 57 + m_Height: 66 + - m_X: 389 + m_Y: 915 + m_Width: 42 + m_Height: 26 + - m_X: 408 + m_Y: 941 + m_Width: 38 + m_Height: 82 + - m_X: 446 + m_Y: 898 + m_Width: 39 + m_Height: 89 + - m_X: 545 + m_Y: 806 + m_Width: 28 + m_Height: 78 + - m_X: 573 + m_Y: 802 + m_Width: 47 + m_Height: 78 + - m_X: 620 + m_Y: 795 + m_Width: 57 + m_Height: 65 + - m_X: 677 + m_Y: 786 + m_Width: 46 + m_Height: 56 + - m_X: 723 + m_Y: 797 + m_Width: 59 + m_Height: 59 + - m_X: 782 + m_Y: 805 + m_Width: 46 + m_Height: 55 + - m_X: 828 + m_Y: 809 + m_Width: 59 + m_Height: 58 + - m_X: 487 + m_Y: 884 + m_Width: 70 + m_Height: 25 + - m_X: 485 + m_Y: 909 + m_Width: 57 + m_Height: 65 + - m_X: 485 + m_Y: 974 + m_Width: 50 + m_Height: 49 + - m_X: 542 + m_Y: 909 + m_Width: 28 + m_Height: 78 + - m_X: 887 + m_Y: 809 + m_Width: 29 + m_Height: 64 + - m_X: 916 + m_Y: 806 + m_Width: 42 + m_Height: 65 + - m_X: 958 + m_Y: 796 + m_Width: 54 + m_Height: 64 + - m_X: 620 + m_Y: 860 + m_Width: 57 + m_Height: 50 + - m_X: 677 + m_Y: 842 + m_Width: 43 + m_Height: 54 + - m_X: 720 + m_Y: 856 + m_Width: 54 + m_Height: 41 + - m_X: 774 + m_Y: 860 + m_Width: 51 + m_Height: 52 + - m_X: 825 + m_Y: 867 + m_Width: 48 + m_Height: 52 + - m_X: 873 + m_Y: 873 + m_Width: 42 + m_Height: 53 + - m_X: 446 + m_Y: 987 + m_Width: 38 + m_Height: 32 + - m_X: 958 + m_Y: 860 + m_Width: 54 + m_Height: 24 + - m_X: 535 + m_Y: 987 + m_Width: 38 + m_Height: 32 + - m_X: 677 + m_Y: 896 + m_Width: 43 + m_Height: 43 + - m_X: 720 + m_Y: 897 + m_Width: 45 + m_Height: 41 + - m_X: 765 + m_Y: 912 + m_Width: 44 + m_Height: 38 + - m_X: 809 + m_Y: 919 + m_Width: 43 + m_Height: 42 + - m_X: 852 + m_Y: 926 + m_Width: 67 + m_Height: 25 + - m_X: 852 + m_Y: 951 + m_Width: 69 + m_Height: 23 + - m_X: 915 + m_Y: 873 + m_Width: 42 + m_Height: 53 + - m_X: 957 + m_Y: 884 + m_Width: 42 + m_Height: 38 + - m_X: 919 + m_Y: 926 + m_Width: 67 + m_Height: 25 + - m_X: 921 + m_Y: 951 + m_Width: 44 + m_Height: 27 + - m_X: 965 + m_Y: 951 + m_Width: 27 + m_Height: 38 + - m_X: 573 + m_Y: 880 + m_Width: 42 + m_Height: 26 + - m_X: 570 + m_Y: 906 + m_Width: 42 + m_Height: 38 + - m_X: 570 + m_Y: 944 + m_Width: 42 + m_Height: 38 + - m_X: 612 + m_Y: 910 + m_Width: 41 + m_Height: 38 + - m_X: 612 + m_Y: 948 + m_Width: 35 + m_Height: 37 + - m_X: 573 + m_Y: 982 + m_Width: 29 + m_Height: 39 + - m_X: 602 + m_Y: 985 + m_Width: 28 + m_Height: 38 + - m_X: 630 + m_Y: 985 + m_Width: 28 + m_Height: 38 + - m_X: 986 + m_Y: 922 + m_Width: 29 + m_Height: 29 + - m_X: 992 + m_Y: 951 + m_Width: 28 + m_Height: 38 + - m_X: 647 + m_Y: 948 + m_Width: 29 + m_Height: 28 + - m_X: 676 + m_Y: 939 + m_Width: 28 + m_Height: 38 + m_FreeGlyphRects: + - m_X: 78 + m_Y: 93 + m_Width: 15 + m_Height: 10 + - m_X: 74 + m_Y: 566 + m_Width: 4 + m_Height: 4 + - m_X: 198 + m_Y: 78 + m_Width: 2 + m_Height: 25 + - m_X: 151 + m_Y: 194 + m_Width: 3 + m_Height: 8 + - m_X: 147 + m_Y: 287 + m_Width: 4 + m_Height: 4 + - m_X: 267 + m_Y: 78 + m_Width: 31 + m_Height: 2 + - m_X: 488 + m_Y: 78 + m_Width: 11 + m_Height: 2 + - m_X: 573 + m_Y: 78 + m_Width: 1 + m_Height: 1 + - m_X: 651 + m_Y: 79 + m_Width: 8 + m_Height: 5 + - m_X: 818 + m_Y: 92 + m_Width: 1 + m_Height: 1 + - m_X: 970 + m_Y: 93 + m_Width: 1 + m_Height: 1 + - m_X: 200 + m_Y: 172 + m_Width: 17 + m_Height: 30 + - m_X: 263 + m_Y: 172 + m_Width: 4 + m_Height: 13 + - m_X: 368 + m_Y: 185 + m_Width: 4 + m_Height: 27 + - m_X: 140 + m_Y: 661 + m_Width: 39 + m_Height: 2 + - m_X: 250 + m_Y: 660 + m_Width: 9 + m_Height: 1 + - m_X: 136 + m_Y: 762 + m_Width: 35 + m_Height: 1 + - m_X: 179 + m_Y: 760 + m_Width: 19 + m_Height: 2 + - m_X: 171 + m_Y: 861 + m_Width: 23 + m_Height: 1 + - m_X: 198 + m_Y: 849 + m_Width: 19 + m_Height: 12 + - m_X: 217 + m_Y: 942 + m_Width: 23 + m_Height: 3 + - m_X: 259 + m_Y: 756 + m_Width: 37 + m_Height: 4 + - m_X: 293 + m_Y: 849 + m_Width: 3 + m_Height: 6 + - m_X: 499 + m_Y: 158 + m_Width: 29 + m_Height: 2 + - m_X: 572 + m_Y: 158 + m_Width: 1 + m_Height: 1 + - m_X: 645 + m_Y: 159 + m_Width: 6 + m_Height: 19 + - m_X: 451 + m_Y: 212 + m_Width: 10 + m_Height: 26 + - m_X: 522 + m_Y: 238 + m_Width: 6 + m_Height: 1 + - m_X: 572 + m_Y: 237 + m_Width: 11 + m_Height: 2 + - m_X: 216 + m_Y: 291 + m_Width: 1 + m_Height: 28 + - m_X: 263 + m_Y: 263 + m_Width: 15 + m_Height: 8 + - m_X: 348 + m_Y: 263 + m_Width: 20 + m_Height: 14 + - m_X: 278 + m_Y: 377 + m_Width: 12 + m_Height: 6 + - m_X: 448 + m_Y: 277 + m_Width: 3 + m_Height: 39 + - m_X: 517 + m_Y: 316 + m_Width: 5 + m_Height: 3 + - m_X: 417 + m_Y: 347 + m_Width: 2 + m_Height: 6 + - m_X: 347 + m_Y: 377 + m_Width: 1 + m_Height: 48 + - m_X: 485 + m_Y: 394 + m_Width: 32 + m_Height: 3 + - m_X: 552 + m_Y: 397 + m_Width: 34 + m_Height: 1 + - m_X: 619 + m_Y: 398 + m_Width: 26 + m_Height: 1 + - m_X: 250 + m_Y: 472 + m_Width: 22 + m_Height: 10 + - m_X: 290 + m_Y: 464 + m_Width: 22 + m_Height: 8 + - m_X: 272 + m_Y: 561 + m_Width: 69 + m_Height: 9 + - m_X: 341 + m_Y: 464 + m_Width: 6 + m_Height: 29 + - m_X: 312 + m_Y: 545 + m_Width: 29 + m_Height: 25 + - m_X: 314 + m_Y: 545 + m_Width: 27 + m_Height: 28 + - m_X: 314 + m_Y: 656 + m_Width: 5 + m_Height: 4 + - m_X: 319 + m_Y: 739 + m_Width: 4 + m_Height: 17 + - m_X: 378 + m_Y: 737 + m_Width: 9 + m_Height: 2 + - m_X: 416 + m_Y: 425 + m_Width: 1 + m_Height: 68 + - m_X: 417 + m_Y: 656 + m_Width: 3 + m_Height: 6 + - m_X: 416 + m_Y: 472 + m_Width: 69 + m_Height: 3 + - m_X: 416 + m_Y: 472 + m_Width: 52 + m_Height: 21 + - m_X: 468 + m_Y: 557 + m_Width: 6 + m_Height: 16 + - m_X: 474 + m_Y: 640 + m_Width: 3 + m_Height: 16 + - m_X: 532 + m_Y: 475 + m_Width: 20 + m_Height: 1 + - m_X: 532 + m_Y: 554 + m_Width: 3 + m_Height: 3 + - m_X: 535 + m_Y: 636 + m_Width: 3 + m_Height: 4 + - m_X: 477 + m_Y: 723 + m_Width: 10 + m_Height: 14 + - m_X: 538 + m_Y: 719 + m_Width: 10 + m_Height: 4 + - m_X: 597 + m_Y: 476 + m_Width: 22 + m_Height: 1 + - m_X: 597 + m_Y: 548 + m_Width: 1 + m_Height: 6 + - m_X: 598 + m_Y: 630 + m_Width: 1 + m_Height: 6 + - m_X: 599 + m_Y: 712 + m_Width: 6 + m_Height: 7 + - m_X: 659 + m_Y: 477 + m_Width: 26 + m_Height: 4 + - m_X: 659 + m_Y: 704 + m_Width: 3 + m_Height: 8 + - m_X: 734 + m_Y: 150 + m_Width: 7 + m_Height: 28 + - m_X: 734 + m_Y: 170 + m_Width: 84 + m_Height: 1 + - m_X: 734 + m_Y: 170 + m_Width: 55 + m_Height: 8 + - m_X: 779 + m_Y: 242 + m_Width: 10 + m_Height: 7 + - m_X: 775 + m_Y: 320 + m_Width: 4 + m_Height: 7 + - m_X: 775 + m_Y: 393 + m_Width: 12 + m_Height: 6 + - m_X: 787 + m_Y: 475 + m_Width: 2 + m_Height: 6 + - m_X: 893 + m_Y: 171 + m_Width: 1 + m_Height: 2 + - m_X: 841 + m_Y: 249 + m_Width: 11 + m_Height: 3 + - m_X: 1018 + m_Y: 0 + m_Width: 5 + m_Height: 175 + - m_X: 955 + m_Y: 173 + m_Width: 15 + m_Height: 2 + - m_X: 955 + m_Y: 173 + m_Width: 7 + m_Height: 79 + - m_X: 836 + m_Y: 327 + m_Width: 5 + m_Height: 4 + - m_X: 897 + m_Y: 331 + m_Width: 5 + m_Height: 62 + - m_X: 897 + m_Y: 332 + m_Width: 8 + m_Height: 61 + - m_X: 386 + m_Y: 822 + m_Width: 1 + m_Height: 30 + - m_X: 323 + m_Y: 852 + m_Width: 27 + m_Height: 3 + - m_X: 350 + m_Y: 941 + m_Width: 15 + m_Height: 1 + - m_X: 386 + m_Y: 826 + m_Width: 3 + m_Height: 26 + - m_X: 426 + m_Y: 820 + m_Width: 2 + m_Height: 6 + - m_X: 789 + m_Y: 557 + m_Width: 53 + m_Height: 2 + - m_X: 846 + m_Y: 554 + m_Width: 24 + m_Height: 3 + - m_X: 898 + m_Y: 554 + m_Width: 7 + m_Height: 15 + - m_X: 955 + m_Y: 569 + m_Width: 7 + m_Height: 24 + - m_X: 870 + m_Y: 635 + m_Width: 35 + m_Height: 3 + - m_X: 946 + m_Y: 635 + m_Width: 9 + m_Height: 16 + - m_X: 905 + m_Y: 724 + m_Width: 1 + m_Height: 3 + - m_X: 428 + m_Y: 898 + m_Width: 18 + m_Height: 17 + - m_X: 431 + m_Y: 898 + m_Width: 15 + m_Height: 43 + - m_X: 548 + m_Y: 802 + m_Width: 25 + m_Height: 4 + - m_X: 605 + m_Y: 795 + m_Width: 15 + m_Height: 7 + - m_X: 662 + m_Y: 786 + m_Width: 15 + m_Height: 9 + - m_X: 782 + m_Y: 797 + m_Width: 2 + m_Height: 8 + - m_X: 485 + m_Y: 898 + m_Width: 2 + m_Height: 11 + - m_X: 906 + m_Y: 806 + m_Width: 10 + m_Height: 3 + - m_X: 1003 + m_Y: 651 + m_Width: 20 + m_Height: 145 + - m_X: 946 + m_Y: 796 + m_Width: 12 + m_Height: 10 + - m_X: 720 + m_Y: 842 + m_Width: 3 + m_Height: 14 + - m_X: 774 + m_Y: 856 + m_Width: 8 + m_Height: 4 + - m_X: 825 + m_Y: 860 + m_Width: 3 + m_Height: 7 + - m_X: 873 + m_Y: 867 + m_Width: 14 + m_Height: 6 + - m_X: 446 + m_Y: 1019 + m_Width: 39 + m_Height: 4 + - m_X: 484 + m_Y: 987 + m_Width: 1 + m_Height: 36 + - m_X: 535 + m_Y: 974 + m_Width: 7 + m_Height: 13 + - m_X: 765 + m_Y: 897 + m_Width: 9 + m_Height: 15 + - m_X: 720 + m_Y: 938 + m_Width: 45 + m_Height: 85 + - m_X: 809 + m_Y: 912 + m_Width: 16 + m_Height: 7 + - m_X: 852 + m_Y: 919 + m_Width: 21 + m_Height: 7 + - m_X: 916 + m_Y: 871 + m_Width: 42 + m_Height: 2 + - m_X: 957 + m_Y: 871 + m_Width: 1 + m_Height: 13 + - m_X: 557 + m_Y: 884 + m_Width: 16 + m_Height: 22 + - m_X: 557 + m_Y: 884 + m_Width: 13 + m_Height: 25 + - m_X: 615 + m_Y: 880 + m_Width: 5 + m_Height: 30 + - m_X: 612 + m_Y: 906 + m_Width: 8 + m_Height: 4 + - m_X: 535 + m_Y: 1019 + m_Width: 38 + m_Height: 4 + - m_X: 570 + m_Y: 982 + m_Width: 3 + m_Height: 5 + - m_X: 535 + m_Y: 1021 + m_Width: 67 + m_Height: 2 + - m_X: 602 + m_Y: 982 + m_Width: 10 + m_Height: 3 + - m_X: 647 + m_Y: 978 + m_Width: 318 + m_Height: 7 + - m_X: 658 + m_Y: 978 + m_Width: 307 + m_Height: 45 + - m_X: 658 + m_Y: 989 + m_Width: 365 + m_Height: 34 + - m_X: 1012 + m_Y: 651 + m_Width: 11 + m_Height: 271 + - m_X: 999 + m_Y: 884 + m_Width: 24 + m_Height: 38 + - m_X: 957 + m_Y: 922 + m_Width: 29 + m_Height: 4 + - m_X: 1017 + m_Y: 593 + m_Width: 6 + m_Height: 358 + - m_X: 1020 + m_Y: 593 + m_Width: 3 + m_Height: 430 + - m_X: 1015 + m_Y: 651 + m_Width: 8 + m_Height: 300 + - m_X: 653 + m_Y: 910 + m_Width: 24 + m_Height: 29 + - m_X: 653 + m_Y: 910 + m_Width: 23 + m_Height: 38 + - m_X: 704 + m_Y: 939 + m_Width: 61 + m_Height: 84 + - m_X: 704 + m_Y: 950 + m_Width: 105 + m_Height: 73 + - m_X: 704 + m_Y: 961 + m_Width: 148 + m_Height: 62 + - m_X: 647 + m_Y: 977 + m_Width: 274 + m_Height: 8 + - m_X: 647 + m_Y: 976 + m_Width: 29 + m_Height: 9 + - m_X: 658 + m_Y: 977 + m_Width: 263 + m_Height: 46 + - m_X: 658 + m_Y: 976 + m_Width: 18 + m_Height: 47 + - m_X: 704 + m_Y: 974 + m_Width: 217 + m_Height: 49 + m_fontInfo: + Name: Liberation Sans + PointSize: 86 + Scale: 1 + CharacterCount: 250 + LineHeight: 98.90625 + Baseline: 0 + Ascender: 77.84375 + CapHeight: 59.1875 + Descender: -18.21875 + CenterLine: 0 + SuperscriptOffset: 77.84375 + SubscriptOffset: -12.261719 + SubSize: 0.5 + Underline: -12.261719 + UnderlineThickness: 6.298828 + strikethrough: 23.675 + strikethroughThickness: 0 + TabWidth: 239.0625 + Padding: 9 + AtlasWidth: 1024 + AtlasHeight: 1024 + atlas: {fileID: 0} + m_AtlasWidth: 1024 + m_AtlasHeight: 1024 + m_AtlasPadding: 9 + m_AtlasRenderMode: 4169 + m_glyphInfoList: [] + m_KerningTable: + kerningPairs: [] + m_FontFeatureTable: + m_GlyphPairAdjustmentRecords: + - m_FirstAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 20 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 20 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 89 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 90 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 92 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 2020 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 41 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 41 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 41 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 47 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 47 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 47 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 47 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 47 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 47 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 92 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 47 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 2020 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 51 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 51 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -11.09375 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 51 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -11.09375 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 51 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 53 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 53 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 53 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 53 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 16 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 29 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 30 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 50 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 68 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 70 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 72 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 76 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 82 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 85 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 86 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 88 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 90 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 92 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -7.890625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 16 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -7.890625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 29 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 30 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 68 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 72 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 76 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 82 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 85 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 88 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 92 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 16 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 29 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 30 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 68 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 72 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 82 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 85 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 88 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -0.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 92 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -11.09375 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -7.890625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 16 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -11.09375 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 29 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -5.578125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 30 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 68 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -7.890625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 72 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 76 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -7.890625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 82 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 83 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -7.890625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 84 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 88 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 60 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 89 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 73 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 73 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 73 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 2020 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 85 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 85 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 85 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 2020 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 89 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 89 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 90 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 90 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 92 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 92 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 2019 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 2019 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 2020 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 2020 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 86 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 2020 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 2020 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + fallbackFontAssets: [] + m_FallbackFontAssetTable: + - {fileID: 11400000, guid: 2e498d1c8094910479dc3e1b768306a4, type: 2} + m_CreationSettings: + sourceFontFileName: + sourceFontFileGUID: e3265ab4bf004d28a9537516768c1c75 + pointSizeSamplingMode: 0 + pointSize: 86 + padding: 9 + packingMode: 4 + atlasWidth: 1024 + atlasHeight: 1024 + characterSetSelectionMode: 1 + characterSequence: 32 - 126, 160 - 255, 8192 - 8303, 8364, 8482, 9633 + referencedFontAssetGUID: 8f586378b4e144a9851e7b34d9b748ee + referencedTextAssetGUID: + fontStyle: 0 + fontStyleModifier: 0 + renderMode: 4169 + includeFontFeatures: 1 + m_FontWeightTable: + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + fontWeights: + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + normalStyle: 0 + normalSpacingOffset: 0 + boldStyle: 0.75 + boldSpacing: 7 + italicStyle: 35 + tabSize: 10 +--- !u!28 &28684132378477856 +Texture2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LiberationSans SDF Atlas + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + serializedVersion: 2 + m_Width: 1024 + m_Height: 1024 + m_CompleteImageSize: 1048576 + m_TextureFormat: 1 + m_MipCount: 1 + m_IsReadable: 0 + m_StreamingMipmaps: 0 + m_StreamingMipmapsPriority: -92 + m_AlphaIsTransparency: 0 + m_ImageCount: 1 + m_TextureDimension: 2 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 1 + m_MipBias: 0 + m_WrapU: 0 + m_WrapV: 0 + m_WrapW: 0 + m_LightmapFormat: 0 + m_ColorSpace: 0 + image data: 1048576 + _typelessdata: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090b0d0f101112121313131212100f0e0c0a08060603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a1313131313131313130e0d0b08030000000000000000000000000000000000000002070a0c0d1313131313131313130b0a0805000000000000000000000000000000000000000000000000000000000000050a0d0f10131313131313130e0d0b0803000000000000000000000000000000000000000000000004080a0a13131313131313131313131313131313131313131313131313131313131313131313131313131313130a09070400000000000000000000000000000000000000000006060606060600000000000000000000000000000000000000000000020507080c0f1112131211100c080806020000000000000000000000030607090d1011121312110e0a070604010000000000000000000000000000000000000000000000000000000000000000000000000606060606060000000000000000000000000000000000000000000000000000000000010507070c0f1112131312100c08080602000000000000000000000000000000000000000000000000000000000000000000030608091313131313120707050100000000000000000000000000000000000000000000000000000000000105070713131313130c0b09060100000000000000000000000000000000000000000000000000000000000306080913131313131207070501000000000000000000000000000000000000000000000000000000000105070713131313130c0b09060100000000000000000000000000000000000004080a0a0b0b0b0b0b0b0b07060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a0807050200000000000000000000000000000000000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c0803000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c080300000000000000000000000000000000000000000000040613131313131313131312110e09040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070c10131315171a1c1d1e1e1f20201f1f1e1d1c1b19171513120f0b06060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b101316172020202020202020201b1a18140f080100000000000000000000000000000000070e1317191a202020202020202020181715110c060000000000000000000000000000000000000000000000000000030a10161a1c1d202020202020201b1a18140f080100000000000000000000000000000000000000050b101416172020202020202020202020202020202020202020202020202020202020202020202020202020202020171614100b0500000000000000000000000000000106090b0c131313131313080705020000000000000000000000000000000002090e111414181c1e1f201f1e1c191514120e090300000000000000060b101213161a1d1e1f201e1d1b171413110d0701000000000000000000000000000000000000000000000000000000000000030608091313131313130b0a0805000000000000000000000000000000000000000000000002080d111314191c1e1f201f1e1c191514120e09030000000000000000000000000000000000000000000000000000000000040a0f12151520202020201f1413110d08020000000000000000000000000000000000000000000000000002080d1113142020202020191815120d060000000000000000000000000000000000000000000000000000040a0f12151520202020201f1413110d080200000000000000000000000000000000000000000000000002080d1113142020202020191815120d06000000000000000000000000000000050b10141617181818181818181413110d07010000000000000000000001030405060606060504040200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e0906030000000000000000000000000000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f09010000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f0901000000000000000000000000000000000001070c10132020202020202020201f1d1a150f0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104090e1214181c1f20222426282a2a2b2c2c2c2c2c2b2a2927262422201f1c171413110d0705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f161c2022232d2d2d2d2d2d2d2d2d282724201a130b0200000000000000000000000000010a12191f2326272d2d2d2d2d2d2d2d2d2424211d171009000000000000000000000000000000000000000000000000040d151c2126292a2d2d2d2d2d2d2d2727241f1a130b0200000000000000000000000000000000000810171c2023242d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423201c161008000000000000000000000000060d1215181920202020201f1514120e090300000000000000000000000002080e141a1e202125292a2b2c2c2b292622211e1a150e0903000000020a11171c1f2023272a2b2c2c2b2a282420201d18130c07000000000000000000000000000000000000000000000000000000030a0f121515202020202020181715110c060000000000000000000000000000000000000002080d13191e202125292b2c2d2c2b292622211e1a150e09030000000000000000000000000000000000000000000000000000060e151b1f21222c2d2d2d2d2c21201d19130c040000000000000000000000000000000000000000000000050c13191d20212d2d2d2d2d2524221e181109010000000000000000000000000000000000000000000000060e151b1f21222c2d2d2d2d2c21201d19130c0400000000000000000000000000000000000000000000050c13191d20212d2d2d2d2d2524221e181109010000000000000000000000000810171c2023242525252525252520201d18130c0400000000030607090b0e0f1112121313121211100f0d0a0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c0600000000000000000000000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b030000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b03000000000000000000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a2620191209000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d11141a1e2123282c2d2f31333537373838393939383837353433302e2d2b282221201d1814120e0904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111921272c2f303939393939393939393433302b251d140b010000000000000000000000000a141c242a2f323339393939393939393931302d28221b120900000000000000000000000000000000000000000000030d161f262d323536393939393939393433302b251d140b0000000000000000000000000000000008111a22282d30313939393939393939393939393939393939393939393939393939393939393939393939393939393939302f2c28211a1108000000000000000000010911181e2224252d2d2d2d2d2c22211e1a140d0600000000000000000000050d14191f252a2d2e3235373839383736322f2e2b26201a150e0600070c141c23282b2d303336383939383734312d2c29241d18120b03000000000000000000000000000000000000000000000000060e151a1f21222c2d2d2d2d2d2424211d1710090000000000000000000000000000000000050c13191e252a2d2e3235373939393836332e2d2b261f1a150e0600000000000000000000000000000000000000000000000006101820262b2e2f3939393939382e2d29251e160e04000000000000000000000000000000000000000000050e161e252a2d2e393939393932312e29231b13090000000000000000000000000000000000000000000006101820262b2e2f3939393939382e2d29251e160e040000000000000000000000000000000000000000050e161e252a2d2e393939393932312e29231b1309000000000000000000000008121a22282d3031313131313131312d2c29241d160d0405060b10121316181a1c1d1f1f20201f1f1e1d1b19171514120e0906030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d0802000000000000000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b01000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b0100000000000000000000000000030d151d23292c3939393939393939393836312b241b1208000000000000000000000000000000000000000000000000000000000000000000000000000003090e13181d20262a2d2e34383a3c3e40424344454546464645454342413f3d3b3938332d2d2c2924201e1a14100c070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f19232b33383c3d46464646464646464641403c362f261d1308000000000000000000000007121c262e353b3f404646464646464646463e3d39342c241b10060000000000000000000000000000000000000000000a151f2831383e42434646464646464641403c362f261d0f05000000000000000000000000000005101a232c33393c3d46464646464646464646464646464646464646464646464646464646464646464646464646464646463d3c38332c231a1005000000000000000009131b23292e31323939393939392e2d2a261f180f060000000000000000080e171e252a30363a3b3f424445464544433f3b3a37312b2620180f0b12181e262e34383a3c40434445464544413d3a39352f28231c150c050000000000000000000000000000000000000000000006101820262b2e2f39393939393931302d28221a1209000000000000000000000000000000070e161e252a3036393a3f424445464645433f3b3a37312b2620180f0900000000000000000000000000000000000000000000040e18222a31373a3c4646464646453a3935302820160c0200000000000000000000000000000000000000020c1620283036394646464646463f3e3a342d251b11060000000000000000000000000000000000000000040e18222a31373a3c4646464646453a3935302820160c02000000000000000000000000000000000000020c1620283036394646464646463f3e3a342d251b110600000000000000000005101a242c33393c3d3e3e3e3e3e3e3e3a39352f281f160b1113171c1f20222527292a2b2c2c2d2c2b2b2a28262422211e1a1312100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d08020000000000000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d130900000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d1309000000000000000000000000010b151f272f343846464646464646464645423d352d24190f04000000000000000000000000000000000000000000000000000000000000000000000001070c141a1d24292c31363a3b404546484a4d4f505151525353525251504f4e4c4a4846443f3d3a39352f2d2a251f1d18120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212b353d44484a5353535353535353534e4c4841382f251a0f03000000000000000000020e19242e3840474b4d5353535353535353534b49453e362c22170c000000000000000000000000000000000000000005101c26313a43494e50535353535353534e4c4841382f21170d03000000000000000000000000000b17222c363e44494a53535353535353535353535353535353535353535353535353535353535353535353535353535353534a48443e352c21160b0000000000000006111b252d343a3e3f4646464646463b3a36312921180b0200000000000008111a202930363b4246474b4f51525352514f4c4847423c37312a211b151c232830383f4446494d5051525351504e4a4745403a342e271e170e050000000000000000000000000000000000000000030e18222a31373a3c4646464646463e3d39342c241a0e0500000000000000000000000000071019202830363a4146474c4f51525352514f4c4847423c37312a211b12090100000000000000000000000000000000000000000a15202a343c4347485353535353524746413a32281e13080000000000000000000000000000000000000008131e28323a41465353535353534c4a463f372d23180d01000000000000000000000000000000000000000a15202a343c4347485353535353524746413a32281e130800000000000000000000000000000000000008131e28323a41465353535353534c4a463f372d23180d0100000000000000000b17222c363e44494a4b4b4b4b4b4b4b4745403a31281d191d2023282b2d2f3234363738393939393837373533312e2d2a26201f1c17110d08020000000000000000000000000000000000000000000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d050000000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f0300030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f03000000000000000000000007121d2731394045535353535353535353524e473f352b20150900000000000000000000000000000000000000000000000000000000000000000000030b12181f252a2f35393b4246484b51535557595b5d5d5e5f5f5f5f5f5e5d5c5a59575553504a4a4745413b3a36302c29241d1a140f0a03000000000000000000000000000000000000000000000000000000000000000000000000000004101c27333d474f54566060606060606060605b58534a41362b20140400000000000000000007131f2a35404a52575a606060606060606060575550483e34281d1101000000000000000000000000000000000000000a16212d38434c545a5d606060606060605a58534a4133291f140900000000000000000000000004101c28333e48505557606060606060606060606060606060606060606060606060606060606060606060606060606060606057554f473e33281c10040000000000010d18232d373f464a4c5353535353524846423b33291d140a000000000008111a232c323b41464d5254585c5d5e5f5f5e5c5955534d47423c332d241e272e343e424a5053565a5d5e5f5f5e5d5b5753514b444039302920170f05000000000000000000000000000000000000000a15202a343c4347485353535353534b49453e362c20170d020000000000000000000000071119222b323a41464c5254585c5e5f605f5e5c5955534d47423c332d241b130900000000000000000000000000000000000000030f1b26313c464e53555f606060605f54524c443a3025190c030000000000000000000003030303030303010d1925303a444c525f6060606060585651493f34291e1206000000000000000000000000000000000000030f1b26313c464e53555f606060605f54524c443a3025190c0300000000000000000003030303030303010d1925303a444c525f6060606060585651493f34291e12060000000000000004101c28333e485055575858585858585853514b433a2f2625292d2e34383a3c3e414244454546464545444342403d3b3a36312d2c28231c19130d080200000000000000000000000000000000000000000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e08020000000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b201408000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b20140800000000000000000000000c18232f39434b515f606060606060605f5e5951473d31261a0e010000000000000000000000000000000000000000000000000000000000000000060d151d232930363a4045474d5355545c60626466686a6a6b6b6c6c6c6b6b6a6867666361605b545654514b4846423b39352f2a251f1a150e08020000000000000000000000000000000000000000000000000000000000000000000000000713202c38444f5960636c6c6c6c6c6c6c6c6c67645c53483c3020150a0000000000000000000a17232f3b47525c63666c6c6c6c6c6c6c6c6c64615a5045392d1d1207000000000000000000000000000000000000000d1a26323e49545e66696c6c6c6c6c6c6c67645c53453b30251a0e0200000000000000000000000814202d3944505a61646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6361594f44382c201407000000000006121e29343f4951565860606060605f55534d453b2f261b1106000000050f1a232c353e444c52575e6165686a6b6c6b6a6965625f57534d453f372d27303940444f545c606366696b6c6c6b6a6764605d55514a423b322921170b020000000000000000000000000000000000030f1a26313c464e53555f6060606060575550483e32291e130800000000000000000000050e19232b343d444c52565e6165686a6c6c6c6b6966615f57534d453e362d251b110800000000000000000000000000000000000006121f2b37434e585f626c6c6c6c6c6b615e564c4135291e150b00000000000004080a0a1010101010101010111d2a36414c565e6c6c6c6c6c6c65625b51463a2e22150900000000000000000000000000000000000006121f2b37434e585f626c6c6c6c6c6b615e564c4135291e150b000000000004080a0a1010101010101010111d2a36414c565e6c6c6c6c6c6c65625b51463a2e221509000000000000000814202d3944505a616464646464646464605d554b41382d3035393a3f4446494b4d4f5052525353525251504e4c4a4846423d3a38342e29251e19140d050000000000000000000000000000000000000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d0500000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c0000000000000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d1104000000000000000000000000000000000000000000000000000000000000030a11171f272f343b42464b5153575f6165666d6f71737576777878797979787876757472706e6c666663605d5554524d4745403936312b262019140d0500000000000000000000000000000000000000000000000000000000000000000000000916222f3c4854606b70797979797979797979746e64584c3c32261b0f0300000000000000000c1926323f4b57636e73797979797979797979716c615549392f23180c000000000000000000000000000000000000000f1c2935424e5a66707679797979797979746e64574d42362a1f140900000000000000000000000a1623303c4955616c707979797979797979797979797979797979797979797979797979797979797979797979797979797979706b6155483c2f23160900000000000915222e3a46515b62656c6c6c6c6c6c615f574d41382d22170b0300030d17212c353e474f565e61696e7275777879787776726e69625f5751493f373039424a515961666d6f7376777879787774706d67605c544d443b33291d140a000000000000000000000000000000000006121f2b37434e585f626c6c6c6c6c6c64615a50443a3025190e040000000000000000020d17202b353d464f565e61686d7275777879797876726e69625f5750483f372d23190d0400000000000000000000000000000000000815212e3a47535f6a6f7979797979786d685e52463d30271c1207000000050b101416171d1d1d1d1d1d1d1d1d202d3946525e68767979797979726d62564a3e312418080100000000000000000000000000000000000815212e3a47535f6a6f7979797979786d685e52463d30271c12070000050b101416171d1d1d1d1d1d1d1d1d202d3946525e68767979797979726d62564a3e31241808010000000000000a1623303c4955616c70717171717171716d675d53493f383a4146474a505355585a5c5d5e5f5f605f5e5e5d5b595755534d4946443f3835302a251e170e080200000000000000000000000000000000000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e06000000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e0000000000000000000006131f2c3845515c67767979797979797979756a5e5245382c1f12060000000000000000000000000000000000000000000000000000000000040c151c2328313940454d52555d6065696e7276797b7d80828384848586868585848382817f7d7b797673706d6765615e5753514b46423b37312a251e170e07000000000000000000000000000000000000000000000000000000000000000000030f1b27333f495363707d868686868686868686807467584e43372b1f12060000000000000005111e2a36424d576673808686868686868686867e7164554b4034291c1004000000000000000000000000000000000000101d2a3643505d697682868686868686868074695e52463b30251a0e02000000000000000000000a1724313d4a5764707d86868686868686868686868686868686868686868686868686868686868686868686868686868686867d7063574a3d3024170a00000000000b1824313e4a56626d727979797979796e695f53493f33271f14090009141f29333e474f5961686e747b7e828485868584827f7b756e69625b51493f39424b545c606c70787c80838485868483817d7a726d665e564d453b2f261c1106000000000000000000000000000000000815212e3a47535f6a6f797979797979716c61564c41362a20160c020000000000000009141f29333d474f5960686d747a7f828485868584827f7b756e69625a51493f352b1f160c01000000000000000000000000000000000915222f3c4855626f7c8786868686857a6d61594f42392e23180c03000810171c202324292929292929292929292e3a4754616d7a86868686867f7265584c3f322519130c04000000000000000000000000000000000915222f3c4855626f7c8786868686857a6d61594f42392e23180c030810171c202324292929292929292929292e3a4754616d7a86868686867f7265584c3f322519130c0400000000000a1724313d4a5764707e7e7e7e7e7e7e7e796d655b504443484c5254545c60626567696a6b6c6c6c6c6b6a6a686664615f575653504a46413a3630292019130d0500000000000000000000000000000000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f070000000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e000000000000000000000714202d3a4753606d798686868686868687796c5f5346392c20130600000000000000000000000000000000000000000000000000000000060d161e262e343d434b51575e61676d72777b7f8286888a8c8e909091929292929291908f8d8c8a888583807d7a76726e6964605d55534d47433c36302920191007000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b6574818d939393939393939184786a5f53473b2e211508000000000000000714202d3a46525e69778390939393939393938e8275675c5145382c1f13060000000000000000000000000000000000000a1723303d4a5663707d89959393939392867b6e61574d42362a1f1409000000000000000000000a1724313d4a5764707d8a9393939393939393939393939393939393939393939393939393939393939393939393939393938a7d7063574a3d3024170a00000000000c1925323f4c5865727f8686868686867b6e655b50443b31251a0e050e1a25313b454f59616b707a81878b8f90919292918f8c88827b726d625b5147404b545c666d757d84898d9091929291908e8a857f786e695e574d42382d22170b010000000000000000000000000000000915222f3c4855626f7b8786868686867e71685e52463e32281e1308000000000000020e1a25303b454f59606b6f7a81868b8f91929392918f8c87827b716c625b51473d31281d1307000000000000000000000000000000000815212e3a47535f6a73808d9693978e81746b60544a4034281f140908111a21282d303136363636363636363636363a4754616d7a879393938b7f7265584c3f3229241e160d040000000000000000000000000000000815212e3a47535f6a73808d9693978e81746b60544a4034281f1409111a21282d303136363636363636363636363a4754616d7a879393938b7f7265584c3f3229241e160d04000000000a1724303d4a5763707d868b8b8b8b8b8b81776c605a504e54565e6165666d6f7174757778787979787877767573706e696763605c54524c46413b322a251e170e060000000000000000000000000000000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c30231609000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c30231609000000000000000000000714202d3a4753606d7a8693939393939286796c5f5346392c201306000000000000000000000000000000000000000000000000000000060f171f2830383f444f555c60696e737a7f84888b8f929897999b9d9d9e9e9f9f9f9e9e9d9b9a99969892908c8986827f7b76716d67615e57534e46413b322b22190f04000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919e9f9f9f9f9fa196887c6f6255483c3025190d010000000000000814212e3b4754616e7b8795a09f9f9f9f9f9f9285796d6053473a2d22170b0000000000000000000000000000000000000916222f3c4854606b7683909da79fa3998d8074695e52463b3025190e020000000000000000000a1724313d4a5764707d8a979f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f968a7d7063574a3d3024170a00000000000613202d394653606c7782909893988f82776c60574d42362a20170d121e2a36424d57616b707d868e939a9b9d9e9d9d9d9c98948f877f726d62594f45515c666d78818a9196999c9e9d9d9e9d9a98928c837b6e695e544a3f33281d12070000000000000000000000000000000815212e3a47535f6a737f8c95939392857a6d615a50443a3024190d04000000000005111e2a36424d57606b6f7d858d92999b9d9c9b9c9e9c9a938f867e726d62594f433a2f24180d0100000000000000000000000000000006121f2b37434e58606d7984919e9f93887d6f665c51443b31261a0d101a232c33393c3d4343434343434343434343434754616d7a87949f988b7f7265584c3f39352f281f160c01000000000000000000000000000006121f2b37434e58606d7984919e9f93887d6f665c51443b31261a0d1a232c33393c3d4343434343434343434343434754616d7a87949f988b7f7265584c3f39352f281f160c010000000a16232f3c4855616b727f8c93979797938d80736c6158586062686d7175797c7e8082838585868685858483817f7d7b7874706d66615e56524c443e36302920180f07000000000000000000000000000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b22191007000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f221509000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f221509000000000000000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000000050e172129313a424a505960676d737b80858b9195989c9fa3a39f9d9b9a999898989898999b9c9d9fa3a29f9c9999928f8b87837e79746e69625f58524c443d342b21160a000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8996a1adacacacb2a8998c7f7266564c41362a1d1105000000000004101c2834404b5465717e8b98a7b1acacacaea2988a7d7063544a3f33281c0f0300000000000000000000000000000000000714202c38444f5963707d8a959fabab9f92867b6e61564d42362a1f14080000000000000000000a1724313d4a5764707d8a97a3acacb2acaba6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a3968a7d7063574a3d3024170a000000000005121f2b3744505b656e7b86929f9f948b7e72695e53463f32291f1414212d3a46535e69707d8692989f9d9b9691909192999f9e99928b7f726b60554e58606d78818e939ea09e9892909091979d9f9f9590847b6e665b5044392f23180c00000000000000000000000000000006121f2b37434e58606d78839099a1978e81756c61564c4135291f160c01000000000714202d3a46525e696f7d8691979f9f9892908e8f91979f9f98928b7f726b60554b4035291d1307000000000000000000000000000000030f1b26313c45515d67707d8a939e9a9183786d60574d42362a1f1617212c353e44494a5050505050505050505050505054616d7a8794a0988b7f726558504745413a31281e13080000000000000000000000000000030f1b26313c45515d67707d8a939e9a9183786d60574d42362a1f16212c353e44494a5050505050505050505050505054616d7a8794a0988b7f726558504745413a31281e13080000000714202c38444f59636d74818e959fa59c928a7e716a60626a6f757a7e8285888b8d8f9091929293929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f13070007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f1307000000000000000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000000030d172029333b434c545c606b707980868d92979da0a29f9b989892908e8d8c8c8b8b8b8c8d8e8f919299979a9d9fa39f9c9a938f8b85807b756e6a615e564e463d32271b0f03000000000000000000000000000000000000000000000000000000000006121e2b37424d576673808d99a8b1acaaacaea99d908376685e5246392d201306000000000006131f2c3845515c6675828f9ba8b0aba9abb0aa9a8e8174665b5044382b1f1206000000000000000000000000000000000004101c27333d4855616b7783909da7aea3988d8074695e52463b3025190e0200000000000000000a1724313d4a5764707d8a97a3b0b2a8a19e9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a968a7d7063574a3d3024170a0000000000030f1b27333f49535f69727f8c959f9f92867b6e615a50443b3025191f2c38434e58616e7b869298a29c938e88848384868c9299a39f93887d6f675c535f6a73808d939ea197928b858483858990959fa0969083786c60554b4034291c10040000000000000000000000000000030f1a26313c44515c666f7c87929f9e938a7d70685d52453d31281d130700000007131f2c38434f59616e7b859298a19a938c86838282858a9297a29f93877d70675d51453a2f24180d010000000000000000000000000000000a15202935404b55616b75818e98a0958c7f72695f53463e31281e1c28333e474f55575c5c5c5c5c5c5c5c5c5c5c5c5c5c616d7a8794a0988b7f72655c5c54524c433a2f24190d0100000000000000000000000000000a15202935404b55616b75818e98a0958c7f72695f53463e31281e28333e474f55575c5c5c5c5c5c5c5c5c5c5c5c5c5c616d7a8794a0988b7f72655c5c54524c433a2f24190d01000004101c28333e47515b606d79839096a1a49f92867c6f6a6f767c81868b8f9298989a9c9d9e9f9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b2219100700000000000000000000000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c030000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f0300030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f03000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000000020b151f29323b454d565d666d747d848c92999fa29f9c98928f8b88858381807f7f7e7e7f7f8081828486888a8d9092999b9ea19f9c98928d86817c746e6860584e43382c1f130700000000000000000000000000000000000000000000000000000000000814212e3a47535f697784919daaa7a09d9fa2aa9f93867a6d6154473a2e23170c00000000000713202d3a4653606d7985929faca69f9c9fa6ab9e9285796c605346392d20130a0000000000000000000000000000000000000b16212c38444f5964707d8a95a0acaa9f92867b6e61564d41362a1e140800000000000000000a1724313d4a5764707d8a97a3b0aca196918d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7d7063574a3d3024170a0000000000000b17222d38414d57606d78839099a2988f82766c62564d41362a20222e3b4854606a75828f98a29c918c817b7876777a7f87929aa49a9184796d6056626e7c87929fa19791857e797776787c838f949f9f958b7f72675c5145382c1f13060000000000000000000000000000000a15202834404a54606a73808d96a09e91857a6d60594f433a2f24180d0300000915222f3b4854606b75828f97a19f9388807a767576797e859297a2999184796d60554b4035291d1104000000000000000000000000000000040c18242f39434f59616e7b85929f9f92867b6e615a50433a2f24202d39444f5961646969696969696969696969696969696d7a8794a0988b7f72696969605d564c4135291d11040000000000000000000000000000040c18242f39434f59616e7b85929f9f92867b6e615a50433a2f242d39444f5961646969696969696969696969696969696d7a8794a0988b7f72696969605d564c4135291d11040000000b17212c353f45515c676e7a849198a2a39891857b747c82898e92999c9fa2aaa7a8aaa8a8a7a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e050000000000000000000000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b0000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a0000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a00000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000a141d27313a444d575f686d78808991969fa39e9b948f8a85827e7b7977757373727171727273747677797b7e8083868a8e92979b9fa29f99928e87817a6f6a6054483b2e22150900000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a0aca095909298a2a4998a7e7164544a3f34281c1003000000000a1723303d4a5663707d8998a2a99f9490949faba197897c6f6356493c31261b0f03000000000000000000000000000000000005101c28333e4653606c7883909da7aea3988d8074685e52463b3025190e02000000000000000a1724313d4a5764707d8a97a3b0ab9e91848080808080808080808080808080808080808080808080808080808080808080807c6e6255483b2f22150800000000000006111b262f3c44505c666f7c86929f9f948b7e71685e52463e32292834404b54626f7c89939e9f948c7f746e696a686d737e88939fa0968b7f72655e6875828f99a39e91857b716d676a6a6f78828f98a29f9285796d6053473a2e23170b000000000000000000000000000000030c18232e39424e58606d7984919aa1978e81746b60554b4035291f150b0105111e2a36414c56636f7c89939e9e938b7e736d6868666d717c85929fa1968c8073675d5145392c2013070000000000000000000000000000000007121d27313e46525e69727f8b959f988f82756c61554c41352923303c4955616c70767676767676767676767676767676767a8794a0988b7f767676766d685d5245392c20130600000000000000000000000000000007121d27313e46525e69727f8b959f988f82756c61554c413529303c4955616c70767676767676767676767676767676767a8794a0988b7f767676766d685d5245392c20130600000005101a232834404b555e686f7c86929aa4a197908381878f949b9fa3abacaaaba39f9d9c9b9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c030000000000000000000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d1207000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f0400000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f0400000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000006111c262f39434c565f696e7a828d929ea0a09d938e88827d7975716e6c666867666565656565666869666d6e7174767a7d81858a8e92989ea19f99928e867c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000005111e2a36414c5666727f8c99a7aa9d908386929fab9b8e8175665c5044382c1f120600000005121e2a36424d576774808d9aaaa1979083909ca9a99a8d807367584e43372b1f12060000000000000000000000000000000000000b161f2b3744505b65717e8a95a0acaa9f92867b6e61564c41362a1e14080a0a0a0a0a0a0a0a1724313d4a5764707d8a97a3b0a99c8f827673737373737373737373737373737373737373737373737373737373737373736e6a5f53473a2e211408000000000000000a141d28343f4a545f6a737f8c95a09f92857b6e615a50443a302c3845515c6674818e9aa59c9082786c615f575d616c74818d99a49d9083776a616d7a86929fa0958a7d7069605c5860666e7b86929fa2978a7e7164544a3f34281c100300000000000000000000000000000007121c27303c45515c676f7d88939f9d93897d70675d51453d31271d12070714202d3946525e6875828f9ca59b8e81756c615d565c606a717e8b96a09f92857a6d6053473a2f24180c00000000000000000000000000000000010b151f2a36424d56606c788390999e948a7e71675d51453c3026313d4a5764707d8283838383838383838383838383838383909ca99e9184838383827a6d6054473a2d211407000000000000000000000000000000010b151f2a36424d56606c788390999e948a7e71675d51453c30313d4a5764707d8283838383838383838383838383838383909ca99e9184838383827a6d6054473a2d21140700000000081118232e39434c565f6a717e88939fa5a095908d93999fa6acaaa8a09d999992908f8e8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b000000000000000000000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c0300000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f24190700000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f2419070000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000b17222d38424b555e686e7b838f949da49c969189817c76706d666561605b545a5959585858595a5b545c60626467676d7174797d81868c91969da09e9285796d6053473a2d201407000000000000000000000000000000000000000000000000000000000714202d3946525e687683909da9a79a8d80828f9ca99f9285796d6053463a2d2013090000000714212d3a46535f697784919daa9e91857e8a97a8aa9e9184776a5f53473a2e211509000000000000000000000000000000000000030f1b27333f4953606c7884919da8aea3988d8074685e52463b3025191616161616161616161724313d4a5764707d8a97a3b0a99c8f82766967676767676767676767676767676767676767676767676767676767676767625f584e43372b1f120600000000000000020b17232e38424e58606d78839099a2978f82756c61564c41362d3a4653606d7985929fa2988a7d70655b534d5259616e7b87939f9f95887b6f65727e8b99a39d9184786c6057514e545e6874818d9aa99c8f8276665c5044382b1f1206000000000000000000000000000000000b151e2934404b55606b74808d96a19e9184796d60594f43392f24180c0814212e3b4754616e7a86929f9f94887b6e615a524c5058606c7884919da2978b7e7164554b4035291d100400000000000000000000000000000000030d1925303b44505b666f7c87929f9e91847a6d60584e42382e323f4b5865727e8b8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f90949faba096918f8f8f877a6d6154473a2e21140700000000000000000000000000000000030d1925303b44505b666f7c87929f9e91847a6d60584e42382e3f4b5865727e8b8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f90949faba096918f8f8f877a6d6154473a2e211407000000000007121d27303b444e58616c73808c939ea7a09d9a9fa4abaca59e9b96918c898684828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d120700000000000000000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b403428201509000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e1308000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e13080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000030f1c28333f4a545d676d7a8491959fa39f928d847d756f6a64605c545553504a4d4c4c4b4b4c4c4d4e4a51535557555d6064666d70757a7f848a9095978c7f72675d5145392c1f1306000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87939faca7978a7e7f8c99aba297897c6f6356493c31251a0e0200000815222e3b4855616e7b8896a0a89b8e827a8796a0aca096887b6f6255483c31251a0e020000000000000000000000000000000000000b17222d3844505b66717e8a96a0acaa9f92867a6e61564c41362a232323232323232323232324313d4a5764707d8a97a3b0a99c8f8276695c5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261a0f02000000000000000006111c26303c44515c666f7c87929f9e938a7e71685e52463e323c4956626f7c8997a29f9285796d6053494246535f697683909da7988b7f726875828f9bab998c8073655b5045424d5663707c8998a39f9285796d6053463a2d20130700000000000000000000000000000000030c18232f39434f59606d7984919ea1968d80746b60554b4035291e150b1825323e4b5865717e8b99a39c908376695f53464144505b65727f8c99a99c8f8276675d5145392c1f1306000000000000000000000000000000000009141f28333f4a545f6a74808d96a1978d80746a60544a3f34323f4b5865727e8b989c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa6b0a8a09e9c9c94877a6d6154473a2e211407000000000000000000000000000000000009141f28333f4a545f6a74808d96a1978d80746a60544a3f343f4b5865727e8b989c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa6b0a8a09e9c9c94877a6d6154473a2e2114070000000000000b151e29323c46505a606c77818e96a0acaaa7acafa7a09d938e89847f7c7a777575747373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c0300000000000000000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c010000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c010000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000005101a232b3844505b666d79839096a0a299928b8079706b625f5853514b4846443f40403f3e3e3f3f4041404446484b4c5154545c6063686d72797e838a91857a6d60554b4035291d100400000000000000000000000000000000000000000000000000000004111d2935414c5565727e8b9aa4aca095877a7d8999a3a9998d807366574d42362a1e12050004101d2935404b5565727f8b98a8a9988b7f7784919daaa8998c7f7366574d42362a1e120500000000000000000000000000000000000006111b28333f4a54606d7884919ea8aea2988d8073685e52463a30303030303030303030303030313d4a5764707d8a97a3b0a99c8f8276695c4f4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c332a201509000000000000000000000a141e2834404a545f6a73808d95a09e92857a6d615a50443a3f4b5865727e8b98a99c8f8276665c504138424d576673808d99a69b8e8174677784919eab96897d706353493f3b4653606d7986929fa298887b6e6255483b2f221508000000000000000000000000000000000007121d27313d45515d67707d89939e9f93887d6f675d51453d30271c121d2935414c566875828e9bab998c7f7266574d42353f4953626e7b8897a29f92867a6d6053473a2d2014070000000000000000000000000000000000020b17222d38424e58606d7984919e9f93877c6f665c50443b303f4b5865727e8b98a9a49f969393939393939393939394979ea8a39b98939393877a6d6154473a2e2114070000000000000000000000000000000000020b17222d38424e58606d7984919e9f93877c6f665c50443b3f4b5865727e8b98a9a49f969393939393939393939394979ea8a39b98939393877a6d6154473a2e211407000000000000030c17202a343e44505b656d7a84919daab6b4b3a9a0959189817c7773706d6769686766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b4034282015090000000000000000000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b00000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000b17212a36424d57606c78818f959fa29892877e736d676059534e46454040434546464544423f3b3a373134383a3b3e4145474a5053565d60666d71787e847f73675d5143392f24180c000000000000000000000000000000000000000000000000000000000613202c3945515d6776828f9cacaa9d9184777a86929faa9d908477695e53463a2d2114070006131f2c3945515d6776828f9ca9a197887c74818d9aa7aa9d908377695e53463a2d211408000000000000000000000000000000000000000b17222d3844505c66717e8b96a1acaa9f92867a6e61564c413d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4a5764707d8a97a3b0a99c8f8276695c4f43404040404040404040404040404040404040404040404040404040403b3a37312a21180e0300000000000000000000020c18232e39424e58606d79839199a1978e81756c61564c41414e5b6774818e9aa79a8d807467544a3f2f3e4b5764717e8a97a49d9083776d7a86939fa399877b6e6154473b3845515c677784909daa978a7e7164574b3e3124180b0000000000000000000000000000000000010b151f2935404b55616b74818e97a19a9184796d60584e42392e2318202d3946525d687884919ea996897c706356493d31394653606c7985929fa398897c6f6356493c3023160900000000000000000000000000000000000006111c262f3c45515d67707d8a949e999083786d60574d42363f4b5865727e8b97a19a938a86868686868686868686878c97a39b918b868686867a6d6154473a2e21140700000000000000000000000000000000000006111c262f3c45515d67707d8a949e999083786d60574d423f4b5865727e8b97a19a938a86868686868686868686878c97a39b918b868686867a6d6154473a2e2114070000000000000008131e28313a46535e696f7d86929facb9b9ada29791837d75706b6663605d555b5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e050000000000000000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c10040000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d11040000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d1104000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000004101c28333a46525e69727f8b939ea39992867d716c605c554f47434446494d5051525352514f4c4847433c37332d2f2f35393a3f44464c52545c60656c7179796d60554b4131271f1911060000000000000000000000000000000000000000000000000000000714212d3a4754606d7a86929faca79a8d81747683909da9a095877b6e6154483b2f24180c000714202d3a4753606d7a86929fab9e928579717e8a97a7aca095877b6e6154483b3025190d0100000000000000000000000000000000000006111c28343f4a54606d7984919ea8aea2988d8073685e52494949494949494949494949494949494a5764707d8a97a3b0a99c8f8276695c4f43363434343434343434343434343434343434343434343434343434342f2e2b2620180f0600000000000000000000000007121c27303c45515c676f7c87939f9e938a7e70685d5246434f5c6976828f9ca5988b7f7265584c3f2e3c4956636f7c8996a29f9285786f7b889aa49f9286796c6053463934404b556975828f9ca5998c7f7266594c3f3326190c000000000000000000000000000000000000030d18242f3a434f59606d7a85919ea0968d80736a60544a4034281e212e3a4754616d7a8796a1a297877a6d6054473a2d3744505b6576828f9caa988b7f7265584c3f3225190c000000000000000000000000000000000000000a141d2935414b55616c75828f98a0958b7f72695e52463e3a4754616d7a85919a93867d797979797979797979797a8794a0988b7f7979797976685e5246392d201307000000000000000000000000000000000000000a141d2935414b55616c75828f98a0958b7f72695e52463e4754616d7a85919a93867d797979797979797979797a8794a0988b7f7979797976685e5246392d201307000000000000010d19242f3a43505a616e7b859299a3aebbb8ab9e92857a706b6360595653514b4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b0000000000000000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a00000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d0100000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d01000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000714202c38444f59616e7b86929fa59f92877d706b615a514b4344495053565a5c5e5f5f5f5e5c5955534e46443f382f27343c424a5053565b5d5f5f5b60666c6d675c51454039312b2317110a0200000000000000000000000000000000000000000000000004101c2834404b5464717e8a99a3aea7978a7e7173808d99aba7988b7f7265554b4035291d10040a1724303d4a5763707d8a98a3a89b8f82756e7a8795a0aca7988b7f7265564c4135291d1105000000000000000000000000000000000000000b17232e3844515c66727e8b96a1adaa9f92867a6d615656565656565656565656565656565656565764707d8a97a3b0a99c8f8276695c4f433629272727272727272727272727272727272727272727272727272722211f1a150e0600000000000000000000000000000b151e2834404b55606a73808d96a09e91857a6d61594f43505d6a7683909da4978a7e7164574b3e313b4855616e7b8894a19f9286796f7c8996ac9e918578655b5044372e414e5b6774818e9aa6998d8073665a4d4033271a0d0000000000000000000000000000000000000007131d28313d45525d68717e8a939e9f92877c6f665c51443c3026232f3c4956626f7c8995a89f928578685d5245392c333f49536774818e9aa79a8d8174675a4e4134271b0e00000000000000000000000000000000000000020b18242f3a43505a616e7b86929f9f92867b6e61594f433946525e68707d88939a92857a6e656c6c6c6c6c6c6d7a8794a0988b7f726c6c6c6c5e564c41362a1d110500000000000000000000000000000000000000020b18242f3a43505a616e7b86929f9f92867b6e61594f4346525e68707d88939a92857a6e656c6c6c6c6c6c6d7a8794a0988b7f726c6c6c6c5e564c41362a1d110500000000000004111d2935414c55626c76828f97a1abb5afacada2978e81776c605a504947454042414040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c1004000000000000000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000a16232f3c4855616b75828f98a29d938b7e716b60595045414950535b606366696b6c6c6c6b6866625f58535049413d333d464e545b6063676a6b6c6c6b696663605c54514b433d3528221c140b02000000000000000000000000000000000000000000000006131f2c3845515c6675818e9babaca095877a6e707d8999a3a89c8f8275675d5145392c1f1306121f2b37434e586774818d9aaaa8988b7f72687784919daaa99c8f8376685e5246392d2013070000000000000000000000000000000000000006111c2834404a54606d7984919ea9aea2988d8073686363636363636363636363636363636363636364707d8a97a3b0a99c8f8276695c4f4336291c1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1514120f0903000000000000000000000000000000030c18232e39434e58606d7984919aa1978e81746b61564c515e6a7784919da3978a7d7064574a3d313b4754616e7a8794a1a399867a707d8a96a39e9184776b5e493f3334414d5a6774808d9aa79a8d8174675a4e4134271b0e000000000000000000000000000000030608090d0c161f2935414c56616c75818f97a2999083786d60584e42382e23313e4a5764717d8a97a49d9084776a564c4135292d404c5966737f8c99a69c8f8276695c4f4336291c10000000000000000000000006060606060606060007131d28313e46535e69727f8c95a0988e81756b61554b40414c56616b74808d95978f82776c6058606060616d7a8794a0988b7f726560605f524c443a3025190d010000000000000000000000000000020608080c0e07131d28313e46535e69727f8c95a0988e81756b61554b414c56616b74808d95978f82776c6058606060616d7a8794a0988b7f726560605f524c443a3025190d010000000000000613202c3945515d67717e8b949fa9b3aba39fa3a99e938c80736c61584e453b352f3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a000000000000000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c01000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c0100000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000007131f2c38434f5963707d8a949ea1978e81746c62594f47444c535b60656c6f7376787979787775726e6a64605b534e443f464e585f666c707477787979777673706d66605d554f4740332d261d140a00000000000000000000000000000000000000000000000713202d3a4653606d7985929fabaa9d908477686d7a86929fac9f92867a6d6053473a2d20140a15212e3a47535f6a7884919eaba196887b6e6774818d9aabac9f92867a6d6154473a2f24180c00000000000000000000000000000000000000000c18232e3945515c66727f8b97a1adaa9f92867a707070707070707070707070707070707070707070707d8a97a3b0a99c8f8276695c4f4336291c100d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0808060200000000000000000000000000000000000007121d27303d45515d67707d88939f9e938a7d70685d52515e6b7884919ea3968a7d7063574a3d303a4754616d7a8794a0a194877a717d8a97a49d9184776a5e51442d34404d5a6773808d9aa69b8e8175685b4e4235281b0f00000000000000000000000000040a0f1315161a1d1f1924303a44505a616e7a85929ea0958c7f736a5f544a3f3428323f4b5865727e8b98a59c8f8376695c50432f24323e4b5865717e8b98a49d9083776a5d5044372a1d1100000000000002060a0c0d131313131313131313130c161f2a36424d57606d788390999e938a7d70675d51453c444f59606d79839098948c7f726a60554b54616d7a8794a0988b7f726558535346413a32281e13080000000000000000000000000003090e121415191b1d1e161f2a36424d57606d788390999e938a7d70675d5145444f59606d79839098948c7f726a60554b54616d7a8794a0988b7f726558535346413a32281e130800000000000004111d2935414c55606d7a85929ea6b0aaa2999299a1a59c928a7e716a60574d43392f26272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f00000000000000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c201304000000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c2013040000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000915222f3b4854606b7683909da69e91857a6d605a5047454d565e656c71787c80838485868584827f7b77716c65605850494e58606a6f787d81838586858483807c78726d67605952443f382f261c1106000000000000000000000000000000000000000000030f1b27333f495363707d8a98a2aeaa9a8d807367677683909ca9a3988a7d7063574a3d31261b0f15222f3c4855626f7b8896a1ab9e9184786a64717d8a99a3afa3998b7e7164554b4035291d10040000000000000000000000000000000000000007121c2834404b54606d7985919ea9aea2988e817c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7f8c99a6b2a99c8f8276695c4f4336291c1003010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000b151e2935404b55606b74818d96a19e91847a6d60594f5e6a7784919da3978a7d7064574a3d313b4754616e7a8794a1aa93877a707d8a96a39e9184776b5e51442f34414d5a6774808d9aa79a8e8174675b4e4134281b0e0000000000000000000000040a0f151b1f212226292b2c2c28323e46525e68717e8b949e9f92877c6f665c50443c2f33404c5966737f8c99a69c8f8275695c4f423629313e4b5764717e8a97a49e9184786b5e5145382b1e120000000000070d121619192020202020202020202020201a25313b44505c666f7c87939f9e9184796d60584e413d45515c676f7c86929f92867c6f675d5154616d7a8794a0988b7f7265584c3f3936302820160c020000000000000000000000060c11151a1e212226282a2b2c2c25313b44505c666f7c87939f9e9184796d60584e4145515c676f7c86929f92867c6f675d5154616d7a8794a0988b7f7265584c3f3936302820160c020000000000000613202c3945515d67737f8c97a2adaea29892869196a1a49f92867c6f695e554b41382d2217171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000000000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c10040000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d1104000000000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d11040000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000005111e2a36424d56636f7c89959f9f958a7e71685d5248434d575e686d777e84898d8f91929292918f8c88837e786f6a605b5354606a6f7c83898e9092929291908c89847f796f6b635c504a42382d22171007000000000000000000000000000000000000000005121f2b3744505b6574818e9aaaaea398897d70636673808c99a9aa9a8d817467584e43372b1f121d2935414c5666727f8c99a8ac9b8e817468606d7a86929facab9b8f8275675d5145382c1f130600000000000000000000000000000000000000000c18232e3945515d67727f8c97a1adaa9d938e898989898989898989898989898989898989898989898c919ca8b5a99c8f8276695c4f4336291c100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c18242f39434f59606d7984919ea1968e81746b60555d6a7783909da4978a7d7164574a3e313b4855616e7b8894a1a2988679707c8996a39e9184786b564c413534414e5b6774818e9aa69a8d8073675a4d4034271a0d00000000000000000000070e151b20262b2e2f3336383939393736414c56626c76828f98a2999083786d60574d41382d404d596673808c99a69b8e8275685b4f423528313d4a5764707d8a97a39e9285786b5f5245382c1f12000000010a12191e2325262d2d2d2d2d2d2d2d2d2d2d2d2d2d28343f4a54606a74808d97a1968d80736a5f53493f404b555f6a727f8b94999184796d605a54616d7a8794a0988b7f7265584c3f322a251e160e050000000000000000000002090e171d1f262b2e2f3235373839393938343f4a54606a74808d97a1968d80736a5f5349404b555f6a727f8b94999184796d605a54616d7a8794a0988b7f7265584c3f322a251e160e05000000000000000714212d3a4754606d7a85929fa9b3a99f92867c849198a2a29891847b6e675d53493f332722190f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c0000000000000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f130600000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000714202d3a46525e6975828f9ba79d9083766c61564c414b555e696e7a828b9196999c9e9f9f9f9e9b9995908a837c726c655c5c666f7c8690959a9d9e9f9f9e9c9996918b847d736e605b544a3f332822190c02000000000000000000000000000000000000000613202d394653606c7885919eabac9f9286796d60636f7c8997a2ab9e9184786a5f53473a2e2115202c3945525d687683909ca9a49a8a7e71645d687683909ca9ac9f9285796d6053473a2e23170b000000000000000000000000000000000000000007121d2935404b55606d7985929ea9afa59d9a96969696969696969696969696969696969696969696999ca3adb5a99c8f8276695c4f4336291c100c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0706040000000000000000000000000000000000000000000000000007121d27313d45515d67707d89939d9d93897d70675d5c6976838f9ca4988b7e7165584b3e323c4855626f7b8895a29f9285796f7c8895a99f928578685d52453935424e5b6875818e9ba6998c807366594d4033261a0d00000000000000000109101920272b32373b3c40434546464544423e44505a616e7b86929f9f958c7f72695f53493f33404d5a6673808d99a69b8e8174685b4e413528303d4a5663707d8996a39f9285786c5f5245392c1f120000000a131c232a2f32333939393939393939393939393939392e38424e58606d7a85919e9f92877c6f655b50443a434e58626d75828f97968e81746c6157616d7a8794a0988b7f7265584c3f322519130c0500000000000000000000050d141a22282d31373a3b3f414445454646454441424e58606d7a85919e9f92877c6f655b5044434e58626d75828f97968e81746c6157616d7a8794a0988b7f7265584c3f322519130c050000000000000006121e2b37424d5765727e8b97a2adada1978c7f727c86929aa4a1969083796d655b50443e342b20170d090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d201308000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e13080000000000000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e1308000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000814212e3b4754616e7b87939fa1968a7e71645a504445515d676e7b848f949ea0a8a39f9c9a999a9b9e9f9d9590877f776d66606d79849198a0a79f9d979595989c9f9e96918780746c665b50443f342b1e140a00000000000000000000000000000000000000091623303c4956636f7c8997a1ada99c8f8276675d606d7985929faba196887b6f6255483c302419212d3a4754606d7a86929fac9f93877a6e615666737f8c99a8aea2988a7d7064544a3f34281c100300000000000000000000000000000000000000000c18242f3945515d67727f8c97a2adafa9a7a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a6a8adb5b5a99c8f8276695c4f4336291c1919191919191919191919191919191919191919191313100c070000000000000000000000000000000000000000000000010b151f2935414b55606b74818e97a19e9184796d60596875818e9ba6998c807366594d40313d4a5763707d8a96a39e9184776e7a8797a1a298877a6d6054473a36424d57697683909cac988b7e7265584b3f3225180c00000000000000010a131b222b32373c4347494d5052525352514e4b4746535e69727f8b949f9f92867b6e655b50443b404d5a6673808d99a69b8e8174685b4e413528303d4a5663707d8996a39f9285786c5f5245392c1f12000007121c252e353b3e4046464646464646464646464646464646464645525d68717e8a949f999083776c60564c413c46515b616d7a85919a938a7e71695e616d7a8794a0988b7f7265584c3f322519080200000000000000000000060f171f252a34393c4247484c4e505152535252514e4c48525d68717e8a949f999083776c60564c4146515b616d7a85919a938a7e71695e616d7a8794a0988b7f7265584c3f322519080200000000000000000814212e3a47535f697683909da9b3ab9e9185796d717e88939fa59f958e81776c605a50463c32291f150b02091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f130600000000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d0100000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c0100000000000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c01000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000004101d2935404b5565727e8b99a49e9184786d605346434e58606d798391969fa6a49f9992908e8d8d8e91969a9f99928c81786d66717e8a96a0a89f95908a88898b8f949da099938c81786c605b51463d30261c1106000000000000000000000000000000000006121f2b37434e586773808d9aa9b2a8988c7f7265555c6675828f9ba8a8998c7f7266564c4135291d27333f495364717d8a99a3aa9d908377685e55626f7c8896a1adaa9b8e8174665c5044382b1f1206000000000000000000000000000000000000000007121d2935404b55606d7a85929faab3b5b4b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa3a6abb4b5a99c8f8276695c4f43362926262626262626262626262626262626262626262626201f1c18120b0300000000000000000000000000000000000000000000030d18242f3a434f59606d7a84919ea1968d80746b6066727f8c99ab9b8e817568574d42373f4a5465727f8b98a59b8f8275697885929eaa95887c6f6255493c3a46535e697885919ea49a897c6f6256493c2f231609000000000000000a131c252d343c43474e5355595c5e5f5f5f5d5b5853514d57606c77829098a3989082776c60574d42404d596673808c99a69b8e8175685b4e423528303d4a5763707d8a96a39e9285786b5f5245382c1f1200020d19232e3740464b4c535353535353535353535353535353535353534c56616c76828f989f948b7e71685e52463d3f46525e68707d88939f92857b6e66616d7a8794a0988b7f7265584c3f3225190c00000000000000000000060f18212930363e45494d5355595b5d5e5f5f5f5e5d5b58555356616c76828f989f948b7e71685e52463f46525e68707d88939f92857b6e66616d7a8794a0988b7f7265584c3f3225190c0000000000000000000815222f3b4855626e7b88959fabafa3998c7f73676c73808c939ea79e938c7f736c61584e443b31271d120700071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d2013080000000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d1104000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c20130400000000000000000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c20130400000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000613202c3945515d6775828f9ca8998c7f72665c50444854606a74808d95a0a8a499938d87838180808184888d92989f938e81786c74818e9ba8a09690837d7b7c7e828991969f9f938e81746d62584e42382e23170b01000000000000000000000000000000000815212e3a47535f6a7784919eaaaca196887c6f62555465717e8b98a7a99c908376685d5246392d202b3744505b6574818e9babaa9a8d80736756535f6a7884919eabab9e9285796d6053463a2d20130a0000000000000000000000000000000000000000010d18242f3945515d6773808c98a2aebab1a7a09d93939393939393939393939393939393939393979aa2abb5a99c8f8276695c4f433633333333333333333333333333333333333333333333332d2c28231d150c030000000000000000000000000000000000000000010407131d28313d45525d68707d8a939e9f93887d6f6763707d8a99a39e918478695f53473f44505c6675818e9ba9998c7f736976838f9ca5988b7f7265574d423f4854616e7b8796a19f93867a6d6053473a2d20140700000000000008121c252e373f464e54585f6266696b6c6c6c6a6864605d55515b656e7b86929f9f948b7f72695e5346404c5966737f8c99a69b8f8275685c4f423529313e4a5764717d8a97a49e9184786b5e5145382b1e120006121e2a3540495157596060606060606060606060606060606060606060605a616e7b86929f9e92857a6d61594f4239414c56616b74808d95979083786d616d7a8794a0988b7f7265584c3f3225190c000000000000000000030d18212a333b42465055575f6265686a6b6c6c6c6b6a6865615f575a616e7b86929f9e92857a6d61594f42414c56616b74808d95979083786d616d7a8794a0988b7f7265584c3f3225190c0000000000000000030f1c28333f4a5465727f8b98a7b1ac9f92867b6e61606c77818e95a0a59f93887e716a60564d43392f231812080007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d010000000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d110400000000000000000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d110400000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000714202d3a4753606d7a86929fa096887b6e62544a414d56626f7c87939fa7a4999387807a7674737375777b80868e939f938c807376838f9ca99e918478706e6f71767d848f949f9d938b7f726a60544a3f34281d1207000000000000000000000000000000000915222f3c4855626f7b8896a0acab9e9184786a5f5354616e7b8795a0ac9f92867a6d6154473a2d222d394653606c7885929eaba298897d7063564e586774818e9aaaada197897c706356493d32261b0f03000000000000000000000000000000000000000007121d2935414c55606d7a85929faab4aca09591868686868686868686868686868686868686868a909aa6b5a99c8f8276695c4f433f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a38342e271e150b00000000000000000000000000000000000001080d111314161f2935414c56616c75818e97a19a9184796d616d7a86929fa196887b6e6259504a4e56606d7985919ea197897d706673808d99a79c8f8275695f544d4a505b65717e8b98a99d908377675d5145392c2013060000000000040e1a242e374049515860626a6f7376787979787775716d67605c555f69727f8c959f9f92867b6e615a50444b5865727e8b98a59c8f8276695c4f432f24313e4b5864717e8b97a49d9083776a5d5044372a1d11000a16232f3b46515b63666c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b69727f8c95a0978e81746b60544b403a444f59606d79839098958c80736b6d7a8794a0988b7f7265584c3f3225190c0000000000000000010b151f2a333c454d525a6164696e72747778787979787774726e6963605f69727f8c95a0978e81746b60544b40444f59606d79839098958c80736b6d7a8794a0988b7f7265584c3f3225190c000000000000000006121f2b3844505b6676828f9ca9b5a99c8f8276685e5b656d79839097a1a49a92867c6f685e554b403429241a1006010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d11040000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d2114070000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d01000000000000000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d0100000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000a1724303d4a5763707d8a98a39e9184776a5f534246525e6875828f99a4a89f93877e746d6867666768696e737a818b929893887d7783909da5988c7f72666262656b707a828f959f9f92877c6f665c5044392f24180d00000000000000000000000000000005121e2a36424d5766737f8c99a8b2aa9a8d807467584e525e697783909daaa3998a7e7164544a3f33282f3c4956626f7c8997a1ab9f9285796d60534a5764707d8a98a3aea99a8d807467584e43372b1f13060000000000000000000000000000000000000000010d19242f3a45525d6873808d98a2aeaa9d9184777979797979797979797979797979797979797e8a97a3b0a99c8f8276695c4f4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4645403930271d120700000000000000000000000000000001070c13191d20212428242f3a444f59616d7a85929ea0968d80736a6876828f9ca89a8d80746b605b54585f68707d8a97a19e9185796d626f7b8895a09f93877b6e665e57545c606d7683909da4998c7f7266554b4035291d110400000000020c16202c364049525b626a6f767c80838585868584817e7a736d675e57606d78839099a2988f82766c62564d4a5764717d8a97a49d9083776a554b403529323f4c5965727f8c98a59c8f8276695c4f4336291c10000c1925323e4b57636d737979797979797979797979797979797979797979797978736d7883919a9e93897d70665c51453c3d45515c676f7c86929f93877d706d7a8794a0988b7f7265584c3f3225190c000000000000000007121d27313c464e575e616c71777b7f8183848586858584817f7b76706b60606d7883919a9e93897d70665c51453d45515c676f7c86929f93877d706d7a8794a0988b7f7265584c3f3225190c00000000000000000613202d394653606c7985929facb3a9988b7f726556535d676e7b859198a3a29891847a6e675c514540362c22180e0506111c2935414c5665727f8b98aab4aa9d918477685d5245392c2013060000000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f23160900000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e1308000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e13080000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000c1926333f4c5966727f8c99aa9a8d807467584e434754616e7b86929faba1968c7f736c615e565a5a575f61686d757e86929891857a83909ca3968a7d706354565960686d79839096a1999083786d60554b4035291c110600000000000000000000000000000714202d3a46525e697783909daaaea298897d7063564a4d566673808d99a9ab9b8e8175665b5044382b36414c566673808c99a9ab9b8e8275665c514753606d7a86929facab9e9184786a5f53473b2e21150900000000000000000000000000000000000000000008131e2935414c56616d7a86929faaaca0958a7d706c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c707d8a97a3b0a99c8f8276695c595959595959595959595959595959595959595959595959595953514b43392e23180c0000000000000000000000000000030b12181e24292c2d31353738323e46525e68717e8a939e9f93877c6f67717e8a95a09f92877d716c6667676a6e7a84919ea2988d8073665f6a7783909da4998f82786e696767666d727f8b959f9f93877b6e6154483b2f24180d010000000008131e28323e48525b636d727c82888c8f91929292908e8b857f796e695e5c666f7c87929f9f948b7e71685e524956626f7c8995a99e918578675d5145392c34404d5a6773808d9aa69a8e8174675b4e4134281b0e000d192633404c5966737f868686868686868686868686868686868686868686868578666f7d88939f9d9184796d60574d4237404b555f6a727f8b94999184796d7a8794a0988b7f7265584c3f3225190c00000000000000000c18242f39434e585f696e767e83888c8e909192929291908e8b87827d746d67666f7d88939f9d9184796d60574d42404b555f6a727f8b94999184796d7a8794a0988b7f7265584c3f3225190c00000000000000000815222f3b4855626e7b8898a2aeada197887b6e62554b555e696f7c86929fa4a1969083796d605b51483e342a20170c030d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d2114070000000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000030f1b27333f49536874818e9bab978a7e7164574b3f4c5965727f8c99a3ab9e9184796d605a524c4d4d4d53565e616c717d8692978d80828f9ca396897c706356494f565d676e7a84919ea0958b7f72675d5145382d22170b00000000000000000000000000000815212e3b4854616e7b87939facab9f9285796d6053464956636f7c8997a1ab9e9285796c605346392d3946525e687783909daaa4998b7e7164544b45515d6776828f9ca9aca196887c6f6255493c31261a0e020000000000000000000000000000000000000000010d1924303a46525e6873808d98a3aea79c9083766b606060606060606060606060606064707d8a97a3b0a99c8f827669666666666666666666666666666666666666666666666666666666605c554b4034281c1004000000000000000000000000060d151d24292f35393a3e4144454645414c56616c75828f97a2999183796d6d7984919da39992857e78757474767b839096a19f92867b6e615864717d8a949e9f948f827b76747475797f87929fa1978e8174695e52463a2d1d130700000000010d1924303a44505a636e737f878f94999c9e9e9d9e9d9b98928c837b6e695e5f6a73808c95a09f92857b6e615a5054616d7a8797a1a197867a6d6053473a2d35414c566875828f9bac998c7f7266594c3f3326190c000d192633404c5966737f8c93939393939393939393939393939393939393939185786b6b74818e97a0968c7f73695f53463e39434e58626d75828f97968d80747a8794a0988b7f7265584c3f3225190c0000000000000004101d2935404b555f6a6e7b838a9095989b9c9a989898999c9b9a938f8981796d676b74818e97a0968c7f73695f53463e434e58626d75828f97968d80747a8794a0988b7f7265584c3f3225190c00000000000000000b1824313e4b5764717e8a97aab4ab9e928578695f53474d57606a717e8a929ca59f958e81756d635a50463c32291e150b0813202d394653606c7985929facb1a795897c6f6256493c2f2316090000000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d0000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c2013040000000000000000000000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000005121f2b3744505b657783909da499887c6f625549424d566875828f9baba9998c7f73675c514641404042474c525a626b707d8792928785919ea3968a7d7063574a434c555e68707d8a939e9f9285796d60544a3f33281c0f0300000000000000000000000004111d2935414c5665727f8b9aa4afab9b8e8275665c51444653606d7985929eaba197897c6f6356493c303a4754616d7a87939fac9f93867a6d615447404b5565727e8b98a7b1a8998c807366574d42362a1e120500000000000000000000000000000000000000000008131e2a36414c56616e7a86929fabab9f94897c6f63574e535353535353535353535764707d8a97a3b0a99c8f8276727272727272727272727272727272727272727272727272727272726d675c5145382c1f13060000000000000000000000060f181f272f353a4145474a4e505253525150505a616e7a85929fa0958d80736a707d89919fa297928a8482808183879095a09e938c7f72695e55616c75828f95a09f948f8783818082858b9299a29892857a6d61574d42362a1e0c010000000005111d2935414c56616c73808c92999f9f9992919091979c9e9f9590847b6e675c606d79839099a2978f82756c6156525e687885919ea995897c6f6256493c303946525d687784919ea49a897d7063564a3d3023170a000d192633404c5966737f8c999999999999999da0a7a9a29f999999999999999185786b616d7a85929e9f92867b6e615a50443a3c46515b616d7a85919a93887d7a8794a0988b7f7265584c3f3225190c0000000000000006131f2c3945515d676e7c8490959d9d9993908d8b8b8b8d8f92999f9c938e82796d616d7a85929e9f92867b6e615a50443c46515b616d7a85919a93887d7a8794a0988b7f7265584c3f3225190c00000000000000000d1a2633404d596673808c99a6b3a99c8f827669574d42454e58616c73808d939ea79e938c7f736c61584e443b30271d1207121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f00000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d110400000000000000000000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d1104000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000613202d394653606c7985929f9f93867a6d60534746525e697885919eaba297887b6e62554b40363031373a41465059616b727f8b93929197a1a4978b7e7164584b3e434c56616c75828f9ba2978b7f72665b5044382b1f12060000000000000000000000000713202c3945525d6876828f9cacafa3998a7e7164544a4044505c6675818e9baba9998c807366574d42363f4a5464717e8b9aa4a99d908376685e52463b4854616e7b8795a0acaa9d908377695f53463a2d211408000000000000000000000000000000000000000000020d1925303a46525e6874808d99a3aea69b8f82756a5f534746464646464646464a5764707d8a97a3b0aa9d91847f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6053463a2d20130700000000000000000000060f18212a313940454c5254575b5d5e5f5f5e5d59565e68717e8b949e9f92877c6f6b737f8c93999e9f97918e8d8e90939aa09e938e81786d6056505a616e7a8390959e9f9993908e8d8e92979f9f9892867d70685e52453b30251a0e00000000000713202d3946525d68717e8a929fa198928b86848385888f949da0969083796d605c666f7c87939f9e938a7e71685e52566975828f9ca5988b7f7265574d42363b4754616d7a86939f9f93867a6d6154473a2e211407000d192633404c5966737f8c8c8c8c8c8c8c8c9095a0a297928c8c8c8c8c8c8c8c85786b5d68717e8b949f988f82766c61564c41353f46525e68707d88939a91847a8794a0988b7f7265584c3f3225190c00000000000004111d2935414c55606d798391969f9b938e8783807f7e7f8082878f949e9d948e81746a68717e8b949f988f82766c61564c413f46525e68707d88939a91847a8794a0988b7f7265584c3f3225190c00000000000000010e1b2834414e5b6774818e9aa7b4a79a8d8174675a4e413d46505a606c77818f95a0a59f93887e706a5f564c43392e2318110f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d000000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f00000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d0100000000000000000000000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d01000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000714212d3a4754606d7a8798a29e918478675c51454754616e7a8797a1ab9e928578695f5343392f25262b30363e474f59626d74818e979ea1a9a6998c7f7366594c403b444f59626f7c88949e9e9184786c605346392d22170b0000000000000000000000000714212d3a4754606d7a86929facac9f92867a6d6054473a3f4a5464717e8a99a3aa9d908377695e52463a44505c6675828e9baca8998c7f7366564c413a46535e697783909daaaca095887b6e6155483b3025190d0100000000000000000000000000000000000000000008131e2a36414c56616e7b86929fabac9f93877b6e62564d423639393939393d4a5764707d8a97a3b0aca096918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877a6d6054473a2d211407000000000000000000030c18212a333c434b51565d6064686a6b6c6c6b69666260626c76828f98a2999083786d6d737f878f94989b9d9b9a9a9d9c9996918a81786d665c5046525e686e7a838b92979a9c9c9a9a9b9d9b9a938e867d706b60564c4133291f14090000000004111d2935414c56616d7a85929ea19792867f7a7776787c828d929d9f958c7f73685e606a73808d96a09e92857a6d61595965727f8c98a79c8f8275695e524641444f5964717e8a9aa49d908377685e5246392d20130700091623303c4956636f7d808080808080808083909d9f928580808080808080807f726556626c76828f989f948a7e71685d52453d36414c56616b74808d95958c808c99a5988b7f7265584c3f3225190c0000000000000613202c3945515d6773808d95a09b918c817b767372717273767b828f939e9f93877c6f626c76828f989f948a7e71685d52453d414c56616b74808d95958c808c99a5988b7f7265584c3f3225190c0000000000000003101c2936434f5c6976828f9ca9b2a5988c7f7265594c3f343e44505b656d79839097a1a49a92867c6f685e554b403428231a1017222d404d5a6773808d9aa6b3a89b8e8275685b4f4235281c0f020000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d10000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000815212e3b4854616e7b8794aa9d9083776a554b404955626f7c8895a9a99c8f837669574d4231271d1a1e252a353e47515b616d7a85929ea7b1a79a8e8174675b4e41323e47535f6a75828f9ca096897d7063544a3f33281c0f030000000000000000000004101c2934404b5564717e8b99a3afa99c8f8376685d5245393a4754606d7a86929faca095877b6e6154473b4653606d7985929faba196887c6f6255493c36424d576673808d99a9b1a7988c7f7265564c41362a1d1105000000000000000000000000000000000000000000020e1925303b46525e6974818d99a3afa49a8e8174695e52463a2f242d2d313d4a5764707d8a97a3b0b2a8a09d99999999999999999999999999999999999999999999999999999993877a6d6054473a2d2114070000000000000000000b151e2a333c454d555d60686d7174777879787776736f6c65616e7b86929fa0958c7f736a6d727c82888b8f9091929291908d89847d756d665c544a414c565e686d787e85898d9091929291908f8b87817b706b60594f443a3021170d02000000000713202c3945525d6873808d97a19e92857c726d676a6a6f77808d95a09f92867a6e6158606d7984919aa1978e81756b6155616e7b88959f9f92867b6e615a524d5056606b75828f9ca4998c7f7366564c4135291d1105000915222f3b4854606b6f7373737373737374818e9b9e91847873737373737373726d62575a626e7b86929f9e91857a6d60584e42383a444f59606d798390989285929fa5988b7f7265584c3f3225190c0000000000000714212d3a4754606d7a85929f9e948c7f746e696765656566696e78818f98a39a8e817566626e7b86929f9e91857a6d60584e423a444f59606d798390989285929fa5988b7f7265584c3f3225190c0000000000000004111d2a3744505d6a7783909daab1a4978a7e7164574b3e31333f49535d676e7b859299a3a29891847a6e675c51453f352c22181926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f030000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d110000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c01000000000000000000000000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c0100000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000815222f3b4855626e7b8895a19c8f8376695c5043495663707c8996a3a89b8e8175685b4e423128150e1319232c353f46525d68717e8a95a0aca99c90837669574d423637434e5864707d8a97a29a8e8174665b5044382b1f12060000000000000000000006131f2c3845515c6775828f9babb1a7988b7f7265564c41353945525d687683909ca9a7988b7e7165544b40495663707c8997a2ab9e9184786a5f53473b313c4956636f7c8997a1ada99c908376685e5246392d2013070000000000000000000000000000000000000000000008141e2a36424d57616e7b87929fabac9f92867b6e61564c4135291d24313d4a5764707d8a97a3b0bab2acaaa5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a093877a6d6054473a2d211407000000000000000007121d27303c454e575f676d737a7e81838586858483807c78706b69727e8b949f9f92867c6f666a6f757b7f82848586858483807c79706c605c544a423b444c565e666d72797d80838485868584827e7b746e6860594f473d32281e0f0500000000000714212d3a4754606d7a86929f9f958a7e716a605d585f656d7883919da3988d8073665c5d67707d88939f9e938a7d70675d5f697683909da3998e81756c615e565b60686f7d87939f9f93877b6e6155483b3025190d01000713202c38444f5960636666666666666874818e9b9e9184786b66666666666665625b51535f6973808c96a0978d80746a60544a3f343d45515c676f7c8692989298a2a5988b7f7265584c3f3225190c0000000000000b1825323e4b5865717e8b989e9c8f82756d615e57585858575e666e7b86929f9e9285796d606973808c96a0978d80746a60544a3f3d45515c676f7c8692989298a2a5988b7f7265584c3f3225190c0000000000000004111e2b3744515e6a7784919daab0a3968a7d7063574a3d302d38414b555e696f7d87929fa4a1969083796d605b51473e342a201725323e4b5865717e8b98a4b1a99c908376695d5043362a1d10030000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e1100000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c201304000000000000000000000000000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c2013040000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000916232f3c4956626f7c8995a29c8f8275695c4f424a5764707d8a97a3a79a8e8174675b4e4134281b0e08111a232935414c56616c7783909da8ab9f928578695e52463a323c4653606d7985929e9e9285796c605346392d201306000000000000000000000714202d3a4753606d7985929facaca095887b6e6155483b3035414c5666727f8c99a8a89b8f8275665c51454d576673808d99a9aa9a8d817467584e43372d394653606c7985929eabac9f93867a6d6154473a2f24180d01000000000000000000000000000000000000000000020e1a25303b46535e6974818e99a3aea3998d8073685d5245392e2324313d4a5764707d8a97a3b0b8b0aaa99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f93877a6d6054473a2d21140700000000000000000c18232e39424e575f696e7980868a8e9091929291908c89837d746c6c77828f98a2999083786d6062696e7275777879787776736f6d66615a504a4238323b444c545c60676d707376777879787775716e69615e564f473d352b20160c000000000004101d2935404b5565727e8b98a29d9083766c6158514e535c66707d8a97a19e9185796d6055606b74818e96a19e91847a6d605964717e8a95a09e938b7e736e6869666c707a84919aa3998f8275695f53463a2d1e13080000030f1b27323d474f545659595959595b6874818e9b9e9184786b5e5959595959595751494d57606d7984919e9f93877c6f665c50443b34404b555f6a727f8b949fa2aaa5988b7f7265584c3f3225190c0000000000000e1b2835414e5b6874818e909192897c6f635b524d4c4b4c4d545e6976828f9ca297887b6e61606d7984919e9f93877c6f665c50443b404b555f6a727f8b949fa2aaa5988b7f7265584c3f3225190c0000000000000005121e2b3845515e6b7884919eabafa396897c706356493d30262f3a434d57606b717e8b929da69f958e81756d635a50463c32291e24313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d11040000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e1100000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d11040000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000a1623303d495663707c8996a39b8e8275685b4f424b5764717e8a97a4a79a8d8074675a4d4134271a0e0008111924303a44505a64717e8a96a1aca297877b6e6154473b2e3845515c6674818e9ba197897c6f6356493c30231608000000000000000000030f1c28333f4a5463707d8a98a2aeaa9d908477695f53463a2d303c4855626f7b8896a1ac9f9285796d605346535e697784909daaa2988a7d7063574a3d322b3844505b6674818e9babafa4998b7e7165554b4035291d10040000000000000000000000000000000000000000000009141f2a36424d57616e7b87929fabab9f92857a6d60554b40342824313d4a5764707d8a97a3b0b0a69f9c93939393939393939393939393939393939393939393939393939393877a6d6054473a2d2114070000000000000004101c2834404b545f6a6e7b848c92989b9d9e9d9d9e9c9995908980776c6e7b86929f9f958c7f72695f5f6165686a6b6c6c6b696663605c5450443f383029323a424a50555c606367696b6c6c6b6a6865615e57524d443d352b23190e04000000000006131f2c3945515d6776828f9ca8988b7f72655a5045414a54606d7985919ea197897c70635659606d7a84919ea1968e81746b60606c78839098a39b908b807b777576797d849196a09f92877c6e62574d42362a1e0c020000000b16212b353d4448494d4d4d4d4e5b6874818e9b9e9184786b5e514d4d4d4d4c4a463f45515c67707d89939e999083786d60574d423639434e58626d75828f97a19f9f988b7f7265584c3f3225190c0000000000000c1926323f4c5965727f8283848586786d605346423f3e3f424d576773808d9aa995897c6f625c67707d89939e999083786d60574d4239434e58626d75828f97a19f9f988b7f7265584c3f3225190c0000000000000005121f2c3845525f6b7885929eabafa296897c6f6356493c302328313b454f59626c73808d949ea79e938c7f726c61584e443a302724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11050000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d10000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d010000000000000000000000000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d010000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000091623303c4956636f7c8996a29b8f8275685c4f424a5763707d8a96a3a79a8e8174675b4e4134281b07000008131e28323e4653606d7984919eaba9978a7d7064574a3d2d34404b5464717e8a97a8998c7f7266594c3f2f24190d01000000000000000006121f2b3844505b6674818e9baab3a9998d807366574d42362a2e3a47535f6a7884919eaba298897d7063564954616e7b8795a0ac9f9286796d6053473a2d28333f4a5464717d8a99a3aeab9c8f8275675d5145392c20130600000000000000000000000000000000000000000000020e1a25313b46535f6975818e99a4aea2988c7f72675c5145382d22313d4a5764707d8a97a3b0aa9f948f86868686868686868686868686868686868686868686868686868686867a6d6054473a2d2114070000000000000006131f2c3845515c666e7c8591969f9f9c9791909092989fa09d928d81786c727f8c959f9f92867b6e665b55585c5d5e5f5f5e5d5a5653504a423e342e26202930383f444b5153565a5d5e5f5f5e5d5c5854524d46413b322b231911080000000000000714202d3a4753606d7a86929fa196877a6e6154473e3944505c6674818d9aa9998d80736654515d67707d8a939e9f93887d70675d666f7c869299a29b928d86838283858a9196a09d938c80736a5f53453b31261a0e00000000040f19232b32383b3c404040414e5b6874818e9b9e9184786b5e51454040403f3e3a34404b55606b75818e97a0958c7f72695e52463e313c46515b616d7a85919a9393938b7f7265584c3f3225190c0000000000000c1825313e4a57636d7275767778796d665c5044383030363f4c5966727f8c99ab96897d706355606b75818e97a0958c7f72695e52463e3c46515b616d7a85919a9393938b7f7265584c3f3225190c0000000000000005121f2b3845525e6b7885919eabafa296897c6f6356493c30231f29333d47505a606c78828f95a0a59f93887e706a5f564c42392e23313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e11040000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d100000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e1308000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000916232f3c4956626f7c8995a29c8f8275695c4f42495663707c8996a3a89b8e8175685b4e422e23180c0000020c16202c3844505c6673808d99a9a6998c807366544a3f332e3a4754616d7a8796a19b8f827568564c4135291d110400000000000000000613202d394653606c7985929eabada197897c6f6256493c31262b37434e586774808d9aaaaa9a8d807367574d5565727e8b98a7a89c8f8275675d5145382c222d3a4754606d7a86929facac9f92867a6d6053473a2e23170c000000000000000000000000000000000000000000000009141f2b37424d57626e7b87939facaa9e9184796d6053493f3327313d4a5764707d8a97a3b0a99c8f82797979797979797979797979797979797979797979797979797979797976685d5245392c20130700000000000004111d2935414c56606d79849197a19e949089858384858b9297a29d938c7f726c78839098a3989083786c60574d4f5152535251504d4946443f383028231c171e262e34394045474a4d5051525352514f4b4846423b3630292019110800000000000000091623303c4956636f7c8998a39e918478685e524639343f4a5464717e8b97ac9c908376665b5055616b75818e97a19a9184796d60606a717e8792989f9d9992908f8f91979ea09d938e81786d60584e4333291f1409000000000007111921272c2f30333335414e5b6874818e9b9e9184786b5e514538333332312e2e39434f59616d7a85929f9f92867b6e61594f4339343f46525e68707d8786868686867f7265584c3f3225190c0000000000000916222e3a46515b636568696b676d675c544a3f41414142464e586673808d99a399887c6f625559616d7a85929f9f92867b6e61594f43393f46525e68707d8786868686867f7265584c3f3225190c0000000000000005111e2b3844515e6b7784919eaab0a396897d7063564a3d302317212b353f44505b666d79839197a2a49a92867c6f685e544b403428313e4b5864717e8b97a4b1aa9d9084776a5d5144372a1e11040000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f00000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c0100000000000000000000000000000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c01000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000915222f3c4855626f7b8895ab9c908376695d50434955626f7c8895a9a99c8f837669554b4034281c1004000004101c28343f4a54626f7c8996a1a99c8f8276665b5044382d3946525e687884919e9e918578685d5245392c2013070000000000000000091623303c4956636f7c8997a1adab9e9185786c605346392d2026313d4a5663707d8998a2aa9d918477695e535c6775828f9ca8a7988b7e7265554b403529202c3945515d6776828f9ca9aea3988a7d7164544a3f34281c100300000000000000000000000000000000000000000000030e1a26313c47535f6a75818e9aa4ada1978b7e71655b5044372b313d4a5764707d8a97a3b0a99c8f82766c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5d564c4135291d11040000000000000613202c3945525d68737f8c96a09e938e827c787677797e859298a29f92867b6e6e7b86929f9f948b7f72695f53493f4546454443403c3a38342e261e17110c151c23282f34383a3d40434445464544423e3b3a36302a251f170e0800000000000000000c1925323f4c5865727f8b98aa9b8f827568564d41362e3b4855626e7b889aa49f9285796c60534f59616d7a85929ea0968d80746a60616c717e868e92999b9d9d9c9c9e9c9a96918a81786d665c50463c3121180d03000000000000070f161b202223262835414e5b6874818e9b9e9184786b5e5145382b2626251d27303d46525e68717e8b949f988f82756c61554b403536414c56616b70797979797979726d62564a3e3124180b00000000000006121e2a353f495157595b5d555c605c554b474e4e4e4e4d52575f6a76838f9c9f92867a6d6054525e68717e8b949f988f82756c61554b4036414c56616b70797979797979726d62564a3e3124180b0000000000000004111e2a3744515d6a7784909daab0a3978a7d7064574a3d312417192328333f4a545d676e7b859299a3a29891847a6d665c51453f35323f4b5865727e8b98a5b1a99d9083766a5d5043372a1d100400000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000714212e3a4754616d7a8799a49d9184776a564c414754606d7a8797a1ab9e918478675c5145382c1f13060000000c17232e394653606c7884919eab9f9285796c605346392d36414c566975828f9ca197877a6d6054473a2d2114070000000000000006121f2b37434e586773808d9aa9b3aa9a8e8174655b5044372b1f202d3a4653606d7985929faca095877b6e6154606d7985929faca095877b6e6154483b2f241d2935414c5565727f8b98a7b1aa9b8e8175665c5044382c1f1206000000000000000000000000000000000000000000000009141f2b37434e58626f7c87939faca99d9184786c6053463d32313d4a5764707d8a97a3b0a99c8f8276696060606060606060606060606060606060606060606060606060605f524c443a2f24190d010000000000000714212d3a4754606d7a86929fa1978e81786f6a6a676d717c86929fa2988e81746a727f8c95a09f92867b6e655b50443b3039383633302d2c28231c150c06030a11171d23292c2d303436383939383735322e2d2a251f19140d050000000000000000000e1b2734414e5a6774818d9aa69a8d8073675a4d40302d3a4653606d7986939fa298877b6e615448525e68717e8a939e9f93877c6f675c616c717b81868b8f9192929291908d89847d746d665c544a3f342a200f060000000000000000040b0f1315161b2835414e5b6874818e9b9e9184786b5e5145382b1e1918151e2a36414c56606c778390999e938a7d70675d51453c2f3a444f5961636c6c6c6c6c6c65625b51463a2e221509000000000000010d18232d373f464a4c4f504b5153514c52545a5a5a5b575e61696f7c87929f9c8f8376675d514c56606c778390999e938a7d70675d51453c3a444f5961636c6c6c6c6c6c65625b51463a2e2215090000000000000003101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225181017222d38424c555f69707d87929fa4a1969082786d605b51473e34404d596673808c99a6b3a89c8f8275695c4f4236291c0f0300000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c0000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000613202d394653606c7986939f9f928578685d524545515d677885919eab9f9386796d6053463a2d20130800000006121f2b3744505b6575818e9ba8a298887b6f6255483c2f30404d5a6673808d99a995887c6f6255493c2f221609000000000000000815212e3b47535f6a7784919eaaaea2988a7d706453493f33271b1f2c3845515c6775828f9baca7988b7e72655463707d8998a2aa9d908377695e52463a2d1d19242f3b4855616e7b8895a0acab9f9285796d6053463a2d20130a0000000000000000000000000000000000000000000000030f1a26313c47535f6a75828f9ba6aca0968a7d7064594f4438313d4a5764707d8a97a3b0a99c8f8276695c53535353535353535353535353535353535353535353535353535345413a32281e130800000000000004101c2934404b5565717e8b98a29e92857a6d6660585c606a717e8b96a19f92857a6d6d78839099a2988f82776c60574d42362a2b2a2723201f1c17110a03000000060c12181c1f2023272a2b2c2c2b2a292521201e1a140e0802000000000000000000000f1c2936424f5c6975828f9ca5988c7f7265594c3f322c3845515c667885929eaa96897c706356494c56616c75828f97a2999183796d605a61696e757b7f82848586858583807c78706c605c544b42382e22180e00000000000000000000000307090e1b2835414e5b6874818e9b9e9184786b5e5145382b1e120b0c1925303a44505b656f7c87929f9e9184796d60584e4138323d474f5556606060606060585651493f34291e12060000000000000007111c252d353a3e3f42434045474c565d616767676869696e727b8491999e938a7d7063554b44505b656f7c87929f9e9184796d60584e41383d474f5556606060606060585651493f34291e120600000000000000020f1c2835424f5b6875828e9ba8b3a6998c807366594d402f23180c111c262f3a434d57606b727f8b929da69f948e81746d63594f463c414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e0100000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a0000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d01000000000000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000006121f2b3844505b667884919ea297877a6d605447414c556976838f9ca9a499897c6f6356493c3025190d000000030f1b27333f495365727e8b98acaa988b7e7265584b3f30323f4b5865727e8b98a3978a7d7064574a3d3124170a000000000000000915222f3c4855626f7c8896a0acac9f9286796d6053473a2d22171c2834404b5565717e8b9aa4a89c8f8275665c6774808d9aaaa9998d807366574d42362a1e14212d3a46535f697784919daaada297897d706356493d32271b0f0300000000000000000000000000000000000000000000000915202b37434e58626f7c88949eaaa89d9083766b6054483c313d4a5764707d8a97a3b0a99c8f8276695c4f464646464646464646464646464646464646464646464646464639352f2820160c0100000000000006131f2c3845515c677683909ca9998c7f73675d544e5157606d7984919ea2988b7e71666f7c87929f9f948b7e72695e52463e32291f1a161312100c0600000000000001070c101314171a1d1e1f201f1e1c181514120e0902000000000000000000000000111d2a3744505d6a7783909da4978a7d7164574a3e312834404b546a7783909da4978a7d7164574a44505a616e7b85929fa0958c80736a5f575f61696e727577787979787673706c65615a514b423930261c0f0600000000000000000000000000020e1b2835414e5b6874818e9b9e9184786b5e5145382b1e120008131e27333f49535f6a73808d96a0968d80736a5f53493f33353d44484a5353535353534c4a463f372d23180d0100000000000000000a131c232a2e3132352f343946525d686d7474747475777b7f8591969e938e81746b6155433f49535f6a73808d96a0968d80736a5f53493f333d44484a5353535353534c4a463f372d23180d0100000000000000010d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100a141d28313b454f59626d74808d949fa69d938c7f726b61584e44424d57697683909ca9b2a6998c7f7366594c403326190d000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e22150800000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000030f1c28333f4a546976838f9ca995897c6f625649404d5a6673808d99aaab998c7f7266564c41362a1c11060000000b17222d3c4956626f7c899aa4a89b8e817568564c4136313d4a5764707d8a97a3988b7f7265584c3f3225190c00000000000005121e2a36424d5766737f8c99a8b2ac9c8f8275675d5145382c1b1118232e3b4754616e7a87939fac9f9285796d60697784919daaa197897c6f6256493c30251a121e2a36424d576673808d99a9b3a99a8d807467584e43372b1f13060000000000000000000000000000000000000000000000030f1b26313c4754606a75828f9ca6ab9f95897c6f63584e43373d4a5764707d8a97a3b0a99c8f8276695c4f43393939393939393939393939393939393939393939393939392c29241e160d04000000000000000714202d3a4753606d7986929fa197887b6f62554b4245515c6674818d9aaa9b8e8174686a73808c95a09f92867b6e615a50443b3025190e07060300000000000000000000000406070a0d1011121312110f0b080705020000000000000000000000000000121e2b3845515e6b7884919ea3968a7d7063574a3d30232e43505d697683909ca5988b7e7265584b3f46525e69717e8b949f9f92877c6f665c53575e6165686a6c6c6c6b696763605b535045403930271e140a0000000000000000000000000205070e1b2835414e5b6874818e9b9e9184786b5e5145382b1e1205020b17222d38414e58606d7984919e9f92877c6f655b50443b3033383c3d4646464646463f3e3a342d251b1106000000000000000000010a11181e22252628232e3a4754616d7a808181818284878c929796918b81796d60594f4438414e58606d7984919e9f92877c6f655b50443b33383c3d4646464646463f3e3a342d251b11060000000000000000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060b161f2a333d47515b606d78828f96a0a59f93877d706a5f564c47535f697885929eabb4aa978a7e7164574b3e3124180b0000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d201307000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000b17222d414e5b6774818e9aa4978b7e7164584b3e495663707c8998a2a99c8f8276685e5246382d22170b0000000614202d3a4753606d7a86939faa9e918477685e5246392f3c4956626f7c8995a2998c7f7266594c3f3326190c0000000000000714212d3a46535e697783909daaafa49a8b7e7165554b4035291d0a14202d3946525e687783909daaa298897c70636e7b8796a0ab9e9285796c605346392d20130e1a26313c4956636f7c8997a1adab9e9184786a6054473b2e2215090000000000000000000000000000000000000000000000000a15202b37434e58626f7c89949faba79c8f82756a5f53473b3d4a5764707d8a97a3b0a99c8f8276695c4f43362d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d201d19130c0400000000000000000916232f3c4956626f7c8999a39e9285796c6053463a404a5464717d8a97ac9d90847767606d79839099a2988f82766c62564d41362a20170c0200000000000000000000000000000000010305060605040200000000000000000000000000000000000000121f2c3845525f6b7885929ea396897c706356493d302936434f5c6976828f9ca5988c7f7265594c3f424d56626c76828f98a2999083786d60584e5254585c5e5f5f5f5e5d5a56535049413e342e271e150c020000000000000000000002090e1114141b2835414e5b6874818e9b9e9184786b5e5145382b1e12050006111b262f3c45515d67707d8a939e999083776c60564c41362a2c2f3039393939393932312e29231b1309000000000000000000000000070d121618191c212e3b4854616e7b878d8d8e8f9193938f8d89847e756d675c51473e2f3c45515d67707d8a939e999083776c60564c41362c2f3039393939393932312e29231b130900000000000000000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b040d18212b353f44505c666d7a849197a2a49992867c6f685e544b55626e7b8897a2adaea298887b6f6255483c2f2215090000000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f12060000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000061825323f4b5865727e8b98aa9a8d817467564c414653606d7986929fac9f92867a6e61544a3f33281d1207000006131f2c3945515d677885919eaba096877a6e6154473b2f3c4955626f7c8895a2998c807366594d4033261a0d0000000000000815212e3b4854616e7b8795a0acac9f93877a6e6154473b2f24180c111e2a36414c5666737f8c99a9aa998d807366717e8b97a8ab9b8e8174665b5044382b1f120913202d3a4653606d7985929eabada196887c6f6255493c31261a0e020000000000000000000000000000000000000000000000040f1b27323c4854606a76828f9ca6ac9f93877c6f62574d423d4a5764707d8a97a3b0a99c8f8276695c4f433629202020202020202020202020202020202020202020201413110d08010000000000000000000b1825323e4b5865717e8b98ab9c908376655b5044373b4855626e7b889aa49f9286796d60666f7c87929f9e948b7e71685e52463e32291e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3945525f6c7885929fa296897c6f6356493c302935424f5c6875828f9ba6998c7f7366594c403b44505a616e7b86929fa0958c7f726a5f544a484c4f5152535252504d4946443f382f28231d150c0300000000000000000000050d14191e2021272835414e5b6874818e9b9e9184786b5e5145382b1e120500000a141d2935404b55616b75818e989f958b7e72685e52463d302723232d2d2d2d2d2d2524221e18110901000000000000000000000000000106090c0c15212e3b4854616e7b87949a9b9c9e938682807d78716c605c554b40352935404b55616b75818e989f958b7e72685e52463d3027232d2d2d2d2d2d2524221e18110901000000000000000000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f03060f192328343f4a545d686e7b859299a3a29891847a6d665c515665717e8b98a9b3ac9f9285796d6053463a2d20130700000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c100300000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000916222f3c4955626f7c8898a29d908377685d524545515c6775828e9ba8a3998b7f72665b5044392e23180f060004101d2935404b556a7784909daaa8978a7d7064574a3d2f3b4855626e7b8895a19a8d8074675a4d4134271a0e000000000005111d2a36414c5665727f8b98a7b1a99d908376685e5246392d1d12070e1925303c4955626f7c8896a1a99d9083766774818e9ba7a3998a7d7164544a3f33281c0f06121f2b3844505c6674818e9babb2a8998c807366574d42372b1e12060000000000000000000000000000000000000000000000000a15202c38434e5863707d89949faba49a8e8174695e52463d4a5764707d8a97a3b0a99c8f8276695c4f4336291c1313131313131313131313131313131313131313130707040100000000000000000000000d1a2633404d596673808c99a69b8e81746853493f333a4653606d7986939fa399887b6e61606a73808d96a09f92857b6e615a50443a3025190e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3945525f6c7885929fa295897c6f6256493c2f2935424f5c6875828f9ba6998c7f7366594c40323f46535e69727f8b949f9f92867c6e665b50443f42444546464543403d3937332d261d18120b0300000000000000000000050e171f252a2d2e342d35414e5b6874818e9b9e9184786b5e5145382b1e12050000020b18242f39434f59616e7b85929f9f92857a6e61594f43392e2318202020202020191815120d06000000000000000000000000000000060b0f12131c212e3b4854616e7b8793939495989a9285817d756e685e574d43392e242f39434f59616e7b85929f9f92857a6e61594f43392e23182020202020191815120d060000000000000000000000000613202c3945515d677784909daab5ab9a8d8073655b5044372b1f140a00071117232e38424c565f69707d87929fa5a0969082786d605b5d6875828f9ca8b5a99c908376665c5044382b1f1206000000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b0000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d01000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000713202d3a4653606d7985929f9f93867a6d605447404b5563707d8996a1ab9e9184786c60554b4034282118100b09111d2a36414c566a7784919daaa69a8d807367554b40343b4855616e7b8894a19a8d8174675a4e4134271b0e00000000000713202d3946525e6876838f9ca9b2a8998c7f7266564c41362a1e0b010815222e3b47545f6a7884919eab9f92867a6d7784919eaa9f92867a6d6054473a2d22170b03101c28343f4a5464717d8a99a3aeaa9d908477695f53473a2d211408000000000000000000000000000000000000000000000000040f1b27323d4854606b7683909ca7ac9f92867b6e61564c414a5764707d8a97a3b0a99c8f8276695c4f4336291c100d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a0a08040000000000000000000e1a2734414d5a6774808d9aa69a8d8073675a4d402d3845515c677885929fab95887c6f6258606d79849199a2978f82756c61564c41362a20160c020000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3845525f6b7885929ea296897c6f6356493c302936434f5c6976828f9ca5998c7f7266594c3f3336424d57606c78839098a3989083786c60574d41382d393939383634302d2b27221b140b070000000000000000000000020d17202930363a3b413a38414e5b6874818e9b9e9184786b5e5145382b1e120500000007121d27313e46525e68727f8b959f978e81756b60554b4034281f1509131313130c0b0906010000000000000000000000000000020a11171c1f2028232e3b4854616e7b86868687898c9195928e89827a6e695e544a40342827313e46525e68727f8b959f978e81756b60554b4034281f15091313130c0b0906010000000000000000000000000004111d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b11060006111c26303a444d57606b727f8b939da69f948e81746d62606d7a86929facb2a8998c7f7266544a3f34281c1003000000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c110600000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000006121f2c3844515c6676828f9ca4998a7d7164554b404653606c7884919ea8a0968a7d71675c51453d332a221c18181a222d3946525e687885929eaba99d908376675c5145383c4955626f7c8895a2998d8073665a4d4033271a0d00000000000714212e3a4754616d7a86929facaca096887b6f6255483c3025190d0006131f2b37434e586774818e9aaaa399897d707b8796a0a99c8f8276675d5145392c1c1106000b17232e3a4754606d7a86929facaca095887b6e6155483b3025190d010000000000000000000000000000000000000000000000000a16212c38444f5963707d89959faba3998d8073685d52454a5764707d8a97a3b0a99c8f8276695c4f4336291c1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171614100b05000000000000000e1b2835414e5b6874818e9ba6998d8073665a4d403334404b556b7885919ea396897c7063565c676f7c87939f9e938a7e71685e52463e32281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2b3845525e6b7885919ea396897d7063564a3d30293643505c6976838f9ca5988b7f7265584c3f32313b44505b666e7b86929f9f958b7f72695f53493f33272c2c2b2a2723201f1b17110a0200000000000000000000000009141f29323b4246474d4745404e5b6874818e9b9e9184786b5e5145382b1e1205000000010b151f2a36414d56606c788390999e93897d70675c51453c31261a0e04060606000000000000000000000000000000000000020b141c22282b2d352e343a46535e69767979797a7c7f848c9399948f847b6e665c5144382c1f2a36414d56606c788390999e93897d70675c51453c31261a0e040606000000000000000000000000000000000000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000a151e28323c454f59626d74818e949fa69d938c7f726b66727f8b98a3aeaca096887c6f6255493c2e23170b000000000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a00000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000004101c2834404a5465727f8c98a79b8e8175675c514544505b66727f8c96a1a89e9184796d60594f453c342c272524262a343c4754616d7a86939facac9f9286796d6053473a3d495663707c8996a3998c7f7266594c3f3326190c0000000004101d2935404b5564717e8b99a3afaa9e9184776a5f53473a2e1e140800030f1b26323d4a5763707d8a98a2ab998c80737e8a97a8a8988c7f7265554c4135291d0a00000613202c3945515d6776828f9ca9b1a7988c7f7265564c41362a1e110500000000000000000000000000000000000000000000000004101b27323d4854606b7683909da7ab9f92857a6d60554b4a5764707d8a97a3b0a99c8f8276695c4f4336292727272727272727272727272727272727272727272727272423201c1710080000000000000f1c2835424f5b6875828e9ba6998c7f7366594c40332e44515e6b7784919ea3968a7d70635755606b74808d96a09e92857a6d615a50443a3024190d0400000000000000000000000000000000000000000000000000000000000000000000000000000000111e2a3744515d6a7784909da3978a7d7064574a3d312a3743505d6a7683909da4978b7e7164584b3e3128333f4a545f6a737f8c95a09f92867b6e655b50443b30251a1f1d1a1613120f0b0600000000000000000000000000020e1925303b444d52545a53514b4e5b6874818e9b9e9184786b5e5145382b1e120500000000030d1925303b44505b666f7c87929f9e9184796d60574d42372b20160c0200000000000000000000000000000000000000000a141d262d33383942434045464d575e6c6c666d6d6f72787f87939f969083786d6053463c312625303b44505b666f7c87929f9e9184796d60574d42372b20160c0200000000000000000000000000000000000000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f08030c16202a333d47515b606d78828f96a0a59f93877d706d7984919eaab4aa9d9184776a5f53473b2e1c1106000000000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000c18232e3b4855616e7b88959f9f9285796d6053473f4a54606d7984919ea6a0968c7f736b60574e463f3833313131363d46505a64717e8a9aa4afaea399897c6f6356493c3d4a5764707d8a97a3988b7f7265584c3f3225190c0000000006131f2c3945515d6775828f9babb3a99a8d807467584e43372b1f0d0200000a14202d3a4753606d7986929fa99c908376818d9aa7a096887b6e6155483b2f24190d000004111d2935414c5565727f8b98a7b1a99c908376685e5246392d201407000000000000000000000000000000000000000000000000000b16212c38444f5963707d8a95a0aba2988c7f72675c514a5764707d8a97a3b0a99c8f8276695c4f43363434343434343434343434343434343434343434343434343431302d28221a110800000000000f1b2835424e5b6875818e9ba6998c807366594d40333845525e6b7885919ea396897c7063564f59606d7984919ea1978e81756c61564c4135291f160c01000000000000000000000000000000000000000000000000000000000000000000000000000000101d293643505c6976838f9ca4988b7e7165584b3e322935414c566b7784919eac968a7d7063574a3d30222d38424e57606d78839099a2988f82776c60574d42362a20170d0d0a06050300000000000000000000000000000005111e2a36424d565e6167605c554e5b6874818e9b9e9184786b5e5145382b1e1205000000000008141f28333f4a545f6a73808d96a0968c8073695f53473e32281e13080000000000000000000000000000000000000006111c262f383f44464f504b51535452535f605c606162666c727f8b95a0958c7f7265574e42372b1f28333f4a545f6a73808d96a0968c8073695f53473e32281e1308000000000000000000000000000000000000000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e090e18212c353f44515c666d7a849198a2a49992867c717e8b96a0acaea3988c7f7265584e43372b1f0a000000000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f14090000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d11040000000000000000000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d11040000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000714212d3a46535f697783909da2988a7e7164584e4345515c67717e8b949fa89f92877d70695f585048443f3e3e3f42464f58616c7683909cacaab0ab998c7f7266594c3f3f4c5865727f8b98a4978b7e7164584b3e3125180b000000000714202d3a4753606d7a86929facada297897c706356493d31261a0f00000006131f2c3845515d6775828f9ca89f92867983909daa9d918477695f53473a2d1e13080000010d19242f3b4855616e7b8895a0acac9f93867a6e6154473b2f24180d0100000000000000000000000000000000000000000000000004101c27333d4855616b7783909da7aa9e9285796d60544a5764707d8a97a3b0a99c8f8276695c4f4340404040404040404040404040404040404040404040404040403d3c39332c231a1005000000000e1b2734414e5a6774818d9aa69a8d8073675a4d40343744505b657885929ea295897c6f625649515d67707d89939d9e938a7d70685d52453e31281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000f1b2835424e5b6875818e9ba6998c7f7366594c402e2c3945525d687985929fa49a887b6f6255483c2f22262f3c44505c666f7c87929f9f948b7e71695e52463e32291e1308000000000000000000000000000000000000000714202d3a46525e696e746d675f585b6874818e9b9e9184786b5e5145382b1e12050000000000020b17222d38424e58606d7984919e9f92867b6e625a50443a3024190c030000000000000000000000000000000000000b17222d38424a50535b5d555c60605d564c4a505354545b606c7883909d9e9184786a5f53473a2e21222d38424e58606d7984919e9f92867b6e625a50443a3024190c030000000000000000000000000000000000000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312101a232834404a545e686f7c869299a4a29891847b85929ea8b2aa9f92867a6d6154473c32261b0f0000000000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d10040000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d010000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d010000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000005121e2b37424d5765727f8c98a39c9083766a605447404b55606c77828f97a2a39992857b6f6a625a554f4c4b4b4c4d5359606a707d8a949f9b9ea6a89b8f827568574d42404b546774818e9aa896897c6f6356493c3023160900000003101c28343f4a5464707d8a98a2aeab9f9285796d6053463a2d20130a00000004101d2935404b5565727e8b98a7a3988a7d87939fa99a8d807367574d42372b1e0c010000000814212d3a46535f697784919daaafa4998b7e7165554b4135291d1104000000000000000000000000000000000000000000000000000b16212c38444f5964707d8a95a0aca1978b7e72665b505764707d8a97a3b0a99c8f8276695c4f4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49443e362c22170b000000000d1a2734404d5a6773808d9aa69a8e8174675b4e4130394653606c7986929fa895887b6e6255484b55606b74818e96a19e91857a6d60594f433a2f24190d0400000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a69a8e817467544b40342d3a4754606d7a8798a29f93867a6d6053473a2d201d28343f4a545f6a73808d95a09f92857b6e615a50443a3025190e040000000000000000000000000000000000000814212e3b4754616e7b80796f6a605b6874818e9b9e9184786b5e5145382b1e120500000000000006111c262f3c45515d67707d8a939e988f82766c61564c4135291e150a0000000000000000000000000000000000030f1c28333f4a545b6068696b676d6d685d52454446474a505b6573808c99a196887b6e6255483b2f221c262f3c45515d67707d8a939e988f82766c61564c4135291e150a00000000000000000000000000000000000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c1818232e39424c565f6a707d87939fa5a09691859297a1adaea2988d8074685e5246392a20150a00000000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d0100000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000020e1a26313c4754616d7a86929f9f94887c6f62584e4244505b656e7b859299a4a19791857c716c63615959585758575f616b707c869299938f939eab9e928578695f534745515c667683909da196877a6d6054473a2d21140700000006121f2c3844505c6674818e9baab4ab9b8e8175665c5044382c1f1206000000000c18242f3b4754616e7b8795a0aa9c8f838f99a4a297897c706356493d31261a0e0000000005121e2a36424d576673808d99a9b3ab9c8f8275675d5145392c2013070000000000000000000000000000000000000000000000000005101c28333e4653606c7883909da8a99e9184786c60555764707d8a97a3b0a99c8f8276695c5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c10040000000c1926323f4c5965727f8c98a59c8f827669564c41363b4754616e7a8799a3a196877a6d605447434f59606d7a84919ea1978e81746b61554c4135291f160c01000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a89d908376665c514538303d495663707c8996aa9e918477675d5145392c1f17232e38424e58606d79849199a2988f82756c61564c41362a20160c0200000000000000000000000000000000000815212e3b4854616e7b87837c726c656874818e9b9e9184786b5e5145382b1e1205000000000000000a141d2935404b55616c75828f989f948a7e71685d52453d30261c11060000000000000000000000000000000006121f2b3844505b666c75767778797a6d60544b403a3a3f495364717e8b97a8978a7d7164574a3e3124141d2935404b55616c75828f989f948a7e71685d52453d30261c11060000000000000000000000000000000000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c2823272727303a444e58616b727f8c939ea7a0989298a1a9b1a79f92867a6e61564c41362a1e1105000000000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d120700000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000914202d3946525e6874818e9aa49b8f82756a60544a3f49535e69717e87939fa3a19791867e76706b686564646567696e747d8592989387828f9baaa197887b6e6255484653606d7985929f9e918478675d5145392c2013060000000713202d3a4653606d7985929eabaea3998a7e7164544a3f34281c1003000000000714202d3a46525e697783909daa9f948f949fab9f9285796d6053463a2d20130900000000020e1a26313c4956636f7c8997a1adac9f92867a6d6054473a2e23180c00000000000000000000000000000000000000000000000000000b161f2b3744505b65717e8a95a0aca0968a7d7064626264707d8a97a3b0a99c8f827669676767676767676767676767676767676767676767676767676767676764615a5044392d2014080000000a1723303d4a5663707d8996a89e918477685e5246393c4956626f7c8995ab9e918478685d52453d45515d67707d8a939e9e938a7d70675d51453d31281d1207000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8796a09f9286796d6053463c36414c5665727f8c98ab9b8e817568554b4035291d111c26303c45515c676f7c87939f9e948a7e71685e52463e32281e130800000000000000000000000000000000000815212e3b4854616e7b8790867f776e6974818e9b9e9184786b5e5145382b1e120500000000000000020b18242f3a43505a616e7b86929f9e92857a6d60594f42382e23170c030000000000000000000000000000000613202d394653606c7881838485868275665c5145403f414a5464717e8b97a4988b7e7165584b3e32251818242f3a43505a616e7b86929f9e92857a6d60594f42382e23170c03000000000000000000000000000000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e34343430353c464f59636d74818e959faaa29fa2aab3aaa0958c7f72685e52443a3025190d010000000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c01000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000005111d2935414c56626f7c87939f9f93877c6f665b5044414d57616c727f8b919fa3a198928b827d78757271717274777b81879297978e817d8998a3a9978b7e7164584b4a5463707d8a98a29c8f827569554c4135291d11040000000a1623303d495663707d8997a2adac9f92867a6d6054473a2e23170c000000000005111e2a36424d576673808c99a9a69f9c9fa6ab9b8e8275665c5044382c1f120600000000000913202d394653606c7985929eabaea3988a7d7164544a4034281c100400000000000000000000000000000000000000000000000000030f1b27333f4953606c7884919da8a89c9083766e6e6e6e707d8a97a3b0a99c8f8276737373737373737373737373737373737373737373737373737373737373706c6155493c3023160a0000000714212e3a4754616d7a8796a0a096877a6d61544740414d5765727f8c98ac9c8f827569564c4135414c55616b75818e97a19e91847a6d60594f43392f24180d030000000000000000000000000000000000000000000000000000000000000000000000000714202d3a46525e697784919ea398897d7063584e433f46525e6876828f9ca3998b7e7164584b3e2f24180c151e2834404b55606b74808d96a19e92857a6d615a50443a3024190d04000000000000000000000000000000000815212e3b4854616e7b8798928c827b7174818e9b9e9184786b5e5145382b1e1205000000000000000007131d28313e46525e69727f8c95a0978e81746b60544a3f34281f140900000000000000000000000000000006121f2b3844505b6677849091929285796d6058514a4c4b515b6673808d99a9978a7d7164574a3e312417131d28313e46525e69727f8c95a0978e81746b60544a3f34281f14090000000000000000000000000000000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d49464440414141414241464749505b606d79839098a2aeacaeb4aea2989083786d60564c4132291e13080000000000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d04000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000010d1925303a47535f6a75828f9aa49a9083786c60564c4145505a626d737f8a9298a0a29f948f8984817f7e7e7f8083878e92999992857b7986929fa79a8e817467564c505c6674818e9aa7988c7f7265594c3f2f24190d01000006131f2b37434e586774808d9aa9b3a99c8f8276675d5145392c1c11060000000000020e1a25303c4955626f7c8897a1adaba9abafa4998b7e7164544a3f34281c1003000000000006121f2b3844505b6674818e9babb4aa9b8e8175665c5144382c1f120600000000000000000000000000000000000000000000000000000b17222d3844505b66717e8b96a0ab9f948a7d7b7b7b7b7b7f8b98a5b1ab9e9184808080808080808080808080808080808080808080808080808080808080807e7064574a3d3124170a0000000713202d3946525e687784919ea8978a7e71645b514b4c535f6976828f9ca49a8c7f7266594c3f2f3a434f59616d7a85919ea1968e81746b60554b4035291f150b01000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d576773808d9aa69b8e81746a5f554e4a5059616d7a86929f9f92867a6d6154473a2e2114070c18232e39434f59606d7984919ea1978e81756c61564c4135291f160c010000000000000000000000000000000815212e3b4854616e7b879298948f857e74818e9b9e9184786b5e5145382b1e12050000000000000000010c161f2a36424d57606d788390999f93887c6f665c50443b31251a0d040000000000000000000000000000030f1c28333f4a546774818e9a9f978b7e716a605c5459555d606c7884919da297897c6f6356493c3023160c161f2a36424d57606d788390999f93887c6f665c50443b31251a0d04000000000000000000000000000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4f4c5254535b60636b6f7a85929facb8bab2a89f92867c6f665c50443b3020170d0200000000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d010000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000008131e2b37434e58626f7c87939f9f958b7f72685e53493f48515b636d737e8691969fa39f9c96918e8c8b8a8b8d9093999f9993877d707683909ca99d918477685d5253606d7985919ea095887b6e6155483b2e2215080000000815222e3b4754606a7884919eabb1a7988b7f7265554c4135291d0a000000000000000913202d394653606c7884919eabb8b6b9ac9f93867a6d6154473a2e23170c000000000000030f1c28333f4a5464717d8a99a3aeab9f9285796d6053463a2d22170b000000000000000000000000000000000000000000000000000006111b28333f4a54606d7884919ea8a69a8f8a88888888888b919ba7b3aca196918d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8074675a4e4134271b0e01000005111d2a36414c566673808c99a59d9083766d605c55565e656e7b87939f9f93877b6e6154483b2e313e46525d68717e8a939e9d93897d70675d51453d31271d12070000000000000000000000000000000000000000000000000000000000000000000000020e1a25303c4855626f7c88949f9f92867c6f676058545c606b73808d99a39c8f8275685e5246392d20130707121d27303d45515d67707d89939d9e938a7d70685d52453d31281d13070000000000000000000000000000000613202d394653606c787f86909597928a81818e9b9e9184786b5e5145382b1e1205000000000000000000040d1a25303b44505c666f7c87939f9a9083786d60574d42362a1f160c0100000000000000000000000000000b17222d3c4956626f7c89949f9f92857c716d66666666676d737f8c96a09f9285796d6053463a2d2013070d1a25303b44505c666f7c87939f9a9083786d60574d42362a1f160c0100000000000000000000000000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5b5c565d6163656c70757d839098a2aebab9aca0968a7e716a5f544a3f32291e0e0500000000000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e05000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000020f1b26323c47535f6a74818e97a29f92857a6d655b50443f49515b636c717c848c92989ea1a19e9b989797989a9d9f9f9791877e716b73808c99a09f93867a6d61545b65717e8a97a19d918477695f53473a2d2114080000000916222f3c4955626f7c8896a1adaca095877b6e6154483b2f24190d0000000000000005121f2b3744505b6574818e9aaab4bfb6a99c908376685e5246392d1c1106000000000000000b17222d3a4754606d7a86929facada297897d706353493f33271b0f0300000000000000000000000000000000000000000000000000000b17222d3844505c66717e8b96a1aca19a969595959595989ba3adb8b2a8a19e9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8d8174675a4e4134271b0e010000010d1925303b4855626e7b88939e9f958b7f736d676767686d77828f99a49c908376695e53463a2d2935414c56616c75818e97a19e9184796d60594f43392f24180c0400000000000000000000000000000000000000000000000000000000000000000000000915212e3b47535f6a76828f9aa3999083796f6a6867666d717d87929f9f94897d7063564c41362a1e1105000b151e2935404b55606b74818e97a19e91857a6d60594f433a2f24180d04000000000000000000000000000006121f2b3844505b666c727c838c9299938e8e939e9e9184786b5e5145382b1e12050000000000000000000009141f28343f4a54606a74808d97a0958c7f72695e53463e31281d130700000000000000000000000000000615222e3b4754606a76828f98a29792857e7975737273757a8088939fa1978d8074665c5144382c1f120609141f28343f4a54606a74808d97a0958c7f72695e53463e31281d1307000000000000000000000000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869686d7073787d82899095a0aab4b4b7aa9e9184796d605b51473e342a20160c030000000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000104000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060503000000000000000000000000000000000000000a15202b37434e58616d7a85929fa2978f81776c605a50464049515a616a6f797f868c9196999c9d9e9f9f9e9c9a98928d857d716c63707d899994949a8a7d706355606c7883909da3998c807366574d42372b1e1206000005121e2a36424d576673808c99a8b2aa9d908377695e53463a2d1e130800000000000000030f1b27333f495364707d8a98a2aeacb2a8998c7f7266564c41362a1d0a00000000000000000613202c3945515d6776828f9ca9b3a99a8d8174655b5044372b1f1205000000000000000000000000000000000000000000000000000006111c28343f4a54606d7984919ea8aba5a3a1a1a1a1a1a5a7adacacacb2acaba6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8d8174675a4e4134271b0e010000000814212e3a47535f6975818e98a29f92877f79757474767a818f949f9e93897d7063574d42362a24303a44505a616d7a85929ea0968d80746b60554b40352920150a000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e58626f7c87939f9f9590837c77757475797e869299a2988f82766b6054443a3025190d0100030c18242f39434f59606d7a84919ea1978e81746b60554b40352921160a0000000000000000000000000000030f1c28333f4a545b606a6e787f8690959b9b9ea59e9184786b5e5145382b1e120500000000000000000000030b17232e38424e58606d7a84919e9f92867b6e615a50433a2f24180d010000000000000000000000000006131f2b37434e58616e7b869298a097928b8582807f8082858d939aa19892857a6d61544a4034281c1004030b17232e38424e58606d7a84919e9f92867b6e615a50433a2f24180d0100000000000000000000000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c797776747474747576777a7d8084898e939da0a7afaaa8abaca0968e81746d62594f463c32281e150b000000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b020000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000004090e11131314202d3a4753606d7a8693a0acac9f9286796c5f5346392c201312110f0c070100000000000000000000000000000000040f1b26323c46525e68717e8b949e9e938c80736c61584f474048505860676d737b8084898c8f9192929291908d8a85807a706b61606d798787878787878073665d67707d8a95a09f92867b6e6154483c31261a0e0200000714212d3a46535f697784909d9f9fa9998c807366574d42362a1e120500000000000000000b17222d3a4753606d7a86929f9f9f9fa196887b6f6255483c3025190d000000000000000004111d2935414b5565727f8b98a79f9f9e9184786c605346392d2013060000000000000000000000000000000000000000000000000000000b17232e3844515c66727e8b96a19f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8d8174675a4e4134271b0e0100000006121e2b37424d57616e7b859298a299928c8582818182868f939e9f958e81756b6054453b31251e28323e46525e68717e8a949e9f93887d6f675d51453d32271b0f0300000000000000000000000000000000000000000000000000000000000000000000030f1b26323c4754606a74808d949e9f95908983818082848b9298a29992857b6e61594f4432291e130800000007121d28313d45525d68707d8a939e9d93897d70675d51453d32271b0f0300000000000000000000000000000b17222d38424a50585f666d727c838c9299a0a79e9184786b5e5145382b1e1205000000000000000000000006111c26303d45515d67717e8a949e988f82756c61554b4035291d110400000000000000000000000000030f1b27323d46535f69707d8691969e9f97928e8c8c8d8f92989f9f9691867d6f685e5242392e23180c000006111c26303d45515d67717e8a949e988f82756c61554b4035291d1104000000000000000000000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808182838487898c91969b9ea5acaba59e9b9ea1a89d938c7f726b61584e443a30271c1207000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a10060000000000000000000000000000000000000000000000000000000000000e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000080f151a1d1f2020202d3a4753606d7a86939f9f9f9f9286796c5f5346392c20201f1e1c18130c05000000000000000000000000000000000a15202a36414c56626d76828f97a19f93887e716a60594f473f464e555c60696e73797c7f82848586858583817d79736d6860595d67757a7a7a7a7a7a796d60606d7984919ea49a8e8174695e53463a2a1f15090000000815222e3b4855616e7b88959393939396897c6f6256493c31251a0e02000000000000000006131f2c3945515d6775828f93939393939184786a5f53473a2e1e13080000000000000000010d18242f3b4854616e7b87959393939396897c6f6256493c2f23160900000000000000000000000000000000000000000000000000000006111c2834404a54606d7984919393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393938d8174675a4e4134271b0e01000000020e1a26313c46525e69707d8692989f9f98928f8d8d8f92999e9f9590837a6d61594f4433291f16202a36414c56616c75828f97a29a9184796d60584e43372b1f130600000000000000000000000000000000000000000000000000000000000000000000000a15202b37434e58606d78828e939da09d95908e8d8e91969f9f9792877d70695f53473d3320170d02000000010c161f2935414c56616c75818e97a19e9184796d60594f44382c1f1307000000000000000000000000000006111c262f383f444e545c606a6f788087909593939184786b5e5145382b1e12050000000000000000000000000a141e2935414c55616c75828f9893948a7d70675d5145392c20130600000000000000000000000000000a15202a36424d57606b707c848c9196999c9b9999999b9d9a97928d847d6f6b60564c4130271c12070000000a141e2935414c55616c75828f9893948a7d70675d5145392c20130600000000000000000000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8e8f8f919696999ea1a8aaaca69f9c938e9196a1a59f93877d706a5f564c42392e2318110800000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c11080000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66737f8c999393939393939084776b6054443a3024190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66737f8c999393939393939084776b6054443a3024190d0100000000000000000000000000000000000000000000000009121a20262a2c2d2d2d2d3a4753606d7a8693939393939286796c5f5346392d2d2d2c2b28241e170f07000000000000000000000000000000040d1925303a44505a616e7b859299a39a92867c6f6b6159504641434b51565e61666d6f737677787979787674706d67615d564f555d686d6d6d6d6d6d6d67616b74808d96a19f93877c6f62574d42362a180e030000000c1926323f4c5965727f8686868686868684786c605346392d20130900000000000000000004101d2935404b5565727f86868686868686807467584e43372b1f12060000000000000000000714212d3a46535e697783868686868686868073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000c18232e3945515c67727f86868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868074675a4e4134271b0e01000000000915202a36424d56616b707d868e92999b9d9b9a9a9c9d9a97928b837a6d685d52473d3321170e1925303a44505a616e7b85929393968d80736a6054473b2e2215080000000000000000000000000000000000000000000000000000000000000000000000040f1b27323d44515c666d79818a9195999c9d9b9a9b9e9c99928e857d706b61574d42352b210e050000000000040d19242f3a44505a616d7a85929393968d80746b6054483b2f2215090000000000000000000000000000000a141d262d333c424a50585f666d737c838686868684786b5e5145382b1e1205000000000000000000000000020c19242f3a43505a616e7b8686868686847a6d6053473a2d2014070000000000000000000000000000040e1a26313b454f59606a6f797f848a8d8f9192929291908d8a8580796f6b60594f443a301e150b00000000020c19242f3a43505a616e7b8686868686847a6d6053473a2d2014070000000000000000000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9ea0a8a6abacaba39f9b94908981849198a2a49992867c6e685e544a40342823190b020000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a0000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a8786868686868686867f7265594f4332281e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a8786868686868686867f7265594f4332281e130800000000000000000000000000000000000000000000000008121b242b323639393939393a4753606d798686868686868687796c5f5346393939393837342f2921190f0500000000000000000000000000000008131e29323f46525e69707d87929fa29892857d706b625a524c4440454d52545c606366696a6b6c6c6b696764605c55524c444c565d61616161616160606a707d88939fa2978e81756a5f53453b31251a06000000000b1825313e4a57626d7279797979797979786c655b5044372b1f1205000000000000000000000c18242f394a56626d7279797979797979746e6458463c31261b0f0300000000000000000005121e2a36424d5767717779797979797979736e63584b3f3226190c0000000000000000000000000000000000000000000000000000000007121c2834404b55626d727979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746e64584c3f33261a0d0000000000030e1925303b444f59616b707a81868b8e9091929291908d8a857f786d685e564c41352b210f08131e29323e46525e69717e8686868686877c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000000000a16202834404a545c676d747d84898d8f91929292918f8c87817b706b61594f453b3123190f0000000000000008131e28323e46525e68717e8686868686887c6f6356493c30231609000000000000000000000000000000020b141c222830383f444e545c606a6f77797979797872685c5043372a1d11040000000000000000000000000008131e28313e46535f696e7979797979786d675d5145392c20130600000000000000000000000000000009141f29333d474f5860676d72787d8082848586858483807e79736d6760594f473d32281e0c03000000000008131e28313e46535f696e7979797979786d675d5145392c20130600000000000000000000000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a8a9aaa8a6aaa29f9c99928f89837d757c86929aa4a29891847a6d665c51443f352b1d140a000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a010000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e686e797979797979797979726d6256473d32261e140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e686e797979797979797979726d6256473d3220160c020000000000000000000000000000000000000000000000040f1a242d363d4245464646464545515c67767979797979797979756a5e523e454646464544403a332b21170c010000000000000000000000000000020d17202a36424d56606b727f8b929ca29792867d716c615e5650474242464a505356595c5e5f5f5f5e5d5a5753514b46413a444c5254545454545960696f7c86929aa49f92857b6e61584e4333291f1409000000000916222e3a46515b62656c6c6c6c6c6c6c6b605b53493f33271b0f030000000000000000000007121d2e3a45515b62656c6c6c6c6c6c6c67645c5247342a20150a00000000000000000000020e1a25313b45555f676a6c6c6c6c6c6c6c66635c52473b2f23170a00000000000000000000000000000000000000000000000000000000000c18232e3943515b62656c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645c52473c3024170b00000000000009141f29323e474f5960686e747a7e81838485858483817d79726d665e564c443a3023190f020d17202a36424d57626c717979797979796f6a6054473b2e221508000000000000000000000000000000000000000000000000000000000000000000000000040c18232e39424b555c606c70777c80838485868584827f7b756e6961594f473e332a1f110700000000000000010c16202a36414c56616c717979797979796f6b6054483b2f22150900000000000000000000000000000000020a11171e262e343c424a51585f626a6c6c6c6c6b6860564b3f33271b0f0200000000000000000000000000010c161f2a36424d575f616c6c6c6c6c6b605d554b4035291d1104000000000000000000000000000000030d17212b353d464e555c60666d70737677787978787674716d67605d554f473d352b20160c000000000000010c161f2a36424d575f616c6c6c6c6c6b605d554b4035291d1104000000000000000000000000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9f9e9d9c9a9898928f8b86827d76706b707e88939fa5a0968f82786d605b51473d2f261b1106000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a010000000000000000000000000000000000000000000000000000000000000000000006111c2a36414d565e616c6c6c6c6c6c6c6c6c65625b51443f3830261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36414d565e616c6c6c6c6c6c6c6c6c65625b5146342b210e040000000000000000000000000000000000000000000000000915202b363f484e5253535353514a4b555c6c6c6c6c6c6c6c6c6c6a6359464b5253535352504c453d33291e1307000000000000000000000000000000050e1925303b444f59626d73808d929da29892877e756d68615a534e47433f4446494c4f5152535252504e4a4745403935323a414647474d535b626b707b859198a29e948b7e71685e52463c3121170d030000000006121e29353f49515759606060606060605e53504941382d22170b000000000000000000000001111d29343f48515658606060606060605a58524a413622180e04000000000000000000000009141f2933434d555b5d606060606060605a58524a40352a1f1307000000000000000000000000000000000000000000000000000000000007121d27303f4951565860606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605a58524a41362b1f1408000000000000020d17202c353e474f565e61686e717577787979787674706d67605c544c443a32281e110700050e1a25303b45505a62656c6c6c6c6c6c6260584e43372b1f13060000000000000000000000000000000000000000000000000000000000000000000000000007121c273039434b515a61646b6f7376787979797775726e69615e574f473e352c21180e000000000000000000040d1925303a44505a61646c6c6c6c6c6c6360594f44382c1f1307000000000000000000000000000000000000060c141c2328303940444e54555d606060605e5c564e443a2f23170b000000000000000000000000000000040d1a26313b454d53555f606060605e53514b433a2f24180d0100000000000000000000000000000000060f19232b343d434b51545c606366696b6c6c6c6b6a6764605d55514b433d342b23190e0400000000000000040d1a26313b454d53555f606060605e53514b433a2f24180d0100000000000000000000000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929293929291908f8d8b8885827e7a75706b63616c737f8c939ea79f948d80746d62594f41382d22170b000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f191109000000000000000000000000000000000000000000000000000000000000000000000000000e1925303b444d52545f606060606060606060605f5e504a42382e23170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e38424a505e5f606060606060606060585651493f3422190f000000000000000000000000000000000000000000000000000e1a26323d4851595e606060605e575550515f606060606060605f5e595053585f6060605f5c574f453a2f24180c0000000000000000000000000000000009141f29323d47515b636e74808d929fa299928b817a706c625f57534e4745413c4043444546464543413d3a383435393a3d43474c52575f626d727d859197a1a0958f82756c62564d41342a200f050000000000010d18232d373f464a4c535353535353535246443f382f261b11060000000000000000000000010c18232d363f454a4b535353535353534e4c4741382f241006000000000000000000000000030d1721323b434a4f51535353535353534d4b4740382e24190e020000000000000000000000000000000000000000000000000000000000000b151e2d373f464a4c53535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534e4c4741382f241a0e0300000000000000050e1a232c353d444c52565e6164686a6b6c6c6b6a6763605d55504a423a322820160c00000009141f29333f4850565860606060605f56544e463d32271b0f0300000000000000000000000000000000000000000000000000000000000000000000000000000b151e2730394045505559606366696b6c6c6c6b6965615e57524d453e352c231a0f060000000000000000000008131e29323e4850555760606060606056544f473d32271b0f0300000000000000000000000000000000000000020a11171e272e343c434749515353535351504b443c32281d12070000000000000000000000000000000009141f29333b4246485253535353514745403a31281d1307000000000000000000000000000000000000081119222b303940454a5053575a5c5e5f5f5f5e5d5a5753514b45413a312b2219110700000000000000000009141f29333b4246485253535353514745403a31281d1307000000000000000000000000000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868685848382807e7c7975726e686360595a636d75818e95999999928b7f726b6053493f33271b0f030000000000000000000000000000080e171f252a33383d44484d535f605c60626567686a6b6b6c6c6c6b6a6a68666462605c605f534d47433c383229241d160d07000000000000000000000000000000000000000000000000000000000000000000000000000008141f29323b41464753534d545b60666c6c6c6c6c6a5c544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545c6a6c6c6c6c6c66605b544d4c4a463f372d23130c04000000000000000000000000000000000000000000000000111d2a36424e59636b6c6c6c6c6b64615a534d53535353535353534d535b60656c6c6c6c6b6861574c4034281c0f00000000000000000000000000000000020d17202b353f49525c646e74808c9399a29f938e857d756e6a625f5854524c49474540413f3e3e3d3d3e3f3f404045474a4e53565e61696e767e879297a1a1969083796d605a50443b3022180e0000000000000007111b252d353a3e3f46464646464646453937332d261d140a0000000000000000000000000006111b242d343a3d3f4646464646464641403c362f261d130000000000000000000000000000050f202932393f434446464646464646403f3b352e261c120800000000000000000000000000000000000000000000000000000000000000030c1b252d343a3e3f4646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646413f3c362f261d130800000000000000000008111a232c323b41464c5254585b5d5e5f5f5e5d5a5753514b443f38302820160e04000000020d17202d363f454a4b5353535353534947433d342b20150a000000000000000000000000000000000000000000000000000000000000000000000000000000030c151e272e343e44494f54565a5c5e5f5f5f5e5c5954524d46423b332c231a11080000000000000000000000020d17202c363e45494b5353535353534948443d352b21160a00000000000000000000000000000000000000000000060c151c232832373b3c444646464645433f3a322a20160c0100000000000000000000000000000000030d17212931363a3b4646464646453a39352f281f160c01000000000000000000000000000000000000000810191e272e34383f44464a4d505152535251504d4a47454039352f281f19100700000000000000000000030d17212931363a3b4646464646453a39352f281f160c01000000000000000000000000000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979797878777573716f6d6665615e56544f515b606d79838c8c8c8c8c8c867d70655b5044372b1f1205000000000000000000000000000000050d141a21272c36424d575e6c6c6c6c6c6c6c6a665f5f5f5f5f5e5e66696c6c6c6c6c6c6c5e574d42362b272018130c04000000000000000000000000000000000000000000000000000000000000000000000000000001070e17202930363b424651575f666c72797979797975665c5044382b1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c66757979797979726c665f575146423b3229251e160e070100000000000000000000000000000000000000000000131f2c3945525e6b757979797978706c615f57514b434646424b51575f656c71787979797873685c5044372b1e110000000000000000000000000000000000050e19232d37404a525c646e737f8792979f9e97928a827b756f6a65605d565653514b4d4c4b4b4a4a4b4b4c4d4b515357585f62686d737b828b9299a19f9791847a6e675d51483e32291f100600000000000000000a131b23292e313239393939393939382d2b27221b140b02000000000000000000000000000009121b23292e3132393939393939393433302b241d140b0100000000000000000000000000000e1720272e3336373939393939393933322f2a241c140a00000000000000000000000000000000000000000000000000000000000000000009131b23292e313239393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393433302b241d140b010000000000000000000008111a202930363b4146474b4e5051525251504e4a47454039342e261e160e040000000000050e1b242d343a3d3e4646464646463c3b37322b22190f0400000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d232833393d4348494d5051525352514f4c4846423b363029211a110800000000000000000000000000050e1b242c34393d3e4646464646463c3b38322b23190f040000000000000000000000000000000000000000000000030b121820262b2e2f37393939393837332f2820180f05000000000000000000000000000000000000060f171f262a2d2e3939393939382d2c29241d160d04000000000000000000000000000000000000000000070c151d23282e34383a3d4043444546454543413e3a38352f29241d160d07000000000000000000000000060f171f262a2d2e3939393939382d2c29241d160d0400000000000000000000000000000000000000000000000000000000080e171f252a33383d44484d5254545c60626567686a6b6b6c6c6c6c6b6a69676562605c5454524c484445515c676e7b808080808080807f786c605346392d2013060000000000000000000000000000000002090e16212d3a46535e69767979797979797771665b5253525a66707679797979797976695e53463a2d21160d07010000000000000000000000000000000000000000000000000000000000000000000000000000040c1318202830353e444d525b62696e787f8686868687796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7987868686867f786e69625b524d443e3530282018130c0400000000000000000000000000000000000000000013202d394653606c7987868686847d756e69605c554f46454f545c60696e777e8586868685786b5f5245382c1f1200000000000000000000000000000000000007111b252e38414a525c646d727d8590949fa19e938f87817c76716d686663605d555a59585757575858595a555d6063676a6f747a80868f949fa39e9590857c6e685e554c41362d20170d000000000000000000010a11181e2225262d2d2d2d2d2d2d2b201f1b17110a02000000000000000000000000000000000911181d2224252d2d2d2d2d2d2d2726241f1a130b02000000000000000000000000000000050e161c2227292a2d2d2d2d2d2d2d2726231f19120a02000000000000000000000000000000000000000000000000000000000000000000010911181e2225252d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2726241f1a130b02000000000000000000000000080e171e252a3036393b3e42444546464543413d3a39352f28231c150c040000000000000009121b22292e31323939393939392f2e2b2720191007000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b121822282d32383b3c40434546464644423f3b3a36302a251f170f0800000000000000000000000000000009121b22282d3031393939393939302f2c27211911070000000000000000000000000000000000000000000000000000070c151b1f22222a2d2d2d2d2b2a27231d160f060000000000000000000000000000000000000000060d141a1e21222c2d2d2d2d2b20201d18130c040000000000000000000000000000000000000000000000030b12181c23282b2d30333638393939383734312d2c29241d18130c040000000000000000000000000000060d141a1e21222c2d2d2d2d2b20201d18130c04000000000000000000000000000000000000000000000000000000000000050d141a21272c33383b4246474a505355585a5c5d5e5f5f605f5f5e5d5c5a585553504a4746413b38404b555e696e73737373737373726c655b5044372b1f12050000000000000000000000000000000000000815212e3b4854616e7b86868686868683776a5d50464f5c6976828686868686867b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000070d161d2429323a414650565e616d727b828c929992877e71665c5044382b1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c66717e879399928c827b726d615e565046413a3229241d160d0700000000000000000000000000000000000000000b1825313e4b5864717e889396918a827b736d67615953525960666d737b828b929792877e7064574a3d3124170a0000000000000000000000000000000000000009131c262f38414a525b626b707b828c92989e9e99928e88837e7a76726f6d67696766656464646465666769676d7074777c81868d92999fa19e938e837b6e6a5f564d433a2f241b0e050000000000000000000000070d12161819202020202020201f13120f0b0600000000000000000000000000000000000000060c11151718202020202020201b1a17140e08010000000000000000000000000000000000040b11161a1d1e202020202020201a1917130e0800000000000000000000000000000000000000000000000000000000000000000000000000070d1216181920202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b1a17140e08010000000000000000000000000000050d14191e252a2d2e313537383939383734302d2c29241d17110a030000000000000000000911181d2124252d2d2d2d2d2c23221f1b150f07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c171c21272c2f303336383939393836322e2d2a251f1a140d0500000000000000000000000000000000000910171d2124242d2d2d2d2d2d23221f1b160f0700000000000000000000000000000000000000000000000000000000040a0f1315161e202020201e1d1b17120c050000000000000000000000000000000000000000000003090e1214151f202020201e1413110d07010000000000000000000000000000000000000000000000000000070c11171c1f202427292b2c2c2c2b2a2724201f1d18120d07010000000000000000000000000000000003090e1214151f202020201e1413110d0701000000000000000000000000000000000000000000000000000000000000000002090e161c21272c30363a3b3f4446494b4d4f5051525253535251504f4d4b4946443f3b3936302f39434d565e616666666666666665605b53493f33271b0f030000000000000000000000000000000000000815212e3b4854616e7b87939393939083776a5d50444f5c6976828f93939393877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000710191f282f353e444c525a61696e767f8690949a93877e716c61544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f191007000000000000000000000000000000000000000a1724303d4956626c717f8b919e948f868079706b615f5d606b6f797f868f949f93887e716c6155493c3023160a00000000000000000000000000000000000000010a141d262f384049515961696e787f868f949c9f9f9b94908b86837f7c7a77757472717170707172727376787a7d8084888e92989fa39f97928b81796e695f574e443b31281e1209000000000000000000000000000106090b0c1313131313131312060503000000000000000000000000000000000000000000000105090b0c131313131313130e0d0b0803000000000000000000000000000000000000000000060b0e1011131313131313130d0c0a07020000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c13131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130e0d0b0803000000000000000000000000000000000002080e14191e202125282a2b2c2c2b2a2724201f1d18120c06000000000000000000000000060c111517182020202020201615130f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b10161b1f222327292b2c2c2c2b292621201e1a140e090300000000000000000000000000000000000000060c111517182020202020201615130f0a040000000000000000000000000000000000000000000000000000000000000003060809111313131312110f0b0701000000000000000000000000000000000000000000000000000205070813131313131207060401000000000000000000000000000000000000000000000000000000000000060b101213171a1d1e1f201f1e1d1a171413100c070100000000000000000000000000000000000000000205070813131313131207060401000000000000000000000000000000000000000000000000000000000000000000000000050b10161c1f252a2d2e34383a3c3e414244454546464645454442403e3c3a38342e2d2a2527313b444d5254595959595959595953504941382d22170b000000000000000000000000000000000000000815212e3b4854616e7b87949f9f9d9083776a5d50444f5c6976828f9c9f9f94877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000040f19222b313a41454f565e616c717b828b92989a93887e716c615a5042382e23170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f040000000000000000000000000000000000000815212d3945505a626d727f8b919c98928c847d756e69686d747c838c92989c918b7f726c625a5044392d2014080000000000000000000000000000000000000000020b141d262e373f474f575e666d727b828990949b9f9f9c9992908c89868482807f7e7e7d7d7e7e7f808284868a8d91969b9fa39f99938d857e756d675e574e453c32291f160c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e111414181b1d1e1f1f1e1d1b171413100c070100000000000000000000000000000105090b0b13131313131309080603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315161a1d1e1f201f1e1c191514120e0903000000000000000000000000000000000000000000000005080a0b1313131313130909070300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070a0d101112131212100e0b070604000000000000000000000000000000000000000000000000000000060606060605000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1014191e2023282c2d2f3234353738383939393938373634322f2d2c2823201e191f29323b4246474d4d4d4d4d4d4d4c46443f382f261b1106000000000000000000000000000000000000000815212e3b4854616e7b8794a1aa9d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000a16212b343d434b515961686d757e858f949f9f93887f716c625a50483e30261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a00000000000000000000000000000000000005111d29343e48505a626d727f8c929c9f96918a827b73717a818891959f9d928c7f736d625a50483e33281c1004000000000000000000000000000000000000000000020b141c252d353e454d545c60696e757c83898f93999da09f9c999992918f8d8c8b8a8a8a8b8b8c8d8f91939a9a9ea0a19e99928e87817a716c605d554d453c332a20170d040000000000000000000000000000050a0d0f10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100f0d0a0500000000000000000000000002080d101213131313131313090806030000000000000000000000000000000000000000000000010407071213131313131313131313120f0a0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0f1112131312100e0a07060400000000000000000000000000000000000000000000060606060606000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030709090d1012131313110f0c08070502000000000000000000000000000000000000000000000000000000000006060606060600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090b0d0f1111121313121111100d0b08060603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e1114171c1f20222527292a2b2c2c2d2c2c2b2a29272522201f1c1714110d17202930363a3b404040404040403f3937332d261d140a00000000000000000000000000000000000000000815212e3b4854616e7b8794a1a99d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d464e555d606b707a818a92979f9b918b7f726d625a50483e362c1e140a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f030000000000000000000000000000000000000c17222d363f48515b636d737f8c929ca09e948f867f7d848d939aa09d938d80736d635b51483e362c22170b0000000000000000000000000000000000000000000000020a131b232c333b424a50575f616b6f767c82878c9196989c9fa29f9d9c9a99989797979798999a9c9e9fa39f9c9997918c86817c746d68625a514b433b332a21180e0500000000000000000000000000030a1016191c1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1c1916100a03000000000000000000060d14191c1f1f2020202020201515120f0a030000000000000000000000000000000000000001080d1113141f202020202020202020201e1b161009010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104070c10121316181a1c1d1e1f1f201f1e1d1c1a181513120f0b060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205060c10121316181a1c1d1e1f1f20201f1e1d1c1a18161312100c0605050e171f252a2d2e33333333333333322d2b27221b140b0200000000000000000000000000000000000000000815212e3b4854616e7b87949c9c9c9083776a5d50444f5c6976828f9c9c9c94877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000007131f2c38434e5860676d747d858e939fa29b918b7f726d625a50483f362d241a0c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f130700000000000000000000000000000000000006101b242d363f49515b636d73808d929da49e98928c8a91969fa49e938e81746e645b51493f362d241a10050000000000000000000000000000000000000000000000000109111a212930383f444d535960636b6f757b7f84888c8f929797999b9c9d9e9f9f9f9f9e9d9d9b99979992908c8884807a746f6a615d5650454039312920180f0600000000000000000000000000040d151c21262929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292926211c150d04000000000000000810181f25292b2c2d2d2d2d2d2d22211f1b150e060000000000000000000000000000000000040c13191d20212b2d2d2d2d2d2d2d2d2d2d2b27211b130a0100000000000000000000000000000000000000000000000000000000000000030506090c0e1011121313131211100e0b090605030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506090c0e1011121313131211100e0b090605030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070b0d0f111213131312110f0d0b07070501000000000000000000020608080c0f1112131312110f0c080705020000000000000000000000000000000000000000000000000000000001080d1113181c1f20222527292a2b2c2c2c2c2b2a29272422201f1c1712100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e0906030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0e0f1112121313131212110f0d0b0907060300000000050d14191e20212626262626262626201f1b17110a020000000000000000000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f83776a5d50444f5c6976828f8f8f8f8f877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000915222e3b4854606a6f79818a91979ea39c918c7f726d625b51483f362d241b12080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e2215090000000000000000000000000000000000000009121b242d373f49525b636e74808d929da5a39f99979ea1a69e948e81786c605c524940372d241b1108000000000000000000000000000000000000000000000000000000080f171e262e343b42464f54596063696e73777b7f8285888a8c8e8f9192929292929191908f8d8b8886837f7c78736e68625f58524c443f352f271f170e0600000000000000000000000000030d161f262d3235363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363635322d261f160d03000000000006101a222a303538393939393939392f2e2b2620181006000000000000000000000000000000040d161e24292c2d383939393939393939393937332c251c13090000000000000000000000000000000000000000000000000000000003060b0f121315181b1d1e1f2020201f1e1c1a181513120f0b0603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060b0f121315181b1d1e1f2020201f1e1c1a181513120f0b060300000000000000000000000000000000000000000000000000000000000000000000000000000000000004080d111314171a1c1e1f1f20201f1e1c1a171413110d08040100000000030a0f121415191c1e1f20201f1e1c191514120e090300000000000000000000000000000000000000000000000003090e13191d2023282c2d2f31333637383839393838373634312f2d2b28221f1c17110d0802000000000000000000000000000000000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010204050506060606050403010000000000000000000002090e1114141a1a1a1a1a1a1a1913120f0b0600000000000000000000000000000000000000000000000814212e3b4754616e7a8283838383828074675a4e414d5a6673808283838383827a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c848e9393939393918c7f726d625b51493f362d241b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f231609000000000000000000000000000000000000000009121b252d374049525c646e74808d939da59f9f9f9fa79f948f82786d665b504a40372e251b12090000000000000000000000000000000000000000000000000000000000050c141c232831363d44484f54575e61666a6e7276797b7e80818384858586868584848382807e7c7a76726f6c65615e56534e46413a3229241d150d0500000000000000000000000000000a151f2831383e424343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343423e3831281f150a00000000020d18222c343b4144464646464646463c3a37312a22180e0300000000000000000000000000010c1620282f35393a4546464646464646464646433e372e251b100500000000000000000000000000000000000000000000000000060b1012171b1f20222527292b2c2c2d2c2c2b29272522201f1b17120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b1012171b1f20222527292b2c2c2d2c2c2b29272522201f1b17120f0b060000000000000000000000000000000000000000000000000000000000000000000000000001070c1013191d20212427292a2c2c2d2c2c2b29272421201d1913100d0701060b0f151a1f212226292b2c2c2c2c2a282621211e1a140d05000000000000000000000000000000000000000000030a0f151a1e24292c2e34383a3c3e4042444445464645444443403e3b3938332d2c28231c19130d08010000000000000000000000000000000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080d0d0d0d0d0d0d0c060503000000000000000000000000000000000000000000000000000714202d3946525e686e767676767676746e64584c404b58636e737676767676766e685e5246392d2014070000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a67748186868686868686867f736d635b51493f372d241b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e01000000000000000000000000000000000000000009131c252e37404a525c606c77818e93939393939393959082796d665c544a3f382e251c130900000000000000000000000000000000000000000000000000000000000000020a11171f262a32383d44484d5354575f6265666c6f717375767778797979787877767573716f6d676662605b53524c47433c3530282018120b03000000000000000000000000000005101c26313a42494e50505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504e49423a31261c100500000008141f2a343e464d51525353535353534847433c342a20150a0000000000000000000000000008131e28323a41454752535353535353535353534f4940372c21160a0000000000000000000000000000000000000000000002080d11171c1f22272b2d2f323436373939393938373634322f2d2b27221f1c17110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d11171c1f22272b2d2f323436373939393938373634322f2d2b27221f1c17110d0802000000000000000000000000000000000000000000000000000000000000000000060b12181d1f252a2d2e313336373839393939373634312e2d2a25201d18120d11171b1f262b2e2f323537393939393735322e2d2a251f170f0500000000000000000000000000000000000000060b151a1f262b2f35393a404446494b4d4f50515252535251504f4d4b4846443f3a38342e29241e19130c0400000000000000000000000000000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e6169696969696967645c52473c47525c6366696969696969615e564c41362a1e11050000000000000000000000000000000000000000000000000000000000000000000000010d1a2733404c58646e747979797979797979736d635b51493f372d251b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d010000000000000000000000000000000000000000010a131c252e384044505b656c7881868686868686868683796d675d544a42382d261c130a01000000000000000000000000000000000000000000000000000000000000000000060b141a21272c32383b4246484e5355545b6062646668696a6b6c6c6c6c6b6a6a68666462605d555553504946413b373229241e160e07010000000000000000000000000000000a16212d38424c545a5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5a544c42382d21160a0000000d1925303b4650585d5f60606060606055534e463c31261b0f030000000000000000000000030c19242f3a444c52545e6060606060606060605f5a52493e33271b0f000000000000000000000000000000000000000001070d13191c23282b2d3337393c3f41434445464646454443413e3c3937332d2b28221c19130d070100000000000000000000000000000000000000000000000000000000000000000000000000000001070d13191c23282b2d3337393c3f41434445464646454443413e3c3937332d2b28221c19130d07010000000000000000000000000000000000000000000000000000000000020a11171d24292c3036393a3e40424445464646454442403e3a3936302c29241d191b22272b31373a3b3f42444546464544423f3b3a36312921170d0300000000000000000000000000000000020a111720262b31373a4145474a515355585a5c5d5e5f5f5f5f5e5d5c5a575553504a46443f38353029241e160d070000000000000000000000000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d0500000000000000000000000000000000000000000000000000000000000000010407070a0d10111213131211100d0b07070501000000000000000000000000000000010406070a0d0f11121213131211100e0c0908060300000000000000000000000000000000000000000000000000000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5a58524a4136404a52585a5c5c5c5c5c5c54524c443b3025190d010000000000000000000000000000000000000000000000000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c6c66635b51493f372d251b130900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b00000000000000000000000000000000000000000000010a131c2627333f49535b666c757979797979797979776d675d554b42392f261c140a01000000000000000000000000000000000000000000000000000000000000000000000003090e161b21272c31363a3c4247484a50535557595b5c5e5f5f5f5f5f5e5e5d5c5a585553514b4946443f3836302b262019130c0400000000000000000000000000000000000d1926323e49545e666969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969665e54493e3226190d000000101c2935414d5862696c6c6c6c6c6c6c625f584e43372b1f120600000000000000000000000b151e2935414c565d606b6c6c6c6c6c6c6c6c6c6c645a4f43372b1e1200000000000000000000000000000000000000040c13181e24292e34383a3f4446484b4e50515253535352514f4d4b4846443f3938332d29241e18130c0400000000000000000000000000000000000000000000000000000000000000000000000000040c13181e24292e34383a3f4446484b4e50515253535352514f4d4b4846443f3938332d29241e18130c04000000000000000000000000000000000000000000000000000000060c141c23282f35393a4146474a4d4f515252535352514f4d4a4746413a39352f2924262d33373c4347484c4f5152535352514f4c4846423b33291f1409000000000000000000000000000000060c141c232831373c42474c5154545c60626466696a6b6b6c6c6b6b6a69676462605b5453504a45413a352f281f18120b0300000000000000000000000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e080200000000000000000000000000000000000000000000000000000002080d111314171a1d1e1f201f1f1e1c1a181413110d0803000000000000000000000003080d111314171a1c1e1f1f201f1f1e1d1b181615130f0a0602000000000000000000000000000000000000000000000000000000000000000000000008141e29323b4146475050505050504e4c4741382f3840474b4d5050505050504746413b32291e1408000000000000000000000000000000000000000000000000000000000000000000000000000814202b36414a53585a60606060606060605957514940372e251b1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b2014080000000000000000000000000000000000000000000000010a1417222d38414a545b60686c6c6c6c6c6c6c6c6a605d554c433930271d140a020000000000000000000000000000000000000000000000000000000000000000000000000000040a0f161b1f252a2d31373a3b3f4446484b4d4e505152525353525151504f4d4b494745403c3937332d2a251e1b150d08020000000000000000000000000000000000000f1c2935424e5a6670767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767670665a4e4235291c0f000000121f2b3844515d697479797979797979766a5f53473a2e2115080000000000000000000007121d27303945525d686d78797979797979797979766c5f5346392d2013000000000000000000000000000000000001070d161d24293035383f444649505355585a5c5e5f5f605f5f5e5c5a585553504946443f38353029241d160d080200000000000000000000000000000000000000000000000000000000000000000001070d161d24293035383f444649505355585a5c5e5f5f605f5f5e5c5a585553504946443f38353029241d160d0802000000000000000000000000000000000000000000000000070f181e262e34394045474c5254575a5c5d5f5f605f5f5e5c5a5754524c47454039352f2f383f44464e5355595c5e5f5f5f5f5d5b5954534d453b31251a0e0200000000000000000000000000070f181e262e343c43474d53555d6064666d6f71737577777879797877777673716e6c6663605c54524c45413a3128231d150c040000000000000000000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d0500000000000000000000000000000000000000000000000003090e13191d202124272a2b2c2c2c2c2b29272421201d1913100c0600000000000000060b0f13191d20212426292a2b2c2c2c2b2b29272522211f1b15120e0903000000000000000000000000000000000000000000000000000000000000000000020d1720293036393b43434343434341403c362f262e353b3f404343434343433b3936302920170d0200000000000000000000000000000000000000000000000000000000000000000000000000030f1a252f3841484c4e53535353535353534c4b4640372e251c1309010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f030000000000000000000000000000000000000000000000000006111b262f38424a50535b60606060606060605d54514c433a31271e150b020000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f141a1e21262b2e2d3338393c3e40424344454646464545444342403e3c3a39352f2d2b27221b19140f0a040000000000000000000000000000000000000000101d293643505c6976828383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838276695c504336291d10000000131f2c3946525f6c79868686868686867c6f6255483c2f221509000000000000000000000c18232e39424f59606d7a85868686868686868686796c605346392d201300000000000000000000000000000000040c13181f282f353a41454a5053535b60626567696a6c6c6c6c6b6a69676562605b5353504a45413a352f281f19130c0400000000000000000000000000000000000000000000000000000000000000040c13181f282f353a41454a5053535b60626567696a6c6c6c6c6b6a69676562605b5353504a45413a352f281f19130c0400000000000000000000000000000000000000000000071019212a30383f444b5153565e616466696a6b6c6c6c6c6a696764615e5653514b45413a3c41495053585f6265686a6c6c6c6c6a6865615e574d42362a1e1205000000000000000000000000081019212a30383f444e53575f62676d7175797c7e8082838485858685848382807e7b7974706d66605d56524c433d342e271e160e050000000000000000000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e0600000000000000000000000000000000000000000000060e141a1e24292c2d3134363738393938383634312e2d29251f1c17110a03000000020a11171b1f24292c2d313335373839393938383634322f2e2b26211e1a150e09030000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e3636363636363433302b241d242a2f32333636363636362e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000000000000000000008131d262f363c40414646464646464646403e3b352e251c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d13080000000000000000000000000000000000000000000000000000000a141d262f383f44464e5353535353535353504745413a31281f150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12151a1e2122282b2d2f313335363738393939393837373533312f2d2c2924201f1b17110e08020000000000000000000000000000000000000000000013202d394653606c79868f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f86796c605346392d2013000000131f2c3946525f6c79859293939393887b6f6255483c2f22150900000000000000000005101c2834404b54606b74818e979393939393939386796c605346392d2013000000000000000000000000000000070d161d2429313a40454c52545c6063656c6f727476777879797978777674716f6c6563605b54524c45413a3129241e160e070000000000000000000000000000000000000000000000000000000000070d161d2429313a40454c52545c6063656c6f727476777879797978777674716f6c6563605b54524c45413a3129241e160e070000000000000000000000000000000000000000071019232b333b424a50555d6065686d717375777879797978777573716d6865605d55524c44464e535b60646a6e727577787979787775726e695e53463a2d211407000000000000000000000008111a222b333c424a50585f62696e747a7e8185888b8d8f90919292929291908f8d8a8885817d79736d68605d564f454039302820160e050000000000000000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f070000000000000000000000000000000000000000060f181f262b3035393a3d404344454646454443403e3a3935302c28231c150c0802070b141b22272b2f35393a3d40424445454646454443413f3c3b37322e2b26201a150e060000000000000000000000000000000000000000000000000000000000000000050d14191e20212929292929292726241f1a13191f23262729292929292921201e19140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000010b141d252b303334393939393939393933322f2a231c130a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b01000000000000000000000000000000000000000000000000000000020b141d262d333839424646464646464646443a39352f281f160d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205090e1214171c1f2022242628292b2c2c2c2c2c2b2b2a2927252220201d1813120f0b060000000000000000000000000000000000000000000000000013202d394653606c7986939c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9386796c605346392d2013000000131f2c3946525f6c7985929f9f9f95887b6f6255483c2f2215090000000000000000050e1b242c3845515c666f7c88939fa99f9f9f9f9f9386796c605346392d201300000000000000000000000000000810191f282f353e434b51565d60666d7074787b7e81838485868686858482807e7b7874706c66605d56514b433e353028201910080000000000000000000000000000000000000000000000000000000810191f282f353e434b51565d60666d7074787b7e81838485868686858482807e7b7874706c66605d56514b433e35302820191008000000000000000000000000000000000000050e19222b353d454d545c60676d72767a7e80828485858686858482807d7a76726d67605d565050585f656c71767b7f82848586868584827f7b6e6154483b2e2115080000000000000000000007111a232b343d454d545c606a6e757b81868a8e929897999c9d9e9e9f9f9e9e9d9c9a9797928e8985807a736d686059514b423a322820170e05000000000000000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a211910070000000000000000000000000000000000020a1117212a31373a4145474a4d505152535252514f4d4b4746413a38342e261e19130d12181d262d33373a4145474a4d4f51525253525251504e4b4947433c3a37312b2620180f06000000000000000000000000000000000000000000000000000000000000000002080d1114141d1d1d1d1d1d1b1a17140e080e1317191a1d1d1d1d1d1d1414110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b020000000000000000000000000000000000000000000000000000000000020b141c22282b2d353939393939393939372d2c29241e160d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206060b0f121315181a1b1d1e1f1f20201f1e1e1d1c1a18161413110d07050300000000000000000000000000000000000000000000000000000013202d394653606c7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9386796c605346392d2013000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000000000000020c16202b37424d57606d7983919aa4afacacacac9f9386796c605346392d20130000000000000000000000000009111a222b313a41454f555d60686d73797d8185888b8d8f919292939292918f8d8b8885817d78726d68605d555046413a322b221a11090000000000000000000000000000000000000000000000000009111a222b313a41454f555d60686d73797d8185888b8d8f919292939292918f8d8b8885817d78726d68605d555046413a322b221a110900000000000000000000000000000000020d17202b343d474f575f666d72797e83878a8d8f909292939292918f8d8a86837e79736d68605b5a626a6e787d83888c8f9192929292908e8c8275685b4f4235281c0f000000000000000000050f19232b353d464e575f666d727c81878e92999b9fa2aaa6a8aaa9a8a7a7a8a9aaa9a6a9a29e9a97928d85807a706b605c544c443a322920170c0300000000000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b22191007000000000000000000000000000000020b141b2227333c42464c5254575a5d5e5f5f5f5f5e5c5a5754524c46443f38302a251e171d24292f383f44464c515457595c5d5e5f5f5f5e5e5c5a5855534e4847423c37312a2117110a020000000000000000000000000000000000000000000000000000000000000000010507081010101010100e0d0b08030002070a0c0d1010101010100807050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080f14181a1b2020202020202020191916120d07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f080100000000000000000000000000000000000000000000000000000000000000020a11171c1f20282d2d2d2d2d2d2d2d2a21201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030606090b0d0f101112131313121211100f0d0b090706040100000000000000000000000000000000000000000000000000000000000013202d394653606c798693939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939386796c605346392d2013000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000000000008131e28323a47535f69737f8c95a0acb6b8b9beac9f9386796c605346392d201300000000000000000000000009121b232c343d434b515961676d737a7f848a8e92979899969494989298949496999897918e89847f7a736d67615a524c443d342c231b1209000000000000000000000000000000000000000000000009121b232c343d434b515961676d737a7f848a8e92979899969494989298949496999897918e89847f7a736d67615a524c443d342c231b120900000000000000000000000000000008141e29323d464f5960696e787f858b90939a999c9d9e9f9f9f9f9d9c9a9992908b85807a726c65636c717c838a9095989b9d9f9f9f9f9d9b8e8275685b4f4235281c0f0000000000000000030d17212b353d474f5860696e787f868e93999fa3ababaca8a9a29e9d9b9b9a9b9c9d9fa3aaa9aba9a19e98928c857d736d665d564c443a32291e150a000000000000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000000000000000a141d262d333f454d53565d606467696a6b6c6c6b6b696764615e5653504a423e36302920272f353e41495053555d606466686a6b6c6c6c6b6b696765625f5855534e47423c3328221c140b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003080b0d0e13131313131313130d0c0a0602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b08030000000000000000000000000000000000000000000000000000000000000000000000060b0f12131b20202020202020201d1413110d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c605346392d2013000000131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000000030d1925303a44505a616e7b86929fa7afacabadb3ac9f9386796c605346392d2013000000000000000000000009121b242d353e464e555d606c707980868c91969a97918e8c8988878685868788898c8f91979a96918c868079706c615d564e463e352d241b120900000000000000000000000000000000000000000009121b242d353e464e555d606c707980868c91969a97918e8c8988878685868788898c8f91979a96918c868079706c615d564e463e352d241b120900000000000000000000000000020e1925303b444e58606b6f7b838b92979c9fa4a9a19e9c9a9a999a9c9ea1a39f9c97928d857e776e6d737e8690959d9fa7a8aba49f9f9f9f9b8e8275685b4f4235281c0f00000000000000010b151f29333d474f59606a6f7b838c92999fa4abadaaa29f9b979792908f8e8e8e8f909298989d9fa7acaaa29f97918880786d685e564c443a30261c1106000000000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c0300000000000000000000000006111b262f383f4451575f61686d7073767778797978777673716d6864605c545046413a322a313940454f535b6064676d707375777878797978777674726f6a67625f57534d453f332d261d140b0200000000000000000000000000000000000002080d10121313131313131313131313131313131313131313131313121211100e0b09070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060f131313131313131311070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090c0f111213131211100e0c0a07060401000000000000000000000000000000000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979766c5f5346392d2013000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000000010b151f2a36414c56626c76828f98a3aca49f9ea1a9b39f9386796c605346392d20130000000000000000000007111b242d363e474f5860676d747d848c929897928d8985827f7d7b7a7979797a7b7d7f8285898d929798928c857d756d6860584f473f362d241b11070000000000000000000000000000000000000007111b242d363e474f5860676d747d848c929897928d8985827f7d7b7a7979797a7b7d7f8285898d929798928c857d756d6860584f473f362d241b110700000000000000000000000005111e2a36414c56606a6f7d8590959ea1a9a29e9997928f8e8d8d8d8f9197999ea1a29f97928b827a747f8b92989fa7a9a19e999993929292998e8275685b4f4235281c0f0000000000000007121d27313b454f59606b707c8590959fa3abaea9a19e98928e8a87858382818181828386888b90959b9fa4aca9a19a938d837a6d685e564c42382e23170d0400000000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b0000000000000000000000000b17222d384149505b62696e747a7d808384858685858482807e7a76716d66615a524c443b333a434b515961656c71757a7d80828485858685858483817e7c78746e6a625f5751443f382f261d140a0000000000000000000000000000000000060d14191c1f1f202020202020202020202020202020202020202020201f1e1e1c1a18161413100c070501000000000000000000000000000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c080300000000000000000000000000000000000000000000000000000000000000000001040707090c0e101111121313121211100f0d0b0907060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f131516191c1e1f1f201f1e1d1b19161413110d0801000000000000000000000000000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e12000000131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000007121d27313946525e68717e8b949faaa49a939297a1ad9f9386796c605346392d2013000000000000000000060f19232d363e485059616a6f79818a919797918b85817c797572706e6d6d666d6d6e707275797c81858b919697918a817a6f6a615951483f362d23190f060000000000000000000000000000000000060f19232d363e485059616a6f79818a919797918b85817c797572706e6d6d666d6d6e707275797c81858b919697918a817a6f6a615951483f362d23190f0600000000000000000000000714202d3946525e686f7c869297a0a7a49d97928c888582818080808285888c91969ea1a29f948f84818c919fa3aaa39f97928d898685858687898275685b4f4235281c0f000000000000000c18242f39434d57606b707d8692979fa7aeaba39f96918b86817e7b7876757474757677797c7f83888e939a9fa7aca49f9590837a6d685e544a3f34281f160c0100000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d120700000000000000000000030f1b27333f49535b606d727b81868a8d909192929292918f8d8a86837e78716c615e564d453c444c555d606c70787d82868a8c8f909192929291918f8d8b8884807b756e69625b504a42382f261b11060000000000000000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a29272523201f1c1813110d08020000000000000000000000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f0901000000000000000000000000000000000000000000000000000000000206080d11131416181a1c1e1e1f1f201f1f1e1d1b1a18161312100b060603000000000000000000000000000000000000000000000000000000000000000000000000060a0e1011131313131313100f0d0a05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c10151b1f222226292a2b2c2c2b2b2a28252321201d19130c0400000000000000000000000000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5a52493e33271b0f000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000000020b18232f39434f59616d7a85929ea6a99f938785929eab9f9386796c605346392d20130000000000000000030c18212b353e48505a626b707c848e9398928c857f7974706c6666636161605c6061616366666c7074797f848b9298938e857c706b625b51483e352b21180c03000000000000000000000000000000030c18212b353e48505a626b707c848e9398928c857f7974706c6666636161605c6061616366666c7074797f848b9298938e857c706b625b51483e352b21180c0300000000000000000007131f2c38444f59616e7a859198a2a9a39f928d85807b78757473737475787b7f848b91969ea59f96918d929ca4a9a199928c85807c797878797a7d7e7164574a3e3124170b00000000000004101d2935404b555e69707d879298a2a9b1a8a099928c847f7a75716e696a6868676869666d6f72767b818790959da4afa79f9590837a6d665c50443e31281d13070000000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c030000000000000000040f19232b3744505b656c747f868d92989a9c9d9e9f9f9e9e9c9a9992908a847e756d685f574e464c565d676d747d838a8f9299999b9d9e9f9f9f9e9e9c9a9896918d87817b726d605b544a41382d22170b040000000000000000000000000006101a222a30353839393939393939393939393939393939393939393939393838373634322f2d2c2923201d19130f0a0300000000000000000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b0300000000000000000000000000000000000000000000000000040a0f1214191d2021232527292a2b2c2c2c2c2b2b2a28272522201f1c1715120f0a050200000000000000000000000000000000000000000000000000000000000000040b11161a1d1e2020202020201d1c1916100a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181d1f272b2e2f3235373839393837363532302d2c29241e160d04000000000000000000000000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534f4940372c21160a000000131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000a141d2934404b55606b74818e97a1ada1978e8183909da99f9386796c605346392d201300000000000000000b151e2a333d47505a626c717d8691969490867f79726d6763605b54565554535053545556545b6063676d72797f858f949791867d726d625a50473d332a1e150a0000000000000000000000000000000b151e2a333d47505a626c717d8691969490867f79726d6763605b54565554535053545556545b6063676d72797f858f949791867d726d625a50473d332a1e150a0000000000000000000915222f3b4854606b75818e97a1aaa399928a8079736e69696767666769696e73797f848e939fa3a19e9a9da4a8a09691877f79736f6d67666c6e70716c6155493c3023170a000000000005101a232c3945515d676e7b859299a2aab1a79f9691878079726d6764615e575c5b5b5b545c6062656a6e747c838d929fa3aba7a0959082786d60594f433a2f24180d02000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b40342820150900000000000000000b16212c38444f59606c77818b92999fa2aaa9a8a09e9c9b9c9d9fa29f9c96918a827a6e695f584e555d686d79818a90959c9fa3aba39f9e9c9b9c9d9ea1a9a8a19e99938e867f746c665b53493f332720150a000000000000000000000000020d18222c343b4144464646464646464646464646464646464646464646464645454443413e3c3a38342f2d29241e1a150f0a0400000000000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b0100000000000000000000000000000000000000000000070c10151a1f2124292c2d303234363738383939393838373533322f2d2b2823211f1b15120e090300000000000000000000000000000000000000000000000000000000050d151c2227292a2d2d2d2d2d2d292926211c150d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d151d24292c32373b3c3f4244454646454443413f3d3a39352f281f160c0100000000000000000000000000000000000000000000000005101b252e373e4346464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646433e372e251b1005000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000006111b262f3845515c67707d89939ea9a69e91857a84919daa9f9386796c605346392d20130000000000000007121d27303c454f59626c717e879298938c827b726d67605c5553504a4d505152535352514e4a5053555c60676d727b828b929892877f726c61594f453c30261c11060000000000000000000000000007121d27303c454f59626c717e879298938c827b726d67605c5553504a4a484746444647484a4a5053555c60676d727b828b929892877f726c61594f453c30261c11060000000000000005111d2a36414c56636f7c89939ea9a59f92877e746d67625f575b5a5a5a575f62666d7279818c9299a3aba7a9aca09691847c736d6762605c5b60616364615a5045392d21140800000000000b16212b37434e58606d79839097a1abb1a79f9590847c736d67605d5554524d4f4e4e4e4a505355585f626a6f78808a9299a3aba79f948d80736b61554b4035291f140900000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000003101b27323b4854606b73808c939fa3aba9a19e9896918f8f8f909297989d9f9e938f847b6e6a5f565d676d7a838e939da0a7a59e9b999291908f8f909297979c9fa6a49f98928b81786c655b50443c32261b0f05000000000000000000000008141f2a343e464d5152535353535353535353535353535353535353535353535251514f4d4b494745403a3935302b26201b150c0700000000000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d13090000000000000000000000000000000000000000070c12181c1f262b2e2f35393a3c3f414344444546464545444342403e3c3a38342e2e2b26211e1a140f0a0400000000000000000000000000000000000000000000000000040d171f272e3336373939393939393635322d261f160d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a10191f272f35383c4347494c4f515252535251504e4c494745413a31281e13080000000000000000000000000000000000000000000000000009131c252c33373939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393937332c251c130900000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000b17222d38414e58606d7984919ea5aa9e948a7e7885919eab9f9386796c605346392d2013000000000000000c18232e39434d57606b717e8b929992887f786e69605d55514b5153575a5c5e5f5f5f5f5d5b5854524d51555c60696e767f879298928b7e716b60574e42382e23170c030000000000000000000000000c18232e39434d57606b717e8b929992887f786e69605d55514b514f4b443b3a3a383a3a3b3d3f44464b51555c60696e767f879298928b7e716b60574e42382e23170c030000000000000713202d3946525e6875828f9ca5ab9e938b7e716c605d55534d4e4d4d4d4d53545c60676d757f87929facb4b7aa9e91847b6f6a605d55535150535456575550483e33281c11050000000004101c27333a47535f6a74808d95a0a9b2a89f9590837a6f6a605c55514b484642424141423f4446494e53585f666d737e879299a4afa69f93887d70675d51453b30251a0e0200000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b0000000000000713202c38444f5963707d88939fa5aea69f97918c87848382828385888b90959d9e9691857c6e685e606d798390959da5a8a09d938f8a86848382828385878b8f949da0a7a29f938e81776c60584e43372b21160b00000000000000000000000d1925303b4650585d5f6060606060606060606060606060606060606060605f5f5e5d5c5a585653514b4746413a37312b262018120b03000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f030000000000000000000000000000000000030b12181c23282c31373a3b414547494b4d4f5151525253525251504e4d4b4946443f3c3a37312d2a251f1b160f0a0400000000000000000000000000000000000000000000000b151f2931393f424446464646464643423e3831281f150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b131c222b31394045474e5455595c5d5e5f5f5e5e5d5b585654514c433a2f24190d01000000000000000000000000000000000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a0100000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000040f1b27333f49535f6a73808c96a0aca2988f82757985929fac9f9386796c605346392d201300000000000004101c2834404b555f69707d87929892877e726c665f57514d53555c606467696b6c6c6c6b6a6865615e57544f51575e616d727d86929792877d706a5f544a3f3428201509000000000000000000000004101c2834404b555f69707d87929892877e726c665f57606060605e5c564e44392d2c2d2e323f49515759606060575e616d727d86929792877d706a5f544a3f34282015090000000000000714212e3a4754616d7a86929faca3998e81756d625a514b47424140404142474b51555e69707c86929facb8b0a3968a7d70696058514b46454446474a4a49453e362c22170c00000000000714202c38444f59626e7c87929fa7b1aaa1969083796d685f58514b45413b3a363035342e34383a3c43474e545c606c717e87939fa5afa49a9185796d60574d42362a1e11050000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c100400000000000916222f3b4854606b7683909aa4afa89f948f847f7a7776757676787b7f838990959c9791847a6d666c75818f959fa7a79f959189827e7a7776757676787b7e828990959ea5a59d938c7f736a5f53473d33271c100400000000000000000003101c2935414d5862696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6b6a69676562605c5554524c47433c373228231d150c0700000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b20140800000000000000000000000000000001070c151d23282e34383c4347484c525456585a5c5d5e5f5f5f5f5e5e5d5b5a585553504a4847433c3a36312b27201b150d0802000000000000000000000000000000000000000006111c27313b434a4f51535353535353504e49423a31261c1005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b141c252e343d434b515358606265686a6b6c6c6b6a69686563605d554c4135291d110400000000000000000000000000000000000000000000000000010910161b1e202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201e1b161009010000000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150900040d1a232b3744505b656f7c87929fa8a79f92867b6e7986939fac9f9386796c605346392d20130000000000050f1a232c3845515c676e7b85929992867d716c605b544d51575f61676d70737677787979787775726e69636059524d525b626b707c85929892857c6e665c50443c31261a0f04000000000000000000050f1a232c3845515c676e7b85929992867d716c605b63666c6c6c6c6b6760564b3f331f25303b44515b62656c6c6c6c6c67646b707c85929892857c6e665c50443c31261a0f0400000000000b1825313e4b5864717e8b99a3ac9f92867b6e625a504540393731343331373c45515c676e7b859299a3aeabaea99c9083786c60564c413a3838393b3d3e3c39332c241a100500000000000916232f3c4855616b76828f99a3afaea39891847a6d675e564e454039352f2d2a25282823282c2d31373c424a505a616c727f8b939ea8aca1978c8073695e52463a2d2014070000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a00000000000a1623303d495663707c89949facaca0958f827a726d686968696a696e72767d838c929f968f82786d717e8b939ea7a79f9590837d75716d676968696a696e71767d838e939ea5a59f92877c6f62594f44382c20140700000000000000000005121f2b3844515d697479797979797979797979797979797979797979797979797878777674716f6d6764615d56534e47433c342e271e191008000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c0000000000000000000000000000030b12181e272e34394044464e5355565d60636567696a6b6b6c6c6c6b6b6a68666562605c5455534e4846423b37322b262019130c04000000000000000000000000000000000000000a16222e39434d555b5d6060606060605c5a544c42382d21160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131c262e3740464f555d60656a6f7275777879797877767472706d675d5145392c201306000000000000000000000000000000000000000000000000000000050a0f1213131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313120f0a0500000000000000131f2c3946525f6c7985929faca295887b6f6255483c2f221509010c161f2a36414c56606c77839099a3aba0958c7f726d7a879aa4af9f9386796c605346392d201300000000000b16212b37434e58606d7983919792877d706b615a504d555c60696e74797d8082848586868584817f7b76706b605d564e5159606a6f7c8692979083786d60584e43372b21160a0000000000000000000b16212b37434e58606d7983919792877d706b615a636d72797979797772675c4f43372a2a36414d56626d727979797979746e646a6f7c8692979083786d60584e43372b21160a00000000000e1b2834414e5b6774818e9aaba99c8f8276695f53483f352f2b262727313c46515b606d79839097a1aaa29fa2aa9f948b7e71685e52463c322b2d2e3031302d28221a1208000000000005121e2a36424d5763707d89949fabb2a89f92867c6f685e554c443c342e2924201e1a1b1b171c1f20262b30383f44505a626d75818e96a0aca79f92867b6e6154473b2e21140800000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f0000000004101d2935404b556774808d9aa6b0a99d91837a6d68615e565c5c575f61656b7078808b9399948c7f737a85929fa5aba095908279706b64605d555c5c565e61646b7079818e939ea8a3999083776b6054483c2f22160900000000000000000006131f2c3946525f6c79868686868686868686868686868686868686868686868685848482807e7c7975716d68625f58534e454039302a221a11090000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e00000000000000000000000000040d151d2329303940454a5153585f6266686d6f7274767777787979787877767573716f6d6666625f5854534d47433d373129241e160e060000000000000000000000000000000000010e1a27333f4a555f676a6c6c6c6c6c6c69665e54493e3226190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101b252e384049515960676d71777c7f8284858586858483817f7d796d6054473a2d21140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150907121d28313946525e68727e8b949faba3999083786d6e7a8794a1b69f9386796c605346392d20130000000004101c27333a47535f6a73808c95928b7f726b6159504d575e676d737b81858a8d8f9192929292908e8b87827d756d685f584e4f58606a707e8793958c7f726a5f53473d32271b0f040000000000000004101c27333a47535f6a73808c95928b7f726b61595966727f8686868684776b5e51443826303846525e68727f8686868686817467606a707e8793958c7f726a5f53473d32271b0f0400000000101d2a3743505d6a7683909da9a5988c7f7265574d423629241d1a242f39434e58626d74818e959fa9a29892989fa69e92857a6d61584e43372b2021232423211c1710080000000000000714212d3a46535e6975828f9ca6b0aca0968c7f736a60564c433a3228231d1814120e09060c1012131a1e262e343e48515b606d7984919ea09d95908a807366594d4033261a0d00000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000006131f2c3945515d677784909daaada1978a7d70675e56524c4f4f4d53555960666d737e87939f92867b7f8c97a2ada39990837a6d67605954514c4f4f4d52545960676d78818f96a0a49f95897d7063564a3d3023170a00000000000000000006131f2c3946525f6c7985929393939393939393939393939393939393939399929291908f8d8b8985827e7a756f6a625f58514b433c342c231b120900000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e000000000000000000000000050e161f272f343d434b51545c60646a6e72767a7c7e808284848585868585848381807e7c7976736f6a66615e57544e47433c3530282017110a0200000000000000000000000000000003101d2936424f5b6771777979797979797670665a4e4235291c0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c19222d37404a525b636b6f797e84888c8f909192929191908e8b897f7266594c3f3326190c0000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c0803000000000000000000000000000000000000000000000000000000000406070b0e11121313131313130c0c0a0602000000000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215090b18242f39434f59616e7a85929fa6a89f92877c6f666e7b8894a1ac9f9386796c605346392d2013000000000714202c38444f59626f7c8792968e81746d62594f4d575e696e7980868d92989a9c9b999898999b9b9a938f89827a6f6a5f574d4e58616c737f8c9592867c6e62594f43382c20150a000000000000000714202c38444f59626f7c8792968e81746d62594f5966727f8c93939184776b5e5144382e38424f59616e7b8692939391857a6d6058616c737f8c9592867c6e62594f43382c20150a00000000121f2b3845525e6b7885919eaba295897c6f6256493c31231817202935404b555f6a727f8b939da7a298928590949fa1978e81746a5f53473c32261b17171714110c05000000000000000815212e3b4854616e7b87939facb2a89d9184796d60584e443a31292018120d0705020000000306090c151c2328363f45515d676f7d899395908a837e776c605346392d2013060000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c0000000714202d3a4753606d7a86939facab9e9285786c60554c464142434246484f545c606c727f8b9398908385929ea9ab9f92877c6f685d554f47454142434246474f555d666d7984919b9a93908c8276695c4f4336291c1003000000000000000006131f2c3946525f6c7985929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9e9e9d9c9a9898928f8b86817c756f6a605c554e463e352d241b1209000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c302316090000000000000000000000050f172028313940454f555c60666d71777b7f8386898b8d8f9091929292929191908e8d8b8885827f7c77736e69626058534e46413a3228221c140b03000000000000000000000000000004111e2a3744515d6a77838686868686868276695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e2b343f49525c646d737c848b9095989b9d9e9f9f9e9d9c9b988c7f7266594c3f3326190c000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f0901000000000000000000000000000000000000000000000001070c101314171b1e1f202020202020191816120d070000000000131f2c3946525f6c7985929faca295887b6f6255483c2f22150a141d2935404b55616b75818e97a2aca1968d80746a626f7b8895a2ac9f9386796c605346392d2013000000000916232f3c4855606b768390999184796d605b514b555e696e7b838d92999f9c96918e8c8b8b8c8e92979e9c938f847c6f695f564c505a606d788390988f82766b6054483d32271b0f000000000000000916232f3c4855606b768390999184796d605b514c5966727f8c999e9184776b5e514438343f4a54606b75818e989e948a7e71685d525a606d788390988f82766b6054483d32271b0f00000000131f2c3946525f6c7985929faca194887b6e6155483b2e22151f29333b45515d676f7c86929fa5a49a92867b829099a39f93877c6f62584e43372b20150a0a0805000000000000000005121e2a36424d576673808d99a4afaca0968a7e71665c51463c32281f170e0700000000000000000000030a1117242935414b55606b75818e8a837d78706c655b5044372b1f1205000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000815212e3b4854616e7b879aa4afa89b8f8275655b50433a363031363a3d424a515a626d75818e9794909297a1ada3998d80736a5f564c433d39352f30363a3d434b545d67707d8a8e8b87837f7c6f6255493c2f22160900000000000000000006131f2c3946525f6c7985929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a7aaa9a7aaa29f9b99928e87827c736d675f584f473f362d241b10070000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f22150900000000000000000000050e172129323a434b515960676d72797e83888c909399989a9c9d9e9e9f9f9f9e9e9d9b999898928f8c8884807b756f6a625f58524c443d332d261d150c040000000000000000000000000004111e2a3744515d6a778490939393938f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303d46515b646e737f8791969da0a7a8aaa8a4a2a0a0a0a1998c7f7266594c3f3326190c00000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b03000000000000000000000000000000000000000000060b12181c1f2024282a2b2c2d2d2d2d2d2625221e18120a01000000131f2c3946525f6c7985929faca295887b6f6255483c2f2215111c262f3845515d67707d8a939ea9a59e9184796d60626f7c8895a2ac9f9386796c605346392d201300000007131f2c38434f5963707d899593897d70675d5145515d676e7b8490959f9f948f898481807e7e7f82858a91969e9691857b6e685d5245505c666f7c879294897c6f63584e43372b1c1106000000000007131f2c38434f5963707d899593897d70675d51494c5966727f8c999e9184776b5e5144383844505c666f7d89939e988f82756c61564c505c666f7c879294897c6f63584e43372b1c110600000013202c3946535f6c7986929faca093877a6d6054473a2d211a25303b45505a606d79839199a3a59f93887e707c87929fa49a8f82756a5f53473c32261b0f01000000000000000000000714212d3a46535f697784919eabb5ab9d9184786c60544b40342b20160d0500000000000000000000000000061218242f3a434f59616e7b837e78716c65605b53493f33271b0f0300000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f130600000916222f3c4955626f7c8895acb6a79a8d81746753493f312a25262a2d30394044515b616d7a85929f9c9ea1a9ac9f92867a6d61584e433a312c2924252a2d3139424b55606c7783827e7a76736f6a6054473b2e22150800000000000000000006131f2c3946525f6c7985929facb8ada39c9898989898989898989898989898999a9b9d9fa3aaaaacaba39f9a938f8780796f6a615950483f362d22190f05000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f1307000000000000000000030d172029333b444c555c606b6f797f848b9095999c9fa4aba7a9a9a8a7a6a6a7a7a8a9a8a6aaa29f9c9995918c87817c766f6a615d564f443f382f271e160d0400000000000000000000000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424e58626d73808c9299a0a8acaaa39f9b979594939394958c7f7266594c3f3326190c000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b01000000000000000000000000000000000000020a11171d23292c2d3134373839393939393933322f2a231c130a000000131f2c3946525f6c7985929faca295887b6f6255483c2f221517222d38424e58606d7984919ea5a99e938a7d70675d626f7c8995a2ac9f9386796c605346392d20130000000915222f3b4854606b7683909a8e81756b60554b4e58606d798390969f99928b827c78747372727375797e848e939d9791847a6d605a504a545f6a74808d988f82766a605447382e23170c00000000000915222f3b4854606b7683909a8e81756b60554b414c5966727f8c999e9184776b5e514436414c56606d7883909d9f92867b6e615a50444a545f6a74808d988f82766a605447382e23170c000000121f2c3945525f6c7885929faba194877a6e6154473b2e21202a36424d57616c74818e95a0a89e938c7f736c74808d97a29f93877c6f62584e43372b1e1308000000000000000000000815222e3b4855616e7b8896a0acafa3998c7f72665b5042392e22190e0500000000000000000000000000000007131d28313d46535f696e77716c65605b53504941382d22170b0000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d2013080000091623303c4956636f7c8996a2afa69a8d8073675a4d403025191a1e21272e343f46525e6873808c99a3abadb3a89c8f8275685e52463c3128201d19191e2027303944505b656c7675716d68666260584e43372b1f130600000000000000000006131f2c3946525f6c7985929facb8a79c918c8b8b8b8b8b8b8b8b8b8b8b8b8b8c8d8e909298999da0a7aaaca49f99928d837c706b625a50483e342b21170d0300000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f030000000000000000010b151f29333b454d565d676d747c848c91969da0a7a9aca8a9a19e9c9b9a9a999a9a9b9d9fa2a9a6aaa9a7a09d99928e89827c746d686059504a423930281f160c01000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54606a727f8b929fa3abaca49f98928e8b8887868687898b7f7266594c3f3326190c00000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d13090000000000000000000000000000000000030b141b22272f34383a3e4144454646464646463f3e3a352e251c12070000131f2c3946525f6c7985929faca295887b6f6255483c2f22151c28333f4a545f6a73808d96a1aca2978e81756b6155626f7c8995a2ac9f9386796c605346392d2013000004101c2934404b55636f7c899493877c6f62594f4754606a74808d95a09892877e766f6c6566656566666d7179818e939d968e81756c61554b4e58616e7b869294897c6f62544a3f34281c100300000004101c2934404b55636f7c899493877c6f62594f433f4c5966727f8c999e9184776b5e51443846525e68727f8b959f958b7f72695e53483e424e58616e7b869294897c6f62544a3f34281c10030000111e2b3844515e6b7784919eaaa295887c6f6255493c2f2428323a46525e69707e8a939da8a0958e81776c606d7a85929fa49a8f82756a5f53473a2f24190d010000000000000000000c1825323f4b5865727e8b98a8b2ac9f92867a6e61544a3f30271d100700000000000000000000000000000000010c161f2a36424d575f616a64605b535049443f382f261b11060000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d01000916222f3c4955626f7c8895aab4a79b8e817468564c41362a24201d191c232a36414c56616e7a86929facb9b3a9978a7e7164564c41342a1f161d1d1d1d151e27333f49535b606a6864615e5655544e463c32271b0f0300000000000000000006131f2c3946525f6c7985929facb2a5988c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818386888c91959c9ea6acaba39f9591867d716c625a50463d33291f140900000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a00000000000000000007121d27313b454d575e686d79808791959ea1a8acaaa29f9b979791908e8d8d8d8d8e8f909297979a9ea0a8ababa39f9b948f87817a706b605b544b433a31281d1307000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040707121f2c3844505c666f7c87929fa4afaaa39a938d86817e7b7a797a7a7c7e7d6f6356493c302316090000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f03000000000000000000000000000000030c151d262d33394045474a4e51525353535353534c4b463f372e23180d0200131f2c3946525f6c7985929faca295887b6f6255483c2f221a242b3844505b666f7c87929fa8a69f92857a6e615956626f7c8995a2ac9f9386796c605346392d2013000006131f2c3845515c6775818e9b8f82756a5f53474d57626f7c87939f9f92867d716c62605b535858545c60676d77818e959e938a7e71675d5146525e6974818d9a8e8174665c5044382c1f120600000006131f2c3845515c6775818e9b8f82756a5f53473d3f4c5966727f8c999e9184776b5e5144424e58616d7a85929f999083786c60574d42363c46525e6974818d9a8e8174665c5044382c1f12060000101d293643505c6976838f9ca9a4978b7e7164564c413529303a44505a616e7b85929ea5a3989183796d655d6873808d98a39f93877c6f62564c4135291d1104000000000000000004101d2935404b556875828f9ba8b5a99c908376685e5242382d1e150b000000000000000000000000000000000000040d1a26313b454d53555d57535049443f38332d261d140a00000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d1104000814212e3b4754616e7a8798a2aeaa9d908377685e52463c352f2c2924272625303a46525e6876828f9ca9b6ada197877b6e6154483b302a2a2a2a2a2a2a2a2a222d38414950535d5b5854524c4947433c342b20150a0000000000000000000006131f2c3946525f6c7985929facada093877a7272727272727272727272727273737477797c8084898f949da0a7afa7a09892877e716c61584e453b30251a0d040000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f040000000000000000040e18242f39434d575e696e7a828d9399a0a8ada8a19e98928e8a878583818180808081828385878a8d9196999ea1a9aca69f99928d847d736c665c554b433a2f24180d010000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000000000000000000000206080d1113141d2935404b55606d78839099a3aeaba3989288817a75716f6d6d6d6e6f716f6b6054483b2f22150900000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b2014080000000000000000000000000000000b151e272f383f444b5153575b5d5e5f6060606060595751493f352a1e120600131f2c3946525f6c7985929faca295887b6f6255483c2f221f2a36424d57606c78839099a3ab9f948b7e71685e5256626f7c8995a2ac9f9386796c605346392d201300000714202d3a4753606d79859296897c6f63584e46535f6975828f9a9f948b7f726b615a5350494b4b4b51555d656d78839099999184796d6053474d56616e7b88959285796d6053463a2d2013070000000714202d3a4753606d79859296897c6f63584e43353f4c5966727f8c999e9184776b5e513f4a54606a74818e979f92877c6f665b50453b3136424d56616e7b88959285796d6053463a2d20130700000d1a2633404d596673808c99a9a79b8e8174685d52453b3136414c56616c75828f97a2a59f92867c6f675d56616e7a86929fa49a8e8174685d5245392c20150a000000000000000006131f2c3845515d677884919eabb6ac998c7f7266564c412f261c0c030000000000000000000000000000000000000009141f29333b424648504a46443f38332d27221b140b020000000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000714202d3a46525e697885929fabac9f92867a6e61584e45403a39352f3433333236414c566673808c99a6b3ab9e928578695e53463a3737373737373737373737372f383f4446504f4b4746413c3b37322b2620180f0600000000000000000006131f2c3946525f6c7985929facada093877a6d656565656565656565656565666768666d6f73777c828990959fa4acaaa299928b7e716a60574d42362a1f160c01000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f2419070000000000000000020c16202935404b555e696e7b8390949fa4abaaa29f96918b86817e7b78767574737374747577787b7d8084888d92979ea1a8aba39f96918780786d675d554b4035291d11040000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214191d2021242c3945515d67727f8b95a0abafa39992867d746d6864626160606162656360594f43382c1f130700000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c000000000000000000000000000007121d273039414950555c6064676a6b6c6c6c6c6c6c66635b51463a2f22160a00131f2c3946525f6c7985929faca295887b6f6255483c2f2228313a46525e69727f8b959faba3999082776c60564c56626f7c8995a2ac9f9386796c605346392d201300000a1724313d4a5764707d8a989184786c6053464855616e7b88949e9c9083786c60595046443f3f3f40454b535c666e7b878e8a86827c6f62554846535f6976839097897d7063564a3d2f23180c0000000a1724313d4a5764707d8a989184786c6053463c313f4c5966727f8c999e9184776b5e5144505b666f7c87939f968d80736a5f544a3f3329303b46535f6976839097897d7063564a3d2f23180c00000a1723303d4a5663707d8997a1ac9f92867a6d60574d43393946525e68717e8a949ea89e938b7f726a5f55525e6874818d9aa49f92867a6d6054473d32271b0f03000000000000000714202d3a4753606d7a86939facafa49a897c6f6356493c3023140a0000000000000000000000000000000000000000030d17212931363a3b443e3937332d27221b17110a02000000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d2114070005111e2a36424d566976828f9caaafa3998c80736a5f58514b4745414240403f3f3f3e4a5764717d8a97a4b0a99c8f827669574d4244444444444444444444444444444444444444444444444444443b3a37312a21180e03000000000000000006131f2c3946525f6c7985929facada093877a6d605858585858585858585858595a545c6062666b6f767c838d939aa3ababa39f92867c6f695e52463e31281d13070000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e1308000000000000000008131e28323a45515d676e7b8491959fa6afa7a098928c847f7a75716e6969686767666767686a696e7173777b80858b91969fa2aaa9a199938c81796d675d5145392c2013060000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000000000000060c10151a1e2124292c2d30333f4a54606d7985929ea7b1a79f92877d706b615e565554535354565856544f473d32271b0f0300000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e00000000000000000000000000040d18232e39434b535b60676d71747778797979797979726d63574b3e3225180c00131f2c3946525f6c7985929faca295887b6f6255483c2f242f3a43505a616e7b86929fa7a89f92867c6e655b504956626f7c8995a2ac9f9386796c605346392d20130004111d2935414c566874818e9a8d8073655b50444b5566737f8c99a096897d70665b50473e37332d2e3439414a545f697380827e7a766f6a5f5347424d5765727f8c988d817467554b4034291c10040004111d2935414c566874818e9a8d8073655b504437333f4c5966727f8c999e9184776b5e514c56606c7883909a9e9184796d60584e42382d212a36424d5765727f8c988d817467554b4034291c1004000713202d3a4653606d7985929eaaa2988c7f72695f554b43424f59616d7a85929ea6a1968f81756d62584e4c56616e7b87939fa2988b7f7265584e43372b1f1306000000000000000915222f3c4855626f7b889aa4afac9f93867a6d6054473a2d211407000000000000000000000000000000000000000000060f171f262a2d2e37312d2b27221b17110b060000000000000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f23160900020e1925303f4b5865727e8b98a2aeab9f92867c6f6a605d5554524c4e4d4d4c4c4b4b4b5663707c8996a3afa79b8e8174685b505050505050505050505050505050505050505050505050505050504847433c332a201509000000000000000006131f2c3946525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4c4d4a5053555960636a6f7980889299a3abaea39891857b6e615a50433a2f24180d00000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c0100000000000000010d1925303a44505a606d79839096a0a8b0a69e9591867f79726d6764615e575b5a5a5a5a5b5c575e6164676a6e73797e848c92989fa7aba49f938e82796d6053473a2d2014070000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000000000000000000030a11171c1f262b2e2f35393a3d4044505b66727f8b97a1adaca0958c7f736b6159524c4847464747494b4948433d352b21160a0000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e000000000000000000000000010c161f2834404b555c656c71797d8184858686868686867f7266594c3f3326190c00131f2c3946525f6c7985929faca295887b6f6255483c2f2935414c55616c75828f98a2aca0968c80736a5f53494956626f7c8995a2ac9f9386796c605346392d2013000713202c3945525d6877849199897c6f62534945515d677683909d9e9184786c60544a3f352b272223282f38424d57636e7375716d68625f584e433b4854616e7b8797908477675c5145382c1f1306000713202c3945525d6877849199897c6f6253493f33333f4c5966727f8c999e9184776b5e53535d68717e8b959e93897d70675d51463c2f261c26313b4854616e7b8797908477675c5145382c1f13060006131f2c3845515c6773808c98a2aa9f92867b6e675d554c4a54616b75818e97a1a59e91847a6d605b514646535f697683909caa9d9083776a6054473b2e221509000000000000000b1724313e4a5764717d8a97acb6aa9e918477675d5145392c20130600000000000000000000000000000000000000000000060d141a1e21222a24201f1b17110b0600000000000000000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b00000914212d3a4754606d7a85929fa7aea29891847c726d6763605d565b5a59595858585857626f7c8995a2afa79a8d8074675d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534e463c31261a0f020000000000000006131f2c3946525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f3f40403f4446494f545860676d737e879299a3aeaaa1978f82766c61554b4135291d1207000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000000000005111d2935414c56626d75818e959fa8b0a69e948f837b726d66605d5554534d4e4e4d4d4d4e4f4d525457585f62666d71797f8690959ea5afa59e948d8073665a4d4033271a0d0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000003090c151c23282c31373a3b4145474a4d4e53606c7884919ea9b1a79d9083786c60594f46413c3a3a3a3b3c3e3c3b38322b23190f040000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c3023160900000000000000000000000007131d28313a45515c676d777e848a8e909192999393938c7f7266594c3f3326190c00131f2c3946525f6c7985929faca295887b6f6255483c2f303845515d67707d8a939eaaa49a9184796d60584e414956626f7c8995a2ac9f9386796c605346392d2013000714212d3a4754606d7a87969286796d6053464753606d7a86939f998d8073655b5042382d231b17181d26303b45525c63666864615d56534e463c3a46535e697885919286796d6053473a2d201407000714212d3a4754606d7a87969286796d6053463a2d333f4c5966727f8c999e9184776b606060606d7a85929e978e81746b60554b40342a1d14212d3a46535e697885919286796d6053473a2d2014070004101c2834404b55616e7a86929fa6a2989083796d675e56515c66707d8a939ea99e938a7d70685d52493f424d5765717e8b98a3a095897c6f6256493c31261a0e020000000000000c1926323f4c5965727f8c98a5b2a99c8f837669554b4135291d1104000000000000000000000000000000000000000000000003090e1214151d1713120f0b06000000000000000000000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d00000713202c3945525d68737f8c95a0a8aaa19691867f7974706d6869686766666565656464646f7c8995a2afa6998c7f736a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a625f584e43372b1f12060000000000000006131f2c3946525f6c7985929facada093877a6d6054473a3232323232323232332e34383a3d43484e555c606c717e87929fa5afa99f948a7e71675d5145392e23180c0000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d110400000000000000000713202d3946525e68717e8b939ea7b1a79e948f82796e69605c54514b484642424140404141424246484a4e53545c60666d727b838f939ea8afa69a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000000000000050d141a1e262e34383c4247484c525457595b5563707d8996a0acab9f95897d70665b504745403a37322d2e2f32302f2c2721191007000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f2215090000000000000000000000010d18242f3a43515b606d79818b91969a9d9e9fa39f9f998c7f7266594c3f3326190c00131f2c3946525f6c7985929faca295887b6f6255483c2e38424e58606d7a84919ea6a99f93887d70675c51463c4956626f7c8995a2ac9f9386796c605346392d2013000a1623303d495663707d8996908377665c51454956626f7c8999a4978a7d706453493f2f261c0f0b0b151e2a33404a5257595b5754524c47433c3436424d576976828f99897c6f6256493c2f231609000a1623303d495663707d8996908377665c5145382c333f4c5966727f8c999e9184776d6d6d6d6d74808d979e92857a6d61594f433b322920171e2a36424d576976828f99897c6f6256493c2f23160900000c18232e3946525e68727f8b949fa89f958f82796e68615a606d7884919ea5a1978e81756b61564c41373b4754606d7a86929fa79a8d807467574d42372b1e12060000000000000d192633404c5966737f8c99a6b2a89b8e8175685b4e422f24180d010000000000000000000000000000000000000000000000000002050708110b060503000000000000000000000000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f000004111d2935414c56606d79839096a0a7a8a198928c85807d7a787675737372727271717171707c8995a2afa5988c7f777777777777777777777777777777777777777777777777777777777777776e6a5f53473a2e2114080000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d252525252525252623282c2d32383d434b515a616c727f8b939ea9b0a69e91847a6d60544b4034281c1004000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d010000000000000006121f2b37434e58616d7a85929ea5afa9a0958f82796d675f57514a45403b3a3631343433343430363a3b3e43474b51545c60696e79818f96a0aca79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000080f171f252a30383f44464d5355565d60636668696775818e9ba8b2aa9d9083776b605b5353514b47433c3731292423221f1b160f07000000000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f1307000000000000000000000004111d2935414b55626d75818e939ea1a8aaa29f9c9998988c7f7266594c3f3326190c00131f2c3946525f6c7985929faca295887b6f6255483c343f4a54606a74808d96a1ada1978e81746b60554b403c4956626f7c8995a2ac9f9386796c605346392d2013000c1925323f4c5865727f8b988e817467544b404b5864717e8b97a398877b6e6154473b2d21140a00030c18212e3840474b4d4f4b4746413a37322a31404d596673808c988b7e7165584b3e3225180b000c1925323f4c5865727f8b988e817467544b403428333f4c5966727f8c999e9184797a7a7a7a7a7c87929f978b7e7168605b544d443b32291d1a2531404d596673808c988b7e7165584b3e3225180b000007121d2a36414c56606c78829096a1a79e948f837a716c6268727f8c96a0a69e91857a6d61594f443a303945525d6875828f9bac9e918477695f53473a2e2114080000000000000d1a2734404d5a6773808d9aa6b3a79a8d8074675a4d4134271a070000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f0000010d19242f3a45515c666e7b8490959fa3aaa29f97928d898784838180807f7f7e7e7e7e7d7d7f8c98a5b2ab9e9184838383838383838383838383838383838383838383838383838383838383837c6e6255483b2f2215080000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d2119191919191919171c1f20272c30394045505a626d74818e97a1adada1968c7f73665c5145382c1f14090000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000000000815212e3a47535f6a74818e97a2adada2979083796d675d554d444039352f2d2a252727272728252a2d2e31373940454b51575f676d7884919eaaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000000020a121a212931363e424a5053575f6266686d70737576777986929facb1a4988b7e716e6c6564605d55534e47433c352f281f180f0a04000000000000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f0300000000000000000000000613202c3945515d67727f8b939ea5ada49d98928f8d8c8b8b7f7266594c3f3326190c00131f2c3946525f6c7985929faca295887b6f6255483c3844505c666f7c87939fa9a69e92857a6d60594f43393c4956626f7c8995a2ac9f9386796c605346392d2013000d1a2733404d5a6673808d998c7f7366594c404c5966727f8c999f928579695e52463a2d2014020000060f1c262e353b3f40423e3a3935302b2625323e4b5865717e8b988c7f7266594c3f3326190c000d1a2733404d5a6673808d998c7f7366594c402e23333f4c5966727f8c99a096918686868686868892999e92857c78716c665e564d443b2f261b25323e4b5865717e8b988c7f7266594c3f3326190c0000000d1925303b44505b666e7b849197a1a69e9590857e756f6d7a85929fa89f948a7e71685d52473e322935414c5664717e8a9aa4a096887b6e6255483b2f2215080000000000000e1b2734414e5a6774818d9aa7b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d1000000008131e2834404b545e696e7b838d92999fa2a9a29e9a9696918f8e8d8c8c8b8b8b8b8a8a8a8c919ba7b4ada19691909090909090909090909090909090909090909090909090909090909090887c6f6255493c2f2216090000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0c060c1012131b1e272e343e47515b606d7985919ea7b1a99e9185796d6053463b31251a0e02000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c010000000000000005111d2935414c56626f7c87939fa9b0a69f92857b6e675d554b433c342e2924211e1a1b1a1a1a1b1a1e2021262b2e343940454d555c667784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000020b141c242c333b424650545c6065696e73777a7d80818384869298a2aeb3a69a8d807d7b7975716d67625f58534e454039312a211a1108000000000000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a0000000000000000000000000714212d3a4754606d7a85929fa6ada39c928d8682807f7f7f7c6f6255493c2f22160900131f2c3946525f6c7985929faca295887b6f6255483c424d57606d78839099a4aa9e948a7e71685d52473d303c4956626f7c8995a2ac9f9386796c605346392d2013000e1b2734414e5a6774818d988b7e7265584b404d5a6773808d9a9e9185786b574d42362a1e11050000000a131c242a2f323335312e2d29241e1b24313e4a5764717d8a978d8073665a4d4033271a0d000e1b2734414e5a6774818d988b7e7265584b3f3226333f4c5966727f8c99a8a09e939393939393959fa3a1979289847e786e685e564d41382d2224313e4a5764717d8a978d8073665a4d4033271a0d00000008141e28333f4a545e696e7b8591969fa69f97918a827c76808d97a2a3998f82766c61564c41352c242f3a4754616d7a87939fa1988c7f7265594c3f3226190c0000000000000e1b2835414e5b6874818e9ba7b3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d11000000010c18232e39424d575e696e7980878e92989b9ea1a9a8a19e9c9b9a999998989897979797989ba3adb8b2a8a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d95887b6e6255483b2f2215080000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000003060a0c151d2328353f45515d67717e8b95a0acada1978b7e7164574d42362a1e12050000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c20130400000000000000000713202d3946525e6874818e9aa4afab9f948b7e71695e554b433a3128231c1814120e090d0d0e090e1214151a1d23282e343c434b546a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000020b141c262e363e454d535a61666d71767b8084868a8c8e90919298a2aab4b5a89d928d8a8885817e7a756f6a625f58514b433c332c231a120800000000000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f04000000000000000000000004101c2934404b5565727f8b98a2aea79c918c807a75737272726f6a5f54473b2e22150800131f2c3946525f6c7985929faca295887b6f6255483c46535f69727f8c95a0aba2988f82766c61564c41352f3c4956626f7c8995a2ac9f9386796c605346392d2013000f1b2835424e5b6875818e978a7e7164574b414d5a6774808d9a9d9184776a5e514430251a0e02000000010a12191f232626282421201d19131723303d4a5663707d89968d8174675a4e4134271b0e000f1b2835424e5b6875818e978a7e7164574b3e3126333f4c5966727f8c99a8a09393939393939393939496999e96918b827a6e685e53493f332723303d4a5663707d89968d8174675a4e4134271b0e000000020b17222d38424d575f696f7c8490949fa3a19e948f888287929fa99f92877c6e625a50443a3028232d3946525e687783909997928e8376695c504336291d100300000000000e1b2835414e5b6874818e9ba7b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e110000000007121d27303b454d575e676d747b81868b8e929796989a9b9c9d9d9d9e9e9e9e9e9f9f9f9fa4acb6c0b6aea9a79f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa8aaaaaaaaab94887b6e6155483b2e2215080000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000030b1218232935414b55606c7883909da9b3a99d908377695e53463a2d2114060000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d110400000000000000000714212e3a4754616d7a86929facb0a69c9082766c62574d433930281f18120d07050c111517181c1c1c1c1c1c1c181d23283144515d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000a141c262e38404850575e616c71787e83888d90939a999b9c9e9fa2aab4b1b2aea49d9a9797928e8b86817c756f6a605d554e463e352c241a11080000000000000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f24190700000000000000000000000006131f2c3845515c677683909daaaca0958c7f746d6866656565625f584e43372b1f130600131f2c3946525f6c7985929faca295887b6f62554844505a616e7b86929fa7a79f92867b6e615a50443a302f3c4956626f7c8995a2ac9f9386796c605346392d2013000f1c2935424f5c6875828f978a7d7064574a414e5a6774818d9a9d9184776a5e51442f24180d0100000000040c13181d2020201d1814120f0916232f3c4956626f7c89958e8175685b4e4235281b0f000f1c2935424f5c6875828f978a7d7064574a3d3126333f4c5966727f8c99a09689868686868686868687898d92989e948f847a6e655b5044372b232f3c4956626f7c89958e8175685b4e4235281b0f0000000006111c262f3b454d575f6a6f7a828d92999fa69e9c948f9299a3a2978d80746a5f534b454039342e2a36414c566673808d8c8985817e7064574a3d3124170a0000000000000e1b2734414e5a6774818d9aa7b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e1100000000000b151e29333b454d555d60696e747a7e8285888a8c8d8e8f9090919191919192929292939aa4afbbaea49d9a93939393939393939393939393939393939393939393939b9ea5afafa499877a6d6154473a2e2114070000000000000003131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0c0c0c0c07060400071118242f3a44505b65717e8b97a2adab9f95877b6e6154483b2e23170c00000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000005111e2a36424d5666727f8c98a3aeab9f94897c6f635a50453b31271e160d07000911181d212425292929292929292929292a3744515d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000009121c262e38404a525a61696e767e848b9095999d9fa4aca8a9a8a6a5a4a4a4a5a6a8aaa6a9a19e9b98928e88827c736d675f584f473e362c231a1007000000000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e13080000000000000000000000000714202d3a4753606d7986929facac9d9083786c605d5659585855544e463c32261b0f0300131f2c3946525f6c7985929faca295887b6f6255484c56616c76828f98a2aba0958c7f72695e53483e32282f3c4956626f7c8995a2ac9f9386796c605346392d2013000f1b2835424e5b6875818e978a7e7164574b404d5a6773808d9a9e9184786b554b4035291d1004000000080d161d24292c2d2c2924211f1a151723303d4a5663707d89968d8174675a4e4134271b0e000f1b2835424e5b6875818e978a7e7164574b3e3126333f4c5966727f8c999e918479797979797979797a7c808590959f969082776c6053463c3126303d4a5663707d89968d8174675a4e4134271b0e00000000000a141d29333c454e585f686d78808790959ea0a69e9c9fa3ab9f92857a6d65605c54514b443f3830303d495663707d83807c7874706c6155493c3023160a0000000000000d1a2734404d5a6773808d9aa6b3a79a8d8174675a4e4134271b090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d100000000000030c172129333b434b51575f62686d7175787b7d7f808283838484848485858585858687939facb9a99d928d86868686868686868686868686868686868686868686868e939eaaac9f9386796c605346392d2013060000000000040a0f131f2c3946525f6c7985929facada093877a6d6054473a2d211919191919191919191313100c0707131d27333f4953606d7985929fabb1a7988b7e7265544a3f34281c10030000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e130800000000000000000714202d3a46525e697784909daab4aa9c9083766b6054483f33291f150c040009121b22292e313236363636363636363636363744515d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000006101b242e38404a525c636c717b838a91969d9fa7aaacaba39f9d9b999897979898999b9d9fa3ababaaa29f9b948f8780796e6a615950483e352c22180d0400000000000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c010000000000000000000000000916232f3c4956626f7c8999a3aea49a8b7e71665b524c4c4c4c4947433c342a20150a0000131f2c3946525f6c7985929faca295887b6f625548525d68717e8a949faaa4999083786d60574d42362c232f3c4956626f7c8995a2ac9f9386796c605346392d2013000e1b2734414e5a6774818d988b7f7265584c404d596673808c999f928578675d5145392c20130600000811191f282f35393a39352f2e2b26201824313e4a5764717d8a978d8073665a4d4033271a0d000e1b2734414e5a6774818d988b7f7265584c3f3226333f4c5966727f8c999e9184776c6c6c6c6c666c6d6f737b8390969f948b7e7165574d42372b313e4a5764717d8a978d8073665a4d4033271a0d0000000000020b17202a333c464e565e666d737c838b91969ea1a9acafaa9d90837d77716d66605d55504a423d353b4854606b7077736f6c656461594f44392d2014080000000000000d192633404c5966737f8c99a6b2a89b8f8275685c4f4230251a0e0200000000000000000000000000000000000000000000000000000102030000000000000000000000000000000000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d100000000000040d161e2429313940454d53565d606468696e707274757676777777787878787879797c8995a2afa79a8d807979797979797979797979797979797979797979797979818e9ba8ab9e928578665b5044382b1f120600000000070e151b1f222c3946525f6c7985929facada093877a6d6054473a2d26262626262626262626201f1c18120b0b17222d3845515d6774818e9aabb5a89c8f8275665c5044382c1f120600000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c0100000000000000000814212e3b4754616e7b8795a0acaea2988a7e7164594f44362d21170d030006111b242d343a3d3e43434343434343434343434344515d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000030c18222d36404a525c646e737e8590949da0a8abaaa29f9b9992908e8c8b8b8a8b8b8c8e9092999a9ea1a9aca69e99928d837c706b615a50473e342a1f160c01000000000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000000000000000000000a1724313d4a5764707d8a97abac9f93867a6d61544a413f3f3f3c3b37322a22190e040000131f2c3946525f6c7985929faca295887b6f62554f59606d7a85929ea6a89f93877c6f665c50453b3124232f3c4956626f7c8995a2ac9f9386796c605346392d2013000d1a2733404d5a6673808d998c7f7366594c404b5865727e8b989f93867a6d6053473a2d20140900030d19232b313a40454745403b3a37312a2125323e4b5865717e8b988c7f7266594c3f3326190c000d1a2733404d5a6673808d998c7f7366594c402e23333f4c5966727f8c999e9184776b606060605b606163696e7a84919e9d908377695f53463a2d323e4b5865717e8b988c7f7266594c3f3326190c000000000000050e18212a343c444c545c606a6f787e848b9297a1adb8aca0959089837e79726d67605c544f45403a444f5960636a6662605b53554f473e33281c10040000000000000b1825313e4b5864717e8b97a4b1a99d9083766a574d42362a1e1105000000000000000000000000000000000000000000000003080c0e0e0f0b07070401000000000000000000000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f00000000010c161f282f35393a3e3f42474c525458575f6163656768696a6a6a6b6b6b6b6b6c6c6f7c8995a2afa89b8e82756c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c7783909daaa99d9083766a544a3f33281c0f0300000007101920262b2e2f3946525f6c7985929facada093877a6d6054473a33333333333333333333332d2c28231d150c111b2935404b5564717d8a99a3afac9f9285796d6053463a2d201307000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c2013040000000000000000000b1825323e4b5865717e8b98a7b1ac9f9285796d6053473d32201b0f0500010c18222d363f454a4b4f4f4f4f4f4f4f4f4f4f4f4f4f515d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000b151e2a343f48525c646e73808a92979fa6aca9a29f98928e8a868381807f7e7e7e7f80818386898d92979ea0a8aba39f9591867d716c61594f463c31281e13080000000000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d1104000000000000000000000000000b1825313e4b5864717e8b97a4ab9e918478685e5242382f32322f2e2b2620191007000000131f2c3946525f6c7985929faca295887b6f625554606b74818e97a1ada1968d80746a60544a3f33291f232f3c4956626f7c8995a2ac9f9386796c605346392d2013000c1925323f4c5865727f8b988e817468554b404a5663707d8996a49a897c6f6356493c30251a0e090c151f2b353d434b5153514b4847433c332f2633404d596673808c988b7e7165584b3e3225180b000c1925323f4c5865727f8b988e817468554b403428333f4c5966727f8c999e9184776b5e53534a505354565e68727e8b9aa095887b6e6155483b2e33404d596673808c988b7e7165584b3e3225180b00000000000000060f18222a323a424b51585f666c71787e85929eabadaba7a09d95908b847f79726d666059514b433d474f54565d595653504949443e352c21170b000000000000000a1723303d4a5663707d8996aab4ab9f928578695e52463a2d20140700000000000000000000000000000000000000000001090f14181a1b1c181413110d0805010000000000000000000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e0000000008131e28313a4145474b4c4d4e4f5052504d535557595a5b5c5d5d5e5e5e5e5e5f5f626f7c8995a2afa99c908376655b60606060606060606060606060606060605e697885929faba79b8e8174685b4e412d22170b000000040e19222a32373b3c3f46525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f3f3f3f3f3a38342e271e150c18242f3a4754606d7a86929facaea298887b6e6255483b2f221508000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d1104000000000000000004101d2935404b556875828e9ba8b5a89b8f8275675d5145392c1f1309000005111d29343f485056585c5c5c5c5c5c5c5c5c5c5c5c5c5c5d6a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000007121d27303c46505a646e73808d929fa2a9aea59e97928c86817d7a77757372717171727375777a7d81858b91969fa3aba7a09892877e716b61584e433a2f24190c03000000000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d01000000000000000000000000000c1925323f4c5865727f8b98a5a99c8f827669564c412f26252522221f1b150e0700000000131f2c3946525f6c7985929faca295887b6f62555c666f7d88939fa9a59e9184796d60584e42382e2117232f3c4956626f7c8995a2ac9f9386796c605346392d2013000a1623303d495663707d8996908377675c51454754616e7a8796a1988b7f7265574d42362a201a19191e27313d474f555d605d5555534e4641382a36424d576976828f99897c6f6256493c2f231609000a1623303d495663707d8996908377675c5145382c333f4c5966727f8c999e9184776b5e51463f4446474d56616d7a87939f978a7e7164574b3e3136424d576976828f99897c6f6256493c2f23160900000000000000000610182029303940454e545b60666d7a85929fa9a19e989ea0a09d97918c857f78706b605d554e463d444849514d4946443f3839332c231a1005000000000000000815222e3b4855616e7b8898a2aeada297877b6e6154473b2e21140a0000000000000000000000000000000000000000030b131a20242728292521201d1913110d0802000000000000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c000000010d19242f3a434c525457595a5b5c5d5e5d5a54484a4c4d4f5050515151515252525663707d8996a3b0ab9e9285796c605353535353535353535353535353535354616e7b8798a2aeaa988c7f7265594c3f322619060000000a15202a343c4347494c4c525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4c4c4c4645403930271d1213202c3945525d687783909daab4aa978a7d7064574a3d3124170a0000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d01000000000000000006131f2c3845515d677884919eabb5ab988b7e7265554b4035291d100400000915212e3a45505a62656969696969696969696969696969696a7784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000c18232e39434e58626c73808d929ca4adaaa39f938e857f7a75706d67686665646465656668676d7074797e848c9299a1a9aaa29992877d706a5f554c4135291e150a0000000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000000000000000000000c1925323f4c5865727f8b98a5a89b8e8275685b4f42302814191615130f0a040000000000131f2c3946525f6c7985929faca295887b6f6257606d7984919aa4a99e938a7d70675d51463c30261c16232f3c4956626f7c8995a2ac9f9386796c605346392d2013000714212d3a4754606d7a87969286796d60534646525e687884919e9c8f8275695e52463c332a262524293039434f5960676d6765625f58534a41363a46535f697885919286796d6053473a2d201407000714212d3a4754606d7a87969286796d6053463a2d333f4c5966727f8c999e9184776b5e51443338393b46525d687784919e998c7f7366594c40333a46535f697885919286796d6053473a2d201407000000000000000000060e171e272e343c424a505b66727f8c98a2a197918c91969d9fa19e97918b837d746d675f584f473d3b3d44403c3937332d2d28211a110800000000000000000613202d394653606c7985929facb3a9968a7d7063574a3d31261b0f01000000000000000000000000000000000000000b151d252b30343536312d2c2924201d19130c070100000000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a00000004111d2935414c565d6064656668696a6b69665e54423f414243434444444545454a5764717d8a97a4b0ada297887b6f625548464646464646464646464646414c5665717e8b98aaaea298897c6f6256493c2f2316090000030f1b26323c464e54555959595f6c7985929facada093877a6d60595959595959595959595959595953514b43392e2318111d2935414c566875818e9ba8b2a5998c7f7266594c3f3326190c00000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e13080000000000000000000714202d3a4753606d7986939facaea399887b6f6255483c2f24180c0000000b1724313d4a56626c71767676767676767676767676767676767784909daaa79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000004101c2834404b555f6a717e8b929da4aeaaa298928b817a736d6863605d5559585857585859555d6063676d717980879197a0a8aba39992867c6f675d51453d30261c1106000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c0100000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0908060300000000000000131f2c3946525f6c7985929faca195887b6e625f69737f8c95a0aca2978e81756b61554b40342b1e1516232f3c4956626f7c8995a2ac9f9386796c605346392d2013000713202c3945525d6877849199897c6f635349414d566774818e9a9f92877b6e61584e453c3631322f353a424b55606b707a76726e6a645c53483c3b4855616e7b8897908477675c5145382c1f1306000713202c3945525d6877849199897c6f6353493f33333f4c5966727f8c999e9184776b5e5144382e2e35414c566a7683909d9a8d8073675a4d40343b4855616e7b8897908477675c5145382c1f130600000000000000000000050c151d23282f394653606c7884919eaa9e91857f848a90959c9fa19e95918981796e6a60594f463c3237332f2d2b27221b1c17100800000000000000000006121f2b3844505b667683909ca9b3a79a8d807467584e43372b1e1308000000000000000000000000000000000000060f1d272f373c4041423e3a39352f2d29251e18120b0300000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e2215080000000613202c3945525d686d71727374757778767066544b403435363737373838383f4b5865727e8b98a5b1b3a9988b7f7265594f42392e393939393939392d3945525d6875828e9ba8ac9f9285796d6053463a2d201307000006131f2b37434e585f62666666666c7985929facada093877a6d666666666666666666666666666666605c554b4034281c1019242f404d596673808c99a6b3a79b8e8174685b4e4135281b0e000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000916222f3c4955626f7c889aa4afac9f9286796d6053463a2d2013070000000b1825323e4b5865717e828282828282828282828282828282828286929faca79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000006131f2c3845515c676f7c86929fa4aeaaa29892867e756d68605d5654514b4d4c4b4b4b4c4d4b5153555c60676d737d859196a0a8aba29891847a6d60594f42382e23170c0000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c2013040000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca194887b6e61626e7b86929fa8a69f92857b6e61594f433a2f22190c16232f3c4956626f7c8995a2ac9f9386796c605346392d20130004111d2935414c566875818e9a8d8074655b5044495663707d8996a0998d80736a5f574e4642403f3f41454c545d67707d86837f7b746e64584c40424d5765727f8c988e817467554b4034291c10040004111d2935414c566875818e9a8d8074655b504437333f4c5966727f8c999e9184776b5e51443b3b3b3c44505c667783909d998d8073665a4d4037424d5765727f8c988e817467554b4034291c10040000000000000000000000030b121b27333f4953636f7c8996a1a3998c7f73787d83898f949da0a09d938e847c706b60584e443b302523201f1b1711100b0500000000000000000000030f1c28333f4a546774808d9aaab4aa9d9184776a5f53473a2f24190b0200000000000000000000000000000000030e18212f3941484d4e4f4b4745413a39353029241d150d030000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d2013070000000714212d3a4754606d7a7e7f80818283858276665c5145382f2c2924262a2d37434e586774818e9aa7b4b7aa9d9083776b60544b40352f2b2623282b2f38414c56606d7a85929faca99b8e8275665c5144382c1f120600000815222e3b47545f6a6f72727272727985929facada093877a727272727272727272727272727272726d675c5145382c1f131824313e4b5764717e8a97a4b1a89c8f8275695c4f4236291c0f0000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000b1824313e4b5764717e8a97acb6aa9d908477665c5144382c1f12060000010d1a2734404d5a6773808d8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f9298a2aea79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000004111d2935414c56606d79839198a2aeaea39892867d716c615e56524c474541403f3e3e3e3f404045474b51555c606b6f7b849196a1abaaa0968e81746b60544a3f34281c110600000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d11040000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca194877a6e616c76828f98a3ab9f948b7e72685e52473e31281d100916232f3c4956626f7c8995a2ac9f9386796c605346392d201300010d19242f3d4a5764707d8a989184786c6053464653606c7884919e9f92877c6f695f58534d4d4c4c4c51565d666d7983918f8c888174675a4e4147535f6977839097897d7063564a3d2f23180c0000010d19242f3d4a5764707d8a989184786c6053463c323f4c5966727f8c999e9184776b5e5148484848494e56606d7985929f988b7f7265584c3f3a47535f6977839097897d7063564a3d2f23180c0000000000000000000000000005121f2b3744505b6574808d9aa89f92867a6e6c70767c828991959fa39d9691867d706a5f564c41362a2113120f0b0600000000000000000000000000000b17222d3d4a5763707d8a98a2aeaca095887c6f62564c4135291d140a000000000000000000000000000000000915202a33414b53595b5c5854524c4746413a352f271f150b0100000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f12060000000714212d3a4754606d7a878c8d8e8f909186796d60544a403a39352f31363a3f47535f6a7783909daab6b8aca095897d70665c5145413a37312e34383b424a525e68727f8c98a2ada1978a7d7164544a4034281c100400000916222f3c4955626f7c7f7f7f7f7f7f86929facb3a6998c807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6053463a2d20131724303d4a5763707d8a96a3b0a99c908376695d5043362a1d1000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d1104000000000000000000000c1926333f4c5966727f8c99a5b2a99c8f827669544a4034281c10040000010d1a2734404d5a6773808d9a9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa2aab4a79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000713202c3945525d68727f8c95a0aaafa59f92867d706b625a524c45413a39352f32313132322f35383a40454b515960696e7b849199a3aea89e93897d70665c5044382d22170b000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca094877a6d68717e8b949faaa3999083776c60564d41352c1f160c0916232f3c4956626f7c8995a2ac9f9386796c605346392d201300000813202d3a4653606d79859296897c7063584e44505b66717e8b959f9991847b6f6a615f57595859555d60686d78818e959c93877c6f625548424d57616e7b88959285796d6053463a2d2013070000000813202d3a4653606d79859296897c7063584e43373f4c5966727f8c999e9184776b5e545454545556585f68707d8a98a298897d7063564a3d424d57616e7b88959285796d6053463a2d201307000000000000000000000000000613202d394653606c7884919eac9b8f82756860646b6f767d838c9299a2a09892867c6f685e52463d32271b1003000000000000000000000000000000000614202d3a4753606d7985929facb1a79a8d8073685d52453b2f261b1106000000000000000000000000000006101a26313c45535d64686964605d5654524c45403931271d1207000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c10030000000613202c3945515d67778390999b9c9d988a7d71665b514b4745404343424648505a626f7b8895a0acb8bcb1a79d9083796d605b524c464242413f44464d545b616d7a85919eaaa99e9184796d6053463a2e23180c0000000c1925323f4c5865727f8b8c8c8c8c8c9299a3aeb4a89c928c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877a6d6054473a2d21141623303d495663707c8996a3afaa9d9083776a5d5044372a1d1100000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d01000000000000000000000d1a2633404d596673808c99a6b3a79a8e8174675b4e412e23180c000000010d1a2734404d5a6773808d9aa6a9a9a9a9a9a9a9a9a9a9a9a9a9a9acaeb4aca79a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000004111d2935404b55606d7a85929fa7b1a99d938b7e716b60595046413a352f2c2924252524252524292c2e343940454f575e696f7c87929fa7afa59d9183786d60544a3f33281c0f0300000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e1308000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca093867a6d6d7a85929ea6a89f92867c6e655b50443b30231a0d040916232f3c4956626f7c8995a2ac9f9386796c605346392d2013000006131f2c3845515c6775818e9b8f82756a6054474a54606c78839098a09691847c746e696766656567676d727a828e939e958d80746a5f534746535e6974818e9a8e8174665c5044382c1f120600000006131f2c3845515c6775818e9b8f82756a6054473e3f4c5966727f8c999e9184776b61616161616162656a6f7a84919e9f9285796d6053463a46535e6974818e9a8e8174665c5044382c1f1206000000000000000000000000000815222f3b4855626e7b8896a1a49a8b7e7164565960636b70787f879297a2a29891847a6e61594f44382c1e13080000000000000000000000000000000006131f2c3845515c6775828f9ba8b2ab9f92857a6d60574d41382d2217110a020000000000000000000001081018222b37424e57646f7475716d6865615e56514b43392f24180c0000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b0000000004111d2935414c556673808d99a3a8aa9d9083786c605d5553514b50504d53555a626c74818e9aa7b1b6b4b6aca0958d80736d605d56534d4e4e4a5053575e666c75828f97a1ada1978c7f73665c5145382c1c12070000000c1925323f4c5865727f8b98999999999fa3abb4b9ada49c99999999999999999999999999999993877a6d6054473a2d211416222f3c4955626f7c8895a2afaa9e9184776b5e5144382b1e11000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000e1a2734414d5a6774808d9aa7b3a69a8d8073675a4d4034271a07000000010d1a2734404d5a6773808d9a9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000613202c3945515d6773808d97a2adada1978e81746c61594f473e36302924201d181918181819181d1f23282f343d454d57606a727f8c95a0acaca0958b7e71665b5044382b1f1308000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c01000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca39986796d75818e97a2aca0968c80736a5f53493f32291f1108000916232f3c4956626f7c8995a2ac9f9386796c605346392d2013000004101c2834404b55636f7c899494887c6f62594f44505b666e7b869298a0969187807b777473727273767a7f858f939e969083796d60584e434e58616e7b869294897c6f62544a3f34281c100300000004101c2834404b55636f7c899494887c6f62594f443f4c5966727f8c999e9184776e6e6e6e6e6e6e6f72757c839096a0978d8074665c5145434e58616e7b869294897c6f62544a3f34281c1003000000000000000000000000000b1825323e4b5865717e8b98a89f93877a6d61544f545960666d737d859297a2a1968f82756b6054483a2f24190d0100000000000000000000000000000004101c2934404b5563707d8a96a1acaea2988c7f73695e53493f3327221b140b090603000001000205080d1319222a343c47535f6a7481827e7a76716d68605d554b4035291d100400000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c110600000000010d19242f3b4854616e7b86929fa9ab9f958c7f736d6762605d555d5d575f61656d717e8a939da9afa9a7a9aba79c928c7f746d68615f575b5b545c6062696e78808d949ea9a59e9184796d60544b4034281c0b000000000c1925323f4c5865727f8b98a5a5a5a5acaeb4bdbfb6ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a093877a6d6054473a2d211416222f3c4955626f7c8895a2afab9e9184786b5e5145382b1e120000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c0100000000000000000000000e1b2834414e5b6774818e9aa7b3a6998c807366594d4033261a0d000000010d1a2734404d5a6773808d939393939393939393939393939393939393939393938d8074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000714202d3a4753606d7a85929fa9b2a89e91857a6d605a50473d352a251e1913110d070b0b0b070c1013181d2329333b454e58606d7883909da7b1a79e9184786c6053463a3024190d0100000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c20130400000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929fac9f928679707d89939ea9a59d9184796d60584e41382d20170d00000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130000000c18232e394854606b76828f9c8f82756c61564c4a545f69707d8692979f99928d888481807f7f8082868b91979e9691847b6e675c51464b55606a74818d998f82766a605442382e23170c00000000000c18232e394854606b76828f9c8f82756c61564c414c5966727f8c999e91847b7b7b7b7b7b7b7b7c7e82879095a09892857a6d61544b404b55606a74818d998f82766a605442382e23170c00000000000000000000000000010e1b2834414e5b6774818e9aa79e918477685e5246484f545c606b707c85929fa59e93897d7063564c4135291d1104000000000000000000000000000000000c18232f394653606c7884919ea8b2aa9f92867b6e655b50443e332d261d1a1312100b060e090e1214191e2429343c46505a626e7b878f8b86827e7a766d675d5145392c1f1306000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a0000000000000814212d3a46535e6974818e97a1aba79c918c8079736f6d676a6a6a6a696e71777e87929fa5afa59d9b9c9fa6a49c918c807a726e6969686768666d6f747b828d929da6a69e938a7e71675d5142392e23180c000000000c1925323f4c5865727f8b989f9f9f9fa0aeb4bcb9b0a8a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f93877a6d6054473a2d211416232f3c4956626f7c8995a2afaa9d9184776a5e5144372b1e1100000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c2013040000000000000000000000000f1c2835424f5b6875818e9ba8b2a5998c7f7266594c3f3326190c000000010d1a2734404d5a6773808686868686868686868686868686868686868686868686868074675a4d4134271a0e0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000006121e2b37424d5765717e8b98a2aeaca0968b7e71685d52483e352b2319130d08040100000000000004070c12182129333d44505c66707d89959fabaca0968a7d7064564c4135291d110400000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d110400000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929fac9f9285797984919ea5a99d93897d70675c51463c2f261b0e0500000916232f3c4956626f7c8995a2ac9f9386796c605346392d201300000007121d2c38434f5963707d8994948a7d70685d52454d57606b707d858f949c9f9a95918e8c8b8c8d8f92989e9c938e847b6e695f554b45515c676f7c879394897c6f63584e4330261c1106000000000007121d2c38434f5963707d8994948a7d70685d52454c5966727f8c99a196918787878787878788898b8f93999e9691867d6f685d524245515c676f7c879394897c6f63584e4330261c11060000000000000000000000000004111d2a3744505d6a7783909da89b8e827568564c413d424a5159606a707d8a939ea69c8f8276685d5245392c2013070000000000000000000000000000000007121f2b3844505b66727f8b96a1acaea2988f82776c605a50443f382f2b26201f1c171b1a1b1a1e2124292f353e464e58626c75828f9999928f8b8682796d6053473a2d201407000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e00000000000005121e2a36424d57616e7b859299a3aba39c928d84807c7a7877767677787b7e838b9299a3aea69d938e90949fa6a39c928d857f7b777675747576797c80868f949da4a69f948e81746c61554b4030271d1207000000000c1925323f4c5865727f8b939393939393a2aab4b3a89e9693939393939393939393939393939393877a6d6054473a2d21141623303d495663707c8996a3afaa9d9083776a5d5044372a1d1100000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d11040000000000000000000000000f1b2835424e5b6875818e9ba8b2a6998c7f7366594c403326190d000000000d1926333f4c58646e73797979797979797979797979797979797979797979797979746e64584c3f33261a0d0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000814212e3a47535f697683909daab4aa9e9184786d60564c41362d2319110802000000000000000000000001070f172128343f4a54606b7783909daab2a89b8f8275685d5245392c201307000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d0100000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929fab9e918578808d96a0aca1978e81746b60554b40342a1d140a0000000916232f3c4956626f7c8995a2ac9f9386796c605346392d2013000000000f1b27323d4854606b7682909991847a6d605b51484f59606b707b828a8f939a9a9d9a9998989a9c9a99928f8981796e695f574d47505a606d798491988f82766b6054463d321e150a000000000000000f1b27323d4854606b7682909991847a6d605b514c5966727f8c99a8a19e949494949494949495989c9a97928d847d6f6b60564c47505a606d798491988f82766b6054463d321e150a000000000000000000000000000004101d2935404b556b7885919ea6998c807366594d40303940444f58616b75818e9ba99f92867a6d6054473a2d21140700000000000000000000000000000000030f1c28333f4a54606d7984919ea6b0aa9e948c7f726c615a5049413c37312d2b2823272728252a2d2f353a41454f585f6a717e8b939ea39f9c998f8275675d5145392c1f13060000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f1409000000000000020e1a25313b46525e69707d879299a1a9a49c96918d8986858483838485888b90959fa3aba59d948e818390949da5a49d97928c8884828181828385898d92989ea6a49f948f82796d605a5043392f1e150b00000000000c1925323f4c5865727f8686868686868998a2aeafa2968c87868686868686868686868686868686867a6d6054473a2d21141824313e4b5764717e8a97a4b1a99c8f8376695c504336291d10000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d010000000000000000000000000e1b2834414e5b6774818e9aa7b3a6998d8073665a4d4033271a0d000000000b17232f3b47525c64676c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645c52473c3023170b0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000815222f3b4855626e7b88959fabaea3988b7e72665c50443a2f241b1107000000000000000000000000000000050f17232e38424f5964717e8a98a2aeac9f92867a6d6054473a2d2114080000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e13080000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faa9d91847b87929fa8a69e92857a6d61594f43392e22180b020000000916232f3c4956626f7c8995a2ac9f9386796c605346392d2013000000000a16212c38444f59626f7c8692978e81746d625a50474f5960696e767d83878b8e909192929291908e8b86827c756d675f574d474f59626c73808d9592867c6e62594f44342b200c03000000000000000a16212c38444f59626f7c8692978e81746d625a505966727f8c9393939393939393939399929291908d8a8580796f6b60594f474f59626c73808d9592867c6e62594f44342b200c03000000000000000000000000000006131f2c3945515d677986929fa5988b7f7265584c3f322e343d464f59626f7c8997a2a3998a7d7164574a3e3124170b00000000000000000000000000000000000b17222d3845515c67717e8b949ea9b0a69f92877e716c605b534d47423c3a38342e34343531363a3b41454c5159616a6f7c86929fa5aea99f93877c6f62554b4035291d100400000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d10040000000000000009141f2a36424d57606b717e8792979fa2a8a19e999a9391909090919297989da0a7a8a19e938e82797a828e939da0a8a19e9996918f8e8e8f9092989a9fa3a7a09a938d82796d675d51483e31281d0c0300000000000b1824313e4a56626d7279797979797986929facada093877a7979797979797979797979797979797976685d5245392c20131926333f4c5966727f8c99a5b2a79b8e8174685b4e4135281b0e0000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e1308000000000000000000000000000e1b2734414e5a6774818d9aa7b3a79a8d8074675a4d4134271a080000000007131f2b36404a52585a6060606060606060606060606060606060606060606060605a58524a40362b1f13070000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000030f1c28333f4a5465727f8b98a7b1ac9f92867a6d60544a3f32281e1209000000000000000000000000000000000006111c26303d4753606d7a85929facaea3998b7e7164584b3e3025190e02000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faa9d9083839099a3aa9f948a7e71685d52473d30271d0f06000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130000000004101c27333d47535f6a737f8c95938c7f726c615950444f575f616b70767b7e8183858586858583817e7a756f6a605d554d445059606b717e8b92958c7f736a5f53473d3222190f000000000000000004101c27333d47535f6a737f8c95938c7f726c61595966727f86868686868686868686868686858483807d79736d6760594f445059606b717e8b92958c7f736a5f53473d3222190f0000000000000000000000000000000714202d3a4753606d7a8699a3a4978b7e7164584b3e312328343e4653606c7985929fab998c7f7266594c3f3326190c000000000000000000000000000000000006111c2834404b55616c75828f97a2abafa39992877e726c655f57534d4946443f41414141424246484c52555d606b707c859298a2aeada2978f82756a5f5343392f24180c00000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d0100000000000000030e1a25303b454f59626c717d858d92989d9fa4aca49f9e9d9d9d9d9ea1a9aba49f9c96918a81786d6d78818991959c9fa3a8a09e9c9b9a9b9c9fa2aaa39f9b95908880786d675d554b40362c1f160c0000000000000915222e3a46515b62656c6c6c6c6c7985929facada093877a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5d564c4135291d111c2934404b556774818e9aa7b3a6998c807366594d4033261a0d00000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c01000000000000000000000000000d1a2733404d5a6673808d99a6b3a89b8e8175685b4e422f24190d01000000020e19242e3840474c4d5353535353535353535353535353535353535353535353534d4c4740382f24190e030000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000006121f2b3844505b6675828f9ba8b5a89b8f8275685d5242382e20160c000000000000000000000000000000000000000a15202c3945515d6775828e9ba8b4ab9b8e817468564c41362a1e11050000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929fac9f928790959faba2988f82766c61564c41352b1e150b00000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d201300000000000b16212b37434e58606d7883909793887e716b625a514a4d53596163696e71747678797979787674716d68626058514b4a505a616b707d8792979083786d60584e43352b2110070000000000000000000b16212b37434e58606d7883909793887e716b625a636d727979797979797979797979797978777673716d67605d554f4a505a616b707d8792979083786d60584e43352b2110070000000000000000000000000000000613202d394653606c7986929fa5988b7e7265584b3f3025212b3744505b657784909da79a8d8074675a4d4134271a0e0100000000000000000000000000000000000c18232e3943505a616e7b859299a3afaba39992877f776e69615f575553504a4e4e4d4e4f4d5354565d60676d747d859297a1aaaea49e92857b6e61584e4331271d1207000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d120700000000000000000009141f29333d47505a626b6f7a80868c90939a999b9d9e9e9f9f9f9e9d9c9a9993908b847d746d66666d747d848a8f92999a9c9d9e9f9f9f9e9d9b9998928f89837d746d665d554c43392f241a0d0400000000000006121e29343f49515658606060606c7985929facada093877a6d6060606060606060606060606060605f524c443a2f2419131f2c3845515c677783909daab4aa988b7e7165584b3e3225180b000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c20130400000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f837669554c4135291d11040000000008121c262e363b3f40464646464646464646464646464646464646464646464646413f3c362f261d1208000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000613202d394653606c7885929fabb2a9988b7e7165564c4130261c0d040000000000000000000000000000000000000004101d2935404b5565717e8b98aab3ab9e918478685e5246392d20140700000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d1104000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929faca39992999fa7a79f92867b6e615a50443a3023190c0300000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130000000000050f1a26313c44505c666e7b85929992867d716c605c544e464f55575e6165676a6b6c6c6c6b6a6765615e56544e454e545c606c717d86929992857b6e665c50463c3123190f00000000000000000000050f1a26313c44505c666e7b85929992867d716c605c63666c6c6c6c6c6c6c6c6c6c6c6c6c6b6b696764605c55514b4e545c606c717d86929992857b6e665c50463c3123190f0000000000000000000000000000000005121f2b3744505b657885929ea6998c807366564c41362e2e2e3844505b667784909da79a8d8074675a4d4134271a0e01000000000000000000000000000000000007121d27303e46525e69707d87929fa4acaba399938c827b746e696562605c545b5a5a5b5c575e6164686d737a808a9297a1a9afa59d928a7e70695e52463c321f150b010000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c01000000000000000000030d17212c353f48505960686d737a7f83878a8c8e90919192929292908f8d8a86837e79706c605c5c606b70787d82868a8d8f919292929292908f8c8986827d776f6b605c544c433a31271d120800000000000000010d18232d373f464a4c5353535f6c7985929facada093877a6d6054535353535353535353535353535345413a32281e1314202d3a4753606d7986929facaea298887c6f6255493c2f2216090000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d110400000000000000000000000000000a1724313d4a5764707d8a97abb5ab9e918478675d5145392c20130600000000010a141c242b2f33343939393939393939393939393939393939393939393939393433302b241d140b01000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000815222f3b4855626e7b8897a2adada197877b6e6154483b2f21140a0000000000000000000000000000000000000000010d18242f3b4855616e7b8898a2aeada196877a6e6154473b2e21140800000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d01000000000000000000000000000000000000000c1926323f4c5965727f8c98a5a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929facaba39fa3ababa0958c7f72695f53483e32281e11070000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130000000000000a152028343f4a545f696f7d87929892877e736d665f58524c484d5254585b5d5e5f5f5f5e5d5b5854524c474b51575f666d737e87929892877d6f695f544a3f342a20110700000000000000000000000a152028343f4a545f696f7d87929892877e736d665f586060606060606060606060605f5f5e5d5a5753514b4b51575f666d737e87929892877d6f695f544a3f342a20110700000000000000000000000000000000030f1b27333f49536a7784909da99c8f8276685e52463f3b3b3b404653606c7985929fac998c7f7266594c3f3326190c000000000000000000000000000000000000000b151e2a36424d56606b717f8b939aa3ababa49f948f86817b76726f6d6668686767686869696e71757a7f858d929ea2a9afa59e938d80746c61574d42342a200d030000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d040000000000000000000000050f1a232d363f474f565d60686e72767b7d7f82838485858685858482807d7a76716d66615a51515960666c71767a7d80828485858685858382807d7a75706b636059514a423a31281f150b00000000000000000006111b252d343a3e3f4646525f6c7985929facada093877a6d6054474646464646464646464646464639352f282016101d2935404b5563707d8a99a3aeac9f9285796d6053463a2d2013070000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000916222f3c4955626f7c8899a3aeaca196877a6d6054473a2d2114080000000000020a12191f2326272d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2726231f19120b0200000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000a1724313d4a5764707d8a97a9b3ab9e918578695e53463a2d2114020000000000000000000000000000000000000000000714212d3a46535f697885929fabb2a896897d7063564a3d3023170a000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e1308000000000000000000000000000000000003060809192633404c5966737f8c99a6a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929facb5afacafafa4999083786d60574d42362c20160c000000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d2013000000000000030c17232e38424d57606b717e8a9299928b80786f6a605d56524c46474b4e505252535252504e4b47464b51555d606a6e787f889299928a7e716b60574d42382e22180e000000000000000000000000030c17232e38424d57606b717e8a9299928b80786f6a605d56524c5353535353535353535251504d4a474b51555d606a6e787f889299928a7e716b60574d42382e22180e0000000000000000000000000000000000000b17222d414e5a6774818d9aa99f92867a6d6159504a4847484b515b636f7c8998a2a49a8a7e7164574b3e3124180b00000000000000000000000000000000000000030c1925303b444f59626d727f889299a1a8afa69f99928e88837f7c797775747474747576787b7e82868c92979da4adaba39f938e81786d605a50453b3022180e0000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d0000000000000000000000000008111b242d353d444c52565e6165696e71737577777879797978777573716e6864605c545044454f545b6064686d717376777879797978777573706d67636059544f44403930281f160d030000000000000000000009131b23292e31323946525f6c7985929facada093877a6d6054473a3939393939393939393939392c29241e160e19222c3945515d6774818e9aabb4a99c908376665c5044382c1f120600000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e13080000000000000000000000000000000713202d3a4653606d7986929facb2a896897c6f6356493c3025190e00000000000001080e1317191a20202020202020202020202020252728292622211f1a20201a1a17130e08010000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000c1926333f4c5966727f8c99a5b2a99c8f827669574d42362a1e120500000000000000000000000000000000000000000005121e2b37424d576a7683909da9b2a5988c7f7265594c3f3226190c0000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c01000000000000000000000000000000040a0f1315161a2734404d5a6773808d9aa6a79b8e8174685b4e4135281b0e0200000000000000000000131f2c3946525f6c7985929facb8bbb9b2a89f93877c6f665c50453b31241a0e04000000000003050916232f3c4956626f7c8995a2ac9f9386796c605346392d20130000000000000006111c26303c454f59616c717e879298928d837c736d68605d5653514a4a484847464748484a4a5053555d60676d737b838c939892877e716c61594f453c30261c0f060000000000000000000000000006111c26303c454f59616c717e879298928d837c736d68605d5653514a4a484847464748484a4a5053555d60676d737b838c939892877e716c61594f453c30261c0f06000000000000000000000000000000000000061724313d4a5764707d8a97a2a3988d80736b605c54555455555c606d75828f9caa9f93877a6e6154473b2e211408000000000000000000000000000000000000000009141f29323d47505a626d727e8791969ea5acaba39f9a95908c8885848281818081828385878b8f92989fa2a9ada8a099928d81786d665c50483e33291f100600000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e05000000000000000000000000000009121b232b323a41454c5254565e616466686a6b6b6c6c6c6b6a696764615e5653514a423e3d424a5053565e616467696a6b6c6c6c6b6a686663605d55554f48433d342e271e160d040000000000000000000000010911181e22242c3946525f6c7985929facada093877a6d6054473a2d2d2d2d2d2d2d2d2d2d2d2d201d19130e17202935404b55606d7985929fabb1a7988c7f7265544a3f34281c1003000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c0200000000000000000000000000000006131f2c3845515c677783909daab2a6998c7f7366564d41362a1c11060000000000000002070b0d0d131313131313131313151e252c31343536322f2e2b26201f1c18120b0300000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000e1b2834414e5b6774818e9aa7b3a69a8d8073675a4d4031251a0e02000000000000000000000000000000000000000000020e1a2631414e5b6874818e9ba7b3a79a8d8074675a4d4134271a0e00000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c201304000000000000000000000000000000070f151b1f2222262b38434e586875828f9ba8a79a8d8074675a4d4134271a0e0100000000000000000000131f2c3946525f6c7985929facacacacada1968d80746a60544a3f33291f120900010407070c10121316232f3c4956626f7c8995a2ac9f9386796c605346392d201300000000000000000a151e2a333d47505a626c717d869196959087807a736d6863605c54575554545354545557545c6063676d727a7f8690959691867d716c625a50473d332a1e150a0000000000000000000000000000000a151e2a333d47505a626c717d869196959087807a736d6863605c54575554545354545557545c6063676d727a7f8690959691867d716c625a50473d332a1e150a000000000000000000000000000000000000000714202d3a4753606d7a85929ea89f93887d726d666362616263676d737f8b949ea69d908376685e5246392d2014070000000000000000000000000000000000000000020d17202b353f48515b626c717d848e939da0a7abaca79f9d989892908f8e8d8d8e8f909298979c9fa3aaada9a29f96918780786c665c544a3f362c21170d00000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a00000000000000000000000000000000091119202830353b4146474d525457595b5d5e5e5f5f5f5f5d5c5a5754524c46444039302f383f44464c5254575a5c5e5f5f5f5f5f5d5c595653514b48443d383228231c150c040000000000000000000000000000060d12151f2c3946525f6c7985929facada093877a6d6054473a2d212020202020202020201413110d0f182029323b45515d67727e8b97a2adab9f95887b6e6155483b2e23170c000000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c2013040000000000000000000000000000000004101c2834404b556774818e9aabb5a99c908376685e5246382e23170c0100000000000000000000010606060606060008111e272f373d4042433f3b3a37312d2c29231d150d04000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000101c2936434f5c6976828f9ca9b2a5988c7f7265594c3f322619090000000000000000000000000000000000000000000000091a2733404d5a6673808d99a6b3a89b8e8175685b4f4235281c0f00000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d1104000000000000000000000000000007101920272b2e2f31363e4754606a7885919eabaa998c7f7266594c3f3326190c0000000000000000000000131f2c3946525f6c7985929f9f9f9f9fa59e9184796d60584e42382e21170d02080d111314181c1f201f232f3c4956626f7c89959f9f9f9386796c605346392d20130000000000000000030c18212b353e48505a626b707c848e9399928d85807a75706d666664626160606061626466666d70757a7f858c9298938e847c706b625a50483e352b21180c03000000000000000000000000000000030c18212b353e48505a626b707c848e9399928d85807a75706d666664626160606061626466666d70757a7f858c9298938e847c706b625a50483e352b21180c03000000000000000000000000000000000000000613202c3945515d67727f8c96a1a49a92877f7873706e6e6e7073798088939fa69f948a7e7164564d41362a1e1105000000000000000000000000000000000000000000050e19232d363f49515a626b6f7a818990959c9fa6a9aca9aaa29f9d9b9b9a9a9b9b9c9fa2aaa8acaaa9a19e97928c847c736c665b544a42382e241a0f050000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b020000000000000000000000000000000000070e161e24293036393b4246474a4c4f50515252535252514f4d4a4746413b38342e27262d33383a4146474a4d4f515252535252504f4d4a4745403a38332c272118120b03000000000000000000000000000000000106131f2c3946525f6c7985929facada093877a6d6054473a2d21141313131313131313060b0f151a212a323b444e58606d7984919ea9b2a89d908376695f53463a2d1c11060000000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d110400000000000000000000000000000000000c18232e3e4a5764717e8a99a3afac9f93877b6e61544a3f34281d13070000000000000000000000000000000000040e1a232f3941484d4f504c4847433d3a38342f271f160e040000000000000000000001040606111e2a3744515d6a7784909daaa99c8f8376695c504336291d10060000000000000000000000000000000000101d2a3743505d6a7683909da9b1a4978a7e7164574b3e3124180b00000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2a99c908376695d5043362a1d10000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d0100000000000000000000000000040f19222b32373b3c3f4246505a626f7c8997a1ada298897d7063564a3d3023170a0000000000000000000000131f2c3946525f6c798692939393939393938a7d70675d51463d30261c0f080d13191d202125292b2c2c292f3c4956626f7c89939393939386796c605346392d2013000000000000000000060f19232c363f485059616a6f7a818a919697928c86817d797673706f6e6d6c6d6e6f707376797d81858c929796918a817a6f6a615950483f362c23190f060000000000000000000000000000000000060f19232c363f485059616a6f7a818a919697928c86817d797673706f6e6d6c6d6e6f707376797d81858c929796918a817a6f6a615950483f362c23190f06000000000000000000000000000000000000000004111d2935404b55606d79849197a1a399928b84807d7b7a7b7d80858d939aa4a0968f82766c6155443b3025190e020000000000000000000000000000000000000000000008111b242d373f48505960686d757d83898f94989c9fa3aba7a8aaa8a7a7a7a7a8a9a9a7a5a8a09e9a97918c8580796f6b605b544a423830261c110800000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a100600000000000000000000000000000000000000040c13191e252a2d30363a3b3e4042444445464646454442403e3b3936302c28231c1c22282b3036393a3e40434445464646454442403d3a39352f2c27211b160c070000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0d090e1114171b1f262b333b444c56606a73808c96a1adada1968a7e7164574d42362a1e0a000000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d0100000000000000000000000000000000000714212d3a4754606d7a86929facafa4998c7f72665c50443a2f24181007000000000000000000000000000000030c16202c35414b53595b5c5955534e4a47454039312820160c020000000000000004090e111213131e2a3744515d6a7784909daaa99c8f8376695c504336291d13130807050200000000000000000000000000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1aa9d9083776a5d5044372a1d110000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e130800000000000000000000000000000a15202b343c4347494c4d5359616c75818e9ba9aa9f92867a6d6054473a2d2114070000000000000000000000131f2c3946525f6c7986868686868686868681756c61554b40342b1e150c13191e24292c2d323638393836323c4956626f7c86868686868686796c605346392d20130000000000000000000007111a242d363f474f5860686d747d848c929898928e8a8582807d7b7b7a797a7b7b7d8082858a8e929898928c847d746d675f584f473f362d241a11070000000000000000000000000000000000000007111a242d363f474f5860686d747d848c929898928e8a8582807d7b7b7a797a7b7b7d8082858a8e929898928c847d746d675f584f473f362d241a1107000000000000000000000000000000000000000000010d18242f3a45515d676e7c8592979fa39f96918c89888788898d91979fa49d9691847b6e615a504532291f140800000000000000000000000000000000000000000000000009121b252d363f474f565e616b70787d82878b909299989a9c9d9e9f9f9f9e9e9d9c9b999696918d89857f7a736d676059504a42382f261e140a00000000000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c110800000000000000000000000000000000000000000002080d14191e20252a2d2e31333537383839393938373634312e2d2a251f1c181211171c1f252a2d2e313436373839393938373533302d2c29241d1c160f0a04000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d211919191919191a191e2022272b31373e454d565e686f7c87929fa8b1a79e9184786d6053463b31261a0e0000000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e13080000000000000000000000000000000000000713202c3945525d6876838f9ca9b3ab9e9184796d60554b4035292219100903000000000000000000000000040c151e28323d47535d65686965625f585653514b433a32281e1308000000000000080f151a1d1f2020202a3744515d6a7784909d9f9f9c8f8376695c504336292020201514120e09030000000000000000000000121e2b3845515e6b7884919eabafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9184776a5e5144372b1e1100000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c0100000000000000000000000000030f1b27323c464e545559575f616b707e8a939eaaa3988e8174675d5145392c2013060000000000000000000000121f2b3844515d6974797979797979797979756f65594f433a342e261e191e252a3035393a3f43454645433f3a4754606a6f79797979797979766c5f5346392d2013000000000000000000000009121b242d353e464e565d606b70797f858c91969a97928f8d8a888787868787888a8c8f92979a96918c857f79706b605d554e463d352d241b120900000000000000000000000000000000000000000009121b242d353e464e565d606b70797f858c91969a97928f8d8a888787868787888a8c8f92979a96918c857f79706b605d554e463d352d241b1209000000000000000000000000000000000000000000000007131d2935404b555f6a6f7d858f949c9fa09e999695949596999ea19f9b938e847b6e695e52483e3320170d020000000000000000000000000000000000000000000000000009131b242d353d444c525960656c70767b7f8386898b8d8f9091929292929190908e8c8a8784807c79726d67605d554f443f382f261d140c02000000000000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a00000000000000000000000000000000000000000000000002080e1114191e20212426282a2b2b2c2c2c2c2a29272421201e1914100c07060b0f13191d20212427292b2c2c2c2c2c2a29262320201d1813100b050000000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6054473a2d2525252525262627252a2d2d33373c434750575f686e7a849199a3afaa9f958b7e71665c504438291f140900000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000004111d2935414c5664717e8a97a1adaca0968b7e71675d51453e342b221a140e09060400000101000205060c10161e27303a444f59656f7576726e6a6763605c554c443a3025190d010000000009121920262a2c2c2d2d2d3744515d6a778490939393938f8376695c5043362d2d2d2d22211e1a140e0600000000000000000000121f2c3845525f6b7885929eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c201304000000000000000000000000000006131f2b37434e5860626567696e747d86929fa5a49f92867b6e61554c4135291d11040000000000000000000000101c2935414d5862696c6c6c6c6c6c6c6c6c68655d535246443f383026252a30363a4145474b4f525352504c47454e5860626c6c6c6c6c6c6c6c645a4f43372b1e1200000000000000000000000009121b232c343c434c525961676d737a7f84898e91979899979594939393949597999897918e89847f7a736d676159514c433c342c231b1209000000000000000000000000000000000000000000000009121b232c343c434c525961676d737a7f84898e91979899979594939393949597999897918e89847f7a736d676159514c433c342c231b1209000000000000000000000000000000000000000000000000010c18242f39434e58606b6f7b828a8f94979a9d9e9e9f9f9e9d9a99928f89817a6e695e574d42362c220e0500000000000000000000000000000000000000000000000000000109121b232b323a41464f535b6063696e7276797c7f8182848585868685848483817f7d7b7773706d66605d55514b433d332d261d140b020000000000000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a0100000000000000000000000000000000000000000000000000000205090e11141417191c1d1e1f1f201f1f1e1c1a171414110d08040000000003080d111314171a1c1e1f1f201f1f1d1c1a171413110d070100000000000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6054473a32323232323232333430363a3b3f44464e535a61696e7a839096a1abaea3989083786c60544a3f34281c1003000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c20130400000000000000000000000000000000000000010d19242f3a4653606d7985929ea9b2a89e9184796d605a50463d342a251f1a1313100c070e0e080e1114171c1f283039424c56606b7581837f7b7774706d675e564c4135291d110500000008121b242b313638393939393844515d6a77838686868686868276695c504337393939392e2d2b261f180f06000000000000000000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e110000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d110400000000000000000000000000000815222e3b4754606a6f7274777b81879298a2a39f928c7f72695f53433a2f24190d0100000000000000000000000d1925303b4650585d5f60606060606060605b5e60605f53504a42382e30363a41464c5254585c5e5f5f5c5853514b4e5456606060606060605f5a52493e33271b0f0000000000000000000000000009111a222b313a41454f555d60686d72787d8185888b8d8f919292939292918f8d8b8885817d78726d68605d554f45413a312a221a11090000000000000000000000000000000000000000000000000009111a222b313a41454f555d60686d72787d8185888b8d8f919292939292918f8d8b8885817d78726d68605d554f45413a312a221a1109000000000000000000000000000000000000000000000000000007121d27313c464f5960696e777d82888b8e909192929291908d8b86827d746d685e574d453b30241a100000000000000000000000000000000000000000000000000000000000091019202830363d41495053575e6165676d6f7274757778787979787877767472706e696763605c54514c45403a3128221c140b0200000000000000000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a01000000000000000000000000000000000000000000000000000000000000020507080b0d0f11111213131312110f0d0b080705010000000000000000010507070b0d10111213131312110f0d0a07060401000000000000000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f404042424647495053585f626c717b839095a0a8afa59f92867c6f655b5042382e23170c000000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d1104000000000000000000000000000000000000000008131f2c3845515c6773808c97a1adada1968d80746c61584e463e36302a26201f1c181b1a1b1b191e2023282c313a424a545d68707d898f8c8884807d796d685e5246392d2013070000040f19242d353d424546464646453d4f5b6771777979797979797670665a4e3b44464646463b3a37312a21180e030000000000000000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d100000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000916222f3c4955626f7c7f8084888e9299a29f99928c80746d63574d4231281e130800000000000000000000000008141f2a343e464d51525353535353535761686b6c6c6c605c544a3f353a41464c52565d6065696b6c6b6965605c554e474953535353535353534f4940372c21160a00000000000000000000000000000810191f282f353e434b51565d60666c7074787b7e80828485858685858482807e7b7874706c66605d56514b433e352f281f1910080000000000000000000000000000000000000000000000000000000810191f282f353e434b51565d60666c7074787b7e80828485858685858482807e7b7874706c66605d56514b433e352f281f191008000000000000000000000000000000000000000000000000000000010b151f2a343d474f575e656c70767b7e8183848586858483817e7b756f6b605d564d453b33291f1208000000000000000000000000000000000000000000000000000000000000070e161e252a2f383f44464d5354555c60636567696a6b6c6c6c6b6b6a69686663615e575653504a45413a352f281f17110a020000000000000000000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f1911090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4d4e4d5254535b60636a6e757e859195a0a7afa59d938b7f726a5f53493f30261c1106000000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d01000000000000000000000000000000000000000004101c2834404b55606d7a85929ea7b1a89d928a7e706a60585046423b36312d2c282327272728252a2d2e34383e434c545c666d7a84919c9896918d89857a6d6154473a2e21140700000915202b353f474e5253535353514948555f676a6c6c6c6c6c6c69665e54474851535353534846423c332a1f14090000000000000000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d1000000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e13080000000000000000000000000000000e1a2734414d5a6774808c8d90959b9fa098928e877f746e645b51453c311f160c01000000000000000000000000020d18222c343b4144464646464646505c6873787979796d665c504441454c52565e61686d727678797876726d675f584e464646464646464646433e372e251b1005000000000000000000000000000000070d161e2429313a40454c52545b6063656c6e717476777879797978777674716e6c6563605b54524c4540393129241e160d070000000000000000000000000000000000000000000000000000000000070d161e2429313a40454c52545b6063656c6e717476777879797978777674716e6c6563605b54524c4540393129241e160d070000000000000000000000000000000000000000000000000000000000030d18222b353d454d535b6063696e71747677787978777674716e69636059524c433b332921170d0000000000000000000000000000000000000000000000000000000000000000050c13191d262d33373b4246484b515356585a5c5d5e5f5f5f5f5e5d5d5b595754534d4946443f38352f29241d160d0600000000000000000000000000000000000000000000000000080e171f252a33383d44484d5254545c60626567686a6b6b6c6c6c6b6a6a68666462605c5454524c47433c383229241d160d07000000000000000000000000000000000000000004080a0b1313131313131311110e0b060100000000000000000004090e11121313131313131313070705010000000000000000000000060b0e1011131313131313130a0a0804000000000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d6058585858585858585859595a5b565e6164656c70757c828a9297a0a8afa59e938e81746d62584e41382d1e150a000000000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000c18232e3945525d68727f8c959faaaea49f92867c6f6a625a524d46423c3a38342e343434353036393b3f444650565d666d78828f96a0a8a09e988d8074685e5246392d20130700000e1a26313d4751595e5f6060605e56544f555b5d6060606060605c5a544d53555d6060606055534d453c31261a0e0200000000000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3a89b8f8275685c4f4235291c0f000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c020000000000000000000000000000000e1a2734414d5a6774808d9a9da0a7a0969186817b726d645c53493f332a1f0d04000000000000000000000000000006101a222a303538393939393945525e6b7885868686786d60534a4c51565e61686d737a7f82858685837f796f6a5f584e42382e393939393937332c251c13090000000000000000000000000000000000040c13191f282f353a41454a5053535b60626567696a6b6c6c6c6b6a69676562605b5353504a45413a352f281f19130c0400000000000000000000000000000000000000000000000000000000000000040c13191f282f353a41454a5053535b60626567696a6b6c6c6c6b6a69676562605b5353504a45413a352f281f19130c0400000000000000000000000000000000000000000000000000000000000000060f19232b333b41495053575f6164676a6b6b6c6c6b6a6764615e57544f45413a312921170f0500000000000000000000000000000000000000000000000000000000000000000002080b141b22272b31363a3b404547494c4e4f5152525353525151504e4c4a4846423d3a38342e29241e18130c04000000000000000000000000000000000000000000000000000000050d141a21272c33383b4246474a505355585a5c5d5e5f5f5f5f5e5e5d5b59575553504a4745413a37312b272018130c0400000000000000000000000000000000000000050c11141717202020202020201e1d1b17120c0400000000000000080f151a1d1f20202020202020201413110d080200000000000000040b11171a1d1e20202020202020171614100b0500000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a6d656565656565656565656566676869696e7074787d81878f939ea1a9aca49f938e81786d605b51463c2f261b0c030000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000007121d2935414c56606d78839098a2acaea29892857c716c615e57534d494645404141414141424146474a50535a61686d78818e949fa8b0a69f92857a6d61564c4135291d11050000111d2a36424e59636a6c6c6c6c6b636059514a51535353535353504e50575f626a6c6c6c6c6c5f574d42372b1e1205000000000000000f1b2835424e5b6875818e9ba8b3a6998c807366594d402f24180c00000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4a79a8e8174675b4e4134281b0e0000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c201304000000000000000000000000000000000e1a2734414d5a6774808d9aa5a9aa9e91847d78716c605d554b43392f24180c050000000000000000000000000000000810181f25292b2c2d2d2d3643505d6976839098897c6f635a56555d60686d737a80858b8f9192928f8b847c6f6a5f544a3f34282d2d2d2d2b27211b130a0100000000000000000000000000000000000001080d161d24292f35383f444649505355585a5c5e5f5f605f5f5e5c5a585553504946443f38352f29241d160d080100000000000000000000000000000000000000000000000000000000000000000001080d161d24292f35383f444649505355585a5c5e5f5f605f5f5e5c5a585553504946443f38352f29241d160d080100000000000000000000000000000000000000000000000000000000000000000007111920292f383f44464d5355585b5d5e5f5f5f5e5d5a5854524d48443d352f281f170f05000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f252a2d2f34383a3c3f4142444545464645454443413f3d3b3a36312d2c28231c19130d0701000000000000000000000000000000000000000000000000000000000002090e161c21272c30363a3b3f4446494b4d4f5051525253525251504f4d4a4846443f3a39352f2b26201b160d0701000000000000000000000000000000000000000810171c2123242d2d2d2d2d2d2d2b2a27231d160e06000000000009121920262a2c2c2d2d2d2d2d2d2d21201d19130c050000000000050e161d22272a2a2d2d2d2d2d2d2d2423201c171008000000000000000000000000000000000006131f2c3946525f6c7985929facada093877a72727272727272727272727273737576787a7d8184898e93999ea6ada8a19a938c81786d665c50493f342a1d140a0000000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000d19242f3a44505c666e7b86929aa4afaaa29792867e756e69615f575653514b4e4e4d4e4e4f4c5254545c60646c717a828e939ea6b0a89f948c7f72685e52443a3025190d010000121f2c3845525e6a757979797978706b605c544d4546464646434b515a61696e777979797976695f53463a2d211407000000000000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4035291d100400000000000000000000000000000000000000000005121e2b37424d57697683909ca9b2a5988c7f7265594c3f3226190c00000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d1104000000000000000000000000000000000e1a2734414d5a6774808d95999c9fa096918a847e756d675d554b40352921160b00000000000000000000000000000000060d14191c1f1f20202834414e5b6774818e9a8e81756c656364676d737a80868d92989c9e9f9e9c9691857c6f665c5044382b1f2020201e1b16100901000000000000000000000000000000000000000000040c13181e24292d3338393f4446484b4d4f515252535252514f4d4b4846443f3938332d29241e18120c0400000000000000000000000000000000000000000000000000000000000000000000000000040c13181e24292d3338393f4446484b4d4f515252535252514f4d4b4846443f3938332d29241e18120c04000000000000000000000000000000000000000000000000000000000000000000000000070e171d262d33373b4246484b4e505152535251504e4b4746423b383229241e160d05000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f141a1e2123292c2d303234363738393939383837363533302e2d2a25201f1c17110d0801000000000000000000000000000000000000000000000000000000000000000000050b10161c1f252a2d2e34383a3c3e414244454546464545444342403e3c3a38342e2c29241e1b150f0a04000000000000000000000000000000000000000008121a22282d3031393939393939393837332e2820180e0400000008121b242b31363839393939393939392e2d2a251e160e05000000040e1720272e3336373939393939393931302d28221a11080000000000000000000000000000000006131f2c3946525f6c7985929facb2a5988c7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818385878a8d91969b9fa4ababa39f9691887f776d665c544a3f372d22180b0200000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d110400000000000000000000000000000000000000000000000008131e28343f4a545f69717e88939fa3afa9a298928b827b746e696662605c545b5a5a5a5b5c565e6164666d71767e848f949ea5afaaa1968f82786c60564c4132281e130800000013202c3946535f6c7987868686847d736d665f575146413e454d555c606c717b83868686867b6e6155483b2e221508000000000000000c1825323f4b5865727e8b98abb5aa9d908477675d5145392c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a00000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d01000000000000000000000000000000000e1a2734414d5a67748087898c90949da09e96918a81796d675d51453d33271c10030000000000000000000000000000000002080d101213131825323f4b5865727e8b98938b7f75717071747a80858d92989fa2aaa4a3a5a8a1979083786d6053463a2f24190d13120f0a0500000000000000000000000000000000000000000000000001070d13191c22282b2d3337393b3e41434445464646454443413e3b3937332d2b28221c19130d070100000000000000000000000000000000000000000000000000000000000000000000000000000001070d13191c22282b2d3337393b3e41434445464646454443413e3b3937332d2b28221c19130d07010000000000000000000000000000000000000000000000000000000000000000000000000000050b141b22272b31363a3b3e4143444546454443413e3b3a36302c272119130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214181c1f20232527292a2b2c2c2c2c2b2a2a28262421211e1a1312100c060000000000000000000000000000000000000000000000000000000000000000000000000000050b1014191e2023282c2d2f3234353738383939393837373533312f2d2b2823201d19130f0a0400000000000000000000000000000000000000000005101a242c33393c3e4646464646464644433f39322a20160c0100040f19242d353d42454646464646464646463936302820160c0200000b16202932393f4344464646464646463d3c39332c231a100500000000000000000000000000000006131f2c3946525f6c7985929facb8a79c918c8b8b8b8b8b8b8b8b8b8b8b8c8c8d8e909297979a9ea1a8acaba39f99928d847d736c655c544a42382e241b100600000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d01000000000000000000000000000000000000000000000000010b17232e38424d57616c727f8c919fa3abaaa39f938f86817b76726f6d66696867676768686a686e7174797d838a91969fa6afa9a19891847a6d665b50443a3020160c020000000b1825323e4b5865717e8b9296918780786e69625b524c4550575f676d747e869095948d8074695f53463a2d211407000000000000000916232f3c4956626f7c8999a3afac9f92867a6d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8898a2aeaea298887b6e6155483b2e221508000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e130800000000000000000000000000000000000713202d3a4653606d787b7c7f838990959fa09d938e82796d60594f44382c1f1409000000000000000000000000000000000000000305060815222f3b4855626e7b88959b918b827e7d7e81858c92989fa2a29f9a9796989c9f9f958a7d7164554c4135291d110405020000000000000000000000000000000000000000000000000000000001080d11171c1f22272b2d2f323436373839393938373634322f2d2b27221f1c17110d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d11171c1f22272b2d2f323436373839393938373634322f2d2b27221f1c17110d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f262a2d2e31343738383939383734312e2d2a251f1b160d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070c10131416191b1c1e1f1f20201f1e1e1d1b19171514120e09060300000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e1114171c1f20222527292a2b2c2c2c2c2b2b2a28262422201f1c1713110d080100000000000000000000000000000000000000000000000c17222c363e45494a53535353535353514f4b443c32281d1206000915202b353f474e5253535353535353535346413a32281e13080006111d27323b444a4f51535353535353534a49443e362c22170b00000000000000000000000000000006131f2c3946525f6c7985929facb8ada39c98989898989898989898989898999a9b9c9ea1a9a7aba9a8a19e99928e87817a706b605b534a423930261c12090000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000000000006111c26303c45505a636d737f8b9299a1a8aea59e98928d87837f7c79777674747474747577787a7d81848a90949ea1a9afa8a19792867c6f685e544a3f32281e0e04000000000b1724313d4a56626d73808c9399938d837b726d615e56515a61696e79818a9298958f82786d60574d42372b1e1205000000000000000714202d3a4753606d7a86929facafa399897d7063544a3f33281c0f030000000000000000000000000000000000000004111d2935414c5665727e8b98aab3ab9f9285786c605346392d2013060000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c02000000000000000000000000000000000006121f2b3844505c666d6e6f72767c838f949fa59e948e81746b6054483b31251a0e020000000000000000000000000000000000000000000814212e3a47535f6a7784919d9b948f8b898a8d92989fa2a29f98928d8a898b90949c9c8f8276675d5145392c201306000000000000000000000000000000000000000000000000000000000000000000060b0f12171b1f20222527292b2c2c2d2c2c2b29272522201f1b17120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12171b1f20222527292b2c2c2d2c2c2b29272522201f1b17120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f141a1e212225282a2b2c2c2c2b2a272521201e1a140f0b04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e0f1112121313121211100e0c0a0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205060c10121316181a1c1d1e1f1f201f1f1e1d1c1a17151312100b06040100000000000000000000000000000000000000000000000004111c28333e48505557606060606060605e5c564e44392e23170b010e1a26313d4751595e5f606060606060605f524c443a3025190d010b17222e39444d555b5d60606060606060575550483e33281c1004000000000000000000000000000006131f2c3946525f6c7985929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a8a9a8a6aba39f9c9996918c87817b746d6761595049413930271e140a0000000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000a141e2a333e48515b636d737f8791969fa4acaaa29f9a93908c898684828181808181828385878a8e91979c9fa6adaca59d9691857c6f6a60564c42382d20160c00000000000915212e3a45505a636e74818e939f9590867e756d68605c606c717b838e939f969083796d665c50453c31261a0e020000000000000006131f2c3945515d677783909daab5ab9a8d8073665b5044382b1f140a000000000000000000000000000000000000010c13202c3945525d6875828f9ba8b5a89b8f8275665b5044382b1f120600000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c20130400000000000000000000000000000000000003101c28343f4a545c606162666b6f79828f97a1a69d93897d7063574d42362a1e120500000000000000000000000000000000000000000006121e2b37424e5765727e8b95a09e9c9896979a9fa2a39f98928c85817e7d7e838c929f92867a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000000000000000003060b0f121315181a1c1e1f1f201f1f1e1c1a181513120f0b0603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060b0f121315181a1c1e1f1f201f1f1e1c1a181513120f0b0603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1e1d1b181414110e090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0e0f1112121313121211100f0d0b09070603000000000000000000000000000000000000000000000000000000000814212d3945505a61646c6c6c6c6c6c6c6b6760564b3f33271b0e04111d2a36424e59636a6c6c6c6c6c6c6c6c6c5e564c41362a1d11050e1a27333f4a555f676a6c6c6c6c6c6c6c64615a5044392d201408000000000000000000000000000006131f2c3946525f6c7985929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9c9b99979992908c89847f7b746e69605d554f443f382f271e150c0200000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000000000000020c18212c363f49515b636d727d848e939a9fa6acaca49f9d999992918f8e8d8d8d8e8f909298979a9ea1a9abaca7a09d938e847c6f6a60584e443a2f261c0e05000000000005111d29343f48525b606d78818f959f98928b827a706b676d747e8690959d9891847b6e675d544a3f332a1f1409000000000000000004101d2935404b556673808d99a9b3ab9e9184786c6053463d2f261c1106000000000000000000000000000000000008131e28343f4a54606d7a86929facb1a7988b7e7265544a3f33281c0f03000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d1104000000000000000000000000000000000000000b17232e38424a505354565960676d7a85919eaba59c8f8276695e53463a2d211407000000000000000000000000000000000000000000020e1a26313c4653606c78839097a1a8a4a3a4aaa29f98928d86807a74717072767f8c94998a7d7063574a3d3024170a0000000000000000000000000000000000000000000000000000000000000000000000000000030506080b0e1011121313131211100e0b080605030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506080b0e1011121313131211100e0b0806050300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e101112131211100e0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040613131313131313130d0c0a070200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303c4955616c71797979797979797772675c4f43372a1d1106121f2c3845525e6a75797979797979797976685e5246392d201307101d2a36434f5b67717779797979797979706c6155493c3023160a000000000000000000000000000006131f2c3946525f6c798592939393939393939393939393939393939398929291918f8e8d8b8886837f7c78736e69615f57514c433e332d261d150c0300000000000000000000000000000000000000000000000000000000000000000e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d11040000000000000000000000000000000000000000000000000000000000060f1a242d374049515b626b6f7a818790949b9fa3ababa9aba39f9d9c9b9a9a9a9b9b9d9fa2aaa7ababaca49f9c959189817a6e6a60584e463d32281d140a000000000000010c18222d364044505c666d79829095a09f938f857d746f79818a9298a09992867c6f695e554b42382e21180e030000000000000000000c18242f3c4956636f7c8997a1adada196897d7063584e42382d22170f06000000000000000000000000000000081119242f3844505c66727e8b98a3aeaca095877b6e6154483b2d22170b00000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d010000000000000000000000000000000000000006111c2630383f444647494f555e68727f8c99a3ab9f94877b6e6154483b2e2115080000000000000000000000000000000000000000000009151f2b3844505b666f7c8591969c9f9f9e9c98928d86807a736d686463656d76828f998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d111320202020202020201a1917130e0700000000000000000000000000000000000000000000000000000000000000000000000000000000000002080c101212131313131313131306040000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717e8686868686868684776b5e5144382b1e110613202c3946535f6c7987868686868686867a6d6154473a2e211407111e2a3744515d6a7783868686868686867e7064574a3d3124170a000000000000000000000000000006131f2c3946525f6c798686868686868686868686868686868686868686858585848381807e7c7976736f6c65615e57534d45413a3127221b140b0300000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66737f8c999393939393939084776b6054443a3024190d0100000000000000000000000000000000000000000000000000000000000008121c252e374048515960686d757c83898e92999b9fa2a9a6a8a9a9a7a7a7a7a7a8aaa9a8a6aaa29f9c9a938f89847d746d685f584e463d342b20160b020000000000000006111b2428343f4a545d676d7a839196a19e979188807b838e929fa29f93877d706a5f574d433a30261c0f06000000000000000000000713202d3a4653606d7985919eabb2a89c8f82766a60544a3f3328211810080200000000000000000000000309111a232935414c56606d7884919eaab3a99d908377695e53463a2d1c1106000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e13080000000000000000000000000000000000000000000a141e262e34383a3b3d434c56606d7a86929faca6978a7e7164574b3e3124180b00000000000000000000000000000000000000000000030f1c28333f4a545f6a6f7c848c909292918f8b86807b746e68605d56565b64707d8a998f8275685c4f4235291c0f0200000000000000000000000000050a0d0f10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100f0d0a05000000000000000000000000000000000000000000000105090b0b131313131309090703000000000000000003070b0d0e1313131311100e0a0600000306080913131313100f0d09040004090e111213131313130a090704000000000000000000000000000000000003080b0d0e13131313070604000000000000000005090d0f1013131312110f0c07010000000000000000000000000000000000000000000000000000000000000000040c13181d202d2d2d2d2d2d2d2d2626231f19120a01000000000000000000000000000000000000000000000000000000000000000000000000000000060d13181c1e1f202020202020202013100c07010000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a93939393939184776b5e5144382b1e110613202c3946535f6c7986929393939393877a6d6154473a2e211407111e2a3744515d6a77849093939393938a7d7064574a3d3124170a000000000000000000000000000005121f2b3844515d6974797979797979797979797979797979797979797979787877767573716f6d666662605b53534d47423c352f281f17110a0200000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a8786868686868686867f7265594f4332281e130800000000000000000000000000000000000000000000000000000000000000000a131c252e363f474f565d606a6f767c81868b8e929797999b9c9e9e9f9f9f9e9e9d9d9b999798928f8b87827d78706b605d564e463c342b22190e05000000000000000000091217232e38424b555d686e7b849197a2a19a938d8890959da59d928b7f726b61584e453b31281e140a000000000000000000000006121f2b3844505c6673808d99a4afaa9f94897c6f665b50443d332a2219140e09060400000100000406090e151a232b353d45525d68717e8b96a0acada1978b7e7165574d42362a1e0a000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000000020c141c23282b2d2e313a45525d687783909daaa6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000b17222d38424e585f6a6f797f83858684827f7a736e69615e56524c4a54606d7987868683776a5e5144372b1e11040000000000000000000000030a1016191c1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1c1916100a0300000000000000000000000000000000000000060c1115171820202020201615130f0a040000000001080e13171a1a202020201e1d1a16110b0a0f131516202020201c1b1915100a0f151a1d1f2020202020171614100b050000000000000000000000000001080e14171a1b202020201413100c0701000000020a1015191c1c2020201f1e1b18130c05000000000000000000000000000000000000000000000000000000000000040d161d24292c393939393939393933322f2a241c130a00000000000000000000000000000000000000000000000000000000000000000000000000000710181f24282b2c2d2d2d2d2d2d2d2d1f1c18120b0300000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a979f9f9f9e9184776b5e5144382b1e110613202c3946535f6c7986929f9f9f9f94877a6d6154473a2e211407111e2a3744515d6a7784909d9f9f9f978a7d7064574a3d3124170a000000000000000000000000000003101c2935414d5862696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a6968666462605c545653504946423b373129241e160d06000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e686e797979797979797979726d6256473d3220160c020000000000000000000000000000000000000000000000000000000000000000010a131c242d353d444c525860626a6f757a7e8285888a8d8e909192929292929191908e8c8a8985827f7b75706c656059524c433c332b22191007000000000000000000000006111c263039434c565e696f7c859299a3a49f9a959da0a79e948d80746d62594f463c33291f160c02000000000000000000000003101c28343f4a54616e7b87939fabb0a69d9083786c60594f453c342a251f1a1312100c070e070c1013131a1f262b353d47505a606d7a84919ea8b2a99e9285796d6053473b31251a0e0000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000020a11171c1f20212935414c566774818e9aa7a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000006111c262f3c464e585f676d727678797876726d68615e56524c454145515d67757979797771675b4f43362a1d100400000000000000000000040d151c21262929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292926211c150d0400000000000000000000000000000000000911181d2124252d2d2d2d2d23221f1b160f070000020b12191f2326272d2d2d2d2a2927221c15151b1f22232d2d2d2d292825211b141920262a2c2c2d2d2d2d2423201c1610080000000000000000000000020b131a1f2426272d2d2d2c201f1d18120b0300040c141b212528292d2d2d2b2a28231e170f0600000000000000000000000000000000000000000000000000000000010c161f282f35394646464646464646403f3b352e261c120700000000000000000000000000000000000000000000000000000000000000000000000006101922293035383939393939393939392c29231d150d03000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4acaa9e9184776b5e5144382b1e110613202c3946535f6c7986929facaca094877a6d6154473a2e211407111e2a3744515d6a7784909daaaca3978a7d7064574a3d3124170a0000000000000000000000000000000d1925303b4650585d5f606060606060606060606060606060606060605f5f5e5e5c5b5a585553514b4946443f3836312b261f19130c04000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36414d565e616c6c6c6c6c6c6c6c6c65625b5146342b210e0400000000000000000000000000000000000000000000000000000000000000000000010a121b232b323a41454e54586062686d7175797b7e80818384858586858584848381807e7c7975726e6963605b534f45413a312a21191007000000000000000000000000000a141e27313a444d575f6a707d879299a49f9f9f9fa9a0958f82786d605b51473e342a21170d04000000000000000000000000000b17232e3846535e6975818e99a3aeab9f958b7f726b60574e463e36302a25201f1c181b1a1b181c1f20262b31373f474f59626c74818e97a1adada1978d8073675c514538291f140900000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d110400000000000000000000000000000000000000000000000000060b10121319242f404d5a6673808d99a6a79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000a141d2a343c464e555d6065696c6c6b6965615e56524d46413b35414b555d6b6c6c6c6a675f564b3f33271b0e02000000000000000000030d161f262d3235363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363635322d261f160d0300000000000000000000000000000009121b22292e31323939393939302f2c2721191007010b141d242b303334393939393736332e271f20272b2e2f393939393635312c261e242b3136383939393939302f2c28211a1108000000000000000000010b141d242b303334393939392d2c29241d150d030c161e262d3235363939393837342f2921180f0000000000000000000000000000000000000000000000000000000007131d28313a404553535353535353534d4b4740382e24190e0200000000000000000000000000000000000000000000000000000000000000000000020d18222b343b414445464646464646464638342f271f150b010000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9e9184776b5e5144382b1e110613202c3946535f6c7986929facada094877a6d6154473a2e211407111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000008141f2a343e464d51525353535353535353535353535353535353535352525251504e4d4b494645403c3937332d2a251f1a150d0801000000000000000000000000000000000000000000000000000000000000000000000000000000000e1925303b444d52545f6060606060606060585651493f3422190f00000000000000000000000000000000000000000000000000000000000000000000000000091119202830353d43474e54565e6164656c6e717375767778797979787877767573716f6d6665615f57535049413d352f281f180f070000000000000000000000000000020c151f28323b454e58606b717e8793939393939393969083796d665c50493f352c22190f05000000000000000000000000000006111c2a36424d57616e7b86929fa8b1a79f92877d6f6a5f585046413b36312d2c282327272723282c2d31373c42475159606b717e8b939da9b1a79e92857a6d61554b4034291c1004000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d010000000000000000000000000000000000000000000000000000000306081926323f4c5965727f8c98a5a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000020b18222a343c434b5154595d5f5f5e5c5854524c46423b36302f3a434b515e6060605e5b564d44392e22170b000000000000000000000a151f2831383e424343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343423e3831281f150a000000000000000000000000000006111b242d343a3d3e46464646463c3b38322b23190f08121d262f363c3f414646464644423f3931292b32373b3c4646464643413d3830282d353d424546464646463d3c38332c231a1005000000000000000008131d262f363c4041464646463a39352f271f150b141e2830383e41434646464544403a332a210f050000000000000000000000000000000000000000000000000000010d18242f3a434b515f606060606060605957524a40352a1f13070000000000000000000000000000000000000000000000000000000000000000000008131f29343d464c5152535353535353535345403931271d12070000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4acaa9e9184776b5e5144382b1e110613202c3946535f6c7986929facaca094877a6d6154473a2e211407111e2a3744515d6a7784909daaaca3978a7d7064574a3d3124170a000000000000000000000000000000020d18222c343b41444646464646464646464646464646464646464646464545444342403e3c3a38342e2d2b27221b1a140e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000008141f29323b4146475353535353535353534c4a463f372d2310070000000000000000000000000000000000000000000000000000000000000000000000000000070e161e242932373d43484c5254535b6062646668696b6b6c6c6c6b6b6a6a68666462605c5455534d46443f382f29241e160d0600000000000000000000000000000000030d162029333c464f59616c727f8686868686868686847b6e675d544a3f372d231a1007000000000000000000000000000000000e1a25313b46535f6973808d96a0abaea39991857c6f6a615a524d46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa5afaa9f958b7e71685e5243392f23180c00000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e13080000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000061018222a313a4145474c50525352504c4746413a36302a2528313a414547535353514f4b443b32281d110600000000000000000005101c26313a42494e50505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504e49423a31261c1005000000000000000000000000010c18222d363f454a4b53535353534948433d352b21160e19242f3840474c4d53535353514f4a433b31343d434749535353534f4e49423a30353f474e5253535353534a48443e352c21160b00000000000000030e1a242f3841474c4e535353534745403931271d121b26303a42494e4f53535352504c453c3321170d030000000000000000000000000000000000000000000000000004111d2935404b555d6c6c6c6c6c6c6c6c66635c52473b2f23170a000000000000000000000000000000000000000000000000000000000000000000000c1824303b464f575d5f606060606060605f514b43392f23180c0000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a979f9f9f9e9184776b5e5144382b1e110613202c3946535f6c7986929f9f9f9f94877a6d6154473a2e211407111e2a3744515d6a7784909d9f9f9f978a7d7064574a3d3124170a0000000000000000000000000000000006101a222a303538393939393939393939393939393939393939393939393837363533312f2d2c2823201f1b17110e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d1720293036393b4646464646464646463f3e3a342d251b1100000000000000000000000000000000000000000000000000000000000000000000000000000000040c131920272b32383a41464749505355575a5b5d5e5f5f5f5f5f5e5e5d5b59575653514a4846423b37332d261d19130c04000000000000000000000000000000000000040e17212a343d47505a626d727979797979797979786e695e554b42382e251b1108000000000000000000000000000000000009141f2a36424d57606d79849199a3afaba19791857c716c615e56534d494644404141414141404546494e53575f616d727d869298a3aeaba2989083776c60564c4131271d1207000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000610181f282f35393a3f43454645433f3a3936302a251f191f282f35393a46464644433f39322920160b000000000000000000000a16212d38424c545a5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5a544c42382d21160a00000000000000000000000005111d29343f48505658606060606056544f473d32271b131f2b36404a52585a606060605d5b554d43393d464e5456606060605c5a544c42333d4751595e5f6060606057554f473e33281c100400000000000008141f2b36414a52585a6060605f5e514b43392f2418212d38424c545a5c6060605e5c574f4533291f1409000000000000000000000000000000000000000000000000000613202c3945515d677679797979797979736e63574b3f3226190c00000000000000000000000000000000000000000000000000000000000000000003101c2835414c5761696c6c6c6c6c6c6c6c6c5c554b4034291c100400000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a93939393939184776b5e5144382b1e110613202c3946535f6c7986929393939393877a6d6154473a2e211407111e2a3744515d6a77849093939393938a7d7064574a3d3124170a00000000000000000000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2b2928272522201f1c1813120f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171f252a2d2e39393939393939393932312e29231b1309000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d151b21272c3035393a3f4446484b4d4e505152525352525151504e4d4b494644403b3a36312b27221b140b08010000000000000000000000000000000000000000050f18222b353e48515b62656c6c6c6c6c6c6c6c6b615e574d433a30261c1309000000000000000000000000000000000000030e1a26313b45515d676f7c87929fa4aea9a19791867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa39992857c6e655b50443a301f150b010000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c201304000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000000000060d161d24292c2d323639393836322e2d2a251e19140d161d24292c2d3939393736332e2820170e04000000000000000000000d1926323e49545e666969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969665e54493e3226190d0000000000000000000000000915212e3a45505a62656c6c6c6c6c6360594f43382c1f1723303c47525c64676c6c6c6c6a675f554a3f434e5860626c6c6c6c69655e54453b424e59636a6c6c6c6c6c6361594f44382c2014070000000000000b1724303c47525c64676c6c6c6c6a5d554b4035291d25323e49545e66696c6c6c6b686157453b31251a0e020000000000000000000000000000000000000000000000000714202d3a4753606d7986868686868686807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000005121e2b3844515d6973787979797979797976675c5145382c1f130600000000000000000000000000000000000000000000000000000000000b1724313e4a5764717e8686868686868684776b5e5144382b1e110613202c3946535f6c7987868686868686867a6d6154473a2e211407111e2a3744515d6a7783868686868686867e7064574a3d3124170a000000000000000000000000000000000000060d14191c1f1f202020202020202020202020202020202020201f1f1f1e1d1b1a18161313100c070503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212c2d2d2d2d2d2d2d2d2524221e1811090100000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f161b1e25292d2d3337393b3e40424344454646464545444342403e3c3a38342e2d2a261f1b17110a020000000000000000000000000000000000000000000000061019232c363f4951565860606060606060605e54524d453b31281e140a010000000000000000000000000000000000000009141f2935404b55606a717e8b929ca4afa9a198928a817b746e696562605c545b5a5a5a5b545c6063666a6e747b828b9299a2aaaca49f92877d706a5f53493f32281e0d030000000000000000000000000000000000000000000000000003090e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d1109030000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000040c13181d2021262a2c2c2b292521201d19130e09040c13181d20212d2d2d2b2a27221d160e0500000000000000000000000f1c2935424e5a6670767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767670665a4e4235291c0f0000000000000000000000000b1724313d4a56626c7179797979796f6b6054483b2f221a26333f4c58646e74797979797771675b4f424754606a6f79797979767065574d4245525e6a757979797979706b6155483c2f2316090000000000000d1a2633404c58646e747979797975675d5145392c1f2835414e5a667076797979787368574d42362a1e12050000000000000000000000000000000000000000000000000714202d3a4753606d7a8693939393938c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c788586868686868686796d6053473a2d20140700000000000000000000000000000000000000000000000000000000000a1723303c4955616c71797979797979797772675c4f43372a1d1106121f2c3845525e6a75797979797979797976685e5246392d201307101d2a36434f5b67717779797979797979706c6155493c3023160a0000000000000000000000000000000000000002080d1012131313131313131313131313131313131313131313121211100f0d0b09070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e111414202020202020202020191816120d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13191d2022272b2d2f313335363838393939383837373533312f2d2c2823211e1a140f0b06000000000000000000000000000000000000000000000000000007111a242d373f464a4c5353535353535353524846423b33291f160c020000000000000000000000000000000000000000030c18242f39434e58626d73808d929fa4acaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39a938c7f726b61584e41382d20160c00000000000000000000000000000000000000000000000000050d141a1e212b3844505b66737f8c999393939393939084776b6054443a30241e1a140d0500000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000000000000001070d111314191d1f201f1d191413110d0802000001070d1113142020201e1d1b17110b04000000000000000000000000101d293643505c6976828383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838276695c504336291d100000000000000000000000000b1825323e4b5865717e86868686867d6f6356493c30231a2734414d5a6774808686868683776a5d51404b55626f7c868686868276695e534646535f6c7987868686867d7063574a3d3024170a0000000000010e1b2734414e5a67748086868687796d6053473a2d202936434f5c6976828686868578695e53463a2d2114070000000000000000000000000000000000000000000000000714202d3a4753606d7a86939f9f9f998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929393939393867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000814212d3945505a61646c6c6c6c6c6c6c6b6760564b3f33271b0e04111d2a36424e59636a6c6c6c6c6c6c6c6c6c5e564c41362a1d11050e1a27333f4a555f676a6c6c6c6c6c6c6c64615a5044392d201408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507081313131313131313130c0b090601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113171b1f20222427282a2b2c2c2c2c2c2b2b2a28262423201f1c1814120e0903000000000000000000000000000000000000000000000000000000000008121b252d343a3e3f4646464646464646453b3a36302921170d040000000000000000000000000000000000000000000007121d27313d46505a636e73808c939aa1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6afa8a09992887f726d62594f463c2f261b0e04000000000000000000000000000000000000000000000000050f171f252a2d2e333f4a54616e7a8786868686868686867f7265594f43322e2d2a251f170f05000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000000010406070c10121312100c070705010000000000000104060713131311100e0b06000000000000000000000000000013202d394653606c79868f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f86796c605346392d20130000000000000000000000000b1825323e4b5865717e8b939393897c6f6356493c30231a2734414d5a6774808d93939084776a5d5145515d6774818e939393877b6e61544a3f535f6c79869293938a7d7063574a3d3024170a0000000000000b1825313e4b5864717e8b9399897c6f6356493c30232633404d596673808c9397877b6e6154483b2e2115070000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0aca6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929f9f9f9f93867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000004111c28333e48505557606060606060605e5c564e44392e23170b010e1a26313d4751595e5f606060606060605f524c443a3025190d010b17222e39444d555b5d60606060606060575550483e33281c1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105060b0f121315181a1b1d1e1f1f201f1f1e1e1d1b1a18161312100c070502000000000000000000000000000000000000000000000000000000000000000009131b23292e31323939393939393939382e2d2a251f170f050000000000000000000000000000000000000000000000010b151f2b343f48525c646e737f8892979ea5acaaa29f9a93908c898684828181808181828486898c90959b9fa3ababa39f9691877e726d635b51473e332a1d140a000000000000000000000000000000000000000000000000030d17212931363a3b464646525e686e797979797979797979726d62564746463b3a36312921170d030000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202d394653606c7986939c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9386796c605346392d20130000000000000000000000000b1825323e4b5865717e8b989f96897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d514753606d7a85929fa4998c8073665c5044535f6c7986929f968a7d7063574a3d3024170a0000000000000915222f3c4855626f7b8898988c7f7265594c3f302424303d4a5763707d8a96978a7e7164574a3e2e23180c0000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabaca093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000c17222c363e45494a53535353535353514f4b443c32281d1206000915202b353f474e5253535353535353535346413a32281e13080006111d27323b444a4f51535353535353534a49443e362c22170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060809131313131312070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105090b0b1313131313130d0d0b07070b0d0d1313131313130b0b09050100000000000000000000000000000000000000000000000000000000000000000000030506080b0d0f101112131313121211100f0d0b09070604000000000000000000000000000000000000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2d2b21201e1a140d0500000000000000000000000000000000000000000000000000030d19222d36404a525c646d727d858f939da0a7acaca49f9c989892918f8e8d8d8d8e8f919299999da0a7acaca49f99928d847d716c635b51493f352c21180b0200000000000000000000000000000000000000000000000009141f29333b4246485353534d565e616c6c6c6c6c6c6c6c6c65625b515353534846423b33291f14090000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000000000003070b0d0e13131313131312100d0a06050300000000000000000000000000000000000000000000000000000013202d394653606c7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9386796c605346392d20130000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d514e5764717e8b98a2ab9e9184796d605346535f6c7986929f968a7d7063574a3d3024170a0000000000000613202d394653606c7985929b8e817568564c413529212e3a4754616d7a87969a8d807467544b4034281c100400000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000005101a242c33393c3e4646464646464644433f39322a20160c0100040f19242d353d42454646464646464646463936302820160c0200000b16202932393f4344464646464646463d3c39332c231a100500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f12151520202020201f1413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c111517182020202020201a1917131317191a202020202020181715110c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d1216181920202020202020201f1514120e090200000000000000000000000000000000000000000000000000000007101b242e38404a525b636b707a828990959c9fa4abaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3abaaababa39f9a938f8780796f6b615a51493f372d231a0f06000000000000000000000000000000000000000000000000020e1a25313b454d535f6060606060605d5f60606060606060605c6060606060605f534d453b31251a0e0200000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000000000000000001080e13171a1a20202020201f1e1d1a1613120f0b060000000000000000000000000000000000000000000000000013202d394653606c798693939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939386796c605346392d20130000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d51535f6a7683909caaa9a1978a7d7064574d535f6c7986929f968a7d7063574a3d3024170a00000000000006121f2b3844505b6676838f9c918477685d5246392d202d3946525e687884919d908376665c5145382c1f130600000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000008121a22282d3031393939393939393837332e2820180e0400000008121b242b31363839393939393939392e2d2a251e160e05000000040e1720272e3336373939393939393931302d28221a110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151b1f21222c2d2d2d2d2c21201d19130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000911181d2124252d2d2d2d2d2d2726231f1f2326272d2d2d2d2d2d2524211d1811090000000000000000000000000000000000000000000000020608080b0e1011121313131312100f0d0a0706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c1313131313131313120807050200000000000000000000000000000000000000000000000000000000000009121c262e384049515961686e757d83898f93999c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a19e9b99928e87827c736d67605950483f372d251b11080000000000000000000000000000000000000000000000000005121e2a36424d575e6c6c6c6c6c6c6c6a665f55535353545e66696c6c6c6c6c6c6c5e574d42362a1e120500000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2c2b2a2723201f1b17110a02000000000000000000000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c605346392d20130000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d4a54626e7b88949f9f9c9f9c8f8276695e53535f6c7986929f968a7d7063574a3d3024170a000000000000030f1c28333f4a546773808d9a96877a6d6154473a2e212a36414c566875818e9b9286796d6053463a2d20130700000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000810171c2123242d2d2d2d2d2d2d2b2a27231d160e06000000000009121920262a2c2c2d2d2d2d2d2d2d21201d19130c050000000000050e161d22272a2a2d2d2d2d2d2d2d2423201c1710080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101820262b2e2f3939393939382e2d29251e160e04000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b22292e313239393939393934332f2b2b2f333439393939393932312e29221b1209000000000000000000000000000000000000000306090f121415181a1c1e1f1f20201f1e1d1c19171413100d0704000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141c262e373f474f565e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817b756f6a605d554f473e362d251c130900000000000000000000000000000000000000000000000000000714212d3a46535e69767979797979797771665b4f464e5a66707679797979797976695e53463a2d21140700000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000000000000010b141d242b303334393939393939383734302d2b27221b140b080000000000000000000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979766c5f5346392d20130000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d515c6673808d9a9f948f949f93877b6e61544a5f6c7986929f968a7d7063574a3d3024170a000000000000000b17222d3e4a5764717d8a9796897d7063564a3d302325303f4c5965727f8c9898897c6f6256493c2f23160800000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000050c11141717202020202020201e1d1b17120c0400000000000000080f151a1d1f20202020202020201413110d080200000000000000040b11171a1d1e20202020202020171614100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e18222a31373a3c4646464646453a3935302820160c0200000000000000000000000000000000000000000000000000000000000000000000000000000006111b242d343a3d3e464646464646403f3b36363b3f404646464646463e3d3a342d241b110600000000000000000000000000000000040a0f13151a1f21222527292a2c2c2d2c2c2b2a28262320201d1813100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c0906060300000000000000000000000000000000000000000000000000000000000000020a141c252e353d444c525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817d7a746e6a626058514b433d352c241c130a0100000000000000000000000000000000000000000000000000000815212e3b4854616e7b86868686868683776a5d50444f5c6976828686868686867b6e6154483b2e21150800000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000000000000008121d262f363c3f414646464646464543403d3937332d261d1a110a010000000000000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e120000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d53606d7985929e978f828f99998c8073665c505f6c7986929f968a7d7063574a3d3024170a000000000000000615212e3b4854616e7b8797998c7f7366594c40302523303c4956636f7c8999988b7f7265584c3f3025190d01060606000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000004080a0b1313131313131311110e0b060100000000000000000004090e11121313131313131313070705010000000000000000000000060b0e1011131313131313130a0a08040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c4347485353535353524746413a32281e13080000000000000000000000000000000000000000000000000000000000000000000000000000010c18222d363f454a4b5353535353534d4c474040474c4d5353535353534b4a453f362d22180c0100000000000000000000000000040a0f151b1f21262b2e2f32343637383939393938373533302d2c29241f1c18120c0700000000000000000000000000000000000000000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b06000000000000000000000000000000000000000000000000000000000000020a131c232c323b41464f54596063686e7276797c7e808283848585868585848382807d7b7974716d68625f58544e454039312b231a120a010000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87939393939083776a5d50444f5c6976828f93939393877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a79b8e8174685b4e4135281b0709080603000000000000000000000000000000000000000000000000030e19242f3840474c4d53535353535251504d4946443f382f2b231c130a01000000000000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5a52493e33271b0f0000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d5764707d8a979e92857a86929e9184796d60535f6c7986929f968a7d7063574a3d3024170a000000000000030714212d3a46535e697885929b8f827568574d42362a202d3a4753606d7a86929b8e817568564c41362a1d11131313130b0b09050100000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c464e53555f606060605f54524c443a3025190c030000000000000000000000000000000000000000000000000000000000000000000000000005111d29343f485056586060606060605a58524a4a52585a606060606060585650483f34291d1105000000000000000000000001070d161b20262b2e31373a3b3e4143444546464646454342403d3a39352f2c28231d18120b030000000000000000000000000000000000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a0300000000000000000000000000000000000000000000000000000000010a111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433c352f271f19110800000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87949f9f9d9083776a5d50444f5c6976828f9c9f9f94877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a89b8e8275685b4f422f2418191615130f0a040000000000000000000000000000000000000000000007131f2b36404a52585a60606060605f5e5d5a56535049413d352e251c130a000000000000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534f4940372c21160a0000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5d5e6975828f9c9a8d8075828f9b978a7d7064575f6c7986929f968a7d7063574a3d3024170a0000000001090f14181e2a36424d576975828f9c918578695e52463a2d202c3845515d677783909d918477685e5246392d202020202020181715110c06000000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0e1111131313131313131308070502000000000000000000000105090b0c13131313131313130f0e0c08040000000000000000000000000000000000000000000000000004090c0e0f131313131313130c0b09060100000000000000000000000000000004090c0e0f1313131313131310060503000000000000000006121f2b37434e585f626c6c6c6c6c6b615e564c4135291e150b000000000000000000000000000000000000000000000000000000000000000000000000000915212e3a45505a62656c6c6c6c6c6c67645c52525c64676c6c6c6c6c6c65625a50453a2e21150900000000000000000000040c131820272b32373b3c4347484b4d4f51525253535251504f4c4a4745403a38342e28231c150c070000000000000000000000000000000000000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e090300000000000000000000000000000000000000000000000000000000080e171e252a32383d44484d5254545c60626567686a6b6b6c6c6c6b6a6a68666462605c5454524c47433c373229241d150d070000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aa9d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a99c8f827669554b403529252522221f1b150e070000000000000000000000000000000000000000000b1723303c47525c64676c6c6c6c6c6c6b6a6763605b534f473f372e251c100700000000000000000000000000000000000005101b252e373e4346464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646433e372e251b10050000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a53616e7b87939f95887c707d8a979c8f8276695e5f6c7986929f968a7d7063574a3d3024170a000000030b131a2024272531404c5966737f8c9997877b6e6154483b2e2d2935404b556774818d9a96877a6d6154473a2e2d2d2d2d2d2d2524211d1811090000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000040b12171b1d1e20202020202020201514120e090300000000000000060c1115171820202020202020201b1b18140f090100000000000000000000000000000000000000000002091015191b1c20202020202020191816120d0700000000000000000000000002091015191b1c202020202020201c13120f0b060000000000000815212e3a47535f6a6f7979797979786d685e52463d30271c12070000000000000000000000000000000000000000000000000000000000000000000000000b1724313d4a56626c71797979797979736e645858646e73797979797979716c62564a3d3124170b000000000000000000060d161d242932383c4347494e5355585a5c5d5f5f605f5f5e5d5b595653514b46454039342e271e191009010000000000000000000000000000000000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b0600000000000000000000000000000000000000000000000000000000050d141921272c33383b4146474a505355585a5c5d5e5f5f5f5f5e5e5d5b59575553504a4745413a37312b272018120b03000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1a99d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4aa9e918477675d5145392f32322f2e2b262019100700000000000000000000000000000000000000000d1a26333f4c58646e74797979797979787673706c656059514940372e22190f0400000000000000000000000000000000000009131c252c33373939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393937332c251c1309000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a5b65737f8c999d9083766d7985919e93877b6e615f6c7986929f968a7d7063574a3d3024170a0000010b151d252b303435393d4a5763707d8a96978a7d7064574a3d2d39392f3e4b5864717e8b97968a7d7063574a3d2d39393939393932312e29221b120900000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000060e161d23272a2b2d2d2d2d2d2d2d2d22211e1a140e0600000000000911181d2224252d2d2d2d2d2d2d2d282724201a130b0300000000000000000000000000000000000000030c141b212528292d2d2d2d2d2d2d2625221e18110901000000000000000000030c141b212528292d2d2d2d2d2d2d29201f1b17110a02000000000915222f3c4855626f7c8786868686857a6d61594f42392e23180c0300000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8686868686868073675a5a6773808686868686867e7165584b3e3225180b0000000000000000060f181f282f353d43474e5355585f626567696a6b6c6c6c6c6b6a686663605d5553514b444039302b221b130b020000000000000000000000000000000000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a0200000000000000000000000000000000000000000000000000000002080e161c21272c3036393b3f4446494b4d4f5051525253525251504f4d4a4846443f3a39352f2b26201b150c070100000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87949c9c9c9083776a5d50444f5c6976828f9c9c9c94877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97acac9f93867a6d605347403f3f3f3c3b37322a22190e04000000000000000000000000000000000000000e1a2734414d5a6774808686868686858483807d78706b635b514940342b20160a000000000000000000000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a01000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a606c7884919e988b7e716673808d9a998c8073665c6c7986929f968a7d7063574a3d3024170a000009131d272f373c404146464754616d7a8796998d80736653493f46464646464855626e7b8898998c807366544a3f464646464646463e3d3a342d241b1106000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000e1820282e33363839393939393939392e2d2b261f180f0600000009121b23292e313239393939393939393534312c251d150b000000000000000000000000000000000000020c151e252c3134353939393939393932312e29231b13090000000000000000000c151e262c31343539393939393939362d2b27221b140b020000000815212e3a47535f6a73808d9693978e81746b60544a4034281f140900000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b939393938d8073675a5a6773808d939393938b7e7165584b3e3225180b00000000000000061018212a313a40454e54585f62676a6e71747677787979797978767573706d6764605c54514a423d342d251d140b01000000000000000000000000000000000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b0300000000000000000000000000000000000000000000000000000000050b10161c1f252a2d2e34383a3c3e414244454546464545444342403e3c3a38342e2c29241e1a150f0a04000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f83776a5d50444f5c6976828f8f8f8f8f877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000a1623303d495663707c899aa4afa4998a7e71645b514b4c4c4c4947433c342a20150a000000000000000000000000000000000000000e1a2734414d5a6774808d939393989291908d89837d726d635b51463d32271b0f04000000000000000000000000000000000000010910161b1e202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201e1b1610090100000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a63707d89969f92857a6d626f7b88959e9184796d606c7986929f968a7d7063574a3d3024170a00030f1a252f3941484d4e535353525e687884919c8f8276655b505353535353535353606c7985929c8f8276665b5053535353535353534b4a453f362d22180c010000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000060f202a32393f434446464646464646463b3a37312a21180e030006111b242d343a3d3f464646464646464642403d372f271d0b02000000000000000000000000000000000009141e2730373d4142464646464646463f3e3a352d251b0f060000000000000008121e2730373d414246464646464646433937332d261d140a00000006121f2b37434e58606d7984919e9f93887d6f665c51443b31261a0d04000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b989f9f9a8d8073675a5a6773808d9a9f9f988b7e7165584b3e3225180b000000000000050e18222a333c434b515860626a6f74787b7e80828485858686858483827f7d7a76716d66605c544e463f372e261d130a0000000000000000000000000000000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d030000000000000000000000000000000000000000000000000000000000050b1014191e2023282c2d2f3234353738383939393837373533312f2d2b2823201d19130f0a030000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8283838383828074675a4e414d5a6673808283838383827a6e6154473b2e21140800000000000000000000000000000000000000000000000000000714212d3a4754606d7a86939facab9c9083766d605d5559585855544e463c32261b0f030000000000000000000000000000000000000e1a2734414d5a6774808d9a9f9fa29f9e9d9a9590887f726d63584e43372b20150a0000000000000000000000000000000000000000050a0f1213131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313120f0a05000000000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a6875818e9b9a8e8174675f6a7683909d978a7d70646c7986929f968a7d7063574a3d3024170a000814202b37414b53595b60606060566875828e9b9285796c606060606060606060605b6576838f9c9285796c60606060606060606060585650483f34291d11050000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000030d1821323c444b4f5153535353535353534846423c332a1f1409010c18232d363f454a4b53535353535353534e4d4841392f1d140a0000000000000000000000000000000004101b25303942494d4f535353535353534c4a463f372d21180b020000000000050e1a24303942494d4f535353535353534f46443f382f261b11060000030f1b26313c45515d67707d8a939e9a9183786d60574d42362a1f160c010000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000020b17202a343c454d555d606a6f767c8084888b8d8f90929293929291908e8c8986827e79726d666058514940382e251c1108000000000000000000000000000000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d0300000000000000000000000000000000000000000000000000000000000002080e1114171c1f20222527292a2b2c2c2c2c2b2b2a28262422201f1c1713110d080100000000000000000000000000000000000000000000000000000000000000000000000000000714202d3946525e686e767676767676746e64584c404b58636e737676767676766e685e5246392d20140700000000000000000000000000000000000000000000000000000713202c3945525d687784919dabab9f948b7f736d6766656565625f584e43372b1f13060000000000000000000000000000000000000e1a2734414d5a6774808d98989a9c9fa3aba7a09a938c7f726a6054473d32271b0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a6d7a86929f95897c6f635865727e8b989c8f8276696c7986929f968a7d7063574a3d3024170a000c1824303c48535d64686c6c6c6c6c6c727f8c9897887b6e6c6c6c6c6c6c6c6c6c6c6c6c73808d9998887b6f6c6c6c6c6c6c6c6c6c6c65625a50453a2e2115090000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000009141f2933444e565c5e606060606060606055534d453c31261a0e05111d29343f4851565860606060606060605b59534b412f261b11060000000000000000000000000000000915212c37424b53595c60606060606060595651493f332a1d140a00000000020d17202c36424b54595c606060606060605c53504941382d22170b0000000a15202935404b55616b75818e98a0958c7f72695f53463e31281e13080000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000a141d29333c464e575f676d747c82888d9196989a9c9d9e9f9f9f9f9e9d9b9999928f8a847f786f6a625b524a40372e231a0e0500000000000000000000000000000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b01000000000000000000000000000000000000000000000000000000000000000205060c10121316181a1c1d1e1f1f201f1f1e1d1c1a17151312100b0604010000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e6169696969696967645c52473c47525c6366696969696969615e564c41362a1e1105000000000000000000000000000000000000000000000000000004111d2935414c566673808d99a3afa69f9388807a75737272726f6a5f54473b2e2215080000000000000000000000000000000000000e1a2734414d5a6774808b8b8c8d9092999ea5aca49f92877c6f62584e43372b1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000060b0e101113131313131313110605030000000000000000000000000000000000000000000000000000000000000000000000000001040707131313131313131308070502000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a727f8b989d9184776b6054606d7a86929f93877b6e6c7986929f968a7d7063574a3d3024170a000e1a2734404d59646f74797979797979797d8996978a7e79797979797979797979797979797e8a97988b7e7979797979797979797979716c62564a3d3124170b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000020e1a26313b455660676b6c6c6c6c6c6c6c6c6c5f574d42372b1e120915222e3a45515b62656c6c6c6c6c6c6c6c68655d5341382d22170b0000000000000000000000000000000c1925313d49535d65686c6c6c6c6c6c6c65625b51453c2f261c110600000008141e29323e48545d65686c6c6c6c6c6c6c69605b53493f33271b0f030000040c18242f39434f59616e7b85929f9f92867b6e615a50433a2f24190c0200000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000006111b262f3b454e585f696e7981878f949a9ea1a8a7a9aaaaaaa9a9aaaba9a8aba39f9c97918c847c726d645c524940362c20170c0200000000000000000000000000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d12070000000000000000000000000000000000000000000000000000000000000000000000030607090b0e0f1112121313121211100f0d0b090706030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5a58524a4136404a52585a5c5c5c5c5c5c54524c443b3025190d010000000000000000000000000000000000000000000000000000010d1924303b4854616e7b87929fa7afa49a938d8582807f7f7f7c6f6255493c2f221609000000000000000000000000000000000000091623303c4956636f7d7f7f7f8083868f939ea5afa3999083766a6054473b2e2215070000000000000000000000000000000000000000000000000000000000000000000000000000040b11171b1d1e202020202020201e13120f0b0600000000000000000000000000000000000000000000000000000000000000000002080d11131420202020202020201514120e090300000000000000000000000000000000000000000b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776a7783909d998c7f726559515d6774818e9a998c8073667986929f968a7d7063574a3d3024170a000e1b2835414e5b68748186868686868686898f999a908a86868686868686868686868686868a909a9b908b86868686868686868686867e7165584b3e3225180b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d57677277797979797979797976695f53463a2d21140b1724313d4a56626d727979797979797979756f6553493f33271b0f0300000000000000000000000000020e1b2834414d59656f7579797979797979726d62574d42382d22170b0200050e1925303b44505a656f7579797979797979766c655b5044372b1f120500000007121d27313e46525e69727f8b959f988f82756c61554c4135291e140a00000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000b17222d38414d575f6a6f7b848e939a9fa6abacaaaaa39f9e9d9c9c9d9ea1a9a7acaca9a19e9691877f746e645b52483e32291e13080000000000000000000000000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008141e29323b4146475050505050504e4c4741382f3840474b4d5050505050504746413b32291e1408000000000000000000000000000000000000000000000000000000000814212d3a46535e6974808d959fa7aca49f98928f8d8c8b8b7f7266594c3f3326190c0000000000000000000000000000000000000915222f3b4854606b6f72727273767b818e939ea9ab9f95897c6f6256493c2e23180c00000000000000000000000000000000000000000000000000000000000000000000000000050e161d22272a2b2d2d2d2d2d2d2d2b201f1b17110a02000000000000000000000000000000000000000000000000000000000000040c13191d20212d2d2d2d2d2d2d2d22211e1a140e06000000000000000000000000000000000000020b1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d9084776f7c88959f92867a6d61544b55626f7c89959e9184796d7986929f968a7d7063574a3d3024170a000e1b2835414e5b6874818e9393939393939699a1a29a979393939393939393939393939393979aa2a29b98939393939393939393938b7e7165584b3e3225180b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000714212d3a46535f69778486868686868686867b6e6155483b2e2215091825323f4b5865727f86868686868686868175655b5044372b1f120500000000000000000000000000020f1c2935424f5c687582868686868686867f72695f544a3f33281d140a020c17202a36414c56616c75818686868686868682796c605346392d201306000000010b151f2a36424d56606c788390999e948a7e71675d51453c30261c1106000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000030f1b27333f49535e696f7c8591969fa4acaca7a09d98989291908f90909197979b9fa2aaada8a099928c80746e635a50443a3025190d03000000000000000000000000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d02000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d1720293036393b43434343434341403c362f262e353b3f404343434343433b3936302920170d020000000000000000000000000000000000000000000000000000000005121e2a36424d57606d798390959fa2aaaaa29f9b9998988c7f7266594c3f3326190c00000000000000000000000000000000000007131f2c38434f59606365656567696e78818e97a1ada79a8d807467554b4034281c10040000000000000000000000000000000000000000000000000000000000000000000000000e1720282e33363739393939393939382d2b27221b140b0200000000000000000000000000000000000000000000000000000000040e161e24292c3939393939393939392e2d2b261f180f0600000000000000000000000000010507070f0f1825323e4b5865717e8b98a296897c6f6356493c30231a2734414d5a6774808d9a9d90847774808d9a9b8e8275685e524754606a7783909d978a7d707986929f968a7d7063574a3d3024170a000e1b2835414e5b6874818e9b9f9f9f9f9f9fa0acafa6a49f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a3a8a6a49f9f9f9f9f9f9f9f9f988b7e7165584b3e3225180b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b88969393939393938b7e7165584b3e31261a121e2a36424d576875818e9393939393939285786c605346392d20130800000000000000000000000000000714212e3a4754616d7a85919393939392867b6e665b50443c2f261c1108131e29323a46525e68717e8a939393939392857a6e655b5044372b1f120500000000030d1925303b44505b666f7c87929f9e91847a6d60584e42382e23170b020000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000005121f2b3744505b656e7b849197a0a8afa7a09d95908b8885848383838485878a8e92989fa3ababa39f928c80736c61564c41362a1f140900000000000000000000000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e140800000000000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e09060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e3636363636363433302b241d242a2f32333636363636362e2d2a251e170e050000000000000000000000000000000000000000000000000000000000020e1a25313b45515c676d7a838c92989b9d9e9fa39f9f998c7f7266594c3f3326190c000000000000000000000000000000000000030f1b27323d474f5456585859575e666d7a85929eabaa9d908377675c5145382c1f130600000000000000000000000000000000000000000000000000000000000000000000000711202932393f434446464646464646443937332d261d140a000000000000000000000000000000000000000000000000000000020c1620283035394646464646464646463b3a37312a21180e030000000000000000000002080d1113141c1c1c25323e4b5865717e8b98a296897c6f6356493c30231c2734414d5a6774808d9a9d9084777985929e96897d7063564c434e5865727e8b989c8f82767986929f968a7d7063574a3d3024170a000e1b2835414e5b6874818e93939393939393939fa3a59d9b939393939393939393939393939394979ea49d9a9393939393939393938b7e7165584b3e3225180b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000030d152c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a5465727e8b98a89f9f9f9f9b8e817568574d42372b1e14212d3a46535f697884919e9f9f9f9fa197887c6f6255493c2f24190d01000000000000000000000000000713202d3946525e68707d8a929da8a2989083786c60574d42382d22170e1925303a44505a616e7a85929ea5a89d938a7d70685e53493f33271b0f03000000000009141f28333f4a545f6a74808d96a1978d80746a60544a3f34281f14090000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000004101c2834404a54606c77828f96a1a9aea49d959189837f7c797777767677787a7d81868c9299a0a8afa49c928a7e70685e52463b31251a0e0000000000000000000000000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e02000000000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212929292929292726241f1a13191f23262729292929292921201e19140d050000000000000000000000000000000000000000000000000000000000000009141f2934404b555e686d7980858b8e909192999393938c7f7266594c3f3326190c000000000000000000000000000000000000000a16212b353d4348494c4c4c4d545d6873808c99abac9f9286796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000050f1923323b444b4f51535353535353535146443f382f261b1106000000000000000000000000000000000000000000000000000008131e28323a41455353535353535353534846423c332a1f1409000000000000000000040c13191d202128282828323e4b5865717e8b98a296897c6f6356493c3028282834414d5a6774808d9a9d9084777d8a979e9184786c6053463d4754606d7a86929f93877b7986929f968a7d7063574a3d3024170a000e1b2835414e5b68748186868686868686868692999d938e8686868686868686868686868686878c979d928d868686868686868686867e7165584b3e3225180b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000010b151f2935414c566c7885929fabada093867a6d6053473a2d20160c0200000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c6675828f9ba8acabacab9e918578695f53473a2e2115222e3b4855616e7b8896a1adacaaaca9998c7f7366564c4135291d11040000000000000000000000000005111d2a36414c56616b74808d96a0aa9f948b7f72695f544a3f33281d16202a36414c56616c75818f97a1aba0968e81746c61564d41382d22170b000000000000020b17222d38424e58606d7984919e9f93877c6f665c50443b30251a0d0300000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000006121f2c3844515c66717e8b949fa9afa59d928d837d77726f6d666a69696a696e70747a80879196a0a8aea49e92857a6d61574d42362a1c11060000000000000000000000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e140800000000000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1114141d1d1d1d1d1d1b1a17140e080e1317191a1d1d1d1d1d1d1414110d08020000000000000000000000000000000000000000000000000000000000000000030c18232f39434c565e676d737a7e8184858686868686867f7266594c3f3326190c00000000000000000000000000000000000000040f19232b32383b3c3f3f3f424c56626f7c8899a3aea399877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000000000b16212b35444d565b5e606060606060605e53504941382d22170b00000000000000000000000000000000000000000000000000010d1924303a444c525f606060606060606055534d453c31261a0e0200000000000000040e161e24292d2e35353535353e4b5865717e8b98a296897c6f6356493c3535353535414d5a6774808d9a9d908477828e9b9a8c8073665b50443945515d6774818e9a998d807986929f968a7d7063574a3d3024170a000e1a2734404d59646f7479797979797979797987929b8e8179797979797979797979797979797a87969a8d8079797979797979797979716c62564a3d3124170b0000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000007121d27313945525d687885929fabada093867a6d6053473e32281e13080000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7985929fa8a19ea1a8a197887b6e6255483b2f221825313e4b5864717e8b97a8a8a09ea0a89c908376685d5245392c20130700000000000000000000000000010d1925303a444f59606d79849199a3a69f92867b6e665b50443c2f261e28323a46525e68717e8a939ea9a3999184796d605a50443b2f261b11060000000000000006111c262f3c45515d67707d8a949e999083786d60574d42362a1f150b01000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000713202d3a4653606d7984919ea6b0a79d938d8079706b6562605c545c5d565e6164686d737c849196a0aaada2978e8174695e5346382e23170b000000000000000000000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d01000000000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d080200000000000000000000000000000000000000000000000000000000000000000000000000000000010507081010101010100e0d0b08030002070a0c0d10101010101008070501000000000000000000000000000000000000000000000000000000000000000000000007121d27313a444c555d60686d71747778797979797979726d63574b3e3225180c000000000000000000000000000000000000000007101921272c2f3032322f3a4653606d7986929facab95887b6f6255483c2f22150900000000000000000000000000000000000000000000000000000000000000000004101c27323d47565f676a6c6c6c6c6c6c6c6b605b53493f33271b0f0300000000000000000000000000000000000000000000000004111d2935414c565d6c6c6c6c6c6c6c6c6c6c5f574d42372b1e1205000000000000020c1620283035393a4242424242424b5865717e8b98a296897c6f635649424242424242414d5a6774808d9a9d90837a86929f93877b6e61544a3f35414c55626f7c89959e91847886929f968a7d7063574a3d3024170a000c1824303c48535d64686c6c6c6c6c6c6c677783909d918477686c6c6c6c6c6c6c6c6c6c6c687784919d908377676c6c6c6c6c6c6c6c65625a50453a2e2115090000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000030c18242f39434f59606d7a86929facaea194877b6e615a50443a3024190d030000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8998a2a1969196a1a9988b7e7265584b3f31261e2a36424d576874818e9ba9a0969196a09f92867a6d6054473a2d21140a000000000000000000000000000008131e28323e45515d676f7c87929fa6a2989083786c60574d42382d25303a44505a616d7a85929ea5a69f92877c6f675d51483e32291d140a0000000000000000000a141d2935414b55616c75828f98a0958b7f72695e52463e31271d1207000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00030f1c28333f4a5464717d8a96a1acaca0958e81746d6760595553514a50504d5254565d606a6f7b849198a2aea99f92867b6e61544a3f34281c1003000000000000000000000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e11050000000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f29323a434b51565d6064686a6b6c6c6c6c6c6c66635b51463a2f22160a000000000000000000000000000000000000000000070f161b1f222325252c3844515c667784919daaa296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000713202c38444f5967717779797979797979776c655b5044372b1f14090000000000000000000000000000000000000000000000000713202c3945525d6876797979797979797976695f53463a2d21140700000000000008131e28323a4146474f4f4f4f4f4f4f5865717e8b98a296897c6f63564f4f4f4f4f4f4f484d5a6774808d9a9d90837e8b989c8f8276695e5342382f3a4754606a7783909d978a7d86929f968a7d7063574a3d3024170a000814202b37414b53595b606060606060556774818d9a96877a6d61606060606060606060566875818e9b9286796d6060606060606060585650483f34291d11050000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000a151e2935404b55606b74818e98a3aeb5a89c8f82756c61564c4135291f150b0100000000000000000000000000000000000000000000000000000000000005111d2935414c566673808c99aa9e9184919eaa9b8e817568584e43372b202d3a46525e697784919ea1979184919ea3998a7d7164574a3e31261b0f0300000000000000000000000000020c16202935404b55606a737f8c949faa9f948b7f72695f544a3f332935414c56616c75818e97a1aa9f948c7f736a60554b40362c20170b02000000000000000000020b18242f3a43505a616e7b86929f9f92867b6e61594f43392f24180b020000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0006121f2b3844505b6675828f9ba8b1a89d9083786d605c554f4946444043434246474c52585f696e7b86929fa8afa3998d8073665c5044382b1f120600000000000000000000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d201409000000000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e080200000000000000000000000000000000000000000000000000000000000000000000000000000000000002080c1012121313131313131313060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d172029313940454c5254585b5d5e5f6060606060595751493f352a1e120600000000000000000000000000000000000000000000040a0f131516191c2834404a546a7683909da9a296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000916222f3b4854606b77838686868686868684776c6053463b30251a0e0000000000000000000000000000000000000000000000000714212d3a4754606d7a86868686868686867b6e6155483b2e2215080000000000010d1924303a444c52545b5b5b5b5b5b5b5b65717e8b98a296897c6f635b5b5b5b5b5b5b5b54535a6774808d9a9d918483909c978a7e7164574d422f2b37434e5865727f8b989b8e8187929f968a7d7063574a3d3024170a00030f1a252f3941484d4e5353535353535864717e8b97968a7d70635753535353535353535865727f8b9899897c6f63565353535353534b4a453f362d22180c010000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000006111c26303845515d67707d89939daab4b9aa9e948a7e71685d52463d31271d12070000000000000000000000000000000000000000000000000000000000000713202d3946525d687683909da8988c7f8c98a29e9185786a5f53473a2e212e3b4754616e7b8796a09e9285808c99ab9a8e817467584e43372b1f12060000000000000000000000000000050e18242f39434e58606d78839098a2a69f92867b6e665b50443c323a46525e68707e8a939ea9a2989083786d60584e43392f231a0e05000000000000000000000007131d28313e46535e69727f8c95a0988e81756b61554b4035291d140a0000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000613202d394653606c7985929fabaca095897d70665c514b433d3a38342e30363a3b41454e565e69727f8b96a0acab9e9185796d6053463a2d20130700000000000000000000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e0200000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d0500000000000000000000000000000000000000000000000000000000000000000000000000000000060d13181c1e1f202020202020202013100c07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171f272f353a4145474b4e51525353535353534c4b463f372e23180d02000000000000000000000000000000000000000000000000030709090c18232e43505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000005111e2a36414c5663707d8995939393939396897d7063574d42362a1c110600000000000000000000000000000000000000000000000714202d3a4753606d7a86939393939393877b6e6154483b2e211508000000000005111d2935414c565d61686868686868686868717e8b98a296897c6f686868686868686868615e576774808d9a9f928690949e9285796d6053463b3127323d4754606d7a86929f928588939f968a7d7063574a3d3024170a000009131d272f373c404146464646464855626e7b8897998d807366544a3f46464646464956626f7c8998988c7f7265594c46464646463e3d3a342d241b1106000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000020b17232e38424e58606d7984919ea5afafacafa69e92857a6d61594f43392f24180c0300000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a86939fa096877a85929fa197887b6e6255483b2d22313e4b5764717e8a97a89b8f827d8a96a89e9184786a5f53473a2e21150700000000000000000000000000000007121d27313c44505c666e7b86929fa5a2989083786c60574d423a44505a616d7a85919ea5a59f92867b6e665c50463d31281d1108000000000000000000000000010c161f2a36424d57606d788390999e938a7d70675d51453c2f261b110600000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000815222f3b4855626e7b8897a2adaa9d9184776b60544a4039312d2c2823252a2d30353c444d57606c7884919eaaada197897c6f6356493c302316090000000000000000000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e12050000000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e0600000000000000000000000000000000000000000000000000000000000000000000000000000710181f24282b2c2d2d2d2d2d2d2d2d1f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d151d24293035393a3e4144454646464646463f3e3a352e251c12070000000000000000000000000000000000000000000000000000000000071d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000000000713202d3946525e6875818e9ba89f9f9fa89b8f8275695e5246382e23170b00000000000000000000000000000000000000000000000713202d3a4653606d79869aa49f9f9f94877a6e6154473b2e21140800000000000713202d3946525d686d757575757575757575757e8b98a296897c757575757575757575756e695e6774808d9aa29892989f9a8d8074665c51453829202c3945525d6874818e9b9892939aa4968a7d7063574a3d3024170a0000010b151d252b30343539393939394653606c7985929c8f8376665c5044383939393a4653606d7986929b8e827568574d423639393932312e29221b120900000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000a141d28343f4a54606a73808d96a0acaca49fa4aca1978e81746b60554b4035291e150a00000000000000000000000000000000000000000000000000000000000b1724313e4a5764717e8a99a49e918477828f9ca9988b7e726553493f332a36414c566774818d9aaa988b7f7a8796a0a196887c6f6255483c2f24180d010000000000000000000000000000010b151f28343f4a545f69717e8b939ea99f948b7f72695f544a414c56616c75818e97a1a89e938b7e71695f544a3f342b1f160c0000000000000000000000000000040d1a25313b44505c666f7c87939f9e9184796d60584e41382d22170b02000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000a1724303d4a5763707d8a96a9b3a69a8d807367594f42382f27201f1c18191e202429323b44505b65737f8c99a9a6a9998c807366594d4033261a0d000000000000000000000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d211407000000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f0700000000000000000000000000000000000000000000000000000000000000000000000006101922293035383939393939393939392c29231d150d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181e24292c2d3135373839393939393933322f2a231c130a000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616d7a86929facacacacac9f92877b6e61544a3f34281c10030000000000000000000000000000000000000000000006121f2c3844515c667986939facaca094877a6d6154473a2e21140700000000000714212e3a4754616d7a8182828282828282828183909da99c8f82828282828282828282817b6e616774808d9aaaa29fa29f95887b6f62544b4034281d2935414c56626f7c8995a09f9fa4ac968a7d7063574a3d3024170a000000030b131a202427282d2d2d2b3744505b6576828f9c9285796d6053463a2d2d2c3844515c667683909c918478695e52463a2d2d2d2524211d1811090000000000000000000000000714202d3a4753606d7a8693a0ada6998c807366594d4033261a0d0707040100000000000000000000000000000000000000000000000006111b262f3844505c666f7c87929fa8a69f9a939aa4a99d93897d70675d51453c30261c110600000000000000000000000000000000000000000000000000000006121f2b37434e586774818e9aab9b8e81757f8c99a99b8e8275655b5044372d3946525e687784919da298887c7784919ea9998c7f7266554b4035291d1104000000000000000000000000000000030d17232e38424d57626c75828f97a1a69f92867b6e665b5045525d68707d8a939ea9a1968e81756c62574d42382e22190d0400000000000000000000000000000009141f28343f4a54606a74808d97a1968d80736a5f53493f33271e1308000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000b1825323e4b5865717e8b98a4b1a4978a7e7164574b3e30261d1512100c0e1114192027333f4953616e7b88979a9998978f8276695c4f4336291c10030000000000000000000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e2215060000000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000000000000000000000000000000000000000000000000020d18222b343b414445464646464646464638342f271f150b01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c13191d202125282a2b2c2d2d2d2d2d2625221e18120a01000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000006121f2b3844505b66727f8c99a3aeaaa8aaafa3998c7f73665c5044382b1f14090000000000000000000000000000000000000000000004101c2834404a5f6c7986929facada093867a6d6053473a2d20140700000000000815212e3b4854616e7b878e8e8e8e8e8e8e8e8e90959fab9f948f8e8e8e8e8e8e8e8e8e887c6f626774808d9aa7aeacaa9d9083766a5f5342392e2319242f3a4754606a7783909daaacafa3968a7d7063574a3d3024170a0000000001090f14181a1b20201b27333f495366737f8c9998887c6f6255493c2f222834404a546773808d9a96877b6e6154473b2e212020201b1a17140e08010000000000000000060c1114202d3a4753606d7a8693a0ada6998c807366594d4033261a1a1413110d0801000000000000000000000000000000000000000000000b17222d38414d57606d78839099a3ab9f948f87939fa8a59e9184796d60584e42382e23170c0300000000000000000000000000000000000000000000000000000814212e3a47535f6a7884919eab988c7f727c8897a29e9285796c605346392e3a4754616d7a8795a09f92857974818e9ba79c8f8376675d5145392c2013060000000000000000000000000000000006111c26303b45505a616d7a85919ea4a2989083786c60574f59606d7a84919ea5a49a91847a6d615a50453b30261c100700000000000000000000000000000000030c17232e38424e58606d7a85919e9f92877c6f655b50443a3025190c030000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000c1925323f4c5865727f8b98a5afa396897c706356493d3023140b0604000205080e17222d3846535f6978858e8d8c8c8b8a85786b5e5245382b1f12050000000000000000000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b00000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b2219100700000000000000000000000000000000000000000000000000000000000000000008131f29343d464c5152535353535353535345403931271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d111314181b1e1f202020202020191816120d070000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919eaba69e9c9ea6ab9e9184786d6053463b31261a0e00000000000000000000000000000000000000000000000c18232e46525f6c7985929facaca09386796d6053463a2d20130700000000000815212e3b4854616e7b87949b9b9b9b9b9b9b9b9d9fa79fa69f9c9b9b9b9b9b9b9b9b95887c6f626774808d9a9f9f9fa2988b7e7165584e4330271d131e2b38434e5865727f8b98a29f9f9f968a7d7063574a3d3024170a0000000000010911181e2225252d222d3d4a5663707d899a988b7f7265584c3f3025232e3e4a5764717d8a97978a7d7164574a3e2e232d2d2d2726241f1a130b020000000000000910171d21202d3a4753606d7a8693a0ada6998c807366594d403326262621201d19130c040000000000000000000000000000000000000000040f1b27333f49535f69727f8c95a0aba3998f82808c96a0aca0968d80736a5f544a3f34281f140900000000000000000000000000000000000000000000000000000815222f3b4855626e7b8896a1a399897c6f7985929fa197887b6f6255483c2d3e4a5764717d8a97a89c8f8276717e8b98a89f92867a6d6053473a2d20140900000000000000000000000000000000000a141e29333f46525e68707d8a929da89f948b7f72695f56616b74818e97a1a79f93887d70685d52483e33291e140a00000000000000000000000000000000000006111c26303d45525d68717e8a949f999083776c60564c41362a1e150b0000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000c1825323f4b5865727e8b98a5afa295897c6f6256493c2f23160600000000000006111b2a36424d576673808180807f7e7d7d706356493d3023160a000000000000000000010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f030000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000000000000000000000000000000000000000000000000000c1824303b464f575d5f606060606060605f514b43392f23180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407070b0e11121313131313130c0c0a0602000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000005121e2a36424d5763707d8a96a0ab9e948f949eaaa1968a7d7064574d42362a1c120700000000000000000000000000000000000000000000071f2c3845525f6b7885929eabaea3998679665c5145382c1f130600000000000815212e3b4854616e7b8793939393939393939393939393939393939393939393939393887c6f626774808d939393939392857a6d6054473c3121150f1b27323d4754606d7a869293939393938a7d7063574a3d3024170a000000000009131b23292e31323939393a4754606d7a86939b8e817568564d42363939393b4854616e7b87969a8d807367544a3f34393939393433302b241d140b010000000009121b22282d30313a4753606d7a8693a0ada6998c807366594d40333333332d2c29241e160d04000000000000000000000000000000000000040e1a242b3744505b656e7b86929fa7a89f92867c7984919ea5a89f92877c6f665c50443c31261a0e0500000000000000000000000000000000000000000000000004101c2934404b5565727f8c98a89f9286796d75828f9ba9988b7f726553493f35414c566774808d9aaa998c7f726e7b8896a1a3998a7d7064574a3d31261a0e0200000000000000000000000000000000020c18212a36414c56616b74818d96a0a69f92867b6e665d68707d8a939ea9a0958d80736b60564c41362d21180c02000000000000000000000000000000000000000a151e2935414c56616c76828f989f948b7e71685e52463d30271d120700000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000b1724313e4a5764717d8a97a4b0a396897d7063564a3d2d22170b010000000000000e1a26313b4b58636e73757473727170706b6054483b2f22160900000000000000000005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f1205000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c0300000000000000000000000000000000000000000000000000000000000003101c2835414c5761696c6c6c6c6c6c6c6c6c5c554b4034291c1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000714202d3a46525e6975828f9ba8a3998f828f98a2a89c8f8276695f5346392e23180c00000000000000000000000000000000000000000005121f2b3845525e6b7885919eabac9f9286796c5f4b4034281c100400000000000815212e3b4854616e7b8686868686868686868686868686868686868686868686868686867c6f62677480868686868686868174675d5145392c20130a16202c3945525d687481868686868686867d7063574a3d3024170a0000000007111b252d343a3e3f4646464645525d687784919d918478695e5246464646464646525e697884919c908376665c50444646464646413f3c362f261d130800000006101b242c34393d3e404753606d7a8693a0ada6998c807366594d40404040403a39352f2820160c0100000000000000000000000000000000020c16202a36424d56606c77828f98a3aca0968c8073707d8a939eaaa3999083786d60574d42372b20170d02000000000000000000000000000000000000000000000006131f2c3845515c6776828f9ca99c90837667727f8b98a99b8f8275655b50443945525d687783909da298897c6f697884919eab9a8d817467574e42372b1e12060000000000000000000000000000000000060f1925303a444f59606d79849199a3a2989083786c606d7a84919ea5a3989083796d60594f443a30241b0f060000000000000000000000000000000000000000030c19242f3a43505a616e7b86929f9e92857a6d61594f42392e23180c03000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000a1623303d495663707c8996a8b1a4978b7e7164544a3f33281d120700000000000009141f2f3b47525c63666867666564646360594f44382c2013070000000000000000000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d2013060000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b00000000000000000000000000000000000000000000000000000000000005121e2b3844515d6973787979797979797976675c5145382c1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060809131313131313060400000000000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87929fac9f92877a85929fab9f93877b6e61544a4034281c1004000000000000000000000000000000000000000005121e2b3845515e6b7884919eabac9f9285796c5f52462e23180c0000000000000714202d3a46525e6976797979797979797979797979797979797979797979797979797979766a5f646e7479797979797979746f64554b4135291d1104111d2935414c56646f7479797979797979706b6155483c2f231609000000010d18232d373f464a4c53535353534c566774818e9a96877b6e6154535353535353534d576875828f9b9285796d60535353535353534e4c4741382f241a0e0300000c17222c363e45494b4d4d53606d7a8693a0ada6998c807366594d4d4d4d4d4d4745413a32281e13080000000000000000000000000000000008131e28323a46525e69717e8b949faaa59e9184796d6b75818e98a2aba0958c7f72695f53463f32291e140800000000000000000000000000000000000000000000000714202d3a4753606d7986929fab998d8073666f7b8897a19e9285796c6053463a4754606d7a86939f9f9286796d6875818e9ba89e9184786a5f53473a2e21140700000000000000000000000000000000000008131e28323e45515d676f7c87929fa79f948b7f726b74818e96a1a69f92867c6f675c51473d32281e12090000000000000000000000000000000000000000000008131e28313e46535f69727f8c95a0978e81746b60544b4034281f1409000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000814212e3b4754616e7a8795a0aca79a8e8174665b5044392f2318110a020000000003131f2a35404a52585a5b5a5959585756544f473d32271b10040000000000000000000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e211408000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d1207000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c788586868686868686796d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a0f12151520202020202013100c070100000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000006121f2c3844505c6673808c99a3ab9c8f8276818e9ba9a4998d8073665c5144382c1f1509000000000000000000000000000000000000000005111e2b3844515e6b7784919eaaab9f9285786c5f5245392c1f0700000000000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c625f585c64676c6c6c6c6c6c6c67645d53433a2f24180d010d19242f3a43535d64686c6c6c6c6c6c6c6361594f44382c20140700000006121e29343f495156586060606060606065717e8b98978a7d71646060606060606060606065727f8c9898887c6f62606060606060605a58524a41362b1f14080005111d28343e48505557595959606d7a8693a0ada6998c8073665959595959595954524c443a2f24190d010000000000000000000000000000030d1924303a44505a616e7b85929fa6a99e93897d7067616e7b86929fa7a79f92867b6e615a50443b3025190d04000000000000000000000000000000000000000000000a1723303d4a5663707d8998a2a3998a7d70636a7885919ea297887c6f6255483d4a5763707d8a99a49c8f82766665717e8b98a8a196887b6e6255483b2f24180c000000000000000000000000000000000000020c16202935404b55606a737f8c959fa69f92867b707d89939da89f948b7f726a5f554b40352b20160c0000000000000000000000000000000000000000000000010c161f2a36424d57606d7883919a9e93897d70665c51453c31261a0d040000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000714202d3a46525e697784919dacab9e9184786c60554b403429221c140b05000000020e19242e3840474b4d4e4d4d4c4b4a4948443d352b21160b000000000000000000000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f22150900000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c030000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929393939393867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151b1f21222d2d2d2d2d2d1f1c18120b03000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000713202d3a4653606d7984919eaba3998b7e717d8a97a2ab9e9285796d6053463c31261a0e010000000000000000000000000000000000000004111e2b3744515e6a7784919daaab9e9185786b5e5245382b1f12050000000000020e1a25303b454d525f60606060606060606060606060606060606060606060606060606055534e52585a606060606060605b59534b4131281d13070008131e2831414b53595b6060606060606057554f473e33281c10040000000916222e3a46515b62656c6c6c6c6c6c6c6c6f7b88989a8d80736c6c6c6c6c6c6c6c6c6c6c6c6f7c8999988b7e726c6c6c6c6c6c6c6c67645c52473c3024170b000815212d3945505a6164666666666d7a8693a0ada6998c80736666666666666666605d564c4135291d110400000000000000000000000000010b151f2935414c56616c75828f97a2ada2978e81756b605e69727f8c95a0aca2988f82766c62564c41362a1f160c01000000000000000000000000000000000000000005111e2a36414d566773808d9aaa9f92867a6d606875818e9ba9988b7f7265544a404b556773808d9aaa998c7f7366616e7b8896a1a8988b7f7265554b4035291d1004000000000000000000000000000000000000050e18242f39434e58606d78839098a2a29890827a84919ea5a2978f82776c60584e43392e23190e04000000000000000000000000000000000000000000000000040d1a26313b44515c666f7d88939f9d9184796d60574d42372b20160c0100000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0005111e2a36424d566774808d9aa4ada1968a7e71675c51453f332d261d170e0600000008121c262e353b3f404241403f3e3d3d3b38322b23190f04000000000000000000000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b4034282015090000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929f9f9f9f93867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101820262b2e2f3939393939392c29231d150d030000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000005121e2a36424d5764707d8a96a1ac9f92867a6d7985929faba1978a7e7164574d42372b1d12070000000000000000000000000000000000000004111d2a3744505d6a7783909daaab9e9184786b5e5145382b1e120500000000000009141f29333b424648535353535353535353535353535353535353535353535353535353494743474c4d535353535353534e4c4841382f1f160c0100010c161f2f3941484d4e535353535353534a48443e352c21160b000000000b1825313e4a56626d727979797979797979797885929d908379797979797979797979797979797986929b8e81797979797979797979746e64584c3f33261a0d000a1724303d4955616c7173737373737a8693a0ada6998c807373737373737373736d685d5245392c2013070000000000000000000000000007121d27313945525d68717e8a939ea9a69f92857a6d615957606d7883909aa4aa9f948b7e71685e52463e31281e130800000000000000000000000000000000000000000714202d3946525e687784909daa9d908377675d65717e8b98a89b8f8275665b5045515d677683909da298897c6f635f697884919ea99c8f8276675d5145382c1f13060000000000000000000000000000000000000007121d27313d44505c666e7b86929fa69f9490849196a1a59e92857b6e655b50463c30271d1108000000000000000000000000000000000000000000000000000009141f2834404a54606b74818e97a0968c7f73695f53463e32281e130800000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00020e1925303b4855626e7b87939faaa99e9184796d605a50443f382f292017110a0300000a141c242a2f3233353433323131302f2c272119110700000000000000000000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a00000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabaca093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18222a31373a3c46464646464638342f271f150b0100000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000714212d3a46535f6976828f9ca8ab9c8f82766874818e9ba9a99c8f8276695f5347392f23180c0000000000000000000000000000000000000004101d2a3743505d6a7683909da9aa9e9184776b5e5144382b1e1105000000000000020d17212930363a3b4646464646464646464646464646464646464646464646464646463c3b373c3f414646464646464641403c362f261d0d04000000040d1d272f373c4041464646464646463d3c38332c231a1005000000000c1925323f4c5865727f868686868686868686868a989f95908686868686868686868686868686868b999e938e8686868686868686868074675a4e4134271b0e000b1824313e4b5764717e8080808080808d99a6b3a99c90828080808080808080807a6d6054473a2d211407000000000000000000000000030c18242f39434f59606d7a85919ea5ab9f948b7e71685e52505c666f7c87939fa9a69f92857a6e61594f433a2f24190c03000000000000000000000000000000000000000814212e3b4754616e7a8795a0ac9a8d80736755616e7b8796a19f9285796c60534753606d7a86929f9f9285796d60576874818e9ba79f9286796d6053473a2d20140900000000000000000000000000000000000000010b151f28343f4a545f69717e8b939ea69f969196a0a89d938a7e71695e53493f342a1e150b000000000000000000000000000000000000000000000000000000030c18232e39424f59616d7a85929e9f92867b6e615a50443a2f24190c02000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000914212e3a47535f6a75828f98a3aca0968d80746c625a504a423b3228231c150c0500020a12191f2326272827262625242322201b160f070000000000000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b0000000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b00000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c43474853535353535345403931271d120700000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000004101c2834404b54616e7b87939faca3998b7e7165707d8a97a2ab9f94887b6e62554b4034291c100400000000000000000000000000000000000003101d2a3643505d697683909ca9aa9d9184776a5e5144372b1e110400000000000000050f171f252a2d2e3939393939393939393939393939393939393939393939393939392f2e2b303334393939393939393433302b251d140b00000000000b151d252b30343539393939393939302f2c28211a110800000000000c1925323f4c5865727f8b93939393939393939394a2a79f9d9393939393939393939393939393939fa3a59e9b93939393939393938d8174675a4e4134271b0e00101c2936434f5c6976828c8c8c8c8c8d929ca8b4ab9f94908c8c8c8c8c8c8c8c877b6e6154483b2e2115080000000000000000000000000a151e2935404b55606b74818e97a1ada3999083776c60564c4a54606b74818e97a1ada2978e81756c61554c4135291e150b000000000000000000000000000000000000030f1b27333f495364717e8b97a7a49a8a7d7064575e697884919ea297887c6f62554a5663707d8999a39c8f8276665c5864717e8b97a8a3988a7d7063574a3d31261a0e0200000000000000000000000000000000000000030d17232e38424d57626c75828f97a1a8a09ea0a8a0968e81746c61564d41382d22180c030000000000000000000000000000000000000000000000000000000007121c27303d46525d68717e8b949f988f82766c61564c4135291e140a000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000006121f2b37434e58626f7c86929fa6a89d928b7e716c605b544d443d342e261e170e070000080e1317191a1b1a1a191817161613100b04000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b000000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c1004000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c464e535560606060605f514b43392f23180c00000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000006131f2c3845515c6673808d9aa4ac9f92867a6d606d7985929faba69a8d8073675c5145382c1f150a00000000000000000000000000000000000003101d293643505c6976838f9ca9aa9d9084776a5d5144372a1e11040000000000000000050d141a1e20212d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d22211f2326272d2d2d2d2d2d2d282724201a130b020000000000030b131a202427282d2d2d2d2d2d2d2423201c1610080000000000000c1925323f4c5865727f8b989f9f9f9f9f9f9f9f9faaacaba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9faaacaaa89f9f9f9f9f9f9f9a8d8174675a4e4134271b0e00101c2936434f5c6976828f99999999999ca4aeb9b0a69f9c9999999999999994877b6e6154483b2e211508000000000000000000000006111c26303845515d67707d89939da9a89f92877c6f655b5044424f59616d7a85929ea6a99e938a7d70675d51453d30271d1207000000000000000000000000000000000005121f2b3744505b6575818e9ba89f93867a6d6154576774818e9aa9988b7f7265544b556673808c99aa998c7f72665454616e7b8796a1aa9a8d807467574d42362a1e1205000000000000000000000000000000000000000006111c26303c45505a616d7a85929eabacaaaca3999184796d605a50443b2f261b10060000000000000000000000000000000000000000000000000000000000000b151e2935414c56626c76828f989f948a7e71685d52453d30261c11060000000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000020f1a26313c47535f6a727f8c949fa7a49f93877e736c665e564f443f38302920191109000002070a0c0d0f0e0d0c0b0a0a0907040000000000000000000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b000000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e585f626c6c6c6c6c6c5c554b4034291c1004000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9a396897d7063564a3d302317080806020000000000000000000000000000000000000000000000000713202d3a4653606d7985929eacaa9c8f8275685d6674818e9ba9ab9e9285796d6053473c31261b0f01000000000000000000000000000000000003101c2936434f5c6976828f9ca9a99d9083766a5d5043372a1d100400000000000000000002090e121415202020202020202020202020202020202020202020202020202020161513171a1a202020202020201b1a18140f08010000000000000001090f14181a1b20202020202020171614100b05000000000000000c1925323f4c5865727f8b939393939393939393939da0a7a09393939393939393939393939393939393a0a79f9d939393939393938d8174675a4e4134271b0e00101c2936434f5c6976828f9c9f9f9fa0a2a7afb9b6aea8a69f9f9f9f9f9f9f94877b6e6154483b2e21150800000000000000000000020b17232e38424e58606d7984919ea5aca1968d80736a5f53493f3d46525e68717e8b949faba59e91847a6d60594f43392e23180b02000000000000000000000000000000000613202d394653606c7885929eaa9d908477685d525764717e8a97a79b8f8275665b515c677683909ca298897c6f6356535e697884919eaa9d918477695f53463a2d2114070000000000000000000000000000000000000000000a141e2a333f46525e68707d8a99a3aeb7ac9f92877c6f675d51483e32291d140a00000000000000000000000000000000000000000000000000000000000000030c1924303a44505a626e7b86929f9e91857a6d60584e42382e23170b0300000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000a15202b37434e58606c78828f959fa6a499938b80786e686159504a423b322b231b1209000000000000020100000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a0000000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000003060b0f15212e3a47535f6a76797979797976675c5145382c1f130e090603000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9a4978a7d7164574a3e2f24191514120e090300000000000000000000000000000000000000000006121f2b37434e5864717e8a97a1ada3988b7e71645663707d8a97a1ada2978b7e7164584e43372b1d13070000000000000000000000000000000000020f1c2935424f5c6875828f9ba8a99c908376695d5043362a1d10030000000000000000000000020507081313131313131313131313131313131313131313131313131313130908060b0d0e131313131313130e0e0b0803000000000000000000000003080c0e0e131313131313130a0907040000000000000000000c1925323f4c5865727f86868686868686868686868995a0958986868686868686868686868686868689959f958986868686868686868074675a4e4134271b0e00101c2936434f5c6976828f9393939393969da7b2aea49c999393939393939393877b6e6154483b2e211508000000000000000000000a141d28343f4a54606a73808d96a0aca59e9184796d60584e413835414c56606c77829099a3ada1968d80746b60554b4034281d140a000000000000000000000000000000000916222f3c4955626f7c8897a1a79a8d817467564c54616e7a8795a09f9285796c6053606d7986929f9f9285796d60534d576874818e9ba7a096887b6e6155483b2e23180c00000000000000000000000000000000000000000008131e28323a45515c666e7b86929facb7ab9e91847a6d605a50443b2f261b1106000000000000000000000000000000000000000000000000000000000000000008131e28323e47535f6973808c96a0978d80746a60544a3f34281f140900000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000030f1a26313c44505b666d79838f949da5a49f928d827a706b605c544d443d352d241b12090000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a0000000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d12070000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000060b1012171b1f222f3c4855626f7c8686868686796d6053473a2d201e1a15130f0a04000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8a6998c7f7366554b4135292422211e1a150e0600000000000000000000000000000000000000000814212e3a47535f6a7683909ca9ac9f92867a6d6054606d7985929eaba99d9083766a5f53473a2f24180d0100000000000000000000000000000000020f1c2835424f5b6875828e9ba8a99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4a56626d72797979797979797979797983909d918479797979797979797979797979797983909d90837979797979797979746e64584c3f33261a0d00101c2936434f5c6976828686868686868b96a2aea89c928c8686868686868686867b6e6154483b2e21150800000000000000000006111b262f3844505c666f7c87929fa8aa9e938a7d70675d51463c2f303a44505b656f7c87929fa8a89f93887d6f675c51453c2f261c1106000000000000000000000000000004111d2935404b5566727f8c99a9a8978a7d7164574a525e687784919da297887c6f625663707c8998a39c8f8276665c514b5864717e8b97a8a8988b7e7265544b4034281c100400000000000000000000000000000000000000050f19242f3a444f59606d79839099a3acaaaca1968e81746c61564d41382d22170c0300000000000000000000000000000000000000000000000000000000000000020c16202b37424d57606d7984919e9f93877c6f665c50443b30251a0d04000000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000a152028333f4a545d676d79828e939fa3a49c948f857d736d665e564f473e362d241b110800000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f231609000000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c0000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000001080d11171c1f22272b2d2f3c4855626f7b88939393867a6d6053473a2e2d2a25211f1b15100b0500000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7a89b8f8275675d51453c352f2f2e2b2620180f0600000000000000000000000000000000000004101d2935404b55626e7b88949faba89b8e8175685d525c6674808d9aa7ab9f95887c6f62554b4035291d110400000000000000000000000000000000020f1b2835424e5b6875818e9ba8a99c8f8276695c4f4336291c100300000000000000060b0e10111313131313130f0e0c0904000000000000000000000003070b0d0e13131313131312110f0c0701000000000000000000000004080a0b1313131313131308070502000000000000000000000000000000000000000916222e3a46515b62656c6c6c6c6c6c6c6c6c6c74818d9a93867a6d6c6c6c6c6c6c6c6c6c6c6c6c74818e9a9286796d6c6c6c6c6c6c67645c52473c3024170b000f1c2835414e5a6670767979797979798693a0ada6998c8079797979797979797976695e53463a2d2114070000000000000000000b17222d38414d57606d78839099a3aea2988e81756b61554b40342a27333f49535f6a73808d96a1ada49a9184796d60584e42382d22170b03000000000000000000000000000613202c3945515d6776838f9ca9a096877a6e6154474c566774808d9aa9988b7f72655466737f8c99aa998c7f7266544a4854616e7b8796a0a89c8f8275665c5145382c1f1306000000000000000000000000000000000000020b17212935414c56606b73808d95a0a7a09da0a79d938a7e70685e53493f33271e150b0000000000000000000000000000000000000000000000000000000000000000040e1a26313c45515c67707d89939e999083786d60574d42362a1f160c010000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000030b17222d38424b555d676d78818b9298a0a69f97928880786e69605950483f362d231a0e04000000000000000000000000000000000000000000000000000000000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e21150800000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000060b13191c23282b2d3337393b3e4855626f7b88959f93867a6d6053473e3b3a36312e2b26201c170e09030000000000000000000000000000000000000000000c1825323f4b5865727e8b98a6ac9f92857a6d60574d45413f3b3a37312a21180e03000000000000000000000000000000000006131f2c3945515d6774808d9aa6aca096897d7063564c54626f7b88959faba79a8d8174675d5145392c20150a00000000000000000000000000000000020e1b2835414e5b6874818e9ba7a89c8f8275695c4f4236291c0f030000000000040b12171b1d1e2020202020201c1b19150f09020000000000000001080e13171a1a2020202020201f1e1b18130c050000000000000000050c11141717202020202020201514120e0903000000000000000000000000000000000006121e29343f4951565860606060606060606064717e8b979a897d70636060606060606060606065717e8b9899897c6f6360606060605a58524a41362b1f1408000d1925323d49545e66696c6c6c6c6d7a8693a0ada6998c80736c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000040f1b27333f49535f69727f8c95a0aba79f92857b6e61594f43392f22222d38414e58606d7984919ea6aca0958c80736a5f544a3f33281f1409000000000000000000000000000714202d3a4753606d7a86929faa9d918477685e52464a5764707d8a99a49b8f8275655c6676828f9ca298897c6f62564946525e697784919eaa9f9285796d6053463a2d2013090000000000000000000000000000000000000a141d29333b45525d68707d87939fa69f959095a0a59e92857a6e655b50443c30271d120700000000000000000000000000000000000000000000000000000000000000000915202834404b55606b75818e97a0958c7f72695e52463e31281d12070000000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000006111c262f3a434b555d666d747f8691969ea5a19a938d827b706b615a50483f352b20160c020000000000000000000000000000000000000000000000000000000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d2013070000000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f130600000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000020a11171e24292e34383a3f4446484b4d55626f7b8895a093867a6d60534d4a4846423c3b37322d28221a150e0600000000000000000000000000000000000000000815222f3b4855626e7b88949faba2988b7f72695f57514c4c4847423c332a20150900000000000000000000000000000000000714202d3a4753606d7985929fabab9e9184786c605346535f6a7683909daaab9f92857a6d6053473d32271b0f01000000000000000000000000000000010e1b2834414e5b6774818e9aa7a89b8e8275685b4f4235281c0f0200000000050e161d23272a2b2d2d2d2d2d2d282825201b140c030000000000020b12191f2326272d2d2d2d2d2d2b2b28241e170f060000000000000810171c2123242d2d2d2d2d2d2d22211e1a140e0600000000000000000000000000000000010d18232d373f464a4c535353535353535355626e7b8897998c7f736659535353535353535355626f7b8898988c7f726559535353534e4c4741382f241a0e03000915212c38424c545a5c606060606d7a8693a0ada6998c807366606060606060605f534d453b31251a0e0200000000000000040e1a242b3744505b656e7b86929fa7ab9f958b7f72695e52473e31271d1b262f3c45515d67707d8a949eaaa89f92877c6f665b50443b31251a0e040000000000000000000000000a1724303d4a5763707d8a99a3a79a8e817467564c414754606d7a86939f9e9285796c606d7985929f9f9285796d605346424d576774818e9aa7a298897d706356493d30251a0e020000000000000000000000000000000006111c262f3b45505a606d7a849199a49f9490849096a1a1978f82776c60584e43392e23180e0400000000000000000000000000000000000000000000000000000000000000030c18232e39434f59616d7a85929f9f92867b6e61594f43392f24180b0200000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000a141d28313a434b545c606d727c848e939fa2a49f9490857d716c625a50473d32281e130800000000000000000000000000000000000000000000000000000006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f13060000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d20130800000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000040b141b22272f35383f444649505355585a5c626f7b8895a093867a6d605b5a5754534d4947433c39332b261f180f09000000000000000000000000000000000000000814212e3a47535f697683909ca5aa9f92857b6e69605d555855534d453c31261a0e0200000000000000000000000000000006131f2b37434e5865717e8b97a2ada3998c7f72655b50444e5865717e8b98a2aea2988b7e7165584e43372b1e1308000000000000000000000000000000010e1a2734414d5a6774808d9aa7a89b8e8175685b4e4235281b0f02000000040e1720282e3336373939393939393534312c251e150c02000000010b141d242b3033343939393939393837342f2921180f050000000008121a22282d3031393939393939392e2d2b261f180f060000000000000000000000000000000007111b252d343a3e3f4646464646464647535f697885929c8f827569574d4246464646464653606c7985929b8e827568564d424646413f3c362f261d1308000005101b26303a42494e4f535353606d7a8693a0ada6998c807366595353535353534846423b33291f140900000000000000020c16202a36424d57606c77829098a3aea3999083786c60564d42352c1f15141d2935404b55616c75828f98a2aea3999083786c60574d42362a20160c020000000000000000000005121e2a36424d576774808d9aaba8978a7e7164574b3e45525d687783909da297887c6f626f7c8998a29c8f8276665c50443e4b5764717e8a97a8aa9a8d807367574d42362a1e1205000000000000000000000000000000030d17222d38424d57616c75818e96a1a39890827a84919ea59f948b7f726a5f554b40342820160c020000000000000000000000000000000000000000000000000000000000000007121d27303d46525e68717e8b949f988f82756c61554b4035291d140a00000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000020b161f28313a424a515b626a6f7a818b9298a0a69f9792877e716c62594f443a3025190d03000000000000000000000000000000000000000000000000000003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c10040000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d01000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000050d161d262d333a41454a5053535b60626467686a6f7b8895a093867a6d6a686664615e5755534e49443e37312a211a120a01000000000000000000000000000000000006121e2b37424d5763707d89939ea6a29891847b736d676665625f574d42372b1e12060000000000000000000000000000000815212e3b47535f6a7683909da9ac9f92867b6e6153493f4753606d7a85929facaa9d9083776a6054473a2f24190d010000000000000000000000000000010d1a2734404d5a6773808d9aa6a79b8e8174685b4e4135281b0e020000000b16202932393f434446464646464642413d3730271e140900000008121d262f363c3f414646464646464544403a332b21170c01000005101a242c33393c3e464646464646463b3a37312a21180e030000000000000000000000000000000009131b23292e313239393939393937424d576975828f9c928578695f53473a3939393844505b6676838f9c918478695e52463a393433302b241d140b010000000a141e2830383d4143464753606d7a8693aab4a6998d8073665a4d46464646463b3a36312921170d030000000000000008131e28323a46525e69727e8b949faaa89f92877c6f665b50443b30231a0d0b18242f3943505a616e7b86929fa8ab9f958b7f72695e53463e32281e1308000000000000000000000714212d3a46535e697784919eaaa196877b6e6154483b414c566673808d99a9988b7f7266727f8c99aa998c7f7266544a3f3b4754616e7b8796a0aa9d908477695e52463a2d2014060000000000000000000000000000010b151f28333f4a545e69717e8a939ea79f92867b707d89939ea69f92867c6f675c51453d32281e130800000000000000000000000000000000000000000000000000000000000000000b151e2a36414c56606c778390999e938a7d70675d51453c2f261b1106000000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000040d161f2830394044515860676d757e8691969fa7a19992887e716b60564c4135291f15090000000000000000000000000000000000000000000000000000000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c00000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d1104000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000050e171f282f383f444c51545c6063656c6e71747576787c8895a093867978777573716e6967625f58555047423c332c241c130a0000000000000000000000000000000000020e1a26313c4854606b74818e949da5a09691857f7a7673726e695f53473a2e211408000000000000000000000000000004111d2935414c55626f7c88959faba99b8f8275685e52413845515d6774818e9ba7aca095897c6f62564c4135291d11040000000000000000000000000000000d1a2733404d5a6673808d99a6a79a8e8174675b4e4134281b0e01000006121d28323b444b4f515353535353534f4d48423930251b0f0400030e19242f3840474c4d53535353535352504c453d33291e130700000c17222c363e45494a535353535353534846423c332a1f140900000000000000000000000000000000010911181e2225252d2d2d2d2d2631404c5966737f8c9997887b6e6255483b2f2d28333f4a546673808d9996877a6e6154473b2e2726241f1a130b0200000000020c161e262c3235363a4653606d798698a3aea79a8d81746753493f36393a3c3a38342f271f150b01000000000000030d1924303a44505a616e7b85929fa6ada1968d80746a5f544a3f32291f110807121d28313e46535f69737f8c95a0aca79f92867b6e615a50443a3025190d040000000000000000000815212e3b4854616e7b8796a0ab9e918478695e53463a3d4a5663707d8999a39b8e82756675828f9ca298897c6f6256493c3a46525e697784919daaa095877b6e6154483b2e23170c000000000000000000000000000007121d27313944505b666e7b85929fa5a0958c7f726b75818e97a1a3989083796d60594f443a3025190f0600000000000000000000000000000000000000000000000000000000000000030c1925303a44505b656f7c87929f9e9184796d60584e41382d22170b020000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000040d161e272e343f464e555d606c717c8490959fa7a39a92877d70685e52463c31261a0e0000000000000000000000000000000000000000000000000000000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d302316070000000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000040e172029313a414950555d60666d7075797b7e8082838486929fac9f9286858382807d7b77736f6a64615a534d453e362d251c120900000000000000000000000000000000000915202c38444f59606d79828e939c9fa097928c8683807f7b6e6255483b2f22150800000000000000000000000000000613202c3945515d6774818e9aa7ada1968a7d7063564d4135404b55636f7c8995a0aca79b8e8174685d5245392c20160a0000000000000000000000000000000d1a2633404d596673808c99a6a79a8d8074675a4d4134271a0e0100000b17232e39444d565b5e6060606060605b59534b42372c2015090007131f2b36404a52585a6060606060605e5c574f453a2f24180c0004111c28333e485055576060606060606055534d453c31261a0e020000000000000000000000000000000000070d12161819202020202023303d4a5663707d8999978b7e7164584b3e2f24222d3d4a5764707d8a97978a7d7064574a3d2e231717140e0801000000000000040c141b2125282c3845515c667986929faca89b8f8275655b5046424547484745403931271d12070000000000010b151f2935414c56616c75828f98a2aea69e9184796d60584e42382d20170d00010c161f2a36424d57606d7984919da5aea2988f82756c61564c4135291f160c010000000000000003101c28343f4a5465727e8b98a8a79b8e817468574d42363a4753606d7a86929f9e9285786c7985929f9f9285796d6053463a36424d566774818e9aa7a7988b7e7165544a3f34281c1003000000000000000000000000050e18242f39434e58606c78829097a2a3999083786d616d7a85929ea6a0958d80736b60564c41352921180c030000000000000000000000000000000000000000000000000000000000000008131e27333f49535f6a73808d96a0968d80736a5f53493f33271e14080000000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000040c151c2328343c434c515a626a6f7a839095a0a9a39992857a6d61574d42372b1b110600000000000000000000000000000000000000000000000000000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d2013070000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d211407000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000020b162029323b434b535b60676d73797d8285888b8d8f90919298a3aea3989291908e8d8a8784807c76706c625f5750483f372d241b10060000000000000000000000000000000003101c27333d45515c676d7981898f939aa29f9992908d8b7f7265584c3f3225190c00000000000000000000000000000714212d3a4754606d7a85929facac9e9184796d6053463b303a4854606b7784919dabac9f92867a6d6054473d32271b0f0200000000000000000000000000000c1926333f4c5966727f8c99a5a69a8d8073675a4d4034271a0d0100020e1b27333f4b565f676a6c6c6c6c6c6c68655d53483d3125190c000b1723303c47525c64676c6c6c6c6c6c6b6861574c4034281b0f030814212d3945505a61646c6c6c6c6c6c6c6c5f574d42372b1e12050000000000000000000000000000000000000106090b0c1313131314212d3a4754606d7a86939a8d817467554b403529212e3a4754616d7a8796998d807366544a3f34281c100303000000000000000000020a1015191c2834404b546b7885929eabab9e9184786c6056534d51545553514b43392f23180c000000000007121d27313945525d68717e8a939eaaaa9e948a7d70675d51463c2f261c0e050000040d1a26313b45515c66707d89939ea9aa9e948a7e71685e52463d31281d12070000000000000006121f2c3844505c6675828f9ba8a9988b7e7165584b3e313945515d677683909ca197887b6f7b8897a29c8f8276665c504438303e4b5764717e8a97a8a89b8e8275665c5044382c1f12060000000000000000000000020c17202935404b555f6a727f8c949fa89f92877c6f665e68717e8a949ea79f93887d70685e52463f332a1e150a00000000000000000000000000000000000000000000000000000000000000020b17222d38414e58606d7984919e9f92877c6f655b50443b3025190c0300000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000030b1218222b313a414550585f686d79839097a1aba1978e8174695f5347382d22170b000000000000000000000000000000000000000000000000000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f13060000000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f231609000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000a141d28323b444d555d656c717a80858a8e9297979a9b9d9e9fa3aab4aaa39f9e9d9b999796918d88837d766e69615a51493f362d22180b02000000000000000000000000000000000b16212834404b555d676d747d82889297a2a39f9c988b7f7265584c3f3225190c0000000000000000000000000007131f2c38434f5965727e8b98a2aea49a8d8073665c5044382c38434f5965727f8c99a3aea2988b7f7265594f44382c1e130800000000000000000000000000000c1926323f4c5965727f8c98a5a6998d8073665a4d4033271a0d000004101d2a36434f5b677177797979797979756f65594d4134281b0e020d1a26333f4c58646e747979797979797873685c5044372b1e11050a1723303c4955616c717979797979797976695f53463a2d21140700000000000000000000000000000000000000000000000606060613202c3945515d677784909d908377675d5145382c202d3946525e687884919c908376665c5044382c1f120600000000000000000000000005090c18232e43505d6a7683909da9ada196897d7068615f575d6062605c554b4034291c1004000000030c18242f39434f59606d7a85919ea6aea2988f82756c61554b40342a1d140a0000000009141f2834404b54606b75818e97a2ada69e92857a6d61594f43392f24180c030000000000000713202d3a4653606d7985929faba197887b6e6155483b2e35404b556673808c99a9978b7e717e8b97a9998c7f7266544a3f342e3b4754616e7a8795a0ab9f9285796d6053463a2d201308000000000000000000000008131e29323a45515d676f7c87929fa6a0968d80736a5f56616c75828f98a2a49a91857a6d615a50453c30261c11060000000000000000000000000000000000000000000000000000000000000006111b262f3c45515d67707d8a939e999083776c60564c41362a1e150b00000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000000000000710191f282f353f464e565d676e7a85929ea6a99f93877b6e6253493f33271b0f0300000000000000000000000000000000000000000000000000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c10040000000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000006111b262f3a444d565e676d777e858d91979b9ea2a9a7a8a5a4a4a6acb3aba5a3a4a5a7a6a8a09d9a95908a827b716c635b51483f342a1d140a0000000000000000000000000000000006111c262f3b444d575e666d72797e85929faba8a5988b7f7265584c3f3225190c000000000000000000000000000a15222f3b4854606b7783909daaac9f93877b6e61544a3f3428323d4754616d7a86929facaa9d9184776b6054483a3025190d00000000000000000000000000000c1925323f4c5865727f8b98a5a6998c807366594d4033261a0d000004111e2b3744515e6a77848686868686868175685b4f4235281c0f020e1a2734414d5a67748086868686868685786b5e5245382b1f12050b1724313e4a5764717e868686868686867b6e6155483b2e221508000000000000000000000000000000000000000000000000000004111d2935414c556774818e9a92867a6d6053473a2d202a36414c566875818e9b9285796d6053463a2d2013070000000000000000000000000000071a2734414d5a6774808d9aa9b2a89d91837a726e696c676d6f6d675c5145382c1f13060000000b151e2935404b55606b74818e97a1ada79f92867b6e615a50433a2f22190b0200000000030c18232e39424f59616e7a85929fa7ada1978e81746b60554b4035291e150a000000000000091623303c4956636f7c8997a2ab9e918578695f53463a2d2f3c4956636f7c8998a29a8e8174818d9aa298897c6f6256493c2e2d3946525e687784919daaa297897c6f6356493c3025190d01000000000000000000060f1925303a444f59606d79839199a3a49a9184796d6058505a616e7b86929fa7a1978f81756c62574d42382e23170d04000000000000000000000000000000000000000000000000000000000000000a141d2935404b55616b75818e989f958b7e72685e52463d30271d1207000000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000000000070d161e2429343c444c555e68707d8a949faba49a8d8174655b5044372b1f120500000000000000000000000000000000000000000000000000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c000000000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000b17222d38414c565e696e79828b91979ea1a9aba8a19e9b9997989ba2aba1999697989b9ea0a8aaa79f9d948f867e726d635a50463c2f261b11060000000000000000000000000000000b17222d38424d565e696e787f858b9297a29f9c98958b7f7265584c3f3225190c00000000000000000000000006111b2935414c56636f7c8995a0aca99c8f8276695f5342382e232d3946525e6875828e9ba8aca095897c6f63564c41362a1b1106000000000000000000000000000c1825323f4b5865727e8b98a5a6998c7f7366594c403326190d000004111e2b3744515e6a778491939393938e8275685b4f4235281c0f020e1a2734414d5a6774808d939393939185786b5e5245382b1f12050b1724313e4a5764717d8a9393939393887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000010d19242f3e4b5865717e8b9899897c6f6356493c302325303f4c5865727f8b9898887c6f6255493c2f22160800000000000000000000000000000b1724313e4a5764717d8a97a1adaca09591847f7b7978797a7c796d6053473a2d201407000007121c27303945515d67707d89939da9aba0958c7f72695e53483e31281d100700000000000007121d27303d46525e68727f8b959faba99e93897d70675d51453d30261c11060000000005111d2935414c566673808c99a9a89b8e817568574d42372b2d3a4653606d7985929f9d90847783909d9f9285796d6053463a2d2a36414c566774818d9aa7a9998d807366564c41362a1e11050000000000000000030c18212a36414c56616b74808d95a0a89f93887d6f675c5146535e69727f8b959fa99e938b7e71695f544a3f34281f160c01000000000000000000000000000000000000000000000000000000000000020b18242f39434f59616e7b85929f9f92857a6e61594f43392e23180c030000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000000000000000040c1319222a323a434d56616c7683909cabac9e9285786c605346392d201306000000000000000000000000000000000000000000000000000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d120700000000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f000000000000000000000000000000000000000000000000121f2c3945525f6c7885929fabada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000030f1b27333f49535d686e7b838f949ea1a9a9a19e9996918e8c8b8b909ba5998f898a8c8e9196999ea1a9a69f98928a7f726c62584e41382d22170b0000000000000000000000000000030f1c28333f4a545e696e7b838c92979f9f99938f8b88877f7265584c3f3225190c0000000000000000000000000b17222d3946525d6875818e9ba7ada1978a7e7164574d4230261c2a36414c5663707d8996a1ada79b8e8175685e5246382d22170b000000000000000000000000000b1825323e4b5865717e8b98a4a5988c7f7265594c3f3226190c000004111e2b3744515e6a7784919d9f9f9b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9a9f9f9e9185786b5e5245382b1f12050b1724313e4a5764717d8a979f9f9f94887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8897988c7f7265594c3f3025232f3c4956626f7c8998988b7e7265584b3f3024190d01000000000000000000000000000713202d3a4653606d7985929ea6b0a7a096918b8886858687877b6e6154483b2e21150800000c18232e39424e58606d7984919ea5afa4999083786d60574d42362c1f160c00000000000000000b151e2a36414c56606c78839099a4afa59e9184796d60584e42382e23170c000000000713202d3946525d687683909da9a9988b7e7265584b3f31262c3844515c6676828f9c9f93867a86929f9c8f8275665c5044382b25303e4a5764717d8a97a7aa9d908377685e5246392d20140600000000000000000b151e2a333c46525e68707d8a929da8a1968d80746b60554b424d57606c78839099a3a59f92867b6e665c50443d31281e13080000000000000000000000000000000000000000000000000000000000000007121d27313e46525e68727f8b959f978e81756b60554b4034281f15090000000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000010810182028313b44505a64717e8a99a3ada197887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b0000000000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f0000000000000000000000000000000000000000000000030d152c3945525f6c7885929fabada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000010c161f2b3744505b656d7a8490959fa6aaa29f96918c8884817f7e7e8b98a396897d7d7f8184888c91979fa3aaa29f918b7e716a5f53493f33271b0f030000000000000000000000000006121f2b3844505b666e7b8490959ea19d948f87827e7c7a786c605346392d2013060000000000000000000000030f1b27333f4953616d7a86929facab9e9285796d6053463b31201925303a4653606c7884919eabac9f92867a6d6153493f33271b0f030000000000000000000000000b1824313e4b5764717e8a97a4a5988b7f7265584c3f3225190c000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aca194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000613202d394653606c7985929b8e827568574d42362a202d3a4653606d7986929b8e817468564c4135291d11040000000000000000000000000006131f2c3845515c67737f8c949fa6ada8a19e989992929299877b6e6154483b2e2115080004101c2834404a54606a73808d96a09fa99f93877c6f665c50453b31241a0d040000000000000000030c1925303b44505b666f7c87939fa99fa1968d80736a60544a3f34281c10030000000714212e3a4754616d7a86939faca197887b6f6255483c2f222834404a5466727f8c99a4998c7f8c99a3998c7f7266544a3f3428212e3a4754616d7a8795a0ac9f93877a6e6154473b2d22170b0000000000000007121c27303c45515b616d7a85919ea4a59e9184796d60594f433b44505b666f7c86929fa7a2989083786d60594f433a2f24190f05000000000000000000000000000000000000000000000000000000000000010b151f2a36414d56606c788390999e93897d70675c51453c31261a0e0400000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000000000000000000000060e161f29323e4753606d7a86929f9fa9988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c030000000000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d1000000000000000000000000000000000000000000000010b151f2935414c566c7885929fabada093867a6d6053473a2d20160c0200000000000000000000000000000000000000000000000008131e2935414c56606c77828f96a0a7a8a198928c84807b787572717b8895a0938679717274777b80848d9299a2aaa39f92867c6f655b5044372b1f130800000000000000000000000003101c28343f4a54606c788390969fa79d938e827b75726f6e6c665b5044382b1f1206000000000000000000000005121f2b3744505b65727f8c98a3aea79a8d8074675c5145382c1f131f2b3844505b6673808c99a4aea3988c7f72655b5044372b1f14080000000000000000000000000b1724313e4a5764717d8a97a4a5988b7e7265584b3f3225180c000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000005121f2b3744505b6576828f9c918478695e52463a2d202c3845515c667683909d918477685d5245392c2013070000000000000000000000000004101c2834404b55606d78828f949ea1a8a9aaaba39f9f9f94877b6e6154483b2e2115080006121f2c3844515c666f7c879293939393978d80746a60544a3f33291f11080000000000000000000008141e28333f4a54606a74808d979393939392877c6f665c5044382c1f12060000000b1724313e4a5764717d8a99a4ab9e9285796c605346392d20232e3c4955626f7c8897a29e9184919ea298897c6f6256493c2e23202d3946525e687784909daaa49a8b7e7164544a3f33281c0f030000000000040d18232e39424d57626d75828f97a1a99e938a7d70675d51473d333f4a545f6a73808c95a0aa9f958c80736b60554c41352921170b02000000000000000000000000000000000000000000000000000000000000030d1925303b44505b666f7c87929f9e9184796d60574d42372b20160c02000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000040d17202c3945515d67778490939393938c807366594d4033261a0d000000000000000000000000000000000000000000000000000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f000000000000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d110000000000000000000000000000000000000000000007121d27313945525d687885929fabada093867a6d6053473e32281e13080000000000000000000000000000000000000000000000010d19242f3946525e68727f8c949ea8a8a19691867f79736e6968666f7b8895a093867a6d6568696e737980879298a2aea3999083786c6053463a2f24190d01000000000000000000000006121f2b3844505c66727f8b959fa89f958e81786e69656261605b544a3f33281c0f0300000000000000000000000613202d394653606c7884919daaab9f95887c6f62554b4034281c101c28333f4a54616e7b87939facaa9e9184786c6053463b3025190e0000000000000000000000000a1724313d4a5764707d8a97a3a4988b7e7165584b3e3225180b000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000030f1b27333f49536673808c9396877b6e6154483b2e212834404b546774808d9393867a6d6054473a2d21140700000000000000000000000000000c18232e3944505c666d7a828c91969a9c9e9f9f9f9f9e94877b6e6154483b2e211508000713202d3a4653606d798386868686868686857a6d60584e42382e21170d0000000000000000000000020b17222d38424e58606d7a858686868686868683796d6053463a2d201307000006121f2b37434e586774818e9aaba89b8f8275655b5044372b1f202d394653606c7985929fa1969196a19f9285796d6053463a2d201e2a36414c566774818d9aacac9b8e8175665b5044382b1f120600000000010c161f2834404a545f69727e8b949ea9a1978e81756b61554b41352d38424e58606d79839199a4a79f92877d6f675d51453e33291d140a0000000000000000000000000000000000000000000000000000000000000008141f28333f4a545f6a73808d96a0968c8073695f53473e32281e1308000000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000000000000000000000000005111d2935404b556976828686868686868174675b4e4134281b0e0100000000000000000000000000000000000000000000000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c221108000000000000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11000000000000000000000000000000000000000000030c18242f39434f59606d7a86929facaea194877b6e615a50443a3024190d030000000000000000000000000000000000000000000004111d2935414c55616d7a86929fa6aba19691847c726d66615f57626f7b8895a093867a6d60575f61676d737d86929fa5ab9f958a7d7064554c4135291d110400000000000000000000000713202d3a4653606d7884919ea7a89d9083786d665f57555453504a42382d22170b000000000000000000000005111e2a36414c5663707d8996a0acaa9d9083766a5f5343392e23180c17222d3846535e6976828f9ca9aca096897d7063564d41362a1c110600000000000000000000000a1724303d4a5763707d8a96a3a4978b7e7164584b3e3125180b000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000b17222d3d4a5763707d868686867d7164574a3e3124232e3e4b5764717e868686867d7063564a3d3023170a000000000000000000000000000007121d28343f4a545e686d787f848a8d9091929292929190877b6e6154483b2e2115080006121f2c3844515c666d7779797979797979786d685d52463d30261c0f0500000000000000000000000006111c262f3c45525d686d7879797979797979776d665c5044382c1f120600000814212e3a47535f6a7884919eaba9988b7f726553493f33271b1f2b3844505b6675828f9ba8a19ea1a89c8f8275665c5044382b1f1925303e4a5764717d8a9aa4ab9e9285796c605346392d2013080000000008131e28313a44515c666e7b86929fa6a69e92857a6d61594f433a2f262f3c45515c666f7c87939fa8a39991847a6d605a50453b2f261c1106000000000000000000000000000000000000000000000000000000000000020b17222d38424e58606d7984919e9f92867b6e625a50443a3024190c030000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000000000000000000000010d18242f3a4e5a667076797979797979746f64584c4033271a0d01000000000000000000000000000000000000000000000000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a1000000000000000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e110000000000000000000000000000000000000000000a151e2935404b55606b74818e98a3aeb5a89c8f82756c61564c4135291f150b010000000000000000000000000000000000000000000613202c3945515d6773808d98a2aea49991847b6e6a605c545355626f7b8895a093867a6d605353555d606b707d8a939ea9a79c8f8276675d5145392c20130600000000000000000000000a1623303d495663707c8996a1aca096897d70665c544d494746443f382f261c110600000000000000000000000714202d3946525e6875828e9ba8aea2988b7e7165584e4330271d1207111c2a36424d5764717e8a97a1ada89b8f8275685e5246382e23170b00000000000000000000000a1723303d4a5663707d8996a3a4978a7d7164574a3e3124170b000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000616232f3c4855616b7079797979716c6155493c302323303d4955616c7179797979706b6055483c2f2316090000000000000000000000000000000c17232e38424c565e666c72797d808384858686858483817a6d6054473a2d2114070004101c2834404a545c606a6c6c6c6c6c6c6c6b605d564c41342b1e150a00000000000000000000000000000a141d2935414c565d606b6c6c6c6c6c6c6c6a605c544a3f34281c100300000815222f3b4855626e7b8896a1ada297887c6f6255493c2d22171c28333f4a5465727f8b98a9acabaca9988c7f7265544a3f34281c14212e3a4754616d7a86939faca197897c6f6256493c3024190d010000010d19242f3a434f59606d78839098a2a99e948a7e71685e52473e31281d2834404b54606b74808d96a1aba0968e81746c61574d42382d22170b0000000000000000000000000000000000000000000000000000000000000006111c262f3c45515d67707d8a939e988f82766c61564c4135291e150a0000000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000007131d323e49545e66696c6c6c6c6c6c67645c53483c3024180b000000000000000000000000000000000000000000000000000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f120800000000000000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d10000000000000000000000000000000000000000006111c26303845515d67707d89939daab4b9aa9e948a7e71685d52463d31271d12070000000000000000000000000000000000000000000714212d3a4754606d7a85929faaab9f93877d6f695f58514b4855626f7b8895a093867a6d6053474b5159616b74818e9ba8ac9f92867a6d6054473a2d21140700000000000000000000000d192633404c5966737f8c99a8aa9d9184776b60544a423c3b3938332d261d140a0000000000000000000000030f1c28333f4a54616e7a86929facac9f92857a6d6053473c3120150b000e1a25313b4653606d7985929eabac9f92867b6e61544a3f34281c100300000000000000000000091623303c4956636f7c8996a2a3978a7d7064574a3d3124170a000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000714202c38444f5961636c6c6c6c64615a5044392d21212d3945505a61646c6c6c6c6360594f44382c20140700000000000000000000000000000006111c26303a444c545b60666d70737677787979787876746d685d5245392c20130700000c18232e39424a51535d606060606060605e54524c433a2f22190c030000000000000000000000000000020b19242f3a434c52545e606060606060605d53504a42382e23170c000004101c2834404b5565727f8b98a89f9f9285796c605346392d201317222d3b4855626e7b8897a19f9f9fa297887c6f6255493c2e231713202d3946525e687784909d9fa9998c7f7366564c4135291d1105000004111d2935414c55606b73808d959f9fa2978f82756c61564c41352c1f18232e39424f59606d7984919ea5a89e938a7e71695e544a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000a141d2935404b55616c75828f989f948a7e71685d52453d30261c110600000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000115212d38424c545a5c6060606060605b58534a41362b2014080000000000000000000000000000000000000000000000000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d0000000000000000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d1000000000000000000000000000000000000000020b17232e38424e58606d7984919ea5afafacafa69e92857a6d61594f43392f24180c0300000000000000000000000000000000000000030f1b27333f495364717e8a98a2aca3998d80746b60574e45404855626f7b8895a093867a6d60534740454f59626f7c8896a0aca3998a7d7063574a3d3024170a00000000000000000000020f1b2835424e5b6875818e9ba8a79a8e817467594f4239302e2d2b28221c140b02000000000000000000000006121f2b3844505b66737f8c99a3aea79a8e8174675d5145392c2013030009141f2c3845515c6674808d9aa7afa3998c7f73665c5044382b1f1409000000000000000000000916232f3c4956626f7c8995a2a3968a7d7063574a3d3024170a000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000004101c28333e474f555760606060575550483e33281c1d28333e485055576060606056554f473d33271c1004000000000000000000000000000000000a151e29323a424a50545c606467696b6c6c6c6c6b6967605d564c4135291d1104000007121c2730394044465153535353535353524745413a31281e10070000000000000000000000000000000008131e28313a41454752535353535353535146443f3830261c1106000006131f2c3845515c6775828f939393938f8275665b5044382b1f1214212e3a47535f6a78859193939393939285796d6053463a2d2013111d2935414c566774808d93939393908376685d5246392d20130700000613202c3945515d676f7d87939393939392857b6e615a50443a30231a121d27303d45515d67707d8a939393939392857b6e665b5044382b1f120600000000000000000000000000000000000000000000000000000000000000020b18242f3a43505a616e7b86929f9e92857a6d60594f42382e23170c03000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000a15202a343c4347495353535353535353534f4940372c21160a000000000000000000000000000000000000000000000000000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e050000000000000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f000000000000000000000000000000000000000a141d28343f4a54606a73808d96a0acaca49fa4aca1978e81746b60554b4035291e150a0000000000000000000000000000000000000005121f2b3744505b6574818e9b9ea09f92867b6e61594f453c3c4855626f7b8895a093867a6d6053473a3e47535f6a7784919eaaab988c7f7265594c3f3226190c00000000000000000000030f1c2936424f5c6975828f9ca8a4988b7e7165584b3e302721201f1c17110a020000000000000000000000000613202d394653606c7884919eabaca095897c6f62554b4035291d11040004101c2834404b54626f7c88959fabab9e9184786d6053463b31251a0e000000000000000000000916222f3c4955626f7c8895a2a396897d7063564a3d3023170a000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000b16212c353e44484a535353534a49443e362c221717222c363e45494b535353534a48443d352c21160b0000000000000000000000000000000000030c1720292f383f444a5053575a5d5e5f5f5f5f5e5d5b54524c443a2f24190d010000000b151e272e34383a4446464646464646453a39352f281f160c0000000000000000000000000000000000010c161f282f35393a4546464646464646443a38342e261e150a0000000713202d3a4653606d79868686868686867f7266544a3f33281c0f121f2b37434e58687581868686868686868275665c5044382b1f120d1925303d4a5764707e868686868686877a6d6154473a2e21140700000714212d3a4754606d7a84868686868686867f71695e52483e32281e110b151e2935414b55616b75818686868686868682796c605346392d201306000000000000000000000000000000000000000000000000000000000000000007131d28313e46525e69727f8c95a0978e81746b60544a3f34281f1409000000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b00000000000000000000000000000000000000030f1b26323c464e535560606060606060605f5a52493e33271b0f02000000000000000000000000000000000000000000000000000000000000050e172029313940454f54596063676d70727576787879797878777573706d6865605d55504a423c332b231911070000000000000000000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e00000000000000000000000000000000000006111b262f3844505c666f7c87929fa8a69f9a939aa4a99d93897d70675d51453c30261c11060000000000000000000000000000000000000613202d394653606c78858b8e9196968f8275695e53473d333c4855626f7b8895a093867a6d6053473a37434e586976828f9ca9a69a8d8073675a4d4034271a0d0000000000000000000003101d293643505c6976838f9ca9a3978a7d7064574a3d31241513120f0b060000000000000000000000000005121e2a36424d5763707d8a96a1acaa9d9083776a6054433a2f24180d0100000c18232e3947535f6a7683909daaada1968a7d7063574d42362a1c12070000000000000000000915222f3c4855626f7b8895a2a396897c706356493d3023160a000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000005101a232c33383c3d464646463e3c39332c241a10101a242c33393d3e464646463d3c38332c231a0f05000000000000000000000000000000000000050e171d262d33383f44464a4d50515253535251504e4745413a32281e130800000000030c151c23282c2d3739393939393939382d2c29241e160d04000000000000000000000000000000000000040d161e24292c2d3839393939393939372d2c28231c150c0300000006131f2c3845515c676d79797979797979726d635742382d22170b0f1a26313c4d59656f7579797979797979757065544a3f34281c10081623303c4955616c707979797979797975685d5246392d20130700000613202c3945515d676d7879797979797979716d62574d42362c20160c030c18242f3a434f59656f7579797979797979766c665b5044382b1f12060000000000000000000000000000000000000000000000000000000000000000010c161f2a36424d57606d788390999f93887c6f665c50443b31251a0d040000000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b0000000000000000000000000000000000000006131f2b37434e585f626c6c6c6c6c6c6c6c6c645a4f43372b1e120500000000000000000000000000000000000000000000000000000000000000050e171f272f343d43484f54555c606366686a6b6c6c6c6c6b6a686664615e5653514b4c4841382f21191108000000000000000000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c0000000000000000000000000000000000000b17222d38414d57606d78839099a3ab9f948f87939fa8a59e9184796d60584e42382e23170c0300000000000000000000000000000000000613202d394653606c777c7e8184878a8b7e7165574d42352f3c4855626f7b8895a093867a6d6053473a32414e5b6874818e9ba7a79a8d8174675a4e4134271b0e0000000000000000000003101d293643505c6976838f9ca9a396897c706356493d3023160a06030000000000000000000000000000000714202d3a46525e6975828f9ca8aea3988b7f7265584e4331281d130700000007121d2b37434e5865717e8b98a2aea89c8f8275695e5346392e23180c0000000000000000000815222f3b4855626e7b8895a1a295897c6f6256493c2f231609000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000008111a21282c2f303939393931302d28221a120808121a22282d303139393939302f2c27211a11080000000000000000000000000000000000000000050b141c22282e34383a3d404344454646454543413a39352f2820160c010000000000030b12181c1f202a2d2d2d2d2d2d2d2b21201d19130c040000000000000000000000000000000000000000040c13191d20212b2d2d2d2d2d2d2d2a201f1c17110a030000000004101c2834404b555c606c6c6c6c6c6c6c66635b51462f261c11060a1520313d48535d65686c6c6c6c6c6c6c69655d5442382e23170b0814202d3944505a61646c6c6c6c6c6c6c6b5d564c4135291d1105000004111d2935414c555d606b6c6c6c6c6c6c6c65625a50453b30241a0e040007131d28313e47535d65686c6c6c6c6c6c6c69605b544a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000000040d1a25303b44505c666f7c87939f9a9083786d60574d42362a1f160c0100000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000815212e3b47535f6a767979797979797979766c5f5346392d2013060000000000000000000000000000000000000000000000000000000000000000050d1925303b444c525f6060606060605d5d5e5f5f5f5f5e5d5c5a6060606060605a58534a41362b201408000000000000000000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a0000000000000000000000000000000000040f1b27333f49535f69727f8c95a0aba3998f82808c96a0aca0968d80736a5f544a3f34281f1409000000000000000000000000000000000005121f2b3744505b656c6f7274777a7d807a6e6154473b312f3c4855626f7b8895a093867a6d6053473a35414b556875828e9ba8a69a8d8073675a4d4034271a0d0000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000003101c28343f4a54616e7b87929facac9f92867a6d6154473d3221160c01000000000f1b26313c4754606d7a85929facac9f93877b6e61544a4034281c100400000000000000000815212e3b4854616e7b87949f9f95887c6f6255493c2f221609000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000810161c2023242d2d2d2d2423211c17100800000810171d2123242d2d2d2d2323201c160f0800000000000000000000000000000000000000000000020a11171c23282c2d31343638393939393836342d2c29241e160d040000000000000000070c1012131e202020202020201f1413110d08010000000000000000000000000000000000000000000001080d1113141f202020202020201e1312100c06000000000000000c18232e39434b51535f606060606060595751493f351d140a000314202c37414b53595b606060606060605c5a544b4230261c110604101c28333e485055576060606060606054524c443a3024190d010000010d19242f3a434c51545e60606060606060585650483f33291f12080000010c161f2c35414b53595b606060606060605c53504a42382d22170b000000000000000000000000000000000000000000000000000000000000000000000009141f28343f4a54606a74808d97a0958c7f72695e53463e31281d130700000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8686868686868686796c605346392d201306000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e6c6c6c6c6c6c6c6a675f555353524f5960636c6c6c6c6c6c67645c53483c3024180b00000000000000000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e22150800000000000000000000000000000000040e1a242b3744505b656e7b86929fa7a89f92867c7984919ea5a89f92877c6f665c50443c31261a0e0500000000000000000000000000000000030f1b27333f49535b60626568686d70736e685e524639292f3c4855626f7b8895a093867a6d6053473a3a45515d677683909da9a5998c7f7266594c3f3326190c0000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000006121f2c3844505c6673808c99a3afa89b8e8175685e5246392d20130400000000000a15202c3945515d6774818e9ba7afa4998d8073665c5144382c1f150900000000000000000814212e3b4754616e7a8793939393887b6f6255483c2f221509000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000050b1014161720202020171614100b0500000000060c1114171820202020171614100b0500000000000000000000000000000000000000000000000000060b11171c1f2024272a2b2c2c2c2c2b2a2821201d19130c0400000000000000000000000406071113131313131313120706040100000000000000000000000000000000000000000000000000000104060712131313131313131107060300000000000000000007121d273039404546525353535353534c4a463f372d230b0200040f1a252f3941484d4e535353535353534f4d494239301e140a00000b17222c363e44494a535353535353534746413a32281e13080000000008131e28313a41454751535353535353534b4a453f362d20170d00000000040d1a232f3941484d4e535353535353535046443f382f261c11060000000000000000000000000000000000000000000000000000000000000000000000030b17232e38424e58606d7a84919e9f92867b6e615a50433a2f24180d01000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8893939393939386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000714202d3946525e68767979797979797771675b4f464854606b70797979797979746e64584c4033271a0d010000000000000000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d201307000000000000000000000000000000020c16202a36424d56606c77828f98a3aca0968c8073707d8a939eaaa3999083786d60574d42372b20170d02000000000000000000000000000000000b17222d38414950535558565d616366615e564c41362a2f3c4855626f7b8895a093867a6d6053473e444d57606d7a86929faca9988b7e7165584b3e3225180b0000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000000000713202d3a4653606d7984919eabaca096897d7063564c4135291d1105000000000004111d2935414b55636f7c8995a0acab9e9185796d6053463c31261a0e00000000000000000714212e3a4754616d7a8686868686867b6e6255483b2f221508000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000407090a131313130b0a0804000000000000000005080a0b131313130a0907040000000000000000000000000000000000000000000000000000000000060c101213171a1d1e1f20201f1e1d1b1413110d080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e272e34383a464646464646463f3e3a352d251c1100000009131d272f373d40424646464646464642413d3730271e0c02000005101a242c33393c3d464646464646463a3935302820160c0200000000010c161f282f35393a45464646464646463e3d3a342d241b0e05000000000008111d272f373d404246464646464646433938332d261d140a0000000000000000000000000000000000000000000000000000000000000000000000000006111c26303d45515d67717e8a949e988f82756c61554b4035291d1104000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c88959f9f9f9f9386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271b0e010000000000000000000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f120600000000000000000000000000000008131e28323a46525e69717e8b949faaa59e9184796d6b75818e98a2aba0958c7f72695f53463f32291e14080000000000000000000000000000000006111b262f383f4446494b4c5254575954524c443b30252f3c4855626f7b8895a093867a6d605347464f565f69727f8b98a3ada197887c6f6255493c2f2216090000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000005121e2b37424d5764717d8a97a1adab9e9184786c6053463a3025190d010000000000010d18242f3a4854606b7784919dabada1978a7d7164574d42372b1d1207000000000000000713202d3946525e687679797979797976695f53473a2e211408000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070a0d10111213131212100e0707040100000000000000000000000000000000000000000000000001040707131313131313130d0c0a0702000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d23282c2d3939393939393933312e2a231c130a000000020b151d252c313435393939393939393634312c261e150c0000000008111a22282d3031393939393939392e2d29241e160e04000000000000040d161e24292c2d383939393939393932312e29221b1209000000000000000b151d252c31343539393939393939362d2b28221c140b0200000000000000000000000000000000000000000000000000000000000000000000000000000a141e2935414c55616c75828f9893948a7d70675d5145392c201306000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8895a2acac9f9386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b0e0100000000000000000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c10030000000000000000000000000000030d1924303a44505a616e7b85929fa6a99e93897d7067616e7b86929fa7a79f92867b6e615a50443b3025190d04000000000000000000000000000000000a141d262d3337393c3f4146474a4d4746413b3229222f3c4855626f7b8895a093867a6d605350535961686e7b85929eaaac9e9285786c605346392d2013060000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000000000714212d3a46535f6976828f9ca9afa3998c7f73655b504437281e13080000000000000007131d2c38434f5965727f8c99a3aea99c8f8276695f5347392e23180c0000000000000005111d2a36414c565e6c6c6c6c6c6c6c6c5f574d42372b1e1206000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000000000002080d10121313131313131313070704010000000000000000000000000000000000000000000000000002070b0d0d13131313131313130f0e0c090400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d111314202020202020201a1916130d07000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f202c2d2d2d2d2d2d2625221e18110a0100000000030b131a202527282d2d2d2d2d2d2d292825211b140c0300000000000810171c2023242d2d2d2d2d2d2d21201d19130c040000000000000000040c13191d20212b2d2d2d2d2d2d2d2524211d1811090000000000000000030b131a202527282d2d2d2d2d2d2d29201f1c17110a02000000000000000000000000000000000000000000000000000000000000000000000000000000020c19242f3a43505a616e7b8686868686847a6d6053473a2d201407000b1825323e4b5865717e8b98a4a69a8d8073675a5a6773808d9aa6a4988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8895a2acac9f9386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e01000000000000000000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b0000000000000000000000000000010b151f2935414c56616c75828f97a2ada2978e81756b605e69727f8c95a0aca2988f82766c62564c41362a1f160c01000000000000000000000000000000020b141b22272b2d2f3035393a3d403b3936302920232f3c4855626f7b8895a093867a6d60545c60636b707a839197a1ada49a8e8175655b5044372b1f12050000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000004101c2834404b55616e7b87939facac9f92867b6e6153493f3327160c0200000000000000010f1b27323d4754616d7a86929facac9f93877b6e61554b4034281c1004000000000000010d1925303a444c525f60606060606055534d453c31261a0e02000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800000000060d14191c1f1f202020202020201413110d080100000000000000000000000000000000000000000001080e1317191a20202020202020201c1b191510090200000000000000000000000000000000000000000000000000010507070b0e101212131312110f0d0a07060400000000000000000000000000000000000000000000000000040c13191d202d2d2d2d2d2d2d2d2625231e19120a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c1013131f202020202020191816120d070000000000000002090f14181b1b202020202020201c1b191510090200000000000000050b10141617202020202020201413110d08020000000000000000000001080d1113141e20202020202020181715110c060000000000000000000002090f14181b1b202020202020201d13120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28313e46535f696e7979797979786d675d5145392c201306000b1825323e4b5865717e8b989f9f9a8d8073675a5a6773808d9a9f9f988b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c88959f9f9f9f9386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e01000000000000000000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c1106000000000000000000000000000007121d27313945525d68717e8a939ea9a69f92857a6d615957606d7883909aa4aa9f948b7e71685e52463e31281e130800000000000000000000000000000000020a11171b1f202224292d2e30332e2d2a25292c2e343c4855626f7b8895a093867a6d6063666d70767d859195a0a9a89f93877c6f6253493f33271b0f030000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000006131f2c3845515c6773808d9aa4afa99c8f8275695e5241382d2217040000000000000000000a16202d3946525e6875828e9ba8afa49a8d8073675c5145382c1f150a0000000000000008131e28323a4146535353535353534847423c332b23190f04000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e2215080000000810181f25292b2c2d2d2d2d2d2d2d2d201d19130c0400000000000000000000000000000000000000020a12191f2326272d2d2d2d2d2d2d2d292825211b140c030000000000000000000000000000000000000000000003080d111314181b1d1e1f20201f1e1c1a171413100c0701000000000000000000000000000000000000000000040d161e24292c393939393939393933322f2a241c130a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607131313131313130c0c0906010000000000000000000004080c0e0f131313131313130f0f0c0904000000000000000000000004080a0a131313131313130707050100000000000000000000000000000104060712131313131313130b0b0905010000000000000000000000000004080c0e0f13131313131313100606030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a36424d575f616c6c6c6c6c6b605d554b4035291d1104000b1825323e4b5865717e8b939393938d8073675a5a6773808d939393938b7e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8893939393939386796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e010000000000000000000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a0000000000000000000000000000030c18242f39434f59606d7a85919ea5ab9f948b7e71685e52505c666f7c87939fa9a69f92857a6e61594f433a2f24190c030000000000000000000000000000000000060b0f121316191d2021242621272c2f35393a3f444855626f7b8895a093867a6d6d7074797d828a9297a0a7aaa1968e81756a5f5341382d22170b000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000000000713202d3a4653606d7985929eacada1978a7d7064564d422f261b110600000000000000000005111d2a36414c5663707d8a96a1adac9e9285796d6053463c31261b0f01000000000007131e29333d454c5052535353535353534948443d352b21160b000004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000006101a222a3035383939393939393939392c29241e160d040000000000000000000000000000000000000a141c242b2f333439393939393939393534312c261e150c0200000000000000000000000000000000000000060b0f13191d20212427292b2c2c2c2c2b292724201f1d18120f0a04000000000000000000000000000000000000010c1620282f35394646464646464646403f3b352e251c1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d1a26313b454d53555f606060605e53514b433a2f24180d01000b1825323e4b5865717e8686868686868073675a5a6773808686868686867e7165584b3e3225180b000000000000000000000000000000000000000916222f3c4955626f7c8686868686868686796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e010000000000000000000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e00000000000000000000000000000a151e2935404b55606b74818e97a1ada3999083776c60564c4a54606b74818e97a1ada2978e81756c61554c4135291e150b00000000000000000000000000000000000000030506080d11131821272c33383a4145474a505356626f7b8895a093867976797d81858a8f949ea1a9a9a29891847a6e61584e432f261b1106000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000006121f2b37434e5864717e8a97a1adac9e9184796d6053463b3020140a00000000000000000000010d1925303a4653606c7884919eacada1978a7e7164584e43372b1d120700000000000c18242f3a454f575c5e6060606060606056544f473d32271b10040004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800020d18222c343b414446464646464646464639352f2820160c010000000000000000000000000000000006101c262e363b3f40464646464646464642413d3730271e14090000000000000000000000000000000000020a11171b1f252a2d2e3134363839393938383633302d2c29241d1b150e09030000000000000000000000000000000008131e28323a414553535353535353534d4b4740372e24190d0200000000000000000000000000000000000000000000000000000000000000000000000000000002080d10121313131313131313131313131313131313131313131313121211100e0b090706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306131313131313131308070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f29333b4246485253535353514745403a31281d130700000b1724313d4a56626c71797979797979736e645858646e73797979797979716c62564a3d3124170b000000000000000000000000000000000000000815212e3b47535f6a767979797979797979766c5f5346392d20130600000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e0100000000000000000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f14090000000000000000000000000006111c26303845515d67707d89939da9a89f92877c6f655b5044424f59616d7a85929ea6a99e938a7d70675d51453d30271d1207000000000000000000000000000000000000000000050d161d242932383d44484c5154545c6063666f7b8895a2998c7f8285898d91979c9fa6aca69f9792867c6f685e52463c311d140a00000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c30231609000000000000000000000000000815212e3a47535f6a7683909ca9afa49a8d8073665c5044382c1f1202000000000000000000000008131f2b3844505b6673808c9aa4afa99c9083766a5f5347392f24180d01000000030f1b2834404c5761686b6c6c6c6c6c6c6c6360594f44382c2013070004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e2215080008141f2a343e464d5152535353535353535345413a32281e1308000000000000000000000000000000020b18222e3840474c4d53535353535353534f4d49423930261b1004000000000000000000000000000000060b141b22272b3036393a3e414345454646454442403d3a38352f2b27201a140d050000000000000000000000000000010d19242f3a444c525f606060606060605957524940352a1e13070000000000000000000000000000000000000000000000000000000000000000000000000000060d14191c1f1f202020202020202020202020202020202020202020201f1e1e1c1a18161413100c070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c101220202020202020201514120e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d17212931363a3b4646464646453a39352f281f160c0100000915212e3a45505a62656c6c6c6c6c6c67645c52525c64676c6c6c6c6c6c65625a50453a2e2115090000000000000000000000000000000000000006131f2b37434e585f626c6c6c6c6c6c6c6c6c645a4f43372b1e120500000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c00000000000000000000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d1004000000000000000000000000020b17232e38424e58606d7984919ea5aca1968d80736a5f53493f3d46525e68717e8b949faba59e91847a6d60594f43392e23180b0200000000000000000000000000000000000000050f171f282f353d43484f54555d6064666d6f73767c8895a29c918c8f92989a9ea1a9aca8a09d948f857d6f6a60564c41342a200b0200000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c3023160900000000000000000000000004101d2935404b55626f7c88949fabac9f93877b6e61544a3f34281c10030000000000000000000000030f1c28333f4a54616e7b87939facab9f94887c6f62554b4035291d100400000005111e2b3744505c68737879797979797979706b6054483b2f2216090004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f12050b1724313e4a5764717d8a97a4aea194887b6e6155483b2e221508000d1925303b4650585d5f606060606060605f524c443a2f24190d0100000000000000000000000000000a141d2a34404a52585a60606060606060605c59544b42372c21150900000000000000000000000000020a11171d262d33373a4146474b4e505152535352514f4d4a4745403937322a251f170f080000000000000000000000000004111d2935414c565d6c6c6c6c6c6c6c6c66635b52473b2f23160a000000000000000000000000000000000000000000000000000000000000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a29272523201f1c1813110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d21211e1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f171f262a2d2e3939393939382d2c29241d160d0400000005111d29343f485056586060606060605a58524a4a52585a606060606060585650483f34291d110500000000000000000000000000000000000000030f1b26323c464e535560606060606060605f5a52493e33271b0f0200000000000000000000000000000000000000000000000000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b000000000000000000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d010000000000000000000000000a141d28343f4a54606a73808d96a0aca59e9184796d60584e413835414c56606c77829099a3ada1968d80746b60554b4034281d140a000000000000000000000000000000000000050e172129313940454f54596063676d7175797c808387929faca39c999c9fa2aaabaca49f9c96918a827b6f6b60584e443b3022180e0000000000000000000000000003101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000613202c3945515d6774808d9aa6b0a99c8f8276695f5342382e23170c000000000000000000000000000b17222d3846535e6976828f9ca9b0a69a8d8074675d5145392c20150a00000005121f2b3845525e6b7885868686868686867d706356493d3023160a0004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e5245382b1f07000b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800101c2935414d5862696c6c6c6c6c6c6c6c6c5d564c4135291d11040000000000000000000000000006111c262f3c46525c64676c6c6c6c6c6c6c6c68655d54493d3125190c000000000000000000000000030b141b22272f383f44464c5254575a5c5e5f5f5f5f5e5c5a5753514b47433d363129211a120a0100000000000000000000000713202c3945525d687679797979797979736d63574b3f3225190c00000000000000000000000000000000000000000000000000000000000000000000000006101a222a30353839393939393939393939393939393939393939393939393838373634322f2d2c2923201d19130f0a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c23282c39393939393939392e2d2a251f170f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d141a1e21222c2d2d2d2d2b20201d18130c0400000000010c18222d363f454a4b5353535353534d4c474040474c4d5353535353534b4a453f362d22180c0100000000000000000000000000000000000000000a15202a343c4347495353535353535353534f4940372c21160a00000000000000000000000000000000000000000000000000000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e2216090000000000000000000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d120700000000000000000000000006111b262f3844505c666f7c87929fa8aa9e938a7d70675d51463c2f303a44505b656f7c87929fa8a89f93887d6f675c51453c2f261c110600000000000000000000000000000000030c172029333b434b515960636b70757a7e8285898c909299a3afada7a5a9aaaba39f9c9a93908a847e766e6960594f463c32291e10060000000000000000000003070909101d293643505c6976838f9ca9a296897c6f6356493c302316090000000000000000000000000714202d3a4753606d7985929fabada2978a7e7164574d4230261c11060000000000000000000000000006111c2a36424d5764717e8a97a1adab9f9285796d6053473c32271b0f01000005121f2b3845525e6b7885919393939393897c706356493d3023160a0004111e2b3744515e6a7784919daaa89b8e8275685b4f4235281c0f020e1a2734414d5a6774808d9aa7ab9e9185786b5e52452f24180c000b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800121f2b3844515d6974797979797979797976685d5245392c201307000000000000000000000000000b17222d38424e58646e737979797979797979756f65594d4134281b0e0200000000000000000000030c151d262d333d41495053565e616467696b6c6c6c6b6b696663605d55544e46423b332c241c130a01000000000000000000000714212d3a4754606d7a86868686868686807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000020d18222c343b4144464646464646464646464646464646464646464646464645454443413e3c3a38342f2d29241e1a150f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e262e343846464646464646463b3a36312921170d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151f202020201e1413110d070100000000000006111b242d343a3d3e464646464646403f3b36363b3f404646464646463e3d3a342d241b1106000000000000000000000000000000000000000000040e18222a32373b3c464646464646464646433e372e251b1005000000000000000000000000000000000000000000000000000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e120600000000000000000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c010000000000000000000000000b17222d38414d57606d78839099a3aea2988e81756b61554b40342a27333f49535f6a73808d96a1ada49a9184796d60584e42382d22170b030000000000000000000000000000000b151e29333b454d555d606b6f767d81868a8e9298999d9fa3abb5aca6a8a09e9a9992908c87837e78716c615e574f473d342b20170d000000000000000000040a0f131516191c28333f4a546a7683909da9a296897c6f6356493c30231609000000000000000000000006131f2b37434e5865717e8b97a2adab9f9285796d6053473b3120150a0000000000000000000000000000000e1a25313b4653606d7985929eabaea2988b7e7165584e43372b1e1308000005121f2b3845525e6b7885919e9f9f9f96897c706356493d3023160a0004111e2b3744515e6a7784919daaa89b8f8275685c4f4235291c08000e1a2734414d5a6774808d9aa7ab9e9285786b554b4035291d10040b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800131f2c3946525f6c7986868686868686867a6d6054473a2d211407000000000000000000000000030f1c28333f4a545f6a738086868686868686868275685c4f4235291c0f02000000000000000000020c151e272f383f444e535b6063686d7174767878797978777573706d67626058534d453e362e251c130a000000000000000000000714212d3a4754606d7a8793939393938c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000008141f2a343e464d5152535353535353535353535353535353535353535353535251514f4d4b494745403a3935302b26201b150c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f4453535353535353534846423b33291f14090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507081313131313120706040100000000000000000009121b22292e313239393939393934332f2b2b2f333439393939393932312e29221b1209000000000000000000000000000000000000000000000006101820262b2e2f39393939393939393937332c251c1309000000000000000000000000000000000000000000000000000000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d01000000000000000000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d04000000000000000000000000040f1b27333f49535f69727f8c95a0aba79f92857b6e61594f43392f22222d38414e58606d7984919ea6aca0958c80736a5f544a3f33281f1409000000000000000000000000000007121c27303b454d575e676d747c83898e92989b9fa2aaa9a8aab0aca29a9796918e8a86837f7b76716d66615a524d453d352b22190e050000000000000000070f161b1f222325252b3844505b667784909daaa296897c6f6356493c3023160900000000000000000000000815222e3b4754606a7783909da9b1a79a8d8074675c5145382c1f130300000000000000000000000000000009141f2c3845515c6774808d9aa7b1aa9d9083776a6054473a2f24190d010005121f2b3845525e6b7885919eabaca396897c706356493d3023160a0004111e2b3744515e6a7784919daaa99c8f8376695c50433025190e020e1a2734414d5a6774808d9aa7ac9f928679675d5145392c1f13060b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800131f2c3946525f6c7985929393939393877a6d6054473a2d2114070000000000000000000000030d1a232b3844505b666f7c8792939393939392857b6e6154473b2e211408000000000000000000000a141e2730394149505860656c70767a7e818384858686858482807d79746f6a615e57504840372e251c12090000000000000000000714212d3a4754606d7a87939f9f9f998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000d1925303b4650585d5f6060606060606060606060606060606060606060605f5f5e5d5c5a585653514b4746413a37312b262018120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424a505f606060606060605f534d453b31251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000911181d2124252d2d2d2d2d2d2726231f1f2326272d2d2d2d2d2d2524211d18110900000000000000000000000000000000000000000000000000060e151b1f21222d2d2d2d2d2d2d2d2d2b27211b130a010000000000000000000000000000000000000000000000000000000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b1107000000000000000000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d000000000000000000000000040e1a242b3744505b656e7b86929fa7ab9f958b7f72695e52473e31271d1b262f3c45515d67707d8a949eaaa89f92877c6f665b50443b31251a0e04000000000000000000000000000c18232e39424d575e696e79818990959b9fa3aaaaa8a19e9c9ea6a69a908a8784817d7a76726e6964605c545046423b332b23191007000000000000000007101921272c2f30323230394653606c7985929faca295887c6f6255493c2f2216090000000000000000000004111d2935414c56626f7c88959fabab9f95887c6f62554b4034291c100400000000000000000000000000000004101c2834404b55626f7c88959fabab9f95887c6f62564c4135291d11040005121f2b3845525e6b7885919eabaca396897c706356493d3023160a0004111e2b3744515e6a7784919daaaa9d9083776a564c41362a1e11050e1a2734414d5a6774808d9aa7afa399867a6d6053473a2d2014070b1724313e4a5764717d8a97a4aea194887b6e6155483b2e22150800131f2c3946525f6c7985929f9f9f9f93877a6d6054473a2d21140700000000000000000000010b151f2a36414c56606c78839099a39faa9e948b7e71685e5246392d20140700000000000000000006111c263039424a535b606a6f787d82868a8d8f9192929292918f8d8a86817c756e69615a524a40372e241b0f0600000000000000000714212d3a4754606d7a8793a0aca6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000101c2935414d5862696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6b6a69676562605c5554524c47433c373228231d150c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000000000000001070b0f111213131313131313080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c111517182020202020201a1917131317191a202020202020181715110c06000000000000000000000000000000000000000000000000000000040a0f1315162020202020202020201e1b1610090100000000000000000000000000000000000000000000000000000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b1309000000000000000000000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e050000000000000000000000020c16202a36424d57606c77829098a3aea3999083786c60564d42352c1f15141d2935404b55616c75828f98a2aea3999083786c60574d42362a20160c02000000000000000000000004101c2834404a545e696e7b838e939d9fa7aca7a09d9996918f949ea4978a7e7b7774716d6865615e5753504a423e363029211911070000000000000000040f19232b32383b3c3f3f3f424b55626e7b8898a2aea894877b6e6154483b2e211508000000000000000000000613202c3945525d6874818e9aa79faa9d9083766a5f5343392f23180c00000000000000000000000000000000000c18232e3947535f6a7683909daa9fa79a8e8174685d5245392c2013060005121f2b3845525e6b7885919e9f9f9f96897c706356493d3023160a0004111e2b3744515e6a7784919daaab9e918578685e5246392d2014070e1b2834414e5b6774818e9aa7b5ab94887b6e6155483b2e2215090b1825313e4b5864717e8b97a4aea194887b6e6155483b2e22150800131f2c3946525f6c7985929facaca093877a6d6054473a2d2114070000000000000000000007121d27313946525e68727f8b959fabaea2988f82766c62564d41362a1e11050000000000000000030d17232e38424a545c656c737c838a8f93999a9c9e9f9f9f9e9e9c9998928e89827b716c635c524940362d22180b02000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000121f2b3844515d697479797979797979797979797979797979797979797979797878777674716f6d6764615d56534e47433c342e271e191008000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c66767979797979797976695e53463a2d211407000000000000000000000000050c12171b1d1e202020202020201514120e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105090b0b1313131313130d0d0b07070b0d0d1313131313130b0b09050100000000000000000000000000000000000000000000000000000000000003060809131313131313131313120f0a0500000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e181109010000000000000000000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a00000000000000000000000008131e28323a46525e69727e8b949faaa89f92877c6f665b50443b30231a0d0b18242f3943505a616e7b86929fa8ab9f958b7f72695e53463e32281e1308000000000000000000000006121f2c3844515c666e7b8490959da5aba49f9b95908c8884828f9ca09386796e696764605d5654534d46443f38302a251f170f070000000000000000000a16212b353d4348494c4c4c4d525d67727f8c99aaaca096867a6d6053473a2d201407000000000000000000000714212d3a4754606d7a869293939393988b7e7165584e4331271d1207000000000000000000000000000000000007121d2b37434e5865717e8b989393939392867a6d6054473a2d2114070005121f2b3845525e6b7885919393939393897c706356493d3023160a0004111e2b3744515e6a7784919daaada197877a6e6154473b2e23180b0f1b2835424e5b6875818e9ba8b0a3978a7d7064574a3d31261a0d0c1825323f4b5865727e8b98a5aea194887b6e6155483b2e22150800131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000020b18242f39434f59616e7a85929fa7b0a69f92867b6e615a50443b3025190e0200000000000000010b151f28343f4a545c666d77808890959c9fa4aba8a5a3a2a2a3a5a8aaa39f9b938f867e736e635b52483e342a1d140a000000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000131f2c3946525f6c79868686868686868686868686868686868686868686868685848482807e7c7975716d68625f58534e454039302a221a1109000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d78868686868686867b6e6154483b2e2115080000000000000000000000060f161d23272a2b2d2d2d2d2d2d2d22211e1a140e060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d070000000000000000000000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b020000000000000000000000030d1924303a44505a616e7b85929fa6ada1968d80746a5f544a3f32291f110807121d28313e46535f69737f8c95a0aca79f92867b6e615a50443a3025190d0400000000000000000005111e2a36414c56606d78829096a0a7a8a099938e88837f7b787c8895a093867a6d60565754524c4846423b38342e261e1a140d05020000000000000000030f1b27323d474f5456585859575e616d7984919eabaa9e918477675d5145392c201306000000000000000000000c1925323f4c5865727f8686868686868686796d6054473c3121150b010000000000000000000000000000000000000f1b26313c4754606d7986868686868686867f7265584b3f3225180c0005121f2b3845525e6b7885868686868686867d706356493d3023160a0004111e2b3744515e6a7784919daab3a9968a7d7063554b4034281d14111c2935424f5c6875828f9ba8b3a6998c807366584e43372b1f16111926323f4c5965727f8c98a5b5ab94877a6e6154473b2e21140800131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000a141d2935404b55606b75818e97a2adaa9f948b7e72695e52483e32291f1408000000000000000007121d27313944505c666d78818c939a9fa7a9a29f9b9896959596989b9fa2aaa59e98928a80736e635a50463c2f261b11060000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929393939393939393939393939393939393939399929291908f8d8b8985827e7a756f6a625f58514b433c342c231b12090000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869393939393877b6e6154483b2e21150800000000000000000000050f1820282f333738393939393939392e2d2b261f180f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020608080b0e1011121313121211100d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a0e10111213131212100e0b080806020000000000000000000000000000000000000000000000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b09060100000000000000000000000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a10060000000000000000000000010b151f2935414c56616c75828f98a2aea69e9184796d60584e42382d20170d00010c161f2a36424d57606d7984919da5aea2988f82756c61564c4135291f160c0100000000000000000713202d3946525e6873808d949fa8a7a0969187817c77726e6f7b8895a093867a6d60534a4745413b3a36312b2823201f1b1714110e090200000000000007131f2c38434f59606365656667696e75808d96a1aca89b8e817568554b4035291d1104000000000000000000000b1824313e4a56626d7279797979797979796d675d5145392c201303000000000000000000000000000000000000000a15202c3945515d676d7979797979797979726d62564a3d3124180b0005111e2b3744505c68737879797979797979706b6054483b2f2216090004111e2b3744515e6a7784919daab4a79a8d8074675c51453a2f26201d1e2b37424d576a7783909daab6a99d9083766a5f53473c3128201e1d27333f49536774808d9aa7aea399877a6d6054473a2d21140700131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000006111b262f3845515d67707d89939ea9aea2988f82776c60574d42362d20170d0200000000000000000c18232f39434f59606d78818e939fa4aaa29f97928e8b898888898b8e92989fa3aaa29f928c80736c61584e41382d22170b0000000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0604020000000000000000000000000000020506060503000000000000000000000000131f2c3946525f6c7985929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9e9e9d9c9a9898928f8b86817c756f6a605c554e463e352d241b120900000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939f9f9f94877b6e6154483b2e211508000000000000000000010c16202a323a3f4345464646464646463b3a37312a21180e0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205090e121415181b1d1e1f20201f1f1e1c1a181514120e090502000000000000000000000000000000000000000000000000000000000000000000000001080d111314171a1c1e1f20201f1e1d1b181514120e09040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c110800000000000000000000000007121d27313945525d68717e8a939eaaaa9e948a7d70675d51463c2f261c0e050000040d1a26313b45515c66707d89939ea9aa9e948a7e71685e52463d31281d120700000000000000000714212e3a4754616d7a86929fa6aaa09590847c756f6a66626f7b8895a093867a6d6053473a3935302d2e3633312e2d2b2722201e19140d0500000000000915222f3b4854606b6f72727273767b818d929da8aca1968a7d7064574a3d2f24180d01000000000000000000000915222e3a46515b62656c6c6c6c6c6c6c6c605d554b4135291d11040000000000000000000000000000000000000004111d2935414b555d606c6c6c6c6c6c6c6c65625b51463a2e22150900030f1b2834404c5761686b6c6c6c6c6c6c6c6360594f44382c2013070004111e2b3744515e6a7784919daab7ab9f9285796d60564c42382f2c292a2d3a47535f697885929fabb8ab9f95887b6e62584e4339312d2a2a2d3744505b6576828f9ca9ac9f928679685d5245392c20130600131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000b17222d38414e58606d7984919ea5afa79f92867b6e655b50453b30241b0e05000000000000000004101c2934404b55606b73808d939ea5a7a098928c85817e7c7c7c7d7f82868d9299a1a8a49c928b7e716a5f53493f33271c110600000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261a1312110f0b0706040100000000000306070b0f11131312100d0a09070400000000000000131f2c3946525f6c7985929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a7aaa9a7aaa29f9b99928e87827c736d675f584f473f362d241b1007000000000000000000000000000000000000000606060606060606060606060606060606060713202d3a4653606d798693a0aca194877b6e6154483b2e21150800000000000000000007121d28323c444b5051535353535353534846423c332a1f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e11151a1e21222528292b2c2c2c2c2b2b29272522211e1a14120e090200000000000000000000000000000000000000000000000000000000000000050b1013191d20212427292b2c2c2c2c2b2a282522211e1a15110d070100000000000000000000000000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c09060603000000000000000000000000000000000000000000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a000000000000000000000000030c18242f39434f59606d7a85919ea6aea2988f82756c61554b40342a1d140a0000000009141f2834404b54606b75818e97a2ada69e92857a6d61594f43392f24180c0300000000000004111d2935414c566673808c98a2aea29890837a6f6a625f58626f7b8895a093867a6d6053473a2d30363a3b43403e3b3937332d2d2a251f170e0500000000091623303c4956636f7d7f7f7f8083868e939da4aea59e9184786d6053463a2d201307000000000000000000000006121e29343f49515658606060606060605f54514b433a2f24180d0100000000000000000000000000000000000000010d18242f3a434b51545f60606060606060585651493f34291d120600000c18242f3a454f575c5e6060606060606056544f473d32271b10040004111e2b3744515e6a7784919daab7ada2978b7e71685e544a423c3935363a3f4a54616e7b8898a2aeb5afa79a8d80746a5f554b433d393636393d4653606c7985919eabaa9e9184776b564c4135291d110400131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000030f1b27333f49535f6a73808d96a0acaa9f958c7f72695f53493f33291f120900000000000000000006131f2c3845515c67707d88939fa5a7a09590857f797572706f6f7072757a80869196a1a9a49f92867c6e655b5044382e23170c00000000000714212d3a4754606d7a8793a0ada6998c807366594d4033261f201f1e1b181413110d080100060b101213171c1e1f201e1d1a171613100b050000000000131f2c3946525f6c7985929facb8ada39c9898989898989898989898989898999a9b9d9fa3aaaaacaba39f9a938f8780796f6a615950483f362d22190f050000000000000000000000000000000306071313131313131313131313131313131313131313202d3a4653606d798693a0aca194877b6e6154483b2e2115080906010000000000000b17232f3a444e565c5e6060606060606055534d453c31261a0e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d14191e20262b2e2f323436383939393938373634322e2d2b26201e1a140e0902000000000000000000000000000000000000000000000000000000040a0f161c1e24292c2d3134363839393939383634322e2d2b26201d18130c060000000000000000000000000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b060000000000000000000000000000000000000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a010000000000000000000000000b151e2935404b55606b74818e97a1ada79f92867b6e615a50433a2f22190b0200000000030c18232e39424f59616e7a85929fa7ada1978e81746b60554b4035291e150a0000000000000713202c3945525d687783909daaab9f92857b6e6860585355626f7b8895a093867a6d6053473a333b4246474f4d4a4846443f3b3a36302920170d020000000e1a2734414d5a6774808b8b8c8d8f92999ea5aca59e938a7e71665c5044382b1f12060000000000000000000000010d18232d373f464a4c53535353535353524745413a31281d130700000000000000000000000000000000000000000007131d28313a41454752535353535353534b4a463f372d23180d01000007131e29333d454c5052535353535353534948443d352b21160b000004111e2b3744515e6a7784919daab1a7a09d92857a6d665b544e474541424648505b66727f8c98aab4aba49f9d92877c6f675d554f4746414146474e58626f7c8997a1ada99c8f8276695c4f432f24190d0100131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000030c19232b3744505b656e7c87929fa8aea3989083786c60574d41382d21170d00000000000000000004111d2935414c55606d7984919aa4a9a09590837b726d67656362626365686d737c849197a1aba2989083786c60544a3f34281c1003000000000714212d3a4754606d7a8793a0ada6998c807366594d40332b2c2c2c2b282521201d19130d0a11171c1f2024282b2c2c2b2a272322201c160f0800000000131f2c3946525f6c7985929facb8a79c918c8b8b8b8b8b8b8b8b8b8b8b8b8b8c8d8e909298999da0a7aaaca49f99928d837c706b625a50483e342b21170d03000000000000000000000000060b1012132020202020202020202020202020202020202020202d3a4653606d798693a0aca194877b6e6154483b2e21191815120d0600000000000f1b27333f4b5660686b6c6c6c6c6c6c6c6c5f574d42372b1e12050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191f252a2d31373a3b3e41434445464645454443403e3b3a37312d2a251f1a140d0500000000000000000000000000000000000000000000000000060b151b21272c2f35393a3d414344454646454543413e3b3a37312c29241d17110a03000000000000000000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a03000000000000000000000000000000000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a0100000000000000000000000007121c27303945515d67707d89939da9aba0958c7f72695e53483e31281d100700060000000007121d27303d46525e68727f8b959faba99e93897d70675d51453d30261c110600000000000714212d3a4754606d7a86939facaa998c8073695e564e4855626f7b8895a093867a6d6053473a3b454d52545c5a57555350494746423b32291f14090000000e1a2734414d5a6774808d98999a9c9fa3aba8a19e938e81756c61544a3f34281c100300000000000000000000000006111b252d343a3e3f46464646464646463a39352f281f160c01000000000000000000000000000000000000000000010c161f282f35393a46464646464646463f3d3a342d251b1106000000010c17212b333a404445464646464646463d3b38322b23190f04000004111e2b3744515e6a7784919daaaca09590958e81786c665f5854524c4d53555a606c7883909daaafa4999390959083796d67605954524c4c525458606a74818e9aa9b3aa998d8073665a4d4033271a080000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000b151e2a36414c56606c77829099a3aea79f92867b6e665b50453b2f261b0f050000000000000000000613202c3945515d67737f8c96a1aca29790837a6e69605d5556555556565d606a6f7b859199a3aa9f948b7e71665c5044382c1f1509000000000714212d3a4754606d7a8793a0ada6998c807366594d4036383939393735322d2c29241e19141c23282b2d3135383939383633302f2c2721191108000000131f2c3946525f6c7985929facb2a5988c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818386888c91959c9ea6acaba39f9591867d716c625a50463d33291f140900000000000000000000020a11171c1f202c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2d3a4653606d798693a0aca194877b6e6154483b2e2c2524221e18110901000000111d2a3743505c6872787979797979797976695f53463a2d21140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080e161e25293036393c4247484b4e50515253535252514f4d4b4846423c3a36302a251f170f0800000000000000000000000000000000000000000000020a111720262b33383a4145474a4d4f515253535251504e4b4847423c39352f28231c150c05000000000000000000000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e090300000000000000000000000000000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f19110900000000000000000000000000000c18232e39424e58606d7984919ea5afa4999083786d60574d42362c1f160c1313130c060603000b151e2a36414c56606c78839099a4afa59e9184796d60584e42382e23170c00000000000916232f3c4956626f7c8999a4aea298887b6e62574d444855626f7b8895a093867a6d6053473a424d575e6169666461605b5354524d443b3025190e0200000e1a2734414d5a6774808d9a9f9fa29f9e9d9a96918b81786d605a5042382e23170b000000000000000000000000000009131b23292e313239393939393939392d2c29241d160d040000000000000000000000000000000000000000000000040d161d24292c2d393939393939393932312e29231b13090000000000050f1821292f34373839393939393939302f2c272119110700000004111e2b3744515e6a7784919daaaa9d908490938e81786e6a64605d56575f61646c727f8b95a0acac9f93878390958f82796f6b64615e56565e61646a6f7c87929facaea298897d7063564a3d3023170a0000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000007121d27303946525e68717e8b949fababa0958c7f726a5f544a3f332a1d140a000000000000000000000714212d3a4754606d7a85929fa8a89f92857b6e685e57514b4949494a4c52585f696f7d87929faaa69e9184786d6053463c31261a0e020000000714212d3a4754606d7a8793a0ada6998c807366594d40434445464544423e3a39352f2a251e262e34383a3e424446464543403d3c38332b23190f050000131f2c3946525f6c7985929facada093877a7272727272727272727272727273737477797c8084898f949da0a7afa7a09892877e716c61584e453b30251a0d040000000000000000020c141c23282b2d393939393939393939393939393939393939393939393a4653606d798693a0aca194877b6e6154483b393932312e29231b1309000000121e2b3845515e6b7884868686868686867b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a121a202830353b4146474e5355585b5c5e5f5f5f5f5e5e5c5a5855534d4846423b363029211a120a0200000000000000000000000000000000000000030b141b222732373d44484c5254575a5c5e5f5f5f5f5e5d5b5855534d4745413a342e261e170f0700000000000000000000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b06000000000000000000000000000000000000000000000000000000080e171f252a33384851595e6060605c60626567686a6b6b6c6c6c6b6a6a68666462605c6060605f5c574f453a29241d160d07000000000000000000000000000004101c2834404a54606a73808d96a09fa99f93877c6f665c50453b31241a20202020201913120f0b060c1925303b44505b666f7c87939fa99fa1968d80736a60544a3f34281c1003000000000a1724303d4a5763707d8a96abab9f9285796c6053463c4855626f7b8895a093867a6d6053473a46525e696e7673716e6c6567615e564d42362a1e110500000e1a2734414d5a6774808d939393989291908d8a847e746d665c51483e30261c11060000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2c21201d18130c0400000000000000000000000000000000000000000000000000040c13181d20212c2d2d2d2d2d2d2d2524221d18110901000000000000060f171e24282b2b2d2d2d2d2d2d2d2322201b160f070000000005111e2b3844515e6b7784919eaaa4978b7e8491938e827c75716d686b6b696e71767e87929fa7b1a79c8f827b8692948f837c75716e686b6b686d70757c859299a3afaa9f9285796d6053463a2d2013070000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000c18232e39424f59616d7a85929ea6aea3999083786d60574e42382d21180b0200000000000000000007131f2c38434f5965727f8c98a2aca0968b7f72695f564d45403d3c3c3d41454e57606b74808d98a2aca1968a7e7164574d42372b1e12060000000714212d3a4754606d7a8793a0ada6998c807366594d4c5051525352514e4b4745413a36302a30383f44464a4f51525351504d4a48443d352b21160b0000131f2c3946525f6c7985929facada093877a6d656565656565656565656565666768666d6f73777c828990959fa4acaaa299928b7e716a60574d42362a1f160c01000000000000000a141e262e34383a46464646464646464646464646464646464646464646464653606d798693a0aca194877b6e6154484646463f3e3a342d251b11060000121e2b3845515e6b7884919393939393887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c242c323a41464d5254575f626567696b6c6c6c6c6b6a696765615f5754524d46423b332c241c140a020000000000000000000000000000000000030c151d262d333c43474f54565d606467696b6c6c6c6c6b696765615f5754514b443f3830292119100700000000000000000000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a020000000000000000000000000000000000000000000000000000050d141a2136424e59636b6c6c6c6c6b64615a5c5d5e5f5f5f5f5e5e5d5b535b60656c6c6c6c6b6861574c403428130c0400000000000000000000000000000006121f2c3844515c666f7c879293939393978d80746a60544a3f33291f202c2d2d2d2c26201f1c17110a141e28333f4a54606a74808d979393939392877c6f665c5044382c1f1206000000000b1824313e4b5764717e8a97a4aa9e918477655b50443c4855626f7b8895a093867a6d6053473b4754616e7b82807d7b7976746e695e52463a2d20140700000e1a2734414d5a6774808686868686858483807d79716c605c544a40362c1e140a0000000000000000000000000000000000060d12151819202020202020201f1413110d070100000000000000000000000000000000000000000000000000000001070d1113141f20202020202020181815120d06000000000000000000050c13181b1e1f20202020202020161613100b04000000000005111e2b3844515e6b7784919eaaa3978a7d7d8992948f86817d7a797778797b7e838b9299a3afaba0958a7e737f8c94959087827e7a797878797a7d82889297a1abaea3988d8074665c5145382c1f13060000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000004101c2834404b54606b74818e97a1ada79f92877c6f665c50453c2f261c0f06000000000000000000000915222f3b4854606b7784919eaaab9e9184786d60574d443b352f2f2f30353c454f59616d7a86929faca89d908376695f53473a2d2114080000000714212d3a4754606d7a8793a0ada6998c8073665956595c5e5f5f5f5e5b5854524c46413a333c424a5053575b5e5f5f5e5d5a56544f473d33271c100400131f2c3946525f6c7985929facada093877a6d605858585858585858585858595a545c6062666b6f767c838d939aa3ababa39f92867c6f695e52463e31281d130700000000000006111c2630383f444653535353535353535353535353535353535353535353535353606d798693a0aca194877b6e6154535353534c4a463f372d23180d0100121e2b3845515e6b7884919e9f9f9f94887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b141d262e363e444c52565e61666a6e717476777879797878777673716e6966615e57524d453e362e261c140a00000000000000000000000000000000030c151e272f383f444e54596063686d7074767778797978787674716e6965605d55504a423b332b221910070000000000000000000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b03000000000000000000000000000000000000000000000000000002091f2c3945525e6b757979797978706c615f57514b525352524b51575f656c71787979797873685c5044372b1e11000000000000000000000000000000000713202d3a4653606d798386868686868686857a6d60584e42382e282b383939393939332d2b28221c140b17222d38424e58606d7a858686868686868683796d6053463a2d201307000000000b1824313e4b5764717e8a97a4ab9e918578665c50443c4855626f7b8895a093867a6d605347424e5865717e8b8d8a888583807b6e6154473b2e21140800000d1a26333f4c58646e74797979797979787774706d66625a514a42392e241a0c020000000000000000000000000000000000000106090b0c131313131313131307060401000000000000000000000000000000000000000000000000000000000000000104060713131313131313130c0b090601000000000000000000000001070c0f1112131313131313130a0907040000000000000005121e2b3845515e6b7884919eaba3968a7d73808d9499928e8a8785848585888b90959fa3abaea3999183786d78828f959a938f8b8786848485878a8e939aa1a9afa59f92867b6e61544b4034281c10040000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000040e1a242c3845515c66707d89939ea9aba0958c80736a5f544a3f332a1d140a0000000000000000000000091623303c4956636f7c8996a0aca3998b7f72665c50453b32292422222429333d46525d6874808d9aa8ab9f95887b6e6155483b3025190d0100000714212d3a4754606d7a8793a0ada6998c807366606366696b6c6c6c6a6865605d56524c443e454d545c6064686b6c6c6b69666360594f44382c20130700131f2c3946525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4c4d4a5053555960636a6f7980889299a3abaea39891857b6e615a50433a2f24180d0000000000000b17232e38424a50535f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f606d798693a0aca194877b6e615f5f5f5f5f585651493f34291e120600121e2b3845515e6b7884919eabaca194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000009131d262f38404850565e61686e73777b7e81838485868685858482807e7b77736e69615e57504840382e261c13090000000000000000000000000000000a151e273039414950585f626b70757a7d808284858686858483817e7b77726d67605c544d453d342b22190f05000000000000000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d03000000000000000000000000000000000000000000000000000613202d394653606c7987868686847d756e69605c554f46454f545c60696e777e8586868685786b5f5245382c1f120500000000000000000000000000000006121f2c3844515c666d7779797979797979786d685d52463d302e34384546464646463f3938332d261d18111c262f3c45525d686d7879797979797979776d665c5044382c1f1206000000000a1723303d4a5663707d8996a9ac9f9286796d6053463e4855626f7b8895a093867a6d6053474b54606a76838f9997989290857a6d6053473a2d20140700000b1723303c47525c64676c6c6c6c6c6c6b6a6764605c545044403930271c1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eaba396897c7078828f949f9b97989291919298979d9fa7aeaaa29f92877d70666d7a8390959f9c97999291919298979b9fa4acaca49f938c7f72695e5342392e23180c000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140b0b0b0b0c16202b37424d57606d7984919da5afa3999083796d60584e42382e21180b020000000000000000000005121e2a36424d576774808d9aa8ac9f92867a6d61544a3f33292018161619212935414c56626f7c8895a0aca7998c807366564c4135291d110500000714212d3a4754606d7a8793a0ada6998c8073656c6f7376777879787775716d68615e5650484d575f666d7175777979787673706b6054483c2f22160900131f2c3946525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f3f40403f4446494f545860676d737e879299a3aeaaa1978f82766c61554b4135291d12070000000003101c28343f4a545c6a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d798693a0aca194877b6e6c6c6c6c6c6c65625b51463a2e22150900121e2b3845515e6b7884919eabaea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000007101b252f38404a525a61686d747b8084888b8e8f919292929291918f8d8b8884807b746e69615a524a40382e251b0f060000000000000000000000000006111c263039424a535b606a6f767d82868a8d8f919292929291908e8b88847f7a726d665e574e463d342b21170b0200000000000000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d03000000000000000000000000000000000000000000000000000b1825313e4b5864717e889396918a827b736d67615953525960666d737b828b929792877e7064574a3d3124170a0000000000000000000000000000000004101c2834404a545c606a6c6c6c6c6c6c6c6b605d564c413430383f445253535353534c46443f382f2a2119141d2935414c565d606b6c6c6c6c6c6c6c6a605c544a3f34281c1003000000000815222e3b4855616e7b8897a1ada399897d70635a50474855626f7b8895a093867a6d60534c535c666f7c89949faaa29b8e8175675d5145382c1f1306000007131f2b36404a52585a60606060605f5e5d5a5753514b423f342e271e150b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080a0d0e10111212131313131211100f0d0b090706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b556c7885929f9f9f95887c6f6d79828d939a9fa29f9e9e9fa3aaa9a9aba39f98928a7f726b60686d7a838d939a9fa39f9e9e9fa2aaa8a9aba49f9a938c81776c60574d4230271d1207000000131f2c3946525f6c7985929facada093877a6d6054473a2d211818181818181e28323a47535f69737f8c96a0aca89f92877c6f665c51463c30261c0f0600000000000000000000000714212d3a46535e697784919eaaa99c8f8276685e5242382e21170d07080f1924303a47535f6a7784919daaaa9d908377685e5246392d20130700000714212d3a4754606d7a8793a0ada6998c807370787c7f838485868584817e7a746d68615a51575f696e787e828485868483807d7063564a3d3023170a00131f2c3946525f6c7985929facada093877a6d6054473a3232323232323232332e34383a3d43484e555c606c717e87929fa5afa99f948a7e71675d5145392e23180c0000000006121f2b3844505c6674797979797979797979797979797979797979797979797979797979788693a0aca194877b79797979797979726d62564a3e3124180b00121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000030c19222d37404a525c636c717a81868c9196989a9c9e9f9f9f9f9e9d9c9a9895918d86817b716c645c524a40372d21180e030000000000000000000000040e17232e38424a545c656c727c82898f92999a9c9e9f9f9f9f9e9c9a9895908b857f786e6960584e463d33291d140a000000000000000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b010000000000000000000000000000000000000000000000000a1724303d4956626c717f8b919e948f868079706b615f5d606b6f797f868f949f93887e716c6155493c3023160a00000000000000000000000000000000000c18232e39424a51535d606060606060605e54524c433a2f38424a505e5f6060605f5953504a423b332a251f19242f3a434c52545e606060606060605d53504a42382e23170c00000000000613202d394653606c7985929eabab9b8f82756c615a544e55626f7b8895a093867a6d6053565d656d7983909da6aca0958a7d7064554b4035291d10040000030e19242f3840474c4d53535353535251504d4a464540393028231c150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406090e12141517191b1d1e1f1f2020201f1f1e1d1c1a18161312100c0705020000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d6779869293939393887b6e676d7880878f93999b9d9e9f9f9f9e9c9a99928e867e726d62595e686d7980878e92999a9c9e9f9f9f9e9d9a99938e877f746c655b50453b311e150b00000000131f2c3946525f6c7985929facada093877a6d6054473a2d2424242424242424303a44505a616e7b86929fa8aca0968d80736a60544b40342a1e150a0000000000000000000000000815212e3b4854616e7b8796a0acab988c7f7265564c4130261c0f06000008131e2b37434e586774808d9aa7ac9f93867a6d6154473a2e21140700000714212d3a4754606d7a8793a0ada6998c80747d83898c8f91929292918e8b86807a706c635b5e696e7b838a8e91929291908d86796c5f5346392c201300131f2c3946525f6c7985929facada093877a6d6054473a2d252525252525252623282c2d32383d434b515a616c727f8b939ea9b0a69e91847a6d60544b4034281c10040000000713202d3a4653606d78868686868686868686868686868686868686868686868686868686868a95a1b9ac9f9286868686868686867f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e2b343f49525c646e737e858d92999da0a8a9a29f9d9c9b9c9d9fa2aaa7a09d99928e857e736e645c52493f332a1f140900000000000000000000020c162028343f4a545c666d777f8790949b9fa3aba7a3a2a1a1a2a4a8a7a7a09d97928b837b6f6a60584e453b2f261b1106000000000000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d12070000000000000000000000000000000000000000000000000815212d3945505a626d727f8b919c98928c847d756e69686d747c838c92989c918b7f726c625a5044392d201408000000000000000000000000000000000007121c2730394044465153535353535353524745413a31343f4a545c6a6c6c6c6c6c66605b544d453f363029201e28313a41454752535353535353535146443f3830261c1106000000000005121f2b3744505b6574818e9ba6aa9e938a7e716c62605857626f7b8895a093867a6d605c60686d77818e95a0aca79d9184786c605346392f24180c0000000008121d262f363c3f414646464646464544413d3a38342e271e18120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c1013141a1e2121242628292a2b2c2c2d2c2c2c2b2a29272522201f1c1814120e0903000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d79868686868686867a6d61666d737c82878b8e909192929291908d8a86817b716c625b51565e676d737c81868a8d909192929291908e8a87817c736d605b53493f33291f0c0300000000131f2c3946525f6c7985929facada093877a6d6054473a31313131313131313135414c56616c76828f98a3aea49a9184796d60584e42392e22180c030000000000000000000000000b1825313e4b5864717e8b97a8aea399887c6f6255493c3022140a000000020f1b26323d4a5763707d8a96a8afa4998a7d7064574a3d3124170700000714212d3a4754606d7a8793a0ada6998c80808a9095999c9e9f9f9f9d9b98928d857e736d63616e7b8590959b9e9f9f9e9c9286796c5f5346392c201300131f2c3946525f6c7985929facada093877a6d6054473a2d2119191919191919171c1f20272c30394045505a626d74818e97a1adada1968c7f73665c5145382c1f14090000000713202d3a4653606d798692929292929292929292929292929292929292929292929292929298a3aebaaea399929292929292928b7f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303d46515b646e74808a92979fa3a9a19e999792908f8f8f909298989d9fa7a39f97928a80736e635b51453b31261a0e0400000000000000000008131e28323a44505c666d78818c92999fa6a9a19e9a9795949596979b9fa2a9a9a29f9590857c6f6a60574d41382d22170b01000000000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e05000000000000000000000000000000000000000000000005111d29343e48505a626d727f8c929c9f96918a827b73717a818891959f9d928c7f736d625a50483e33281c10040000000000000000000000000000000000000b151e272e34383a4446464646464646453a39352f2b3844505c66757979797979726c665f575146423b3229251f282f35393a4546464646464646443a38342e261e150a000000000000030f1b27333f4953626f7c89949ea9a59f92877e756f6a6764626f7b8895a093867a6d65676d717a818e939da7a99f958a7e71665b5044382b1d120700000000010b141d242b303334393939393939383734312d2c28231d150c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12181d1f20252a2d2e31333536373839393939393838373534322f2d2c2823211e1a140f0b0600000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d67767979797979797976685e5c606a6f757a7e8183858586858483817e7a746e69615a51494c555c606a6f757a7e8183848586858483817e7b756f6a635b504941382d21170d0000000000131f2c3946525f6c7985929facada093877a6d6054473e3e3e3e3e3e3e3e3e3e3e45525d68717e8a949faaa89f93887d6f675d51463d30271d1006000000000000000000000000010e1a2734414d5a6774808d9aa7ac9f9286796d6053463a2d201307000000000a14212e3b4754616e7a8796a1adab998d8073665a4d402f24180c00000714212d3a4754606d7a8793a0adab9f92858d929da0a7aaa39f9e9e9fa2a39f97928a7f736d6975828e97a0a7aaacaaa29f9286796c5f5346392c201300131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0c060c1012131b1e272e343e47515b606d7985919ea7b1a99e9185796d6053463b31251a0e0200000713202d3a4653606d7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa3aab4bfb4aba39f9f9f9f9f9f988b7f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424f59626d74808d929ea1a9a39f97918c8885838282838385888b90959ea1a8a29f928d80736d62574d42362a20160a0000000000000000010d1924303a44505a606d78818e939fa3a9a29f97918d8a888788898b8e92979fa2aaa79f9792867c6f695e53493f33271d12070000000000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d0200000000000000000000000000000000000000000000000c17222d363f48515b636d737f8c929ca09e948f867f7d848d939aa09d938d80736d635b51483e362c22170b00000000000000000000000000000000000000030c151c23282c2d3739393939393939382d2c29242d3a4653606d7987868686867f786e69625b524d443e3530282024292c2d3839393939393939372d2c28231c150c03000000000000000b17222d384854606a75828f97a2aaa399928b827c7773716e6f7b8895a093867a6f7175797e848e939da5aba2979083786c60544a3f33281c0b010000000000020b12191f2326272d2d2d2d2d2c2b2a2724201f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e151a1d24292c2d31363a3b3d4041434445454646464645444342403e3c3a38342e2d2a261f1b17110a0200000000000000000000000000000000000000000000000000000000000000000004101d2935404b555d6c6c6c6c6c6c6c6c6c5e5651586062686d71747678797978787674716d67615e5750483f434b51585f62686d71747678787978777674716e69625f5851443f382f261b0f050000000000131f2c3946525f6c7985929facada093877a6d60544b4b4b4b4b4b4b4b4b4b4b4b4f59606d7a85929ea6aca1968d80746b60554b40342b1e150b0000000000000000000000000004111d2935414c55697683909ca9aa9d908377665c5144382c1f1206000000000714202d3946525e687884919eaba99c8f827669554b4035291d1004000714212d3a4754606d7a8793a0adada29792979da49f9c97989291919298969a9f9f918c7f726e7b87939fa9b1a7a09d98929286796c5f5346392c201300131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000003060a0c151d2328353f45515d67717e8b95a0acada1978b7e7164574d42362a1e120500000713202d3a4653606d798693a0acacacaca49f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a1a6aeb8b1a9a3a19f9f9f9f9f988b7f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54606b727f8c929ca4aaa299928c84807b787675757677797b7f838a91969fa6a49c928b7f72695f53463d32271b0f030000000000000005111d2935414c56616c74808d939ea5a7a097928b85807d7b7b7b7c7e81858c9298a0a7a9a29891857b6e655b5044392f24180c000000000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e1408000000000000000000000000000000000000000000000006101b242d363f49515b636d73808d929da49e98928c8a91969fa49e938e81746e645b51493f362d241a10050000000000000000000000000000000000000000030b12181c1f202a2d2d2d2d2d2d2d2b21201d1f2b3844505c66717e879399928c827b726d615e565046413a3229241d20212b2d2d2d2d2d2d2d2a201f1c17110a03000000000000000006111b2c38434e58616e7b859298a2a9a39f948f8984807e7b7a7c8895a194877a7c7e82858b91969ea5aaa29992857b6e665b5042382d22170b0000000000000001080e13171a1a20202020201f1e1d1a171313100c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191f262b2f35383a3e4246484a4c4e50515252535353525251504f4d4b494644403b3a36312b27221b140b070100000000000000000000000000000000000000000000000000000000000000010d18242f39434b515f606060606060605f524c454e54565e6165686a6b6c6c6c6b696764605d55534d453e363940454e53565d606467696b6c6c6c6b6a6764615e57534e4640332d261d140a000000000000131f2c3946525f6c7985929facada093877a6d605757575757575757575757575754606b74818e97a1ada59e9184796d60594f43392f22190c04000000000000000000000000000613202c3945515d677885929eaba89b8e827568544a4034281c10040000000005111e2a36414c566976838f9ca9ab9e918578675d5145382c1f1306000714212d3a4754606d7a8793a0adb3a9a29fa2a19e948f8b8786858485878a8d92979f93887e727e8b99a4afaba0959088858686796c5f5346392c201300131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000030b1218232935414b55606c7883909da9b3a99d908377695e53463a2d21140600000713202d3a4653606d798693a5afaca29a979393939393939393939393939393939393939393959ca6b1a99f97949393939393938b7f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c666f7c87929fa4aba29892878079736f6a6a696869656c6e72777d848f949fa6a49f92867b6e61584e43382b1f1306000000000000000713202d3946525d68717e8a929da5a79f9590857f7974706f6e6e6f7175797f869195a0a7aaa1978f82776c60554b4035291d1004000000000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e02000000000000000000000000000000000000000000000009121b242d373f49525b636e74808d929da5a39f99979ea1a69e948e81786c605c524940372d241b11080000000000000000000000000000000000000000000000070c1012131e202020202020201f1413111c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f191f202020202020201e1312100c0600000000000000000000000f1b27323d46525e69707d8692979ea5a69e9c95918d8a888786929fac978d87898b8e92979ea1a8a8a09892877e70695f544a3f2f261c110600000000000000000003070b0d0e13131313131312110e0a070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e171e252a3137394045474a4d535457595b5c5d5e5f5f605f5f5f5e5d5c5a585553514a4846423b37332d261d18120c040000000000000000000000000000000000000000000000000000000000000007121d283139404553535353535353535346413c43474c5254585b5d5e5f5f5f5e5d5a5754514c46423b332c2e343c43474c5254575a5d5e5f5f5f5e5d5b5754524d47433c3427221b140b02000000000000131f2c3946525f6c7985929facada093877a6d646464646464646464646464646464666f7c88939fa9a89d93897d70675d51473d3129241e160e060000000000000000000000000714212d3a4754606d7a8797a2ada6998c807366594d402e23180c0000000000010d192530414e5a6774818d9aa7ada197867a6d6053473a2d201407000714212d3a4754606d7a8793a0adbcb3ada9a1979289827e7b797878797a7d81858d929992857b818e9babafa49990837c79797b6e6255483b2f22150800131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000071118242f3a44505b65717e8b97a2adab9f95877b6e6154483b2e23170c00000713202d3a4653606d7986939ea8a69a908a86868686868686868686868686868686868686868a95a1ada3978d87868686868686867f7265584c3f3225190c00121e2b3845515e6b7884919eabaea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54606d78839099a3afa39992867d736d67625f585c5c535b6061656c707a828f949fa9a2988f82766a6054473b2e22150800000000000005121e2a36424d57616d7a85929ea4a99f9590837b726d66646261626364676d727b839095a0aaa99f948b7e71675d5145382c1f140900000000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e140800000000000000000000000000000000000000000000000009121b252d374049525c646e74808d939da59f9f9f9fa79f948f82786d665b504a40372e251b1209000000000000000000000000000000000000000000000000000004060711131313131313131207060b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f13131313131311070603000000000000000000000000000a16212a36424d57606b707d858e939d9fa7a7a09d9a9795989298a3ae9f979495989b9fa2a9aaa29f9691867d706c61574d42382d1d140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a1117202930363c42474b515357575e61646668696a6b6c6c6c6c6c6b6b6a68676562605c5455534d46443f382f29241d160d05000000000000000000000000000000000000000000000000000000000000010c161f282f3539464646464646464646393632373a4146474b4e505252535251504e4b4745413a36312921232831373a4145474b4e505152535251504e4b4746423b37312a2217110a0200000000000000131f2c3946525f6c7985929facada093877a71717171717171717171717171717171717883909aa4ada1968e81746b60554e48443d35302820180f0600000000000000000000000915222f3c4855626f7c8895a9b3a4988b7e7165584b3e32251807000000000000081926333f4c5966727f8c99a5b2a995887b6e6255483b2f221508000714212d3a4754606d7a8793a0adbab9ada19792857d76716e696b6b676d70747a808792978e81828f9ca9ac9f93877b6f6a6c6e695f53473a2e21140800131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000000000007131d27333f4953606d7985929fabb1a7988b7e7265544a3f34281c10030006121f2b3844505c6675818e96a1a4978a7e79797979797979797979797979797979797979788693a0aca194877b79797979797979726d62564a3e3125180b00121e2b3845515e6b7884919eabaea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c66727f8b95a0aba89f92877d706b605d55534e4f4f495053555a61686d79829097a1a49f94897c6f6256493c2f2316090000000000000714212d3a46535e6974818d97a1ada19790837a6e69605c5455545556555c60696e7a839098a2aea69e9184796d6053473b31261a0e0200000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d0100000000000000000000000000000000000000000000000009131c252e37404a525c606c77818e93939393939393959082796d665c544a3f382e251c1309000000000000000000000000000000000000000000000000000000000000040606060606060605000006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a00060606060400000000000000000000000000000000040e1a25303b454f59606b707b818a90959a9ea1a8a6a4aaa39fa3aab4a8a3a1a2a4a8aba49f9c98928c847c706b615a50453b2f261c0b0200000000000000000000000306080909090909090909090909090909090909090909090909090909090909090909090909090909090909090806030000000000000000000000000000020b141c2228323b41464d53555d606468696e70737476777878797979797877767573716f6d6665615f57535049413d352f281f170f06000000000000000000000000000000000000000000000000000000000000040d161d24292c39393939393939392e2d2a272b3036393a3e4143454646454543413e3a39352f2a251f171820262b2f35393a3e4143454546454443413e3b3a36302b2620181006000000000000000000131f2c3946525f6c7985929facb1a4988b7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e808d95a0acab9e91847a6d67625f58544f45413a322a21181006000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000b1825313e4b5864717e8b97a4b0a3968a7d7063574a3d3024170a000714212d3a4754606d7a8793a0adbcb1a79e92857c706b64615e57555d6063686d747e8692938e86929faca99d908376695f60625f574d42372b1e120600131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000010b17222d3845515d6774818e9aabb5a89c8f8275665c5044382c1f12060003101c28343f4a54606d7a84919ea59f92867b6e666c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d798693a0aca194877b6e6c6c6c6c6c6c65625b51463a2e22160900121e2b3845515e6b7884919eabaea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7984919ea7ada1968d80736b6059514b474342423f44464850565d676d7a85929b9993908c8275685c4f4235291c0f020000000004101d2935404b55616e7b86929fa9a69e92857a6e685e57514b484848494b51575e686e7b86929fa9ada1968b7e7165574d42362a1e12050000000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e1105000000000000000000000000000000000000000000000000010a131c252e384044505b656c7881868686868686868683796d675d544a42382d261c130a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f030000000000000000000000000000000000000000000009141f29333d474f5960696e757d83888d9196979a9b9d9e9fa3aab4aaa29f9e9c9b9999938f8b857f796f6a615950483e33291d140a00000000000000000000040a0f121515161616161616161616161616161616161616161616161616161616161616161616161616161616161515120f0a030000000000000000000000020b141d262d333e444c52575f62676d7174787b7d7f81838485858686868585848382807e7c7976726e6964605b534f454039312921170f06000000000000000000000000000000000000000000000000000000000000040c12181d202d2d2d2d2d2d2d2d21201d1b1e252a2d2e32353738393939383634312d2c29241e1a140d0c151a1e24292c2d31343638393939383734312e2d2a251f1b150e0600000000000000000000131f2c3946525f6c7985929facb8a69b908b8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8d929da7b1a79a8e817b77746f6a636059524c443c332a22180f050000000000000000000b1825313e4b5864717e8b97a4afa295897c6f6256493c2f2316090000000000000a1723303d4a5663707d8996a3b0a4978b7e7164584b3e3125180b000714212d3a4754606d7a8793a0adb8ab9f958a7e716a605954524d4b5154565d616c707d8793989298a3aea79a8d817467575355534d453c31261a0e0200131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000006111b2935404b5564717d8a99a3afac9f9285796d6053463a2d20130700000b17232e3845525d68707d89939da2989083796d6059606060606060606060606060606d798693a0aca194877b6e616060606060585651493f34291e120600121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150802020202020202020202020202020202020202020202020000000000000000000000000004101d2935404b5564717d8a96a1acaa9e9184796d60594f45403937312d3337393e444c555e68717e8b8e8a86837f7c6f6255483c2f221509000000000006131f2c3945515d6774818d99a3ab9f948a7e71685e564d45403c3b3b3c40454d565f69727f8b97a1ada99d908377695f53463a2d211407000000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d20140900000000000000000000000000000000000000000000000000010a131c2627333f49535b666c757979797979797979776d675d554b42392f261c140a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f130700000000000000000000000000000000000000000000030d17212b353d474f575e616b70767c8084878a8d8f90919298a3aea2989291908e8c8986837e79726d6660584f473e362c21170b02000000000000000000060e151b1f21222323232323232323232323232323232323232323232323232323232323232323232323232323232322211f1a150e06000000000000000000000a141d262f383f4450565e61696e74797d8184878a8c8e8f909192929392929291908f8d8b8886837f7b76706c656059514b433b332921170d0400000000000000000000000000000000000000000000000000000000000001070d101320202020202020201413110f13191e202125282a2b2c2c2c2b2a272421201d19130e0903030a0f13191d202124272a2b2c2c2c2b2a282421201e1a140f0a030000000000000000000000131f2c3946525f6c7985929facb8aca29b9897979797979797979797979797979797979a9da4aeb5a99d938e8784817c76706b605d564e463c342a21170b0200000000000000000c1926323f4c5965727f8c98a5aea195887b6e6255483b2f2215080000000000000916232f3c4956626f7c8995a2afa5988b7f7265584c3f3225190c000714212d3a4754606d7a8793a0adb6aa9d9083776c61584f4846424145474c525a616b73808d969fa3aab4a5998c7f7266594c4847423c332a2015090000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000000000000000c18242f3a4754606d7a86929facaea298887b6e6255483b2f221508000006111c2935414c56606b74818e96a1a0958d80746b60564c53535353535353535353606d798693a0aca194877b6e6154535353534c4a463f372d23180d0100121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0b0a08040000000000000000000613202c3945515d6775828f9ba8aea3988b7e71675d51473d352f2b2622272b2d323a434c56606d7883817e7a76736f6a5f53473b2e21150800000000000714202d3a4753606d7985929faba89c8f82766c61564c433b342e2e2f2f343b444d57606d7985919eababa095887b6e6155483b2e221508000000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e0200000000000000000000000000000000000000000000000000010a1417222d38414a545b60686c6c6c6c6c6c6c6c6a605d554c433930271d140a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e2215090000000000000000000000000000000000000000000000050f19232b353d454d525961636a6f74787b7d8082838486929fac9f92868483827f7c7a76716d67605c544e463e352c231a0f0600000000000000000006101820262b2e2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2e2b2620181006000000000000000006111b262f38424a505a61686e747b81858a8e919697999b9c9d9e9f9f9f9f9f9e9e9d9b9a9898928f8c87827d78706b605d554d453b33291f160c0100000000000000000000000000000000000000000000000000000000000000010406131313131313131307070502080d111314181b1d1f1f201f1e1d1b181413110d08010000000001080d111314181b1d1e1f201f1e1d1b181414110e090200000000000000000000000000131f2c3946525f6c7985929facb8b4aca6a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a7a9aeaeafafa59d9a96918d88837d746d685f584e463c33291d140a00000000000000000d1a2733404d5a6673808d99a6ada194877a6e6154473b2e2114080000000000000815222f3b4855626e7b8895a1aea6998c807366594d4033261a0d000714212d3a4754606d7a8793a0adb3a9988b7f72655a50463d3a3635393a41465059606d7984919eabb4b2a5988b7f7265584c3f3a37312a21180e030000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000000000000000713202c3945525d687783909daab4aa978a7d7064574a3d3124170a0000000d19242f3a444f59606d7984919aa49f93887d70685d5245464646464646464653606d798693a0aca194877b6e6154484646463f3e3a342d251b11070000121e2b3845515e6b7884919eabaea194887b6e6155483b2e221b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b171714110c05000000000000000714202d3a4753606d7a86929facac9f92867a6d60554b403529241d1a171b1f2028313a44515c666d7775716d6866625f584e43372b1f12060000000004101c2834404b5564717e8b98a2aca096897d70635a50443b31282321222329323c44515c6673808c99aab1a7988b7e7265584b3f3225180800000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e120500000000000000000000000000000000000000000000000000000006111b262f38424a50535b60606060606060605d54514c433a31271e150b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f231609000000000000000000000000000000000000000000000000071119232b333b42464f55585f6267696e71737576787c8895a093867977767572706d6764605d55514b423d342c231a1108000000000000000000040e18222a31373a3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3a37312a22180e03000000000000040d17222d38414a545b606c717a81878d92989b9ea1a8a6a7a8a7a5a4a3a3a3a3a4a5a6a8a6aaa39f9c9a938f8a837d746d675e574d453b31281d13070000000000000000000000000000000000000000000000000000000000000000000006060606060606060000000000010507070b0e101213131212100e0b070604010000000000000000010406070b0e101212131211100e0b08070502000000000000000000000000000000131f2c3946525f6c7985929facb8b0a8a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a1a2a5a7aba8a09e9a949089817a6e6a5f584e453b2f261c1106000000000000000e1a2734414d5a6774808d9aa7ada093877a6d6054473a2d2114070000000000000815212e3b4854616e7b8794a1aea69a8d8073675a4d4034271a0d000714212d3a4754606d7a8793a0adada197877a6e6154473e342d2a292c30353e45515c67727f8c99a3aeb2a5988b7f7265584c3f322b2620180f06000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000000004111d2935414c566875818e9ba8b2a5998c7f7266594c3f3326190c00000008131e28323d45515d67707d88939fa49a91847a6d60594f443a303939393a4653606d798693a0aca194877b6e6154483b393932312e29231b1309000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e28282828282828282828282828282828282828282828282828282423211c1710080000000000000a1723303d4a5663707d8998a3aea89b8e8275675d51433a2f23181d1d1d1d1d161f2834404a545c606a6864615e5655534e463c32261b0f030000000006131f2c3845515c6775828f9caaaa9d9184776b6054483e32291f18151518202834404a54626f7b8898a2aea89b8e8175685b4e423025190d0100000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d211407000000000000000000000000000000000000000000000000000000000a141d262f383f44464e5353535353535353504745413a31281f150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e01000000000000000000000000000000000000000000000000071119202930363e44484e5355575e616467686a6f7b8895a093867a6d69686663605d5553514b454039302b221a1108000000000000000000000a15202a343c434748494949494949494949494949494949494949494949494949494949494949494949494949494949494847433c342a20150a0000000000010c161f27333f49535b666c747e858e92999fa2aaaba9a8a19e9c9a9897979696979798999c9e9fa4acaca49f9c95908981796e695f574d433a2f24180d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facb8a89e969393939393939393939393939393939393939393939495989b9ea1a9aaa69f9c938e847c6f6a5f574d42382d22170b000000000000000e1b2734414e5a6774818d9aa7ada093867a6d6053473a2d2014070000000000000814212e3b4754616e7a8794a1ada79a8d8174675a4e4134271b0e000714212d3a4754606d7a8793a0adab9e918578685e5246392c221e1d20242934404b55616e7a86929facb2a5988b7f7265584c3f32251a150e0600000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000010d19242f404d596673808c99a6b3a79b8e8174685b4e4135281b0e000000010c16202935404b55606b74808d96a0a1968e81746b61564c4135292d2d3a4653606d798693a0aca194877b6e6154483b2e2d2525221e18110901000000121e2b3845515e6b7884919eabaea194887b6e6155483b35353535353535353535353535353535353535353535353535353531302d28221a120800000000000d1a2733404d5a6673808d99aab4aa978b7e7164554c4131282a2a2a2a2a2a2a2a2a232e39424a51535d5b5754524c4847433c342a20150a00000000000713202d3a4653606d7985929facab998c7f7366594f44362c20170d07070e18232e394653606c7985929fabaa9d9184776a564c41362a1d110500000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e22150600000000000000000000000000000000000000000000000000000000020b141d262d333839424646464646464646443a39352f281f160d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d0100000000000000000000000000000000000000000000000000070e171f252a33383c4347484d5254575a5c626f7b8895a093867a6d605b595653514b47454039342e271e19100800000000000000000000030f1b26313c464e53555656565656565656565656565656565656565656565656565656565656565656565656565656565655534e463c31261a0f030000000007131d28313a44505b656c78808a92979fa3abaaa69f9c9896918f8d8b8a8a89898a8a8b8d8f91939a9c9fa4aca7a09d938e837b6e695f554b41352921160a000000000000000000050a0d0f101313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100f0d0a050000000000000000000000000104060712131313130908060300000000000000000000000000131f2c3946525f6c7985929facb8a2968c87868686868686868686868686868686868686868787898b8e92979da0a7aba59d9691857c6f695e544a3f33281d12070000000000000e1b2834414e5b6774818e9aa7aca09386796d6053463a2d2013070000000000000714212e3a4754616d7a8794a0ada79a8e8174675b4e4134281b0e000714212d3a4754606d7a8793a0ada99c8f827669564d41362a1a12111319232f3946525e687683909da9b2a5988b7f7265584c3f32251909030000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000000000081824313e4b5764717e8a97a4b1a89c8f8275695c4f4236291c0f00000000040d18242f3a434f59606d79849199a39d938a7d70685e52463e32292d3a4653606d798693a0aca194877b6e6154483b2e21191816120d070000000000121e2b3845515e6b7884919eabaea194887b6e615548424242424242424242424242424242424242424242424242424242423e3c39332c241a100500000004101c2834404b546976828f9ca9aea398887b6f6255483c2f3737373737373737373737373039404446514e4b4746413c3b37322a261f180f06000000000a1723303d4a5663707d8998a2aea399897c706356493d32231a0e05000007121f2b3844505b6676838f9ca9ac9f928579685e5246392d20130700000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b0000000000000000000000000000000000000000000000000000000000020b141c22282b2d353939393939393939372d2c29241e160d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b000000000000000000000000000000000000000000000000000000050d141a21282c31373a3c4246484a4d55626f7b88959f93867a6d60534c494745403a39352f28231d150c07000000000000000000000006121f2b37434e585f6262626262626262626262626262626262626262626262626262626262626262626262626262626262625f584e43372b1f1206000000010d18242f3a434f59606c77818d929fa2a9ada59e9b948f8b888482807f7e7d7d7d7d7e7e808284878b8f939a9ea6aca59d9590847b6e675d51453d32271b0f03000000000000030a1016191c1d20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201d1c1916100a03000000000000000001070d1113141f202020201515120f0a040000000000000000000000131f2c3946525f6c7985929facada093877a797979797979797979797979797979797979797a7b7c7e81858a90959fa3aba8a19792857b6e665b5044392e23180c0000000000000e1b2835414e5b6874818e9ba7aca09386796d6053463a2d2013070000000000000714212d3a4754606d7a8793a0ada79b8e8174685b4e4135281b0e000714212d3a4754606d7a8793a0ada89b8e8175685b4e423025190f0408121d2a36414c566774818d9aa7b2a5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000a1724303d4a5763707d8a96a3b0a99c908276695d5043362a1d10000000000007131d28313d45515d676f7c87929fa59e91857a6d615a50443b302d3a4653606d798693a0aca194877b6e6154483b2e211508090601000000000000121e2b3845515e6b7884919eabaea194887b6e61554e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4a49453e362c22170c00000006131f2c3845515c667884919eabac9f9286796d6053464444444444444444444444444444444444444444444444444444443b3a36312a21180e030000000d192633404c5966737f8c99aaac9f92867a6d6053473a2d201407000000030f1c28333f4a546874818e9ba7aea298877a6d6154473a2e21140700010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f030000000000000000000000000000000000000000000000000000000000020a11171c1f20282d2d2d2d2d2d2d2d2a21201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b2014080000000000000000000000000000000000000000000000000000000002090e161c20262b2e30363a3b3e4855626f7b88939393867a6d6053473d3a39352f2c29241d18120b030000000000000000000000000815212e3a47535f6a6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6a5f53473a2e21150800000004111d2935414b55616b73808d939da4ada9a29f938e88827e7b78757472717070707071727375777b7e82878f939fa2aaa7a0969183796d60594f43382c1f14090000000000040d151c212629292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292926211c150d04000000000000040c13181d20202b2d2d2d2d22211f1b150e0600000000000000000000131f2c3946525f6c7985929facada093877a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c666c6d6e6f7274797e838c9299a3aba9a1978f82786c60554b4034281c100400000000000e1b2834414e5b6774818e9aa7aca09386796d6053463a2d2013070000000000000714212e3a4754616d7a8794a0ada79a8e8174675b4e4134281b0e000714212d3a4754606d7a8793a0ada79a8d8174675a4e4134271b0801010d1925303e4b5864717e8b97a4b1a5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000a1623303d495663707c8996a3afaa9d9083776a5d5044372a1d110000000000010c161f2935404b55606a73808d95a0a1978e81756c61564c41362d3a4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e615b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b575550483e33281c110400000713202d3a4653606d7986939facaa9d908477665c50505050505050505050505050505050505050505050505050505050504846423b332a1f1409000004101d2935404b556975828f9ca8aa9d918477675d5145392c201306000000000b17222d414d5a6774808d9aa7b4aa94887b6e6155483b2e2215080005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f120500000000000000000000000000000000000000000000000000000000000000060b0f12131b20202020202020201d1413110d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f03000000000000000000000000000000000000000000000000000000000000050b10151b1f21252a2d2f3c4855626f7c8686868686796d6053473a2d2c2924201d18120c0700000000000000000000000000000915222f3c4855626f7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c6f6255483c2f2215090000000613202c3945515d67707d8a929ca5aea9a197928a817c76726e69696765646463636464656669696e72767c828a9298a2aaa8a0958e81746b6054483c31261a0e02000000030d161f262d32353639393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393635322d261f160d0300000000040d161d24292c2d38393939392f2e2b2620181006000000000000000000131f2c3946525f6c7985929facada093877a6d606060606060606060606060606060605b6060616265666d71787f879299a3afa99f948b7f72675c5145382c1f130700000000000e1b2734414e5a6774818d9aa7ada093867a6d6053473a2d2014070000000000000814212e3b4754616e7a8794a1ada79a8d8174675a4e4134271b0e000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d0100081724303d4a5763707d8a96a3b0a5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000916222f3c4955626f7c8895a2afaa9e9184776b5e5144382b1e11000000000000040d18242f39434e58606d79839099a39e938a7e71685e52463e333a4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6868686868686868686868686868686868686868686868686868686868686864615a5045392d21140800000815212e3b4854616e7b879aa4afa99c90837669545d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534d453b31261a0e020006131f2c3845515d677884919eaba99d9083766a554b4035291d110400000000061a2633404d596673808c99a6aea295887b6f6255483c2f221509000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d2013060000000000000000000000000000000000000000000000000000000000000000000306060f131313131313131311070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d1308000000000000000000000000000000000000000000000000000000000000000000040a0f12151a1e212e3a47535f6a76797979797976675c5145382c201d1813100d0701000000000000000000000000000000111e2a3744515d6a77848989898989898989898989898989898989898989898989898989898989898989898989898989898983766a5d5043372a1d10000004101d2935404b55606d7984919ea4aeaaa19791857e756f6a65615f575a58575756565757585a565e61656a6f757e869298a2aea89e93897c6f63574d42372b1e12050000000a151f2831383e4243464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464643423e3831281f150a000000010c161f282f35393a45464646463c3b37322a22180e040000000000000000131f2c3946525f6c7985929facada093877a6d6054535353535353535353535353534a5053545456545c60666d737e87929fa7b0a69e9185796d6053463a2f24180d01000000000e1a2734414d5a6774808d9aa7ada093877a6d6054473a2d2114070000000000000815212e3b4854616e7b8794a1aea79a8d8074675a4d4134271a0e000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d0100091623303c4956636f7c8996a2afa5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000916222f3c4955626f7c8895a2afab9e9184786b5e5145382b1e120000000000000007121d27313d45515c666f7c87929fa59e92857a6e615a50453b3a4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b7575757575757575757575757575757575757575757575757575757575757575716c6155493c3023170a00000916232f3c4956626f7c8995acb6a89c8f82756a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a615f574d42362a1e1205000714202d3a4753606d7a86939faca89c8f8275695c4f422f24180d01000000000d1a2733404d5a6673808d99a6afa295887c6f6255493c2f221609000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b0100000000000000000000000000000000000000000000000000000000000000000000000306090e121f2b37434e585f626c6c6c6c6c6c5c554b4034291c110d0704010000000000000000000000000000000000111e2a3744515d6a77849095959595959595959595959595959595959595959595959595959595959595959595959595959083766a5d5043372a1d10000006131f2c3945515d67737f8c96a1adaea29891857b716c625f5855534d4d4c4b4a4a4a4a4b4b4d4d5254585f626c707c86929fa7afa59c8f8276695f53463a2d211407000005101c26313a42494e505353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353504e49423a31261c1005000007131d28313a40454752535353534847433c342a20150a0000000000000000131f2c3946525f6c7985929facada093877a6d6054474646464646464646464646463f44464748494b51545c606c727e8b959fabada1978b7e7165554b4135291d1104000000000d1a2733404d5a6673808d99a6ada194877a6e6154473b2e2114080000000000000815222f3b4855626e7b8895a1aea6998d8073665a4d4033271a0d000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222f3b4855626e7b8895a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000916232f3c4956626f7c8995a2afaa9d9183776a5e5144372b1e1100000000000000010b151f2834404b545f6a737f8c959fa1978f82756c62574d423a4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb5a89b8f8281818181818181818181818181818181818181818181818181818181818181817e7164574a3e3124170b00000a1623303d495663707c8996a3afa89b8e8177777777777777777777777777777777777777777777777777777777777777776e695f53463a2d211407000915222f3c4855626f7b889aa4afa89b8e8275685b4f422d22170b00000000000e1b2834414e5b6774818e9aa7b4ab95887b6e6255483b2f221508000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b02000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c464e535560606060605f514b43392f23180c010000000000000000000000000000000000000000111e2a3744515d6a7784909da2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a29d9083766a5d5043372a1d1000000714202d3a4753606d7985929ea8b1a79f92867c6f69615a534e484642413f3e3d3d3d3d3e3f404246474e535a616a717e8b959fabac9f93877b6e6155483b2e22150800000a16212d38424c545a5c60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605c5a544c42382d21160a00010d18242f3a434b51535e6060606055534e463c32261b0f0400000000000000131f2c3946525f6c7985929facada093877a6d6054473a393939393939393939392d3338393a3b3c40454a505a606c7883909da9b3a99d908376675d5145392c201306000000000c1926333f4c5966727f8c99a5aea195887b6e6255483b2f2215080000000000000916222f3c4955626f7c8895a2afa5988c7f7265594c3f3226190c000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000a1623303d495663707c8996a3afaa9d9083776a5d5044372a1d110000000000000000030d18232e39424e58606d78839098a39e948b7e71695e52463f4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7aa9e938f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8c807366594d4033261a0d00000a1724303d4a5763707d8a96a3b0ab9e928583838383838383838383838383838383838383838383838383838383838383837b6e6155483b2e221508000a1724303d4a5763707d8a96acb6a89c8f827569544a3f33281c0f0300000004111d2935414c566875828e9ba8aea399877a6e6154473b2e211408000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e09060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f080100000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c43474853535353535345403931271d1207000000000000000000000000000000000000000000111e2a3744515d6a7784909d9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d9083766a5d5043372a1d100004101c2834404b5464717e8a97a2acaca0958b7e726a5f575047433c3a3631323131303031313230363a3c43475058616c7683909da9afa49a8c7f7265594c3f3226190700000d1926323e49545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69665e54493e3226190d0004111d2935404b555d606b6c6c6c6c625f584e43372b20150a00000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2d2d2d2d2d2d2d2d2d22282b2d2d2e2e34383f44505b65707d8997a2adac9f92867a6d6054473a2d211407000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000000000000a1623303d495663707c8996a3afa4988b7e7165584b3e3225180b000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000b1824313e4b5764717e8a97a4b1a99c8f8276695c504336291d1000000000000000000007121d27303c44505c666f7c86929fa69f92857b6e615b51454653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7afa59e9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b998c807366594d4033261a0d00000a1724313d4a5764707d8a97a3b0ada1979290909090909090909090909090909090909090909090909090909090909090887b6e6255483b2f221508000b1825313e4b5864717e8b97a4b1a99d908376665b5044382b1f130a0603060a13202c3945525d687784919daaac9f9286796c605346392d201306000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b080300000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18222a31373a3c46464646464638342f271f150b01000000000000000000000000000000000000000000111e2a3744515d6a77839093939393939393939393939393939393939393939393939393939393939393939393939393939083766a5d5043372a1d100006131f2c3845515c6675828f9a9c9fa29d9083786d60584e453e37322d2a262524242323242425252a2d32373e46505a64717e8b97aab3ac9c8f8275695c4f422f24180c00000f1c2935424e5a66707679797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797670665a4e4235291c0f000613202c3945515d676d78797979796f6a5f53473d32271b0f00000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d212020202020202020171c1f20212123282e343f4953606d7985929eabafa3998a7d7063574a3d3024170a000000000b1724313e4a5764717d8a97a4b0a3968a7d7063574a3d3024170a0000000000000b1724313e4a5764717d8a97a4b0a3978a7d7064574a3d3124170a000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000000000c1926333f4c5966727f8c99a5b2a79b8e8174685b4e4135281b0e000000000000000000000b151e28343f4a545f6a727f8c949fa2978f82766d62574d4653606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7b8afaaa8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a6998c807366594d4033261a0d00000a1724313d4a5764707d8a97a3b0b3a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d94887b6e6155483b2e221508000c1926323f4c5965727f8c98a5b2ab9e9285796c6053463a30241b14121012141c26303a4754606d7a86939facaa9d918477655b5044372b1f1205000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101820262b2e2f3939393939392c29231d150d0300000000000000000000000000000000000000000000111e2a3744515d6a77838686868686868686868686868686868686868686868686868686868686868686868686868686868683766a5d5043372a1d10000713202d3a4653606d79868b8d909298988a7e71665c50463c332b26211e1a1918171717171818191e20262b343e4754616e7b8798a2aeaa9e9184776b554b4035291d100400101d293643505c69768386868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868276695c504336291d10000714202d3a4753606d7a85868686877c6f62584e43372b1d1207000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114131313131313130b0f12131415181c232d3844505c6675828e9ba8b5ab998c7f7266594c3f3326190c000000000916232f3c4956626f7c8995aab4a4978b7e7164584b3e3125180b0000000000000c1925323f4c5865727f8b98a5b4aa95887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000000004101c2934404b556774818e9aa7b3a6998c807366594d4033261a0d00000000000000000000030c17232e38424e58606c78839098a29f948b7f72695f544a53606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7b1a9a3a19f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f998c807366594d4033261a0d00000a1723303d4a5663707d8996a3b0b8b0aba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa9aaaaaaaaaa94877a6e6154473b2e211408000d1a2733404d5a6673808d99a6b3ada297887c6f62564c41352d26201f1c1f20262e38424e5864707d8a9aa4afa89b8e81756853493f33271b0f03000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100f0d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151b1f21222d2d2d2d2d2d1f1c18120b030000000000000000000000000000000000000000000000101d2936424f5b677177797979797979797979797979797979797979797979797979797979797979797979797979797979797671665b4e4236291c10000613202d394653606c777c7e808385888b867a6d60544a3f342a211b15120e090b0a0a0a0a0b090e11151b222d3a46525e697885929fabac9f928679675d5145392c1f130600101d293643505c6976838f9393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393938f8276695c504336291d10000613202c3945515d67717e8b959a8f82756a605447392e23180c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070606060606000003060607070c111b28343f4a546673808d99a6b3a69a8d8073675a4d4034271a0d010000000814212e3b4754616e7a8798a3aea6998c7f7366594c40332619090000000000000d1a2733404d5a6673808d99a6aea298877a6d6154473a2e211407000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000000006131f2c3845515c677783909daab4aa988b7e7165584b3e3225180b000000000000000000000006111c26303c44505b666e7b86929fa69f92867b6e665b5053606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7a99f9894939393939393939393939393939393939393939393939393939393939393938c807366594d4033261a0d0000091623303c4956636f7c8996a2afb0a69f9c9393939393939393939393939393939393939393939393939c9ea6b0aea398877a6d6054473a2d211407000e1a2734414d5a6774808d9aa7b3b3a9998c8073685d52463f382f2d2b282b2d30383f4a545f6a76828f9cacb0a6988b7e7265584b3f2d22170b00000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d050000000000000000000000000000000000000000000000000000000000000000000000000004070c10121316191b1d1e1f1f201f1f1e1d1b19171414110e0806030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a0f12151520202020202013100c07010000000000000000000000000000000000000000000000000e1a27333f4a555f676a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a665f554a3e32261a0d0005121f2b3744505b656c6f717476797b7e7e71675d5142382e22180f0a0502000000000000000002050b111e2a36424d566b7884919eabafa399867a6d6053473a2d20140700101d293643505c6976838f918b86868686868686868686868686868686868686868686868686868686868686868686868686868686868686868b918f8376695c504336291d100004111d2935404b55606d7883909d94897c6f62544b4034281c10040000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000000b17232e3f4c5965727f8c98a5b2a79a8e8174675b4e4134281b0e010000000613202d394653606c7985929faca79b8e8174685b4e4131261a0e020000000003101c28343f4a546875828e9ba8ac9f928579685e5246392d201307000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000000000000000714202d3a4753606d7986929facaea298887c6f6255493c2f2216090000000000000000000000000a151e28333f4a545f69727f8b949fa2989082786c605753606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabb7a3988d888686868686868686868686868686868686868686868686868686868686868686807366594d4033261a0d00000815222f3b4855626e7b8895a9b3ab9f948f8686868686868686868686868686868686868686868686868f949eaaac9f928579675d5145392c201306000e1b2734414e5a6774818d9aa7b4b8ab9f92857a6d615b5049413c393834383a3d424a505c666e7c87939facab9f94877b6e6154483b2e21150600000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a00000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e0802000000000000000000000000000000000000000000000000000000000000000001070c1013181c1f20232527292b2b2c2d2c2c2b2a28262421201e1915120f0a0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306080913131313131306040000000000000000000000000000000000000000000000000000000a16222e39434d555b5d606060606060606060606060606060606060606060606060606060606060606060606060606060605d5b554d43382d22160a00030f1b27333f49535b60626467666c6e71716c62554b4030261c100600000000000000010507090e12161c222c3845515c677885919eabaea399877a6d6054473a2d21140700101d293643505c6976838f8b7f79797979797979797979797979797979797979797979797979797979797979797979797979797979797979797f8b8f8376695c504336291d1000010d18242f3a44505c66717e8a979a8e8174665c5145382c1f13060000000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000000000000000104091925323f4c5865727f8b98a5b2a89b8e8175685b4e4235281b0f0200000005121f2b3744505b657783909daaa99c90837669574d42362a1e12050000000006121f2c3844505c667783909daaa99d9083766a564c4135291d1105000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000007101d2935404b5563707d8a99a3aeac9f9285796d6053463a2d201307000000000000000000000000030c17222d38424d57606c77828f98a29f948c7f726a5f54606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b7979797979797979797979797979797979797979797979797979797979797979736e63574b3f3226190c00000714212d3a4754606d7a8797a2ada99c8f82797979797979797979797979797979797979797979797979828f9ca9ab9e9184786b554b4135291d1104000e1b2834414e5b6774818e9aa7b4b3ada2988d81746d605b534e4846443f4446484e545c606d7883909aa4afa79c8f8376695e52463a2d20140700000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d05000000000000000000000000000000000000000000000000000000000003090e12181d1f23282c2d3032343638383939393838373533312e2d2a25211f1b150f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c27313b434a4f5153535353535353535353535353535353535353535353535353535353535353535353535353535353504e4a433a31271c110500000b17222d38414950535558545b60626465625a50433a2f1e140a00000000020507080d1113141a1e21272c343c4653606d7986929facac9f928679675d5145392c20130600101d293643505c6976838f8b7f726c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c727f8b8f8376695c504336291d10000007131d28343f4a54606d7985929e9285796d6053463a2d2013070000000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0c0c0c0c0c0c0c070d10151c28333f4a546673808c99a6b3a79a8e8174675b4e4134281b0e01000000030f1b27333f49536874818e9ba7ab9f928578695f53463a2d211407000000000713202d3a4653606d7986929faca79a8e8174675b4e413025190d01000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000000000050e19222c3945515d6774818e9aabb4a99c908376665c5044382c1f12060000000000000000000000000006111c262f3c44505b656e7b86929fa69f92867b6e665c606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c66635c52473b2f23170a00000613202c3945515d677885929eabaa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c667784919eaaa99c8f8376695c50432f24180d01000e1b2834414e5b6774818e9aa7b3a9a19e9e928b7f726c655f585553504a5053555860666d74808d959facaba0958a7d7164574d42362a1e120500000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f23160900000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e06000000000000000000000000000000000000000000000000000001070c141a1d24292c2e34383a3c3f4143444546464645444342403e3b3936302e2b261f1c17110a020000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100f0d0b0807050200000000000000000000000000000000000000000000000000000b151f2931393f42444646464646464646464646464646464646464646464646464646464646464646464646464646464643423e3831281f150a00000006111b262f383f4446484b4a50535558585650483f31281d0c02030506090e121415191d2021262b2d33383e464e58636f7c8999a3afab9e9185786b554b4135291d110400101d293643505c6976838f8b7f72656060606060606060606060606060606060606060606060606060606060606060606060606060606065727f8b8f8376695c504336291d100000010b17232e3845515c6673808d99978a7d7063574a3d302417070000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211919191919191919191919191a181d20262b3844505b6674818e9ba7b3a6998d8073665a4d4033271a0d00000000000b17222d3f4c5965727f8c98aaada297887b6e6155483b2e23180c000000000915222f3c4855626f7b8898a3aea9988b7e7265584b3f3225180800000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000060e17202935404b55606d7985929fabb1a7988c7f7265544a3f34281c100300000000000000000000000000000a141d27333f49535e69717e8b949ea3989083786d60606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e616060606060606060606060606060606060606060606060606060606060605957524a40352a1f1307000004111d2935414c55697683909ca9ab9f928578695f606060606060606060606060606060606060606d7986929faca79a8d8174675a4e4134271b0700000e1b2734414e5a6774818d9aa7ada19792919692877f776f6a6562605b545c6062656a6f78808d929ca7afa4999083786c6053463b30251a0e0200000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e2115080000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f07000000000000000000000000000000000000000000000000030b12181f252a2f35393a404446494c4e5051525253525251504e4c4a4746413c3a37312b28221c140b070000000000000000000000000000000000000000000000000000000000000000000004070c10121316191b1d1e1f1f201f1f1e1d1b19171414110e0806030000000000000000000000000000000000000000000000040d171f272e333637393939393939393939393939393939393939393939393939393939393939393939393939393939393736322d271f160d03000000000a141d262d3337393c3e3f4446484b4b4a453f362d1f160c0b0f1213151a1e2121252a2d2e31373a3d44485058606a74818e9babb5a99d9083766a5d50432f24180d0100101d293643505c6976838f8b7f72655853535353535353535353535353535353535353535353535353535353535353535353535353535865727f8b8f8376695c504336291d1000000006111c2834404b54626f7c88979a8d8073675a4d402e23180c0000000000131f2c3946525f6c7985929facada093877a6d6054473a2d252525252525252525252525262624292c31373f4a54606c7985919eabb3a9988b7e7165584b3e3225180b00000000000616232f3c4956626f7c8998a2aea9978b7e7164544b4034281c1004000004101d2935404b5565727e8b98aaada197887c6f6255483c2f22150900000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211407000000000000000000030a0f182029323b45515d67727e8b97a2adab9f95887b6e6155483b2e23170c000000000000000000000000000000020b17222d38414d57626c75828f97a29f958c7f736a606d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e615553535353535353535353535353535353535353535353535353535353534d4b4740382e24190e020000010d19242f414d5a6774808d9aabaea298887b6e61555353535353535353535353535353535355626f7c8899a3afa9988b7e7265584b3f3225180c00000e1a2734414d5a6774808d9aa7ab9e9285849199928c827c76726e6c666b666d6e72767c828d929ca4aea69f93877c6f655b504437291f14090000000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d20130700000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000000000000000000000000060d151d24293136394045474a515356585a5c5e5e5f605f5f5e5d5b595754524c4847433c38332d261d18120b03000000000000000000000000000000000000000000000000000000000001070c1013181c1f20232527292b2b2c2d2c2c2b2a28262421201e1915120f0a0300000000000000000000000000000000000000000000050d151c2227292a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2a2926221c150d040000000000020b141b22272b2d2f2d3338393b3e3e3d3a342d241b1114171b1f2022252a2d2e3036393a3d4246484f545a616a6f7c87939facb2a8998d8073665a4d4033271a070000101d293643505c6976838f8b7f7265584c4646464646464646464646464646464646464646464646464646464646464646464646464c5865727f8b8f8376695c504336291d10000000000c18232e394653606c7985929c90837669544b4034281c100400000000131f2c3946525f6c7985929facada093877a6d6054473a3232323232323232323232323232332f35393c4347505b66707d8997a1adada297887c6f6255493c2f22160900000000000713202d3a4653606d7985929faba79b8e8174665c5145382c1f160c06060c141f2c3845515d6775828e9ba8ab9e9285786c605346392d20130600000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140700000000000205060b0f151a212a323b444e58606d7984919ea9b2a89d908376695f53463a2d1c11060000000000000000000000000000000006111b262f3b45505a616e7b85929fa59f92877c6f666d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e61554846464646464646464646464646464646464646464646464646464646403f3b352e261c120700000000081724313e4a5764717d8a99a3afaa988b7e7165574d42464646464646464646464646424d5765727f8c98abada297887b6f6255483c2f22150900000d1a2734404d5a6773808d9aa6ab9e92857d89929f948f88827e7b79787778797b7f828990949da4aea69e938d80736b6053493f3327170d0300000006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f1306000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b2219100700000000000000000000000000000000000000000910181f272f353b42464b5153545c60636567696b6b6c6c6c6b6b6a686664615e5655534e46443f382f28231d150c05000000000000000000000000000000000000000000000000000003090e12181d1f23282c2d3032343638383939393838373533312e2d2a25211f1b150f0b06000000000000000000000000000000000000000000040b11161a1d1e202020202020202020202020202020202020202020202020202020202020202020202020202020201d1c1a16110a0300000000000000020a11171b1f202222282b2d2f3132312e29221b191e2022272b2d2f31363a3b3e4146474a4d53555960636c717c859199a4afaca096897d706356493d3023160a0000101d293643505c6976838f8b7f7265584c3f393939393939393939393939393939393939393939393939393939393939393939393f4c5865727f8b8f8376695c504336291d1000000915202b353f4744505b6575828f9b918578665c5145382c1f130600000000131f2c3946525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f40414045474e535b606c7883909da9b3ac9e9285796c605346392d201306000000000006121f2b3844505c6675828f9caaab9e9285796d6053463d31281e171515171e28313a4753606d7985929facaa9b8e8175655b5044372b1f120500000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d21140c0c0c0c0d090e1114171b1f262b333b444c56606a73808c96a1adada1968a7e7164574d42362a1e0a0000000000000000000000000000000000000a141d29333f46525e69717e8a939ea3999083796d6d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b39393939393939393939393939393939393939393939393939393933322f2a241c130a00000000000714212e3a4754616d7a86929faca89b8e8275695e53463d313939393939393939303946525e6976828f9ca9ab9e9285786c605346392d20130600000d192633404c5966737f8c99a6ab9f928578808d939f9c948f8b888685848586888b8f949c9fa6aca49d948f81786c60594f41382d2217050000000003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c10040000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000000000000000000000009121b222a313940454d53555d6065666d6f72747677787979797877767573716e6867625f5853504a423d342e271e170e05000000000000000000000000000000000000000000000001070c141a1d24292c2e34383a3c3f4143444546464645444342403e3b3936302e2b261f1c17110a0200000000000000000000000000000000000000060e151b1f21222323232323232323232323232323232323232323232323232323232323232323232323232323232322211f1a150e06000000000000000000060b0f121315171c1f2022252524211d1d20252a2d2d3337393c3f4246484b4c525457575f61656b70767e859197a1abb1a79d9184786c605346392d2013060000101d293643505c6976838f8b7f7265584c3f322d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d323f4c5865727f8b8f8376695c504336291d1000010e1a26313d4751595e5f6673808c999786796d6053463a2d20130700000000131f2c3946525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4d4d4b5153585f626d737f8c959fabafa49a8d8174665b5044382b1f1206000000000003101c28343f4a5464717e8b98a3ada2978a7d7064594f433a30282322222227303a434f5964717e8a98a2aea2988a7d706453493f33271b0f0300000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211919191919191a191e2022272b31373e454d565e686f7c87929fa8b1a79e9184786d6053463b31261a0e000000000000000000000000000000000000020b17212a36424d56616c75818f97a1a0958c80736d798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2626231f19120a0100000000000713202d3946525d6876828f9ca9ac9f92867b6e61584e433b322c292424292c3139424d57616e7b86929faca89b8e8174655b5044372b1f120500000c1825323f4b5865727e8b98a5ac9f92867977818c939a9f9c989993929192939a989c9fa6aba8a09d928d82796d665b50463d2f261b110600000000000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c00000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c030000000000000000000000000000000009121b242c343c434b51575e61676d7175797c7f81838485858685858483817f7d7a77736f6a64605b544f454039302920170f05000000000000000000000000000000000000000000030b12181f252a2f35393a404446494c4e5051525253525251504e4c4a4746413c3a37312b28221c140b07000000000000000000000000000000000006101820262b2e2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2e2b262018100600000000000000000000030506060b0f12131518181b1e25292d3036393b3f4446484b4d535457565e616467696e72777d828a9297a1a9b3aa9f958b7e71665b5044382b1f12060000101d293643505c6976838f8b7f7265584c3f322520202020202020202020202020202020202020202020202020202020202025323f4c5865727f8b8f8376695c504336291d100004111d2a36424e59636a6c6c727f8b9894877a6e6154473b2e21140800000000131f2c3946525f6c7985929facada093877a6d605858585858585858585858585858585859595a555d60646a6e767f8c919ca7b1a99f93877c6f62544a3f33281c0f030000000000000b17232e3a4754606d7a86929faca99c9083766b60554b423a342e2f2e2d333a424b55616b7683909daaab9f9285796d6053473a2d22170b0000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2525252525262627252a2d2d33373c434750575f686e7a849199a3afaa9f958b7e71665c504438291f140900000000000000000000000000000000000000050f1925303b44505a616d7a85929ea59f92877c6f798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e22202020202020202020202020202020202020202020202020201a1917130e070000000000000005111d2935414c5664717e8b96a1ada3998d80746a60564d443e39352f2f35383c434b545e6973808d99a3aca096897d706353493f33271b0f0300000b1824313e4b5764717e8a97a4aea399867a6d74808891969d9fa49f9e9e9e9fa4aca9a7a79f9d95918980786d675c544a3f342b1d140a0000000000000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d30231607000000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b00000000000000000000000000000008121b242d363e464e555d60696e74797e8285898b8d8f91919293929291908e8c8a8784807c76716c666059514b433b332921170e0500000000000000000000000000000000000000060d151d24293136394045474a515356585a5c5e5e5f605f5f5e5d5b595754524c4847433c38332d261d18120b030000000000000000000000000000040e18222a31373a3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3a37312a22180e03000000000000000000000000000003060b141a20262b3035393b4146474950535558575e616467686d7074777b7f84898f949fa2a9b2aaa2989083786d60544a3f33281c0f030000101d293643505c6976838f8b7f7265584c3f322519131313131313131313131313131313131313131313131313131313131925323f4c5865727f8b8f8376695c504336291d100006121f2c3845525e6a757979797e8a9795887b6e6255483b2f22150800000000131f2c3946525f6c7985929facada093877a6d656565656565656565656565656565656565666768676d71757b828c919ca4adaba2978e81756a5f5342382d22170b000000000000000613202c3945515d6775818e9ba6ab9f94897d70675d544c443f3c3b3b3c3f444b545d67707d89959faba4998d8174675c5145382c1b11060000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473a32323232323232333430363a3b3f44464e535a61696e7a839096a1abaea3989083786c60544a3f34281c1003000000000000000000000000000000000000000009141f29323e46525e68707e8a939ea399908378798693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e22151313131313131313131313131313131313131313131313130d0c0a07020000000000000000010d1924303a4653606d7984919ea7ab9f92877c6f685e564f47454141414045474e555c666e7b86929faba89e9184786c605346392d22170b0000000a1623303d495663707c8996abb5ab94877b6e6e737d848a9095989b9d9e9f9f9f9e9c9a9895908a847d736d665c554b42382d22190b020000000000000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d20130700000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d12070000000000000000000000000006101a242d363f4850585f676d737b80858b8f9298989a9c9e9e9f9f9f9e9e9d9b999795908d88837e786f6b605c554d453b332920170c0300000000000000000000000000000000000910181f272f353b42464b5153545c60636567696b6b6c6c6c6b6b6a686664615e5655534e46443f382f28231d150c05000000000000000000000000000a15202a343c434748494949494949494949494949494949494949494949494949494949494949494949494949494949494847433c342a20150a00000000000000000000000000020a11171f262a32373a4146474c5254535b60626568696e7174777a7d8084888c91959c9fa6adafa9a19892867b6e665c5142382d22170b000000101d293643505c6976838f8b7f7265584c3f3225190c06060606060606060606060606060606060606060606060606060c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c798786868a909a95887b6f6255483c2f22150900000000131f2c3946525f6c7985929facada093877a72727272727272727272727272727272727272737475777a7d82878f949ca3adaba39992857b6e61584e432f261c11060000000000000004111d2935414c55626f7c88949faba69e9184796d665d56504a494848494950555d666d7984919ea7aa9f93877b6e61554b4034291c0a000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6054473f3f3f3f3f3f3f3f404042424647495053585f626c717b839095a0a8afa59f92867c6f655b5042382e23170c000000000000000000000000000000000000000000020d17202a36414c56616c75818e96a1a0958b7e788693a0aca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e2215080606060606060606060606060606060606060606060606000000000000000000000000000008131f2c3845515c67727f8b95a0aba39991847a6e68615954514c4e4e4b5153575f676d78839098a2aca0968b7f72665b5044382b1b11060000000815222e3b4855616e7b8899a3afa295897c6f626b6f797e83888b8e909192929291908e8b87837e78706b605c544b43392f261c10070000000000000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f13060000000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c030000000000000000000000030c18222c363f48505a616a6f7980868d92979c9fa2aaa7a9a8a7a6a6a6a7a8a9a8a6a7a09d9a94908a837c746d675e574d453b32291e150a0000000000000000000000000000000009121b222a313940454d53555d6065666d6f72747677787979797877767573716e6867625f5853504a423d342e271e170e050000000000000000000000030f1b26313c464e53555656565656565656565656565656565656565656565656565656565656565656565656565656565655534e463c31261a0f030000000000000000000000040b141c222831363c43474c5254565e6164656c6f7275787b7e8184868a8d9196989da0a8abb0aba59e9791867d6f695f544a402f261c1106000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c79869293979aa295887c6f6255493c2f22160900000000131f2c3946525f6c7985929facb2a5988c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80808284868a8f92999fa6adaaa29992877d70695e52463c321d140a0000000000000000010d19242f3a47535f6a76828f99a3aca0968f82786d68605c5456555555535b60676d78818f96a0aca2988e8175695f5343392f23180c000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d60544c4c4c4c4c4c4c4c4c4c4d4e4d5254535b60636a6e757e859195a0a7afa59d938b7f726a5f53493f30261c110600000000000000000000000000000000000000000000050e1925303a44505a606d7a84919ea59e91847a8793a0ada194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55606d78839099a3aba09690837a706b64605d555b5b555d60636a6e79818e959faaa49a9184796d60544a3f33281c0a000000000713202d3a4653606d7986929faca4978a7d716460666d71777b7f8183858586858483817e7b76716d666059504a423930271d140a0000000000000000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c100400000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b40342820150900000000000000000000000b151e2a343e48505a626c717c848c92989fa2a9aca8a8a09e9c9a9a999a9a9b9d9fa3ababaaa69f9c95908781796e695e574d443b30261c1106000000000000000000000000000009121b242c343c434b51575e61676d7175797c7f81838485858685858483817f7d7a77736f6a64605b544f454039302920170f050000000000000000000006121f2b37434e585f6262626262626262626262626262626262626262626262626262626262626262626262626262626262625f584e43372b1f120600000000000000000000040d161d262d333b42464e53565e6165686e7175787c7e8184878a8e91939a9a9da0a8aaacaeaca69f9c938e857c6f6b60574d42392e1d140a00000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7986929fa4a6a295887c6f6255493c2f22160900000000131f2c3946525f6c7985929facb8a79c918c8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8c8d8e9193999c9fa3abaca69f9892877e716b61564d42342a200b0200000000000000000008131e2b37434e58626e7c87929fa7a89e948f827a716d66646262616264656c7079818f939ea8a69f92867b6e61574d4231271d1207000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d6058585858585858585859595a5b565e6164656c70757c828a9297a0a8afa59e938e81746d62584e41382d1e150a00000000000000000000000000000000000000000000000008131e29323e45525d68707d8a939da1978c808c99a6aea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150801010101010101010101010101010101010101010101010100000000000000000000000000000c18232e3944515c666f7c87929fa4a8a09590847d76716d6769676869676d70757b838e939ea7a59f93887d70665c5142382d22170b0000000006121f2c3844505c667784919eaaa5998c7f7266545c6064696e72747778797979787674716e6964605c544f443f3830271e150b020000000000000000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c000000000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000000000007121d27303c46505a626c717e8691969fa2aaaba39f9b9796918f8e8d8d8d8d8f9092999a9ea1a9aba79f9a938d837b6e695e564c42382e23170c0400000000000000000000000008121b242d363e464e555d60696e74797e8285898b8d8f91919293929291908e8c8a8784807c76716c666059514b433b332921170e050000000000000000000815212e3a47535f6a6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6a5f53473a2e211508000000000000000000030c161f282f383f444d53585f62686d72767a7e8185888b8e9196979a9d9fa4acaaacafacaba39f9b948f89817a6f6a60594f453b30271c0b0200000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7986929facafa295887c6f6255493c2f22160900000000131f2c3946525f6c7985929facb8ada39c9898989898989898989898989898989898989898999a9b9d9fa4abacaba7a09d9490867e716c62594f443b3022180e00000000000000000000010f1b26323c47535f6a73808d959fa8a69e948f847e7974716f6e6e6f7173787d848f939ea5a79f948c7f72695e53453c311f150b01000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a6d656565656565656565656566676869696e7074787d81878f939ea1a9aca49f938e81786d605b51463c2f261b0c03000000000000000000000000000000000000000000000000020c17202935414c56616b74818e96a19f9285929fabaea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e22150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a0907040000000000000000000007121d2834404a54606a727f8c929ca4a7a096918a827d7a7775747475767a7d818790959ea5a59e938d80736b60544b402f261c11060000000003101c28343f4a546875828f9ba8a89b8e817568565153575f6165686a6b6c6c6c6b696765615e5753504a423d342e261e150c070100000000000000000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d120700000000000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b0000000000000000000c18232e39424e58616c717f8a9298a0a8aba49f99928e8a8784828180808081828486898d92979ea1a8aca49f9590847b6e685e544a3f342820150a000000000000000000000006101a242d363f4850585f676d737b80858b8f9298989a9c9e9e9f9f9f9e9e9d9b999795908d88837e786f6b605c554d453b332920170c0300000000000000000915222f3c4855626f7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c6f6255483c2f2215090000000000000000000a151e283139424a50575f616a6f757a7f83868b8e9297989b9ea1a8a7aaacafacaaaba39f9c99928e89827c756d6860584f473d33291e150b0000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7986929facaca295887c6f6255493c2f22160900000000131f2c3946525f6c7985929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a7a8aaa9a7a9a19e9a95908a837b706c625a50473e32291f100600000000000000000000000a15202b37434e58606d78839096a0a8a69e96918b85817e7c7b7b7c7e80848a91969ea5a7a0958f82776c60574d42332a1f0d0300000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facada093877a72727272727272727272727273737576787a7d8184898e93999ea6ada8a19a938c81786d665c50493f342a1d140a0000000000000000000000000000000000000000000000000000050e1924303a444f59606d7984919aa2989298a2aeaea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e221a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171614100b050000000000000000000c18232e39424e58626d73808c929ea1a8a19e948f8a8683828181828386898e93999fa7a39f938f81786d60594f42392e1d140a0000000000000c17232e404c5966737f8c99abaa9d908477685d52464d5355585b5d5e5f5f5f5e5d5b5854534d46443f3830282321201d18130c040000000000000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b000000000000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c10040000000000000004101c2834404b545f6a717e87939fa2aaa9a199938e86827e7a777574737373747577797c80858b91969da5afa79f9691847a6e665c50443c32261b0f04000000000000000000030c18222c363f48505a616a6f7980868d92979c9fa2aaa7a9a8a7a6a6a6a7a8a9a8a6a7a09d9a94908a837c746d675e574d453b32291e150a0000000000000000111e2a3744515d6a77848989898989898989898989898989898989898989898989898989898989898989898989898989898983766a5d5043372a1d10000000000000000006111c263039434b545b60696e757c81868b9093999b9ea1a9a8abadafaca9a6a8a09d9a99928f8b86817c766f6b605d564e463d352b21180c030000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7986929f9f9f9f95887c6f6255493c2f22160900000000131f2c3946525f6c7985929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9c9a9897928e89837e766e69615a50483f352c20170d000000000000000000000000040f1a26313c44505c666e7b8491969ea6a9a19e97918e8b898888888a8d91969ea0a8a59e9590837a6d655b50453b3121180e0000000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facb2a5988c7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818385878a8d91969b9fa4ababa39f9691887f776d665c544a3f372d22180b0200000000000000000000000000000000000000000000000000000008131e28323e45515d67707d88939fa29fa2aab4aea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b2e2727272727272727272727272727272727272727272727272727272423201c161008000000000000000007121c27303d46515b646e73808a92979fa3a69f9c9992908f8e8e8f9092989b9fa4a69f99928c81786d665c50473d30271d0b02000000000000061724303d4a5763707d8a99a3ac9f93867a6d6054474246484c4e505252535251504e4b4846423c3b3937332d302d2c29241d160d04000000000000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c03000000000000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a0000000000000006131f2c3845515c666f7c869299a4aea8a0979187817b75716d6869676766676768676d7073797e848e939fa4aca8a0969083786d60584e43372b20150a0000000000000000000b151e2a343e48505a626c717c848c92989fa2a9aca8a8a09e9c9a9a999a9a9b9d9fa3ababaaa69f9c95908781796e695e574d443b30261c110600000000000000111e2a3744515d6a77849095959595959595959595959595959595959595959595959595959595959595959595959595959083766a5d5043372a1d1000000000000000020c17232e38424b555d666c727b82888e92999c9fa4ababadaeaca9aba39f9d9a9795918d8a86837e7a756f6b636059524c443c342b23190f06000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7986929393939393887c6f6255493c2f22160900000000131f2c3946525f6c7985929393939393939393939393939393939393939393939393939399929291908f8d8b8885817d77716c615f5750483f362d231a0e05000000000000000000000000000a152028343f4a545e696e7b848f939ea1a8a9a19e9a9795959495979a9ea0a8a8a19e938e837a6e685e53493f33291f0f060000000000000714212d3a4754606d7a8793a0ada69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aea5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facb8a79c918c8b8b8b8b8b8b8b8b8b8b8b8c8c8d8e909297979a9ea1a8acaba39f99928d847d736c655c544a42382e241b100600000000000000000000000000000000000000000000000000000000020c16202935414b55606b74808d96a0abaeb4bcaea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e6155483b34343434343434343434343434343434343434343434343434343434302f2c28211a110800000000000000000b151e2b343f49525c646e737e858e92999ea1a8a39f9d9c9a9b9c9d9fa3a9a29f9b948f877f776d665c544a3f352c1e150b000000000000000714212d3a4754606d7a86929faca4998a7d7063544b403a3b3f4144454646464543413e3d4347494846443f3f3c3a39352f281f160c0100000000000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f000000000000000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f00000000000004111d2935414b55606d79839098a3aba9a09691857d746e6964615d565b5a5a5a5a555c6063666d7179818b939aa4afa89f958c80736a5f54473d32271b0f010000000000000007121d27303c46505a626c717e8691969fa2aaaba39f9b9796918f8e8d8d8d8d8f9092999a9ea1a9aba79f9a938d837b6e695e564c42382e23170c04000000000000111e2a3744515d6a7784909da2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a29d9083766a5d5043372a1d10000000000000000a141e28343f4a545d676d787f868f939b9fa3abacafaca9aaa29f9c999992908d8a8784817d7a76726d68636059544f45413a322b2219110700000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000613202c3946535f6c7987868686868686867c6f6255493c2f22160900000000131f2c3946525f6c79868686868686868686868686868686868686868686868686868686868685858482807e7b7874706b64615a534d453e362d241b11080000000000000000000000000000030c17232e38424d565e696e7a828a91969d9fa7a7a7a4a2a1a1a2a4a6a7a7a09d96918a81796e685e564c41382d21170d000000000000000714212d3a4754606d7a8793a0aca69a8d8073675a4d4034271a0d01000815222e3b4855616e7b8894a1aca5988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facb8ada39c98989898989898989898989898999a9b9c9ea1a9a7aba9a8a19e99928e87817a706b605b534a423930261c1209000000000000000000000000000000000000000000000000000000000000040e18242f3a434f59606d79849199a4afbbb9aea194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e61554840404040404040404040404040404040404040404040404040404040403d3c38332c231a100500000000000000030c19222d37404a525c636c717a81868d9196989b9c9e9f9f9f9f9e9d9b9997928e89827c736c655c544b42382e231a0c03000000000000000613202c3945515d677683909ca9ab9a8e8174665c5145382e323537383939393836313d464e5456555350494b494745413a31281d1307000000000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c221108000000000000000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000000000613202c3945515d67737f8c95a0aaada19791847b706b615e5754524c4e4d4d4d4e4b5153545c60676d747f88939fa5afa79f92877c6f62584e43372b1d1207000000000000000c18232e39424e58616c717f8a9298a0a8aba49f99928e8a8784828180808081828486898d92979ea1a8aca49f9590847b6e685e544a3f342820150a000000000000111e2a3744515d6a7784909d9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d9083766a5d5043372a1d1000000000000006111c26303844505c666d79828c92989ea5acaeabaca49f9d9998928f8c898683807d7a7774716d6865615e56544f48443d353028201910070000000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100006121f2c3845525e6a757979797979797979766a6054473b2e22150800000000121f2b3844515d697479797979797979797979797979797979797979797979797979797979797978777674716f6c65636059555046423c332c241b12090000000000000000000000000000000006111c26303b444d575e686d757e848b9095979a9c9e9e9f9f9f9e9c9a9895908b847e756d675e564c443a2f261b0f05000000000000000714212d3a4754606d7a87939f9f9f9a8d8073675a4d4034271a0d01000815222e3b4855616e7b88949f9f9f988b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a8a9a8a6aba39f9c9996918c87817b746d6761595049413930271e140a000000000000000000000000000000000000000000000000000000000000000007131d28313d45515d676f7c87939fa7b1acaca194877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e61554d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a48443e352c21160b000000000000000007101b252e38404a525a61686d747b8084888b8e90919292929291908e8c8985817c766f6a605b534b423930261c1108000000000000000004111d2935414b5566737f8c99a7ab9e9285796d6053463e3128282a2b2c2c2c242f39434e58606261605b53585654514b433a2f24180d0100000000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a100000000000000000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c00000000000714212d3a4754606d7a85929fa7b0a69e92857b6e696059524d47464141404040414045464b51555d606d727f8b939ea9afa3998f82766a605447392f24180c00000000000004101c2834404b545f6a717e87939fa2aaa9a199938e86827e7a777574737373747577797c80858b91969da5afa79f9691847a6e665c50443c32261b0f040000000000111e2a3744515d6a77839093939393939393939393939393939393939393939393939393939393939393939393939393939083766a5d5043372a1d100000000000000b17232e38424f59606d78828f949fa3aaafaca7a09d9a93908c8985827f7c7a7673706d686764605d5654524c48433d383229241e160e07000000000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100004111d2a36424e59636a6c6c6c6c6c6c6c6c6260584e43372b1f130600000000101c2935414d5862696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a69676562605b53544f49453e37312a211a12090000000000000000000000000000000000000a151e29323b454d565d606c71797e83878a8d8f9192929292918f8d8b87837e79716c605d554c443b32281d140a00000000000000000714212d3a4754606d7a8793939393938d8073675a4d4034271a0d01000815222e3b4855616e7b8893939393938b7f7265584c3f3225190c000000000000131f2c3946525f6c7985929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9c9b99979992908c89847f7b746e69605d554f443f382f271e150c020000000000000000000000000000000000000000000000000000000000000000010c161f2935404b55606b73808d95a09f9f9f9f94877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e615a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a57554f473e33281c1004000000000000000009131c262e38404850565e61696e73787c7e818384858686858583817f7c79746f6a625f585049413930271e150a000000000000000000010d18242f3b4855616e7b88959faba1978a7e71645a50433a2f241d151f141c2935404b55606a6f6e6c65676563605d554b4135291d1104000000000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f1208000000000000000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000006131f2b37434e5866727f8c97a2adaa9e948a7d70695f574f46423b3935303433342e34383a40454b515b626d74818e97a1adab9e94897c6f62554b4035291d1004000000000006131f2c3845515c666f7c869299a4aea8a0979187817b75716d6869676766676768676d7073797e848e939fa4aca8a0969083786d60584e43372b20150a0000000000111e2a3744515d6a77838686868686868686868686868686868686868686868686868686868686868686868686868686868683766a5d5043372a1d10000000000003101c28343f4a54616b74818e949ea6aeafa7a09d95908b8783807c797673706d676764615e565754524c4746413a38322c272119130c0400000000000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d1000010e1a26313d4751595e5f6060606060606055544e463c32271b0f03000000000d1925303b4650585d5f6060606060606060606060606060606060606060606060606060605f5f5e5d5c5a585553504948443d39342b261f180f0800000000000000000000000000000000000000030c172029333b444c525a61676d71767a7e818284858686858483817e7b77716d67615a514b433b322920160b0200000000000000000714212d3a4754606d7a868686868686868073675a4d4034271a0d01000815222e3b4855616e7b868686868686867f7265584c3f3225190c000000000000131f2c3946525f6c798592939393939393939393939393939393939398929291918f8e8d8b8886837f7c78736e69615f57514c433e332d261d150c0300000000000000000000000000000000000000000000000000000000000000000000040d18242f39434f59606d798390999393939393877b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b6e67676767676767676767676767676767676767676767676767676767676767676361594f44382c2014070000000000000000010a141c262e363e444c52575e61666a6f7274767878797978787675726f6d66626058534e443f382f271e150c03000000000000000000000714212d3a46535f697683909da8a99d9083766c61554b40352e27222222262d3845515d676f7c7b797674726f6d675d5145392c2013060000000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d0000000000000000000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f13060000000815222e3b4754606a7884919ea9b1a79c8f82756c61574d453d36302d292427272723282c2e343a4145515b606d7a85929eaab0a69b8e8275675d5145392c1f13060000000004111d2935414b55606d79839098a3aba9a09691857d746e6964615d565b5a5a5a5a555c6063666d7179818b939aa4afa89f958c80736a5f54473d32271b0f0100000000101d2936424f5b677177797979797979797979797979797979797979797979797979797979797979797979797979797979797671665b4e4236291c10000000000006121f2b3844505c66707d89939da6b0aca49f959089837f7b76736f6d666663605d555754524c4a4745413a3936302c27211b160d08020000000000000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d1000000915202b353f474e5253535353535353534947433c342b20150a000000000008141f2a343e464d5152535353535353535353535353535353535353535353535353535353535252514f4d4b4846443f3838332d28221a140e06000000000000000000000000000000000000000000050e172129323a414550555c6064686e7174767778797978787674716e6965605d555045403a312920170e040000000000000000000713202c3945525d687679797979797979736e64584c3f3326190d00000714212d3a46535f697679797979797979726d62564a3e3124180b000000000000131f2c3946525f6c798686868686868686868686868686868686868686858585848381807e7c7976736f6c65615e57534d45413a3127221b140b0300000000000000000000000000000000000000000000000000000000000000000000000007121d27313d45515c676f7c86868686868686867b6e6154483b2e211508000000000000000000121e2b3845515e6b7884919eabaea194887b737373737373737373737373737373737373737373737373737373737373737373706b6155483c2f231609000000000000000000020a131c242c323b41464d5254585f626568696b6c6c6c6c6b6a686663605c54544e4e4c4841382f1d150c03000000000000000000000005121e2a36424d5764717e8b96a1ab9f958a7d70675d51454039302f2e2f2f38404b55606d7986888583817e7c796d6054473a2d211407000000000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e050000000000000000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d2013080000000916222f3c4955626f7c8896a1acaca095897c6f625a50453b332a25201d191a1a1a181c1f23282f353f45515d67727f8b98a2aeac9f9286796d6053473a2d201406000000000613202c3945515d67737f8c95a0aaada19791847b706b615e5754524c4e4d4d4d4e4b5153545c60676d747f88939fa5afa79f92877c6f62584e43372b1d1207000000000e1a27333f4a555f676a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a665f554a3e32261a0d00000000000713202d3a4653606d7883909da5afafa49a938c837d77726e686663605c545653514b4a4746413e3a3935302d2a251e1b17151312100b0600010000000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000040f19242d353d424546464646464646463c3b37322b22190f040000000000020d18222c343b4144464646464646464646464646464646464646464646464646464646464646454443413e3c3937332d2c27211d170e09030000000000000000000000000000000000000000000000050f1720282f353e434b5153565e616467696b6b6c6c6c6b696765615e5753514b433e352f281f170e050000000000000000000004111d2935414c565d6c6c6c6c6c6c6c6c67645c52473b2f23170b000005121e2b37424d575f6c6c6c6c6c6c6c6c65625b51463a2e221509000000000000121f2b3844515d6974797979797979797979797979797979797979797979787877767573716f6d666662605b53534d47423c352f281f17110a0200000000000000000000000000000000000000000000000000000000000000000000000000010b151f2834404b55606a6f797979797979797976695e53463a2d211407000000000000000000121e2b3845515e6b7884919eabb4a79a8e818080808080808080808080808080808080808080808080808080808080808080807d7063574a3d3024170a00000000000000000000020e1925303b444c525f6060606060605d5d5e5f5f5f5f5e5d5b596060606060605a58534a41362b2014080000000000000000000000020e1a26313b4653606d7984919ea7a79e9184796d605b514b423d3c3b3c3d424a515d67717e8b9892908e8b897e7164574b3e3124180b00000000000000000000050e172029313940454f54596063676d70727576787879797878777573706d6865605d55504a423c332b23191107000000000000000000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d0100000d1a2633404d596673808c99a8b2aa9d9083776a6054483e332a211a14110d080d070c1013181d242935414c55606d7985929fabaea2988a7d7164574a3e2e23170b000000000714212d3a4754606d7a85929fa7b0a69e92857b6e696059524d47464141404040414045464b51555d606d727f8b939ea9afa3998f82766a605447392f24180c000000000a16222e39434d555b5d606060606060606060606060606060606060606060606060606060606060606060606060606060605d5b554d43382d22160a0000000003101c28343f4a5464717e8a95a0acaea49f93888078706b65615e565653514a494745403d3a3936302d2c292424242b29262422201f1c1711110c0600000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d1000000008121b242b31363839393939393939392f2e2b27201910070000000000000006101a222a30353839393939393939393939393939393939393939393939393939393939393938373634322f2d2b27221b1c16110c060000000000000000000000000000000000000000000000000000050d161e242931394045474c5254575a5c5e5f5f5f5f5e5c5a5854524d474540393129241d160d050000000000000000000000010d19242f3a444c525f606060606060605a58524a40362b1f13070000020e1a26313c454d535560606060606060585651493f34291e1206000000000000101c2935414d5862696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a6968666462605c545653504946423b373129241e160d0600000000000000000000000000000000000000000000000000000000000000000000000000000000030d18232e39434e5860626c6c6c6c6c6c6c6c6c5e574d42362a1e1205000000000000000000121e2b3845515e6b7884919eabb7a99d938e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8073665a4d4033271a0d0000000000000000000005111e2a36414c565e6c6c6c6c6c6c6c6a675f555353524f5960636c6c6c6c6c6c67645c53483c3024180b00000000000000000000000009141f2c3844515c66727f8b95a0aca1968e81756e605c544f4a4948494a4e545b606d7984919e9f9d9a92857a6d6053473a2d2014070000000000000000000000050e171f272f343d43484f54555c606366686a6b6c6c6c6c6b6a686664615e5653514b443f38302a211911080000000000000000000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d11040005111e2a36424d576976838f9ca9b5ab998c7f7366584e43362c21180f0905010000000004070c1319242f3a45515d6774818e9aa7b4aa9b8e817468544a3f34281c1003000006131f2b37434e5866727f8c97a2adaa9e948a7d70695f574f46423b3935303433342e34383a40454b515b626d74818e97a1adab9e94897c6f62554b4035291d100400000006111c27313b434a4f5153535353535353535353535353535353535353535353535353535353535353535353535353535353504e4a433a31271c11050000000006121f2b3844505c6675828f9ca7b1aa9d928b7e736d66605954524d494644403d3a39352f2e2d2a252120282d3031383533312f2d2b28231c1d181109000000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000009121920262a2c2c2d2d2d2d2d2d2d22221f1b150f070000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a29272522201f1b1711100b050000000000000000000000000000000000000000000000000000000000040c13191f272f34383b4146474b4e4f515253535251504e4b4846423b38352f271f18130c040000000000000000000000000008131e28323a414553535353535353534d4c4740382e24190e0200000009141f2a333c424648535353535353534c4a463f372d23180d010000000000000d1925303b4650585d5f606060606060606060606060606060606060605f5f5e5e5c5b5a585553514b4946443f3836312b261f19130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303c464e54555f606060606060605f534d453b31251a0e02000000000000000000121e2b3845515e6b7884919eabb7afa59d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a998d8073665a4d4033271a0d000000000000000000000714202d3946525e68767979797979797771675b4f464854606b70797979797979746e64584c4033271a0d01000000000000000000000004101c2834404a54606d7883919aa4a89e938c80746d6660595755555556585f666c75818e96a1aca3998e8174675d5145392c201306000000000000000000000000050d151d232932383d44484b515356595b5d5e5f5f5f5f5e5d5c5a5754524c47454039342e261e180f0800000000000000000000000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000714202d3a46525e697885929eabafa399897c6f6256493d32231a0f060000000000000000000108131e2935404b5564707d8a97a9b3aa9d908377665c5044382b1f120600000815222e3b4754606a7884919ea9b1a79c8f82756c61574d453d36302d292427272723282c2e343a4145515b606d7a85929eaab0a69b8e8275675d5145392c1f1306000000000b151f2931393f42444646464646464646464646464646464646464646464646464646464646464646464646464646464643423e3831281f150a00000000000713202d3a4653606d7985929facaea3988d80746c605c544f4746413c3a38342e2d2c292421201d19242c34393d3e4442403e3b3a38342e2e29231b12090000000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000000080f151a1d1f20202020202020201615130f0a040000000000000000000000060d14191c1f1f202020202020202020202020202020202020202020202020202020201f1f1e1c1a181513120f0b0600000000000000000000000000000000000000000000000000000000000000000001080d151d23292c3036393b3e414344454646454543413e3b3a36302c29241d150d07010000000000000000000000000000010c1620282f35394646464646464646403f3b362e261c120800000000030e18212a31373a3b464646464646463f3e3a342d251b11060000000000000008141f2a343e464d51525353535353535353535353535353535353535352525251504e4d4b494645403c3937332d2a251f1a150d080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2b343c43474953535353535353534846423b33291f140900000000000000000000121e2b3845515e6b7884919eabacacafa9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6998d8073665a4d4033271a0d000000000000000000000814212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271b0e010000000000000000000000000c18232e3944515c66707d88939fa6a59c928c8079706b666462616263666a6f78808d939ea9a89f92877b6e62554b4035291d100400000000000000000000000000030b121821272c323839404546494c4f50515253535252504f4d4a4746413a39352f28231c150c060000000000000000000000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d211407000814212e3b4754616e7b8797a2adac9f92867a6d6053473a2d2014070000000000000000000000010d18242f3b4754616e7a8797a1adac9f9286796d6053463a2d20130700000916222f3c4955626f7c8896a1acaca095897c6f625a50453b332a25201d191a1a1a181c1f23282f353f45515d67727f8b98a2aeac9f9286796d6053473a2d20140600000000040d171f272e333637393939393939393939393939393939393939393939393939393939393939393939393939393939393736322d271f160d0300000000000815222f3b4855626e7b8898a2aeac9f92867a6d615a504a423d3936302d2c282320201d18141317222c363e45494b514f4d4a4846443f383a342d241b110600000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d1000000000000004090e1112131313131313131309080603000000000000000000000000000002080d10121313131313131313131313131313131313131313131313131313131313131211100e0b0906050300000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f252a2d2e3134363838393939383634322e2d2a251f1d18120b030000000000000000000000000000000000040d161e24292c393939393939393934332f2b241c140a010000000000060f181f262b2d2e3939393939393932312e29231b13090000000000000000020d18222c343b41444646464646464646464646464646464646464646464545444342403e3c3a38342e2d2b27221b1a140e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c19222b32373b3c46464646464646463b3a36312921170d0300000000000000000000121e2b3845515e6b7884919e9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f998d8073665a4d4033271a0d000000000000000000000814212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b0e0100000000000000000000000007121c2834404a54606b73808d949fa7a49c928d837d7773706f6e6f7072767c828d929da5aaa1968d8174695f5343392f24180d01000000000000000000000000000001070c161b21272c2e34383a3d3f42434545464645454442403d3a3936302c29241d17110a03000000000000000000000000000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f231609000916232f3c4956626f7c8995a9b3aa9e918477675d5145382c1f13060000000000000000000000000714202d3946525e687885919eabaea398887b6e6255483b2f22150800000d1a2633404d596673808c99a8b2aa9d9083776a6054483e332a211a14110d080d070c1013181d242935414c55606d7985929fabaea2988a7d7164574a3e2e23170b0000000000050d151c2227292a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2a2926221c150d040000000000000a1723303d4a5663707d8996aab4a89c8f8275685e52443f38302d2a25201f1c181413100d07111d28343e485055575e5c59575553504a4a453f362d23180c01000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000000000000000001040606060606060606060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c1014191e20212427292b2c2c2c2c2b29272521201e1a14100c070100000000000000000000000000000000000000040c13191d202d2d2d2d2d2d2d2d2726231f19120a0200000000000000060e141a1e21222d2d2d2d2d2d2d2524221e1811090100000000000000000006101a222a303538393939393939393939393939393939393939393939393837363533312f2d2c2823201f1b17110e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101920272b2e2f39393939393939392e2d2a251f170f050000000000000000000000121e2b3845515e6b7884919393939393939393939393939393939393939393939393939393939393939393939393939393938d8073665a4d4033271a0d000000000000000000000814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e01000000000000000000000000000c18232e39424f59606d788290959fa7a49d95908984807d7c7b7c7d7f838890949da4aaa39891847a6d61574d4231281d12070000000000000000000000000000000000040a0f161b1d23282c2d30333537383939393938373533312e2d2a251f1d18120c060000000000000000000000000000000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000a1723303d4a5663707d8996a3b0a99c90837669554b4035291d100400000000000000000000000005111e2a36414c566a7683909da9b4aa96897c6f6356493c302316090005111e2a36424d576976838f9ca9b5ab998c7f7366584e43362c21180f0905010000000004070c1319242f3a45515d6774818e9aa7b4aa9b8e817468544a3f34281c10030000000000040b11161a1d1e202020202020202020202020202020202020202020202020202020202020202020202020202020201d1c1a16110a03000000000000000b1724313e4a5764717d8a97a4b0a6998d807366564c41342e26201e191312100c070604010815212d3945505a61646b68666462605c545651483f34291d1105000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000000000004090e1112131313131313131313060400000000000000000000000000000000000000000000000004080a0a1313131313131313130e0e0b080300000000000000000000000000000000000000000000000000000000000004080e111414181b1c1e1f20201f1e1d1b181514120e0904000000000000000000000000000000000000000000000001080d111314202020202020201a1917130e080100000000000000000003090e12141520202020202020191815120d060000000000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2b2928272522201f1c1813120f0b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e151b1f22222c2d2d2d2d2d2d2d21211e1a140d05000000000000000000000000121e2b3845515e6b788486868686868686868686868686868686868686868686868686868686868686868686868686868686868073665a4d4033271a0d000000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e010000000000000000000000000007121c27303d44505c666d7a8390959da5a7a09d95918d8a888888898c90959c9fa6a9a19892867c6f685e52453c311f160c0100000000000000000000000000000000000000040b1012181c1f202326282a2b2c2c2c2c2b2a29272421201d1913100c0701000000000000000000000000000000000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d000b1724313e4a5764717d8a97a4b0a89b8f8275685c4f422f24180c00000000000000000000000000010d192530424f5c6875828f9ba8b0a3968a7d7063574a3d3024170a000714202d3a46525e697885929eabafa399897c6f6256493d32231a0f060000000000000000000108131e2935404b5564707d8a97a9b3aa9d908377665c5044382b1f120600000000000000060a0e10111313131313131313131313131313131313131313131313131313131313131313131313131313131310100d0a050000000000000000000b1724313e4a5764717d8a97a4b0a5998c7f7266594c3f30231c15110e080807070808090e131925303d4955616c71777573716e6d6665625b51453a2e221509000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000000000080f151a1d1f20202020202020202013100c070100000000000000000000000000000000000000050b101416172020202020202020201b1a18140f0901000000000000000000000000000000000000000000000000000000000000020507080b0e10111213131212100e0b0807050200000000000000000000000000000000000000000000000000000001040707131313131313130d0d0b07020000000000000000000000000002050708131313131313130c0b0906010000000000000000000000000000060d14191c1f1f202020202020202020202020202020202020201f1f1f1e1d1b1a18161313100c0705030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13151620202020202020201514120e090300000000000000000000000000111d2a3743505c6872787979797979797979797979797979797979797979797979797979797979797979797979797979797979736e63584b3f3226190c000000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e0100000000000000000000000000000b151e28343f4a545d686d7a838e939ea0a8a8a09d999795949596999d9fa7aba49f9792867e706a60564c41332a1f0d040000000000000000000000000000000000000000000000070c10131316191c1d1e1f20201f1f1d1c1a171413110d080400000000000000000000000000000000000000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f000b1825313e4b5864717e8b97a4b1a89b8e8275685b4f4235281c070000000000000000000000000000081b2835414e5b6874818e9ba7b0a4978a7d7164574a3e3124170b000814212e3b4754616e7b8797a2adac9f92867a6d6053473a2d2014070000000000000000000000010d18242f3b4754616e7a8797a1adac9f9286796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96abb5a69a8d807367544b403428201c1816151514141515171a1e242b37434e5864717e8482807d7b7977726d62564a3d3124170b000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d1f1c18120b0300000000000000000000000000000000000810171c2023242d2d2d2d2d2d2d2d2d282724201a130b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1012131313131313131313131313131313131313131313121211100f0d0b090706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608091313131313131313080705020000000000000000000000000000000f1b27333f4b5660686b6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c66635c52473b2f23170a000000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e010000000000000000000000000000030c17232e38424c565e686d79818991969d9fa4aca6a3a2a1a2a3a5a8a9a29f99938e857c706c61584e443a3021180e00000000000000000000000000000000000000000000000000000406070a0c0f10121213131212110f0d0a07070501000000000000000000000000000000000000000000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2834414e5b6774818e9aa7b1a4978b7e7164584b3e3125180b000916232f3c4956626f7c8995a9b3aa9e918477675d5145382c1f13060000000000000000000000000714202d3946525e687885919eabaea398887b6e6255483b2f221508000000000000000000000000000000000000000000000105090b0b1313131313131313120706030000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8899a4afa89b8e8275665c51453a322c29232322212121212223252a2f353f47535f6a76828f8f8c8a8886837e7265584b3f3225180c000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000008121b242b3136383939393939393939392c29231d150d0300000000000000000000000000000008121a22282d30313939393939393939393533302b251d140b010000000000000000000000000000000000000000000000000000000003090d1012131313131313131313060300000000000000000000000000000000000000000000000000000000000000000004080c0e0f13131313131313131313131313131313131313131313131313131313131313131313131313130f0e0c080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232f3a444e565c5e60606060606060606060606060606060606060606060606060606060606060606060606060606060605a58524a40362a1f1307000000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e0100000000000000000000000000000006111c26303a444c565e676d747d848a90939a9a9c9e9f9f9f9e9d9b9997928d87817a6f6a615a50463c32281e0f060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000a1723303d4a5663707d8996a3b0a99c90837669554b4035291d100400000000000000000000000005111e2a36414c566a7683909da9b4aa96897c6f6356493c30231609000000000000000000000000000000000000000000060c1115171820202020202020201f1312100c06000000000000000000000000000000000000000000000000000714202d3a4753606d7a86939facab9f9285796d60564c443d38342f2f2f2e2d2e2e2f3031363a4145515b626f7c87939b999798928a7e7164574b3e3124180b000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000040f19242d353d424546464646464646464638342f271f150b010000000000000000000000000006101a242c33393c3d46464646464646464641403c362f261d1309000000000000000000000000000000000000000000000000000000070e14191d1f20202020202020202012100c06000000000000000000000000000000000000000000000000000000000002090f14181b1c20202020202020202020202020202020202020202020202020202020202020202020202020201c1b18140f0902000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100f0d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100e0b080705020000000000000000000000000000000000000000000000000007121d28323c444b505153535353535353535353535353535353535353535353535353535353535353535353535353535353534d4b4740382e24190e02000000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c00000000000000000000000000000000000a151e28323a444c555c606b70787e83878b8d909192929291908f8c8985817c746d68605850483e342b20160c000000000000000000000000000000000000000000000000000000000000000306060808080808080605030000000000000000000000000000000000000000000000000000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1724313e4a5764717d8a97a4b0a89b8f8275685c4f422f24180c00000000000000000000000000010d192530424f5c6875828f9ba8b0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d2d2b201f1c17110a03000000000000000000000000000000000000000000000006131f2c3945515d677683909dabada2978a7e71685e564f4745403e3c3b3b3a3a3b3b3d3f42464c515a626d76828f99a4a6aa9f92857a6d6053473a2d201407000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000915202b353f474e5253535353535353535345403931271d1207000000000000000000000000050e18222c363e44494a5353535353535353534e4c4841392f251a0f03000000000000000000000000000000000000000000000000000811191f25292b2c2d2d2d2d2d2d2d2d1f1c17110a030000000000000000000000000000000000000000000000000000030c131a202527282d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d282725201a130c03000000000000000000000000000000000000000000000004070c10121316191b1d1e1f1f201f1f1e1d1b19171414110e0806030000000000000000000000000000000000000000000000000000000000000000000000000003070c10131416191b1d1e1f1f201f1f1e1c1a181514120e09050200000000000000000000000000000000000000000000010c16202a323a3f43454646464646464646464646464646464646464646464646464646464646464646464646464646464646403f3b362e261c120800000000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b0000000000000000000000000000000000030c162029323a434b515960666d71767b7e8183848586858484827f7d79746f6a615e564e463e362c22190e050000000000000000000000000000000000000000000000000000000000060b0f121314141414141413120f0b06000000000000000000000000000000000000000000000000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8275685b4f4235281c070000000000000000000000000000081b2835414e5b6874818e9ba7b0a4978a7d7164574a3e3124170b0000000000000000000000000000000000000009121b22292e31323939393939393939382d2c28231c150c030000000000000000000000000000000000000000000004101d2935404b5566737f8c99a3aea99e91857a6d68605953514b4b494848474748484a4b4d53555d606c727f8c949fabaea3998d8074675d5145392c201306000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000e1a26313d4751595e5f606060606060605f514b43392f23180c0000000000000000000000030c17202a343e485055576060606060606060605b59534b41362b20140800000000000000000000000000000000000000000000000007111a232a3135383939393939393939392c28231c150c03000000000000000000000000000000000000000000000000020c151e252c31343539393939393939393939393939393939393939393939393939393939393939393939393939393534312c251e150c020000000000000000000000000000000000000001070c1013181c1f20232527292b2b2c2d2c2c2b2a28262421201e1915120f0a03000000000000000000000000000000000000000000000000000000000000000000060b1012181d1f202325282a2b2b2c2d2c2c2a29272521211e1a14110e0902000000000000000000000000000000000000000000050f1820282f333738393939393939393939393939393939393939393939393939393939393939393939393939393939393933322f2a241c140a00000000000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e221609000000000000000000000000000000000000040d172029303940454f545c6064686e7174767878797878777573706d67625f58524c443d342c241a100700000000000000000000000000000000000000000000000000000000020a11171c1f20212121212121201f1b17110a0200000000000000000000000000000000000000000000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2834414e5b6774818e9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000000000006111b242d343a3d3e4646464646464646453a38342e261e150a00000000000000000000000000000000000000000000000c18242f3b4754616e7a86929fa8ada19790827a6f6b63605c5557565554545454555658575e61676d747e88939fa6b0a89f92867b6e61554b4035291d1004000000101d293643505c6976838f8b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c5c554b4034291c1004000000000000000000000b151e29323c46505a61646c6c6c6c6c6c6c6c6c68645d53483c3024180b0000000000000000000000000000000000000000000000030e19232c353c414546464646464646464638342e261e150a00000000000000000000000000000000000000000000000009131e272f373d4042464646464646464646464646464646464646464646464646464646464646464646464646464642403d372f271e1309000000000000000000000000000000000003090e12181d1f23282c2d3032343638383939393838373533312e2d2a25211f1b150f0b060000000000000000000000000000000000000000000000000000000000020a11171c1f24292c2d30323437373839393938373634312e2d2a25201e19140e09020000000000000000000000000000000000000000060f161d23272a2b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2726231f19120a02000000000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e120600000000000000000000000000000000000000050e171e272e343d424a5053565e616567696b6c6c6c6b6a686663605c55534e46413a322b221a110800000000000000000000000000000000000000000000000000000000020b141c22282b2d2e2e2e2e2e2e2d2b27221b140b02000000000000000000000000000000000000000000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000000000000000010c17222d363f454a4b53535353535353535246443f3830261c1106000000000000000000000000000000000000000000000714202d3946525e6874808d96a1aaa99f9490847c76706d67666462626160616162636567696e737a818b939aa4afaaa1968d8074695e5343392f24180d01000000101d293643505c6976838f8b7f7265584c3f3225190c06060606060606060606060606060606060606060606060606060c1925323f4c5865727f8b8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000121f2c3845525e6a75797979797979797976675c5145382c1f130600000000000000000007121c27303a444e58616c70797979797979797979746f64594c4033271a0e010000000000000000000000000000000000000000000009141f2a353e474d51535353535353535353443f3830261c110600000000000000000000000000000000000000000000040f1a252f3941484d4f53535353535353535353535353535353535353535353535353535353535353535353535353534f4d4841392f251a0f04000000000000000000000000000001070c141a1d24292c2e34383a3c3f4143444546464645444342403e3b3936302e2b261f1c17110a020000000000000000000000000000000000000000000000000003090c141c23282b2f35383a3c3f41434445464646454443413e3b3a36312d2a251f1a140d050000000000000000000000000000000000000000050c12171b1d1e20202020202020202020202020202020202020202020202020202020202020202020202020202020201a1917130e0800000000000000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d010000000000000000000000000000000000000000050c151d232830383f44464d5254585a5d5e5f5f5f5e5d5c595653514b47433c3630292019100800000000000000000000000000000000000000000000000000000000000a141d262d3338393b3b3b3b3b3b3937332d261d140a000000000000000000000000000000000000000000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000000000005111d29343f4850565860606060606060605e53504a42382e23170c0000000000000000000000000000000000000000000005111e2a36414c56606d7a849198a2aaa69f969189827d797573716f6e6e6d6d6e6e707274777b80858e939fa4acaba3989184796d60574d4231281d120700000000101d293643505c6976838f8b7f7265584c3f322519131313131313131313131313131313131313131313131313131313131925323f4c5865727f8b8f8376695c504336291d1000000000000000000104060606060606060606000000000000000000000013202c3946535f6c798786868686868686796d6053473a2d2014070000000000000000081118232e39424c565f6a707e8786868686868686868174685b4e4135281b0e02000000000000000000000000000000000000000000010d1925313c4750585e5f606060606060605f504a42382e23170c000000000000000000000000000000000000000000000814202c37414b53595b60606060606060606060606060606060606060606060606060606060606060606060606060605b59534b41372c20140800000000000000000000000000030b12181f252a2f35393a404446494c4e5051525253525251504e4c4a4746413c3a37312b28221c140b070000000000000000000000000000000000000000000000060d141a1e262e34383a404547494c4e50515252535252514f4d4b4846423b3a36302a251f170e07010000000000000000000000000000000000000001070b0f111213131313131313131313131313131313131313131313131313131313131313131313131313131313130d0c0a070200000000000000000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b110700000000000000000000000000000000000000000000030b12181e262e34383b4146474b4e505152535251514f4c4a4645403937322a251e170e07000000000000000000000000000000000000000000000000000000000006111c262f383f444647474747474746443f382f261b11060000000000000000000000000000000000000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000000000915212e3a45505a62656c6c6c6c6c6c6c6c6b605c544a3f34281c1003000000000000000000000000000000000000000000020e1925303b45525d686f7c869298a0a8a8a09e948f8a8582807e7c7b7b7a7a7b7b7d7e8084878d92979da5afaaa29992867c6f675d51453b311f160c0100000000101d293643505c6976838f8b7f7265584c3f322520202020202020202020202020202020202020202020202020202020202025323f4c5865727f8b8f8376695c504336291d1000000000000004090e11121313131313131313090806030000000000000013202c3946535f6c7986929393939393867a6d6053473a2d20140700000000000000060f19232834404a545e686f7c86929a93939393968f82786d6053463a2d2013070000000000000000000000000000000000000000000004101d2935414d58626a6c6c6c6c6c6c6c6c6c5c544a3f34281c10030000000000000000000000000000000000000000000c1825313d48535d65686c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c68655d53483d3125180c000000000000000000000000060d151d24293136394045474a515356585a5c5e5e5f605f5f5e5d5b595754524c4847433c38332d261d18120b030000000000000000000000000000000000000000070f181f262a30383f44464b515356585b5d5e5e5f605f5f5d5c5a5854534d4746423b3630292018120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b130900000000000000000000000000000000000000000000000000070c151c23282c3036393b3e414345454645454442403d3a38342e2b262019130d050000000000000000000000000000000000000000000000000000000000000b17222d38424a505354545454545453504941382d22170b00000000000000000000000000000000000000000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000000000b1724313d4a56626c717979797979797979786d665c5044382c1f13080000000000000000000000000000000000000000000008141e2935414c56606a707d8691969fa3aba69f9c98928f8c8a89888787878788898b8d9195999fa2a9aba69f9892877e706a60554b4133291f0d040000000000101d293643505c6976838f8b7f7265584c3f322d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d323f4c5865727f8b8f8376695c504336291d100000000000080f151a1d1f20202020202020201615130f0a04000000000013202c3946535f6c7986929f9f9f9f93867a6d6053473a2d201407000000000000040d18212b353d44515c666d7a849198a29f9fa19791847a6d665c5144382c1f12060000000000000000000000000000000000000000000005121f2b3845515e6a74797979797979797976665c5044382c1f12060000000000000000000000000000000000000000000e1b2734404d59656f757979797979797979797979797979797979797979797979797979797979797979797979797979756f65594d4034271b0e00000000000000000000000910181f272f353b42464b5153545c60636567696b6b6c6c6c6b6b6a686664615e5655534e46443f382f28231d150c05000000000000000000000000000000000000081019212931363e424a5053555d606365676a6a6b6c6c6c6b6a696764615e5754524d46423b3329241d150d040000000000000000000000000000000000000000000000000000000000020608080b0e1011121313121211100d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e181109010000000000000000000000000000000000000000000000000000030a11171c1f252a2d2e3234363839393938373533302d2c28231d1b150d0802000000000000000000000000000000000000000000000000000000000000030f1c28333f4a545b60616161616161605b53493f33271b0f03000000000000000000000000000000000000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000000000000005121e2a36424d5765717e868686868686868685786d6053463a3025190d01000000000000000000000000000000000000000000020d19242f3a434e58606b707c848d92999fa2aaaaa29f9c99979595949394949596989a9da0a8abaaa79f9d948f857d706c61584e433a2f21170d000000000000101d293643505c6976838f8b7f7265584c3f393939393939393939393939393939393939393939393939393939393939393939393f4c5865727f8b8f8376695c504336291d100000000009121920262a2c2c2d2d2d2d2d2d2d22221f1b150f070000000013202c3946535f6c7986929facaca093867a6d6053473a2d2014070000000000020b161f2a333d47515b606d78829096a1aaaea39992857b6e685d544a4034281c1004000000000000000000000000000000000000000000000613202c3946535f6c798686868686868686786d6053463a2d2013070000000000000000000000000000000000000000000f1c2835424f5b68758286868686868686868686868686868686868686868686868686868686868686868686868686868175685b4f4235281c0f0000000000000000000009121b222a313940454d53555d6065666d6f72747677787979797877767573716e6867625f5853504a423d342e271e170e050000000000000000000000000000000008111a222b333b424650545c6063676d6f727476777879797978777674716e6966615e56524d453f352f271f160d04000000000000000000000000000000000000000000000000000205090e121415181b1d1e1f20201f1f1e1c1a181514120e090502000000000000000000000000000000000000000000000000000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d07000000000000000000000000000000000000000000000000000000000000060c1014191e202125272a2b2c2c2c2b2a292623201f1c18120f0a04000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b666c6e6e6e6e6e6e6c655b5044372b1f1205000000000000000000000000000000000000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000000000714212d3a46535e69768390939393939393978a7d7063564c4135291d11050000000000000000000000000000000000000000000008131e28313c464f59606a6f7980878e92989b9fa2aaa6a6a4a2a1a1a0a0a1a1a3a5a7a7aca49f9d9995908a827b706b615a50463d31281d0f05000000000000101d293643505c6976838f8b7f7265584c4646464646464646464646464646464646464646464646464646464646464646464646464c5865727f8b8f8376695c504336291d1000000008121b242b31363839393939393939392f2e2b272019100700000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000a141d28313c454f59626d74818e949fa8aea49f92877d6f695f564c42392e23180c00000000000000000000000000000000000000000000000613202c3946535f6c798692939393939386796d6053463a2d2013070000000000000000000000000000000000000000000f1c2835424f5b6875828e9393939393939393939393939393939393939393939393939393939393939393939393938e8175685b4f4235281c0f00000000000000000009121b242c343c434b51575e61676d7175797c7f81838485858685858483817f7d7a77736f6a64605b544f454039302920170f050000000000000000000000000000060f1a232c343d454d535a61666d7075797c7f81838485858685858482807e7b77736e69615e575145403931281f160c030000000000000000000000000000000000000000000002080e11151a1e21222528292b2c2c2c2c2b2b29272522211e1a14120e09020000000000000000000000000000000000000000000000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b09060100000000000000000000000000000000000000000000000000000000000000000003080e111414181b1d1e1f201f1e1e1c19171313100c0700000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c787a7a7a7a7a7a776c605346392d20130600000000000000000000000000000000000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e221508000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000000000815212e3b4854616e7b87939f9f9f9f9fa99b8f8275685e5246392d20150a00000000000000000000000000000000000000000000010c161f2b343d474f585f676d737b81868b8f9298989a9b9d9e9f9f9f9f9f9f9e9d9c9a989a93908d88837d766e69615950483e342b1f160c00000000000000101d293643505c6976838f8b7f72655853535353535353535353535353535353535353535353535353535353535353535353535353535865727f8b8f8376695c504336291d100000040f19242d353d424546464646464646463c3b37322b22190f04000013202c3946535f6c7986929facada093867a6d6053473a2d2014070000000006111c262f3a434d57606b727f8b939da6afa59c928b7e716b60574d443a30271c120700000000000000000000000000000000000000000000000613202c3946535f6c7986929f9f9f9f9386796d6053463a2d2013070000000000000000000000000000000000000000000f1c2835424f5b6875828e9b9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b8e8275685b4f4235281c0f000000000000000008121b242d363e464e555d60696e74797e8285898b8d8f91919293929291908e8c8a8784807c76716c666059514b433b332921170e05000000000000000000000000030d18212c353e464e575f616c70787d8185898b8e90919192939292908f8d8b87847f7b746e69625b514b433a31281e150b000000000000000000000000000000000000000002080d14191e20262b2e2f323436383939393938373634322e2d2b26201e1a140e090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e101212131212110f0d0a070604000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8787878787877a6d6154473a2e211407000000000000000000000000000000000000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d201307000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000007131f2c38434e5866737f8c9aa4afaca8aaac9f92867a6d6154473c32261b0f0000000000000000000000000000000000000000000000040d19222b353d464e555d60696e747a7e8285888b8d8f909192929292929291908f8d8c898683807c76706c615f574f473e362c22190d0400000000000000101d293643505c6976838f8b7f72656060606060606060606060606060606060606060606060606060606060606060606060606060606065727f8b8f8376695c504336291d1000000915202b353f474e5253535353535353534947433c342b20150a000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000071017222d38424c555f69707d87929fa5afa79e938d80736c61594f453c32281e150b0000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000f1c2835424f5b6875828e9ba8acacb2adaba5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a59b8e8275685b4f4235281c0f0000000000000006101a242d363f4850585f676d737b80858b8f9298989a9c9e9e9f9f9f9e9e9d9b999795908d88837e786f6b605c554d453b332920170c0300000000000000000000010b151f2a333e474f5860696e767d84898e9298989a9d9d9e9f9f9f9e9d9c9a9795918c86817b726d605d554b433a30271d1207000000000000000000000000000000000000040c13191f252a2d31373a3b3e41434445464645454443403e3b3a37312d2a251f1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070c0f0e0c0904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794949494877a6d6154473a2e211407000000000000000000000000000000000000000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f1206000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000000000000915222e3b4854606a7784919eaca49f9b9ea5a3998b7f7265584e43372b1c12070000000000000000000000000000000000000000000000071019232b343c434b51575f61676d7175797c7e80828384858586868585848482817f7d7a77736f6a64615a534d453e352c241a10070000000000000000101d293643505c6976838f8b7f726c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c727f8b8f8376695c504336291d1000010e1a26313d4751595e5f6060606060606055544e463c32271b0f030013202c3946535f6c7986929facada093867a6d6053473a2d2014070000050e192228333f4a545d676e7b859299a3afa89f958e81776c605a50473d332a20160c030000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000f1c2835424f5b6875818e9babb5b2a8a19e98989898989898989898989898989898989898989898989898989898988e8275685b4f4235281c0f000000000000030c18222c363f48505a616a6f7980868d92979c9fa2aaa7a9a8a7a6a6a6a7a8a9a8a6a7a09d9a94908a837c746d675e574d453b32291e150a0000000000000000000007121d27313c454f59616a6f7b828a91969b9fa2aaa7a7a5a3a2a2a3a4a5a8a7a7a09d99928e867f756d675d554b42392e23180c0300000000000000000000000000000000080e161e25293036393c4247484b4e50515253535252514f4d4b4846423c3a36302a251f170f0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d111314191c1b19150f090200000000000000000000000000000000000000030613131313131313130d0c0a07020000000000000000000000000003060809131313131313130b0b09050100000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e2114070000000000000000000000000000000000000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c1003000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000004101c2834404b54626f7c8996a0a49a938e939eab9d9083776a5f5347392e23180c000000000000000000000000000000000000000000000000071119222a313940454d53555d6065666d6f71737576777879797979787877757472706d6866625f58555046423b332c231a1208000000000000000000101d293643505c6976838f8b7f79797979797979797979797979797979797979797979797979797979797979797979797979797979797979797f8b8f8376695c504336291d100004111d2a36424e59636a6c6c6c6c6c6c6c6c6260584e43372b1f13060013202c3946535f6c7986929facada093867a6d6053473a2d20140700030d17202b343d44505b666d79839197a2abaaa1969083796d655b50483e352b21180e04000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000d1a2734404d5a6773808d99a3aeada196918b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8175685b4f4235281c0f0000000000000b151e2a343e48505a626c717c848c92989fa2a9aca8a8a09e9c9a9a999a9a9b9d9fa3ababaaa69f9c95908781796e695e574d443b30261c11060000000000000000000c18242f39434d57616b707c858f949ea0a8aca8a19e9a989695959697989c9fa2aaaba39f98928b81796d675d544b4034281e150b0000000000000000000000000000020a121a202830353b4146474e5355585b5c5e5f5f5f5f5e5e5c5a5855534d4846423b363029211a120a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13191d202126292825201b140c0300000000000000000000000000000000060c101220202020202020201a1917130e0800000000000000000000040a0f13151620202020202020181715110c06000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e21140700000000000000000000000000000000000000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000006131f2c3845515c6674818d9aa89f9388828e9baaa095887c6f62544a4034281c10040000000000000000000000000000000000000000000000000710181f282f353b42464c5154545c60626567686a6b6c6c6c6c6c6c6b6a69676563605d5655534e49443e36312a211a110800000000000000000000101d293643505c6976838f918b86868686868686868686868686868686868686868686868686868686868686868686868686868686868686868b918f8376695c504336291d100006121f2c3845525e6a757979797979797979766a6054473b2e2215080013202c3946535f6c7986929facada093867a6d6053473a2d201407010b151f29333d46505a606c78828f95a0a9aba29891847a6e675c53493f362d23190f0600000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000815212e3b4854616e7b86929faaab9e91847f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7d7063564a3d3023170a000000000007121d27303c46505a626c717e8691969fa2aaaba39f9b9796918f8e8d8d8d8d8f9092999a9ea1a9aba79f9a938d837b6e695e564c42382e23170c040000000000000004101d2935404b555f69707d8692979fa6aca69f9c96918e8b898988898a8c8f92989ea1a8aaa29f938f83796d665c51453d30271c1207000000000000000000000000020b141c242c323a41464d5254575f626567696b6c6c6c6c6b6a696765615f5754524d46423b332c241c140a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c10161b1e25292d2e333534312c251e150c0200000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2726231f19120a0200000000000000070f161b1f22232d2d2d2d2d2d2d2524211d1811090000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e21140700000000000000000000000000000000000000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c110600000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000000000713202d3a4653606d7985929eaa9d90837d8998a2a79a8d8074665c5144382c1f130800000000000000000000000000000000000000000000000000060d161d242931363a4145474a505355585a5c5d5e5f5f5f5f5f5f5e5d5c5a595654524c4847433c39332a261f180f080000000000000000000000101d293643505c6976828f9393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393938f8376695c504336291d10000613202c3946535f6c7987868686868686867c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d20140707121d27313b454e58616c73808d949ea7afa39992867c6f685e554b41382d241b11070000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000714212d3a46535e6974818e98a2ada196887c7272727272727272727272727272727272727272727272727272727272706b6054483c2f22160900000000000c18232e39424e58616c717f8a9298a0a8aba49f99928e8a8784828180808081828486898d92979ea1a8aca49f9590847b6e685e544a3f342820150a0000000000000006131f2c3845515d676e7b869298a1a9aaa29f948f8984817e7d7c7c7c7d7f82868b91969da4aea59e958f82786d60594f42392e23180c0000000000000000000000010b141d262e363e444c52565e61666a6e717476777879797878777673716e6966615e57524d453e362e261c140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12181d1f272b3035393a3f42413d3730271e1409000000000000000000000000030c151c23282c393939393939393933322f2a241c140a00000000000007101920272b2e2f3939393939393932312e29221b120900000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e211407000000000000000000000000000000000000000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000000005111d2935414c5664707d8a97a2a9998c807885929fab9e9285796d6053463a3025190d0100000000000000000000000000000000000000000000000000040c12181f262a2f35393a3f4446494b4d4f505152525353525251514f4e4c4a4745413c3b37322d28221a140e06000000000000000000000000101d293643505c69768286868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868376695c504336291d10000613202c3946535f6c7986929393939393887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d2014071118242f39434d57606a717e8b929ca6aea49f92877d706a5f564c43392f261b1209000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000005121e2a36424d57616e7b86929fa8a89c8f82766c6565656565656565656565656565656565656565656565656565656360594f44382c2014070000000004101c2834404b545f6a717e87939fa2aaa9a199938e86827e7a777574737373747577797c80858b91969da5afa79f9691847a6e665c50443c32261b0f04000000000004111d2935414b55606d79839098a2aaa9a198928a827c787472706f6f70717275797e848d929fa4aba79f948d80746b60544a4034281c10040000000000000000000009131d262f38404850565e61686e73777b7e81838485868685858482807e7b77736e69615e57504840382e261c13090000000000000000000000000000000000000000000000000000000000000000000000000000000000060c10151a1d24292c32383a4146474c4f4d49423930251b0f0400000000000000000000000a151e262e34384646464646464646403f3b362e261c120800000000040f19222b32383b3c464646464646463e3d3a342d241b1106000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e211407000000000000000000000000000000000000000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000713202d3946525e6875828f9ba9a197897c75828e9baba1978a7d7064564c41362a1e1105000000000000000000000000000000000000000000000000000001070d141a1e24292c2e34383a3c3e40424344454646464645454442413f3d3a3935302e2b26201c170e0903000000000000000000000000000f1c2935424e5a66707679797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797670665a4e4235291c0f000613202c3946535f6c7986929f9f9f9f95887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d2014101a232935404b555e696f7c86929fa4aea69d928b7f726b61584e443b31271d140a00000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000020e1a25313b46525e6973808c96a0ac9f948b7e716a5f5658585858585858585858585858585858585858585858585856544f473d33271c10040000000006131f2c3845515c666f7c869299a4aea8a0979187817b75716d6869676766676768676d7073797e848e939fa4aca8a0969083786d60584e43372b20150a00000000000613202c3945515d67737f8c95a0aaaba19792867e766f6c6565636262636465676d7279808b9399a4afa69d92897d70665c5144382c1f150a00000000000000000007101b252f38404a525a61686d747b8084888b8e8f919292929291918f8d8b8884807b746e69615a524a40382e251b0f060000000000000000000000000000000000000000000000000000000000000000000000000002090e11171c1f262b2f35393d43474c5254595c59534b42372c2015090000000000000000000006111c2630383f4453535353535353534d4b4740382e24190e020000000a16202b343d434749535353535353534b4a453f362d22180c010000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e2114070000000000000000000000000000000000000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f14090000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000714212e3a4754616d7a86929fab9e928579717e8b99a3a99b8f8275685e5246392d20150a0000000000000000000000000000000000000000000000000000000003090e13191d2023282c2d2f32343537383939393939393837363432302d2c2924211f1b15100b050000000000000000000000000000000d1926323e49545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69665e54493e3226190d000613202c3946535f6c7986929facaca295887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d201418222c353e45515d676e7b859198a3aea79e948d80746d62594f463c32291f150b0200000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000009141f2a36424d57606d7984919aa4a69f92867c6e685d554b4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4a48443d352b21160b0000000004111d2935414b55606d79839098a3aba9a09691857d746e6964615d565b5a5a5a5a555c6063666d7179818b939aa4afa89f958c80736a5f54473d32271b0f01000000000714212d3a4754606d7a85929fa7afa49992857c716c63605b535656555657555c60676d747f87939fa6aea49d9184796d6053463c31261b0f0300000000000000030c19222d37404a525c636c717a81868c9196989a9c9e9f9f9f9f9e9d9c9a9895918d86817b716c645c524a40372d21180e0300000000000000000000000000000000000000000000000000000000000000000001040b1014191c23282c3137394045474e54565e616668655d53493d3125190c000000000000000000000c17232e38424a505f606060606060605a58524a40362a1f13070000030f1b27323d464e545660606060606060585650483f34291d11050000000000000002050708080808080808080814212e3b4754616e7a8794a1a094877a6d6154473a2e21140808080808080808080705020000000000000000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d10040000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000006121e2b37424d5765727f8b99a3ab9b8e81756d7a86929fac9f92867a6d6154473c32271b0f00000000000000000000000000000000000000000000000000000000000001080d1113171c1f20222527292a2b2c2c2c2c2c2c2b2a2927262321201d1915120f0a0400000000000000000000000000000000000a16212d38424c545a5c60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605c5a544c42382d21160a000613202c3946535f6c7986929facaca295887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d2016202a343e47515b606d79839097a1aaa9a0958f82786d605b51473d342a20170d030000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000030e1a25303b45515d67707d88939fa6a29891847a6d675c544b423f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3d3c38332b231a0f05000000000613202c3945515d67737f8c95a0aaada19791847b706b615e5754524c4e4d4d4d4e4b5153545c60676d747f88939fa5afa79f92877c6f62584e43372b1d120700000005111e2a36424d5766727f8c97a2adaa9f93877d706a615a5350494a4949494a4b51555c606d73808c949fabaca0958b7e7164584e43372b1f1206000000000000000a151e2b343f49525c646e737e858d92999da0a8a9a29f9d9c9b9c9d9fa2aaa7a09d99928e857e736e645c52493f332a1f14090000000000000000000000000000000000000000000000000000000000000001080d11161c1f252a2e34383c42474b5153586062686d72756f65594d4134281b0e00000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c66635c52473b2f23170a000006131f2b38434e5860626c6c6c6c6c6c6c65625a50453a2e211509000000000002090e121415151515151515151515212e3b4754616e7a8794a1a094877a6d6154473a2e211515151515151515151514120e09020000000000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d010000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000000814212e3a47535f697683909daba3998a7e716875828f9caba3998c7f7265584e43372b1d1207000000000000000000000000000000000000000000000000000000000000000104060c10121316181a1c1d1e1f1f20201f1f1e1e1c1b19171413110d0806030000000000000000000000000000000000000005101c26313a42494e505353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353504e49423a31261c1005000613202c3946535f6c7986929f9f9f9f95887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d201e28323c464f59636d75818e959fa9aaa1979083796d665c50493f352c22180e05000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000009141f2935404b55606b73808d949fa8a0968f82796d665c544b433a323232323232323232323232323232323232302f2c27211a110800000000000714212d3a4754606d7a85929fa7b0a69e92857b6e696059524d47464141404040414045464b51555d606d727f8b939ea9afa3998f82766a605447392f24180c0000000714202d3a46525e697784909da9a8a2988d80746b60585046443f3d3c3c3d3e40454b515b606d7882909ca6b0a89d9083776a5f53473a2e21150600000000000006111c26303d46515b646e74808a92979fa3a9a19e999792908f8f8f909298989d9fa7a39f97928a80736e635b51453b31261a0e0400000000000000000000000000000000000000000000000000000000040a0f13191d20272c3036383f44464e53555d60656a6f747a7f8175685c4f4235291c0f00000000000000000006121f2c3844505c667679797979797979736e63584b3f3226190c00000815222e3b4754606a6f79797979797979716c62564a3d3124170b00000000050d141a1e2021212121212121212121212e3b4754616e7a8794a1a094877a6d6154473a2e2121212121212121212121201e1a140d05000000000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d1207000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000000030f1b27333f4953626e7b88959fac9f92867a6d64717e8b99a3ab9d9083776a605447392e23180c0000000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f101112131313131212110f0e0c0a0707040100000000000000000000000000000000000000000000000a151f2831383e4243464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464643423e3831281f150a00000613202c3946535f6c7986929393939393887c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d2026303a444e58616b727f8c939ea7aca29891857b6e675d544a3f372d231a100600000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000020c18242f39434f59606d78829096a0a89f948f82786d665d554c443b332b2525252525252525252525252525252322201c160f08000000000006131f2b37434e5866727f8c97a2adaa9e948a7d70695f574f46423b3935303433342e34383a40454b515b626d74818e97a1adab9e94897c6f62554b4035291d100400000814212e3b4754616e7b8795989a9b9c92857a6d61594f463e37332d2f2f302e34394045505c666f7c88949fabaca095887b6f6255483c2d22170b0000000000000c17232e38424f59626d74808d929ea1a9a39f97918c8885838282838385888b90959ea1a8a29f928d80736d62574d42362a20160a0000000000000000000000000000000000000000000000000001070c10151b1e24292c33383b42464a5053575f62676d71777c81868c83776a5d5144372a1e110000000000000000000713202d3a4653606d78868686868686868073665a4d4033271a0d00000916232f3c4956626f7c868686868686867e7165584b3e3225180b000000050f171f252a2d2e2e2e2e2e2e2e2e2e2e2e2e3b4754616e7a8794a1a094877a6d6154473a2e2e2e2e2e2e2e2e2e2e2e2e2d2a251f170f0500000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c01000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000005121f2b3744505b6573808d99a7ac9c8f837668606d7a86929faca095887c6f62554b4034281c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d161f262d32353639393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393635322d261f160d0300000613202c3946535f6c7987868686868686867c6f6255493c2f2216090013202c3946535f6c7986929facada093867a6d6053473a2d232e38424c565f6a707d87939fa5afa49a92867c6f695e554b42382e251b11080000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000007121d27313d44505c666d7a849197a1a69e948f81786d675d564d453d3528231c141919191919191919191919171614100b050000000000000815222e3b4754606a7884919ea9b1a79c8f82756c61574d453d36302d292427272723282c2e343a4145515b606d7a85929eaab0a69b8e8275675d5145392c1f130600000b1825323e4b5865717e888a8b8d8e908e8174685e52473d342b272223222323282f343f4a545f6a76828f9cacb1a7998c7f736653493f33271b0f030000000003101c28343f4a54606b727f8c929ca4aaa299928c84807b787675757677797b7f838a91969fa6a49c928b7f72695f53463d32271b0f030000000000000000000000000000000000000000000003090e12181c1f262b2f35393d44484d52545c60646a6e74797e83898e929084776a5d5144372a1e110000000000000000000713202d3a4653606d798693939393938d8073665a4d4033271a0d00000916232f3c4956626f7c8993939393938b7e7165584b3e3225180b0000020d17212930363a3b3b3b3b3b3b3b3b3b3b3b3b3b4754616e7a8794a1a094877a6d6154473b3b3b3b3b3b3b3b3b3b3b3b3b3a36302921170d020000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d0400000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000000000613202d394653606c7884919eaba49a8b7f72655d6875828f9caaa79a8d8074675c5145382c1f14080000000000000000000000000000000000020507080c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0b0906010000000000000000040d151c212629292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292926211c150d0400000006121f2c3845525e6a757979797979797979766a6054473b2e2215080013202c3946535f6c7986929facada093867a6d6053473a2d28343f4a545e686f7c869299a4afa59f93887e706a60574d433a30261c1309000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000010b151f28343f4a545e686e7b859298a2a69e938f82796d685f574f473e342e261e160d0c0c0c0c0c0c0c0c0c0a09070400000000000000000916222f3c4955626f7c8896a1acaca095897c6f625a50453b332a25201d191a1a1a181c1f23282f353f45515d67727f8b98a2aeac9f9286796d6053473a2d20140600000714212d3a4754606d797c7d7f808183847d7063564c41352b221b17161616181d232e38424e5864717d8a9aa4afa99c8f8276655b5044372b1f12050000000006121f2c3844505c666f7c87929fa4aba29892878079736f6a6a696869656c6e72777d848f949fa6a49f92867b6e61584e43382b1f13060000000000000000000000000000000000000000060b0f141a1d23292c32373a4145474f54565e61666d71767b80858b90959b9d9084776a5d5144372a1e110000000000000000000713202d3a4653606d7986939f9f9f998d8073665a4d4033271a0d00000916232f3c4956626f7c89959f9f9f988b7e7165584b3e3225180b000009141f29333b4246484848484848484848484848484854616e7a8794a1a094877a6d6154484848484848484848484848484846423b33291f140900000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d0000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000004101d2935404b5563707d8996a1ac9f93877b6e615664717e8a98a2ab9e9285796d6053463b3025190e02000000000000000000000000000003090e12141519191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191816120d070000000000000000030a1016191c1d20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201d1c1916100a030000000004111d2a36424e59636a6c6c6c6c6c6c6c6c6260584e43372b1f13060013202c3946535f6c7986929facada093867a6d6053473a2d353d44505c666d7a849198a2aba69d938c7f726c61584e453b31281e140a01000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000030d17232e38424c565f696f7c869299a3a59e948f827a6e69605950443f38302820180f07000000000000000000000000000000000000000d1a2633404d596673808c99a8b2aa9d9083776a6054483e332a211a14110d080d070c1013181d242935414c55606d7985929fabaea2988a7d7164574a3e2e23170b00000613202c3945515d676d6f707273757678706b6054443a30231a0f0b0609070c121c26303c4754616d7a86939facab9f9285796c605346392d20130600000003101c28343f4a54606d78839099a3afa39992867d736d67625f585c5c535b6061656c707a828f949fa9a2988f82766a6054473b2e221508000000000000000000000000000000000002080d11171c1f262a2f34383c43474c5254596063696e73797d82888d92979da0a79d9084776a5d5144372a1e110000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2aca4988b7e7165584b3e3225180b00020e1a25303b454d52545454545454545454545454545454616e7a8794a1a094877a6d61545454545454545454545454545454524d453b30251a0e020000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e050000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000006131f2c3945515d6774818e9ba8ab9c908376695e53606d7a86929faca2978a7d7164564d41362a1e110500000000000000000000000000060d141a1e2122262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262525221e181109010000000000000000050a0d0f101313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100f0d0a05000000000000010e1a26313d4751595e5f6060606060606055544e463c32271b0f030013202c3946535f6c7986929facada093867a6d6053473f383d47515b606d78828f96a0aaa89f948e81746d635a50463c33291f160c0200000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000006111c26303a444d57606a707d879298a2a69e9490847b6f6b625a504a423a322a21191106000000000000000000000000000000000005111e2a36424d576976838f9ca9b5ab998c7f7366584e43362c21180f0905010000000004070c1319242f3a45515d6774818e9aa7b4aa9b8e817468544a3f34281c10030004111d2935414c555d606264656768696b6360594f4432291e110800000000010a14202d3946525e687784919daaaea298877a6e6154473b2e21140800000006121f2c3844505c66727f8b95a0aba89f92877d706b605d55534e4f4f495053555a61686d79829097a1a49f94897c6f6256493c2f231609000000000000000000000000000001040a0f13191c22282b3136394045474e53565d60656b70757b80848a8f949a9fa2a7a09d979083776a5d5144372a1e110000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0005121e2a36424d575e616161616161616161616161616161616e7a8794a1a094877a6d616161616161616161616161616161615e574d42362a1e120500000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000714202d3a4753606d7985929faba3998b7f726557515d6775818e9ba9a99c8f8275685e5246392d20160a000000000000000000000000060f181f262a2d2e3232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232312e29231b13090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202b353f474e5253535353535353534947433c342b20150a000013202c3946535f6c7986929facada093867a6d6059504a42454f59626d74808d949fa8a9a0968f82786d605b51483e342b21170d040000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000a151e29323c454e58616b707d869298a2a69f9691857d716c605c544c443c332b2317110a020000000000000000000000000000000714202d3a46525e697885929eabafa399897c6f6256493d32231a0f060000000000000000000108131e2935404b5564707d8a97a9b3aa9d908377665c5044382b1f120600010d19242f3a434c51545557585a5b5d5e56544f473d3320170d00000000000005111d2a36414c566875828e9ba8b3aa95897c6f6256493c2f2316090000000713202d3a4653606d7984919ea7ada1968d80736b6059514b474342423f44464850565d676d7a85929b9993908c8275685c4f4235291c0f02000000000000000000000001070d11161b1e252a2d33383b42464b5153585f62686d72777d82868c91969c9fa6a39f9b95908b857f7366594c403326190d0000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000714202d3a46525e696e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e7a8794a1a094877a6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e695e52463a2d2014070000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b02000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000005111e2a36414d5664717e8a98a2ac9f92867a6e61544b5563707d8a97a1ac9f92867b6e6154473d32271b0f0100000000000000000000030d18212931363a3b3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3e3a342d251b110700000000000000000000000000000000000000000000000000000000050a0d0f101313131313130f0f0d0904000000000000000000000000000000000000000000000000000000000000040f19242d353d424546464646464646463c3b37322b22190f04000013202c3946535f6c7986929facaea194887b706b605b544c4d57606b727f8b929da6aba19791847a6d665c51493f362c22190f05000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000030c17202a333d464f59616b707d869298a1a8a09792877e746d665d564d453d3527221b140b0300000000000000000000000000000814212e3b4754616e7b8797a2adac9f92867a6d6053473a2d2014070000000000000000000000010d18242f3b4754616e7a8797a1adac9f9286796d6053463a2d201307000008131e28313a414547494a4c4d4e50514948443d352b210e05000000000000010d192530414e5b6774818e9aa7b0a3968a7d7063574a3d3024170a000004101d2935404b5564717d8a96a1acaa9e9184796d60594f45403937312d3337393e444c555e68717e8b8e8a86837f7c6f6255483c2f22150900000000000000000000040a0f13181d20272c3036383f44464d53555c60646a6f747a7f84898f92999ea1a9a19e99928e89837e79736d63574b3e3225180c0000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000815212e3b4854616e7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7c8995a2a295887c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b6e6154483b2e211508000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a100600000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000714202d3946525e6876828f9caaab9c8f8276685e524653606d7985929eaba3998c7f7266584e43372b1d12070000000000000000000009141f29333b4246484c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4a463f372d23180d0100000000000000000000000000000000000000000000000000030a11161a1c1d2020202020201c1b1915100902000000000000000000000000000000000000000000000000000000000008121b242b31363839393939393939392f2e2b272019100700000013202c3946535f6c7986929facb8ab9e92857d736c665e56555f69707d87929fa4aea39992857b6e685d544a40372e241a100700000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000050e18212b343e474f59616b707d8691969fa7a199928b80786d685f574f473f332d261d150c03000000000000000000000000000916232f3c4956626f7c8995a9b3aa9e918477675d5145382c1f13060000000000000000000000000714202d3946525e687885919eabaea398887b6e6255483b2f2215080000010c161f282f35393a3c3d3f404243453d3b38332b23190f0000000000000000081a2733404d5a6673808d99a6b0a4978a7d7164574a3e3124170b00000613202c3945515d6775828f9ba8aea3988b7e71675d51473d352f2b2622272b2d323a434c56606d7883817e7a76736f6a5f53473b2e2115080000000000000000070c10151b1d24292c32383a41464a5053575f61676d71767c81868b91959b9fa3a69f9c96918c86817c77716d67635b51463b2f22160a0000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b788487878787878787878787878787878787898e99a4a4988e888787878787878787878787878787878784786b5e5245382b1f120000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c11080000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000814212e3b4754616e7b86929faca3998b7e7165564c44515c6674818d9aa8ab9d9184776a605447392f23180c000000000000000000020e1a26313b454d535559595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959585651493f34291e1206000000000000000000000000000000000000000000000000040d151c2226292a2d2d2d2d2d2d292825211b140c03000000000000000000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d22221f1b150f070000000013202c3946535f6c7986929facb9ada197928780786d68605d676e7b859299a3aea49f92877d6f695f564c42392e251c12080000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000060f19222c353e474f59606b6f7c8490959ea5a39f928d827a6e69605950443f382f271e150d040000000000000000000000000a1723303d4a5663707d8996a3b0a99c90837669554b4035291d100400000000000000000000000005111e2a36414c566a7683909da9b4aa96897c6f6356493c30231609000000040d161e24292c2d2f313234353638302f2c272119110700000000000000000d1a2633404d596673808c99a6b1a4978a7e7164574b3e3124180b00000714202d3a4753606d7a86929facac9f92867a6d60554b403529241d1a171b1f2028313a44515c666d7775716d6866625f584e43372b1f1206000000000000030b12181c1f262b2f35393d43484c52545b6063696e73797e83888e92989da0a8a29f9a94908a847f7a756f6b65605d55514940352a1e12060000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b7885919494949494949494949494949494949599a0aaaaa098959494949494949494949494949494949184786b5e5245382b1f1200000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000006131f2b37434e5865727f8c99a3ac9f92867a6d615447404a54636f7c8996a1aca095897c6f62554b4034291c1004000000000000000005121e2a36424d575f616565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565625b51463a2e2216090000000000000000000000000000000000000000000000030d161f272d3235363939393939393635312c261e150c020000000000000000000000000000000000000000000000000000000000080f151a1d1f20202020202020201615130f0a04000000000013202c3946535f6c7986929facb9b3a9a199938c827a6f6a656d79839097a1aba59c928b7e716b60574d443a30271c130a000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000007101a232c353e474f59606a6f7a838f939fa4a49d948f847b706b625a5049413930271f160d0400000000000000000000000b1724313e4a5764717d8a97a4b0a89b8f8275685c4f422f24180c00000000000000000000000000010d192530424f5c6875828f9ba8b0a3968a7d7063574a3d3024170a00000000040c13191d202122242527282a2b252423211c170d0801000000000000000e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b00000a1723303d4a5663707d8998a3aea89b8e8275675d51433a2f23181d1d1d1d1d161f2834404a545c606a6864615e5655534e463c32261b0f030000000000030c151c23282c31373a4045474f54565e61666c70767b80858b90959a9fa2a8a09e98928e88837e79736e6863605953514b4340372e23190d020000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b7885919ea1a1a1a1a1a1a1a1a1a1a1a1a1a1a2a4aab2b2aaa4a2a1a1a1a1a1a1a1a1a1a1a1a1a1a19e9185786b5e5245382b1f120000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a01000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000000000815212e3b47535f6a7783909dabaa9c8f8275685e5246394653606c7884919eaba89a8d8174675c5145382c1f140900000000000000000714212d3a46535f696e72727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272726d62564a3e3125180b00000000000000000000000000000000000000000000000a151f2831383e424346464646464642413d3730271e140900000000000000000000000000000000000000000000000000000000000004090e11121313131313131313090806030000000000000013202c3946535f6c7986929facb9bab2aba49f948f847c726c77818f95a0a9a79e938c80736c61594f453c32281e150b01000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000008111a232c353d474f585f686e79818c939aa2a69f9691857d716c605b534a423931281f160d04000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8275685b4f4235281c070000000000000000000000000000081b2835414e5b6874818e9ba7b0a4978a7d7164574a3e3124170b000000000008121a22282d303132323232323231302d282219130c04000000000006121e2b37424d576875828f9ba8b4aa96897d7063564a3d3023170a00000d1a2733404d5a6673808d99aab4aa978b7e7164554c4131282a2a2a2a2a2a2a2a2a232e39424a51535d5b5754524c4847433c342a20150a0000000000000b151e272e34383c43474b5153596063686d72787d82878d92979d9fa7a49f9c96918b86817c76716d66615e56544f47454039312e251c1207000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b7885919e9f9f9f9f9f9f9f9f9f9f9f9f9f9fa1a3a8b0b0a8a3a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9e9185786b5e5245382b1f12000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a0100000000000000000000000b1825313e4b5864717e8b97a4aca89b8e8175685b4e4235281b0f08040000000000000000000003050e1b2734414e5a6774818d9aa7aca4978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000003101c28343f4a54626f7c8895a0aca3988b7e7164564c413744505b6573808d9aa7ab9f9285796d6053473b30251a0e02000000000000000815222e3b4855616e7b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7265584c3f3225190c0000000000000000000000000000000000000000000005111c27313a434a4e505353535353534f4d49423930261b1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facb9b2a8a09da09f9691877f76808c939ea7a89f958e81776c605a50473d332a20160c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000008111a232b353d464e565e676d7780889298a0a8a09792877e736c655c544b433a31281f160c030000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2834414e5b6774818e9aa7b1a4978b7e7164584b3e3125180b0000000005101a242c33393c3e3f3f3f3f3f3f3e3c393329241e16100c0709060b1117232d3a47535f697884919eabaea398887b6e6155483b2e2215080004101c2834404b546976828f9ca9aea398887b6f6255483c2f3737373737373737373737373039404446514e4b4746413c3b37322a261f180f060000000007121c2730394044464e53555d60656b6f757a7f848a8f939a9ea1a9a29e99938f89847f7a746f6a64605c54524c48433d39352f271f1c130a00000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b78849193939393939393939393939393939394979ea8a89e97949393939393939393939393939393939185786b5e5245382b1f12000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f191109000000000000000000000000000b1825313e4b5864717e8b979f9f9f9b8e8175685b4e4235281b1614100b05000000000000060b0f12131b2734414e5a6774818d9a9f9f9f978b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000000000006121f2b3844505c6673808d9aa7ac9f92867a6d6054473a333f4953626f7c8895a0aca2978a7e7164574d42362a1e1205000000000000000a1724303d4a5763707d8a8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c86796c5f5346392c2013000000000000000000000000000000000000000000000a16222d38434c545a5d6060606060605c5a544c42372c2115090000000000000000000000000000000000000000000000000000000105090b0b13131313070604000000000000000000000000000013202c3946535f6c7986929facb9aca0969196a0a199928c838c929ca5aaa1969083796d655b50483e352b21180e040000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000081119232b343c444d555d656c737e8691969fa6a299928b80776d665d554b433a31281e150a0000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000b17222c363e44494a4b4b4b4b4b4b4a49453e352f281f1c18171616171b222935404b55616e7b8896a1acac9f9286796d6053463a2d2013070006131f2c3845515c667884919eabac9f9286796d6053464444444444444444444444444444444444444444444444444444443b3a36312a21180e030000000c18232e39424a5153585f62676d72777c81868c91969c9fa4a7a09d97928d87827d78726d68625f5853504a46413b38322c29241d150d0a0100000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00121f2b3845525e6b788486868686868686868686868686868686878c97a3a3978c878686868686868686868686868686868684786b5e5245382b1f12000000000000000000000000000000080e171f2f3a454f575c5e60605f545c60626567686a6b6b6c6c6c6b6a6a68666462605c5454524c47433c383229241d160d0700000000000000000000000000000b1825313e4b5864717e8b93939393938e8175685b4e42352b2423201c170e09030000020a11171b1f20252c34414e5a6774818d93939393938b7e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000000000713202d3a4653606d7985919eabaa9b8f8275675d5145392d3847535f6a7784909daaa99c8f8276695e52463a2d20160a000000000000000a1724303d4a5763707d8a96989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989286796c5f5346392c2013000000000000000000000000000000000000000000010d1a26323e4a545e66696c6c6c6c6c6c69655e54493d3125190d0000000000000000000000000000000000000000000000000000060c111517182020201f1413100c0701000000000000000000000013202c3946535f6c7986929facb7aa9d91849196a0a39f9490949ca4aba29891847a6d675c53493f362d23190f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000071019222a323b434b535b606c707c848f949da4a39f928d81786d675d554b433a30261c110600000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000004101c28333e4850555758585858585857555045413a312c282323222322282d333d45515d67727f8c99a8b2a99d908376665c5144382c1f1206000713202d3a4653606d7986939facaa9d908477665c50505050505050505050505050505050505050505050505050505050504846423b332a1f1409000004101c2834404a545c60646a6f747a7e83898e92999ea1a8a39f9b95908b85807b75706c65605d56534e46443f3836302c271f1d18120b03000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00111e2a3743505c687278797979797979797979797979797979797a8794a1a094877a797979797979797979797979797979797872685c5043372a1e11000000000000000000000000000000000f1b2834404c5761686b6c6c6c605c5455585a5c5d5e5f5f565d6065696b6c6b6965605c554e463c37312b272018130c040000000000000000000000000000000b1825313e4b5864717e868686868686868175685b4e42393831302d28221a140c07070b141b22272b2d323939414e5a677480868686868686867e7164584b3e3125180b000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f06060403010000000000000203060e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000000004111d2935414c5563707d8a97a1ada2988a7e7164554c41352b37434e5866737f8c99a7ac9f93877b6e6154483d32271b0f010000000000000a1724303d4a5763707d8a969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9286796c5f5346392c2013000000000000000000000000000000000000000000030f1c2935424e5a6670767979797979797570655a4d4135281b0f020000000000000000000000000000000000000000000000000911181d2124252d2d2d2c201f1c18120b030000000000000000000013202c3946535f6c7986929facaea194877b849196a1a69f9c9fa6afa39992867c6f685e554b41382d241b110700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000071018202931394149505a616a6f7a828d929fa4a49c938e82796d675d554b42382e23171006000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000814212d3944505a616465656565656564615a514c433e38342e302f302d33383f44505a606d7985929eabb1a7998c807366544a4034281c1004000815212e3b4854616e7b879aa4afa99c90837669545d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534d453b31261a0e020006121f2c3844515c666d71767c81858b90959b9fa3a8a19e99928e89837e79736e6963605b53524c47433c38342e2a251e1b16100c070100000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000f1b2834404b5660686b6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6e7a8794a1a094877a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6860564b4034281b0f00000000000000000000000000000005111e2a3744505c6873787979796d665c504b4d4f4c52565e61686d727678797876726d675f584e463c30261c160d0701000000000000000000000000000000000a1724303d4956626c7179797979797979756f65594d4646453d3c39332a261f181212181d262d3337393e4546464c58646e7479797979797979716c6256493d3024170a000b1825313e4b5864717e8b97a4aca89b8e8175685b4e4235281b13131311100e0a050005090d0f1013131b2734414e5a6774818d9aa7aca4978b7e7164584b3e3125180b0000000000000613202c3945515d6775818e9ba9ac9f92867a6d6053473a2f26323c4855616e7b88959faba4998c7f7266594f43382c1d12070000000000000a1724303d4a5763707d8a93939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939286796c5f5346392c201300000000000000000000000000000000000000000003101d2a3643505d6976828686868686868275695c4f4236291c0f03000000000000000000000000000000000000000000000009121b22292e3132393939392d2c29231d150d0300000000000000000013202c3946535f6c7986929facada09386797b849197a1a9a9abb0a89f92877d706a5f564c43392f261b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000060e171f282f383f4450585f686d78808b9399a3a59e948f82796d675d544a3f342822180b020000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000a1623303c4955616c71727272727272716c605d554f4645403e3d3c3c3d3f44495059616c73808d97a1adab9f95887c6f6255483c2e23180c00000916232f3c4956626f7c8995acb6a89c8f82756a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a615f574d42362a1e1205000713202d3a4653606d787e83888d92989da0a7a69f9c96918c86817c77716d67615f5753504945413a37312c28231c19140f0a0400000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000b17232f3a454e565c5e6060606060606060606060606060616e7a8794a1a094877a6d6160606060606060606060606060605e5c564e453a2f23170b00000000000000000000000000000005121f2b3845525e6b7885868686786d60534a4c51565e61686d737a7f82858685837f796f6a5f584e42382e23170b0000000000000000000000000000000000000815212d3945505a62646c6c6c6c6c6c6c68655d53535353514a49443e363129231d1d23282f383f44464b52535353535c64676c6c6c6c6c6c6c64625a5045392d211508000b1825313e4b5864717e8b979f9f9f9b8e8175685b4e423528202020201d1d1a16110b1015191c1c2020202734414e5a6774818d9a9f9f9f978b7e7164584b3e3125180b0000000000000714212d3a4754606d7a86929facaa9b8e8175675d5145392c212d3a46535f697683909dabab9e9184776b605448392f24180c0000000000000a1724303d4a5763707d8686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c5f5346392c201300000000000000000000000000000000000000000003101d2a3643505d69768390939393938f8275695c4f4236291c0f030000000000000000000000000000000000000000000006111b242d343a3d3e464646463a38342f271f150b01000000000000000013202c3946535f6c7986929facada093867a6e7b859197a1a9b3aca1968b7f726b60584e443a31271d140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000000000050d161d262d333e464e565d666d747f879298a2a69e949082796d665c50443f342a1d140a0000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000b1724313e4a5764717e7e7e7e7e7e7e7d756d67615953514b4b4a49494a4a50535b606b707e88939fa9b0a69d9083766a5f53473b2e1c120700000a1623303d495663707c8996a3afa89b8e8177777777777777777777777777777777777777777777777777777777777777776e695f53463a2d21140700101d293643505c6976828a90949a9fa2aaa29f9a948f8a847f7a756f6a64605d55534d46443f38352f2b261f1c17110e0802000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0007121e28333c454b50525353535353535353535353535354616e7a8794a1a094877a6d61545353535353535353535353535352504b453c33281e120700000000000000000000000000000003101d2a3643505d6976839098897c6f635a56555d60686d737a80858b8f9192928f8b847c6f6a5f544a3f34281c1003000000000000000000000000000000000005111d29343e48505658606060606060605b595e606060605e57555046423b342f27272e343c41495053585f6060605f5c585a60606060606060585650483e34291d1105000b1825313e4b5864717e8b93939393938e8175685b4e42352d2d2d2d2d2a2926221c151b212528292d2d2d2d34414e5a6774818d93939393938b7e7164584b3e3125180b000000000005121e2a36424d5765717e8b98a2aea2988a7d7064554b4035291e2a36424d5765727f8b99a3aca096897c6f63554b4035291d100400000000000916232f3c4855616b707979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746a5e5145382b1f1200000000000000000000000000000000000000000003101d2a3643505d697683909c9f9f9c8f8275695c4f4236291c0f03000000000000000000000000000000000000000000010c18222d363f454a4b535353524745403931271d1207000000000000000013202c3946535f6c7986929facada093867a6d6f7c859297a2aaab9e91847a6d675c554b423930261e140b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000040b141b2227343c444c545c606d727e869298a2a69f958f82786d605a50463c2f261c110600000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000003101d2a3643505d6976838b8b8b8b8b8b8a817a706b64605c545756555657545b60656c727d86929aa4afaa9f948a7d7064584e43372b1f0b0000000a1724303d4a5763707d8a96a3b0ab9e928583838383838383838383838383838383838383838383838383838383838383837b6e6155483b2e22150800101d2a3743505d6a7683909c9fa6a8a09d98928d88837d78736d6862605853514b46423b37332d29241e1b15100c06000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00010c17212a333a4043454646464646464646464646464754616e7a8794a1a094877a6d6154474646464646464646464646464543403a332a21170c01000000000000000000000000000000010e1b2834414e5b6774818e9a8e81756c656364676d737a80868d92989c9e9f9e9c9691857c6f665c5044382b1f13080000000000000000000000000000000000000c17222d363e45494b5353535353535359636b6c6c6c6c6b64615a534d45403931303940454d535b60656c6c6c6c6b686157535353535353534b49453e362d22170c00000b1825313e4b5864717e868686868686868175685b4e423939393939393736322d271f262c3235363939393939414e5a677480868686868686867e7164584b3e3125180b00000000000714212d3a46535e697683909caaab9f9285796d6053463a2f241a26313b4754616d7a86929faca89a8e8174675d5145392c1f140900000000000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a62584d4135291d100000000000000000000000000407090a0b0b0b0b0b0b101d2a3643505d697683909ca9a89c8f8275695c4f4236291c0f0b0b0b0b0b0b0a09070400000000000000000000000005111d29343f485056586060605f53514b43392f23180c000000000000000013202c3946535f6c7986929facada093867a6d6a6f7c859298a2aaa1968f82796d675c544a423830261d140b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000020a1117222a323a424a505b626c717d869298a2a79f948e81746d62584e42382d22170b00000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000030f1c2936424f5c6975828f9898989898938e847d76706d6666646362636465666c71787f879298a2acaca2988f82766c6155463c32261b0f0000000a1724313d4a5764707d8a97a3b0ada1979290909090909090909090909090909090909090909090909090909090909090887b6e6255483b2f22150800101d2a3743505d6a7683909da9a49c96918b85817c76716d66615e56544e4745403936312b27221b19130f0a030000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000050f1821282f34373839393939393939393939393b4754616e7a8794a1a094877a6d6154473a39393939393939393939393837342f2821180f0500000000000000000000000000000000000c1825323f4b5865727e8b98938b7f75717071747a80858d92989fa2aaa4a3a5a8a1979083786d6053463a2f24190d01000000000000000000000000000000000006111b242d34393d3e464646464646525e6b757979797978706c615f57514b433e3d424b51575f656c71787979797873685c504646464646463e3d39342d241b110600000a1724303d4956626c7179797979797979756f65594d3b46464646464644423e39312930383d41434646464646464c58646e7479797979797979716c6256493d3024170a00000000000815212e3b4854616e7b87939faca99b8e8174675c5145382c1d14202d3946525e6876828f9caaab9f9285796d6053473b31251a0e00000000000714212d3a46535f696e72727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272726d62564a3e3125180b00000000000000000000040b10131616171717171717171d2a3643505d697683909ca9a89c8f8275695c4f4236291c17171717171717161613100b05000000000000000000000915212e3a45505a62656c6c6c6c605c554b4034291c10040000000000000013202c3946535f6c7986929facada093867a6d606a6f7d869298a3a89f948f82796d665c544a42382f261d140b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000061018202830383f44515a616b707d869299a4a69d938b7e716a5f544a3f33281d1207000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000020e1b2835414e5b6874818e9ba5a5a5a59e96918a837d79767271706f6f707275787d838b9299a2aaafa49a92867b6e61594f44342a20150a0000000a1724313d4a5764707d8a97a3b0b3a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d94887b6e6155483b2e22150800101d2a3743505d6a7683909da99c928d847f7a746f6a64605c54524c48433d38352f2a261f1b17110d080100000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000060f171e23282a2b2d2d2d2d2d2d2d2d2d2d2e3b4754616e7a8794a1a094877a6d6154473a2e2d2d2d2d2d2d2d2d2d2d2b2a28231e170f060000000000000000000000000000000000000815222f3b4855626e7b88959b918b827e7d7e81858c92989fa2a29f9a9796989c9f9f958a7d7164554c4135291d110400000000000000000000000000000000000009121b22292d303139393939394653606c7987868686847d756e69605c554f46454f545c60696e777e8586868685786b5f5245393939393931302d29221b12090000000815212d3945505a62646c6c6c6c6c6c6c68655d534648535353535353504f4a433b313a42494e4f53535353535348535c64676c6c6c6c6c6c6c64625a5045392d2115080000000007131f2c38434e5866737f8c9aa4ada2978a7d7063554b4034281c111d2a36414c5664717e8b98a2aea2988b7e7164574d42362a1b1106000000000815222e3b4855616e7b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7265584c3f3225190c000000000000000000070f161b20222324242424242424242a3643505d697683909ca9a89c8f8275695c4f42362924242424242424242322201c160f070000000000000000000b1724313d4a56626c71797979796d675c5145382c1f13060000000000000013202c3946535f6c7986929facada093867a6d60606a707d869299a3a69f948f82786d665c544a42382f261d140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e161e262e343f485059606b707e87939fa6a59f92867c6f665b5044392e23180c000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000010e1a2734414d5a6774808d9aa7b1b4aea8a19e94908a85827f7e7d7c7c7d7f82858a90959fa3ababa39f93887e71695f53473e3322180e040000000a1723303d4a5663707d8996a3b0b8b0aba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa9aaaaaaaaaa94877a6e6154473b2e21140800101d2a3743505d6a7683909da69a8d8079726d68625f5853504a46413b38322c29241d1a150f0b0600000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000050c12171b1e1f202020202020202020212e3b4754616e7a8794a1a094877a6d6154473a2e212020202020202020201f1e1b17120c05000000000000000000000000000000000000000814212e3a47535f6a7784919d9b948f8b898a8d92989fa2a29f98928d8a898b90949c9c8f8276675d5145392c201306000000000000000000000000000000000000000911171d2124252d2d2d2d313e4b5864717e889396918a827b736d67615953525960666d737b828b929792877e7064574a3d312d2d2d2d2524211d1711090000000005111d29343e48505658606060606060605b59534d535f6060606060605d5b554d4339424c545a5c6060606060605f5353585a60606060606060585650483e34291d1105000000000915222e3b4854606a7784919eacab9e9285796d6053463a2e23180d1925303a4754606d7a86929facaa9c8f8276695e5346382d22170b000000000a1724303d4a5763707d8a8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c86796c5f5346392c2013000000000000000007111921272c2f303131313131313131313643505d697683909ca9a89c8f8275695c4f4236313131313131313131302f2c272119110700000000000000000b1825323e4b5865717e86868686796d6053473a2d20140a0000000000000013202c3946535f6c7986929facada093867a6d6058606b707d879299a3a69e948f81786d665c544a41382f261b11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000010000040607080707050100040c141c2328363e474f59616c727f8c949faaa3989083786c60554b4034281c10040000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000d1a2633404d596673808c99a6b4aaa29f9a9f9f9c98928f8c8a8988898a8b8e92979da0a7aea8a199928b7f726c61574d42352c21100600000000091623303c4956636f7c8996a2afb0a69f9c9393939393939393939393939393939393939393939393939c9ea6b0aea398877a6d6054473a2d21140700101d2a3743505d6a7683909da99c928d847f7a746f6a64605c54524d48443d39352f2b261f1c17110d080200000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000001070b0f1112131313131313131314212e3b4754616e7a8794a1a094877a6d6154473a2e2114131313131313131312110f0b0701000000000000000000000000000000000000000006121e2b37424e5765727e8b95a09e9c9896979a9fa2a39f98928c85817e7d7e838c929f92867a6d6054473a2d2114070000000000000000000000000000000000000000060c1115171820202024303d4956626c717f8b919e948f868079706b615f5d606b6f797f868f949f93887e716c6155493c3023202020181715110c060000000000000c17222d363e45494b535353535353534e4d4d575e6c6c6c6c6c6c6c6a665f554a3e49545e66696c6c6c6c6c6c6c5e574d4e535353535353534b49453e362d22170c0000000004101c2834404b54626f7c8996a0aca99a8e8174665c5144382c1d120813202c3945515d6775818e9ba9ac9f93877b6e6153493f33271b0f030000000a1724303d4a5763707d8a96989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989286796c5f5346392c201300000000000000040f19232b32383b3d3e3e3e3e3e3e3e3e3e3e43505d697683909ca9a89c8f8275695c4f423e3e3e3e3e3e3e3e3e3e3d3b38332b23190f05000000000000000a1723303d4a5663707d8993988a7d7063574a3d31261b0f0300000000000013202c3946535f6c7986929facada093867a6d605359616b717e87929aa4a69e938e81786d665b534941382d2217140a01000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000020608080e070c101313151413110d0802020a1117242c353d47505a606c77828f98a2aa9f958b7e71675c5145382c1f14080000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000c1926323f4c5965727f8c98a5aea298928d939aa0a29f9c999796959697989b9ea1a9acaba39f9691877f726d625a50453c31231a1000000000000815222f3b4855626e7b8895a9b3ab9f948f8686868686868686868686868686868686868686868686868f949eaaac9f928579675d5145392c20130600101d2a3743505d6a7683909da9a49c96918b86817c76716d66615e56544f4745403937312b28221c19130f0a040000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000020405060606060606060814212e3b4754616e7a8794a1a094877a6d6154473a2e211407060606060606060504020000000000000000000000000000000000000000000000020e1a26313c4653606c78839097a1a8a4a3a4aaa29f98928d86807a74717072767f8c94998a7d7063574a3d3024170a0000000000000000000000000000000000000000000005080a0b131315212d3945505a626d727f8b919c98928c847d756e69686d747c838c92989c918b7f726c625a5044392d201413130b0a0805000000000000000006111b242d34393d3e464646464646464246535e69767979797979797771665b4f424e5a66707679797979797976695e5346464646464646463e3d39342d241b11060000000006131f2c3845515c6674818d9aa8ada197897d7063544a4034281c0b04111d2935414b5564707d8a97a2ada49a8c7f73655b5044372b1f13070000000a1724303d4a5763707d8a969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9286796c5f5346392c2013000000000000000b16212b353d4448494a4a4a4a4a4a4a4a4a4a4a505d697683909ca9a89c8f8275695c4f4a4a4a4a4a4a4a4a4a4a4a4948443d352b21160b000000000000000815222f3b4855626e7b88959a8d817467584e43372b1f120600000000000013202c3946535f6c7986929facada093867a6d60534f59616c717e88939fa3a59e938e81786c655b53493f3327261c130a010000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000003090e1214151a1c181c1f202121201d19130c050006121a232b353e44505b656e7b86929faaa79e9184796d6053463b3025190d0100000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000b1825313e4b5864717e8b97a4ab9f9286818890959b9fa3aba4a3a2a2a3a5a8a9a7a8a19e99928d847d716d625b51483e332a1f110800000000000714212d3a4754606d7a8797a2ada99c8f82797979797979797979797979797979797979797979797979828f9ca9ab9e9184786b554b4135291d110400101d2a3743505d6a7683909c9fa6a8a09d98928d88837e79736e6863605953514b47423c38332d2a251e1b15100c07010000000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000000009151f2b3844505b666f7c8591969c9f9f9e9c98928d86807a736d686463656d76828f998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000605111d29343e48505a626d727f8c929c9f96918a827b73717a818891959f9d928c7f736d625a50483e33281c1004060000000000000000000000000009121b22292d3031393939393939393b4854616e7b86868686868683776a5d50444f5c6976828686868686867b6e6154483b39393939393931302d29221b120900000000000713202d3a4653606d7985929eabab9e9185796d6053463a2e23180c010d18242f3a4653606d7985929fabac9e9184786c6053463a2f24180d0100000a1724303d4a5763707d8a93939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939286796c5f5346392c201300000000000004101b27323d474f54565757575757575757575757575d697683909ca9a89c8f8275695c57575757575757575757575756544f473d33271c10040000000000000714202d3a4753606d7a86979e9184786a5f53473a2e21150800000000000013202c3946535f6c7986929facada093867a6d605347505a616c727f8b919ba4a59e938e81776c655b504440382e261c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000000000060e151a1e2122272823282c2d2e2e2d2a251e160e05000811192327333f49535e69737f8c98a2ada1968b7e7164564c41362a1e110500000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000a1724313d4a5764707d8a97a3ac9f9286797c83898e9299999c9d9e9f9f9f9e9d9b9896918c86807a706b625a51493f362c21180e0000000000000613202c3945515d677885929eabaa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c667784919eaaa99c8f8376695c50432f24180d0100101c2936434f5c6976828a8f949a9fa2a9a29f9a94908a84807b756f6b65605d55534d46443f3836302b271f1c18120e0903000000000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a545f6a6f7c848c909292918f8b86807b746e68605d56565b64707d8a998f8275685c4f4235291c0f020000000000000000000000000000000000000000000000000000000c17222d363f48515b636d737f8c929ca09e948f867f7d848d939aa09d938d80736d635b51483e362c22170b000000000000000000000000000000000911171d2124252d2d2d2d2d2d2e3b4854616e7b87939393939083776a5d50444f5c6976828f93939393877b6e6154483b2e2d2d2d2d2d2524211d171109000000000005111d2935414c5664707d8a97a2ada89a8d8074665c5044382b1c12070007131f2c3845515c6674818e9aa8aca096897c7063554b4035291d110400000a1724303d4a5763707d8686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c5f5346392c20130000000000000713202c38444f59606364646464646464646464646464697683909ca9a89c8f827569646464646464646464646464646360594f44382c20130700000000000006131f2c3945515d677885929e96887b6f6255483c3025190d01000000000013202c3946535f6c7986929facada093867a6d60534748505a626d727f8c929ca4a59d938e80776c605c524a40382e251c130a01000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000000060f181f262b2d2e34352e34383a3b3a3936302820160c0200071117222d38414d57606d7a86929faca89c908376685e5246392d20140700000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000a1623303d495663707c8996a3afa399867a6f787d82868a8c8f909192929291908e8b8884807b736d68605950483f372d241a0f0600000000000004111d2935414c55697683909ca9ab9f928578695f606060606060606060606060606060606060606d7986929faca79a8d8174675a4e4134271b0700000713202d3a4653606d787d82888d92979da0a7a69f9c97918c86817c77726d67625f5753504a46413a37322c29231d1a140f0b0600000000000000000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000b17222d38424e585f6a6f797f83858684827f7a736e69615e56524c4a54606d7987868683776a5e5144372b1e110400000000000000000000000000000000000000000000000000000006101b242d363f49515b636d73808d929da49e98928c8a91969fa49e938e81746e645b51493f362d241a10050000000000000000000000000000000000060c111517182020202020212e3b4854616e7b87949f9f9d9083776a5d50444f5c6976828f9c9f9f94877b6e6154483b2e2120202020181715110c060000000000000713202d3946525e6875828f9ba9ada196897c6f63544a3f34281c0b000004101c2834404b5463707c8996a1ada89b8e8174675d5145392c20140900000916232f3c4855616b707979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746a5e5145382b1f120000000000000916222f3b4854606b7071717171717171717171717171717683909ca9a89c8f82757171717171717171717171717171706b6054483b2f22160900000000000004101d2935404b556a7783909d998c7f7266564c41362a1d1105000000000013202c3946535f6c7986929facada093867a6d6053473e48515b626d737f8c929ca4a59d938d80746e645c524a40372e251c1309010000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000030e18212a31373a3b414243404546484746413a32281e1308000006111b262f3b45525d6875828e9ba8ac9f93877a6e6154473b2e21140800000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000916222f3c4955626f7c8895a2b5ab94877b6e6c70757a7d808284848586858583817f7c78736e68605d564f473f362d251b120800000000000000010d19242f414d5a6774808d9aabaea298887b6e61555353535353535353535353535353535355626f7c8899a3afa9988b7e7265584b3f3225180c000006121f2c3844505c666d71767b80858b90959b9fa3a9a19e99928e89837e79746e6964605b54524c47433d38342f2a251f1b17110d080100000000000000000000000000000713202d3a4653606d798693a0aca69a8d8073675a4d4034271a0700000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000006111c262f3c464e585f676d727678797876726d68615e56524c454145515d67757979797771675b4f43362a1d10040000000000000000000000000000000000000000000000000000000009121b242d373f49525b636e74808d929da5a39f99979ea1a69e948e81786c605c524940372d241b1108000000000000000000000000000000000000000005080a0b1313131315212e3b4854616e7b8794a1aa9d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e21151313130b0a080500000000000000000714212e3a4754616d7a86929facab9e9184786c605346392e23170b0000000c18232e394653606c7884919eabac9f92857a6d6053473b31261a0e02000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a62584d4135291d100000000000000a1623303d495663707d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7e83919daaaa9d90837e7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d706356493d3023160a000000000000000c18242f424f5c6875828f9b9c908376685e5246392d201307000000000013202c3946535f6c7986929facada093867a6d6053473a3f49515b636d73808d929da5a59d928d80746e635c524940372e251b13090000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d2013070000000000000000000000000000000000000000000009151f2a333c4247484d4f504b51535454524c443a3025190d0100000a141d2935414c5664717e8b97a4afa49a8a7e7164574b3e3124180b00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000815212e3b4854616e7b8794abb5a295887b6f6263686d7073767778797978787674726f6a66615e56524c433d352d241b1309000000000000000000081724313e4a5764717d8a99a3afaa988b7e7165574d42464646464646464646464646424d5765727f8c98abada297887b6f6255483c2f221509000003101c28343f4a545c60646a6e74797e83898e92989ea0a8a39f9b95908b85807b76706c66615e56544e4745403936312b27221b19130c04000000000000000000000000000713202d3a4653606d798693a0aca79a8e8174675b4e412e23180c00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000000000000a141d2a343c464e555d6065696c6c6b6965615e56524d46413b35414b555d6b6c6c6c6a675f564b3f33271b0e02000000000000000000000000000000000000000000000000000000000009121b252d374049525c646e74808d939da59f9f9f9fa79f948f82786d665b504a40372e251b1209000000000000000000000000000000000000000000000000000606060815212e3b4854616e7b8794a1a99d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e2115080606000000000000000000000006121e2b37424d5765727f8b99a3aea89a8d8073655b5044372b1c110600000007121f2b3844505b6673808d9aa8aea2988b7e7164574d42362a1e12050004101c28333e474f5557606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5e5850473c3125190d000000000003101d2a3643505d6976838a8a8a8a8a8a8a8a8a8a8a8a8a8a8a9195a0acab9f95908a8a8a8a8a8a8a8a8a8a8a8a8a8a8a83776a5d5044372a1d1104000000000000071a2734414d5a6774808d9a9f93867a6d6154473a2e23180c000000000013202c3946535f6c7986929facada093867a6d6053473a373f49525b636e74808d939da5a49d928d80736e635b51493f372d251b120900000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaca09386796d6053463a2d201307000000000000000000000000000000000000000000020e1a26313c454d53555a5b5c555c6061615e564c41362a1d11050000020b19242f3c4955626f7c8895a2b6ac998d8073665a4d4033271a0d00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000714212d3a4754606d7a8799a4afa296897c6f63565d606366696a6b6c6c6c6b6a6865625f5854524d45413a312b231b1209010000000000000000000714212e3a4754616d7a86929faca89b8e8275695e53463d313939393939393939303946525e6976828f9ca9ab9e9285786c605346392d2013060000000c17232e38424a5053575f62676d71777c81868c91969c9fa4a7a09d97928d87827d78726d6862605853514b46423b37332d29241e160d0a0100000000000000000000000713202d3a4653606d798693a0aca89b8f827568544b4034281c1004000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a87949f9f94877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000020b18222a343c434b5154595d5f5f5e5c5854524c46423b36302f3a434b515e6060605e5b564d44392e22170b0000000000000000000000000000000000000000000000000000000000000009131c252e37404a525c606c77818e93939393939393959082796d665c544a3f382e251c130900000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87949c9c9c9083776a5d50444f5c6976828f9c9c9c94877b6e6154483b2e211508000000000000000000000000000814212e3a47535f697683909d9f9fa096897c6f6253493f33271b0a00000000030f1c28333f4a54626f7c8895a09faa9c908376695f53463a2d21140700000b16212c353e44484a5353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353514d473e352a1f1409000000000003101d2a3643505d6976839097979797979797979797979797979da0a8b1b1a79f9d97979797979797979797979797979083776a5d5044372a1d11040000000000000c1926323f4c5965727f8c98a4998b7e7164544a4034281c10040000000013202c3946535f6c7986929facada093867a6d6053473a2d374049525c606c77818e939ea6a49c928c80736d635b51493f372d241b1209000000000000000000000000000000000000000000000000010101010101010101010613202c3946535f6c7986929facaca09386796d6053463a2d20130701010101010101010101000000000000000000000006121e2b37424d575f616768696a676d6e6d685e5246392d2013080000000814212e3b4754616e7a8794a1ada89b8e8175685b4e4235281b0f02000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0000000613202d394653606c7986939faca3968a7d706357525457595c5d5e5f5f5f5e5d5b5855534e4746413b352f281f19110900000000000000000000000713202d3946525d6876828f9ca9ac9f92867b6e61584e433b322c292424292c3139424d57616e7b86929faca89b8e8174655b5044372b1f120500000006111c2630383f44464e53555d60656a6f747a7f848a8f93999ea1a9a29f9a938f8a847f7a746f6a64605c55534d46443f38352f28201c140a00000000000000000000000713202d3a4653606d798693a0aca99d908376665c5145382c1f130700091623303c4956636f7c8996a2afa4988b7e7165584b3e3225180b0000000000000000000000000000000000000814212e3b4754616e7a8792929292877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000000061018222a313a4145474c50525352504c4746413a36302a2528313a414547535353514f4b443b32281d110600000000000000000000000000000000000000000000000000000000000000010a131c252e384044505b656c7881868686868686868683796d675d544a42382d261c130a0100000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f83776a5d50444f5c6976828f8f8f8f8f877b6e6154483b2e211508000000000000000000000000000815222f3b4855626e7b8895939393939184776a605441382d22170b00000000000b17222d3847545f6a7784919393939394887b6e6155483b2e221508000005101a232c33383c3d464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464645413c352c23190e03000000000003101d2a3643505d697683909c9f9f9f9f9f9f9f9f9f9f9f9f9fa9abb0b8b8b0aaa89f9f9f9f9f9f9f9f9f9f9f9f9f9d9083776a5d5044372a1d11040000000000000b1724313e4a5764717d8a97ab9b8e8275665c5144382c1f12060000000013202c3946535f6c7986929facada093867a6d6053473a2d2e374044505b656d78818e949ea6a49c928c7f736d635b51493f362d241b120900000000000000000000000000000000000000010406070d0d0d0d0d0d0d0d0d0d0d13202c3946535f6c7986929facaca09386796d6053463a2d20130d0d0d0d0d0d0d0d0d0d0d07060400000000000000000814212d3a47535f696e7475767778797b7a6d6154473a2f24190d0100000714202d3a4753606d7a8693a0ada89c8f8275695c4f4236291c0f03000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000005121f2b3744505b657885929faba4978b7e7164584b474a4d4f515152535252504e4c4947433c39363029241e160d0700000000000000000000000005111d2935414c5664717e8b96a1ada3998d80746a60564d443e39352f2f35383c434b545e6973808d99a3aca096897d706353493f33271b0f03000000000a151e262e34383c42474b5153586062686d72787d82878d92979c9fa6a49f9c96918c86817c76716d67615e5753504945413a322e261c1207000000000000000000000713202d3a4653606d798693a0acac9f9286796d6053463a2e23180d060a1723303d4a5663707d8996a3b0a4978b7e7164584b3e3125180b0000000000000000000000000000000000000814212e3b4754616e7a8786868686877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000000000610181f282f35393a3f43454645433f3a3936302a251f191f282f35393a46464644433f39322920160b000000000000000000000000000000000000000000000000000000000000000000010a131c2627333f49535b666c757979797979797979776d675d554b42392f261c140a010000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8283838383828074675a4e414d5a6673808283838383827a6e6154473b2e211408000000000000000000000000000d1a2733404d5a66738086868686868686807366584e432f261b1106000000000006111c2b37434e5866737f86868686868686807366594d4033261a0d00000008111a21282c2f3039393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393835312a231a110700000000000003101d2a3643505d6976839093939393939393939393939393939c9fa6b0b0a69e9c93939393939393939393939393939083776a5d5044372a1d11040000000000000916232f3c4956626f7c8995ab9f9285796d6053463a2d2013090000000013202c3946535f6c7986929facada093867a6d6053473a2d2027333f49535c666d78828f949fa6a49c918c7f726d625b51483f362d241b12080000000000000000000000000000000001070d1113141a1a1a1a1a1a1a1a1a1a1a1a202c3946535f6c7986929facaca09386796d6053463a2d201a1a1a1a1a1a1a1a1a1a1a1a1313100c070000000000000815222e3b4855616e7b80828384858687807367554c4135291d120c070a0a15212e3b4854616e7b8794a1aea89c8f8275695c4f4236291c0f03000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000030f1b27333f495e6b7884919eaba5988b7f7265584c3f3d404344454646454543413f3c3b37322d2a251f19130c0400000000000000000000000000010d1924303a4653606d7984919ea7ab9f92877c6f685e564f47454141414045474e555c666e7b86929faba89e9184786c605346392d22170b0000000000030c151c23282c3137394045474e54565e61666c70757b80858a90949a9fa2a8a19e98928e89837e79736e6963605b53524c4440382e24190e020000000000000000000713202d3a4653606d798693a0acaea398897c6f62544b4034281f1612101824313e4b5764717e8a97a4b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000714202d3946525e687579797979797975685e5246392d201307000000000000000000000000000000000000000000000000000000000000000000000000000000060d161d24292c2d323639393836322e2d2a251e19140d161d24292c2d3939393736332e2820170e0400000000000000000000000000000000000000000000000000000000000000000000010a1417222d38414a545b60686c6c6c6c6c6c6c6c6a605d554c433930271d140a02000000000000000000000000000000000000000000000000000000000000000714202d3946525e686e767676767676746e64584c404b58636e737676767676766e685e5246392d201407000000000000000000000000000c1926323f4b57636e7379797979797979736e6358463d321d140a000000000000000f1b26323c4b57636d7379797979797979736e63574b3f3226190c000000000810161c2023242d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f1911080000000000000003101d2a3643505d69768286868686868686868686868686868690949fabaa9e948f86868686868686868686868686868683776a5d5044372a1d11040000000000000814212e3b4754616e7a8799a3a297897c706356493d31261a0e0200000013202c3946535f6c7986929facada093867a6d6053473a2d20222d38414a545c666d79828f949fa7a49c918c7f726d625b51483f362c241a12080000000000000000000000000000040c13181d2021272727272727272727272727272c3946535f6c7986929facaca09386796d6053463a2d27272727272727272727272727201f1c18120b03000000000915222f3c4855626f7b888e8f9192978f8276675d5145392f241d181616141b222f3c4955626f7c8895a2afa89b8e8275685b4f4235281c0f02000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000b17222d44505d6a7783909daaa6998c7f7366594c403333363738393939383735322f2e2b26201e19140d080b09050100000000000000000000000008131f2c3845515c67727f8b95a0aba39991847a6e68615954514c4e4e4b5153575f676d78839098a2aca0968b7f72665b5044382b1b1106000000000000030a11171c1f262b2f35393d43474c52545b6063696e73797e83888e92989da0a7a39f9b95908b85807b75706c65605d56524a40352a1f13070000000000000000000713202d3a4653606d798693a0acb4aa998d8073665c51453b3128201f1c1e26323f4c5965727f8c98a5b0a3968a7d7063574a3d3024170a00000000000000000000000000000000000005111e2a36414c565e616c6c6c6c6c6c615e564c4135291d110500000000000000000000000000000000000000000000000000000000000000000000000000000000040c13181d2021262a2c2c2b292521201d19130e09040c13181d20212d2d2d2b2a27221d160e050000000000000000000000000000000000000000000000000000000000000000000000000006111b262f38424a50535b60606060606060605d54514c433a31271e150b02000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e6169696969696967645c52473c47525c6366696969696969615e564c41362a1e1105000000000000000000000000000a17232f3b47525c63666c6c6c6c6c6c6c66635c5247342b200b02000000000000000a15202f3b46515b63666c6c6c6c6c6c6c66635c52473b2f23170a0000000000050b1014161720202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201f1d19140e070000000000000000030f1c2935424e5a66707679797979797979797979797979797982909ca9a89c8f827979797979797979797979797979797771665b4f4236291d10030000000000000613202d394653606c7986929fa99a8d807367574d42372b1e120600000013202c3946535f6c7986929facada093867a6d6053473a2d201b262f38424a545c676d798290959fa7a39b918b7f726d625a50483e362c241a1108000000000000000000000000040d161d24292c2d34343434343434343434343434343946535f6c7986929facaca09386796d6053463a34343434343434343434343434342d2c28231d150c030000000713202d3a4653606d7985929c9d9f9f92867a6d60554b40352f2923232324262d36424d5765717e8b98a4b1a69a8d8073675a4d4034271a0d01000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000061d293643505c6976838f9ca9a69a8d8073675a4d403427292a2b2c2c2c2b2a282522211f1b1919191919181715110c06000000000000000000000004101c2834404b55606d78839099a3aba09690837a706b64605d555b5b555d60636a6e79818e959faaa49a9184796d60544a3f33281c0a000000000000000000060c10151a1d24292c32383a41464a5053575e61666d71767c81868b91959b9fa3a79f9d97928d87827d78726d68635c52473b2f23170a0000000000000000000713202d3a4653606d798693a0acb8ab9e9285796d60574d433a322d2c282a2d36424d576774818e9aa7b3a995897c6f6256493c2f231609000000000000000000000000000000000000010d1925303b444c52545f5f5f5f5f5f54524c443a3025190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d111314191d1f201f1d191413110d0802000001070d1113142020201e1d1b17110b040000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262f383f44464e5353535353535353504745413a31281f150c03000000000000000000000000000000000000000000000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5a58524a4136404a52585a5c5c5c5c5c5c54524c443b3025190d010000000000000000000000000007131f2a35404a52575a606060606060605a58524a403522190f000000000000000004121e2a354049515759606060606060605957524a40352a1f1307000000000000000407090a131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131312100d0903000000000000000000010d1a26323e4a545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c76838f9ca9a89c8f82756c6c6c6c6c6c6c6c6c6c6c6c6c6c6a665f554a3e32261a0e0100000000000005121f2b3744505b657784919eaa9d918477695f53473a2d21140800000013202c3946535f6c7986929facada093867a6d6053473a2d20141d263039424b555d676d79839095a0a8a39f93887f726c625a50483e362c231a110800000000000000000000010c161f282f35393a40404040404040404040404040404046535f6c7986929facaca09386796d6053464040404040404040404040404040403a38342e271e150b00000006121f2c3844515c6676828f9caaaba2988b7e72675d51454039342f3030312f383f46525e6975818e9ba8b3a9988b7e7265584b3f3225180c00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000020f1c2935424f5c6875828f9ba8a79a8e8174675b4e413428252525252525252525252525252525252525252524211d17110900000000000000000000000c18232e3944515c666f7c87929fa4a8a09590847d76716d6769676869676d70757b838e939ea7a59f93887d70665c5142382d22170b000000000000000000000003090e12181d1f272b3036383f44464d53545c60646a6f747a7f84898e92999ea1a8a19e99938f89847f7a736e63574b3f3226190c0000000000000000000713202d3a4653606d798693a0acb9ada1978b7e71695e554c443e3a3834363a3d46535e697784909daaada297877a6e6154473b2e2114080000000000000000000000000000000000000008141e29323b4146475353535353534746413a32281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070c10121312100c070705010000000000000104060713131311100e0b060000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141d262d333839424646464646464646443a39352f281f160d03000000000000000000000000000000000000000000000000000000000000000000000008141e29323b4146475050505050504e4c4741382f3840474b4d5050505050504746413b32291e14080000000000000000000000000000020e19242e3840474b4d535353535353534d4b4740382e2410070000000000000000020d19232e3740464b4c535353535353534d4b4740372e24190e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16222d38434c545a5d606060606060606060606060606976838f9ca9a89c8f827569606060606060606060606060605d5b554d43392d22160a00000000000000030f1b27333f49536976838f9ca9a096887b6e6155483b2f24190d01000013202c3946535f6c7986929facada093867a6d6053473a2d2014141e273039434b555d676d7a839096a0a8a49a93887e716c615a50483e352c231a110800000000000000000007131d28313a4145474d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d535f6c7986929facaca09386796d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4645403930271d1207000004101c2834404a5465727e8b98a2aeaa9e9184796d605b514b45403e3d3d3d3f4149505b616e7b86929facada197887c6f6255493c2f22160900000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000020e1b2835414e5b6874818e9ba7a89b8f8275685c4f4235323232323232323232323232323232323232323232312e29221b12090000000000000000000007121d2834404a54606a727f8c929ca4a7a096918a827d7a7775747475767a7d818790959ea5a59e938d80736b60544b402f261c11060000000000000000000000000001070c10161b1e252a2d33383b42464b5153585f62676d72777c82868c91969c9fa4a49f9c96918b868073665a4d4033271a0d0000000000000000000713202d3a4653606d798693a0acb1a7a09d92857b6e675d56504846443f4246474f58616e7b8795a0acab9f928578685e5246392d20140700000000000000000000000000000000000000020d1720293036393b4646464646463a3935302820160c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c22282b2d353939393939393939372d2c29241e160d04000000000000000000000000000000000000000000000000000000000000000000000000020d1720293036393b43434343434341403c362f262e353b3f404343434343433b3936302920170d0200000000000000000000000000000007121c262e353b3f4046464646464646403f3b352e261c120000000000000000000007121c252e353b3e4046464646464646403f3b352e251c12070000000000000000000000000000000000000000000000000000000000000000000004090d0f101313131313130e0d0b0803000000000000000000000000000000000000000000000000000000030f1b26323c464e53555656565656565656565656565c6976828f9ca9a89c8f8275695c56565656565656565656565655544e463c32271b0f0300000000000000000b17222d414e5b6874818e9ba7a8988c7f7265554c4135291d1104000013202c3946535f6c7986929facada093867a6d6053473a2d20140c151e273039434c555d686e7a849196a1a9a49a93877e716c615a50473e352c231a110700000000000000010d18242f3a434b51545a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5f6c7986929facaca09386796d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a53514b42392e23180c0000000c18232e3a4754616d7a86929fa9aca1968d80746d605d55514b4a49494a4b4f535b606d74818e98a3aeab9e9285796d6053463a2d20130700000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000010d1a2734404d5a6773808d9aa6a99c8f8376695c50433f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3e3d3a342d241b1106000000000000000000000c18232e39424e58626d73808c929ea1a8a19e948f8a8683828181828386898e93999fa7a39f938f81786d60594f42392e1d140a0000000000000000000000000000000000040a0f13191c22282b3136394045464e53555d60656b70757b7f848a8f939a9fa2a8a09e989083776a5d5144372a1e110000000000000000000713202d3a4653606d798693a0acaca09590959082796d68615a5553504a4d525459606a74808d9aa7b1a99c8f827669564d41362a1e11050000000000000000000000000000000000000000050e171e252a2d2e3939393939392e2d29251e160e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f20282d2d2d2d2d2d2d2d2a21201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e3636363636363433302b241d242a2f32333636363636362e2d2a251e170e0500000000000000000000000000000000000a141c242a2f32333939393939393933322f2a241c140a00000000000000000000000a131c232a2f32333939393939393933322f2a241c130a000000000000000000000000000000000000000000000000000000000000000000020a1015191b1c2020202020201b1a17140e08010000000000000000000000000000000000000000000000000006131f2b37434e585f62636363636363636363636363636976828f9ca9a89c8f827569636363636363636363636363636260584e43372b1f13060000000000000000061a2633404d596673808c99a6a99c8f8276675d5145392c201306000013202c3946535f6c7986929facada093867a6d6053473a2d2014070c151e27313a434c565e686e7b849196a1a9a49992877e716c61594f473e352b23190f0400000000000004111d2935414b555d606767676767676767676767676767676767676c7986929facaca09386796d676767676767676767676767676767676767605c544b4034281c100400000713202d3946525e6874808d97a2ada89d928c7f746d67605c5557565657585960656c727f8b939daaafa4998d8074665c5044382b1f120600000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000d192633404c5966737f8c99a6aa9d9083776a5d504c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4b4a453f362d22170c0100000000000000000007121c27303d46515b646e73808a92979fa3a69f9c9992908f8e8e8f9092989b9fa4a69f99928c81786d665c50473d30271d0b020000000000000000000000000000000000000002080d11171c1f252a2e34383c43474c5154596063686e73797d82878d92979da0a79d9084776a5d5144372a1e110000000000000000000713202d3a4653606d798693a0acaa9d9084909490827a716c6562605c54565e61646b707c87929facb0a6998c7f7266594c3f3025190e02000000000000000000000000000000000000000000050d14191e20212c2c2c2c2c2c21201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e09060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131b20202020202020201d1413110d080100000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212929292929292726241f1a13191f23262729292929292921201e19140d05000000000000000000000000000000000000020a12191f2326272d2d2d2d2d2d2d2726231f19120a020000000000000000000000010a12191e2325262d2d2d2d2d2d2d2626231f19120a010000000000000000000000000000000000000000000000000000000000000000040c141b212528292d2d2d2d2d2d2726241f1a130b020000000000000000000000000000000000000000000000000815212e3b47535f6a6f707070707070707070707070707075828f9ca8a89c8f827570707070707070707070707070706f6a6054473b2e22150800000000000000000b1825323e4b5865717e8b98a4ac9f92867a6d6054473a2d22170b000013202c3946535f6c7986929facada093867a6d6053473a2d201407030c151f28313a444c565e696e7b849197a1a9a39992877e706c61594f473d352b21160b0000000000000613202c3945515d676d737373737373737373737373737373737373737986929facaca0938678737373737373737373737373737373737373736d665c5145382c1f1306000005111d2935414c56616d7a85929fa5aea49b918c8079716d67656463636465686b70787f87929fa5afa89f93877b6e61544a3f34281c100300000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000c1925323f4c5865727f8b98a5aa9e9184776b5e5858585858585858585858585858585858585858585858585650483f34291d1105000000000000000000000b151e2b343f49525c646e737e858e92999ea1a8a39f9d9c9a9b9c9d9fa3a9a29f9b948f877f776d665c544a3f352c1e150b0000000000000000000000000000000000000000000000060b0f141a1d23282c32373a4145474f54565e61666d70767b80858b90959b9d9084776a5d5144372a1e110000000000000000000713202d3a4653606d798693a0aca396897d85929490847d76726e6d666b6b696e71757d859299a3afab9f94887b6e6155483b2e221508000000000000000000000000000000000000000000000002080d1114142020202020201413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060f131313131313131311070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1114141d1d1d1d1d1d1b1a17140e080e1317191a1d1d1d1d1d1d1414110d0802000000000000000000000000000000000000000000070e1317191a202020202020201a1917130e08000000000000000000000000000000070d12161919202020202020201a1917130e07000000000000000000000000000000000000000000000000000000000000000000020c161e262c3135363939393939393433302b241d140b0100000000000000000000000000000000000000000000000916222f3c4955626f7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d82909ca9a99d90837d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c6f6255493c2f22160900000000000000000a1723303d4a5663707d8996a3aea3998a7d7164544a3f33281c0f030013202c3946535f6c7986929facaca093867a6d6053473a2d20140700030d161f28323b444d575f696e7c859297a2aaa39992877e706b61594f473d32271b100400000000000714212d3a4754606d79808080808080808080808080808080808080808087929facb3a69a8d8080808080808080808080808080808080808080796d6053463a2d2013070000010d1925303a46525e68717e8b939da5ada39b928d847e797572717070707274777d828c9299a3afaaa1968e8174695f5342382e23170b0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000b1825313e4b5864717e8b97a4ab9f9285786565656565656565656565656565656565656565656565656565625a50453a2e21150900000000000000000000030c19222d37404a525c636c717a81868d9196989b9c9e9f9f9f9f9e9d9b9997928e89827c736c655c544b42382e231a0c030000000000000000000000000000000000000000000000000003090e12181c1f262b2f35393d44484d52545c6064696e74797e83898e929084776a5d5144372a1e110000000000000000000714202d3a4753606d7a8693a0ada194887b7e8b9296918a837f7b79787778797a7d82889297a1abafa4998f8276695f53473a2d211408000000000000000000000000000000000000000000000000000105070813131313131307070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507081010101010100e0d0b08030002070a0c0d1010101010100807050100000000000000000000000000000000000000000000000002070a0c0d131313131313130d0c0a0702000000000000000000000000000000000002060a0c0d131313131313130d0c0a0702000000000000000000000000000000000000000000000000000000000000000000000a141e2830383d414346464646464641403c362f261d13080000000000000000000000000000000000000000000003101d2a3643505d69768289898989898989898989898989898990949fabab9f959089898989898989898989898989898983776a5d5044372a1d1104000000000000000815222f3b4855626e7b8895a99f9f9b8e8174665b5044382b1f12060013202c3946535f6c7986929f9f9f9f93867a6d6053473a2d2014070000040d162029323b454d575f6a6f7c859298a29fa39992877d706b60594f44382c20130700000000000814212e3b4754616e7a878d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d9299a3afb5a89d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d867a6d6053473a2d20140700000008131e2a36414c56626c74818e939da4aea49d96918b85827f7d7c7c7d7e8184898f949fa3abaaa29891847a6d60574d4230261c11060000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000a1724313d4a5764707d8a97a3ac9f93867872727272727272727272727272727272727272727272727272716c62564a3d3124170b000000000000000000000007101b252e38404a525a61686d747b8084888b8e90919292929291908e8c8985817c766f6a605b534b423930261c11080000000000000000000000000000000000000000000000000000000000070c10151b1e24292c32383b41464a5053575f62676d71777c81868c83776a5d5144372a1e110000000000000000000714212d3a4754606d7a8793a0ada194877b74818e949e95908c888685848585878a8f939aa1a9afa59f93877c6f62574d42372b1e1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100f0d0b08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101b26303a42494e4f5353535353534e4c4741382f241a0e0300000000000000000000000000000000000000000003101d2a3643505d6976839096969696969696969696969696969c9fa6b0b1a79f9d96969696969696969696969696969083776a5d5044372a1d1104000000000000000714202d3a4753606d7a8697939393939285796c605346392d2013060013202c3946535f6c7986929393939393867a6d6053473a2d201407000000040e172029333b454e585f6a6f7c8692989393939992867d706b6054483b2f22160900000000000814212e3b4754616e7a87949a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9fa3abb5b9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a93867a6d6053473a2d201407000000020d1925303a44505a606d78818d929fa2aaa8a09e97928f8c8a89898a8b8e91969c9fa6ada7a09892867c6f685d52453c311e140a000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b00000000091623303c4956636f7c8996a2afa4998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7e7165584b3e3225180b00000000000000000000000009131c262e38404850565e61696e73787c7e818384858686858583817f7c79746f6a625f585049413930271e150a0000000000000000000000000000000000000000000000000000000000000000040a0f13191d20272c3036383f44464d53555d60656a6f747a7f8175685b4f4235281c0f0000000000000000000714212e3a4754616d7a8794a0b4ab94877a6d78828f939f9d989a939291919298979b9fa4acaba39f938d80736a6054453c31261a0e020000000000000004080c0e0f0c07070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d050000000000000000000000000000000000000000000000000000000000000000000000000004070c10121316191b1d1e1f1f201f1f1e1d1b19171414110e0806030000000000000000000000000000000000000000000000000004090e1112131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a08040000000000000000000000000004080a0b1313131313131313131313131313131311100e0b06000000000000000000000005090d0f101313100f0d090500000000000000000000000000000000000000000000000000000000000000000000000000000915212c38424c545a5c6060606060605a58524a41362b1f140800000000000000000000000000000000000000000003101d2a3643505d697683909c9f9f9f9f9f9f9f9f9f9fa3a3a3a9abb0b9b9b1aba9a3a3a39f9f9f9f9f9f9f9f9f9f9d9083776a5d5044372a1d11040000000000000006131f2c3945515d677885868686868686867c6f6256493c2f2316090013202c3946535f6c798786868686868686796d6053473a2d20140700000000050e172129333c464e58606a707d8686868686868686867c706356493d3023160a00000000000814212e3b4754616e7a8794a1a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6acafb5acacacaea8a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a093867a6d6053473a2d2014070000000008131e29323f44505c666d78808b92989fa3aba9a29e9b9897969697989b9ea0a8aca9a19e9590867d6f6a60564c41332a1f0c02000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000915222f3c4855626f7b8895a2b5ab9b918c8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b85786b5f5245382c1f12050000000000000000000000010a141c262e363e444c52575e61666a6f7274767878797978787675726f6d66626058534e443f382f271e150c030000000000000000000000000000000000000000000000000000000000000000000001080d11161b1f252a2e34383c42474b5153586062686d72756f65594d4134281b0e0000000000000000000814212e3b4754616e7a87949f9fa39986796d6d79818c92989fa29f9e9e9e9fa2aaa8a9aaa29f99928b81786d60584e43332a1f150900000000000002090f14181b1b191413110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e0802000000000000000000000000000000000000000000000000000000000000000001070c1013181c1f20232527292b2b2c2d2c2c2b2a28262421201e1915120f0a0300000000000000000000000000000000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c05000000000000000000050c11141717202020202020202020202020202020201e1d1b17120b0400000000000000020a1015191c1c20201c1c1915100a020000000000000000000000000000000000000000000000000000000000000000000000000d1925313d49545e65696c6c6c6c6c6c67645c52473c3024170b00000000000000000000000000000000000000000003101d2a3643505d6976839093939393939393939393939b9ea5afb7b7b6b7b9b8afa59d9b93939393939393939393939083776a5d5044372a1d11040000000000000004101d2935404b55687378797979797979796f6a6054483b2e22150900121f2c3845525e6a75797979797979797976675c5145382c1f13060000000000050f18212a333c464e58606b70797979797979797979706b6054483b2f22160900000000000814212e3b4754616e7a87949f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f93867a6d6053473a2d20140700000000020d172028343f4a545c666d747e858e92999ea1a8a7a8a5a4a3a3a3a5a7a8aca49f9d97928c837b6f6b60584e443a3021180e00000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b000000000815212e3b4854616e7b8794abb5ada39b989898989898989898989898989898989898989898989898989285786b5f5245382c1f1205000000000000000000000000020a131c242c323a41464d5254585f626568696b6c6c6c6c6b6a686663605c54544e47433c332d261d150c030000000000000000000000000000000000000000000000000000000000000000000000000001040b1014191c23282c3137394045474e54565e616568655d53483d3125190c0000000000000000000815222e3b4855616e7b889393939392867966676d787f868d92989a9c9e9e9f9f9e9d9c9998928d877f746d665c50463d3221180e030000000000030b131a202527282621201d19130f0a040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d05000000000000000000000000000000000000000000000000000000000003090e12181d1f23282c2d3032343638383939393838373533312e2d2a25211f1b150f0b060000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c171008000000000000000810171c2123242d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b2a27231d160e050000000000040c141b212528292d2d292825211b140c0400000000000000000000000000000000000000000000000000000000000000000000020f1b2835414e5a657076797979797979746e64584c4033261a0d00000000000000000000000000000000000000000003101d2a3643505d6976828686868686868686868686868e939ea9b0aba9abacb2a99d938e86868686868686868686868683776a5d5044372a1d110400000000000000000c18242f39435761686b6c6c6c6c6c6c6c6260584e43382c1f130700111d2a36424e59636a6c6c6c6c6c6c6c6c6c5c554b4034291c1004000000000000060f18212a343d464f5960636c6c6c6c6c6c6c6c6c6360594f44382c20130700000000000814212e3b4754616e7a8793939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393867a6d6053473a2d2014070000000000050e17232e38424a545c606c717a81868d9196989a9c9e9f9f9f9f9e9d9c999a93908b857f786e6960594f463c32281e0f0600000000000b1825313e4b5864717e8b97a4aca89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7aca4978b7e7164584b3e3125180b000000000714212d3a4754606d7a8799a3afacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a59e9285786b5f5245382c1f120500000000000000000000000000010a121a202830363b4246484e5355585b5d5e5f5f5f5f5e5d5b595653514a47433d373127221b140b03000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e11171c1f262b2f35393d43474c5254595b59534b42372c2015090000000000000000000916232f3c4956626f7c86868686868685786b5c666c727b80858a8d8f9192929291908f8c8a86807b726d605c544a3f342b200f060000000000020b151d252c313435332e2d2a251e1b16110d0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e06000000000000000000000000000000000000000000000000000001070c141a1d24292c2e34383a3c3f4143444546464645444342403e3b3936302e2b261f1c17110a020000000000000000000000000000000008121b242b3136383939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a1208000000000008121a22282d3031393939393939393939393939393939393736332e2820170e04000000020c161e262c32353639393635322c261e160c0200000000000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828686868686868074675a4e4134271b0e010000000000000000000000000000000000000000030f1c2935424e5a667076797979797979797979797979818e9ba7a69f9c9ea1a8a79b8e817979797979797979797979797771665b4f4236291d1003000000000000000007121d2731454f575d5f6060606060606056544e463d32271b0f03000e1a26313d4751595e5f606060606060605f514b43392f23180c0000000000000000060f18222b343d474f54565f606060606060605f56544f473d32271b100400000000000814212e3b4754616e7a868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796d6053473a2d20140700000000000006111c263038424a505a61686e747b8084888b8e90919292929291908f8d8a87837e79726d665f574f473d342b20160c0000000000000b1825313e4b5864717e8b979f9f9f9b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9a9f9f9f978b7e7164584b3e3125180b000000000613202c3945515d677986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9e9285786b5f5245382c1f1205000000000000000000000000000000080e161e252a30363a3c4347484b4e50515253535252504e4c494644403937322b262017110a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c10151a1d24292c32373a4146474c4f4d48423930251b0f040000000000000000000815222e3b4754606a6f797979797979787368545b60696e74797d808284858685858482807d7a746e69625b504a42382e22190f00000000000009131d272f373d40423f3a3936302c27201d18130f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f07000000000000000000000000000000000000000000000000030b12181f252a2f35393a404446494c4e5051525253525251504e4c4a4746413c3a37312b28221c140b070000000000000000000000000000040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a100500000005101a242c33393c3e4646464646464646464646464646464644433f39322920160b0000000a141e2830383d4143464643413d3830281e140a000000000000000000000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e939393938d8073675a4d4034271a0d010000000000000000000000000000000000000000010d1a26323e4a545e66696c6c6c6c6c6c6c6c6c66707d89939eab9f94909196a1ac9f93887c6f666c6c6c6c6c6c6c6c6c6a665f554a3e32261a0e010000000000000000010b151f333d454c5052535353535353534948433d342b21160a00000915202b353f474e5253535353535353535345403931271d1207000000000000000000061019222b353d4448495253535353535353524948443d352b21160b0000000000000714202d3946525e687679797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797976675d5145392c201306000000000000000a141e2630383f4450565e61696e73787b7e81838485868685858482807d7a76726d67605c544d453d352b22190e040000000000000b1825313e4b5864717e8b93939393938e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d93939393938b7e7164584b3e3125180b0000000004111d2935414b556b7885929393939393939393939393939393939393939393939393939393939393939285786b5f5245382c1f120500000000000000000000000000000000050c13191f252a2d32373b3c3f414345454646454543423f3c3a38342e2b27201b150b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12181d1f272b3035393a3f42413d3730271e14090000000000000000000006131f2b37434e5860626c6c6c6c6c6c6b68615750575e61676d7073767778797978777673706d67615e5751443f3830261c10070000000000040f1a252f3941484d4e4c4746413a38322c29241d1a15100c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000000000000000000000000060d151d24293136394045474a515356585a5c5e5e5f605f5f5e5d5b595754524c4847433c38332d261d18120b030000000000000000000000000915202b353f474e52535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c0000000c17222c363e45494a53535353535353535353535353535353514f4b443b32281d12060005101b26303a42494e4f53534f4e49423a30261b10050000000000000000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9b9f9f998c807366594d4033261a0d000000000000000000000000000000000000000000000a16222d38434c545a5d6060606060606057606d7883919da5a499908384919ea6a49a9083786d6057606060606060605d5b554d43392d22160a00000000000000000000030d212b333b404445464646464646463c3b38322b22190f040000040f19242d353d424546464646464646464638342f271f150b0100000000000000000000071019232b32383b3d4646464646464646463d3b38322b23190f0400000000000005111e2a36414c565e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5d554b4035291d110400000000000000020c141e262e343e444c52575e61666a6f727476777879797978777573716d6865605d55504a423c332b23191007000000000000000b1825313e4b5864717e868686868686868175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a677480868686868686867e7164584b3e3125180b00000000010d18242f44515e6b7784868686868686868686868686868686868686868686868686868686868686868685786b5f5245382c1f1205000000000000000000000000000000000002080d141a1e20262b2e2f323536383939393938373533302d2c28231c1b150f0a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c10161b1e25292d2e323534312c251e150c0200000000000000000000030f1b27323d464e545660606060606060595751444d53555c606367696b6b6c6c6b6a696663605d55534d453f342e261e140a0000000000000814202c37414b53595b5954524c48433d39352f2b261f1c18120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b2219100700000000000000000000000000000000000000000910181f272f353b42464b5153545c60636567696b6b6c6c6c6b6b6a686664615e5655534e46443f382f28231d150c0500000000000000000000000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c11040004111c28333e48505557606060606060606060606060606060605e5b564d44392e23170b000915212c38424c545a5c60605c5a544c42382c2115090000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7a5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000005111c27313a434a4e50535353535353535e69727f8c95a0a99f93877c7e8a949faba0958c7f72695e53535353535353504f4a433b31271c110500000000000000000000000f1921292f343738393939393939392f2e2c27211910070000000008121b242b3136383939393939393939392c29231d150d0300000000000000000000000007111921272c2f30393939393939393939302f2c272119110700000000000000020e1925303b444c525f6060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f514b433a2f24180d010000000000000000020c141c2328323b41464d5354585f626567696b6c6c6c6c6b6a696664615e5653514b443f38302a2119110700000000000000000a1724303d4956626c7179797979797979756f65594d4034271b0e01000000000000000000000000010d1a2733404c58646e7479797979797979716c6256493d3024170a0000000000071d2a37434f5c67727779797979797979797979797979797979797979797979797979797979797979797873685d5044372b1e11050000000000000000000000000000000000000003090e12151b1f212225282a2b2c2c2c2c2b2a282623201f1c18120f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13191d202126282825201b140c030000000000000000000000000a16202b343d434749535761686b6c6c66635b5146464b515357565e61666a6c6c6a66605d56514c46423b3328231c140c020000000000000c1825313d48535d656866615e56544f4745403a37312c28231c1a140f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000000000000000000000009121b222a313940454d53555d6065666d6f72747677787979797877767573716e6867625f5853504a423d342e271e170e0500000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d211408000814212d3945505a61646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a675f564b3f33271b0e000d1925323d49545e66696c6c69665e54493d3225190d0000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6a5988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000a151f2831383e42434646464643505a616e7b86929fa7a2978d817476828f99a3a79f92867b6e61594f434646464644423e3931291f150b000000000000000000000000070f171e24282b2c2d2d2d2d2d2d2d23221f1b160f0700000000000009121920262a2c2c2d2d2d2d2d2d2d2d1f1c18120b030000000000000000000000000000070f161b2022232c2d2d2d2d2d2d2d2c2322201b160f0700000000000000000008141e29323b4146535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535345403a31281d130700000000000000000000020a1117202930363b4246484e5355585b5d5e5f5f5f5f5e5d5c5a5754524c47454039342e261e180f070000000000000000000815212d3945505a62646c6c6c6c6c6c6c68655d53483d3124180c00000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c64625a5045392d21150800000000020f1b27333f4b5660676b6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6861574c4034281c0f0300000000000000000000000000000000000000000002050a0f121515181b1d1e1f20201f1f1d1b19161312100c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d111314191c1b19150f090200000000000000000000000000040f19222b32373b3c505c6873787979736d63574b434750555d60686d7276787977736d685f584e443b31292117110a02000000000000000e1b2734404d59656f75726d6863605953514b47433c38342e2a251f1b17110d08020000000000000000000000000000000000000000000000000000000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c030000000000000000000000000000000009121b242c343c434b51575e61676d7175797c7f81838485858685858483817f7d7a77736f6a64605b544f454039302920170f05000000000000000000121f2c3845525e6a7579797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a000a1723303c4955616c71797979797979797979797979797979797771675b4f43362a1d10000f1c2835414e5a66707679797670665a4e4135281c0f0200000000000000000000000000000000000000000000000000000006050403020d1a2633404d596673808c99a6a4978b7e7164584b3e3125180b0203040506000000000000000000000000000000000000030d161f272d323536393935404b55616c75828f98a2a79f92857a6d6e7c87929fa9a2988f82756c61554b403539393736322d271f170d0300000000000000000000000000060d13181c1e1f202020202020201615130f0a040000000000000000080f151a1d1f20202020202020202013100c070100000000000000000000000000000000040b101316161f202020202020201f161613100b0400000000000000000000020d1720293036393b4646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464639352f281f160c01000000000000000000000000060e171e252a31363a3c4347484b4e50515253535252514f4d4a4746413a39352f28231c150c060000000000000000000005111d29343e48505658606060606060605b59534b41372c20140800000000000000000000000000000814202b36414a53585a60606060606060585650483e34291d110500000000000b17232e3a444e565c5e60606060606060606060606060606060606060606060606060606060606060605f5d574f453b2f24180c00000000000000000000000000000000000000000000000000030608090c0e10121213131212100f0c09070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070c0f0e0c09040000000000000000000000000000000007101920272b3845525f6b788586867f7366574d4e535a61676d727a7f83858584807a6f6a5f564d42362a1f14080000000000000000000f1b2835424e5b6875817f7a756f6b65605d55534e4644403936302b27221b19130f0a040000000000000000000000000000000000000000000000000000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b00000000000000000000000000000008121b242d363e464e555d60696e74797e8285898b8d8f91919293929291908e8c8a8784807c76716c666059514b433b332921170e05000000000000000013202c3946535f6c79878686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b000b1724313e4a5764717d8686868686868686868686868686868684776a5e5144372b1e1100101c2936434f5c69768286868276695c4f4336291c10030000000000000000000000000000000000000000000000030608091211100f0e0d1926333f4c5966727f8c99a5a4978a7d7164574a3e3124170d0e1011121307060401000000000000000000000000000000040d151c2226292a2d2c3945515d67707d8a949eaaa0958b7f72686a73808d97a1aa9e938a7d70675d51453c31262a2926221c150d0500000000000000000000000000000002070c0f11121313131313131309090703000000000000000000000004090e111213131313131313131306040000000000000000000000000000000000000000000307090a1313131313131313130a09070400000000000000000000000000050e171e252a2d2e393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939392c29241d160d040000000000000000000000000000050d14191f252a2d31373a3c3f41434445464646454442403e3a3936302c29241d17110a030000000000000000000000000c17222d363e45494b535353535353534e4d4841392f251a0f040000000000000000000000000000030f1a252f3841484c4e535353535353534b49453e362d22170c00000000000006121d28323c444b4f51535353535353535353535353535353535353535353535353535353535353535352504c453d33291e1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b2a3743505d6a7683908f8276695e54585f626c71797f858c909292908c857c6f695e52463b3025190e020000000000000000101d2a3743505d6a76838c86817c77726d67625f5853514a46423b37332d29241e1b15100c0701000000000000000000000000000000000000000000000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d12070000000000000000000000000006101a242d363f4850585f676d737b80858b8f9298989a9c9e9e9f9f9f9e9e9d9b999795908d88837e786f6b605c554d453b332920170c030000000000000013202c3946535f6c798692939393939393939393939393939393939393939393939393939393939393939393939393939393939393938a7e7164574a3e3124170b000b1724313e4a5764717d8a93939393939393939393939393939184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000000000040a0f1315161f1e1d1c1b1a1925323f4c5865727f8b98a5a3968a7d7063574a3d3024191a1b1c1d1e1f1413110d08010000000000000000000000000000030a11161a16202b37434e58606d7984919ea6a59d9083786d60606d7a85919ea6a59e9184796d60584e43372b20161a16110b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d201d18130c040000000000000000000000000000000002080d141a1e21262b2e2f323436383939393938373633312e2d2a25201d18120c06000000000000000000000000000006111b242d34393d3e4646464646464642403d372f271d13090000000000000000000000000000000008131d262f363c4041464646464646463e3d39342d241b1106000000000000010c16202a323a3f434446464646464646464646464646464646464646464646464646464646464646464544403b332b21170d0200000000000000000000000000000000000000000000000000000000000000000000020608080c0f111213131312100e0c08070502000000020404060606060606000000000000000000000000000000000001040707131313131313130d0c0a07020000000000000000000000000002060808131313131313131310060603000000000000000000000000040a1b2835424e5b6875818e92877b6e6663646a6f767e848c92989d9f9f9d9791857b6e61564d41362a1e11050000000000000000101d2a3743505d6a768390928e89837e7a746f6a64605c54524d46443f3835302b271f1d18120e09030000000000000000000000000000000000000000000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c030000000000000000000000030c18222c363f48505a616a6f7980868d92979c9fa2aaa7a9a8a7a6a6a6a7a8a9a8a6a7a09d9a94908a837c746d675e574d453b32291e150a0000000000000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b000b1724313e4a5764717d8a979f9f9f9f9f9f9f9f9f9f9f9f9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000070f161b1f22232c2b2a2928272625323e4b5865717e8b98a4a396897c706356493d3025262728292a2b2c21201d19130c040000000000000000000000000000000508131e28323a47535f6a73808d96a1aa9e93897d70665c5d67717e8b949faba1968d80736a5f53473e32281e13080500000000000000000000000000000000000407090a13131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130a0907040000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e1114142020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202013110d07010000000000000000000000000000000000000003090e12151a1f212225282a2b2c2c2c2c2b2a29272421201e1913100d07010000000000000000000000000000000009121b22292d3031393939393939393534312c251d150b0100000000000000000000000000000000010b141d252b3033343939393939393931302d29221b12090000000000000000040e1820282e33373839393939393939393939393939393939393939393939393939393939393939393837342f2921190f0600000000000000000000000000000000000000000000000000000000000000000003090e121415191b1d1f1f201f1f1d1b191514120e09030b0e10111313131313130b0b0905010000000000000000000001080d111314202020202020201a1916130d0700000000000000000000030a0f1214151f202020202020201c13120f0b0600000000000000000000000c1926333f4c5966727f8c998f8279727071757c838a91969fa2aaa3a3a9a1978e8174685e5246392d2014060000000000000000101d2a3743505d6a7683909d9b95908b85807b76716d66615e5753504945413a37322c29241d1a15100b060000000000000000000000000000000000000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b40342820150900000000000000000000000b151e2a343e48505a626c717c848c92989fa2a9aca8a8a09e9c9a9a999a9a9b9d9fa3ababaaa69f9c95908781796e695e574d443b30261c110600000000000013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a4978a7d7164574a3e3124170b000b1724313e4a5764717d8a97989898989898989b9ea6b0aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000007101920272b2e2f3938373635343331313e4a5764717d8a97a4a295897c6f6256493c3132333435363738392d2c29241e160d040000000000000000000000000000020c1924303a44505a626e7c87929fa8a2988e81756b605455606c78839099a4a89f92877c6f625a50443a3024190c03000000000000000000000000000000040b101316162020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171614100b05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070813131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313060401000000000000000000000000000000000000000000000002050a0f121515181b1d1e1f20201f1f1e1c1a171413110d080401000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d282724201a130b03000000000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2524211d17110900000000000000000000060e161d23272a2b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b28241e170f070000000000000000000000000000000000000000000000000000000000000000060b0f151a1e212225282a2c2c2d2c2b2a282522211e1a1410171b1d1e202020202020181715110c060000000000000000040c13191d202d2d2d2d2d2d2d2d2625231e19120a0100000000000000060e151a1f21222c2d2d2d2d2d2d2d29201f1c17110a020000000000000000000a1623303d495663707c8998948f837e7d7e828790949ea1a19e9996979a9f9f92877b6e6154473b2d22170b0000000000000000101d2a3743505d6a7683909da7a09d98928d88837e79736e6963605b53524c47433c38352f2b261f1c17110e0802000000000000000000000000000000000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000000000007121d27303c46505a626c717e8691969fa2aaaba39f9b9796918f8e8d8d8d8d8f9092999a9ea1a9aba79f9a938d837b6e695e564c42382e23170c04000000000013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a978a7d7164574a3e3124170b000b1724313e4a5764717d8a8b8b8b8b8b8b8b8b8f939eaaaa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000040f19222b32373b3c4544434241403f3e3d3d4a5763707d8a96a3a295887b6f6255483c3d3e3f4041434445463a39352f281f160c01000000000000000000000000000a141e2935414c56616c76828f99a3a89f92867b6e61594f505b656f7c87939fa9a3999082766c62564c4135291e150a0000000000000000000000000000070f161b2022232d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2323201c16100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090c0e10111213131312110f0d0b070705010000000000000000000000000000000000000000000000060c11151718202020202020201b1b18140f0901000000000000000000000000000000000000000001080f14181a1b20202020202020181715110c06000000000000000000000000040c12171b1d1e20202020202020202020202020202020202020202020202020202020202020201f1e1c18130d0600000000000000000000000000000000000000000000000000000000000000020a11171b1f262b2e2f32353738393939383735322e2d2b261f1c23272a2b2d2d2d2d2d2d2524211d181109000000000000040d161e24292c393939393939393933322f2a241c130a000000000000060f1820262b2e2f3939393939393939362d2b28221c140b0200000000000000000713202d3a4653606d7985929f95908b898b8f93999fa39f97918c8a8a8e9299998c7f7265544a3f33281c0f0300000000000000101d2a3743505d6a768390979d9fa7a29f9a94908a85807b75706c65605d56544e4745403937312b28231c1914100b040100000000000000000000000000000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b0000000000000000000c18232e39424e58616c717f8a9298a0a8aba49f99928e8a8784828180808081828486898d92979ea1a8aca49f9590847b6e685e544a3f342820150a000000000013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7e7164574a3e3124170b000815222e3b4855616e7b7f7f7f7f7f7f7f7f7f818f9ba8aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000a16202b343d4347495251504f4e4d4c4b4a49495663707c8996a3a194887b6e615548494a4b4c4d4e4f5051524745413a31281e130800000000000000000000000006111c26303845525d68717e8b949faba1968c8073695e534749535f6a74818d97a2ab9f948b7e71685d52463d30261c110600000000000000000000000007111921272c2f303939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939302f2c27211a11080000000000000002080d101213131313131313130707040100000000000000000000000000000000000000000000000000030613131313131313131313120f0a05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b131313131313130f0e0c080400000000000000000000000000000000000000000000000003080b0d0e131313131313130b0a080500000000000000000000000000000001060b0f1111131313131313131313131313131313131313131313131313131313131313131312110f0c070200000000000000000000000000000000000000000000000000000000000000060b141b22272b31373a3b3f4244454646464543413f3b3a37312c282e33363739393939393932312e29221b120900000000010c1620282f35394646464646464646403f3b352e251c120700000000040d18222a31373a3b4646464646464646433938332d261d140a000000000000000006131f2c3845515c6774818d98a09d9896979b9fa49f99928d85807d7d818792998f8276665b5044382b1f1206000000000000000c1926323f4c5965727f858b90959b9fa3a69f9c97918c87827d78726d6862605853514b47423c38342e2a251e1b16110d0801000000000000000000000000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c10040000000000000004101c2834404b545f6a717e87939fa2aaa9a199938e86827e7a777574737373747577797c80858b91969da5afa79f9691847a6e665c50443c32261b0f040000000013202c3946535f6c7986929facb3a79a8d80808080808080808080808080808080808080808080808080808080808080808080808080807c6f6255483c2f221509000714212d3a46535f696e7272727272727272727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000030f1b27323d464e54565f5e5d5c5b5a595857565556626f7c8995a2a194877a6e615455565758595a5b5c5d5e5f54524c433a2f24190d0100000000000000000000000b17232e38424e58606d7a85929ea6a69e9184796d60574d42414e58616d7a85929ea7a69e92857a6d61584e42382e23170c0200000000000000000000040f19232b32383b3d46464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463d3c38332c231a10050000000000060d14191c1f1f202020202020201413110d0801000000000000000000000000000000000000000000060c1012202020202020202020201e1b161009010000000000000002080d101213131313131313090806030000000000000000000000000000000000000000000000010407071213131313131313131313120f0a050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f181d262d33373c4247484c4e505252535252504e4c4846423c3834393f43444646464646463e3d3a342d241b110600000008131e28323a414553535353535353534d4b4740372e24190d020000010c161f2a343c43474852535353535353534f46443f382f261c11060000000000000004101c2834404b55616e7b86929fa4a5a3a4a7a09d948f868079737070747d87939285796c605346392d201306000000000000000b1825313e4a57626d72797e83898e92999ea1a8a19e99928f89847f7a746f6a65605d55534d46443f3836302c27201d19130f0a0400000000000000000000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a0000000000000006131f2c3845515c666f7c869299a4aea8a0979187817b75716d6869676766676768676d7073797e848e939fa4aca8a0969083786d60584e43372b20150a0000000013202c3946535f6c7986929facada0938679737373737373737373737373737373737373737373737373737373737373737373737373736f6a5f53473a2e2115080005121e2a36424d575f616565656565656566727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000006131f2b37434e5860626c6b6a696867666463626160626f7b8895a2aa93867a6d606162636465666768696a6b6c605d564c4135291d11040000000000000000000003101c28343f4a54606a74818d97a1ab9f948a7e71675d51453b3c46525e68727e8b95a0aca1978e81746a60544a3f34281f1409000000000000000000000b16212b353d44484953535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a48443d352c21160b000000000810181f25292b2c2d2d2d2d2d2d2d2d201d19130c04000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000060d14191c1f1f2020202020201515120f0a030000000000000000000000000000000000000001080d1113141f202020202020202020201e1b161009010000000000000004090e1112131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a0804000000000000000000000001060b0f111113131313131207060300000000000000000000000000000000000000000000000000000000000000000000060606060606060503000000020608080c0f111213131312100e0b08070502000000000000000000000000000000000000000000000000000008111a212a2f383f44464d5355585b5d5f5f605f5e5d5b5855534d46443f444b4f515353535353534b4a453f362d22180c0100010d19242f3a444c525f606060606060605957524940352a1e1307000007131d28313c464e53555f606060606060605c53504a42382d22170b00000000000000000c18232e3946525e69727f8b929b9e9f9e9b959089827b736d6763646b74818e98887b6e6255483b2f221508000000000000000916222e3a46515b62676d71777c81868c91969c9fa6a39f9b96918c86817c77716d67615f5753504a46413b38322c29241e1b15100c0700000000000000000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f00000000000004111d2935414b55606d79839098a3aba9a09691857d746e6964615d565b5a5a5a5a555c6063666d7179818b939aa4afa89f958c80736a5f54473d32271b0f0100000013202c3946535f6c7986929facada093867a6d676767676767676767676767676767676767676767676767676767676767676767676767625f584e43372b1f120600020e1a26313b454d53555858585858585966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000815222e3b4754606a6f7877767574737271706f6e6d686e7b8894a1a39886796c6c6d6e6f7071727374767778796d685d5245392c201306000000000000000000030c19232b3844505c666f7c87939fa9a3998f82766c61554b403335414c56606c7883909aa4a99f93887c6f665c50443b30251a0d03000000000000000004101b27323d474f5456606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606056554f473d33271c1004000006101a222a3035383939393939393939392c29241e160d0400000000000000000000000000000000030c151c23282c3939393939393939393937332c251c1309000000000810181f25292b2c2d2d2d2d2d2d22211f1b150e060000000000000000000000000000000000040c13191d20212b2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c050000000000000000040c12171b1d1e20202020201f1312100c060000000000000000000000000000000000000000000000000000000105090b0b13131313131312120f0c04090e121415191b1d1f1f201f1f1d1b181414110e0802000000000000000000000000000000000000000000000008111a232c333c41495053575f6265686a6b6c6c6c6b6a6865615f5753504a4e565b5e606060606060585650483f34291d11050004111d2935414c565d6c6c6c6c6c6c6c6c66635b52473b2f23160a00071018242f3a434e585f626c6c6c6c6c6c6c6c69605b544a3f33281c0f030000000000000007121d2a36424d56626d7380898f9292918f8a837d766e69605d5559626f7c89988a7d7063574a3d3024170a0000000000000006121e29353f4951555c60646a6f757a7f848a8f949a9fa2a8a09e98928e88837e79736e6964605c54524c48443d39352f2b261f1c18120b030000000000000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000000000613202c3945515d67737f8c95a0aaada19791847b706b615e5754524c4e4d4d4d4e4b5153545c60676d747f88939fa5afa79f92877c6f62584e43372b1d120700000013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261b0f03000009141f2a333b4246484c4c4c4c4c4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c8584838281807f7e7d7c7b7a79787a8794a19f92867978797a7b7c7d7e7f8081828384867a6d6054473a2d2114070000000000000000000b151e2a36414d56606d78839099a4a99f92877c6f625a5043392f303a44505b666f7c87939faaa49a9083786d60574d42362a1f150b01000000000000000713202c38444f5960636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6361594f44382c20140700020d18222c343b414446464646464646464639352f2820160c010000000000000000000000000000000a151e262e343846464646464646464646433e372e251b1005000006101a222a303538393939393939392f2e2b2620181006000000000000000000000000000000040d161e24292c2d383939393939393939393937332c251c13090000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c171008000000000000060e161d23272a2b2d2d2d2d2d2c201f1c17110a03000000000000000000000000000000000000000000000000060c111517182020202020201f1e1c1810151a1e212225282a2b2c2d2c2b2a282521201e19140f0a040000000000000000000000000000000000000000060f1a232c353e454d535b6064696e72757778797979787674726e6964605c545660676a6c6c6c6c6c6c65625a50453a2e211509000713202c3945525d687679797979797979736d63574b3f3225190c050e19222935404b555f6a6e7979797979797979766c665b5044382b1f120600000000000000000e1925303b44515b636e737d82858684827d78706b625f57514b53606d788686867f7265584c3f3225190c00000000000000010d18232d373f434b5153586062686d73787d82888d92989da0a8a29f9b95908b85807b76706d66615e56544f4745413a37312c28231d150c030000000000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c00000000000714212d3a4754606d7a85929fa7b0a69e92857b6e696059524d47464141404040414045464b51555d606d727f8b939ea9afa3998f82766a605447392f24180c00000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c342a20150a000000030e18212a31363a3b3f3f3f3f3f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c8991908f8e8d8c8b8a898887868583919daa9f92878385868788898a8b8c8d8e8f9091877a6d6054473a2d211407000000000000000007121d27303946525e68727f8b95a0aba1978d80746a5f53483e312728333f4a54606b74818e98a2aca0958c7f72695e52463e31271d1207000000000000000916222f3b4854606b707979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979706b6155483c2f2316090008141f2a343e464d5152535353535353535345413a32281e1308000000000000000000000000000006111c2630383f44535353535353535353534f4940372c21160a00020d18222c343b4144464646464646463c3a37312a22180e0300000000000000000000000000010c1620282f35393a4546464646464646464646433e372e251b1005000008121b242b3136383939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a120800000000040e1820282e3337383939393939392d2c28231c150c03000000000000000000000000000000000000000000000911181d2124252d2d2d2d2d2d2c2b28241c1f262b2e2f32353738393939383735312e2d2a251f1b150d07010000000000000000000000000000000000020b18212c353e474f575f656c71767b7f8183858586858583817f7b77716d665f58677277797979797979716c62564a3d3124170b000714212d3a4754606d7a86868686868686807366594d4033261a0d0b16202b343d45515d676e7c868686868686868682796c605346392d201306000000000000000009141f29323f49525c636b707578797875706c656059534d4544505c6674797979726d62564a3e3124180b000000000000000007111b252d31394045474e54565e61666d70767b81858b91959b9fa3a79f9d97928d87827d78736e6863605954514c47433c38342e271e150b000000000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000006131f2b37434e5866727f8c97a2adaa9e948a7d70695f574f46423b3935303433342e34383a40454b515b626d74818e97a1adab9e94897c6f62554b4035291d1004000013202c3946535f6c7986929facada093867a6d6053474040404040404040404040404040404040404040404040404040404040404040403c3a37312a22180e0400000000060f181f262a2d2e323232333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c89959d9c9b9a99979695949992919195a0aca399929091929995969798999a9b9c9d93877a6d6054473a2d21140700000000000000000c18232e39424f59616e7b85929fa7a79e92857a6d60584e43362c1f222d38424f59616e7a86929fa7a79f92867b6e61594f43392f24180c030000000000000a1623303d495663707d86868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867d7063564a3d3023170a000d1925303b4650585d5f606060606060605f524c443a2f24190d01000000000000000000000000000c17232e38424a505f60606060606060605f5a52493e33271b0f0008141f2a343e464d51525353535353534847433c342a20150a0000000000000000000000000008131e28323a41454752535353535353535353534f4940372c21160a00040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a10050000010c16202a323a3f43444646464646453a38342e261e150a00000000000000000000000000000000000000000009121b22292e313239393939393939373430282c31373a3b3f4244454646464543413e3b3936302b272018130c04000000000000000000000000000000000a141d2a333e474f5961696e787e83888b8e909292939291908e8b88837e786f6a606a77848686868686867e7165584b3e3225180b000714212d3a4754606d7a8793939393938c807366594d4033261a0a141d28323d46515b606d798391989393939991847a6d665b5044382b1f12060000000000000000020d17202d37404952596063686b6c6b6864605b534f47423c3f4a545c6a6c6c6c65625b51463a2e2215090000000000000000000a131b1f272f34383d43474c52545c60646a6e747a7f84898f92999ea1a9a29f9a938f8a847f7a75706b65605d55534e4645403930271d1207000000000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f13060000000815222e3b4754606a7884919ea9b1a79c8f82756c61574d453d36302d292427272723282c2e343a4145515b606d7a85929eaab0a69b8e8275675d5145392c1f1306000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343434342f2e2b2620181006000000000000060e141a1e2122252526333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c8995a2a7a6a5a4a3a2a1aaa29f9e9da0a7b1aba39f9d9e9fa2aaa2a3a4a4a5a6a7a093877a6d6054473a2d2114070000000000000004101c2834404b54606b75818e98a2aca0958b7e72685d52463c31241a1c262f3d46525e68727f8c95a0aca2988e81756b61554b4035292015090000000000000a1623303d495663707c89939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393897d7063564a3d3023170a00101c2935414d5862696c6c6c6c6c6c6c6c6c5d564c4135291d110400000000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e12000d1925303b4650585d5f60606060606055534e463c31261b0f030000000000000000000000030c19242f3a444c52545e6060606060606060605f5a52493e33271b0f000915202b353f474e52535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c000006121d28323c444b4f5153535353535246443f3830261c11060000000000000000000000000000000000000006111b242d343a3d3e4646464646464544403b34383c4247484c4e505252535252504e4b4746413b373229241d160d05000000000000000000000000000006111b262f3c454f59616b707b838a9095989b9d9e9f9f9f9e9d9b9895908b837c706b67798592939393938a7d7164574a3e3124170b000714212d3a4754606d7a87939f9f9f998c807366594d4033261a111c262f3a444e58626d75818e95a0aaa59f92877c6f685e544a3f33281c0f03000000000000000000050e1b252e3740474f54565c5f5f5e5c57535049413d373138424a50535f6060585651493f34291e1206000000000000000000010a0d151d23292c32383a41464a5053585f62676d72777d82878d92979d9fa7a49f9c96918c86827c77726d67625f5853514b42392e23180c000000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d2013080000000916222f3c4955626f7c8896a1acaca095897c6f625a50453b332a25201d191a1a1a181c1f23282f353f45515d67727f8b98a2aeac9f9286796d6053473a2d201406000013202c3946535f6c7986929facada093867a6d6053473a2d2727272727272727272727272727272727272727272727272727272727272722211f1b150e06000000000000000003090e121415191926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c89959b9a999998979695949892919095a0aba39992909192989495969798999a9b9c93877a6d6054473a2d211407000000000000040d1a242c3845515c66707d89939eaaa59d9083786c60564c41342a2012141d2a36414c56606d7883919da5aa9e938a7d70675d51453c31261a0d0400000000000a1623303d495663707c89969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f96897d7063564a3d3023170a00121f2b3844515d6974797979797979797976685d5245392c20130700000000000000000000000006121f2c3844505c66767979797979797979766c5f5346392d201300101c2935414d5862696c6c6c6c6c6c6c625f584e43372b1f120600000000000000000000000b151e2935414c565d606b6c6c6c6c6c6c6c6c6c6c645a4f43372b1e12000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c1104000b17232e3a444e565c5e60606060605f53504a42382e23170c000000000000000000000000000000000000010c18222d363f454a4b53535353535352504c454044464e5355585b5d5e5f605f5e5d5b5854524d47433d352f281f170f05000000000000000000000000000b17222d38414d57616b707d8690959d9fa7a8aaaaa39f9e9e9e9fa3a09d9590867d706d798698a29f9f96897d7063564a3d3023170a000714212d3a4754606d7a8793a0aca6998c807366594d4033261a17222d38424c56606a727f8b939ea8a79e938b7f726a60564c42382d22170b000000000000000000000009131c252e353d4448494f5253514f4a46443f382f2b2630383f44465353534c4a463f372d23180d010000000000000000000000030b12181c1f272b3036383f44464e53555d60656b70757b80858b90959b9fa3a8a19e99928e89847f7a746f6a64605c544b4034281c10040000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d0100000d1a2633404d596673808c99a8b2aa9d9083776a6054483e332a211a14110d080d070c1013181d242935414c55606d7985929fabaea2988a7d7164574a3e2e23170b000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1515120f0a040000000000000000000000020507080c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916232f3c4956626f7c89908f8e8d8c8b8a898887868584839099a49f9287838485868788898a8b8c8d8e8f90877a6d6054473a2d2114070000000000010c161f2a36424d57606d7984919da5aa9e93897c6f665b50443a3022180e0b1925303b44515c66707d89939eaaa59e9184796d60574e42372b20160c01000000000a1623303d495663707c8996a3acacacb5afaca7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a396897d7063564a3d3023170a00131f2c3946525f6c7986868686868686867a6d6054473a2d2114070000000000000000000000000713202d3a4653606d788686868686868686796c605346392d201300121f2b3844515d697479797979797979766a5f53473a2e2115080000000000000000000007121d27303945525d686d78797979797979797979766c5f5346392d201300111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d211408000f1b27333f4b5660676b6c6c6c6c6c6c605c544a3f34281c1003000000000000000000000000000000000005111d29343f485056586060606060605f5d574f4a5153575f6265686a6b6c6c6c6b6a6864615e56544e45413a312921170f050000000000000000000000030f1b27333f49535f69707d8792989fa7aba7a09d9898929191919299989d9f9892877d707a8794aab4a396897c706356493d3023160a000714212d3a4754606d7a8793a0ada6998c807366594d403326172128333f4a545e686f7c87929fa5aaa0958e81756d62584e443a2f261c11060000000000000000000000010a131c232b33383c3d42454645423d3937332d261d1e262e34383a4646463f3e3a342d251b11060000000000000000000000000001070c10161b1e252a2e34383c43474b5154596063696e73797e83888e92989ea1a8a39f9b95918b85817c76716d665c5145382c1f1306000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d11040005111e2a36424d576976838f9ca9b5ab998c7f7366584e43362c21180f0905010000000004070c1319242f3a45515d6774818e9aa7b4aa9b8e817468544a3f34281c10030013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0908060300000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916222f3c4955626f7c83838281807f7e7d7c7b7a7978777887939f9e9184787879797a7b7c7d7e7f80818283847a6d6054473a2d211407000000000007131d28313a46535f69737f8c96a0aca2988e81756b60544a3f32281e100608141e2834404a54606b75828f98a2aca0968c80736a5f53473e32281e1308000000000a1623303d495663707c8996a7b1bbb5aba39f9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a96897d7063564a3d3023170a00131f2c3946525f6c7985929393939393877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693939393939386796c605346392d201300131f2c3946525f6c79868686868686867c6f6255483c2f221509000000000000000000000c18232e39424f59606d7a85868686868686868686796c605346392d201300121f2c3845525e6a7579797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a00111d2a37434f5c6772777979797979786d665c5044382c1f120600000000000000000000000000000000000915212e3a45505a62656c6c6c6c6c6c6c696157545c60646a6e72757778797979787674716e68626058514b433b332921170d030000000000000000000005121f2b3744505b656e7b859299a2aaaaa39f95918b888584848586888b90959e9992857b7b8894a1aea295897c6f6256493c2f231609000714212d3a4754606d7a8793a0ada6998c807366594d4033261e29333b44505b666d7a849199a3aea2989083796d605b51463d32281d140a00000000000000000000000000010a111921272c2f303538393835312d2b27221b14151c23282c2d39393932312e29231b13090000000000000000000000000000000000040a0f13191c23282b31373a4145474f54575e61676d71767c81868c91969c9fa4a7a09d98928e88837e796d6053463a2d20130700000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000714202d3a46525e697885929eabafa399897c6f6256493d32231a0f060000000000000000000108131e2935404b5564707d8a97a9b3aa9d908377665c5044382b1f12060013202c3946535f6c7986929facada093867a6d6053473a2d201407010101010101010101010101010101010101010101010101010101010000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000815212e3b47535f6a6f77767574737271706f6e6e6d66667885929e9d9083766b676d6e6f7071717273747576776d675d5145392c20130600000000020b18242f3a43505a616e7b86929fa8a89f92867b6e61594f42382d20160c00020c18232e39424f59616e7b86929fa8a89f92867b6e625a50443a2f24190c020000000a1623303d495663707c8995a0a9b3afa399928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d897d7063564a3d3023170a00131f2c3946525f6c7985929f9f9f9f93877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d7986939f9f9f9f9386796c605346392d201300131f2c3946525f6c79859293939393887b6f6255483c2f22150900000000000000000005101c2834404b54606b74818e979393939393939386796c605346392d20130013202c3946535f6c79878686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b00111e2b3844515e6b7784868686868686786d6053463a2d20130800000000000000000000000000000000000b1724313d4a56626c71797979797979787369585f666d71777b7f8183858586858583817e7b756f6a605d554d453b33291f150b010000000000000000030f1b27333f4953606c77829097a2abaaa398928b837f7b79787778797b7f83899196978f827c8895a2aea295897c6f6256493c2f231609000714212d3a4754606d7a8793a0ada6998c807366594d40332627303b454f59606c78828f96a1aba49f92857b6e675d51493f342b20160b02000000000000000000000000000000070f161c202223292c2c2b2924201f1b17110a0a11171c1f202c2d2d2524221e181109010000000000000000000000000000000000000002080d11171c1f262b2f35393d44484d53555c60646a6f747a7f848a8f939a9fa2aaa29f9a94908a8376695d5043362a1d1000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d211407000814212e3b4754616e7b8797a2adac9f92867a6d6053473a2d2014070000000000000000000000010d18242f3b4754616e7a8797a1adac9f9286796d6053463a2d2013070013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000006131f2b37434e585f626a69686766666564636261605c6a7784919d9c8f8275695c60616263646566676869696a605d554c4135291d1104000000000a141d2935404b55616c75828f98a3aca0968c7f73695e52473d2f261c0e04000007121c27303d46535e69737f8c96a0aca3998f82766c61564c4135291e140a0000000714202d3a4753606d79839097a2acac9f928780808080808080808080808080808080808080808080808080808080808080808080808080807b6e6255483b2f22150800131f2c3946525f6c7985929facaca093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929f9f9f95887b6f6255483c2f2215090000000000000000050e1b242c3845515c666f7c88939fa99f9f9f9f9f9386796c605346392d20130013202c3946535f6c798692939393939393939393939393939393939393939393939393939393939393939393939393939393939393938a7e7164574a3e3124170b000e1b2734414e5a6774818d93939398897c6f6356493c2f24190d01000000000000000000000000000000000b1825323e4b5865717e868686868686857866616a6f787e83888b8e909192939291908e8b86827c746d675e574d453b31271d1207000000000000000005121f2b3744505b65717e8a949fa9aea39892867f78726e6c656b666d6e72767d849094948c7f8c99a5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033232e39424d57616b73808c949fa8a69d928a7e71695f554b40372d22190e050000000000000000000000000000000000050b101316161c1f201e1c1713120f0b060000060c101213202020191815120d06000000000000000000000000000000000000000000000000060b10151a1d24292c33383b42464b5153586062686d72787d82878d92989da0a7a69f9c9084776a5d5144372a1e1100000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f231609000916232f3c4956626f7c8995a9b3aa9e918477675d5145382c1f13060000000000000000000000000714202d3946525e687885919eabaea398887b6e6255483b2f2215080013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c070604010000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000030f1b26323c464e53555e5d5c5b5a595857565554535d697683909c9b8e8174685b535455565758595a5b5c5d5e54514c433a2f24190d0100000006111b262f3845515d67717e8a949eaaa69e9184796d60574d42352b1d140a000000000b151e2a36424d57606d7984919ea6ab9f948a7e71685d52453d30261c1106000006131f2c3945515d676e7b85929aa4afa3998e81747373737373737373737373737373737373737373737373737373737373737373737373736e695f53473a2e21140800131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000000000000020c16202b37424d57606d7983919aa4afacacacac9f9386796c605346392d20130013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b000a1724313d4a5764707d8a99a3aa998c807366564c4135291d1104000000000000000000000000000000000b1724313e4a5764717d8a939393939786796d6c707c838b9095989b9d9e9f9f9f9e9d9b99928f8781796e695e574d43392f24180c03000000000000000613202d394653606c7883909da6b0a79f92867d726c6662605b545c6062656b707a8290959286929facafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40332834404b545e69707d88939fa6a99f948d80736c61574d43392f251b100700000000000000000000000000000000000000000407090a0f1213120f0a0605030000000000000306071313130c0b090601000000000000000000000000000000000000000000000000000000030a0f13181d20272c3136394045464e54565e61666c70767b80858b90959ca4aa9d9084776a5d5144372a1e1100000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000a1723303d4a5663707d8996a3b0a99c90837669554b4035291d100400000000000000000000000005111e2a36414c566a7683909da9b4aa96897c6f6356493c302316090013202c3946535f6c7986929facada093867a6d6053473a2d2019191919191919191919191919191919191919191919191919191413110d0701000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000a15202a343c43474951504f4e4d4c4b4a4948474f5b6875828e9b9a8d8073675a4d4748494a4b4c4d4e4f50514745413a31281e1308000000000b17222d38414e58606d7984919ea6ab9f948a7d70675c51453b3023190b0200000000030c1a25313b45515c67707d8a949eaba69e91857a6d60584e42382e23170b000004101d2935404b555f69707d88939fa6ab9d938b7e716a67676767676767676767676767676767676767676767676767676767676767676767625f574d42372b1e120600131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000000000008131e28323a47535f69737f8c95a0acb6b8b9beac9f9386796c605346392d20130013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a4978a7d7164574a3e3124170b000714212d3a4754606d7a86929fa99d908376685d5245392c201307000000000000000000000000000000000a1723303d4a5663707d89969f9fa994877a6d707e8690959da09e9c9b9a9b9c9ea1a9aba39f9a938e847b6e695e554b403529201509000000000000030f1c28333f4a5463707d8995a0acab9f958b7e716b605b5453504a5053555961686d798391999299a3aeafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033343c45515c666e7b85929aa4aba1979082786d605a50453c31271d1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d11161c1f252a2e34383c43474c52545b6064696e747a7e838c929caa9d9084776a5d5144372a1e1100000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d000b1724313e4a5764717d8a97a4b0a89b8f8275685c4f422f24180c00000000000000000000000000010d192530424f5c6875828f9ba8b0a3968a7d7063574a3d3024170a0013202c3946535f6c7986929facada093867a6d6053473a2d26262626262626262626262626262626262626262626262626262621201d18130c040000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000040e18222a32373b3c44434241403f3e3d3c3b414e5a6774818d9a988c7f7265594c3f3c3d3e3e3f40414243443a39352f281f160c01000000030f1b27333f49535f6a73808d96a19fa3998f82766c61554b4033291f100700000000000009141f2934404b55616c76828f99a39fa1978d80746a60544a3f34281c100300000c18242f39434d57616b73808c949ea8a59f92867c6f685d545a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534d453c31261a0e0200131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000000030d1925303a44505a616e7b86929fa7afacabadb3ac9f9386796c605346392d20130013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a978a7d7164574a3e3124170b000613202c3945515d677683909ca99f92867a6d6054473a2d211409000000000000000000000000000000000a1623303d495663707c8996a3aca195887b707e8792989e9896918f8e8d8e8f91979b9fa4aca49f9691847b6e675d51453c31261a0f02000000000006121f2b3844505b6674818e9ba7b1a99d9083766d6259504a46443f4446484f565d676f7c87929fa3abb4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40313c46505a606d78839097a2aca39991857a6e665c50483e332a1f150b00000000000000000000000000000000000000000000000000000000000004080a0a1313131312110f0b070100000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f141a1d24292c32383a41464a5053585f62676d7279808c99a69d9084776a5d5144372a1e110000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f000b1825313e4b5864717e8b97a4b1a89b8e8275685b4f4235281c070000000000000000000000000000081b2835414e5b6874818e9ba7b0a4978a7d7164574a3e3124170b0013202c3946535f6c7986929facada093867a6d6053473a333333333333333333333333333333333333333333333333333333332d2c29241d160d0400000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000007101820262b2e2f37363534333332313033404d596673808c99978b7e7164584b3e313031323334353636372d2c29241e160d040000000005121f2b3744505b656f7c87929393939392877c6e625a5043392e21170d00000000000000030c18232f3943505a616e7b86929393939393877c6f665c5044382b1f1206000007121d27313b454f59606c78828f96a0aaa39891847a6d665b504d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847423c332a2015090000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000000010b151f2a36414c56626c76828f98a3aca49f9ea1a9b39f9386796c605346392d20130013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7e7164574a3e3124170b0004111d2935414c5566737f8c99a9a3998a7d7164574a3e31261a0e02000000000000000000000000000000091623303c4956636f7c8996a2afa295897c7c86929996918c8784828181818285888e939aa1a9a8a0969083796d60584e43372b1f140900000000000613202d394653606c7985929eabada1978a7d70645a50443f393734383a3d444c555f6a74818e9aa7b1bdafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d403a434e58616c74808d959fa9a59f92877d6f685e544a3f362c21180d0300000000000000000000000000000000000000000000000000000000050b10141617202020201f1e1b17120c0500000000000000000000000000000000000000000000000000000000000000000000000002080d11171c1f262a2f35383d43484c52545c60646a6e747a7e838c929caa9d9084776a5d5144372a1e110000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2834414e5b6774818e9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a39352f281f160c01000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000070e151b1f21222b2a29282726252425323f4c5865727f8b98968a7d7063574a3d30242425262728292a2b21201d19130c0400000000000613202d394653606c79838686868686868680736a5f53473e30271d0f05000000000000000007121d27313e47535f6973808686868686868683796d6053463a2d2013070000010b151f2a333e44505b666d7a849198a2aaa1968f82786c60594f45404040404040404040404040404040404040404040404040404040403b3a37312a21180e030000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000007121d27313946525e68717e8b949faaa49a939297a1ad9f9386796c605346392d20130013202c3946535f6c7986929facb3a79a8d80808080808080808080808080808080808080808080808080808080808080808080808080807c6f6255483c2f22150900010d19242f3c4956626f7c8997a2ab9a8e817467574d42372b1e12050000000000000000000000000000000916232f3c4956626f7c8995a2afa396897d839098938d847f7b777574747476787c81889197a1a9a8a0958d80736a5f53473b30251a0e02000000000916232f3c4956626f7c8997a2adab9e9285796d6053463f332d2b282c2d323a434e58626e7b88959fabb8afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40414b555f6a717e8a929da7a89e938c7f726b60564c42382e241a0f06000000000000000000000000000000000000000000000000000000000810171c2023242d2d2d2d2b2a28231e170f06000000000000000000000000000000000000000000000000000000000000000000040a0f13191c22282b3136394045474e54565e61666d70767b80858b90959ca4aa9d9084776a5d5144372a1e110000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4745413a31281d1307000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000000000040a0f1315161e1d1c1b1a19181724313e4a5764717d8a9795897c6f6256493c2f231718191a1b1c1d1e1413110d080100000000000005121f2b3744505b656c7679797979797979736e64584e43352c1e150b000000000000000000010b151f2b37424d57636e7379797979797979776d665c5044382b1f1206000000030d182128333f4a545d686f7c86929fa4a89f948c80736b61574d43392f343434343434343434343434343434343434343434343434342f2e2b2620180f06000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000000020b18232f39434f59616d7a85929ea6a99f938785929eab9f9386796c605346392d20130013202c3946535f6c7986929facada0938679737373737373737373737373737373737373737373737373737373737373737373737373736f6a5f53473a2e21150800000813202d394653606c7985929eab9e918478695f53463a2d2114060000000000000000000000000000000916222f3c4955626f7c8895a2afa89c8f828f9593888079726e6969686768696a6f747d859197a2ada79f92877c6e62574d42362a1e1205000000000c1926323f4c5965727f8c98a9b3a79b8e8174665c50443828221f1c1f2028313c47535f6a7683909da9b6afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d3f45515d676f7c86929fa4aaa0968f81756d62594f443b30261c12080000000000000000000000000000000000000000000000000000000008111a22282d3031393939393837342f2821180f05000000000000000000000000000000000000000000000000000000000000070c10151b1e24292d33383b42464b5153586062686d73787d82888d92989da0a7a69f9c9084776a5d5144372a1e110000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605959595959595959595959595959595959595959595959595959595959595954514b433a2f24180d010000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000000000000000306080911100f0e0d0c0b1623303d495663707c899694877b6e6154483b2e21150b0c0d0e0f1011070604010000000000000000030f1b27333f49535b60696c6c6c6c6c6c6c67645c52463c31231a0c0300000000000000000000030d1a26313c45525c63666c6c6c6c6c6c6c6a605c544a3f34281c100300000000060f17222d38424c565f6a717e8b929da7a69f93887d70695f554b40352927272727272727272727272727272727272727272727272722211e1a150e0600000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221509000000000a141d2934404b55606b74818e97a1ada1978e8183909da99f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d676767676767676767676767676767676767676767676767676767676767676767676767625f584e43372b1f1206000006121f2b3844505b6675828e9ba8a196887b6e6155483b2e23170c0000000000000000000000000000000916222f3c4955626f7c8895a2afaa9e948f9493887e736d67615e575b5a5b5860626b6f7c85929ea6afa3998e8175695e52463a2d201408000000020f1b2835424e5b6875818e9ba8b5ab988b7e7165544a3f342817121012161f2b37434e5866727f8c99abb5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366595049515b606d79849198a2aea29891847a6d605b51473d32291e150a0000000000000000000000000000000000000000000000000000000005101a232c33393c3d464646464543403a332a21170c01000000000000000000000000000000000000000000000000000003090e12181c1f262b3035383f44464d53555d60656a6f757a7f848a8f949a9fa2aaa29f9a948f8a8276695d5043362a1d100000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6666666666666666666666666666666666666666666666666666666666666666605d554b4135291d11040000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000403020100000915222f3c4855626f7b889598867a6d6053473a2d201407000102030304000000000000000000000000000b17222d38414950535d606060606060605a58524a40332a20110800000000000000000000000009151f2a33404a52585a606060606060605d53504a42382e23170b00000000000006111c262f3a444e58616c74808d959fa9a49a92857b6e675d51453f342b20171a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1514120e09030000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150900000006111b262f3845515c67707d89939ea9a69e91857a84919daa9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261b0f030000030f1c28333f4a5465717e8b98a8a8988b7e7265544a3f34281c100300000000000000000000000000000916222f3c4955626f7c8895a2afb0a69e9c958c80736c605c55524d4e4e4e4e5459606a717e8a949fabab9f92877b6e6154483b3025190e02000005111d2a36414c566a7784909daaafa499887b6f6255483c2e23170603060d1a26313c4956626f7c8999a3afafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c80736b605b5358626d75818e96a0aaa49f92867c6f675d51493f352b20170c03000000000000000000000000000000000000000000000000000000000b17222c363e44494a5353535352504b453c33281e1207000000000000000000000000000000000000000000000001040b10141a1d23282c32373a41464a5053575f61676d71777c81868c91969c9fa6a7a09d98928d88837e786d6053463a2d2013070000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada09386797272727272727272727272727272727272727272727272727272727272727272726d675d5145392c2013060000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a879a928579675d5145392c2013060000000000000000000000000000000000000006111b262f383f444650535353535353534d4c4740382e21180e00000000000000000000000000030e18212e3840474b4d535353535353535046443f3830261c1106000000000000000a141d28323c46505a606d78839097a1aba2979083796d605b51463d32291e140a0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0808060200000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000000b17222d38414e58606d7984919ea5aa9e948a7e7885919eab9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c342a20150a000000000b17222d3b4854616e7b8795a0a89b8f8275665c5044382c1f120600000000000000000000000000000916222f3c4955626f7c8895a2afb8b0a89d9083786d605a514b464241414143474f58616c76828f9ca9afa3998c7f7266564c41362a1e110500000713202d3946525e687985929facac9f9386796d6053463a2d20130600000913202d3a4653606d7986929facafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adab9e91847d726c655d606a727f8b939ea8a79d928a7e716a5f554c41372d23190e050000000000000000000000000000000000000000000000000000000004101c28333e48505557606060605e5c564e453a2f23170b00000000000000000000000000000000000000000001080d11161c1f252a2e34383c43474c52545b6063696e73797e83898e92999ea1a8a39f9b95908b85807b76716d665c5144382c1f12060000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb2a6998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6054473a2d2114070000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939184786b554b4035291d100400000000000000000000000000000000000000000a141d262d3337394346464646464646403f3c362e261c0f060000000000000000000000000000060f1c262e363b3f4046464646464646443a38342e261e140a0000000000000000020b16202a343e44515c666e7b859199a3a9a0958e81756d62584e443a30261c11060001010101010101010101010101010101010000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215090000040f1b27333f49535f6a73808c96a0aca2988f82757985929fac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053474040404040404040404040404040404040404040404040404040404040404040403c3a37312a22180e04000000000614202d3a46525e697784919daa9f9285796d6053463a2d20130800000000000000000000000000000916222f3c4955626f7c8895a2afb9ada1968a7d71665c5045403936303432373d46505a63707d8a97a1adab9d908377685e5246392d20140700000714212e3a4754616d7a8798a2aeab9e918478675c5145382c1f1306000006131f2c3845515c667784919daaafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adada19691877f776d68686f7c87929fa5a99f958d80746c61584e433a2f251b110700000000000000000000000000000000000000000000000000000000000814202d3944505a61646c6c6c6c6b6860564b4034281b0f0200000000000000000000000000000000000000040c13191d20272c3036394045464e54565d61666c70757b80858b90959b9fa3a8a19e99928e89837e7a746e6a64605c544a4034281c10040000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a89c918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869a9184786b554b4135291d11040000000000000000000000000000000000000000020b141b22272b2d36393939393939393433302b241c140b000000000000000000000000000000000a141c242a2f323339393939393939372d2b28231c140c02000000000000000000040e18222834404a545e69707d87929fa5a79e938b7f726a60564c42382e23170f0600000000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150900040d1a232b3744505b656f7c87929fa8a79f92867b6e7986939fac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343434342f2e2b2620181006000000000005121e2a36424d576774808d9aaaa298897c6f6356493c2f24190d01000000000000000000000000000916222f3c4955626f7c8895a2afb8ab9e9184786c60544a3f342f2a2527272b333e4653606c7885929eabaca095877a6e6154473b2e21140800000915222f3c4855626f7b8895aab4a99d9083766a554b4034281c1004000004101c2834404b546975828f9ca8afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adb2a9a199928c827a6f6d7a849199a3aba1979083786d605a50463c31281e130a000000000000000000000000000000000000000000000000000000000000061623303c4955616c70797979797872685c5043372a1e07000000000000000000000000000000000000010a0d161e24292c33383b42464b5153585f62686d72787d82878d92979da0a7a49f9c96918c86817c77726d67625f5853514a42392e23180c000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9ada39c999999999999999999999999999999999999999999999999999999999999999994877b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794928679675d5145392c201306000000000000000000000000000000000000000000020a11171b1f202a2d2d2d2d2d2d2d2726231f19120b0200000000000000000000000000000000020a12191f2326272d2d2d2d2d2d2d2a201f1c17110a020000000000000000000000061018232e39424d57606b727f8c939ea7a59f92877c6f685e544a3f342821180d04000000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221509010c161f2a36414c56606c77839099a3aba0958c7f726d7a879aa4af9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d2727272727272727272727272727272727272727272727272727272727272722211f1b150e06000000000000020e1a25303d4a5763707d8a98a3aa998c807366564c4135291d1104000000000000000000000000000916222f3c4955626f7c8895a2afb6ac9a8d8074665b5042382e231d1a1b1b212b3844505b6674818e9ba7b1a7978a7e7164574b3e3124180700000a1623303d495663707c8996a3afa89c8f8275695c4f422e23180c000000000c18232e414e5a6774818d9aa7afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adbbb2aba39f948f847c78828f96a1aba49992857b6e665c51483e342a1f160c0100000000000000000000000000000000000000000000000000000002080e111724313d4a5764707d8686868684786b5e5245382b18120e09030000000000000000000000000000000a131c1f282f35393d44484d52545c60646a6f747a7f848a8f939a9fa2a9a19e9a938f8a847f7a756f6b65605d55534e4644403930271c12070000000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9b5ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a194877b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000403020101000915222f3c4855626f7b889598877a6d6054473a2d2114070001020303040000000000000000000000000000000000060b0f12131d202020202020201a1917130e080100000000000000000000000000000000000000080e1317191a202020202020201d1312100b06000000000000000000000000000007121c27303b454f59626d75818e95a0aaa39991847a6d665c50443e332a1f160c010000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150907121d28313946525e68727e8b949faba3999083786d6e7a8794a1b69f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1515120f0a0400000000000000000914202d3a4753606d7a86929fa99d908376685d5245392c201307000000000000000000000000000916222f3c4955626f7c8895a2afafa49a897d7063544a3f30261c120e0a0f1c28333f4a5465717e8b98abb5a69a8d8073675a4d402e23180c00000a1724313d4a5764707d8a97a3b0a89b8e8175685b4e4235281b0700000000071a2633404d596673808c99a6afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adb8b0aaa9a69e969186828f949fa8a69f93877d70695e544b40362c22180d04000000000000000000000000000000000000000000000000000001070c14191b2227313d4a5764707d8a93939185786b5e52453828231c1a140d070100000000000000000000000007121c252e313a4145474f54575e61666d71767c81868c91969c9fa4a79f9d97928d87827d78726d6863605953514b47433c38342e271e150b000000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000000000000000206080811100f0e0d0c0b1623303d495663707c899694887b6e6155483b2e22150b0c0d0e0f10110707050100000000000000000000000000000003050610131313131313130d0d0b07030000000000000000000000000000000000000000000002070a0c0d131313131313131107060300000000000000000000000000000000000b151e29333d47515b606d79839098a2aba1968f82786d605a50453c31281d13070000000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070303030303030303030303030713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215090b18242f39434f59616e7a85929fa6a89f92877c6f666e7b8894a1ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d090806030000000000000000000006131f2c3945515d6776838f9ca99f92867a6d6054473a2d211409000000000000000000000000000916222f3c4955626f7c8895a2afac9f93867a6d6054473a2d21150a01000b17222d3c4855626f7b8899a4afa99c8f837669554b4034281c1004000b1724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b0e010000000c1926323f4c5965727f8c98a5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adb0a69e9c9fa2a199928f949ea6a89e948c7f736b60574d42392e241b10060000000000000000000000000000000000000000000000000000030b12181e252a2d33373d4a5764707d8a979e9185786b5e524538342e2a251f18120c0400000000000000000000020d19232e3740434c5154596063696e73797e83888e92989ea0a8a29f9a95908b85807b76706c66615e56544f4745403a37312c28231c150c03000000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a79d95939393939393939393939393939393939393939393939393939393939393939393877b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000000000030a0f1214151e1d1c1b1a19181824313e4b5764717e8a9795897c6f6256493c2f231718191a1b1c1d1e1413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c17202b353f45515d676e7b86929aa4a89f948d80736c61574e433a2f2418110700000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114101010101010101010101010101013202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22150a141d2935404b55616b75818e97a2aca1968d80746a626f7b8895a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d20140701010101010101010101010101010101010101010101010101010101000000000000000000000000000004101d2935404b5566727f8c99a9a3998a7d7164574a3e31261a0e020000000000000000000000000916222f3c4955626f7c8895a2afaa9e918477675d5145392c20130300000613202d3a4653606d7986939facab9e918478675c5145382c1f1306000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e010000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0adaa9e948f9298a2a39f9c9ea6aaa1968f82776c60594f453b30271d12090000000000000000000000000000000000000000000000000000060d151d23293036383f44464a5764707d8a979e9185786b5e5246444039363029241d160d0600000000000000000006121e2a35404951555d60656b70757b80858a90959a9fa2a8a09d98928e88837e79736e6963605b54524c48433d39352f2b261f1c18120b030000000000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e221508000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868686868686868686868686868686868686867b6e6154483b2e2115080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000000060e151a1f21222b2a29282726252425323f4c5865727f8b98968a7d7063574a3d30242425262728292a2b21201d19130c0500000000000000000000000305060e101010101010090806030000000000000000010304060606060504030100000000000000000000000000000000000000000000000000000000000000000000000000000000050e19232935404b555f69707e88939fa6a69d928a7e716a5f554b40352923190e05000000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d211c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2215111c262f3845515d67707d8a939ea9a59e9184796d60626f7c8895a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3c4955626f7c8897a1ab9a8d817467574d42372b1e12050000000000000000000000000916222f3c4955626f7c8895a2afa89c8f827569554b4135291d1104000006131f2c3845515c677884919eabac9f9386796d6053463a2d201307000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e010000000b1825323e4b5865717e8b98a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada99c8f82869298a3aba9aaaea39891847a6d655b50473d33291e150b0000000000000000000000000000000000000000000000000000070f181f272f343b4146495053565964707d8a979e9185786b5e5753514a46423b352f281f180f0700000000000000000a16232f3b46515b63676d72777d82878d92979d9fa7a39f9b96918b86817c76716d67615f5753504a46413a38322c29241d1a15100c07000000000000000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d201307000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867979797979797979797979797979797979797979797979797979797979797979797976695e52463a2d2014070000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000000060f1820262b2e2f37363534343332313033404d596673808c99978b7e7164584b3e313031323334353636372e2d2a251e170e050000000000000000060b0f12131b1d1d1d1d1d1d1615130f0a0400020507080b0e1011121313131211100e0b08070502000000000000000000000000000000000000000000000000000000000000000000000000071118242f39434d57616c73808d949fa8a49f92867c6e675d51453f352b20170c030000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2929292929292929292929292929292929292d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221517222d38424e58606d7984919ea5a99e938a7d70675d626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c070604010000000000000000000000000000000713202d394653606c7885919eaa9e918477695f53463a2d2114060000000000000000000000000916222f3c4955626f7c8895a2afa79a8d8174675a4e412f24180d01000004101c2834404b556a7683909da9afa49a887b6e6155483b2e221508000b1824313e4b5764717e8a97a4b1a79a8d8074675a4d4134271a0e010000000b1825323e4b5865717e8b98a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807d869299a3abb5ac9f92867c6f685d53493f352b21170c0300000000000000000000000000000000000000000000000000071019212a313940454c52535b60636669707d8a979e9185786b6763605c54524d454039312921191007000000000000000c1925323e4b57636d737a7f84898f92999ea1a9a19e99928f89847f7a746f6a64605c55534d46443f3836302c27201d18130f0a040000000000000000000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f1206000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000000030e18222a31373a3b44434241403f3e3d3c3b414e5a6774818d9a998c7f7266594c3f3c3d3d3e3f40414243443a3936302920170c020000000000020a11171b1f202729292929292922221f1b150e090e111414181a1c1e1f20201f1f1e1c1a181514120e0904010000000000000000000000000000000000000000000000000000000000000000000007121d28313c45505a606c78828f96a1aaa2989183796d605b51473d33291e150b0000000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d6054473a36363636363636363636363636363636363636363a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f22151c28333f4a545f6a73808d96a1aca2978e81756b6155626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d2019191919191919191919191919191919191919191919191919191413110d07010000000000000000000000000005121f2b3744505b6575818e9baca096887b6e6155483b2e23170c0000000000000000000000000916222f3c4955626f7c8895a2afa6998c807366594d4033261a07000000000c18232e424f5c6975828f9ca8b6ac95897c6f6256493c2f231609000b1724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b0e010000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c80737d879299a4aca6998c80736a60584e453c332a21170f05000000000000000000000000000000000000000000000000060f19222b333c434b51565e61656c6f7375777e8a979e9184787674706d66615e57514b433b332b22190f060000000000000d192633404c5966737f868b91959b9fa3a69f9c97918c86827d78726d68625f5853514b46423b38332d2a251e1b16110d0701000000000000000000000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c1003000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60606060606060606060606060606060606060606060606060606060606060605f524d453b30251a0e020000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000000a15202a343c43474851504f4e4d4c4b4a4948474f5b6875828e9b9a8d8073675a4d4748494a4b4c4d4e4f50514746413a32291e130800000000020b141b22272b2d343636363636362f2e2b262019141a1e20212527292b2c2c2d2c2c2b29272421211e1a14110d08020000000000000000000000000000000000000000000000000000000000000000010c161f2a333e44505b666d7a849198a3aaa0958e81756d62594f453b30271c120700000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d605447434343434343434343434343434343434343434343434653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221a242b3844505b666f7c87929fa8a69f92857a6e615956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d26262626262626262626262626262626262626262626262626262621201d18130c04000000000000000000000000030f1b27333f495364717e8b9aa4a8988b7e7265544a3f34281c100300000000000000000000000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c00000000071b2835424e5b6875818e9ba8b0a396897d7063564a3d3023170a000a1724303d4a5763707d8a96a3b0a89b8e8175685b4e4235281b07000000000c1926323f4c5965727f8c98a5afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c8073717e87939aa4ab9e92857c6f6a5f574d453b332921170e0500000000000000000000000000000000000000000000040d18212b343c454d555c60686e73787c7f828486929fa196898482807d79746e69605d554d453d342b21180d030000000000101d2a3743505d6a768390989da0a8a29f9a948f8a84807b75706c65605d56544e4745403936312b28221c19130f0a040100000000000000000000000000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60535353535353535353535353535353535353535353535353535353535353534846423b33291f1409000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c10030000000000000000000000000000000000020f1a26313c464e53555e5d5c5b5a595857565554535d697683909c9b8e8174685b535455565758595a5b5c5d5e54524c443a3025190d010000000a141d262d333739414343434343433c3b37322a2220252a2d2e313436373939393938373634312e2d2a25201d19130d070100000000000000000000000000000000000000000000000000000000000000040d182128333f4a545e686f7c86929fa5a79e938c7f726b60574d42392e23181006000000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d60544f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f53606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f221f2a36424d57606c78839099a3ab9f948b7e71685e5256626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a333333333333333333333333333333333333333333333333333333332d2c29241d160d040000000000000000000000000b17222d3b4754616e7a87939fa89b8f8275665c5044382c1f120600000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000916232f3c4956626f7c8995acb6a89b8f8275685c4f422e23180c000000000d1a2633404d596673808c99a6afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c80736c717e88939fa3a19792857c6e695f574d453b332920170e050000000000000000000000000000000000000000010c161f2a333c464e575f676d737a8084898c8f919298a3a8a197918f8d8a85817b736d675f574e463d332a1f150b0100000000101d2a3743505d6a7683909da7a09d98928d88837d79736e6963605b53524c47433c38342f2a261f1c17110d080200000000000000000000000000000000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c110600000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534746464646464646464646464646464646464646464646464646464646463b3a36302921170d02000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1003000000000000000000000000000000000006121f2b37434e585f626a69686767666564636261605c6a7784919d9c8f8275695c60616263646566676869696a615e564c41362a1d1105000006111b262f383f44464e5050505050504947433c34292c30363a3b3e41434445464646454443413e3b3a36312c29241e18130c0400000000000000000000000000000000000000000000000000000000000000060f17222d38424c56606a717e8b939da7a59f92877d70695e544a40342822180d040000000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d605c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2228313a46525e69727f8b959faba3999082776c60564c56626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a39352f281f160c0100000000000000000000000614202d3946525e687783909daa9f9285796d6053463a2d20130800000000000000000000000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b000815222e3b4855616e7b889aa4afa99d9083766a544b4034281c10040000010e1b2734414e5a6774818d9aa7afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c8073666c727f8b919ca4a19791857b6e695f574d453b322920170e050000000000000000000000000000000000000008131e28313c464e5860696e7980868d9196999c9d9fa3aaaba9a19e9c9a97928d8680796e6960584e453b31271d120700000000101d2a3743505d6a7683909d9b95908b85807b76716d66615e5753504945413a37322c29231d1a140f0b06000000000000000000000000000000000000000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a393939393939393939393939393939393939393939393939393939392e2d2a251f170f0500000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000814212e3a47535f6a6e77767574737271706f6e6d6d66667885929e9d9083766b666d6e6f7070717273747576776d685e5246392d20130700000b17222d38414950535a5c5c5c5c5c5c55544e463c35393b4246474b4d4f515253535252514f4d4b4846423b39353029241d160d070000000000000000000000000000000000000000000000000000000000000006111c262f3a444e58626c74818e959fa9a39991857b6e665c51443e342a20160b0200000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a6d696969696969696969696969696969696969696969696969696969696d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f242f3a43505a616e7b86929fa7a89f92867c6e655b504956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4745413a31281d1307000000000000000000000005111e2a36414c566773808d9aaaa298897c6f6356493c2f24190d01000000000000000000000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b000714202d3a4753606d7a86939facab9e918478665c5145382c1f1306000004111d2935404b556976828f9ca9afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366626d727f8c929ca4a19791847b6e695e574d443b322920160e040000000000000000000000000000000000010d19242f3a434e58606a6f7b838c92989ea1a9a8aaa39f9e9e9fa3aaa8a9a29f98928d837b6f6a60574d43392f24180c03000000101d2a3743505d6a768390928e89837e79746e6a64605c54524d46443f38352f2b261f1c18120e09030000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21201e1a140d050000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000815222f3b4855626e7c83838281807f7e7d7c7b7a7978777887939f9e9184787778797a7b7c7d7e7f80818283847a6d6154473a2e21140700030f1b27333f49535b6067696969696969625f584e454045474d5254585a5c5e5f5f605f5f5e5c5a5754534d4745413a352f281f191109010000000000000000000000000000000000000000000000000000000000000a141d28323c46505a606d79839097a1aba1979083786d605a50463c32281d140a00000000000000000000000000000000000000131f2c3946525f6c7985929facada093877a767676767676767676767676767676767676767676767676767676767676788693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f2935414c55616c75828f98a2aca0968c80736a5f53494956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d605959595959595959595959595959595959595959595959595959595959595954514b433a2f24180d0100000000000000000000010d1925303d495663707d8998a2aa998c807366564c4135291d1104000000000000000000000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b0006131f2c3845515c677885919eabac9f9286796d6053463a2d20130600000613202c3945515d677784919eaaafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c8073665b636d73808d929da5a19691847b6e695e564d443a322820160d040000000000000000000000000000000004111d2935414c555f6a6f7c8590959fa2aaa69f9c98989291919298979c9fa4aaa39f9590857c6f695f554b4035291f1509000000101d2a3743505d6a76838c86817c77716d67625f5853504a46423b37332d29241e1b15100c0701000000000000000000000000000000000000000000000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f14090000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d2020202020202020202020202020202020202020202020202020201514120e0902000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100300000000000000000000000000000000000916222f3c4955626f7c88908f8e8d8c8b8a898887868584839099a49f9287838485868788898a8b8c8d8e8f90877a6e6154473b2e2114080005121f2b3744505b656c747676767676766f6a5f574d4b5153575e616467696a6c6c6c6c6b6a696764615e5754524c45403a312b231b130a010000000000000000000000000000000000000000000000000000000000020b16202b343f45515c676e7b859299a3a99f958d80746c61584e443a2f261b1106000000000000000000000000000000000000131f2c3946525f6c7985929facb6a99c8f82828282828282828282828282828282828282828282828282828282828282828f9ca9b5ac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2f303845515d67707d8a939eaaa49a9184796d60584e414956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6666666666666666666666666666666666666666666666666666666666666666605d554b4135291d110400000000000000000000000813202d3a4653606d7985929fa99d908376685d5245392c201307000000000000000000000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c000000010e1b2834414e5b6774818e9aa7b0a4978a7d7164574a3e3124170b0004101c2934404b55697683909ca9afa399887b6f6255483c2d22170b00010714202d3a4753606d7a86939facafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366595b636e74808d939da5a19691847b6e685e564c443a32281f160d040000000000000000000000000000030e18222c3945515d676e7c859297a0a7a8a09e94908b8886858586878a8f93999fa7a7a09792857b6e675d51453c31261a0e0000000f1b2835424e5b6875817f7a756f6b65605d55534e46443f3836302b27221b19130f0a040000000000000000000000000000000000000000000000000000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d10040000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d201413131313131313131313131313131313131313131313131313080705020000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c100704000000000000000000000000000000000916222f3c4955626f7c88959b9a9a99989796959a93929190959faba39992909192989495969798999a9b9c94877a6e6154473b2e211408000613202d394653606c79808283838383837c6f695e56555d6065696e717476777879797978777674716e6966605d56514b433d352d251c130a000000000000000000000000000000000000000000000000000000000000040e19222834404b555e69707d87929fa5a79d928a7e716a5f564c41382d22170f050000000000000000000000000000000000131f2c3946525f6c7985929facb8ab9f948f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f949fabb7ac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c2e38424e58606d7a84919ea6a99f93887d70675c51463c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada09386797272727272727272727272727272727272727272727272727272727272727272726d675d5145392c201306000000000000000000000006131f2c3845515c6775828f9ca89f92867a6d6054473a2d211409000000000000000000000916222f3c4955626f7c8895a2afa6998c7f7366594c4033261906000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a00000c18232f414d5a6774808d9aa7b5ab978b7e716453493f33271b0f0b0e121c28333f4a5463707d899aa4afafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c80736659525c606c77818e939ea6a09691847a6e685e564c443a31281f160d04000000000000000000000000000a15202b37434e58606d7a849197a2a9a79f969189837e7b797878797b7e828790959ea5a9a1979184796d60574d42372b1d120700000e1b2734404d59656f75726d6863605953514b47433c38342e2a251f1b17110d0801000000000000000000000000000000000000000000000000000000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d010000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0b0a0805000000000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336291c1614100b0500000000000000000000000000000916222f3c4955626f7c8895a2a7a6a5a4a3a2aca49f9f9e9d9fa7b1aba39f9d9e9fa2aaa2a3a3a4a5a6a7a194877a6e6154473b2e2114080005121f2b3744505b656e7b858f8f8f8f8f857b6e685d60676d72777b7e80828485868685858482807e7b77726d68605d554f473f372e251c1209000000000000000000000000000000000000000000000000000000000000071018232e39434d57606b727f8c939ea8a49f92867c6f685d53493f332721170c0300000000000000000000000000000000131f2c3946525f6c7985929facb8b0a69f9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa6b0bbac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c343f4a54606a74808d96a1ada1978e81746b60554b403c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb2a6998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6054473a2d211407000000000000000000000004101c2834404b5565727f8b98a8a3998a7d7064574a3d31261a0e020000000000000000000916222f3c4955626f7c8895a2afa79a8d8074675a4d412e23170c000000030f1c2936424f5c6975828f9ca8afa296897c6f6356493c302316090000071824313e4b5764717e8a97a7b1a79a8e8174655b5044372b211b171a1d242b3844505b6673808d9aacb6afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d505b656c78818e949ea6a09691837a6d685e564c433a31281f160d030000000000000000000000020f1a26313b4754606a74818e96a0a9a89f9590847d76716e6c656b696e71757c838e939ea6a9a0968d8073695f5347392e23180c00000c1825313d48535d656866615e56544f4745403937312c28231c1a140f0b060000000000000000000000000000000000000000000000000000000000000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d1207000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171714110c0500000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f4336292423201c171008000000000000000000000000000916222f3c4955626f7c88959d9c9b9a98979695949992919095a0aca399929091929994969798999a9b9c9d94877a6e6154473b2e21140800030f1b27333f49535e696f7c8692999c9790837a6d666d72797f83878b8d8f919292939292918f8d8a87837f7a736d676059514940372e241b0f0600000000000000000000000000000000000000000000000000000000000007121d27303b454f59636d75818f95a0aaa29891847a6d655b50443d33291e150b00000000000000000000000000000000131f2c3946525f6c7985929facb8b8b0aba9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9abb0b8b9ac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c3844505c666f7c87939fa9a69e92857a6d60594f43393c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9a89c918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877b6e6154483b2e2115080000000000000000000000000c18232e3b4855626e7b8896a1ab9a8d817467574d42372b1e12050000000000000000000916222f3c4955626f7c8895a2afa89b8f827568544a3f34281c1003000004101d2935404b556a7683909da9b4aa95887b6e6255483b2f22150800000814212e3b4754616e7b8795a0acab9e9184786c6053463e332b2722252a2f35404a54606c7884919eabb8afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d49535b666d78828f949fa6a09590837a6d685d564c433a31281f150c030000000000000000000006121f2b37434e58626f7c89939da8aca09690837a706b6561605b575e61646a6f78818e949faaa89f92867b6e62554b4034281c1004000814202c37414b53595b5954524c48433d39352f2b261f1c17110e0903000000000000000000000000000000000000000000000000000000000000000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c01000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d27272727272727272727272727272727272727272727272727272727272423211c171008000000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f433633302f2c28211a11080000000000000000000000000916222f3c4955626f7c8891908f8e8d8c8b8a898887868583909daa9f92878385868788898a8b8c8d8e8f9091877a6e6154473b2e21140800000b17222d38414d57606a707e87939fa0958f82786e787f858b9095979a9c9d9f9f9f9f9e9d9c9a9795908c868079706b625b514940362c21180e030000000000000000000000000000000000000000000000000000000000000b151e29333d47515b606d79839198a2aaa0968f82776c60594f453b30271d1207000000000000000000000000000000131f2c3946525f6c7985929facb8b0a8a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a1a6aeb8ac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c424d57606d78839099a4aa9e948a7e71685d52473d303c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9ada39c999999999999999999999999999999999999999999999999999999999999999994877b6e6154483b2e2115080000000000000000000000000714212e3a47535f6a7884919eaa9e918477695f53463a2d2114060000000000000000000916222f3c4955626f7c8895a2afaa9d908377665c5044382c1f1206000006131f2c3845515d677885919eabaea298877a6d6154473a2e21140700000714202d3a46525e697784909dabada197897d70635a50453d37332d3136394045515c66717d8a96a1adb9afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d414a545c666d79828f949fa7a09590837a6d685d554b433931271e150c030000000000000000000814212e3a47535f6a76828f9ca5afa49a91847a6d6860595553504d5254585f666d78828f98a3aea3998d8074675c5145382c1f130600040f1a252f3941484d4e4c4746413a38322c29241d1a15100c060000000000000000000000000000000000000000000000000000000000000000000000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d0400000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343431302d28221a12080000000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f433e3f3d3c38332c231a110800000000000000000000000915222f3c4855626f7c8584838281807f7e7d7c7b7a79787a8794a19f92867978797a7b7c7d7e7f8081828384867a6e6154473b2e211408000006111b262f3b454e58616c727f8b929d9f948e817b838c92979d9fa7a8a09e9c9b9a9b9c9d9fa4a7a09d98928d847d726d635b51483e332a201509000000000000000000000000000000000000000000000000000000000000030c17212b353f45515d676e7c86929fa4a89e948c7f736b60574d43392e231810070000000000000000000000000000131f2c3946525f6c7985929facb8a89e969393939393939393939393939393939393939393939393939393939393939393959ca6b1ac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255483c46535f69727f8c95a0aba2988f82766c61564c41352f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9b5ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a194877b6e6154483b2e21150800000000000000000000000006121f2b37434e586774818e9aaba096887b6e6155483b2e23170c0000000000000000000916222f3c4955626f7c8895a2afac9f9286796d6053463a2d20130900000714202d3a4753606d7a86939facab9f928578685e5246392d201307000005111e2a36424d5666737f8c99a3afa99c8f82766c61574f46443f414142464b515a606d7883919da8b0b8afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40424a545c676d79829095a0a7a09590837a6d675d554b433930271e150c0300000000000000000815222f3b4855626e7b88949fabac9f93877d6f685d564f4846444246484e545c666e7b86929facab9f9285796d6053463a2d201307000009131d272f373d40423f3a3936302c27201d18120f0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d0000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605347404040404040404040404040404040404040404040404040404040404040403e3c39332c241a100500000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f464a4c4a48443e352c231a1108000000000000000000000815212e3b47535f6a6f7877767574737271706f6e6d676e7b8894a1a39886796c6c6d6e6f7071727374757677796e685e5246392d2014070000000a141d29333c464f59626d74808d939e9d938e8690959ea2a8a19e9896918f8e8d8e8f91939a9d9fa7a29f9691877f736d635a50453c31261a0e05000000000000000000000000000000000000000000000000000000000000050f19232935414b555f6a717e8a929da6a69f93877d70695e554b40342822190e0400000000000000000000000000131f2c3946525f6c7985929facb8a2968c87868686868686868686868686868686868686868686868686868686868686868a95a1adac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f62554844505a616e7b86929fa7a79f92867b6e615a50443a302f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e211508000000000000000000000000020f1a26313e4a5764717d8a99a4a8988b7e7265544a3f34281c100300000000000000000916222f3c4955626f7c8895a2afaea398887c6f6255493c31251a0d06030615222f3c4855626f7c889aa4afaa9d9083776a564c4135291d11050000020e1925303b4854616e7b87929fabab9f948a7d706a60595350494e4e4d53555d606c73808c959c9ea6b0afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4038424b555d676d7a839095a0a79f959082796d675d554b433930271e150c0200000000000006121f2b37434e586774808d9aa6b0a89b8e82756b60564c443d3937363a3c424a545f6975818e9baba7a2978a7d7064574a3d3124170a0000020b151d252c313435332e2d2a251e1b16100d070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e050000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49453e362c22170c00000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c4f51575957554f473e352c231a110800000000000000000006121f2b37434e585f626c6b6a696867656463626160626f7b8895a2aa93867a6d606061636465666768696a6b6c615e564c41362a1e1105000000020b17212b343e47515b606c78818f959f9d999299a0a7a49f96918b8884828181818284878b90959ea2a8a199928c7f736c61574e42372b22170b00000000000000000000000000000000000000000000000000000000000000071118242f3a434e58616c73808d949fa8a49992857b6e675c51453f342b20160b02000000000000000000000000131f2c3946525f6c7985929facada093877a797979797979797979797979797979797979797979797979797979797979788693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6255484c56616c76828f98a2aba0958c7f72695e53483e32282f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9a79d95939393939393939393939393939393939393939393939393939393939393939393877b6e6154483b2e211508000000000000000000000000000a14212e3a4754616d7a86939fa89b8f8275665c5044382c1f120600000000000000000916222f3c4955626f7c8895a2afb4aa988b7f7265574d42362a1f161210121c2834404a5465717e8b98acb6a79b8e8174685b4e413025190d010000000914202d3a46525e6975818e99a3afa69e92857c6f6b62605b535a5b575e61676d737e8893948f949eaaafa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d403039434b555d686d7a839096a0a79f959082796d675d554b423930261e140b0200000000000815212e3b47535f6a7884919eabaca096897c6f62594f443a322d2b2a2d3038424d5763707d89999b9a99988d8073665a4d4033271a0d000000030b131a202527282621201d19130f0a04010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c1105000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c515b63666361594f473e352c231a11080000000000000000030f1b26323c464e53555f5e5d5c5b5a595857565556626f7c8995a2a194877a6e615455565758595a5b5c5d5e5f54524c443b3025190d0100000000050f19222c353f44505b666d79839096a1a39fa3aba49a938c847f7b777675747475777a7e838a9297a1a8a39f918a7e716a5f53473e33281c10040000000000000000000000000000000000000000000000000000000000000007131d28313c46505a606d78828f96a1aba1979083796d605a50463c32281d140a000000000000000000000000131f2c3946525f6c7985929facada093877a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f625548525d68717e8a949faaa4999083786d60574d42362c232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868686868686868686868686868686868686867b6e6154483b2e211508000000000000000000000000000713202d3946525d687683909da99f9285796d6053463a2d20130800000000000000000916222f3c4955626f7c8895a2afb6a99c8f8376695e53463c3128201f1c1f232c3844515c6675818e9ba8b3a9988b7f7265584c3f322519080000000005121e2a36424d57626e7c87929fa7ada19791857d746f6c6568676869696e7279808893958f828f9ca8afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40333039434c565e686e7a849196a1a79f948f82796d675c544b423830261d140a00000000000915222f3c4855626f7c8896a1adaa9e9184776a6054473d3228201f1e2026303c4753606d79868f8e8d8c8b8b8276695c504336291d100000000002090f14181b1b191413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b02000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6767676767676767676767676767676767676767676767676767676767676767676764615a5045392d211408000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695c5b636d72706b61594f473e352c231a110800000000000000000a15202a343c4347485251504f4e4d4c4b4a49495663707c8996a3a194887b6e615548494a4b4c4d4e4f5051524746413b32291e140800000000000007101a2328333f4a545d676e7a84919eabacafa49a93888079726e696968676869686d71767e859196a1aaa39f92867c6e625a5044392d20150a00000000000000000000000000000000000000000000000000000000000000010c161f2a333e44505c666d7a849199a3a99f958e81746c62584e443a2f261c11060000000000000000000000131f2c3946525f6c7985929facada093877a6d606060606060606060606060606060606060606060606060606060606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f62554f59606d7a85929ea6a89f93877c6f665c50453b3124232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867979797979797979797979797979797979797979797979797979797979797979797976695e52463a2d2014070000000000000000000000000005111d2935414c566673808c99aaa298897c6f6356493c2f24190d01000000000000000916222f3c4955626f7c8895a2afb9ac9f93877b6e61584e433a312d2c282b2e343f4953606d7985929eabada197887c6f6255493c2f22160900000000020e1a25303b47535f6a73808d95a0a8a9a1979188817c797674747476787b7f848d939890837e8a97a3afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d403328313a434c565e686e7b849197a1a69f948f82796d665c544a42382f261c1106000000000c1925323f4c5865727f8b98a8b2a79a8d807467584e43352b20161212151f2c3845515c677481828180807f7e7d7063564a3d3023170a00000000000004080c0e0f0c07070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a100600000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada09386797373737373737373737373737373737373737373737373737373737373737373737373716c6155493c3023170a000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f82766958636d727f7d706b61594f473e352c231a110800000000000000040e18222a32373b3c4544434241403f3e3d3d4a5763707d8a96a3a295887b6f6255483c3d3e3f4041424344463b3936302920170d0200000000000000081117222d38424b555e6873808c99a6b3ac9f93887e736d67615f575b5a5b565e61656c717b849198a2aea2988f82766c6155493c32271b0f0300000000000000000000000000000000000000000000000000000000000000040d182128343f4a545e686f7c87929fa5a79d938b7e716a60564c42382d22170f0600000000000000000000131f2c3946525f6c7985929facada093877a6d605453535353535353535353535353535353535353535353535353606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f625554606b74818e97a1ada1968d80746a60544a3f33291f232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e120500000000000000000000000000010d1924303c4956636f7c8998a2aa998c807366564c4135291d1104000000000000000916222f3c4955626f7c8895a2afbbafa4998d80746a5f554c433d3a383438393f44505b65717d8a97a2adab9e9285786c605346392d201306000000000009141f2b37434e58606d79839096a0a8a9a19a938e8985828181818284878c91969992867c7d8a97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d40332628313a444c565e696e7b859197a1a69f948f82786d665c544a42382d22170b000000030f1b27333f49536875818e9ba8b4aa978a7d7064574a3d3224190d0505101c2934404b55646f74757474737271706b6054483c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c11080000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb3a79a8d8080808080808080808080808080808080808080808080808080808080808080808080807e7164574a3e3124170b000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695f6a727f8c867d706b61594f473e352c231a11080000000000000006101820262b2e2f3938373635343231313e4a5764717d8a97a4a295897c6f6256493c3132333435363738392e2d2a251e170e0500000000000000000006111c28343f4a54606d7a85929eabb7aa9d91847a6d665d55534d4e4e4e4c52545a61696f7c86929fa8aa9f948a7d7064584e43372b1f13060000000000000000000000000000000000000000000000000000000000000000060f17232e38424c56606a727f8b939da7a59f92867c6f685e544a3f332821180d03000000000000000000131f2c3946525f6c7985929facada093877a6d605447464646464646464646464646464646464646464646464653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f62555c666f7d88939fa9a59e9184796d60584e42382e2117232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60606060606060606060606060606060606060606060606060606060606060605f524d453b30251a0e0200000000000000000000000000000813202d3a4653606d7985929fa99d908376685d5245392c201307000000000000000916222f3c4955626f7c8895a2afb4aba39f92877c6e675d554f4846443f44464a5059606c7883909da9b1a79a8e8174655b5044372b1f12050000000000030f1a26313c45515c676e7b8491969fa4aca49f9b97928f8e8d8e8f9196999e9892877e717e8a97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261f28323b444d575f696f7c859298a2a69e948f81786d665c544a3f33281c0f03000005121f2b3744505b657784909daaaea298877b6e6154483b2e21150800000c18232f3943535d64686968676665646360594f44382c2014070000000000000000000000000000000000000000000406071013131313131310100d0a050000000003060809121313131313130d0c0a0702000000000000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f827669626e7b869292877d706b61594f473e352c231a110800000000000000060e151b1f21222c2b2a2928272625323e4b5865717e8b98a4a396897c706356493d3025262728292a2b2c21201e19140d050000000000000000000006121f2b3844505c66727f8c97a1adb8aca0968f81786c605b514842414141464750575f6a727f8c96a1ada69d9083766a6054473b2e22150900000000000000000000000000000000000000000101010101010101010101010006111c26303a444e58626d74818e95a0a9a39891847a6d665b50443e332a1f150b010000000000000000131f2c3946525f6c7985929facada093877a6d6054473a39393939393939393939393939393939393939393a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca295887b6f6257606d7984919aa4a99e938a7d70675d51463c30261c16232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60535353535353535353535353535353535353535353535353535353535353534846423b33291f140900000000000000000000000000000006121f2c3844505c6675828f9ba89f92867a6d6054473a2d211409000000000000000916222f3c4955626f7c8895a2afaea39992999083796d6760595553504a5053545c606b727f8b959fabaca095897c6f6353493f33271b0f030000000000000a15202934404b555e696e7b848e939a9fa3aba9a19e9c9b9a9b9c9e9f9d9590867e70717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d403326162029323b454d575f6a6f7c869298939393938e81786d665b5044382b1f120600000613202d394653606c7985929facab9f928578695e52463a2d201407000007121d2731414b53595b5c5b5a59585856544f473d33271c100400000000000000000000000000000000000001070c1013141d2020202020201d1c1a16110a03040a0f1215151f2020202020201a1916130d07000000000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a01000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000060606060e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8e8174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276695f6a707e869292877d706b61594f473e352c231a0e0400000000000000040a0f1215151f1e1d1c1b1a1925323f4c5865727f8b98a5a3968a7d7063574a3d3024191a1b1c1d1e1f1414110d080200000000000000000000000713202d3a4653606d7985919ea9b3b2aca89e938d80746d625a50463d3336393e454e58606d7984919eabab9f95887c6f6255493c31251a0e02000000000000000000000000000000010507070d0d0d0d0d0d0d0d0d0d0d0d0d0d0a141e29323d46515b606d79839097a1aaa1968f82786c60594f453c31271d12070000000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca195887b6e625f69737f8c95a0aca2978e81756b61554b40342b1e1516232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60534746464646464646464646464646464646464646464646464646464646463b3a36302921170d0200000000000000000000000000000003101c28343f4a5465727e8b98a8a3998a7d7064574a3d31261a0e020000000000000916222f3c4955626f7c8895a2afac9f928692958f827a706b6562605c545b6062666d727d86929fa7b0a69d9083776b605441382d22170b00000000000000030c18232f39434d575e696e7981878f92999b9d9e9f9f9f9e9d9b9895908a837c706c717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a172029333c454e58606a6f7d868686868686868681796c605346392d20130600000714212e3a4754616d7a8798a2aeaa9d9084776a574d42362a1e12050000010b151f2f3941484c4e4f4e4d4d4c4b4a48443d352b21160b000000000000000000000000000000000000030b12181d1f202a2d2d2d2d2d2d2a2926221c150d0e151b1f21222c2d2d2d2d2d2d2625231e19120a010000000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a0100000000000000000000000b1825313e4b5864717e8b97a4aca89b8e8175685b4e4235281b0f0200000000000306060c13131313131b2734414e5a6774818d9aa7aca4978b7e7164584b3e3125180b0013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8e8174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f82766958616c707d869292877d706b61594f473e352c20160c020000000000000000030608091211100f0e0d1926333f4c5966727f8c99a5a4978a7d7164574a3e3124170d0e0f1011130807050100000000000000000000000000091623303c4956636f7c8997a1adb2a8a19ea19d928b7f726c61584e453c322d333c44515c66727f8c99a7b1a79a8d807367574d42362a1e12050000000000000000000000000002080d1113141a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a17202b343f45515c676e7b859299a4a89f948d80736c61574d43392f2418100700000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2120202020202020202020202020202020202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca194887b6e61626e7b86929fa8a69f92857b6e61594f433a2f22190c16232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a393939393939393939393939393939393939393939393939393939392e2d2a251f170f0500000000000000000000000000000000000c17232e3b4855616e7b8896a0ab9a8d817467574d42362a1e12050000000000000916222f3c4955626f7c8895a2afa6998c7f8c94948f847d76726f6d666b666c6e72787f879298a3aea99f948a7e7164594f442f261b1106000000000000000007121d27313b454d575e676d747c82868b8e909192929291908e8b88837e786f6a64717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0e17212a333c464e58606b6f7979797979797979756c665b5044382b1f120600000815222f3b4855626e7b8895aab4a99c8f8276695c4f4330251a0e02000000030d1d262f363c4041424141403f3e3d3c38332b231a0f050000000000000000000000000000000000030d151d24292c2d363939393939393736322d271f161820262b2e2f3939393939393933322f2a241c130a0000000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f191109000000000000000000000000000b1825313e4b5864717e8b979f9f9f9b8e8175685b4e4235281b0f02000000060b0f12131920202020201b2734414e5a6774818d9a9f9f9f978b7e7164584b3e3125180b0013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276696464646b707d859292867d706b61594f473d32281e130800000000000000000000000006050403020d1a2633404d596673808c99a6a4978b7e7164584b3e3125180b02030405060000000000000000000000000000000005111d2935414c566773808d9aa9b2a8a0969196a19f93877e706a60574d443a312834404a54616e7b8795a0acaa9e918477695e53463a2d211407000000000000000000000000050c13191d2021272727272727272727272727272727272727272934404b555e69707d87939fa6a69f93887d70695f554b40352922190e05000000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114131313131313131313131313131313202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca194877a6e616c76828f98a3ab9f948b7e72685e52473e31281d100916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21201e1a140d050000000000000000000000000000000000000614212d3a46535f697784919eaa9e918477695f53463a2d2114060000000000000916222f3c4955626f7c8895a2afa396897d828f97969189837f7b79787778797b7f848b9299a3aaaaa2978f82766c6155473d321d140a000000000000000000010b151f29333b454d555d606a6f757a7e8183858586858583817f7b77716d665f64717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0f18212a343c464f5960636c6c6c6c6c6c6c6c68605b544a3f33281c0f030000091623303c4956636f7c8996a2afa89b8e8275685b4f4235281c0900000000000b141d252b303335363534333231302f2c27211a11080000000000000000000000000000000000020c151f272f35383a4346464646464643423e3831281f222a31373a3c45464646464646403f3b352e251c120700000000000000000000000000000000080e171f252a33383d44484d5254545c60626567686a6b6b6c6c6c6b6a6a68666462605c5454524c47433c383229241d160d0700000000000000000000000000000b1825313e4b5864717e8b93939393938e8175685b4e4235281b0f0200020a11171c1f20262c2d2d2d2c202734414e5a6774818d93939393938b7e7164584b3e3125180b0013202c3946535f6c79869293939393939393939393939393939393939393939393939393939393939393939393939393939393938e8174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f8f8276717171717171717c859292867d706b61594f443a3024190d01000000000000000000000000000000010d1a2734404d5a6773808d9aa6a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000713202d3946525d687784919daaaca09691849197a19992867c6f695f564c43392f2e3946535e697784919daaaca096877b6e6154483b2e2115080000000000000000000000050e171e252a2d2e34343434343434343434343434343434343434342f39434d57606b737f8c939ea8a49a92857b6e675d51453f342b20170c030000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070606060606060606060606060713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca094877a6d68717e8b949faaa3999083776c60564d41352c1f160c0916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d2020202020202020202020202020202020202020202020202020201514120e09020000000000000000000000000000000000000005121e2a36424d576774818d9aaba096887b6e6155483b2e23170b0000000000000916222f3c4955626f7c8895a2afa3968a7d7b8592999e95908b888685848486888c91959fa3abaaa29892857b6e615a5045352b210b0200000000000000000000030d172129333b434b51586062686e71747678797978787674726e6964605c5464717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d060f18222b343d474f54565f606060606060605b53504a42382d22170b0000000a1723303d4a5663707d8996a3b0a79a8e8174675b4e4134281b0e0100000000020b131a202427282928272625252322201c160f080000000000000000000000000000000000000a141e27313940454750535353535353504e4a433a31212a343c434748525353535353534d4b4740372e24190d0200000000000000000000000000000000050d141a21272c33383b4246474a505355585a5c5d5e5f5f5b60666c6c6c6c6c6a5c544a4745413a37312b272018130c040000000000000000000000000000000b1825313e4b5864717e868686868686868175685b4e4235281b0f00060b141c22282b2d333939393939382b34414e5a677480868686868686867e7164584b3e3125180b0013202c3946535f6c7987868686868686868686868686868686868686868686868686868686868686868686868686868686868686868174675b4e4134281b0e010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f90837e7d7d7d7d7d7d7d7e7f869392867d706b61564c4135291d1105000000000000000000000000000000010e1b2734414e5a6774818d9aa7a5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000714212e3a4754616d7a8796a0acaa9e91847b859298a29892857b6e685e554b42382d36424d576774818d9aa7b2a8978a7e7164574b3e3124180b00000000000000000000020c1720293036393a4040404040404040404040404040404040404040404040454f59606c77828f96a0aaa2979083796d605b51463d32291e150a0000000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca093867a6d6d7a85929ea6a89f92867c6e655b50443b30231a0d040916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d20141313131313131313131313131313131313131313131313131308070502000000000000000000000000000000000000000000020e1a26313d4a5764707d8a99a3a8988b7e7265544a3f34281c100300000000000916222f3c4955626f7c8895a2afa4978a7d717d8792989f9d9899929191919298989da0a8aba79f9892867d70695f53483e3323190f000000000000000000000000050f172129313a40454e54565e6164686a6b6c6c6c6b6a6865615f5753505864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00061019222b353d43484952535353535353534e46443f382f261c11060000000a1724303d4a5763707d8a96a3b0a79a8d8174675a4e4134271b0e01000000000001090f14181a1b1c1b1a1a1918171614100b0500000000000000000000000000000000000006111c263039434b51535d6060606060605d5b554d433829333c464e53555f6060606060605957524940352a1e1307000000000000000000000000000000000002090e161c21272c30363a3b3f4446494b4d4f5051575f666c72797979797975665c504439352f2b26201b160d0701000000000000000000000000000000000a1724303d4956626c7179797979797979756f65594d4034271b0e090f181d262d3338393f4646464646453834404c58646e7479797979797979716c6256493d3024170a00121f2c3845525e6a757979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746f64594c4033271a0d010000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f95908a8a8a8a8a8a8a8a8a8c93999892867d70685d5246392d201307000000000000000000000000000000020e1b2835414e5b6874818e9b9f9f998c807366594d4033261a0d000000000000000000000000000000000000000000091623303c4956636f7c8996a8b2a89b8e81757c869299a19791847a6d675c544a3f33313e4b5865717e8b98a4b1a6998d8073665a4d4033271a060000000000000000000008131e29323a4146474d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d505b656d7a849198a2a9a0958e81756d62594f443b30261c110600000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca39986796d75818e97a2aca0968c80736a5f53493f32291f1108000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0b0a080500000000000000000000000000000000000000000914212d3a4754606d7a86929fa89b8f8275665c5044382b1f120600000000000916222f3c4955626f7c8895a2afa4978a7e71707d8690959d9fa39f9e9e9e9fa3aaa9a8a79f9d9590867d706b60574d42362c22110700000000000000000000000000050f171f282f353d43474c5254585b5d5e5f5f5f5e5d5b5855534d464b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000071019232b32383b3c4646464646464646423938332d261d140a000000000a1724303d4a5763707d8a96a3b0a79a8d8174675a4e4134271b0e010000000000000003070909131211100f0e0d0a09070400000000000000000000000000000000000000091317232e38424b555d60696c6c6c6c6c6c6a665f554a3e323b454e585f626c6c6c6c6c6c6c66635b52473b2f23160a00000000000000000000000000000000000000050b10161c1f252a2d2e34383a3c3e444d525b62696e787f8686868687796d6053463a2d241e1b150f0a040000000000000000000000000000000000000815212d3945505a62646c6c6c6c6c6c6c68655d53483d3124180d1419212a2f383f44464c535353535352443f3848535c64676c6c6c6c6c6c6c64625a5045392d21150800111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828f9393939393939393939393979fa4a39892857a6d6154473a2e211407000000000000000000000000000000020f1c2835424f5b6875828e939393938d8073675a4d4034271a0d0100000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a6998c7f73707e87939fa0969083796d665b50443f363c4956636f7c8996abb5a89c8f8275695c4f422e23170b000000000000000000010d1925303a444c52545a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a535d686f7c86929fa4a79e938b7f726b60564c42382e23170c00000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929fac9f928679707d89939ea9a59d9184796d60584e41382d20170d00000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171714110c050000000000000000000000000000000000000613202c3945515d677683909ca99f9285796d6053463a2d20130800000000000916222f3c4955626f7c8895a2afa4978a7e716b707c838a9095989b9d9e9f9f9f9e9d9b9895908a837b706b60594f453b31241a10000000000000000000000000000000050d161d242932373b4146474b4e505252535252504e4c4846423e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000007101921272c2f303939393939393939352d2b28221c140b02000000000a1723303d4a5663707d8996a3b0a79a8e8174675b4e4134281b0e010000000000040a0f131516201f1e1d1c1b1a171614100b050000000000000000000000000000000009121b2528343f4a545d676d767979797979797671665b4e423b444d575f6a6f78797979797979736d63574b3f3225190c000000000000000000000000000000000000000000050b1014191e202429323a414650565e616d727b828c929992877e71665c5044382b1f130f0a04000000000000000000000000000000000000000005111d29343e48505658606060606060605b59534b41372c200e171f252a333b424a5053595f6060605f5e504a42414a53585a60606060606060585650483e34291d1105000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060605b59534a41362b201408000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100101c2936434f5c6976828686868686868686868686868b93999992877e70685d5246392d20130700000000000000000000000000000003101c2936434f5c6976828686868686868074675a4e4134271b0e0100000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b1a4978a7e716c727f8b929d9f958f81786c605b51483e3b4754616e7a8799a4afaa9d9084776a544a3f34281c1003000000000000000005111d2a36414c565e6167676767676767676767676767676767676767676767676767676767676a717e8a929daba59f92877d6f685e544a3f34281c1003000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929fac9f9285797984919ea5a99d93897d70675c51463c2f261b0e0500000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a2d27272727272727272727272727272727272727272727272727272727272423211c171008000000000000000000000000000000000004111d2935414c5566737f8c99a9a297897c6f6356493c2f24190d01000000000916222f3c4955626f7c8895a2afa4978b7e71646a6f787e83888b8e909192929291908e8b88837e766e6960594f473d33291f120800000000000000000000000000000000040c131820272b3036393b3e4143454646454543413f3b3a363e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000000070f161b1f22232c2d2d2d2d2d2d2d28201f1c17110a020000000000091623303c4956636f7c8996a2afa79b8e8174685b4e4135281b060000000000070f161b1f22232c2b2a292827262322201c160f08000000000000000000000000000008111b242d373f44505c666d798286868686868683766a5d5043434c565f696f7c85868686868686807366594d4033261a0d00000000000000000000000000000000000000000000000710191f282f353e444c525a61696e767f8690949a93877e716c61544a3f34281c100100000000000000000000000000000000000000000000000c17222d363e45494b535353535353534e4d4841392f251a19202930363f454d545b60666c6c6c6c6c6a5c544a3f41484c4e535353535353534b49453e362d22170c00000915202b353f474e5253535353535359636b6c6c6c6c6b64615a534d53535353535353534d535b60656c6c6c6c6b686157535353534e4c4841382f251a0f03000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e11000f1c2835414e5a6670767979797979797979797979797e869392877e706c61564c4135291d1105000000000000000000000000000000020f1b2835414e5a657076797979797979746e64584c4033261a0d0000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8afa396897c70636d74808d939e9e938d80746d625a50463d4653606c7986939facab9e928578665c5044382b1f120600000000000000000713202d3946525e686d7373737373737373737373737373737373737373737373737373737373737374808d99a3aea39991847a6e665c5044382c1f1206000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929fab9e918578808d96a0aca1978e81746b60554b40342a1d140a0000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343431302d28221a120800000000000000000000000000000000010d19242f3c4956626f7c8997a2a9998c807366564c4135291d1104000000000916222f3c4955626f7c8895a2afa4978b7e71645f666d71777b7e8183858586858583817e7b76716c615f574f473d352b21180d00000000000000000000000000000000000001070d151b1e252a2d2e31353738393939383735322e2d313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000040a0f1315161f202020202020201b13120f0b06000000000000000915222f3c4855626f7b8895aab4a89b8f8275685c4f422d22170b0000000007101921272c2f3039383736353433302f2c27211a110800000000000000000000000007101a232d363f49525c606d78828f94939393938c807366594d434c565e686e7b85919793939992877d706356493d3023160a00000000000000000000000000000000000000000000040f19222b313a41454f565e616c717b828b92989a93887e716c615a5042382e23170b00000000000000000000000000000000000000000000000006111b242d34393d3e4646464646464642403d372f271d1e2529323b424651575f666c72797979797975665c5044383c4041464646464646463e3d39342d241b11060000040f19242d353d42454646464646525e6b757979797978706c615f57514b434646424b51575f656c71787979797873685c5046464641403c362f261d130800000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e11000d1925323d49545e66696c6c6c6c6c6c6c6c6c6c717e879392877e716c615a50443a3024190d01000000000000000000000000000000000d1925313d49545e65696c6c6c6c6c6c67645c52473c3024170b000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9aea295887b6f62606c78818f959f9d928b7f726c61584e4544505b667885929fabac9f9386796d6053463a2d20130700000000000000000714212e3a4754616d7a80808080808080808080808080808080808080808080808080808080808080808086929facaba1969082786d6053463a2d201307000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faa9d91847b87929fa8a69e92857a6d61594f43392e22180b020000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d605347404040404040404040404040404040404040404040404040404040404040403e3c39332c241a1005000000000000000000000000000000000813202d394653606c7985929ea99d908376685d5245392c201306000000000916222f3c4955626f7c8895a2afa4978b7e7164545c6064696e72747678787979787675726e6964615a534d453d352b23190f060000000000000000000000000000000000000000040a0f14191e202125282a2b2c2c2c2b2a28252225313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d000000000000000307090913131313131313130f0606030000000000000000000714212e3a4754616d7a8798a2aea99c8f837669544a3f33281c0f030000040f19222b32383b3c464544434241403d3c38332b231a0f0500000000000000000000060f19222c353e48515b636e74818e949ea69e948e81746e63574b4b555d686e7a849197a1a49f93877e716b6054483b2f221609000000000000000000000000000000000000000000000a16212b343d434b515961686d757e858f949f9f93887f716c625a50483e30261c11060000000000000000000000000000000000000000000000000009121b22292d3031393939393939393534312c2518202830353e444d525b62696e787f8686868687796d6053463a2d33343939393939393931302d29221b12090000000008121b242b313638393939394653606c7987868686847d756e69605c554f46454f545c60696e777e8586868685786b5f524539393433302b251d140b0100000000000000000000000000000c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e11000915212c38424c545a5c6060606060605a626c717e879392877e716c615a50483e32281e130800000000000000000000000000000000000915212c38424c545a5c6060606060605a58524a41362b1f1408000000000000000000000000000000000000000003101d2a3643505d697683909ca9aea194877b6e615b666d79839096a09f93877e706a60574d444a546b7884919eabafa49a867a6d6053473a2d20140700000000000000000815222f3b4855626e7b888d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d9299a3aeb2a99f94897d7063564a3d3023170a000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faa9d9083839099a3aa9f948a7e71685d52473d30271d0f06000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49453e362c22170c0000000000000000000000000000000006121f2b3844505b6675828e9ba89f92867a6d6054473a2d211409000000000916222f3c4955626f7c8895a2afa4978b7e7164585053575f6165686a6b6c6c6c6b6a6865615f57555046423b332b231a1108000000000000000000000000000000000000000000000002080e111414181b1d1f1f201f1f1d1b191825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d00000000000000000000000606060606060606020000000000000000000000000613202d394653606c7985929facaa9e918477665b5044382b1f120600000a16212b343d434849535251504f4e4d4a48443d352b21160b000000000000000000050f18222b343e47505a626d73808d939da69f948f82786d605c524a545c676d7a839096a0a49c918b7f726c61594f44382c201307000000000000000000000000000000000000000000030f1b27323d464e555d606b707a818a92979f9b918b7f726d625a50483e362c1e140a0000000000000000000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d282724201d2429323a414650565e616d727b828c929992877e71665c5044382b27272d2d2d2d2d2d2d2524211d17110900000000000009121920262a2c2c2d2d313e4b5864717e889396918a827b736d67615953525960666d737b828b929792877e7064574a3d312d282724201a130b020000000000000000000000020507080c1926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e110005101b26303a42494e4f535353534e58626c717e879393877e716c615a50483e362c20160c02000000000000000000000000000000000004101b26303a42494e4f5353535353534e4c4741382f241a0e03000000000000000000000000000000000000000004111d2a3744505d6a7783909daaada194877a6e61545d676d7a849197a19992867c6f695f564c515e6b7784919eaab6a094877a6d6154473a2e21140700000000000000000815222f3b4855626e7b88959a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9fa3abb5bbb0a6968a7d7063574a3d3024170a000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929fac9f928790959faba2988f82766c61564c41352b1e150b00000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c1105000000000000000000000000000000030f1c28333f4a5465717e8b98a7a3998a7d7064574a3d31261a0e020000000916222f3c4955626f7c8895a2afa4978b7e7164584b464d5355585b5d5e5f5f5f5e5d5b5855534d49453e36312a211a11080000000000000000000000000000000000000000000000000000020507080b0e101213131212100e0c1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b657784909daaac9f9285796c605346392d20130600030f1b27323d464f54565f5e5d5c5b5a5956544f473d33271c100400000000000000040e17212a343d464f59616c727f8c929ca5a0959082796d665c5044505c666d79829095a0a59d928c7f736d625a50473d32271b100400000000000000000000000000000000000000000007131f2c38434e5860676d747d858e939fa29b918b7f726d625a50483f362d241a0c0200000000000000000000000000000000000000000000000000000000060c11151718202020202020201b1b191f282f353e444c525a61696e767f8690949a93877e716c61544a3f34281c1b20202020202020181715110c060000000000000000080f151a1d1f202024303d4956626c717f8b919e948f868079706b615f5d606b6f797f868f949f93887e716c6155493c30231b1a18140f08010000000000000000000003090e121415191926333f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100000a141e2830383d414346464647535f6a717e879393877e716c615a50483e362c231a0e04000000000000000000000000000000000000000a141e2830383d414346464646464641403c362f261d130800000000000000000000000000000000000000000004111e2b3744515e6a7784919daaada094877a6d6154555e686e7b859298a29892857b6e685e554b5e6a7784919daaada194877a6e6154473b2e21140800000000000000000815222f3b4855626e7b8895a1a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a7acaeb5acacaca3968a7d7063574a3d3024170a000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929faca39992999fa7a79f92867b6e615a50443a3023190c0300000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada093867a6d6767676767676767676767676767676767676767676767676767676767676767676764615a5045392d211408000000000000000000000000000000000b17222d3b4854616e7b8795a0ab9a8d817467574d42362a1e12050000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e4246484b4e505252535252504e4b4847423c39332a261f180f0800000000000000000000000000000000000000000000000000000000000000000204050606060504020b1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000030f1b27333f49536875818e9ba8aea398887b6e6255483b2d22170b0407131f2c38434f5960636c6b6a696867666360594f44382c201407000000000000040d162029333c464e58616b717e88939fa4a19690837a6d675d544a525c606d78818f949fa69e938d80746d635b51483e352b21160b000000000000000000000000000000000000000000000915222e3b4854606a6f79818a91979ea39c918c7f726d625b51483f362d241b12080000000000000000000000000000000000000000000000000000000000000005080a0b131313131313130f19222b313a41454f565e616c717b828b92989a93887e716c615a5042382e23170b131313131313130b0a0805000000000000000000000004090e11121315212d3945505a626d727f8b919c98928c847d756e69686d747c838c92989c918b7f726c625a5044392d20140d0b08030000000000000000000000060e141a1e2122252526333f4c5966727f8c99a5aa9d9184776a5e5144372b1e110000020c161e262c32353639393c4855626f7b869393887e716c615a50483e362c241a11080000000000000000000000000000000000000000020c161e262c3135363939393939393433302b241d140b0100000000000000000000000000000000000000000004111e2b3744515e6a7784919daaada194877a6e61544c565f696f7c869299a19791847a6d675c545e6b7784919eaaada094877a6d6154473a2e21140700000000000000000815222f3b4855626e7b88959f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f968a7d7063574a3d3024170a000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929facaba39fa3ababa0958c7f72695f53483e32281e11070000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facada09386797373737373737373737373737373737373737373737373737373737373737373737373716c6155493c3023170a000000000000000000000000000000000614202d3a46525e697784919daa9e918477695f53463a2d2114060000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e363a3b3f4143454546464543423f3b3a37312d28221a140e060000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0ada6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000b17222d3f4c5865727f8b98a8b2aa978a7e7164544a3f33281b13101014222f3b4854606b6f79787776757473706b6054483c2f2216090000000000030c161f28323b454e58606a707d87929aa4a19791847b6e685d554b515b636e74818e939ea69e948e81776c605b51493f362c23190f04000000000000000000000000000000000000000000000916232f3c4956626f7c848e9393939393918c7f726d625b51493f362d241b12090000000000000000000000000000000000000000000000000000000000000000000000000606060606000a16212b343d434b515961686d757e858f949f9f93887f716c625a50483e30261c110600060606060606000000000000000000000000000000000001040605111d29343e48505a626d727f8c929c9f96918a827b73717a818891959f9d928c7f736d625a50483e33281c100400000000000000000000000000060f181f262a2d2e323232333f4c5966727f8c99a5aa9d9184776a5e5144372b1e11000000040c141b212528292d2e3a47535f6a73808c887e716c625a50483e362c241a120800000000000000000000000000000000000000000000040c141b212528292d2d2d2d2d2d2726241f1a130b020000000000000000000000000000000000000000000004111d2a3744505d6a7783909daaaea194877b6e6154484d57606a707e87939fa0969082796d665b5e6b7884919eabb4aa93877a6d6054473a2d21140700000000000000000815222f3b4855626e7b88939393939393939393939393939393939393939393939393939393939393939393939393939393938a7d7063574a3d3024170a000000131f2c3946525f6c7985929facada093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929facb5afacafafa4999083786d60574d42362c20160c000000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb3a79a8d8080808080808080808080808080808080808080808080808080808080808080808080807e7164574a3e3124170b0000000000000000000000000000000005121e2a36424d576774808d9aaaa096887b6e6155483b2e23170b0000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312d2e32353738393939383735322e2d2b261f1c170e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000714212d3a4754606d7a8793a0aca6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000616222f3c4955626f7c8896a1ada79a8e8174665b5044382d241f1c1d1f27303c4956636f7d868584838281807d7063564a3d3023170a00000000020b151e28313a444d575f6a6f7c869299a3a29892857b6e695e564c505a626d73808d939da59f948f82786d655b504940372d241a110700000000000000000000000000000000000000000000010e1b2734414e5a67748186868686868686867f736d635b51493f372d241b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d464e555d606b707a818a92979f9b918b7f726d625a50483e362c1e140a00000000000000000000000000000000000000000000000000000000000c17222d363f48515b636d737f8c929ca09e948f867f7d848d939aa09d938d80736d635b51483e362c22170b00000000000000000000000000030e18212a31363a3b3f3f3f3f3f4c5966727f8c99a5aa9d9184776a5e5144372b1e1100000000020a1015191c1c1f2b37434e58636d73807e716c625a50483e362c241a1208000000000000000000000000000000000000000000000000020a1015191b1c2020202020201b1a17140e0801000000000000000000000000000000000000000000000003101d2a3643505d697683909ca9aea295887b6f625548454e58616c727f8c929d9f948e81786c605b657885929eabaea29886796d6053463a2d20130700000000000000000815222f3b4855626e7b8686868686868686868686868686868686868686868686868686868686868686868686868686868686867d7063574a3d3024170a000000131f2c3946525f6c7985929facaca093877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693a0acac9f9386796c605346392d201300131f2c3946525f6c7985929facb8bbb9b2a89f93877c6f665c50453b31241a0e04000000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8174675b4e4134281b0e01000000000000000000000000000000020e1a25303d4a5763707d8a98a3a8988b7e7265544a3f34281c100300000916222f3c4955626f7c8895a2afa4978b7e7164584b3e31252225282a2b2c2c2c2b2a282522211e1a15110c050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4aca295887c6f6255493c2f221609000714212d3a4754606d7a87939f9f9f998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000815212e3b47535f6a7884919eabab9e9185786c6053493f352f2c28292c2f39424f5966727f8c91908f8e8d8b7e7265584b3f3225180c000000000a141d273039434c565e696e7c859298a2a39992867c6f695f564d4f59626c727f8c929ca5a0959082796d665c53493f372e251b12080000000000000000000000000000000000000000000000010d1a2733404c58646e747979797979797979736d635b51493f372d251b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2c38434e5860676d747d858e939fa29b918b7f726d625a50483f362d241a0c02000000000000000000000000000000000000000000000000000000000006101b242d363f49515b636d73808d929da49e98928c8a91969fa49e938e81746e645b51493f362d241a10050000000000000000000000000009141f2a333b4246484c4c4c4c4c4c5966727f8c99a5aa9d9184776a5e5144372b1e1100000000000005090d0f0f1a26313c46525b646e73716d625a50483e362d241a120800000000000000000000000000000000000000000000000000000004090d0f101313131313130e0d0b080300000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8afa296897c6f6356493d46505a626d74808d939e9e938d80736d606c7986929facab9f928578665c5044382c1f120600000000000000000814212e3a47535f6a76797979797979797979797979797979797979797979797979797979797979797979797979797979797979706b6155483c2f231609000000131f2c3946525f6c7985929f9f9f9f93877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d7986939f9f9f9f9386796c605346392d201300131f2c3946525f6c7985929facacacacada1968d80746a60544a3f33291f120900000000000000000916232f3c4956626f7c8995a2ac9f9386796c605346392d20130013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8e8174675b4e4134281b0e01000000000000000000000000000000000914202d3a4753606d7a86929fa89b8f8275665c5044382b1f120600000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312518181b1d1f1f201f1f1d1b181514120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b979f9f9f95887c6f6255493c2f221609000714212d3a4754606d7a8793939393938c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000006131f2b37434e586774808d9aa6ada1978a7d70655b5045413a383435393b424b54606b7783909d9d9c9b95887b6e6155483b2e22150800000006111b262f39424b555e686e7b849197a2a49a92877d706a60574d4f59616c717e88939fa4a19690837a6d675d544a41382d251c1309000000000000000000000000000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c6c66635b51493f372d251b130900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222e3b4854606a6f79818a91979ea39c918c7f726d625b51483f362d241b12080000000000000000000000000000000000000000000000000000000000000009121b242d373f49525b636e74808d929da5a39f99979ea1a69e948e81786c605c524940372d241b110800000000000000000000000000020e1a26313b454d53555858585858585966727f8c99a5aa9d9184776a5e5144372b1e11000000000000000000000a15202a344049525c646765625a50483f362d241b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3e48515b606c78818f959f9d928b7f726c6d7a8799a3afaa9e9184776b544a3f34281c1003000000000000000006121e2b37424e575f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6361594f44382c201407000000131f2c3946525f6c7986929393939393877a6d6054473a2d2114070000000000000000000000000713202d3a4653606d798693939393939386796c605346392d201300131f2c3946525f6c7985929f9f9f9f9fa59e9184796d60584e42382e21170d0000000000000000000916232f3c4956626f7c89959f9f9f9386796c605346392d20130013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8e8174675b4e4134281b0e010000000000000000000000000000000006131f2c3945515d6776828f9ca99f9285796d6053463a2d20130800000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180c0e101212131312100f0c08080602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b9393939393887c6f6255493c2f221609000714212d3a4754606d7a86868686868686807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000030f1b26323c4855626e7b88949eaca99d9083786c605a524c4645404045474c545c66707d8995a0aaa99d918477695f53463a2d2114070000000b17222d38414a545d676d7a839196a1a49f93887e716b60584e4e58606b707e87929aa4a19791847b6e685d554b42392f261b130a00000000000000000000000000000000000000000000000000000814202b36414a53585a60606060606060605957514940372e251b13090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c848e9393939393918c7f726d625b51493f362d241b120900000000000000000000000000000000000000000000000000000000000000000009121b252d374049525c646e74808d939da59f9f9f9fa79f948f82786d665b504a40372e251b1209000000000000000000000000000005121e2a36424d575f616565656565656566727f8c99a5aa9d9184776a5e5144372b1e1100000000000000000000030e18222e37404a52585a585650483f362d241b120900000000000000000000000000000000000000000000000000000000000000000000000000010507071313131313131313080705020000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2a5998c7f7266594c3f363f44505b666d79839096a09f93877e706f7c8995abb5a99c8f8376695c50432e23170c000000000000000000020e1a26313c454e535560606060606060606060606060606060606060606060606060606060606060606060606060606060606057554f473e33281c1004000000131f2c3946525f6c7986868686868686867a6d6054473a2d2114070000000000000000000000000713202d3a4653606d788686868686868686796c605346392d201300131f2c3946525f6c798692939393939393938a7d70675d51463d30261c0f060000000000000000000916232f3c4956626f7c89939393939386796c605346392d20130013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e010000000000000000000000000000000004101d2935404b5566727f8c99a9a297897c6f6356493c2f24190d01000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0204050606060504020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e868686868686867c6f6255493c2f221609000713202c3945525d687679797979797979736d63574b3f3225190c000000000000000000000000000000000000000000000000000000000000000000000a15212e3a47535f6a76828f9aa4ab9f958c7f726c605d5653514b4b5153565e666d7983909da7ada2978b7f7265574d42372b1e12050000030f1b27333f49535c666d79839095a0a59c928b7f726c61594f4d575f6a6f7d869299a3a29892857b6e695e564c433930271d140a010000000000000000000000000000000000000000000000000000030f1a252f3841484c4e53535353535353534c4b4640372e251c1309010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a67748186868686868686867f736d635b51493f372d241b1209000000000000000000000000000000000000000000000000000000000000000000000009131c252e37404a525c606c77818e93939393939393959082796d665c544a3f382e251c13090000000000000000000000000000000714212d3a46535f696e7272727272727272727f8c99a5aa9d9184776a5e5144372b1e11000000000000000000000006101c252e3840474c4d4b4a453f362d241b120900000000000000000000000000000000000000000000000000000000000000000000000002080d11131420202020202020201514120e0902000000000000000000000000000000000a1724313d4a5764707d8a97a9b2a89b8e817568564c4136333f4a545d676d7a849197a19992867c717e8a97a4b1a79a8e8174675b4e4134281b06000000000000000000000915202a333c4247485353535353535353535353535353535353535353535353535353535353535353535353535353535353534a48443e352c21160b00000000121f2b3844515d6974797979797979797976685d5245392c20130700000000000000000000000006121f2c3844505c66767979797979797979766c5f5346392d201300131f2c3946525f6c7986868686868686868681756c61554b40342b1e150a000000000000000000000916232f3c4956626f7c86868686868686796c605346392d20130013202c3946535f6c79869293939393939393939393939393939393939393939393939393939393939393939393939393939393938e8174675b4e4134281b0e0100000000000000000000000000000000000c18242f3c4955626f7c8897a1a9998c807366564c4135291d1104000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4956626c7179797979797979766a5f53473b2e2115080004111d2935414c565d6c6c6c6c6c6c6c6c66635b52473b2f23160a0000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e58626f7c87939fa8a79f93887e746d6863605c54555d6063686e78818e95a0aca69f9285796d6053473c31261a0e02000005121f2b3744505b656d78828f959fa59d938c80736d625a504c565f696f7c859298a3a39892867c6f695f564d443a31271e150b020000000000000000000000000000000000000000000000000000000008131d262f363c40414646464646464646403e3b352e251c130a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2733404c58646e747979797979797979736d635b51493f372d251b1209000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e384044505b656c7881868686868686868683796d675d544a42382d261c130a010000000000000000000000000000000815222e3b4855616e7b7f7f7f7f7f7f7f7f7f818f9ba8aa9d9184776a5e5144372b1e110000000000000000000000000a131c262e363c3f403e3d3a342d241b1209000000000000000000000000000000000000000000000000000000000000000000000000050c13191d20212d2d2d2d2d2d2d2d21201e1a140d050000000000000000000000000000000815222e3b4855616e7b8896a1adaa9d908477685e5246392d38424b555e686e7b859298a29892857b808d9aa6b4aa988b7f7265584c3f3225190c00000000000000000000030e18212a31373a3b4646464646464646464646464646464646464646464646464646464646464646464646464646464646463d3c38332c231a100500000000101c2935414d5862696c6c6c6c6c6c6c6c6c5d564c4135291d110400000000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e1200121f2b3844515d6974797979797979797979756f65594f433a2f22190c03000000000000000000000815222e3b4754606a6f79797979797979766c5f5346392d20130013202c3946535f6c7987868686868686868686868686868686868686868686868686868686868686868686868686868686868686868174675b4e4134281b0e0100000000000000000000000000000000000713202d394653606c7885919ea99c908376685d5245392c201306000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212d3945505a62646c6c6c6c6c6c6c625f584e43372b1f130600010d19242f3a444c525f606060606060605957524940352a1e130700000000000000000000000000000000000000000000000000000000000000000000020f1a26313c4754606a74818e96a0a9a49a9387807a74706d666a6a676d70747a828e939ea7a89f948b7e72675d5145392a1f140900000815212d3945505a606c77818e949fa69e938e81746e635b5146525e686e7b859197a2a39992867d706a5f574d443b32281f150c030000000000000000000000000000000000000000000000000000000000010b141d252b303334393939393939393933322f2a231c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c6c66635b51493f372d251b13090000000000000000000000000000000000000000000000000000000000000000000000000000010a131c2627333f49535b666c757979797979797979776d675d554b42392f261c140a01000000000000000000000000000000000b1724313e4a5764717d8a8b8b8b8b8b8b8b8b8f939eaaaa9d9184776a5e5144372b1e11000000000000000000000000010b141c242b30333432312e29221b1209000000000000000000000000000000000000000000000000000000000000000000000000050e161e252a2d2e39393939393939392e2d2a251f170f0500000000000000000000000000000714212d3a46535f697884919eabac9f93877a6d6154473c322f39434c565f696f7d86929aa197918483909daaaea298897c6f6356493c302316090000000000000000000000060f1820262b2e2f393939393939393939393939393939393939393939393939393939393939393939393939393939393939302f2c28211a110800000000000d1925303b4650585d5f606060606060605f524c443a2f24190d01000000000000000000000000000c17232e38424a505f60606060606060605f5a52493e33271b0f00101c2935414d5862696c6c6c6c6c6c6c6c6c68655d53473e31281d1007000000000000000000000006131f2b38434e5860626c6c6c6c6c6c6c6c645a4f43372b1e1200121f2c3845525e6a757979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746f64594c4033271a0d01000000000000000000000000000000000005121f2b3744505b6575818e9bac9f92867a6d6054473a2d211407000916222f3c4955626f7c8895a2aca4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d29343e485056586060606060606055534e463c32261b0f03000008131e28323a414553535353535353534d4b4740372e24190d0200000000000000000000000000000000000000000000000000000000000000000000000a15202b37434e58606d7a849197a2a9a499938d85807d79787777787a7c81868f949ea5a9a1969082776c60554b403529180e0300000a1724303d4956626c74808d939ea69f948f81786d605c52494754616e7a849197a1a49a92877e706b60584e453c322920160d0300000000000000000000000000000000000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814202b36414a53585a60606060606060605957514940372e251b130900000000000000000000000000000000000000000000000000000000000000000000000000000000010a1417222d38414a545b60686c6c6c6c6c6c6c6c6a605d554c433930271d140a0200000000000000000000000000000000000b1724313e4a5764717d8a97989898989898989b9ea6b0aa9d9184776a5e5144372b1e1100000000000000000000000000020b12191f2326272524211d181109000000000000000000000000000000000000000000000000000000000000000000000000020c1620283036394646464646464646463b3a36302921170d020000000000000000000000000005121e2a36424d576875818e9baaafa49a8b7e7164584e43372b313a444d57606b717e88939fa096919095a0abac9f9285796d6053463a2d201307000000000000000000000000060e151a1e21222d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423201c16100800000000000008141f2a343e464d5152535353535353535345413a32281e1308000000000000000000000000000006111c2630383f44535353535353535353534f4940372c21160a000d1925303b4650585d5f60606060606060605b59534b42352c1f160c000000000000000000000000030f1b27323d464e5456606060606060605f5a52493e33271b0f00111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b000000000000000000000000000000000000030f1b27333f495364717e8a9aa4a3998a7d7064574a3d3124170a000916222f3c4955626f7c88959f9f9f978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17222d363e45494b535353535353534947433c342a20150a000000010c1620282f35394646464646464646403f3b352e251c1207000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323c45515d676e7c859297a0a7a49f97928d89868584848586898d92989fa6a79f9791847b6e655b50433a2f2418060000000b1825313e4b5864717e8b929da5a0958f82796d665c504a43505d6a76839096a0a99f93887e716c61594f463c332a20170e0400000000000000000000000000000000000000000000000000000000000000000001080f14181a1b2020202020202020191916120d070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1a252f3841484c4e53535353535353534c4b4640372e251c13090100000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f38424a50535b60606060606060605d54514c433a31271e150b020000000000000000000000000000000000000b1724313e4a5764717d8a979f9f9f9f9f9f9f9f9f9f9f9f9d9184776a5e5144372b1e11000000000000000000000000000001080e1317191a181715110c060000000000000000000000000000000000000000000000000000000000000000000000000008131e28323a41465353535353535353534846423b33291f140900000000000000000000000000020e1a26313e4a5764717e8a98a2aeac9c8f82766a5f53473f352f323c454f59616c727f8c929da09d9da0a7b1aa9c8f8275665c5145382c1f13060000000000000000000000000003090e121415202020202020202020202020202020202020202020202020202020202020202020202020202020202020171614100b0500000000000000020d18222c343b414446464646464646464639352f2820160c010000000000000000000000000000000a151e262e343846464646464646464646433e372e251b10050008141f2a343e464d515253535353535353534f4d48423930231a0d04000000000000000000000000000a16202b343d43474953535353535353534f4940372c21160a000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060605b59534a41362b201408000000000000000000000000000000000000000b17222d3a4754616d7a87939393938d8174675a4e4134271b0e000916222f3c4955626f7c8893939393938b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b242d34393d3e464646464646463c3b37322a22180e0400000000040d161e24292c393939393939393933322f2a241c130a00000000000000000000000000000000000000000000000000000000000000000000000000000a15202935414c555f6a6f7c8590959fa3a9a19e9a96979291909192999a9fa2aaa29f9590857b6e695e53493f31281d13070000000d1a2633404d596673808c99a4aa9d91847a6d675c544a3f45525e6b7885919ea8a5998c7f726c625a50473d342a21180e0500000000000000000000000000000000000000000000000000000000000000000000000003080b0d0e13131313131313130d0c0a06020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131d262f363c40414646464646464646403e3b352e251c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262f383f44464e5353535353535353504745413a31281f150c03000000000000000000000000000000000000000b1724313e4a5764717e8a93939393939393939393939393939184776a5e5144372b1e110000000000000000000000000000000003070b0d0d0b0b09050100000000000000000000000000000000000000000000000000000000000000000000000000010d1925303a444c525f60606060606060605f524d453b30251a0e02000000000000000000000000000914202d3a4753606d7985929fabab9f94887c6f625b5145403937333d46505a626d74808d939ea7aaabb1aea2988b7e7164544b4034281c1004000000000000000000000000000000020608081313131313131313131313131313131313131313131313131313131313131313131313131313131313130a0907040000000000000000000006101a222a3035383939393939393939392c29241e160d0400000000000000000000000000000000030c151c23282c3939393939393939393937332c251c13090000020d18222c343b414446464646464646464642413d3730271e11080000000000000000000000000000040f19222b32383b3c4646464646464646433e372e251b1005000915202b353f474e5253535353535353535353535353535353535353535353535353535353535353535353535353535353535353534e4c4841382f251a0f03000000000000000000000000000000000000000613202d3946525e687783868686868684776b5e5144382b1e11000916222f3c4955626f7c868686868686867e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b22292d3031393939393939392f2e2b2620181006000000000000040c13191d202d2d2d2d2d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000000000000000000000000000000000040d19242f3a434e58606a6f7b838c92989ea1a9a7a9a29f9d9d9e9fa3aba9a19e98928d837b6e695f574d41382d1f160c010000000d1a2633404d596673808c99a3ac9f92867c6f695f564c4345525e6b7885919ea6a89c8f82786d605c52493f362c2319100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b141d252b303334393939393939393933322f2a231c130a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141d262d333839424646464646464646443a39352f281f160d0300000000000000000000000000000000000000000b1724313e4a5764717e8686868686868686868686868686868684776a5e5144372b1e1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2a36414c565e6c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000000000000006131f2c3945515d6774818d99a3afa69c8f82766d625a514b474242414148515b606c78818f959fabb8b4aa9f92857a6d6054473a2e23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810181f25292b2c2d2d2d2d2d2d2d2d201d19130c04000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2d2d2b27211b130a0100000006101a222a3035383939393939393939393534312c251e150c0000000000000000000000000000000007101920272b2e2f393939393939393937332c251c13090000040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464641403c362f261d1308000000000000000000000000000000000000000005111e2a36414c5667717779797979797772675c4f43372a1d11000815212e3b47535f6a7679797979797979716c6256493d3024170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d22211f1b150e06000000000000000001080d111314202020202020201a1916130d07000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28313c464e5860696e7980868d9197999c9d9fa3aaaaa9a19e9c9a97928d8680796e695f574d453b2f261b0d04000000000a1623303d495663707d87929aa4a29891857b6e685e554b424e5b6874818e949fa79e948e81746e635b51483e352b22180f060000000000000000000000000000000000000000000000000000000000000000000000000000030607090b0d0f1111121313121211100f0d0a08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c22282b2d353939393939393939372d2c29241e160d040000000000000000000000000000000000000000000a1723303c4955616c71797979797979797979797979797979797771675b4f43362a1d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a0d0f1013130f0e0c09040000000000000713202d3946525e6876797979797979797976695e52463a2d2014070000000000000000000000000004101d2935404b55616e7b87929fa9ab9f948b7f726c605d55534d4e4e4e4b51535b666d7983909da9b6aea2988d8073675d5145392c1d1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d14191c1f1f202020202020201413110d0801000000000000000000000000000000000000000000060c1012202020202020202020201e1b1610090100000000000810181f25292b2c2d2d2d2d2d2d2d2d282825201b140c030000000000000000000000000000000000070f161b1f22232d2d2d2d2d2d2d2d2b27211b130a0100000008121b242b31363839393939393939393939393939393939393939393939393939393939393939393939393939393939393939393433302b251d140b010000000000000000000000000000000000000000010d1925303a44555f676a6c6c6c6c6c6b6760564b3f33271b0e0006131f2b37434e585f626c6c6c6c6c6c6c64625a5045392d21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c11151718202020202020201615130f0a04000000000000000000000001040707131313131313130d0c0a0702000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a333d464e575f676d737b8085898c8f919298a3a8a196918f8d8985807b736d675e574d453c33291d140a00000000000916222f3b4854606b717e88939fa4a19791847a6d675d544a4653606d78828f959fa69d938d80736d625a50473d342a21180e050000000000000000000000000000000000000000000000000000000000000000000104060b10121315171a1c1d1e1f1f201f1f1e1d1b19171514120e0906030000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080f14181a1b2020202020202020191916120d070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f20282d2d2d2d2d2d2d2d2a21201d19130c04000000000000000000000000000000000000000000000814212d3945505a61646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a675f564b3f33271b0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201c1b1915100902000000000714212e3a4754616d7a86868686868686867b6e6154483b2e21150800000000000000000000000000000c18242f3946535f6974808d96a1aba69f92877e736d67615f575b5a5b555d60636a6f7a83909daab6ab9f92857a6d61554b42382d2217110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d101213131313131313130707040100000000000000000000000000000000000000000000000000030613131313131313131313120f0a050000000000000000060d14191c1f1f20202020202020201c1b19150f090200000000000000000000000000000000000000040a0f13151620202020202020201e1b16100901000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d282724201a130b020000000000000000000000000000000000000000000008131e2932434d555b5d60606060605e5c564e44392e23170b00030f1b26323c464e535560606060606060585650483e34291d110500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b1313131313131309080603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18212b343d454d555d60696e73787c7f828486929fa196898482807d79746e69605c554d453c332a21170b0200000000000713202c38444f59616c727f8c929da5a0969083796d665c5044515c666d79839096a0a59c928b7f726c61594f463c332920170d0400000000000000000000000000000000000000000000000000000000000001070d1113171c1f20222426292a2b2b2c2c2c2b2b2a28262422211e1a1312100c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000003080b0d0e13131313131313130d0c0a06020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131b20202020202020201d1413110d0801000000000000000000000000000000000000000000000004111c28333e48505557606060606060606060606060606060605e5b564d44392e23170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d292825211b140c030000000714212e3a4754616d7a87939393939393877b6e6154483b2e211508000000000000000000000000000007121d2a36424d57606d7a849199a3aba39992878079736e696968676869676d70757c8490959fabb3ab9e91847a6e675d544a3f3328231a100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d10121313131313131313130f0e0c09040000000000000000000000000000000000000000000000030608091313131313131313120f0a050000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b1a18140f08010000000000000000000000000000000000000000000000020d1720313b434a4f515353535353514f4b443c32281d120600000a15202a343c434749535353535353534b49453e362d22170c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407070b0d0f111213131212100e0c080705020000000000000000000000000000000000000000000000000000000000060f19222b333c434b51565e61666c6f7375777e8a979e9184787673706d66615e56514b433b332a21180f0500000000000003101b27323d47505a626d73808d939ea69f958f82786d605b524a545d676d7a849197a1a49f93887e716b60584e453b32291f160c0300000000000000000000000000000000000000000000000000000003090e13181d2023282b2d2f3133353737383939393837373533312e2d2a26201f1c17110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060f1313131313131313110706040100000000000000000000000000000000000000000000000000000c17222c363e45494a53535353535353535353535353535353514f4b443b32281d12060000000000000000000000000000000000000000000000000000000000000000000000000000000000030d161f272d32353639393534312c261e150c0200000714212e3a4754616d7a87949f9f9f9f94877b6e6154483b2e2115080000000000000000000000000000010e1a26313b45525d686f7d879299a3aaa399938d847f7b787675747475777a7d828991969fa7aca6a8a1969083796d665b50443f362c22190f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b0906010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e111213131313131313131313131313131313131313131313131313131313131313131313131313131313131313130e0d0b08030000000000000000000000000000000000000000000000000000050e1f2931393f4244464646464644433f39322a20160c010000040e18222a32373b3c464646464646463e3d39342d241b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a0d10111213131211100d0a07060400000000030505060606060606000000000000000000000000000000000000000000000000000002080d111314171a1c1e1f1f201f1f1d1b181514120e090400000000000000000000000000000000000000000000000000000000071019212a313940454d52545b60636669707d8a979e9185786b6763605c54524d454039302921180f0600000000000000000b16212b353e48515b606c77818e949fa79e948e81746d635a504b555e686e7b859198a2a49a92877d706a5f574d443a31281e150b02000000000000000000000000000000000000000000000000040a0f151a1d24292c2e34383a3c3e404244444546464545444342403d3b3a36312d2c28231c19130d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100f0d0b080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005101a242c33393c3e4646464646464646464646464646464644433f39322920160b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2831383e4243464642413d3730271e140900000714212e3a4754616d7a8794a0acaca194877b6e6154483b2e21150800000000000000000000000000000009141f2935414c56606b717e879298a0a8a49f97918c8885838181818283868a8f939da0a8a39f999b9e9f958f81786c605b51483e342b21170d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d0600000000000000000004090e111213131313131313131313131313131313131313131313131313131211100e0c0a07060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d171f272e33363739393939393837332e2820180e040000000006101820262b2e2f3939393939393931302d29221b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d111314171a1d1e1f1f201f1e1c1a171413100c07010c0f1112131313131313090907030000000000000000000000000000000000000000050b1013191d20212427292b2b2c2c2c2b2a282522211e1a14100c07010000000000000000000000000000000000000000000000000000070f181f272f353b42464a5053565964707d8a979e9185786b5e5653504a46423b342e271e170f06000000000000000000040f19232c363f44505b656d78828f95a0a69d938c80736c62594f4c565f696f7c869299a3a39992867c6f695f564c433a30271d140a0000000000000000000000000000000000000000000000070c151b20262b2f35393a3f4446484a4d4f5051525253525251504e4c4a4846423d3a38342e29251e19140d050000000000000000000000000000000000000000000000000000000000000000000000000004070c10121316191b1d1e1f1f201f1f1e1d1b19171414110e0806030000000000000000000000000000000000000000000000000004090e1112131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a080400000000000000000008121a22282d3031393939393939393939393939393939393736332e2820170e04000000000000000000000000000000000000000000000000000000000000000000000000000000000005111c27313a434a4e5053534f4d49423930261b1004000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e211508000000000000000000000000000000030d19242f3a444f59616c717e8691969fa2a9a19e9997918f8e8d8e8f9092999b9ea5a69f99928d8e939e9e938d80746d625a50463d33291f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d18110901000000000000080f151a1d1f202020202020202020202020202020202020202020202020201f1f1e1d1b19161413100c07040100000000000000000000000000000000000000000000000407090a13131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d151c2227292a2d2d2d2d2d2b2a27231d160e06000000000000060e151b1f21222d2d2d2d2d2d2d2524211d171109000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e13191d20212427292b2b2c2c2c2b292724201f1c18120e181c1e1f2020202020201615130f0a0400000000000000000000000000000000040a0f171c1e24292c2d3133363738393939383735322e2d2a261f1d18120b060000000000000000000000000000000000000000000000000000060d151d24293036383f44464a5764707d8a979e9185786b5e5246443f38363028231d150c05000000000000000000000007111a2427333f49535c666d79839096a1a59c928b7e716b61584e4d575f6a707d879299a4a29891857b6e685e554b42392f261b11060000000000000000000000000000000000000000030b121820262b31373a4145474a50535557595c5d5e5e5f5f5f5e5e5d5b595755534d4946443f3835302a251e170e0802000000000000000000000000000000000000000000000000000000000000000001070c1013181c1f20232527292b2b2c2d2c2c2b2a28262421201e1915120f0a0300000000000000000000000000000000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c0500000000000000000810171c2123242d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b2a27231d160e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16222d38434c545a5d60605c59544b42372c211509000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e2115080000000000000000000000000000000008131e28323d47505a616c717c848c92989d9fa4a9a19e9c9b9a9b9c9d9fa3a9a29f9a94908780818e949f9d928b7f726c61584e453b31251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b1309000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2c2b29282623201f1d1813110d080100000000000000000000000000000000000000050b101416172020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b11161a1d1e20202020201e1d1b17120c040000000000000000040a0f13151620202020202020181715110c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e141a1e24292c2d3033363738393939383634302d2c29231d1a24282b2c2d2d2d2d2d2d23221f1b160f070000000000000000000000000000070f151b22282d3035393a3e404244454646454543413f3b3a36312c29241d17110a0200000000000000000000000000000000000000000000000000030b12181f252a2d33383d4a5764707d8a979e9185786b5e524538342e2a251f18120b0300000000000000000000000000091217222d38414b545d676e7a849197a1a49f92877d706a60574d4e58606b717e87939fa4a19791847a6d675d544a41382d22171209000000000000000000000000000000000000070c151d232831373c42474b5154545c60626466686a6a6b6c6c6c6b6a6a686664615f575653504a46413a3630292019130d05000000000000000000000000000000000000000000000000000000000003090e12181d1f23282c2d3032343638383939393838373533312e2d2a25211f1b150f0b060000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c1710080000000000000000050c11141717202020202020202020202020202020201e1d1b17120b04000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a26323e4a545e66696c6c68655d54493d3125190c000714212e3a4754616d7a8794a0a2a2a194877b6e6154483b2e21150800000000000000000000000000000000010c16202b343e48505a616a6f797f858b90939a9a9c9d9e9f9f9f9e9d9c9a9897928d88837c7378828f95a09f93877e706a60574d42362a1e1205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b110600000008121b242b31363839393939393939393939393939393939393939393939393939393837363432302d2c2924201d19130e0902000000000000000000000000000000000810161c2023232d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c17100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a0e1011131313131311110e0b0601000000000000000000000003060809131313131313130b0a0805000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f181f262a2f35393a3d404344454646454443403d3a38342f2a252f3437383939393939392f2e2c272119100700000000000000000000000009101920272b33393a4145474a4d4f515252535252504e4b4846423b39352f27221b140b050000000000000000000000000000000000000000000000000001070c14191c2228313d4a5764707d8a93939185786b5e52453828231c19140c070000000000000000000000000000000006111b262f39424c555e686e7b859298a2a39992867c6f695f564c4f59616c727f8b929ca5a0969083796d665c53493f3327241a1007000000000000000000000000000000000810191e272e343c43474d53555d6064666d6f7173757777787979787877767573706e696763605c54524c46413b322a251e170e06000000000000000000000000000000000000000000000000000001070c141a1d24292c2e34383a3c3f4143444546464645444342403e3b3936302e2b261f1c17110a020000000000000000000000000000000008121b242b3136383939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a120800000000000000000004080a0b1313131313131313131313131313131311100e0b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2935424e5a6670767979756f65594d4134281b0e000714212e3a4754616d7a87949595959594877b6e6154483b2e2115080000000000000000000000000000000000040d19222d363e48505860676d737a7f83878a8d8f90929292929190908e8b8885807c766f6a6d7a8390969a9992867c6f695e53463a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d0100040f19242d353d42454646464646464646464646464646464646464646464646464646454443413f3d3a38352f2c29241e1a140c06000000000000000000000000000008111a21272c2f30393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a120800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b1218212a31363a4145474a4d505152525352514f4d4a4745403936313a4044454646464646463c3b38322b22190f04000000000000000000020a131b222b32373e44494c5254575a5c5e5e5f5f5f5e5d5b5855534d47454039332d261d170e06000000000000000000000000000000000000000000000000000002090e111724313d4a5764707d8686868684786b5e5245382b17110e09020000000000000000000000000000000000000a141d27303a434c565f696f7c869299a3a29892857b6e685e554b505a626d73808d939da69f958f82786d655b50443f362c22190f04000000000000000000000000000009111a222a303940454e53575f62676d7175797b7d8082838485858685858483817f7d7b7874706d66615e56524c443e36302920180f07000000000000000000000000000000000000000000000000030b12181f252a2f35393a404446494c4e5051525253525251504e4c4a4746413c3a37312b28221c140b070000000000000000000000000000040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a1005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768286868175685c4f4235291c0f000714212e3a4754616d7a87888888888888877b6e6154483b2e21150800000000000000000000000000000000000007101b242d363e464e555c60676d72767b7e80828485858685848483817e7c79746f6a625f686e7b848d8d8d8d8d857b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d1206000915202b353f474e5253535353535353535353535353535353535353535353535353525251504e4c494745403a39352f2a251f17110a03000000000000000000000005101a232c33383c3d46464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a100500000000000004090e111213131313131313131306040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e111213131313131313131306040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c2328333b42464c5254575a5c5e5e5f5f5f5e5c5a5753514b46423b454c50525353535353534948433d342b21160a0000000000000000000a141c252d343d43475055565d606466696a6b6c6c6c6b6a6865615f5753514b443f382f292018100600000000000000000000000000000000000000000000000000000000061623303c4955616c70797979797872685c5043372a1e06000000000000000000000000000000000000000000020b151e28313b444d57606a707d87929fa3a19791847a6e675d544a515b636e74818e949ea79f948e81776c605b51483e342b21160a0000000000000000000000000009121b232c343c424b51585f62696e747a7d8185888a8c8f9091919292929191908e8c8a8884807d79736d68615e565046413a322a2119100700000000000000000000000000000000000000000000060d151d24293136394045474a515356585a5c5e5e5f605f5f5e5d5b595754524c4847433c38332d261d18120b030000000000000000000000000915202b353f474e52535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c00000000000000000000000000000000000000010406070a0c0e101112131313121211100e0c0a070604010000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000713202d3a4653606d787c7c7c7c7c7c7c7c786d6053463a2d2013070000000000000000000000000000000000000009121b242d343d434b51555d6065696e717375777879797978777674716f6d66625f58565e696f7c8181818181807f7265584b3f3225180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e221509000e1a26313d4751595e5f60606060606060606060606060606060606060606060605f5f5f5e5c5b595653514b4745413a363028231c150c05000000000000000000000b16212c353d44484a53535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c0000000000080f151a1d1f20202020202020202013100c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f151a1d1f20202020202020202013100c070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e272e343f454d53565d606366696a6b6c6c6c6b696763605c55534d444f575c5f60606060606056544e463d32271b0f030000000000000009121c262e373f464e545a6164686d7173757778797978787674726e6965605d555049413a322a221810060000000000000000000000000000000000000000000000000000000814202d3944505a61646c6c6c6c6b6860564b4034281b0f00000000000000000000000000000000000000000000030c161f29323c454e58616b717e8b919ca4a0969083796d665c5349525c606d78828f959fa69e938d80736d625a50473d32271b0f03000000000000000000000009121b242d353e464e545c606a6f757b81868a8e929797999b9d9d9e9f9f9f9e9d9d9b999796918d8985807a746e68615a524c443c332b2219100700000000000000000000000000000000000000000910181f272f353b42464b5153545c60636567696b6b6c6c6c6b6b6a686664615e5655534e46443f382f28231d150c0500000000000000000000000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c11040000000000000000000000000000000104080d11131417191b1d1e1f1f20201f1e1e1d1b19161413100d0704000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0006121f2c3844505c666d6f6f6f6f6f6f6f6f6d665c5144382c1f1206000000000000000000000000000000000000000009121b222b313940454b5154575e616467696a6b6c6c6c6b6a69676562605c54534e4d575f6a6f747474747474726d62564a3d3124180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b00111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a69676563605d5554524c46423b342e261e170f06000000000000000004101c27333d474f55566060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c110400000009121920262a2c2c2d2d2d2d2d2d2d2d1f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d1f1c18120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121c273039404451575f61686d7073767778797978777673706d67615e57505761686b6c6c6c6c6c6c6260584e43382c1f130700000000000006101b242e384049515860626c70757a7d808284858586858583817e7b77726d67605b534c443c342a22180e05000000000000000000000000000000000000000000000000000004101c28333e48505557606060605e5c564e453a2f23170b0000000000000000000000000000000000000000000000040d17202a333d464f59626c737f8c929da5a0958f82786d655b5044505c666d79839095a0a59d928c7f726c61594f43382c1f13070000000000000000000007101b242d363e474f585f666d737c82878e92989b9ea2a9a6a8aaa8a7a6a6a6a7a8a9a8a6a8a19e9a97928c86807a716c615e564d453c342b22190e0500000000000000000000000000000000000009121b222a313940454d53555d6065666d6f72747677787979797877767573716e6867625f5853504a423d342e271e170e0500000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d2114080000000000000000000000000002080d1113191d2021232628292b2c2c2c2c2c2b2b2a28252320201d1813100c0700000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0003101c28343f4a545c606262626262626262605c544a4034281c10040000000000000000000000000000000000000000000910191f272f343a4145474d5254575a5c5d5f5f5f5f5e5d5d5b585553514a4743454e585f6267676767676765625b51463a2e2215090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c00121f2c3845525e6a7579797979797979797979797979797979797979797979797979797877767472706d6765605d56524d443f38302921180f06000000000000000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d211408000008121b242b3136383939393939393939392c29231d150d03000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242b3136383939393939393939392c29231d150d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e39424a515b63696e747a7d808384858586858482807d79746e69605b536873787979797979796f6a6054483b2e2215090000000000030e18222d36404a525b626a6f767d82868a8d8f919192929291908e8b88847e79716c655e564e463c342a20170c0300000000000000000000000000000000000000000000000000000b17222c363e44494a5353535352504b453c33281e1207000000000000000000000000000000000000000000000000050e18212b343e47505a636d74808d939ea69f948e81776c6053464a545d676d7a839196a1a49f93887e716b6054483b2f221509000000000000000000050e19222d363e485059616a6f7980878f93999fa3aaabaaaaa29f9d9b9a9a999a9a9b9d9fa2aaa9aba9a19e98928d857e756d685f574e463c342a20170c030000000000000000000000000000000009121b242c343c434b51575e61676d7175797c7f81838485858685858483817f7d7a77736f6a64605b544f454039302920170f05000000000000000000121f2c3845525e6a7579797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a000000000000000000000001080d13191d2024292c2d303335363738393939393837363432302d2c29241f1c18120b060000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00000c17232e38424a5053555555555555555553514a42392e23180c0000000000000000000000000000000000000000000000070d151d23292f35393b4246474a4d4f51525253525151504e4b4946444039373c464e53555a5a5a5a5a5a585651493f34291d120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d20130013202c3946535f6c798786868686868686868686868686868686868686868686868685858483817f7c7976726d68615e57504a423b332a22180f050000000000000916232f3c4855616b707979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a00040f19242d353d424546464646464646464638342f271f150b01000000000000000000000000000000000000000000000000000000000000000000000000000000040f19242d353d424546464646464646464638342f271f150b0100000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404a545c606d727b81868a8d8f9191929292918f8d8a85807b726c655c6b78858686868686867c6f6256493c2f23160900000000000a15202a343e48525c636d727c838a8f9299999c9d9e9f9f9f9e9d9b9895908b857e776d685f584e463c32291e150a000000000000000000000000000000000000000000000000000005101a232c33393c3d464646464543403a332a21170c0100000000000000000000000000000000000000000000000000060f19222c353f48515b606c78818f94939393938c7f7366594c424b555d686e7b84919793939a92867c6f6356493c302316090000000000000000020d17202b343e48505a616b707c838c92999fa4abaca7a09d999892908f8d8d8d8d8d8f909298989c9fa4abaaa29f97928a827a6e6960584e463c32291e150b00000000000000000000000000000008121b242d363e464e555d60696e74797e8285898b8d8f91919293929291908e8c8a8784807c76716c666059514b433b332921170e05000000000000000013202c3946535f6c79878686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b00000000000000000000040c13191e24292c2f35393a3d3f4143444546464645454443413f3d3a39352f2c28231d17110a02000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000006111c2630383f444649494949494949494644403930271c1207000000000000000000000000000000000000000000000000030b12181d24292c30363a3b3e40424445464646454443413e3c3a38342e2b343c4347484e4e4e4e4e4e4b4a463f372d23180c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d20130013202c3946535f6c79869293939393939393939393939393939393939393939399929292918f8e8c8986827e7a746e69605c544d453c342a21170c0200000000000a1723303d4a5663707d86868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b000915202b353f474e5253535353535353535345403931271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000915202b353f474e5253535353535353535345403931271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18212c3844515c666d757f878d9298999c9d9e9f9f9f9e9c9a98928d867f776d666679869293939393887b6e6255483b2f22150800000000030f1b26313c46505a636e737f8790949c9fa3aba8a5a3a1a1a1a3a5a7a7a09d97928b827a6f6a5f584e443b30261c1106000000000000000000000000000000000000000000000000000008111a22282d3031393939393837342f2821180f0500000000000000000000000000000000000000000000000000000007101a232d364044505b666d79828686868686868275695c4f42434c565e696f7c858686868686867f7265584c3f3225190c000000000000000009141f29323d46505a626c717d8690959fa3ababa49f9b95908c898584828180808081828385888b8f93999fa2aaa9a19e938f847b6f6a60584e443b30271d12070000000000000000000000000006101a242d363f4850585f676d737b80858b8f9298989a9c9e9e9f9f9f9e9e9d9b999795908d88837e786f6b605c554d453b332920170c030000000000000013202c3946535f6c798692939393939393939393939393939393939393939393939393939393939393939393939393939393939393938a7e7164574a3e3124170b000000000000000000070d161e24293035393a4145474a4c4e505152525353525151504e4c494745403a38342e27221b140b060000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00000c17232e38424a5053555555555555555553514a42392e23180c0000000000000000000000000000000000000000000000000001070c13181d20252a2d2e313436373839393938373634322f2d2c2823222a31373a3c4141414141413f3d3a342d251b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d20130013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9c9a9899928f8b86817b736d665e574e463c33291e140a00000000000a1723303d4a5663707d899393939393939393939393939393939393939393939393939393939393939393939393939393938a7d7164574a3e3124170b000e1a26313d4751595e5f606060606060605f514b43392f23180c0000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26313d4751595e5f606060606060605f514b43392f23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000915202c38434f59606d78818c92999fa2aaa9a8aaa29f9e9e9e9fa29f98928c81786d6d798699a39f9f94877a6e6154473b2e2114080000000006121f2b37434e58626c73808b92999fa6aca49f9c989695949596989c9fa4a9a19e948f847c6f6a5f564d42382e23170c0300000000000000000000000000000000000000000000000000000810171c2023242d2d2d2d2b2a28231e170f06000000000000000000000000000000000000000000000000000000000008111b2428333f4a545c676d767979797979797570655a4d413a444d575f6a6f78797979797979726d62564a3e3124180b00000000000000030d1925303b444e58626c717e879298a0a7afa79f99938e88837f7c79777574737373747577797c7f83878d92989ea5ada59e9691857c6f6a5f564c42392e23180c030000000000000000000000030c18222c363f48505a616a6f7980868d92979c9fa2aaa7a9a8a7a6a6a6a7a8a9a8a6a7a09d9a94908a837c746d675e574d453b32291e150a0000000000000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b00000000000000000810181f282f353a4145474c525456595b5c5e5f5f5f5f5f5e5e5d5b585653514b46454039332d261d180f0700000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0003101c28343f4a545c606262626262626262605c544a4034281c1004000000000000000000000000000000000000000000000000000001070d11141a1e20212427292a2c2c2c2c2b2a2a282522201f1c181820262b2e2f34343434343432312e29231b1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d20130013202c3946535f6c7986929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a7a8a9a7aba39f9c98928d867f786e695f584e453b30261c1106000000000a1723303d4a5663707d89969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b00111d2a36424e59636a6c6c6c6c6c6c6c6c6c5c554b4034291c10040000000000000000000000000000000000000000000000000000000000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c5c554b4034291c1004000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313b4854606b74808d939fa3ababa49f9b979892919192939a989d9f938f82786d7a8794abb4a094877a6d6154473a2e211407000000000815212e3a47535f6a717e8b929fa3aba69f9a938f8c89888788898c90939a9ea6a69f9691857c6f685e544a3f34281f1409000000000000000000000000000000000000000000000000000000050b10141617202020201f1e1b17120c0500000000000000000000000000000000000000000000000000000000000000091217222d38424b555c60696c6c6c6c6c6c69655e54493d323b454e585f626c6c6c6c6c6c6c65625b51463a2e221509000000000000010b151f2a36424d56606a717e889299a2aaafa49c959087817c77726f6d6668676766676768666c6f72767b80868e939fa3aaa8a09792867c6f685e544b40342820150900000000000000000000000b151e2a343e48505a626c717c848c92989fa2a9aca8a8a09e9c9a9a999a9a9b9d9fa3ababaaa69f9c95908781796e695e574d443b30261c110600000000000013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a4978a7d7164574a3e3124170b0000000000000008111a222a313a41454c5254565d60636668696a6b6c6c6c6c6b6a69676563605d5553514b443f382f2a21191107000000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0006121f2c3844505c666d6f6f6f6f6f6f6f6f6d665c5144382c1f1206000000000000000000000000000000000000000000000000000000000104090e111414171a1c1e1f1f201f1e1e1d1b18161312100c0e151b1f21222727272727272524221d18110900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a0013202c3946535f6c7986929facb9ada39b9898989898989898989898989898989899999a9c9ea1a8a9acaaa29f98928c837b6e6a5f574d42382e23170b010000000a1723303d4a5663707d8996a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1978a7d7164574a3e3124170b00121f2c3845525e6a75797979797979797976675c5145382c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3845525e6a75797979797979797976675c5145382c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000006121e2b37424e57636f7c87939fa5afa9a199938f8a878584848586888c90959e948d80747b8794a1ada093877a6d6054473a2d2114070000000713202c38444f59626f7c86929fa4afa49c948f87827f7c7b7a7b7c7f83878f949fa3a8a19791857a6e665c50443b31261a0e030000000000000000000000000000000000000000000000000000000004080a0a1313131312110f0b070100000000000000000000000000000000000000000000000000000000000000000006111c262f39434b51535d6060606060605c5a544c423729333c464e53555f606060606060585651493f34291e120600000000000007121d27313946525e696f7c86929aa3ababa39f928d837c756f6a6662605c545a5a5a5a5a545b606265696e747b818a9298a2a9a9a19891847a6e665c51453c31261a0e0500000000000000000007121d27303c46505a626c717e8691969fa2aaaba39f9b9796918f8e8d8d8d8d8f9092999a9ea1a9aba79f9a938d837b6e695e564c42382e23170c04000000000013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a978a7d7164574a3e3124170b00000000000007101a242c343c434c51565d6065686d707274767778797979787877767472706d6764605c555049413c332b231910070000000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000713202d3a4653606d787c7c7c7c7c7c7c7c786d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000020507080b0d0f11121313131211100e0b0907060400040a0f1215151b1b1b1b1b1b181815120c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f2316090013202c3946535f6c7986929facb9a79b918b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8d8d8f9196979c9fa3abaaa29f9590847c6e695e544a3f34281d13070000000a1723303d4a5663707d899494949494949494949494949494949494949494949494949494949494949494949494949494948a7d7164574a3e3124170b0013202c3946535f6c798786868686868686796d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c798786868686868686796d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3a47535f6a76828f9aa4afaba1979287827d7a79787778797b7f838a9196928a7e7b8895a1ada093867a6d6053473a2d2014070000000916222f3b4854606b76828f98a2aea49c928c827b7672706e6e6e7072767c828b9299a3a9a1979082786d60574d42362a20150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d273139404547505353535353534f4d49423930212a343c434748525353535353534c4a463f372d23180d010000000000000c18232f3943505a616e7b859198a3acaca399928b80786f6a625f585653504a4e4d4d4d4e4a505355575e61696e757e869297a2aaaaa1969082786d60574e42372b21170b0000000000000000000c18232e39424e58616c717f8a9298a0a8aba49f99928e8a8784828180808081828486898d92979ea1a8aca49f9590847b6e685e544a3f342820150a000000000013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7e7164574a3e3124170b0000000000040e19222c363e464e555d60686d72767a7d7f8183848585868685848483817f7c7a75706d67605b534e463d352b22190d0400000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87888888888888877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000001030405060606050403010000000000000000030608090e0e0e0e0e0e0c0b09060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c2014070013202c3946535f6c7986929facb2a5988b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80808284878b8f92999fa7aea79f9691847b6e665c50443a2f24180d0100000a1723303d4a5663707d87878787878787878787878787878787878787878787878787878787878787878787878787878787877e7164574a3e3124170b0013202c3946535f6c7986929393939393867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929393939393867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b88949facaea39992857d75716e686b6b666d6e72767d84909492857d8996a3aca09386796d6053463a2d201307000005111e2a36424d5663707d89949faaa79d928c80766e69656362616263656a6f767f879299a4a99f948c7f73695f53463c31261a0f010000000000000000000005080a0b1313131313131313131313131313131313131313131313131313131313131313131313130f0f0d09040000000000000000000000000000000000000000020b151f272f34383a4346464646464642413d3730271e222a31373a3c454646464646463f3e3a342d251b110600000000000004101c2934404b55616c76828f97a1aaafa49a92877e736d665f58534e4946443f41404040413f4446484d53565e616c717c859298a2aca89f948d80736a5f53473e33281c10040000000000000004101c2834404b545f6a717e87939fa2aaa9a199938e86827e7a777574737373747577797c80858b91969da5afa79f9691847a6e665c50443c32261b0f040000000013202c3946535f6c7986929facb3a79a8d80808080808080808080808080808080808080808080808080808080808080808080808080807c6f6255483c2f22150900000000020c16202b343e4850585f676d737a7f8386898c8e8f9192929292929191908e8b8986827d79716c655f584f473d342b20160c01000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949595959594877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c10040013202c3946535f6c7986929facada093867972727272727272727272727272727272737475787a7e828790959da4aea9a1969083786d60554b4135291d110400000713202d3a4653606d787a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a796d6053463a2d2013070013202c3946535f6c7986929f9f9f9f93867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929f9f9f9f93867a6d6053473a2d2014070606060606060606060504020000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b0ac9f92877c6f6b64615e56545c6062656c707a8290949083909daaaca09386796d6053463a2d20130700000714202d3a46525e6976828f9ca6aca0958d80736d625f575655545556585f626d727e87939fa6a69f92867b6e61584e43372b1e13080000000000000000060c111517182020202020202020202020202020202020202020202020202020202020202020202020201c1b191510090200000000000000000000000000000000000000030d151d23292c2d363939393939393635312c261e151820262b2e2f3939393939393932312e29231b13090000000000000006131f2c3845515c67707d8a949fa9b0a69f93887e716c605c544e47433c3a38342e3433342d3338393c42464d525a616a6f7c86929aa4afa69f92877b6e62594f44392d20150a0000000000000006131f2c3845515c666f7c869299a4aea8a0979187817b75716d6869676766676768676d7073797e848e939fa4aca8a0969083786d60584e43372b20150a0000000013202c3946535f6c7986929facada0938679737373737373737373737373737373737373737373737373737373737373737373737373736f6a5f53473a2e2115080000000008131e28323d46505a616a6f7a80868b909399999b9c9d9e9f9f9f9f9e9d9c9a9898928e8a847e786e6a60594f463d32281e1308000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0a2a2a194877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000020608080b0e10121213131211100e0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000020507080a0d0f1111121313131211100e0c0906050300000000000000000000000000000000000000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b000013202c3946535f6c7986929facada093867a6d656565656565656565656565656566666769686d71767c838d929da5afa89f958c7f72675d5145392c201307000006131f2c3845515c666d6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6d675c5145382c1f13060013202c3946535f6c7986929facaca093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facaca093867a6d6053473a2d20141313131313131313131212110f0d0a07060401000000000000000000000000000000000000000005111e2a36424d576976838f9ca9b1a79a8d80736a605954524c4a5053555a61676d798290959095a0abaca09386796d6053463a2d20130700000814212e3b4754616e7b87939e9fa39d9083786d605b534d49484748494e535b626c727f8c949faba3988f82756a5f53473a2f24190d010000000000000911171d2124252d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000030b12181c1f202a2d2d2d2d2d2d292825211b140c0e151b1f21222c2d2d2d2d2d2d2524221e1811090100000000000003101c28343f4a54606d7984919ea6b0aa9e948c7f736c625a504a423c37322d2c282327272722282b2d31363b42465058606a707e88939fa8aea3998f82766c6155493c31261b0f00000000000004111d2935414b55606d79839098a3aba9a09691857d746e6964615d565b5a5a5a5a555c6063666d7179818b939aa4afa89f958c80736a5f54473d32271b0f0100000013202c3946535f6c7986929facada093867a6d676767676767676767676767676767676767676767676767676767676767676767676767625f584e43372b1f1206000000010d1924303a444e58616c707c848d92989c9fa4a49f9e9c9a9a99999a9a9b9d9fa3a29f9b96918b837c706b60584e443a2f24190d020000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000104090e121415181b1d1e1f20201f1e1d1a181514120e090401000000000000000000000000000000000000000000000000000000000000000105080e11141417191c1d1e1f20201f1f1e1c1b181513120f0b060000000000000000000000000000000000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a1005000013202c3946535f6c7986929facada093867a6d6058585858585858585858585858595a5a565d60646a6f78808d939eaab1a79e92857a6d6054473a2f24180d010004101c2834404b545c606161616161616161616161616161616161616161616161616161616161616161616161616161616161605c554b4034281c10040013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20202020202020202020201f1f1e1c1a171413110d08040000000000000000000000000000000000000714202d3a46525e697885929fabaca095877b6e61584f4746413f44464850555d676e7b85929da0a7b1aca09386796d6053463a2d20130700000c1926323f4c5965727f8c8f91929996897d70665c5047423d3b3b3b3d4347515a606c77828f99a3aa9f93877c6f62564c4135291d1104000000000009121b22292d30313939393939393939393939393939393939393939393939393939393939393939393939393635312c261e150c020000000000000000000000000000000000000001070c1013141d2020202020201c1b1915100902030a0f1215151f202020202020191815120d06000000000000000006121f2b3844505c66727f8c96a0acaea2988f82776c605a50443f38302b26201f1c171a1a1a171c1f20252a30363e464e58616c73808d96a1acab9f948a7d7064584e43372b1d120700000000000613202c3945515d67737f8c95a0aaada19791847b706b615e5754524c4e4d4d4d4e4b5153545c60676d747f88939fa5afa79f92877c6f62584e43372b1d120700000013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261b0f0300000005111d2935414c56606a707e8691969fa2a49f9b9993918f8e8d8d8c8d8d8f9092989a9fa2a19e9590867d706a60564c4135291e13080000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e21150800000000000000000000000000000000000000000000000001080d11151a1e212225282a2b2c2c2c2b2b2a272421211e1a14100d070100000000000000000000000000000000000000000000000000000002080d1114191e20212426292a2b2c2c2d2c2c2b29272522201f1b17110f0a040000000000000000000000000000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a110800000013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4d4d4c5254585f666c78818e98a2aeada2978b7e7265554b4035291d100400000c18232e39424b51535454545454545454545454545454545454585c5c5c5c5c58545454545454545454545454545454545453514b43392e23180c000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2c2b2a28262421201d1913100c07000000000000000000000000000000000814212e3b4754616e7b8798a2aeaa9d908377695e53463d393634383a3e434c555e69717e8b97a1adb9aca09386796d6053463a2d20130700000a1723303d4a5663707d80828486888a84776b60544a3f37312f2e2f31373f44505b656e7b87929faca49a8e8174685d5245392c2013080000000006111b242d34393d3e46464646464646464646464646464646464646464646464646464646464646464646464642413d3730271e140900000000000000000000000000000000000000000000040607101313131313130f0f0d09040000000003060809121313131313130c0b0906010000000000000000000713202d3a4653606d7884919ea8b2a99f92867b6e655b50483e342e261e1b1312100c060d060b0f12131a1f252a343d46505a606d7984919ea8b0a69c8f83766a5f5347392e23180c00000000000714212d3a4754606d7a85929fa7b0a69e92857b6e696059524d47464141404040414045464b51555d606d727f8b939ea9afa3998f82766a605447392f24180c00000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c342a20150a000000000713202d3946525d686f7c869298a0a7a099938f8a868482818080808081828486898d92989da59f9892867c6f685d52453a3024190d0100000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0acaca194877b6e6154483b2e2115080000000000000000000000000000000000000000000000070c13191d20262b2e2f3234363839393938373634312e2d2a25201d18120c0400000000000000000000000000000000000000000000000002090e13191e20252a2d2e30333537383839393938373634322f2d2b27221b1b16100b04000000000000000000000000000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c1610080000000013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f40414145474e545b666d7a85929fabb3a99c908376675d5145392c201306000007121d2730394045464747474747474747474747474747505a6264686868686865625b5147474747474747474747474747474645403930271d1207000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a3939393939393939393939393938373533312d2c29241f1c18120c060000000000000000000000000000091623303c4956636f7c8996aab4a79a8e817467574d42342d2a282b2d313a434d57606d7985929eabb8aca09386796d6053463a2d20130700000916222f3c4854606b70737577797b7d7d7063594f42382e26222122262b333f49535f6974818e9aa6ac9f92867a6d6054473a2f24190d010000000c17222d363e45494b5353535353535353535353535353535353535353535353535353535353535353535353534f4d49423930261b10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c5664707d8a96a1adada1978c7f72695e53493f3628231c140c0a060300000000000306090e1419222b343e45515d67717e8a96a0acab9f94887c6f62544b4034281c100400000006131f2b37434e5866727f8c97a2adaa9e948a7d70695f574f46423b3935303433342e34383a40454b515b626d74818e97a1adab9e94897c6f62554b4035291d1004000013202c3946535f6c7986929facada093867a6d6053474040404040404040404040404040404040404040404040404040404040404040403c3a37312a22180e0400000005121e2a36424d57616d7a859298a3a69f959087827d7a77767474737373747577797d80868e929ba3a29891847a6d60564c4135291d110400000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949f9f9f9f94877b6e6154483b2e211508000000000000000000000000000000000000000000030b12181e24292c31373a3b3e414345454646454443413e3b3a36312c29241d160d0802000000000000000000000000000000000000000000070c141a1e252a2d3036393b3d4042444445464646454443413f3c3937332d2b27201b160d070100000000000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b05000000000013202c3946535f6c7986929facada093867a6d6053473a3232323232323232323233332f35393c424a545e68737f8c99a9b2ac9f9286796d6053473a2d2014070000000b151e272e34383a3b3b3b3b3b3b3b3b3b3b3b3b3b4956626c717575757575726d62564a3b3b3b3b3b3b3b3b3b3b3b3b3b3a38342e271e150b00000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053474646464646464646464646464645454442403d3a39352f2c28231d17110a030000000000000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f31261e1c1f2028313b45515c6673808d99aab4aca09386796d6053463a2d20130700000714202c38444f5960636669666d6f71706b6054473d30262c2c2c2b2a222d38414d57626e7b88949faba3988b7e7265554c4135291d1104000005111d29343e485056586060606060606060606060606060606060606060606060606060606060606060606060605c5a544c42372c21150900000000000002070a0c0d131313131313120908060300000000060b0e10111313131313130f07060300000000000000000000000000000000000000000000000714202d3946525e6876828f9ca8b2ab9e9185796d60574d41382d2417110a02000000000000000000000002091019222935404b55606c7884919dabb0a69a8e8174665c5145382c1f13060000000815222e3b4754606a7884919ea9b1a79c8f82756c61574d453d36302d292427272723282c2e343a4145515b606d7a85929eaab0a69b8e8275675d5145392c1f1306000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343434342f2e2b2620181006000000000714212d3a46535f6974808d97a1a99f948f837c75706d686967676666676768666d70747a818b919ba5a1968d8074685d5245392c20130700000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87939393939393877b6e6154483b2e2115080000000000000000000000000000000000000000060c151d23282f35393c4247484b4e50515253535251504d4b4846423b39352f281f19130c04000000000000000000000000000000000000030b12181f252a3036393b4146474a4c4f50515253535252514f4e4b4846443f3837322c272118130c04000000000000000000000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d252525252525252525262724292c2f38424c56626f7b8896a1adaea399897c6f6256493c2f231609000000030c151d23282c2d2e2e2e2e2e2e2e2e2e2e2e313e4b5864717e82828282827f7265584c3f322e2e2e2e2e2e2e2e2e2e2e2d2c28231d150c0300000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d605353535353535353535353535353535252514f4d4a4745413a38342e28231c150c0700000000000000000000000b1824313e4b5764717e8a97a4b0a4978a7d7164574a3e3124171012161f2834404b54626f7c8998a3aeaca09386796d6053463a2d201307000004101c27333d474f54565a545c6062646360594f44353638393939383734312f3c47535f6a76838f9ca9aa9c908376675d5145392c20130600000815212d3945505a62646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69655e54493d3125190d0000000000070d1316191a2020202020201f1515120f0a04040b11171a1d1e2020202020201c1312100b060000000000000000000000000000000000000000000814212e3b4754616e7a87939facafa3998c7f72675d51453b2f261b1206000000000000000000000000000000071018242f3944505b66727e8b99a3aeac9f9285796d6053463a2d2013080000000916222f3c4955626f7c8896a1acaca095897c6f625a50453b332a25201d191a1a1a181c1f23282f353f45515d67727f8b98a2aeac9f9286796d6053473a2d201406000013202c3946535f6c7986929facada093867a6d6053473a2d2727272727272727272727272727272727272727272727272727272727272722211f1b150e0600000000000815222e3b4855616e7b86929fa9a1978f82796e6a64615d565b5a5a595a5a545c6063686d747f8b939ea89f92867a6d6054473a2d21140700000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a86868686868686867b6e6154483b2e211508000000000000000000000000000000000000000810181e272e343a4145474d5355585b5d5e5f5f5f5e5e5d5a5754534d474540393129251e160e0500000000000000000000000000000000050c151c232830363a4146474d525457595c5d5e5f5f605f5f5e5c5a585553504947433d383229241d160d060000000000000000000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201919191919191919191a191d20262f3a47535f6a7885919eabb5ab978b7e7164584b3e3125180b00000000030b12181c1f20212121212121212121212734404d5a6773808d8f8f8f8e8174685b4e41352821212121212121212121201f1c18120b030000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d606060606060606060606060606060605f5e5d5b595754514c46454039342e261e191009000000000000000000000b1825313e4b5864717e8b97a4b0a396897d7063564a3d3023170a060d18232e3a4653606d7986929facaca09386796d6053463a2d2013070000000b16212b353d44484a4d4b5153555756544f473e4143454646464543413e3a39424e5765727e8b98a7ac9f92867a6d6054473a2d21140600000a1724303d4956626c717979797979797979797979797979797979797979797979797979797979797979797979797570655a4d4135281b0f000000010a12191e2325262d2d2d2d2d2d2c22211f1b150e0e161d22272a2a2d2d2d2d2d2d29201f1c17110a02000000000000000000000000000000000000030f1b27333f495364717e8b9aa4afac9f92867a6e61554b4033291d140a000000000000000000000000000000000007121d28333f4a54616d7a86929facaea298897d706356493d2f24190d0100000d1a2633404d596673808c99a8b2aa9d9083776a6054483e332a211a14110d080d070c1013181d242935414c55606d7985929fabaea2988a7d7164574a3e2e23170b000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1515120f0a04000000000004101c2934404b556673808c99a2a99e91857a6d675f5854524c4e4d4d4d4d4e4b5153565d606d75818e9ba9a2988b7e7164584b3e3125180b00000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000713202d3946525e6876797979797979797976695e52463a2d20140700000000000000000000000000000000000009121a222a303940454c5254575f626567696b6c6c6c6b6a696764615e5753514b433e35302820170e050000000000000000000000000000050e171e272e343b42464c5254565e616366686a6b6b6c6c6c6b6a69676562605b53544e48443d352f281f180f0600000000000000000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c080d11141d2b37434e58697683909ca9b2a5988c7f7265594c3f3226190c000000000000070c1013131414141414141414141a2734404d5a6773808d9a9b9b8e8174685b4e4135281b1414141414141414141313100c0700000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a686664605d5553514b443f38302b221b120a0100000000000000000b1825323e4b5865717e8b98a4afa296897c6f6356493c302316090007131f2c3845515c667683909da9aca09386796d6053463a2d201307000000050f1a232b33383c3d40404546484a494845474a4d505152535252504e4b4746414754616e7a8795a0aca3998a7d7064574a3d2e23170b00000b1825313e4b5864717e8686868686868686868686868686868686868686868686868686868686868686868686868275695c4f4236291c0f0000000a131c242a2f3233393939393939392f2e2b2620181720272e333637393939393939352d2b28231c140c02000000000000000000000000000000000005121f2b3744505b6575818e9bacb6a99c8f8276685e5243392f21170b020000000000000000000000000000000000010b17222d3846525d6875828f9ca8b4aa9a8d807367564c4135291d11040005111e2a36424d576976838f9ca9b5ab998c7f7366584e43362c21180f0905010000000004070c1319242f3a45515d6774818e9aa7b4aa9b8e817468544a3f34281c10030013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d090806030000000000000006131f2c3845515c6777848f929797988b7f72685d554e4746414141404040414045464c525b626f7c8897a2aa9b8e8174685b4e4135281b0e02000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0005111d2a36414c565e6c6c6c6c6c6c6c6c6c6c5e574d42362a1e1205000000000000000000000000000000000009121a242c343c434b51565d6066696e7174767878797978777674716e6965605d555046413a322920170e05000000000000000000000000050e172029303940444d52565e6165686e70737577777879797978777674726f6c65626058544f45413a312a21180f060000000000000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000001040b1b2631424f5c6875828f9ba8b2a6998c7f7366594c403326190d000000000000000004060708080808080808080d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0808080808080808070604000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867979797979797979797979797979797979797878777573706d6764605c54504a423d342d241c130a01000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090004101c2834404b546875828f9ba8aca09386796d6053463a2d2013070000000008111a21272c2f302e34383a3c43474b5154575a5c5e5f5f5f5e5d5a5854524c48525e687784919daaab9a8d807467544a3f34281c1003000b1825313e4b5864717e8b939393939393939393939393939393939393939393939393939393939393939393938f8275695c4f4236291c0f000007121c252e353b3f40464646464646453c3a37312a22202932393f4344464646464646423a38342e261e140a00000000000000000000000000000000000613202d394653606c7885929eabb3a9988b7f7265564c4131271d0f050000000000000000000000000000000000000006111c2935414c5665727f8b98aab4aa9d918477685d5245392c201306000714202d3a46525e697885929eabafa399897c6f6256493d32231a0f060000000000000000000108131e2935404b5564707d8a97a9b3aa9d908377665c5044382b1f12060013202c3946535f6c7986929facada093867a6d6053473a2d2014070101010101010101010101010101010101010101010101010101010100000000000000000000000714202d3a4753606d79808285878a8c86796d60564c433c393530343333342e34383a4147535f6a7885929fa99d9083766a5d5043372a1d1004000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00010d1925303a444c525f60606060606060605f524d453b30251a0e020000000000000000000000000000000007111a242c363e464e555c60686d72777b7e818384858686858483807e7b76716d67615a524c443b332920170b0200000000000000000000040d172029323b424a51575e61686d72777a7d7f82838485868685858482817e7b78746f6a636059514b433b332a21180d0400000000000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000001040a1b2835424e5b6875818e9ba8b2a5988b7f7265584c3f3225190c000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facb9a2958b86868686868686868686868686868686868685858482807d7a76716d66605c544e463f372e251c1309000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000c18232e414e5b6874818e9ba7aca09386796d6053463a2d2013070000000000080f161c2022232a313a41454e53555d606467696b6c6c6c6b6a6764615d56544f566774818d9aa7a99c908376665c5044382b1f1206000b1825313e4b5864717e8b979f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9c8f8275695c4f4236291c0f00020d19242e3740474b4d535353535353524847433c342a21323b444a4f515353535353534f46443f3830261c1106000000000000000000000000000000000815222e3b4855616e7b8897a1adada197887b6e6255483b3022150b0000000000000000000000000000000000000000000d1924303c4855626f7b8898a2aeaca095877a6d6054473a2d211407000814212e3b4754616e7b8797a2adac9f92867a6d6053473a2d2014070000000000000000000000010d18242f3b4754616e7a8797a1adac9f9286796d6053463a2d2013070013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c676d7376787b7d807f73675d51443a312d29242727262723282c3037434e586a7784919daa9e9184776b5e5144382b1e1105000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000008131e28323a41465353535353535353534846423b33291f140900000000000000000000000000000000050e19232c363e4850585f676d737a7f84888b8e90919292929191908d8a87837e79716c615e564d453b32291d140a000000000000000000010c161f29323b444c545c60696e757a7f83878a8c8f90919292939292918f8d8b8885817c76706b605d554d453c332a20160c010000000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140a0a0a0a0a0a0a0b070d10141b2a36414c566976828f9ca9b4aa978a7e7164574b3e3124180b000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140b0b0b0b0b0b0b0b0b0a0a0907060401000000000000000000000000000000000000000000000013202c3946535f6c7986929facb9a79d959393939393939393939393939393939399939291908e8c8a86837e79726d666058514940372e251b10070000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000071a2734404d5a6773808d9aa6aca09386796d6053463a2d201307000000000000050b1019232b343c434c52585f62676d71747678797979787674716d686360595865717e8b98a4ac9f9285796d6053463a2d201307000b1825313e4b5864717e8b97a4a5a5a5a5a5a5a5a5a5a5a5a7a9aeacacacafa9a7a5a5a5a5a5a5a5a5a5a5a59c8f8275695c4f4236291c0f0007131e2a3540495257596060606060605f55534e463c332939444d555b5d6060606060605c53504a42382e2317130a0000000000000000000000000000000a1724303d4a5763707d8a96a9b3ab9e928578695f53473a2e2114030000000000000000000000000000000000000000000813202d394653606c7985929facb1a795897c6f6256493c2f231609000916232f3c4956626f7c8995a9b3aa9e918477675d5145382c1f13060000000000000000000000000714202d3946525e687885919eabaea398887b6e6255483b2f2215080013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c07060401000000000000000000000004101c2934404b555c606769696e7073736d63554b403228201d191a1a1e21262b30363e46525e697885919eab9e9184786b5e5145382b1e1205000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00000c17232e38424a5053555555555555555553514a42392e23180c000000000000000000000000000000020d17202b353e48505a616a6f797f868c9195989a9c9e9f9f9f9e9d9c9a9795908b857e766d685e574d443b2f261b1106000000000000000007121d28313b444d565e666d727b81868c909596999b9d9e9e9f9f9f9e9d9c9a9897918d89837d746d675f574d453c32281e13080000000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2016161616161616171718181d20262d3946525e687784909daaaea298897c6f6356493c30231609000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20181818181818181818171716151413110d080705020000000000000000000000000000000000000013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa49f9f9e9d9b9999928f8b857f786f6a625b514940372d22190c0300000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000050e19222b353d464e565d606a6f747a7d8083848586858583817e7a76706b625f626f7c8995aaaea298887b6e6255483b2f221508000b1825313e4b5864717e8b979898989898989898989898989a9da4aebaafa59d9a9898989898989898989898988f8275695c4f4236291c0f000a16232f3b47525b63666c6c6c6c6c6c6c625f584e453b323f4a555f676a6c6c6c6c6c6c68605c544a3f3428251c120900000000000000000000000000000c1926323f4c5965727f8c98a5b2a99c8f837669574d42372b1e120600000000000000000000000000000000000000000006121f2b3844505b667783909daab1a4978b7e7164584b3e3125180b000a1723303d4a5663707d8996a3b0a99c90837669554b4035291d100400000000000000000000000005111e2a36414c566a7683909da9b4aa96897c6f6356493c302316090013202c3946535f6c7986929facada093867a6d6053473a2d2019191919191919191919191919191919191919191919191919191413110d0701000000000000000000000c18232f39434b51535a575e61646666635b5143392f20191d2021262b2e31373a41464f59616e7b8796a1aa9d9083776a5d5044372a1d1104000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0003101c28343f4a545c606262626262626262605c544a4034281c1004000000000000000000000000000008141e29323d47505a616c717c848c92989da0a7a7a7a4a3a2a1a2a4a6a7a79f9d97918a827a6e695e564c41382d22170b01000000000000010d18242f39434d565e686e787f868e92999da0a7a6a8a7a5a4a3a3a4a5a7a9a7a9a19e9a94908981796e695f574d443a2f24190d04000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a2d232323232323232324242524292c2f38404b55616e7a86939facac9f9285796d6053463a2d201307000000000000000004060708080808080808080d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0808080808080808070604000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d242424242424242424242424232221201d191514120e0903000000000000000000000000000000000013202c3946535f6c7986929facb9b3a9a19e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9fa2aaa2a5a8aba39f9c97928c837c726d635b51493f342b1e150b00000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000020c17202b343d474f585f686d747c81868a8d8f9192929291908d8b86827d766f6a616d7a8798a2aeaa968a7d7063574a3d3024170a000b1825313e4b5864717e8b8b8b8b8b8b8b8b8b8b8b8b8b8b8d929da9b5a99d938e8b8b8b8b8b8b8b8b8b8b8b8b8b8275695c4f4236291c0f000c1925323f4b57636d73797979797979786f6a5f574d443a434f5b677177797979797979756d665c504440372d241b1108000000000000000000000000000e1b2834414e5b6774818e9aa7b3a79a8d8074675a4d4131261a0e02000000000000000000000000000000000000000000030f1c28333f4a546875818e9ba8b3a6998d8073665a4d4033271a0d000b1724313e4a5764717d8a97a4b0a89b8f8275685c4f422f24180c00000000000000000000000000010d192530424f5c6875828f9ba8b0a3968a7d7063574a3d3024170a0013202c3946535f6c7986929facada093867a6d6053473a2d26262626262626262626262626262626262626262626262626262621201d18130c0400000000000000000007121d2731394045474d4d535457595957514940312720252a2d2e31373a3c42464c5259616b73808d99a9aa9b8e8175685b4f4235281c0f02000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0006121f2c3844505c666d6f6f6f6f6f6f6f6f6d665c5144382c1f120600000000000000000000000000020b1925303b444f59616c717e8691969fa2aaa9a19e9b9796959595979a9ea1a8a9a19e948f837b6e685e53493f33271e130800000000000004101d2935404b555e696e7a838c92989fa3ababa39f9d9a9897969697989a9d9fa3ababa69f9c938e847b6e695f564c41352921160a0000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473a3030303030303030303031312f35393c4149515d67727e8b99a4afa79c8f8275665c5145382c1f1306000000000000070c1013131414141414141414141a2734404d5a6773808d9aa69b8e8174685b4e4135281b1414141414141414141313100c0700000000000013202c3946535f6c7986929facada093867a6d6053473a31313131313131313131313131302f2d2c292422211e1a14100b0600000000000000000000000000000013202c3946535f6c7986929facb9ada1979292929292929292929292929292929292989495989b9fa3aaa9a19e9591877f736d635b51463c30271d1207000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000008131e29323d464f59606a6f7a81878e92989a9c9e9f9f9f9e9d9a99928f89837c726d687885929faba5988b7f7265584c3f3225190c000815222f3b4855626e7c7f7f7f7f7f7f7f7f7f7f7f7f7f7f808d9aa7b4a79a8e807f7f7f7f7f7f7f7f7f7f7f7f7f7d7063574a3d3024170a000d1a2633404d59667380868686868686857c6f695e564c4344515d6a778386868686868682786d605c52493f362d231a1107000000000000000000000000101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190900000000000000000000000000000000000000000000000b17222d404d5a6773808d9aa6b3a89b8e8175685b4f4235281c0f000b1825313e4b5864717e8b97a4b1a89b8e8275685b4f4235281c070000000000000000000000000000081b2835414e5b6874818e9ba7b0a4978a7d7164574a3e3124170b0013202c3946535f6c7986929facada093867a6d6053473a333333333333333333333333333333333333333333333333333333332d2c29241d160d040000000000000000010b151f272f34383a404246484a4d4c4b464037292c2d3036393a3e4247484d53565e616b707d87929faca2988b7e7265584b3f3225180c00000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000713202d3a4653606d787c7c7c7c7c7c7c7c786d6053463a2d201307000000000000000000000000000a141d2a36414c56606b717e879298a0a8a8a19e97928e8b898888898a8d91969ea1a8a69f9591847a6e655b50443a2f24190d0000000000050f1a232c3945515d676e7b8490959fa2aaa9a19e9992908d8b8a89898a8b8d9092999ea1a9aba59e9691847b6e685d52453d32271b0f03000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6053473d3d3d3d3d3d3d3d3d3d3d3e3e3f4045474e535b606d7984919eababa0958a7d7164544b4034281c100400000000030b12181c1f20212121212121212121212734404d5a6773808d9aa69b8e8174685b4e41352821212121212121212121201f1c18120b030000000013202c3946535f6c7986929facada093867a6d6053473e3e3e3e3e3e3e3e3e3e3e3e3e3d3d3c3a39352f2e2d2a261f1c17110a020000000000000000000000000013202c3946535f6c7986929facb8ab9e9285858585858585858585858585858585858687898b8e92989fa2aaa7a099928b7f736d62584e43392e23180c000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000010d1925303a444e58606b707c848e939a9fa2aaa9a8a4aba39fa3aba39f9c9490877f746d7784919daaa69a8d8073675a4d4034271a0d000814212e3a47535f6a6e72727272727272727272727272727d8a96a3b0a3978a7d72727272727272727272727272706b6155483c2f231609000a1623303d495663707d87929a93939791847b6e685e554b424d5a6774808d93939393938e81746e635b51483f352c231910060000000000000000000000101d2a3643505d697683909ca9b1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000061926323f4c5965727f8c98a5b2a89c8f8275695c4f4236291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2834414e5b6774818e9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a39352f281f160c010000000000000000030d151d23292c2d31363a3b3d40403e3b352f35393a3d4146474a4d5355575f61686d747d869299a3a79f92867a6d6154473a2e21140700000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87888888888888877b6e6154483b2e21150800000000000000000000000006111b262f3846525e68707d879299a3aaa49d96918a85817e7d7b7b7c7d80848a91969fa7a7a0968f82776c60564c4135291c1106000000000b16212c38444f59606d798390969fa7aea59d97918c8683817e7d7d7d7d7e8083868c91979ea5ada8a09691847a6d60594f43382c1f14090000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d605349494949494949494949494a4a4b4c4b5153585f656c74808d96a1aca4999083786c605346392e23180c00000000030c151d23282c2d2e2e2e2e2e2e2e2e2e2e2e34404d5a6773808d9aa69b8e8174685b4e41352e2e2e2e2e2e2e2e2e2e2e2d2c28231d150c0300000013202c3946535f6c7986929facada093867a6d60534b4b4b4b4b4b4b4b4b4b4b4b4b4a4a49484745413f3b3a36312b28231c140c0701000000000000000000000013202c3946535f6c7986929facada093867978787878787878787878787878787878797a7c7f82868c92989fa7aba39f918b7f726a60554b4034281d12070000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000005111d2a36414c56606a707d8691969fa4acaaa29f9b979599929994979a9e9f99928c81787683909ca9a79b8e8174685b4e4135281b0e0006121e2b37424e575f6265656565656565656565656565707d8a96a3b0a3978a7d706565656565656565656565656361594f44382c201407000916222f3b4854606b717e88939fa4a19691847a6d675d544a4653606c78818e949fa69d938d80736d635a50473e352b22180f0600000000000000000000111e2a3744515d6a7783909daab0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1a99c908376695d5043362a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4745413a31281d1307000000000000000000030b12181c1f20252a2d2e3133332f34383a4045474a4c525457575f6265696e737a81889298a2a8a0958d8073685d5246392d20130700000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949595959594877b6e6154483b2e2115080000000000000000000000000b17222d38414f59616e7a859299a3aba49c928d847e787471706f6e6f7173787d8490959fa8a89f948c7f72685d5245382d22170b00000004101c27333c4854606b74818e95a0a8ada39c938e857f7b777472717070717274777a7f858e939ca4ada9a0968e81746b6054483b31251a0e02000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d6056565656565656565656565657575859555d60646a6f77808d929da8a59f93877d70655b5044372b1d1207000000000b151e272e34383a3b3b3b3b3b3b3b3b3b3b3b3b404d5a6773808d9aa69b8e8174685b4e413b3b3b3b3b3b3b3b3b3b3b3b3a38342e271e150b00000013202c3946535f6c7986929facada093867a6d6057575757575757575757575757575757565554514c4c4846423b38342e261e18120b030000000000000000000013202c3946535f6c7986929facada093867a6d6b6b6b6b6b6b6b6b6b6b6b6b6b6b666d6d6f72757a808590959fa6aea49f92877c6f675c5145392e23180c0000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000040f19232d3946525e686f7c869298a1a8aba39f98928e8a88878686888a8e92979f9f938d8075828f9ba8a89c8f8275695c4f4236291c0f00020e1a26313c454e535558585858585858585858585863707d8a96a3b0a3978a7d7064585858585858585858585857554f473e33281c1004000713202c38444f59616c727f8b929ca5a0969083796d665c5349505b666d78828f959fa59c928c7f726c625a50473d342a21180e05000000000000000000111e2b3844515e6b7784919eaaafa396897c706356493d3023160a00000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1aa9d9083776a5d5044372a1d11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605959595959595959595959595959595959595959595959595959595959595954514b433a2f24180d0100000000000000000001070c1013141a1e2124293036394045474b515357565e616467696e72767b80858d939aa2a79f969183796d60564c4135291d110500000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0a2a2a194877b6e6154483b2e2115080000000000000000000000030f1b27333f4953616b75828f97a1aba49c918c8079716c66646362626264666c707a839096a0aca69f92857a6d60544a3f33281c0f0300000714202c38444f5963707d89939ea7aea49c918c817a726e686765646363646567686e737a818c919ca5afa89e93897c6f63574d42362a1e12050000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867a6d636363636363636363636363636364646668676d71757c828d929da4a49f938c7f726b6053493f33271b0b0000000007121d273039404546474747474747474747474747474d5a6773808d9aa69b8e8174685b4e474747474747474747474747474645403930271d1207000013202c3946535f6c7986929facada093867a6d64646464646464646464646464646464646362605d555855534d46443f383029231d150d0500000000000000000013202c3946535f6c7986929facada093867a6d605f5f5f5f5f5f5f5f5f5f5f5f5f5c60616265686d737b838f949fa7afa3999183796d60544b4034281c100400000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000a16212c38444f59616d7a849198a2aaaaa299928d85817d7b7a79797b7d81858b92979d928a7e818e9ba7a99d9083766a5d5043372a1d1000000915202a333c4247484c4c4c4c4c4c4c4c4c4c4c5763707d8a96a3b0a3978a7d7064574c4c4c4c4c4c4c4c4c4c4a48443e352c21160b000004101c27323d47505a626d73808c929da59f958f82786d655b504a545c666d79839096a0a49c918b7e716c61594f463c332a20170d040000000000000000121f2b3845525e6b7885919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0aa9e9184776b5e5144382b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6666666666666666666666666666666666666666666666666666666666666666605d554b4135291d1104000000000000000000000000040610181f272f353b41464b5153555d606467686d7174777b7f83888d92989fa4a39f9590847b6e675d51443a3024190d0100000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e211508000000000000000000000005121f2b3744505b65707d8a939ea9a79d928c7f746d67605b5456555556545b60686d7984919da6aea2988c7f72665b5044382b1f120600000916222f3c4854606b7783909da5afa89d928c7f746d68615e56585756565758565e61686d747f8c939da9afa59c8f8276695e53463a2d211407000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facada093867970707070707070707070707070707071717274767a7d82878f949da4a099938c80746d63594f41382d22170b000000000c18232e39424b515354545454545454545454545454545a6773808d9aa69b8e8174685b545454545454545454545454545453514b43392e23180c000013202c3946535f6c7986929facada0938679717171717171717171717171717171717170706f6d676865615f5753504a423d342f271f170e05000000000000000013202c3946535f6c7986929facada093867a6d605352525252525252525252524a50535456565e61696e78828f95a0acaba0958b7f72665c5145382c1f130600000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000030f1b27323c4855606b75818e96a1aaaaa2989287807a75716e6d676d6e7074797f858f949e9185818e9ba8aa9d9084776a5d5144372a1e110000030e18212a31373a3b3f3f3f3f3f3f3f3f3f3f4a5763707d8a96a3b0a3978a7d7064574a3f3f3f3f3f3f3f3f3f3d3c38332c231a10050000000b16212b353e48515b636e74808e939ea69f948e81776c605b514b545d676d7a849196a1a39f92877e706b60584e453b322920160d0300000000000000121f2b3845525e6b7884919eabafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0aa9d9184776a5e5144372b1e11000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada09386797272727272727272727272727272727272727272727272727272727272727272726d675d5145392c201306000000000000000000000000071019222a313940454d52555c6064676d7074777a7d8184888c90959a9fa2a39f98928c837b6e695e554b4032281e13080000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e21150800000000000000000000000613202d394653606c7883909da6aca0958d80736d605c55504a4a4848494a50565d676f7d89949facaa9e9185786c605346392d2013060004101c2834404b5463707d8995a0acaca0968d80736d605d56524d4b4a4a4a4a4b4c52565d606d74818e97a2adab9f94877b6e6154483b2e211507000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facb0a396897d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d7d7e7f8183868a8e93999f9f9d9590877f746e645b51473d2f261b110600000004101c2834404b545c606161616161616161616161616161616773808d9aa69b8e817468616161616161616161616161616161605c554b4034281c10040013202c3946535f6c7986929facb1a4978b7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7d7d7c7b7a7875726e6964605c544f454039312920170e050000000000000013202c3946535f6c7986929facada093867a6d605347454545454545454545453f444647494c52575f666d7a83919da6b0a79e9184796d6053463a2d20130900000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000007131f2c38444f5963707d89939ea8aea29892867d746d686462605d606164676d727a828e93979185929facaa9e9184776b5e5144382b1e11000000060f1820262b2e2f3232323232323232323d4a5763707d8a96a3b0a3978a7d7064574a3d3232323232323232302f2c28211a110800000000050f19232c363f49525c606c78818f949fa69e938d80746d635a504b555e686e7b849197a2a39992867d706a5f574d443b32281f150c03000000000000111e2b3844515e6b7784919eaab0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a5d5043372a1d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb2a6998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6054473a2d2114070000000000000000000000061019232b343c434b51565e61676d71757a7d8084868a8d9196989d9fa7aba399928e867f796e695e574d43392f20160c020000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0acaca194877b6e6154483b2e2115080000000000000000000005111e2a36424d5763707d8a95a0aca69d9083786d605b514b443f3d3c3b3c3f444c55606b7683909c9f9e9d97897c6f6256493c2f2316090006131f2c3845515c6675818e9ba7b1a99e9184796d605b524c46413f3e3d3d3e3f41464c525b606d7a85929fabb0a6988c7f7265594c3f2f24180d0100000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facb9a5998f8989898989898989898989898989898a8a8b8c8e9092989b9e9c9995908a837d726d645c53493f352b1d140a0000000006131f2c3845515c666d6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e73808d9aa69b8e81746e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6d675c5145382c1f13060013202c3946535f6c7986929facb9a69a908b8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a89888784827f7b76716d666059514b433a322920160c0300000000000013202c3946535f6c7986929facada093867a6d6053473a38383838383838382e34383a3a3c41464d545d686f7c89949eaaada1968a7d7064574a3d31251a0e02000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000915222f3b4854606b7683909da5afa69f92867d706b605d565554515355555d60686d78818e94989298a2aeab9e9184786b5e5145382b1e1200000000060e151a1e21222525252525252525303d4a5763707d8a96a3b0a3978a7d7064574a3d31252525252525252423201c16100800000000000007111a242d374044505b666d79828f95a0a59d928c7f726c625a504c565e696e7c859298a2a39892867c6f695f564d443a31271e150b020000000000111e2a3744515d6a7784909daab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1a99c8f8276695c504336291d10000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a89c918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877b6e6154483b2e21150800000000000000000000030c18222b353d464e555d60686e73797e82868a8d90939a9a9ea0a8a9abb1ac9f9287817b736d665e574d453b31271d0e04000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949f9f9f9f94877b6e6154483b2e211508000000000000000000000714202d3a46525e6976828f9ca7ab9f94897d70665c50454039332d2f2f2d333a434f5964717e8b989291908f8c7f7366594c403326190d000713202d3a4653606d7985929facada1978a7e71675d5145413a36303130303130363a4145525d68737f8c99a9b3a89c8f827569554b4035291d10040000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facb9aba199969696969696969696969696969696969797999b9d9f9e96918f8c88837e78706b625b534a41372e23190b02000000000713202d3a4653606d797a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a808d9aa79b8e817a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a796d6053463a2d2013070013202c3946535f6c7986929facb9aca29a97979797979797979797979797979797979797969596918f8b88837e78706b605c554c443a32281e150a00000000000013202c3946535f6c7986929facada093867a6d6053473a2d2c2c2c2c2c2c2c23282b2d2e30363b424c56606b75828f9cabb2a89b8e817568574d42362a1e1205000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700030f1c28333f4a54636f7c89959fabab9f948b7e716a6059524c48474546484b51565e666d788290989fa2aab4ab9e9185786b5e5245382b1f12000000000003090e1214151919191919191924303d4a5763707d8a96a3b0a3978a7d7064574a3d3124191919191919171614100b05000000000000000008121b2528333f4a545c676d79839096a0a49c918b7e716c61594f4d575f6a6f7d869299a3a29891857b6e685e564c433930261d140a0000000000101d2a3643505d697683909ca9b1a5988b7e7265584b3f3225180700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3a89b8f8275685c4f4235291c0f000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9ada39c999999999999999999999999999999999999999999999999999999999999999994877b6e6154483b2e211508000000000000000000000b151e2a343d474f585f676d737b80858a8f92989a9d9fa4a39f9fa4aba4a7a79a8d807b756f6a605c544a42382e23170c03000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87939393939393877b6e6154483b2e211508000000000000000205070814212e3b4754616e7b87939facaa9c9083766b60544a3f342f282222222228313d4855616e7b878685848483817f7265584b3f3225180c00091623303c4956636f7c8998a2a5a69e9285796d60554b40352f2a2524232324252a2f35414c56626f7c8897a1adab9e918578675d5145392c201306000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a0000000000000013202c3946535f6c7986929facb9b3aba5a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a4a4a5a7a99e948f84827f7b76716c656059514941382f251c110700000000000a1723303d4a5663707d87878787878787878787878787878787878d929da99e938e87878787878787878787878787878787877e7164574a3e3124170b0013202c3946535f6c7986929facb9b4aca6a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a3a3a8a19e9b9894908a847d746d675e564c443a30261c1106000000000013202c3946535f6c7986929facada093867a6d6053473a2d201f1f1f1f1f1f171c1f2021252a303a434f5964707d8a99a3afab9e928578695e53463a2d211407000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070006121f2b3844505b6674818e9ba7b1a79c8f82766c62584f45413b3a393a3b40454c545c666e7b86929facb4b7ab9e9184786b5e5145382b1e1200000000000000020608080c0c0c0c0c0c1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170c0c0c0c0c0a0907040000000000000000000000091317222d38424b555d676d7a849197a1a39f92877e706b60584e4e58606a707d87929aa4a19791847a6e685d554b42382f261b1106000000000f1c2835424f5b6875818e9ba8b3a6998c807366594d402f23180c00000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4a79a8e8174675b4e4134281b0e000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9b5ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a194877b6e6154483b2e21150800000000000000000007121c27303c464f59606a6f7980868d92979c9fa3a8a09e9a9992939995989b9f9d928d87827c736d665c544a3f34281e150a000000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a86868686868686867b6e6154483b2e211508000000000002080e1114141d2935404b5565727f8c99a4aea2988a7e7164594f42382e231d17191917212d3a46535f69767b7a7978777675726d62564a3d3124180b000c1926333f4c5966727f8c969798999a8d8174665c5143392f241e1917171717191e24303a4653606c7985929eabada197867a6d6053473a2d20140700000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f2316090000000000000013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9fa0a1a2a4a6aaa89c8f827e7a736e6964605b534f473f372f261d130a0000000000000a1723303d4a5663707d89949494949494949494949494949494949a9da4aea59e9b949494949494949494949494949494948a7d7164574a3e3124170b0013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a0a1a2a5a8aba8a69f9c95918981796d685e564c42382e23170c030000000013202c3946535f6c7986929facada093867a6d6053473a2d201412121212060b10121314191e28313d4754606d7a86929facada297877b6e6154483b2e211508000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000613202d394653606c7985929eabaca095897c6f635a50463d35302d2c2d2f353a424a545e6973808d9aa4afb7aa9e9184776b5e5144382b1e11000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000006111c262f39434c555e686e7b859197a2a39992867d6f6a5f574d4e58616b717e88939fa4a09690837a6d675d544a41382d22170b060000000d1a2734404d5a6773808d9aa6b3a89b8e817568554b4034291c100400000000000000000000000000000000000000000005121e2a36424d576976838f9ca9b2a5988c7f7265594c3f3226190c000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e2115080000000000000000000c18232e39424e58606b6f7c848c92989fa2a7a09d9996918d8a868687888b8e92989f9a948f8780786d665c50443e30261c11060000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000713202d3946525e6876797979797979797976695e52463a2d20140700000000050d14191e2021252c3845515d6776838f9cabac9f9285796d6053463d3026252525252525252a36424d575f696e6d676b6a696865625b51463a2e221509000e1b2835414e5b68748188898a8b8d8e8b7e7164544b4031271d130e080a0a080e131f2b3744505b657683909da9b3a994887b6e6155483b2e2215080000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f2215080000000000000013202c3946535f6c7986929facb9a79d95939393939393939393939393939393949597999d9f9e948f8a85807b726d605c544a42392e2318140b010000000000000a1723303d4a5663707d8996a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a7a9aeb6afaaa8a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1978a7d7164574a3e3124170b0013202c3946535f6c7986929facb9a79d959393939393939393939393939393939393949496989b9fa2a9aba7a09d938e837a6d685e544a3f342820150a0000000013202c3946535f6c7986929facada093867a6d6053473a2d2014070505050000030607080c16202c3945515d677783909daab3a9968a7d7063574a3d3024170a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000916232f3c4956626f7c8997a2adaa9d9083776b6054483f34292421202024293039424d57616e7b87939facb7aa9d9184776a5e5144372b1e11000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000a141d27303a434c565f696f7c859298a3a39892857c6f695e564c4f59616c727f8b929ca5a0959082796d665c53493f332722170c0000000c1925323f4c5865727f8b98abb5aa9d908477675c5145382c1f13060000000000000000000000000000000000000000000714212d3a46535f697885929fabb4aa968a7d7063574a3d3024170a000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a79d95939393939393939393939393939393939393939393939393939393939393939393877b6e6154483b2e211508000000000000000004101c2834404a545f6a6f7d8691969fa2a69e9c95908c8884807d7a797a7c7e81858c92989e99938c81786d605a5042382e23170c0000000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f0005111d2a36414c565e6c6c6c6c6c6c6c6c6c6c5e574d42362a1e1205000000050e171f252a2d2e32323a4753606d7986929faca89b8e8275675c51453832323232323232323230313b454d575e61605d555d5c5b585651493f34291d1206000714212d3a4754606d7a7b7c7d7f8081827b6e6155483b2e22150b0100000000030f1b27333f49536975828f9ca8aea295887b6f6255483c2f2215090000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d2114070000000000000013202c3946535f6c7986929facb9a2958b86868686868686868686868686868787888a8d90959a9f9c98928d867e756d665c544a40342820160a000000000000000a1723303d4a5663707d89969f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa6a8aeb6afa9a79f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b0013202c3946535f6c7986929facb9a2958b86868686868686868686868686868686868788898c8e92979da0a8aca59d9590837a6d665c50443c31261a0f0300000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000004111d2935414c556975828f9ca8b1a4988b7e7165584b3e3225180b000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000c1925323f4c5865727f8b98a9b3ab998c7f7266594f43362d2219141313181e27303b46525e697683909da9b6aa9d9083776a5d5044372a1d11000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000020b151e28313a444d575f6a6f7d869299a3a29791847b6e685e554b505a626d73808d939da59f948f82786d655b50443e34281d11050000091623303c4956636f7c8999a4afac9f9286796d6053473a2d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adaea298887b6e6155483b2e221508000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868686868686868686868686868686868686867b6e6154483b2e211508000000000000000006121f2c3844515c666f7c859298a0a8a19e948f89847f7b7774706d6c6d6f7174797f869195a09f938e81746c61544a3f34281c100300000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00010d1925303a444c525f60606060606060605f524d453b30251a0e020000020d1720293036393b3f3f3f495663707c8998a3aeaa988b7e7265554b403f3f3f3f3f3f3f3f3f3f3d3c383b454d535453514b51504f4b4a463f372d23180d01000613202c3945515d676d6e7071727374756e695f53463a2d2114030101000205080f17222d424f5b6875828e9ba8b5ab95887b6e6255483b2f2215080000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c2013060000000000000013202c3946535f6c7986929facada0938679797979797979797979797979797a7a7b7e8083888d9299a19f98928b81786d665c51443d32271b0f030000000000000a1723303d4a5663707d89939393939393939393939393939393939a9da4aea59d9b939393939393939393939393939393938a7d7164574a3e3124170b0013202c3946535f6c7986929facada0938679797979797979797979797979797979797a7b7c7f81858b91969fa4aca79f959082786d60584e43372b1f140900000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000010d19242f414e5b6874818e9ba7b2a5988c7f7265594c3f3226190c000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000e1b2834414e5b6774818e9aa7afa399897c6f6356493d32231b100806070c151e2a36424d576774808d9aa7b3a99c8f8276695c4f4336291c10000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000030c161f29323b454e58606b707e87929fa3a19691847a6d675d5145515b636e74818e939ea69e948e81776c605a5045392d21150800000714202d3a4753606d7a86939facaea399897d706353493f33271b0f030000000000000000000000000000000000000004111d2935414c5565717e8b98a9b3ac9f9285786d6053463a2d201307000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867979797979797979797979797979797979797979797979797979797979797979797976695e52463a2d20140700000000000000000713202d3a4653606d78839197a2a8a097928a827c77726e6967636060616265676d727b839196a19d938a7d70665c5044382c1f120600000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000008131e28323a41465353535353535353534846423b33291f140900000008141f29323b4146474c4c4c4c5966727f8c99aaaea398887b6f62554c4c4c4c4c4c4c4c4c4c4c4c4948443d3b4246484745404443423f3d3a342d251b1106000004111d2935414c555d6062636465666869615f574d42362a1e120d0d0e090e121419212b37434e58697683909ca9aea399877a6d6154473a2e2114070000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d11040000000000000013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c666c6d6e6f7173777b80879196a1a29f938e81786d60584e43382b20150a0000000000000a1723303d4a5663707d86868686868686868686868686868686868d929da89d938e86868686868686868686868686868686867e7164574a3e3124170b0013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c666d6d6e6f7275797e848d939aa4afa79f948d80736a5f53473b31261a0e02000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000000081b2734414e5a6774818d9aa7b2a6998c7f7366594c403326190d000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700101d293643505c6976838f9ca9ac9f92867a6d6053473a2d201407000000030c1a25303f4b5865727e8b98a5b1a89b8e8275685b4f4235281c0f000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000040d172029333c464f59616c717e8b919ca4a0969083796d60534749525c606d78818f949fa69e938d80736c6156493d3024170a00000613202c3945515d677784909daab4ab9a8d8073655b5044372b1f140a000000000000000000000000000000000000010c13202c3945515d6775828e9ba8b5a89c8f8275665c5044382b1f1206000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000006131f2b37434e5865727f8c95a0a9a09691857d766f6b66625f575753535455555d60696e7a84919ea59e9184786d6053463a2d20130800000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f000006111c2630383f444649494949494949494644403930271c12070000020e1925303b444d5254585858585b6875828e9ba8ac9f9286796d605858585858585858585858585856544f473d363a3b3a39352f363532312e29231b1309000000010d19242f3a434c5154555657585a5b5c55534d453b31261a1a1a1a1b1b1a1e21252a333b4754606a7884919eabac9f9286796c605346392d20130600000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d010000000000000013202c3946535f6c7986929facada093867a6d606060606060606060605b606061626466696e747c849196a1a59e938d80736a6054473c31261a0f0200000000000916232f3c4855616b707979797979797979797979797979797979808d9aa69b8e817979797979797979797979797979797979716c6155493c3023170a0013202c3946535f6c7986929facada093867a6d606060606060606060606060605c6061616365676d71798088939fa5afa69f92877c6f62574d42362a1e1205000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000004101c2834404a546875828e9ba8b2a5988c7f7265594c3f3226190c000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700111e2b3744515e6a7784919daaab9e918578675d5145392c1f130600000000091724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b0e000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000050e17212a343d474f59626c727f8c929da89f958e8175685b4e4244505c666d79828f95a0a59d928b7e7164584b3e3125180b000004101d2935404b556773808d9aa9b3ab9e9184786c6053463c2f261b1106000000000000000000000000000000000007131d28333f4a54606d7a86929facb1a7988b7f7265544a3f34281c1003000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60606060606060606060606060606060606060606060606060606060606060605f524d453b30251a0e02000000000000000815222e3b47545f6a7784919ea7a39891847b706b63605955534d4a474647484b51575e68707d8a96a1a1968a7e7164574b3e2f24190d01000000000000000000000000000000000003101d2a3643505d697683908f8275685c4f4235291c0f00000c17232e38424a5053555555555555555553514a42392e23180c000005111e2a36414d565e6165656565656a7784909daaaa9d9083776665656565656565656565656565656360594f44382d2e2d2c292429282524221d181109010000000008131e28313a41454748494a4c4d4e4f4846423b332923272727272728252a2d30363c454e58626f7c8896a1adab9c908376655b5044372b1f1205000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e211407000000000000000013202c3946535f6c7986929facada093867a6d6053535353535353534a505354545557575f616a6f7b84919ea7a59f92877c6f62584e43372b1f120600000000000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c73808d9aa69b8e81746c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d2114080013202c3946535f6c7986929facada093867a6d6053535353535353535353534a5153545556555d60676d747f8c939daaaea3998e8275695f53463a2d211407000013202c3946535f6c7986929facada093867a6d6053473a2d2014070606000104060708090b141f2c3844515c667683909ca9b1a4988b7e7165584b3e3225180b000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700121f2b3845525e6b7885919eabaa9d9084776a554b4035291d1004000000000b1824313e4b5764717e8a97a4b1a5998c7f7266594c3f3326190c000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000060f18222b353e47505a636d74808d9aa7a79d9083766a5d50433f4a545c676d7a84909daaa4998c807366594d4033261a0d0000010d18242f3d495663707c8997a1adaca196897d7063584e41382d22170f06000000000000000000000000000000071118242f3844505b66717e8b98a2aeaca095887b6e6155483b2e23170b00000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60535353535353535353535353535353535353535353535353535353535353534846423b33291f140900000000000000000916222f3c4955626f7c8896a0ac9f92867c6e696159544f4847423d3a393a3c40454d56606c7884919ea89b8f827568554c4135291d1104000000000000000000000000000000000408101d2a3643505d697683908f8275685c4f4235291c0f0003101c28343f4a545c606262626262626262605c544a4034281c1004000714202d3946525e686e7272727272727985929faca89b8e8275727272727272727272727272727272706b6054483c3126201f1d181d1c181815120d06000000000000010c161f282f35393a3b3d3e3f4041423b3a36312c2f3034343434343531363a3b41464e57606a74808d9aa8aea3998c7f726653493f33271b0f03000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d201307000000000000000013202c3946535f6c7986929facada093867a6d6053474646464646463f44464747484b4d53585f69707d8a959faba3998f82766a5f53473a2e211408000000000004101c27333d474f55566060606060606060606060606060606773808d9aa69b8e817468606060606060606060606060606060575550483e33281c11040013202c3946535f6c7986929facada093867a6d6053474646464646464646464044464748494b51555d606d74818e98a2aeab9f93877b6e6155483b2f24180d010013202c3946535f6c7986929facada093867a6d6053473a2d2014131313070d10131414151a1d27303a4653606d7985929fabb2a896897c706356493d3023160a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700121f2c3945525f6c7885929faba99c908376695d50432f24180c00000000000c1825323f4b5865727e8b98a5b5ab978a7e7164574a3e3124170b000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000000007101a232d373f44505c666d7983909da9a59d9083766a5d5043434c565e696f7c85929faca3998c807366594d4033261a0d0000000713202d3a4653606d7985929eacb2a89c8f82756a5f53493f332721180f0802000000000000000000000003091119232935404b55606c7884919daab3a99d908477695f53463a2d1c110600000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534746464646464646464646464646464646464646464646464646464646463b3a36302921170d0200000000000000000b1825323e4b5865717e8b98a8a79a8d81746a5f574f48443d3a37312d2d2e2f353b44505b6574818e9ba79e928578675d5145392c2013060000000000000000000000000000050c1114171d2a3643505d697683908f8275685c4f4235291c0f0006121f2c3844505c666d6f6f6f6f6f6f6f6f6d665c5144382c1f1206000814212e3b4754616e7a7f7f7f7f7f7f7f8c98a2aea99c8f827f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7d7063574e42372b1e13100c070f0c0b0906010000000000000000040d161e24292c2d2f3031323335362e2d2a32383b3d404040404141424246484c525860696f7c87929faca99f92867b6e6155483b2d22170b000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d1105000000000000000013202c3946535f6c7986929facada093867a6d6053473a393939392d3338393a3b3c3e42464e57616c7683909da9ab9f94887b6e6255483b2f2215060000000000000b16212c353d44484a53535353535353535353535353535a6773808d9aa69b8e8174685b53535353535353535353535353534a49453e362c22170c000013202c3946535f6c7986929facada093867a6d6053473a393939393939392e34383a3a3b3c40454b515b616d7a86929facafa4998c7f7366554b4035291d10040013202c3946535f6c7986929facada093867a6d6053473a2d202020202020181d20202122252a2f39434d57636f7c8998a2aeaca196877b6e6154473b2e211408000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700121f2c3945525f6c7885929faba99c908376695d50432f24180d01000000000c1926333f4c5966727f8c99a5afa399887c6f6255493c2f221609000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000060f19222c363f49525c606d78828f959fa69d938c807366594d424b555e686e7b859198a2a49a92867d706356493d3023160a00000006121f2c3844505c6673808d9aa4afaa9e94887c6f655b50443d332a2219140e09060400000100000406090e141a232b353d45515d67717e8a95a0acada2978b7e7265574d42362a1e0a0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a393939393939393939393939393939393939393939393939393939392e2d2a251f170f050000000000000000000d192633404c5966737f8c99a6a3968a7d7063584e453e38322e2b262020212429333f49536673808d99a6a197877a6d6054473a2d211407000000000000000000000000000810171c2123242a3643505d697683908f8275685c4f4235291c0f000713202d3a4653606d787c7c7c7c7c7c7c7c786d6053463a2d201307000714202d3a4753606d7a868b8b8b8b8b8c919caab4ab9f948f8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b84776a5f53473a2e2114080000020000000000000000000000000000040c13191d202122232425272829222b353d4448494d4d4d4d4e4e4f4d5354565e616a6f7b849199a3aba1978d8174695f53463a2d1b11060000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d01000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d22282b2d2d2e2f31363c45505a65727f8c98a5b0a6998c7f7366594c402d22170b00000000000005101a232c33383c3d464646464646464646464646464d5a6773808d9aa69b8e8174685b4e464646464646464646464646463e3c39332c241a1005000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d23282c2d2e2e2f35394046525e6873808d99a9b3ab9d908377675d5145392c2013060013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d24292c2d2e2f30363b424b555f6974818e9aaab4ab9e918478695e52463a2d201407000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700121f2b3845525e6b7885919eabaa9d9084776a554b4035291d1004000000030f1b27333f49536773808d9aa6ac9f92867a6d6053473a2d201407000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000050e18212b343e48515b636e74818e949ea79e948e81746e63574b4a545d676d7a849197a1a49f93887e716b6054483b2f22160900000003101c28343f4a54616e7b87939fabb0a69c9083776c60584e453c342a251e1a1312100c070e070c1013131a1f262a353d47505a606d7984919ea7b1a99f9285796d6053473b31261a0e0000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21201e1a140d05000000000000000000000d1a2633404d596673808c99a6a295887c6f6255493c332c27211e1d2024292d333b434e586774818d9aa7a994887b6e6155483b2e22150800000000000000000000000008121a22282d3031323643505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87888888888888877b6e6154483b2e211508000613202c3945515d6775828f98989898999ca3adbcb0a69f9c98989898989898989898989898989896887b6e6255483b3025190e02000000000000000000000000000000000001080d111314151617191a1b1c27323d474f54565a5a5a5a5a5b5c575e6164686d747c859196a0aaa39992857a6e61574d42362a1e0a000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e130800000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d202020171c1f20212122262a333e4955626f7c8895a2afa99c8f82766953493f33271b0f0300000000000008111a21272c2f30393939393939393939393939404d5a6773808d9aa69b8e8174685b4e4139393939393939393939393931302d28221a120800000013202c3946535f6c7986929facada093867a6d6053473a2d202020202020181c1f20212224292f35414c56626f7c8897a2adac9f9286796d6053473a2d2014070013202c3946535f6c7986929facada093867a6d6053473a393939393939392f35393a3b3b3d42464d545c676e7b87929facb1a79a8d817467574d42362a1e1105000b1825323e4b5865717e8b98a4aca295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700111e2b3744515e6a7784919daaab9e918578675d5145392c20130600000005121f2b3744505b6576838f9ca9aa9d908477675c5145382c1f1306000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000040d17202a333d47505a626d73808c939da69f958f82786d605b5244505c666d79839096a0a59c928b7f726c61594f44382c201307000000000c17232e3846535f6975828e99a3afab9f948b7f726a60574e463e36302a25201f1c181b1a1b181c1f20262b31363f474f59616c74808d96a1adada2978d8073675d5145392a1f14090000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d2020202020202020202020202020202020202020202020202020201514120e090200000000000000000000000c1925323f4c5865727f8b98a9a396897c706356493d332b262324292c2f35383f444d56606a7683909da9a399877a6e6154473b2e211408000000000000000000000008121a242c33393c3e3f3e43505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949595959594877b6e6154483b2e2115080004101d2935404b5565717e8b99a49f9fa5a7adb5bbb2aaa4a19f9f9f9f9f9f9f9f9f9f9f9f9f9fa8998c7f7266564d41362a1e11050000000000000000000000000000000000000001040607080a0b0c0d13202c38444f596063676767676768686a696e71757a81879197a0a8a19892877d6f685e52453b31261a0e00000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2014130b0f12131414151a212e3b4754616e7a8794a1adab9e928578655b5044372b1f1205000000000000000810161c2023232d2d2d2d2d2d2d2d2d2d2d34404d5a6773808d9aa69b8e8174685b4e41352d2d2d2d2d2d2d2d2d2d2d2423211c1710080000000013202c3946535f6c7986929facada093867a6d6053473a2d2014131313130c1012131415181d25303a4653606c7985929fabafa399897c6f6256493c2f2316090013202c3946535f6c7986929facada093867a6d60534746464646464646464640454747484a4d52575e666d79829099a3afab9f95897c6f6356493c30251a0e02000b1825323e4b5865717e8b989f9f9f95897c6f6256493c2f23160900000d1a2733404d5a6673808d999f9f9f9386796d6053463a2d20130700101d293643505c6976838f9ca9ac9f92867a6d6053473a2d20140a0000000613202d394653606c7985929fabac9b8e817468554b4034291c1004000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000030c161f29323c464f59616c727f8b929ca5a0969083796d665c5049525c606d78828f959fa69e938d80736d625a50473d32271b10030000000006111c2a36424d57626e7b87929fa8b0a69f92877c6f695f585046413b36312d2c282327272723282c2d31373b42465159606b717e8a929da8b1a79f92857a6d61554b4035291d10040000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d2014131313131313131313131313131313131313131313131313130807050200000000000000000000000000091623303c4956636f7c8997a1a5988b7e7265594f453d3731302f35393a40454950565e686f7c89959fac9f9286796d6053463a2d2013070000000000000000000008121a242c363e45494a4c4a46505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0a2a2a194877b6e6154483b2e21150800010d18242f3a4754616d7a86939393939a9da5afb5aaa0989593939393939393939393939393939393908376685e5246392d2014070000000000000000000000000000000000000000000000000000000916222f3b4854606b707373737374747576787b7e82868e9299a1a39f9791867e716b60564d4133291f140900000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e040000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c090e13202d3a4653606d798693a0acac9f9286796c605346392d2013060000000000000000050b10141617202020202020202020202734404d5a6773808d9aa69b8e8174685b4e41352820202020202020202020171714110c05000000000013202c3946535f6c7986929facada093867a6d6053473a2d2014070606000004060707070c131f2b3844505b667683909ca9b5ab978a7e7164574b3e3124180b0013202c3946535f6c7986929facada093867a6d6053535353535353535353534b5153545557575e61696e78818e949fabafa59d9083776b6054483b2f1f140900000b1825323e4b5865717e8b9393939393897c6f6256493c2f23160900000d1a2733404d5a6673808d939393939386796d6053463a2d201307000e1b2834414e5b6774818e9aa7afa399897c706356493d30261c110a080a111c28343f4a54626f7c8898a2aea49a8a7e7164574b3e2f23180c00000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000020b151e28313b444e58606b707e87929fa4a19791847a6d675d544a515b636e74818e949ea79e948e81776c605b51483e352b21160b0000000000000e1a26313b47535f6974808d96a0abaea39991857b6e6a615a524c46423c3a38342e3434342e34383a3c42474d535b626b707d86929fa4aeaaa0958b7f72685e5243392f24180d010000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0b0a080500000000000000000000000713202d3a4653606d7985929ea99c8f82766b60574f47433e3d3d4045474b51535b60686e7a84919ea7a99d908376665c5145382c1f130600000000000000000008121a242c363e48505557585651505d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e21150800000713202d3946525e687682868686868e929da9b0a4988e888686868686868686868686868686868686887b6e6154473b2e2114080000000000000000000000000000000000000000000000000000000a1623303d495663707d808080808181828385878b8f92999fa09e99928d857c716c61594f443b3021180d030000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20191919191919191a1a1c222d3a4754606d7a8793a0adafa399877a6d6054473a2d211407000000000000000000000407090a1313131313131313131a2734404d5a6773808d9aa69b8e8174685b4e4135281b1313131313131313130b0a08040000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000030f1c28333f4a546875828f9ba8b2a5988b7f7265584c3f3225190c0013202c3946535f6c7986929facada093867a6d606060606060606060606060555d6061626466696e737b828e939ea6b0a79e938a7d7063594f44382c200d0200000b1825323e4b5865717e868686868686867c6f6256493c2f23160b0301071a2733404d5a66738086868686868686786d6053463a2d201307000c1825323f4b5865727e8b98a9b2ab998c7f7266594f42382e231a1615141c232c3844505c6673808d9aaaac9f93877a6d6154473a2e21140700000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000a141d27303a434d565f6a6f7d869299a3a29892857b6e685e554b505a626d73808c939da69f958f82786d655b50493f362c23190f0400000000000009141f2b37424d57606d79849199a4afaba19791847c706c615e56534d494644404141414141404546494d53575f616d727d869298a2aeaca2989083786c60564c4131281d1207000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171714110c0500000000000000000006121f2b3844505c6673808c96a19f94897d70696059534e4b49494b5153555d60656c717a839096a0aca2978c7f7265544b4034281c1004000000000000000008121a242c363e48505a616465625b515d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0adaea194877b6e6154483b2e211508000005111e2a36414c5666707679797979818e9aa7aea195887c79797979797979797979797979797979797976685e5246392d2014070000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c8d8d8d8d8e8f909298979c9c9a9896918d86807a6f6a615a50473d32291f0f060000000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e04000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d252525252525252626262b2d333c4855616e7b8894a1aeaea399867a6d6053473a2d201407000000000000000000000000000006060606060606060d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0606060606060606000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000b17222d414e5b6774818e9aa7b2a5998c7f7266594c3f3326190c0013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c676d6e6e7073767b80858f949ea5afa8a0958e81756b6155473d32271b0f0000000b1724313d4a56626c71797979797979796f6a6054473b2e231c150c0b121826323f4b58636e737979797979797976665c5044382c1f1206000916222f3c4955626f7c8897a1adaa9d9184776b60544a3f342b26232222262e35414c56606d7985919eabaa9d908376685e5246392d20130700000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000006111c262f39434c565e696e7c859298a3a39992867c6f695f564c4f59616c727f8b929ca5a0969083796d665c53493f372d241a110700000000000000030e1a26313c45515d676f7d87939fa4aea9a19691867e756e68615e575653514a4e4e4d4e4e4b515356575f62696e767f879298a2aaafa49a92867c6f665b50443a301f160c01000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a2d27272727272727272727272727272727272727272727272727272727272423211c171008000000000000000003101c28343f4a54606d7a849199a49e91847b6f6b625f58585656555d6064676d71787e859095a0a8a49e92857a6d6154473a2e23180c000000000000000008121a242c363e48505a616c71726d625b5d697683908f8275685c4f4235291c0f000714212e3a4754616d7a8794a0acaca194877b6e6154483b2e2115080000010d1925303a44545e66696c6c6c75818e9ba8ada194877a6e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b5e564d41362a1e11050000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c999a9a9a9b9b9d9fa29f94908d8b8884807b746d68605850483e352b20170d00000000000000000000000915202b353f474e524d52575f62666a6e71737577787879797978777573706d67636059534d46423c332a1f140900000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a323232323232323233333137383f444f5964717e8b97a4b1ac9f928679675d5145392c1f1306000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000000061b2834414e5b6774818e9aa7b2a6998c7f7366594c403326190d0013202c3946535f6c7986929facada09386797979797979797979797979797979797a7a7b7d8082868c92979fa6afa79f969183796d60594f44352b21160b0000000915212e3a45505a62656c6c6c6c6c6c6c6260584e443d342e271e18151d2329333c47525c63666c6c6c6c6c6c6c6c5c544a3f34281c1003000613202d394653606c7884919eabaca095897d70665c50443f37312f2e2f30383f46525e68717e8b97a1ada3988b7e7265564c41362a1e110500000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000091217222d38424b555d686e7b849197a2a39f92877d706a60574d4e58606b707e87929fa4a19791847a6d675d544a41382d251b120800000000000000000009151f2935404b55606b727f8b929da4ada9a198928a817a746e696562605c545b5a5a5a5b545c606266696e747b828b9299a2aaaea39f93887e706a5f544a3f32291e0d0400000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343431302d28221a120800000000000000000b17232e3845525d68707d87939aa19691847d746f6a6764636366676d70757a7e838b9297a0a7a49c928b7e71685d5246392d1d12070000000000000008121a242c363e48505a616c717e7f726d6257697683908f8275685c4f4235291c0f000714212e3a4754616d7a87949f9f9f9f94877b6e6154483b2e211508000008131e28323a4146545a5d60606875828f9ba8ada093877a6d606060606060606060606060606060606054524d443b3025190e020000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5a6a7a7a8a9aba99c9083807e7c77736e69615e564e463e362c23190e0500000000000000000000010e1a26313d4751595e5f6060605e575f626466696a6b6b6c6c6c6b6a686663605d6060606055534d453c31261a0e02000000000000000000000013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f404142464a5057606b75828f9ca8b5aa9d9184776a554b4035291d1004000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000205101c2834404b556875828f9ba8b2a5988b7f7265584c3f3225190c0013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868687888a8c8f92999fa2a9aba39f9590847b6e675d51473e3323190f0400000005111d29343f4850565860606060606060605e56544f444039302a211f272f343e454d53555d60606060606060605f504a42382e23170c000005121f2b3744505b6574808d9aa6b0a89d9083786d605a5047433d3c3b3c3d424a505b616d7a85929ea9ab9f92867a6d6154473a3025190d0100000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000007101b2428333f4a545c676d7a839096a1a49c918b7e716b61584e4d565f6a6f7d869299a3a29891857b6e685e554b42382f261b130900000000000000000000030d18242f3a434f59626d74808d929ca3adaaa29f938e86807b76726f6d6669686767676869666d6f72777b81868f949fa3ababa39f918c7f726c61584e42382d20170d0000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605347404040404040404040404040404040404040404040404040404040404040403e3c39332c241a10050000000000000006111c2935414c56606b717e8892989f969188817c777471707073767a7d81858b91959ea1a9a29f928d80736c61564c4135291d0b0000000000000008121a242c363e48505a616c717e878b7f72695e697683908f8275685c4f4235291c0f000714212e3a4754616d7a87939393939393877b6e6154483b2e21150800010d1925303a444c52545757575c6875828f9ba8aca09386796d60575757575757575757575757575755544e46413b32291f1408000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c999f9fa0a1a2a4a6aa9e9185817e7a746e69605c554d443d342c241a1107000000000000000000000004111d2a36424e59636a6c6c6c6c6b636059585a5c5d5e5f5f5f5f5e5d5b575f626a6c6c6c6c6c5f574d42372b1e1205000000000000000000000013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4d4e4d53545b6069707d88939facb3a99b8e8174685b4e412f24180c00000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c090e1116202c3845515c677683909ca9b6ac978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a79d959393939393939393939393939393939393949597999c9fa3abaca49f99928d837b6e695e554c41352c21110700000000010c18222d363f454a4b5359636a6c6c6c6c6b636059514a423c332a2a3139404550575f626a6c6c6c6c6c5f574d53443f3830261c11060000030f1b27333f4953626f7c88949eabab9f958c7f726c625a534e4a4948484a4e545c606d75818e97a1ada3998d8074685d524639291e13080000000000000000000002070a0c0d0908060a1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000040f19222d363e44505b666d79828f95a0a59d928c7f726c62594f4c565e696e7c859298a2a39892867c6f695e564c433930261d140a01000000000000000000000007131d28313d47515b606c77808c919ea1a9aea59e98928d87837f7c79777674747474747677797c7f83888e92999fa6aea8a199928b7f736d635a50463c2f261c0e050000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49453e362c22170c00000000000000000d19242f3a444f59626c717e868f949c9a938e8883807e7c7c7f83868a8e92989da0a7a39f97928a80736e645a50443a3024190d00000000000008121a242c363e48505a616c717e879292867b6e61697683908f8275685c4f4235291c0f000714212e3a4754616d7a86868686868686867b6e6154483b2e2115080005111d2a36414c565e61646464646875828e9ba8aca09386796d6464646464646464646464646464646260584e43372b20170d02000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c939393939495979a9d9f97918e8b85817b736d675e564d453b30271d1207000000000000000000000006121f2c3845525e6a757979797978706b605c544d5151525353524b515a61696e777979797976695f53463a2d211407000000000000000000000013202c3946535f6c7986929facada093867a6d60585858585858585858585859595a575f61666c717b84919aa4afada2978a7e7164574b3e3124180700000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa69b8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201919191919191919191a191e2028323a4653606d7986929facafa49a897c6f6356493c302316090013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa0a1a1a3a6a8a6a8a09e9a938f8780796e695e574d433a2f231a1000000000000006111b242d343a3d3e525e6a757979797978706b605c544d453f36333c434b515a61696e777979797976695f53463a342e261e150a000000000b17222d3847535f6a75828f99a3afa79f92877e716c625f5857565555575860666d737f8c939ea9a89f92867b6e61564c413529170d02000000000000000000070d131619191515120f1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000a16212b343e48515b606c78818e949fa69e938d80746d635a504b555d686e7b849197a2a49992867d706a5f574d443a31281e150b02000000000000000000000000010c161f2b353f44505b656c747f8a92979ea6acaaa29f9a93908c898684828181808181828486898c90959a9fa3ababa49f9691877e736d635b51473e342a1d140a000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c11050000000000000008131e28323d47505a626c717b82898f92999b95908d8b89898c8f92999b9fa2a9a29e99928e857e736e645c52483e32281e13080000000000050e1a242c363e48505a616c717e879292867d70695e697683908f8275685c4f4235291c0f000713202d3946525e6876797979797979797976695e52463a2d201407000713202d3946525e686d717171717174818e9ba7ada093877a717171717171717171717171717171716f6a6054473c31261a0e02000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f868686868687888a8d90959a9e9b98928d8680796e695f574d43392e23180c03000000000000000000000613202c3946535f6c7987868686847d736d665f5751464146454d555c606c717b83868686867b6e6155483b2e221508000000000000000000000013202c3946535f6c7986929facada093867a6d65656565656565656565656566666769696e72787e859196a1acb1a79f9285796d6053473a2d20140700000000000000000000000000000000000000000000010d1a2734404d5a6773808d9a9a9a8e8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2525252525252525252627252a2d323a444e5863707d8998a2aeac9f93867a6d6154473a2e2114070013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9b999796918c87827c736d675e574d453b31281e11080000000000000009121b22292e3946535f6c7987868686847d736d665f575146413e454d555c606c717b83868686867b6e6155483b2e231c150c030000000006111b2b37434e58626f7c87929fa6aea39992877e766f6a666462616263666a6f78808c919ca5aaa0968c8073695e53443a302419050000000000000000010a12191e23252622211f1b1724303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000030f1b27323d47505a636d74808d939ea69f948e81786c605b514a545c676d7a839096a1a49f93877e716b60584e453b32281f160c030000000000000000000000000000040d192327333f49535b606d737d858f949da0a7acaca49f9c989892918f8e8d8d8d8e8f919298999d9fa7acaca69f99938d847d716c635b51493f352c22180b02000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada093867a6d6767676767676767676767676767676767676767676767676767676767676767676764615a5045392d21140800000000000000010c16202b353f48505a61696e767d8287929fa09d9a979696999c9fa3a9a29f9b97928d86817a716c635c524a40362d20160c0200000000020d17202c363e48505a616c717e879292867d706b6057697683908f8275685c4f4235291c0f0005111d2a36414c565e6c6c6c6c6c6c6c6c6c6c5e574d42362a1e1205000714212e3a4754616d7a7e7d7d7d7d7d828f9ca9b1a4988b7f7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7c6f62574d42372b1e1205000000000000000000000000000000000000000000000000000000000c1825323e4b57636d72797979797a7a7b7e8083888d9399a09f99928c837b6e695f554b4034281f140900000000000000000000000b1825323e4b5865717e8b9296918780786e69625b524c4550575f676d747e869095948d8074695f53463a2d211407000000000000000000000013202c3946535f6c7986929facada09386797272727272727272727272727272737476787b7f848a9297a1a8b2a9a0958c7f72675d5145382c1f130600000000000000000000000000000000000000000000010d1a2734404d5a6773808d8d8d8d8d8174685b4e4135281b0e0200000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a32323232323232323232333330363a3e444c565f6a75818e9baab4aa9d918477685d5246392d2013070013202c3946535f6c7986929facb9a79d959393939393939393939393939393939399929291908f8d8a8784807b756f6a605c554d453b33291f160c0000000000000000000911181d25323e4b5865717e8b9296918780786e69625b524c4550575f676d747e869095948d8074695f53463a2d21110a030000000000000f1b26313c47535f6a73808c949fa7aba399928b827c7773706f6e6f7073777c838d929ca3aba2989184796d60574d4232281e130800000000000000000a131c242a2f32332f2e2b262024303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000007131f2c38434f59616c727f8c929da5a0959082796d665b5044505b666d79828f95a0a59c928b7f726c61594f463c332920160d0400000000000000000000000000000000071017222d384149505b636b707b828990959c9fa4acaca9aaa39f9d9c9b9a9a9a9b9c9d9fa3aaaaababa39f9b948f878079706b625a514940372e231a100600000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facada09386797373737373737373737373737373737373737373737373737373737373737373737373716c6155493c3023170a0000000000000000040d19232d363f49515a61696e757b818e9aa7aaa7a4a3a3aba39f9c9997928e8a85807b746d68615a524a40382e241b0e04000000000008141f29323e48505a616c707e879291857c6f6b646464697683908f8275685c4f4235291c0f00010d1925303a444c525f60606060606060605f524d453b30251a0e02000714212d3a4754606d7a868a8a8a8a8a8f949fabb3a79b918b8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8377695f53463a2d211408000000000000000000000000000000000000000000000000000001020a16222f3a46515b63666c6c6c676d6e6f7173777c81879195a0a39f9590847b6e675c51453b30251a0e02000000000000000000000b1724313d4a56626d73808c9399938d837b726d615e56515a61696e79818a9298958f82786d60574d42372b1e1205000000000000000000000013202c3946535f6c7986929facb2a5988b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818384888b91959fa2a9afa8a1979083796d60554b4035291d100400000000000000000000000000000000000000000000000a1724303d4a5763707d80808080807e7164574a3e3124170b0000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f404142464750565d686f7c87939facb0a69a8d807367564c4135291d11050013202c3946535f6c7986929facb9a2958b86868686868686868686868686868686868685858382807e7b77736e69625f58514b433b332921170d0400000000000000000000060c1724313d4a56626d73808c9399938d837b726d615e56515a61696e79818a9298958f82786d60574d42372b1e1200000000000000000a15202b37434e58606d78828f959fa6aba39f948f8883807d7c7b7b7d7f838990959ca4aba39992867c6f675d51453b3120160c020000000000000007121c252e353b3e403c3b37322a24303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000915222f3b4854606b717e88939fa4a19690837a6d675c544a4653606c78818e949fa69d938c80736d625a50473d342a21170e0500000000000000000000000000000000000006111b262f383f44515961696e757d83898f939a9c9fa2aaa7a8aaa9a7a7a7a7a7a9a9a8a6a9a29e9b99928e88827c746d676059504840372e251c11080000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb3a79a8d8080808080808080808080808080808080808080808080808080808080808080808080807e7164574a3e3124170b00000000000000000915202a333f48515b636c717b81878e939da9acaba49f9d999992908c8985817d79746e69615e56504840382e261c12090000000000020e1925303b44505a616c707e879291847c717171717171717683908f8275685c4f4235291c0f000008131e28323a41465353535353535353534846423b33291f140900000613202c3945525d6876828f979797979c9fa6b0b7aca39b9897979797979797979797979797979795887b6e6155483b3025190e0200000000000000000000000000000000000000000407090a0d0e0f10121e2a353f495157596060555d60616264676a6f747c839095a0a7a0969083796d60574d42362a1e1205000000000000000000000915212e3a45505a636e74818e939f9590867e756d68605c606c717b838e939f969083796d665c50453c31261a0e02000000000000000000000013202c3946535f6c7986929facb9a79b918b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8c8d8f9196989da0a7adaba59e9691857b6e675c5143392f24180c0000000000000000000000000000000000000000000000000916232f3c4855616b707373737373716c6155493d3023170a0000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4d4e4d52545a61686d7a83909aa4afac9f94887c6f6255493c3024190d010013202c3946535f6c7986929facada093867979797979797979797979797979797979797878777573716e6966625f57534e454039302920170f050000000000000000000000000915212e3a45505a636e74818e939f9590867e756d68605c606c717b838e939f969083796d665c50453c31261a0e0200000000000000030f1b26313c44505c666d7a8390949fa4aca69f9c95908c8a8988888a8c90959d9fa7a8a19992877e716a5f554b4033291f0e0400000000000000020d19242e3740464b4c4847433c3429303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000091623303c4956636f7c86929a93939791847b6e685d554b424d5a6673808d93939393948e81746e635b51483e352b22180f0500000000000000000000000000000000000000000a141d262d3340474f575e616b70777d82878b8f9298989a9b9d9e9e9f9f9f9e9d9d9b999797928e8a86817c766f6a605d554f473e362e251c130a000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f02000000000000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8174675b4e4134281b0e01000000000000020e1a26313c45505a636d727e868e939a9da5a39f9c9993908c898683807c7975706d66615e57524c443e362e261c140a00000000000005111e2a36414d56616c707e879292867f7e7d7d7d7d7d7d7d7e83918f8275685c4f4235291c0f0000020c1620283036394646464646464646463b3a36302921170d02000004111d2935414c5665727e8b9aa49f9fa1a3a9b1bbb5aca7a49f9f9f9f9f9f9f9f9f9f9f9f9f9fa7988c7f7265564c41362a1e1105000200000000000000000000000000000000050b101416171a1b1c1d1e1f232e373f464b4c53534b5153545557585f626a6f7a839097a1a8a0958d8074695e52463a2d2014090000000000000000000005111d29343f48525b606d78818f959f98928b827a706b676d747e8690959d9891847b6e675d544a3f332a1f140900000000000000000000000013202c3946535f6c7986929facb9ada39b989898989898989898989898989899999a9c9ea1a8aaacaaa69f9c938e847c6f695f554b4031271d12070000000000000000000000000000000000000000000000000714202c38444f596163676767676764615a5045392d2114080000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6058585858585858585858585858595a5a565e61656c707a829095a0acafa49a8f82766a5f53473b2e1e1308000013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a686664615e5755534d47433c342e271e170e050000000000000000000000000005111d29343f48525b606d78818f959f98928b827a706b676d747e8690959d9891847b6e675d544a3f332a1f14090000000000000000000a152028343f4a545d686d7a828d939a9fa6aba7a09d999795949596999d9fa7aba39f9691877e716c61584e43392f21170d000000000000000007131e2a35404952575955534e463f35303d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000c1925323f4c5865727f868686868686857c6f695e564c4343505c69768286868686868682786d605c52493f362c23191006000000000000000000000000000000000000000000020b141b2227353e454d525960636b70757b7e8285888b8d8f9091929292929191908e8c8a8885817e7a746f6a626058514b433d352d241c130a01000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8175685b4e4235281b0f06060606060000000000000000010e1b2734414e5a6774818d9aa7b1a4978b7e7164584b3e3125180b0013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8e8174675b4e4134281b0e0100000000000006121e2b37424e57626d727f8a92989fa4a29f99928f8b8683807d797673706d6664605c54534d46413a322c241c140a020000000000000714202d3946525e68707e87929999928c8a8a8a8a8a8a8a8a8a91958f8275685c4f4235291c0f000000050e161e252a2d2e39393939393939392e2d2a251f170f05000000010d19242f3b4754616e7b879393939394979fa9bcaea49c9993939393939393939393939393939393908376685e5246392d20140c070f0b0a080500000000000000000000000810161c202324262728292a2b2c202e353a3e3f464640454747484b4e535860686d7a85929ea9a79f92877b6e6154483b31261a0e02000000000000000000010c18222d364044505c666d79829095a09f938f857d746f79818a9298a09992867c6f695e554b42382e21180e0300000000000000000000000013202c3946535f6c7986929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a7a9a9a7aca49f9d99948f89817a6f6a5f574d43392e1f150b0100000000000000000000000000000000000000000000000004101c28333e474f55575a5a5a5a5a575550483e33281d11050000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d656565656565656565656565656566666769696e72777d8590949fa7b1a79f93877c6f62584e43372b1f0c02000013202c3946535f6c7986929facada093867a6d6060606060606060606060606060605f5f5e5d5c5a5754524d4847423c373128231d150c050000000000000000000000000000010c18222d364044505c666d79829095a09f938f857d746f79818a9298a09992867c6f695e554b42382e21180e03000000000000000000030c17232e38424c565d686d78808790949b9fa2aaa8a6a3a2a1a2a3a6a8a9a29f99928d847d716c615a50463c31271d0f0500000000000000000a16232f3b46525b6366625f585146413a3d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000b1824313e4a56626d72797979797979786f6a5f574d443a414e5a667076797979797979756d665c504a40372d241a11070000000000000000000000000000000000000000000000020a1117232c333b42464f54596063696e7276797c7e808283848585868585848382807d7b7975716d68625f58544e45403a312b231b120a0100000000000000000000000b1825313e4b5864717e8b97a4aca89b8e8175685b4e4235281b0f13131313130c06060300000000010e1b2734414e5a6774818d9aa7aca4978b7e7164584b3e3125180b0013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8e8174675b4e4134281b0e010000000000000814212e3a47535f6a717e8b919fa2a69f98928d87827e7a7673706d676663605c5453514b46423b363029201c17110a020000000000000814212e3b4754616e7b859299a3a39f9793939393939393939393938f8275685c4f4235291c0f00000000050c13191d20212d2d2d2d2d2d2d2d21201e1a140d0500000000000814202d3a46525e69768386868686878d97aab4a89c928c8686868686868686868686868686868686887a6e6154473b2e211c181c1b171714110c05000000000000000008111a21282c2f30333435363738392d2c282f3233392f35393a3b3c3e43474e565e68717e8b97a1ada3998d807367574d42362a1e12050000000000000000000006111b2428343f4a545d676d7a839196a19e979188807b838e929fa29f93877d706a5f574d433a30261c0f060000000000000000000000000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa49f9f9f9e9d9c9a999a93908d88827d756d685f584e453c30271d0d0300000000000000000000000000000000000000000000000000000b16212c353e44484a4d4d4d4d4d4a49453e362c22170c000000000000000000000000000000000000000013202c3946535f6c7986929facada093867972727272727272727272727272727272737475787b7f838a91979fa6b0a79f958d80746a6054463c32261b0f00000013202c3946535f6c7986929facada093867a6d605353535353535353535353535353535252504f4d4b4846423b3a37312b262018120b030000000000000000000000000000000006111b2428343f4a545d676d7a839196a19e979188807b838e929fa29f93877d706a5f574d433a30261c0f06000000000000000000000006111c26303a434c565d666d737c83898e9298999b9d9e9f9f9f9e9d9b9997928d87817a6f6b615a50483e342a1f150b0000000000000000000c1925323e4b57636d736f6a625b524c443d4a5763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000915222e3a46515b62656c6c6c6c6c6c6c625f584e453b323e49545e66696c6c6c6c6c6c69605c544a3f382e251b1208000000000000000000000000000000000000000000000000000006111a202930363d44484f54565e6165666d6f7174757778787979787877767573716f6d6664605d56534e47433d352f281f191109000000000000000000000000000b1825313e4b5864717e8b979f9f9f9b8e8175685b4e4235281b1320202020201913120f0b060000010e1b2734414e5a6774818d9a9f9f9f978b7e7164584b3e3125180b0013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e01000000000005111e2a36424d57626e7b86929fa3a59e949086807b75716d686663605d555653504a464540393631302e2d2b28231c140c0400000000000714202d3946525e68717e87929999928a8686868686868686868686868175685c4f4235291c0f000000000002080d11131420202020202020201514120e090200000000000005111e2a36424d56667176797979797b8798a3aea6998c8079797979797979797979797979797979797976685e5246392d2c292329282423211d17100800000000000005101a232c33383c3d404142434445453a38342e27262d24292c2d2e2f31373d444c56606c7885919eabab9e918478695f53463a2d2114070000000000000000000000091217232e38424b555d686e7b849197a2a19a938d8890959da59d928b7f726b61584e453b31281e140a000000000000000000000000000013202c3946535f6c7986929393939393939393939393939393939393939a93929291908f8e8c898683807b76706b615e564e463c332a1e150b00000000000000000000000000000000000000000000000000000005101a232c33383c3d40404040403e3d39332c241a1005000000000000000000000000000000000000000013202c3946535f6c7986929facb2a5988b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80818285878b90959ea1a9aea69f959083796d60584e43342a20150a00000013202c3946535f6c7986929facada093867a6d6053474646464646464646464646464645454442403e3b3a36302e2b261f1b150c0700000000000000000000000000000000000000091217232e38424b555d686e7b849197a2a19a938d8890959da59d928b7f726b61584e453b31281e140a000000000000000000000000000a151e28313a444c545c606a6f767c8185898c8e909192929292918f8c8985807b746d68605950483e362c22180d030000000000000000000d192633404c5966737f7c726d615d564f444a5763707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000006121e29343f495156586060606060605f55534e463c332938424c545a5c6060606060605c53504a42382e261c130900000000000000000000000000000000000000000000000000000000080e171f252a33383d44484d5254545c60626567686a6b6b6c6c6c6b6a6a68666462605c5454524c47433c383229241d160d0700000000000000000000000000000b1825313e4b5864717e8b93939393938e8175685b4e4235281f202c2d2d2d2c26201f1c17110a02000e1b2734414e5a6774818d93939393938b7e7164584b3e3125180b0013202c3946535f6c79869293939393939393939393939393939393939393939393939393939393939393939393939393939393938e8174675b4e4134281b0e0100000000000714202d3a46525e6975828e98a2a89e938e827b736e6964615e565653514b4946443f3a3e4041403e3d3b3a38342e261e160d040000000005111e2a36414d56616c717e879392867e797979797979797979797979756f65594d4134281b0e00000000000000010507071313131313131313080705020000000000000000020e1925303b44555f666a6c6c6c6c7985929faca89b8e81756c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b5e564c413b3a38342f363531302d28221a120800000000000b16212c353e44484a4d4e4f505152524644403930271c181d20202122262b323a44505b6674818e9aa7ada196887b6e6155483b2e22150800000000000000000000000006111c263039434c565e696f7c859299a3a49f9a959da0a79e948d80746d62594f463c33291f160c02000000000000000000000000000013202c3946535f6c79878686868686868686868686868686868686868686868685858483817f7d7a77736e6a636059524c443c342a21180c030000000000000000000000000000000000000000000000000000000008111a21282c2f30343434343431302d28221a120800000000000000000000000000000000000000000013202c3946535f6c7986929facb9a79b918b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8d8d8f9197989da0a7adaaa39f948f837a6d675c51463d3222180e0400000013202c3946535f6c7986929facada093867a6d6053473a3939393939393939393939393938373533312e2d2a25211e1a150f0a0400000000000000000000000000000000000000000006111c263039434c565e696f7c859299a3a49f9a959da0a79e948d80746d62594f463c33291f160c0200000000000000000000000000030c161f28323a424a515860626b6f75797c7f828385858685858482807c79746e6a615e564f473e362c241a1006000000000000000000020f1c2835424f5b687581867f756d686059504a5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000010d18232d373f464a4c535353535353524847433c342a21303a42494e505353535353534f46443f3830261c130a010000000000000000000000000000000000000000000000000000000000050d141a21272c33383b4246474a545c6a6c6c6c6c6c66605b5f5e5e5d5b59575553504a4745413a37312b272018130c040000000000000000000000000000000b1825313e4b5864717e868686868686868175685b4e4235282b383939393939332d2b28221c140b060e1b2734414e5a677480868686868686867e7164584b3e3125180b0013202c3946535f6c7987868686868686868686868686868686868686868686868686868686868686868686868686868686868686868174675b4e4134281b0e0100000000000814212e3b4754616e7b87939faaa0968e81786e69615e5754524c494745403d3a3840464b4c4e4c4b494846443f3830281f160c01000000020e1925303b44505a616c717e879392877e716c6c6c6c6c6c6c6c6c6c68655d54493d3125190c000000000000000000000000000000000000000000000000000000000000000009141f2932434d555b5d60605b667783909daaaa9d908377675c60606060606060606060606060606054524c4446484745404443423e3d39332c241a100500000004101c28333e474f5557595a5b5c5d5e5f53514a42392e231810131414151b2028333f4a5464717e8b97a4b2a8978a7e7164574b3e3124180b000000000000000000000000000a141e27313a444d575f6a707d879299a49f9f9f9fa9a0958f82786d605b51473e342a21170d04000000000000000000000000000000121f2c3845525e6a757979797979797979797979797979797979797979797979797877767472706d6866625f58544f46413a322a22180f060000000000000000000000000000000000000000000000000000000000000810161c20232427272727272423211d1710080000000000000000000000000000000000000000000013202c3946535f6c7986929facb9ada39b9898989898989898989898989898989899999a9c9ea1a9aaacaba39f98928c827a6d685e554b40342b2110060000000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a29272421201e1a14120e09030000000000000000000000000000000000000000000000000a141e27313a444d575f6a707d879299a49f9f9f9fa9a0958f82786d605b51473e342a21170d04000000000000000000000000000000040d162028303940444e54596063666d707275767879797978777573706d66625f57524c443d342c241a120800000000000000000000020f1c2835424f5b6875828e8b827a6f6b605c545763707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000006111b252d343a3e3f464646464646453c3a37312a221e2830383e4143464646464646423a38342e261e140a010000000000000000000000000000000000000000000000000000000000000002090e161c21272c30363a44505c66757979797979726c665f5751504f4d4a4846443f3a39352f2b26201b160d0701000000000000000000000000000000000a1724303d4956626c7179797979797979756f65594d402e34384546464646463f3938332d261d180f091a2733404c58646e7479797979797979716c6256493d3024170a00121f2c3845525e6a757979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746f64594c4033271a0d0100000000000b1825313e4b5864717e8b99a4aa9d9184796d665f57524d4746413d3a38352f3040495157595b5958565453504a423a31281e13080000000008141f29323e48505a616c717e889392877e716c615a6060606060605c59544b42372c2115090000000000000000000000000000000000000000000000000000000000000000020d1720313b434a4e50534a546774818e9aa7ac9f9286796d6053535353535353535353535353535347464a51535453514b504f4e4a49453e362c22170c0000000714202c38444f596163666768696a6b6c605c544a4034281c100607080a0e17222d3d4a5763707d8a96a3b0a5988b7f7265584c3f3225190c00000000000000000000000000020c151f28323b454e58606b717e8793939393939393969083796d665c50493f352c22190f0500000000000000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a69676663615e5655534e48443d363028201810060000000000000000000000000000000000000000000000000000000000000000050b101416171a1a1a1a1a171714110c05000000000000000000000000000000000000000000000013202c3946535f6c7986929facacacada7a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a7a8aaa8a6a7a09d99928e867f786d685e564c43392e22190f000000000013202c3946535f6c7986929facaca093867a6d6053473a2d20202020202020202020201f1f1d1c1a181514120e0906020000000000000000000000000000000000000000000000000000020c151f28323b454e58606b717e8793939393939393969083796d665c50493f352c22190f050000000000000000000000000000000000040d161e272e343d43474f54545c606366686a6b6c6c6c6b6a686663605c54534e46413a322b221a12080000000000000000000000020f1c2835424f5b6875828e938f847d736d665e5763707d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000009131b23292e3132393939393939392f2e2b262018161e262d323536393939393939362d2b28231c140c0200000000000000000000000000000000000000000000000000000000000000000000050b10161c1f252d3a4653606d7987868686867f786e69625b524d443e3c3a38342e2c29241e1b150f0a040000000000000000000000000000000000000815212d3945505a62646c6c6c6c6c6c6c68655d53483d383f445253535353534c46443f382f2a2119141824303c48535c64676c6c6c6c6c6c6c64625a5045392d21150800111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b0000000000010d1a2734404d5a6773808d9aaba4988b7e71675c544d46423b3935302d2c292e3842515b63666866646361605c544c433a2f24190d01000000020d17202c363e48505a626c717e889392877e716c61574d535353534f4d49423930261b1004000000000000000000000000000000000000000000000000000000000000000000050e1f2831383e4243464b5865717e8b98a8aea399897c7063564946464646464646464646464646404a545c6061605c555d5c5b575550483e33281d110500000916232f3c4855616b70737475767778786d665c5144382c1f12060000000616232f3c4956626f7c8995a2afa6998c807366594d4033261a0d0000000000000000000000000000030d162029333c464f59616c727f8686868686868686847b6e675d544a3f372d231a100700000000000000000000000000000000000e1a26313d4751595e5f6060606060606060606060606060606060606060605f5f5e5d5c5b595654524c4847433c38332a251e160e0600000000000000000000000000000000000000000000000000000000000000000000000407090a0d0d0d0d0d0b0a08050000000000000000000000000000000000000000000000000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9f9e9d9b999795908c86817b736d665e564c443a30271d1007000000000013202c3946535f6c7986929f9f9f9f93867a6d6053473a2d20141313131313131313131212110f0d0b08070502000000000000000000000000000000000000000000000000000000000000030d162029333c464f59616c727f8686868686868686847b6e675d544a3f372d231a100700000000000000000000000000000000000000040c151c232832373d43484b515356595b5d5e5f5f5f5f5e5c595653514b47423c35302820191008000000000000000000000000020f1c2835424f5b6875828e9b96918780786e696163707d8a96a3b0a3978a7d7064574a3d3124170a0000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2c22211f1a150e0c141b212628292d2d2d2d2d2d29201f1c17110a0200000000000000000000000000000000000000000000000000000000000000000000000000050b10141f2b3844505c66717e879399928c827b726d615e565046413a322924201d19130f0a04000000000000000000000000000000000000000005111d29343e48505658606060606060605b59534b4138424a505e5f6060605f5953504a423b332a251f17202b36414a53585a60606060606060585650483e34291d1105000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060605b59534a41362b2014080000000000020e1b2835414e5b6874818e9ba7a194887b6e61554b423b36302d292523282c343f4a54636d73747371706e6d665d564c4135291d110400000000050e1a242c363e48505a626c717f889392877e71695f534646464642413d3730271e140900000000000000000000000000000000000000000000000000000000000000000000000d161f272d3236373b4855616e7b8896a0acab998d807366594f4338393939393939393939393844515c666d6e6d676b6a696864615a5045392d21140800000a1724303d4a5763707d80818283848586786d6053463a2d20160d0909070c1724303d4a5763707d8a96a3b0a69a8d8073675a4d4034271a0d010000000000000000000000000000040e17212a343d47505a626d727979797979797979786e695e554b42382e251b11080000000000000000000000000000000000000915202b353f474e525353535353535353535353535353535353535353535353525251504e4c4a4746413b3a37312c272119130c05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929393939393939393939393939393939393939393939399929291908f8d8a87847f7b756e69605c544c443a32291e150b00000000000013202c3946535f6c7986929393939393867a6d6053473a2d20140706060606060606060605040200000000000000000000000000000000000000000000000000000000000000000000000000040e17212a343d47505a626d727979797979797979786e695e554b42382e251b1108000000000000000000000000000000000000000000030b121820272b323839404546494c4f505252535252514f4d4946454039373129251e160e0700000000000000000000000000020f1c2835424f5b6875828e9ba199928c827b706c63707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000060d121518192020202020201f1515120f0a03030a1015191c1d2020202020201c1312100b06000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f19100700000000000000000000000000000000000000000000000c17222d363e45494b535353535353534e4d4841343f4a545c6a6c6c6c6c6c66605b544d453f3630292019252f3841484c4e535353535353534b49453e362d22170c00000915202b353f474e525353535353535353535353534a545c6a6c6c6c6c6c66605b544d5353535353535353535353535353535353534e4c4841382f251a0f030000000000020e1b2835414e5b6874818e9ba7a194877a6e6154473e39352f3333332e34383d44505c66737f817f7e7c7b786d685d5245392c201306000000000008121b242d363f48505a626d727f8b9192867b6e6155483b39393534312c261e150c020000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292d3a46535f697784919eaaaa9d9184776b6054483d31282d2d2d2d2d2d2d2d3a4653606d787b7a7978777675716c6155493d3023170a00010e1a2734414d5a6774808c8d8e8f9091887c6f6255483e31281f1a171617181d27333f495364717e8b97a4b1a6998c807366594d4033261a0d00000000000000000000000000000000050f18222b353e48515b62656c6c6c6c6c6c6c6c6b615e574d433a30261c130900000000000000000000000000000000000000040f19242d353d4245464646464646464646464646464646464646464646464646454443413f3d3a3936302e2b26201c160d080200000000000000000000000000000000000000000000000000000000000000000000020608080b0e1011121313121211100d0b08070502000000000000000000000000000000000000000013202c3946535f6c79878686868686868686868686868686868686868686868686868685858382807d7a77736e69615f57504a423a322920170c0300000000000013202c3946535f6c798786868686868686796d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f18222b353e48515b62656c6c6c6c6c6c6c6c6b615e574d433a30261c1309000000000000000000000000000000000000000000000000070c151b21272c2e34383a3d3f424345464646454442403d3a38342e2b262019130c040000000000000000000000000000020f1c2835424f5b6875818e969ea39f9490857d746d707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000106090b0c13131313131312090806030000000005090d0f101313131313130f07060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f040000000000000000000000000000000000000000000006111b242d34393d3e4646464646464642403d373844505c66757979797979726c665f575146423b3229251e262f363c4041464646464646463e3d39342d241b11060000040f19242d353d4245464646464646464646464644505c66757979797979726c665f5751464246464646464646464646464646464641403c362f261d1308000000000000000d1a2733404d5a6673808d99aca295897c6f62585047454140403f40404045464f57606d78858e8c8b8987867a6d6054473a2d21140700000000000009121b242d363f48505a626d727f8b8c7f72695f53463a2d2d292825211b140c0300000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1e2a36424d576773808d9aa7aca096897c6f63594f433a3129242322222429333f4a5463707d878685848382817e7164574a3e3124170b00000b1825323e4b5865717e8b989b9c9d988b7f7265594f433a312a2524232323282f3744505b6574818e9aa7b5ab988b7e7265584b3f3225180c0000000000000000000000000000000000061019232c363f4951565860606060606060605e54524d453b31281e140a01000000000000000000000000000000000000000008121b242b3136383939393939393939393939393939393939393939393939393837363433302e2d2a25211f1a15100b050000000000000000000000000000000000000000000000000000000000000000000205090e121415181b1d1e1f20201f1f1e1c1a181514120e0905020000000000000000000000000000000000121f2c3845525e6a7579797979797979797979797979797979797979797979797979797878777573716e6866615e57534d443f38302820170e0500000000000000121f2c3845525e6a75797979797979797976675c5145382c1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061019232c363f4951565860606060606060605e54524d453b31281e140a0100000000000000000000000000000000000000000000000000040a0f161b1d23282c2d303335373839393938373533302d2c28231d1a150d080200000000000000000000000000000000091623303c4956636f7d848e939fa29f97928a8079707d8a96a3b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a000000000000000000000000000000000000000000000009121b22292d3031393939393939393534312d3a4653606d7987868686867f786e69625b524d443e35302820252b3033343939393939393931302d29221b12090000000008121b242b313638393939393939393939393a4653606d7987868686867f786e69625b524d443e353039393939393939393939393433302b251d140b01000000000000000b1824313e4b5764717e8a9aa4a69a8d80736a615a54524c4d4d4c4c4d4b515359606a717e8b979997968f8376685d5245392c2013060000000000000009121b242d363f48515b626d727f80736d63574d42362a1e1c1b191510090200000000000000000000000000000000000000000000000000000000000000000000000000000000050a0e1a26313c4855626f7c88959faba89b8f82756b60554b433b352f2f2f2f2f353b44505b6673808c989291908f8b7e7164584b3e3125180b00000815222e3b4855616e7b8896a0a9aa9d9083776b61554b433c36313030302e3439404b55606c7884919eaaafa499897d7063564a3d3023170a00000000000000000000000000000000000007111a242d373f464a4c5353535353535353524846423b33291f160c020000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a2928262321201d1914120f090300000000000000000000000000000000000000000000000000000000000000000002080e11151a1e21222528292b2c2c2c2c2b2b29272522211e1a14120e0902000000000000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a686664615e5654534d46423c342e261e160e050000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c5c554b4034291c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007111a242d373f464a4c5353535353535353524846423b33291f160c0200000000000000000000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b292623201f1c18120e09030000000000000000000000000000000000000915222f3b4854606b6f7a818a92989fa29e928d837b7d8a96a3b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004080a0a131313131310100d0a050000000000000000000000000000000000000000000000000000000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f0300000000000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d28271f2b3844505c66717e879399928c827b726d615e565046413a3229241d2427272d2d2d2d2d2d2d2524211d17110900000000000009121920262a2c2c2d2d2d2d2d2d2d2d2b3844505c66717e879399928c827b726d615e565046413a3229242d2d2d2d2d2d2d2d282724201a130b0200000000000000000814212e3b4754616e7b87939fac9f92867c706c64605d565a5959595a555c60636b707c85929fa9a1968b7e7265564c4135291d1104000000000000000009121b242d363f49515b626d72736e635b51453b31261a0e0e0c090400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915212e3a47535f6a7683909da7aa9e93897c6f675d554c45413d3c3b3c3c40454d57606c7884919e9f9e9d95877a6e6154473b2e21140800000814212d3a47535f697784919daaaca0958a7d70675d554d46423e3d3c3d3e40454b515c67707d8a96a0acac9f93867a6d6054473a2d2114070000000000000000000000000000000000000008121b252d343a3e3f4646464646464646453b3a36302921170d04000000000000000000000000000000000000000000000000080f151a1d1f20202020202020202020202020202020202020202020201f1f1e1d1b19171413110d08060200000000000000000000000000000000000000000000000000000000000000000002080d14191e20262b2e2f323436383939393938373634322e2d2b26201e1a140e0902000000000000000000000000000e1a26313d4751595e5f6060606060606060606060606060606060606060606060605f5f5e5d5c5a5754524c4846423b373128231c140c040000000000000000000e1a26313d4751595e5f606060606060605f514b43392f23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b252d343a3e3f4646464646464646453b3a36302921170d040000000000000000000000000000000000000000000000000000000000000000070c10131316191c1d1f1f201f1f1e1c1a161313100c070000000000000000000000000000000000000000000713202c38444f5960686d757e8590949fa39d959086818e9ba8b0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1014161720202020201d1c1a16110a0300000000000000000000000000000000000000000000000000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f1307000000000000000000000000000000000000000000000000060c11151718202020202020201b1b1c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f191b20202020202020181715110c060000000000000000080f151a1d1f20202020202020201c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f1920202020201b1a18140f08010000000000000000000714202d3946525e6876828f9aa4a39892857d76716d6868676666666668676d70757d859197a2a49e9184796d6053463a2f24190d0100000000000000000009121b242d373f49515b626566635c52493f33291f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e5864707d8a95a0aca59d9183796d675e56514b4a494848494b51575f69717e8b96a1aca89d908377685e5246392d201407000006121e2b37424d5766737f8c98a2aea79e9184796d675f57534d4b4a494a4b4b51555d606d7983909da8b2a99d908376685d5245392c201307000000000000000000000000000000000000000009131b23292e31323939393939393939382e2d2a251f170f05000000000000000000000000000000000000000000000000000004090e11121313131313131313131313131313131313131313131313131211100e0c0a070705010000000000000000000000000000000000000000000000000000000000000000000000040c13191f252a2d31373a3b3e41434445464645454443403e3b3a37312d2a251f1a140d050000000000000000000000000915202b353f474e5253535353535353535353535353535353535353535353535353535252504f4d4a4746413b3a36312b261f17110a02000000000000000000000915202b353f474e5253535353535353535345403931271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b23292e31323939393939393939382e2d2a251f170f0500000000000000000000000000000000000000000000000000000000000000000000000406070a0c0f101213131312110f0d0a0706040000000000000000000000000000000000000000000000030f1b27323d474f565d606c717b828c9299a0a098928e939eaab0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810171c2023242d2d2d2d2d2a2926221c150d040000000000000000000000000000000000000000000000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e221509000000000000000000000000000000000000000000000000000005080a0b131313131313130f0b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f1313131313130b0a0805000000000000000000000004090e1112131313131313130b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f1313130e0d0b0803000000000000000000000005111e2a36414d56626f7c87939fa5a297928a837d7a777573737273737476797d82889197a1a59d928a7e71675c514538281e1308000000000000000000000009121b252d373f495156585a57524a40372d21180d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c4653606c7883909aa4aca0958f82796e68605d555756555556555d60696e7b85929fa8aca1968a7e7164564d41362a1e11050000020e1a26313c4754616d7a86929fa8aca1969082796e69615e575857565657545c60676d75818e95a0acada2978b7f7265564c4135291d11040000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2d2b21201e1a140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080e161e25293036393c4247484b4e50515253535252514f4d4b4846423c3a36302a251f170f080000000000000000000000040f19242d353d4245464646464646464646464646464646464646464646464646464645454442403e3b3936302d2a251f1a140b06000000000000000000000000040f19242d353d424546464646464646464638342f271f150b0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2d2b21201e1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212b353d444c525a61696e787f8791969da29f9b9ea5afb0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a22282d303139393939393736322d271f160d030000000000000000000000000000000000000000000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f231609000000000000000000000000000000000000000000000000000000000000060606060606060006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a000606060600000000000000000000000000000000000104060606060606060006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a000601010000000000000000000000000000020e1925303b4754606a73808d939fa4a29f94908a86848280807f7f80818385898f939aa1a49f938d80746c61554b403428160c0100000000000000000000000009121b252d373f464a4c4d4b4740382e251c0f0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2b3744505b656f7c88939fa7a89e948f837a736d6765636262626365676d727b849197a2ada59e9184786d6053463b3025190e020000000915202d3946525e6873808c95a0aaa89f9490837b736e6967646363636465666d7179818e939da7b0a69e92857a6d6054473a2f24190d0100000000000000000000000000000000000000000000060d1216181920202020202020201f1514120e09020000000000000000000000000000000000000000000000000000000000000000000104060606060606060601000000000000000000040607090c0e0f11121213131211100e0b0808060200000000000000000000000000000000000000000000000000020a121a202830353b4146474e5355585b5c5e5f5f5f5f5e5e5c5a5855534d4846423b363029211a120a020000000000000000000008121b242b31363839393939393939393939393939393939393939393939393939393938373533312e2d2a25211e1a140e0903000000000000000000000000000008121b242b3136383939393939393939392c29231d150d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d1216181920202020202020201f1514120e090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003070909131313131313130b0a08040000000000000000000000000000000000040f19232b323a414550575e666c727c848d929ea1a9aaafb7b0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005101a232c33393c3d464646464643423e3831281f150a000000000000000000000000000000000000000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f0300000000000000000000000000000000000000000000000000000000000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f0300000000000000000000000000000000000008141f2b37434e58606d78818d939a9fa69f9c9992908f8d8c8c8c8d8e9092989c9fa49f99938c81786d605a5043392e231804000000000000000000000000000009131b252d343a3e3f403f3b352e261c130a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953606b74808d959fa8a69e959086807a7672706f6e6f6f7274797f869196a1a9a79d938a7e71665c504438291f14080000000005111d2935414c56606d79849198a2aaa69f959086807b767371706f70717275797e848e939da5afa89f948b7f72675d5145392c1e13080000000000000000000000000000000000000000000000000106090b0c1313131313131313120807050200000000000000000000000000000000000000000000000000000000000000000004090e1112131313131313130e0d0b0703000104070c10131316191b1c1e1f1f20201f1e1d1b181514120f0a0400000000000000000000000000000000000000000000020b141c242c323a41464d5254575f626567696b6c6c6c6c6b6a696765615f5754524d46423b332c241c140a020000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b2a29272421201e1914120e0903000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d1f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c13131313131313131208070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13151620202020202020171714110c0500000000000000000000000000000000071119202830353e454d545b606a6f79808a92979ea6aeb4aca3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222c363e44494a5353535353504e4a433a31271c1105000000000000000000000000000000000000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d010000000000000000000000000000000000000000000000000000000000000000000000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f13070000000000000000000000000000000000000000000000000000000000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f1307000000000000000000000000000000000000020f1b27323d44505c666d78808890959b9fa2a39f9d9b9a999999999b9d9fa2a29e9b948f877f776d665c50483e30271d120700000000000000000000000000000109131b23292e313233322f2a241c140a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d38414f59606d788390959fa7a79f98928c86827f7d7c7b7b7c7e81858b9298a1a8a69f958e81746c61544a3f3428170d0200000000010d1925303a45515c676f7c869298a1a9a79f98928d8783807e7d7c7d7e7f82858b91969ea5afa7a0969082786c60554b4135291d0c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f151a1d1f202020202020201a1a17130e070d1113181c1f20232527292a2b2c2c2c2c2b2a282522211f1a15100c0701000000000000000000000000000000000000010b141d262e363e444c52565e61666a6e717476777879797878777673716e6966615e57524d453e362e261c140a0000000000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020201f1f1d1c1a171414110e0805020000000000000000000000000000000000000000080f151a1d1f20202020202020202013100c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b1f22232d2d2d2d2d2d2d2423211c17100800000000000000000000000000000000070e161e2429333b424a505860676d747d858f949fa29f9f9f978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c28333e4850555760606060605d5b554d43382d22160a00000000000000000000000000000000000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b0000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e22150900000000000000000000000000000000000000000000000000000000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e221509000000000000000000000000000000000000000a152028343f4a545c666c737c83898e9298989b9c9e9e9f9f9f9e9e9d9a9897928e89827c736c655c544a3f362c1e150b00000000000000000000000000000000010911181e2225252726231f19120a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f3d45515c666d7a8390959fa4aaa29f98928f8c8a898888898b8e92979fa2aaa59e949083796d605a5042382e23170500000000000008131e2934404b555f6a707d8692979fa6aaa39f9993908d8b8a89898a8c8f92979da0a8aca59e9590847a6d665b50433a2f24180d00000000000000000000000000000000000000000000000000000000000000020608080b0e1011121313121211100d0b080705020000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2726231f1913181d2023282c2d2f323436373839393938383734322f2e2b261f1c18120b03000000000000000000000000000000000009131d262f38404850565e61686e73777b7e81838485868685858482807e7b77736e69615e57504840382e261c1309000000000000000000000004090e111213131313131313131313131313131313131313131313131313131212110f0d0b0807050200000000000000000000000000000000000000000000000004090e1112131313131313131313060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a131313131313130a09070400000000000000000007101921272c2f303939393939393931302d28221a120800000000000000000000000000000000040c131921292f383f444e555d606b707a828b9298939393938a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814202d3944505a61646c6c6c6c6c6a665f554a3e32261a0d0000000000000000000000000000000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b201408000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f23160900000000000000000000000000000000000000040b17232e38424a545b606b6f767d8185898c8e9091929293929291908e8c8985817c766f6a605b534a42382e241a0c03000000000000000000000000000000000000070d121618191a1917130e0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2834404b545e686d7a838d939a9fa7aaa29f9c989695959596989b9fa2a9a8a09e938e827a6d675d51483e30261c1106000000000000020c18232f39434e58606b707d858f949ea0a8aba49f9c9a9796969697989b9ea1a9aca7a09d938e837b6e685e544a3f31281d1307000000000000000000000000000000000000000000000000000000000205090e121415181b1d1e1f20201f1f1e1c1a181514120e09050200000000000000000000000000000000000008121b242b313638393939393939393433302b241d24292c2e34383a3c3f41424445454646454443413e3b3a37312c29231d150d0700000000000000000000000000000007101b252f38404a525a61686d747b8084888b8e8f919292929291918f8d8b8884807b746e69615a524a40382e251b0f0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1014161720202020202020171614100b05000000000000040f19232b32383b3c464646464646463e3c39332c241a10050000000000000000000000000000000002080f171d262d333c434b515961686d757e858686868686867d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303c4955616c7079797979797671665b4e4236291c1000000000000000000000000000000000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e010000000000000000000000000000000000000006111c263038424a505960636b7075797c7f81838485858685858483817f7c79746f6b6260585049413830261c120900000000000000000000000000000000000000000106090b0c0d0c0a0702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b18232e39424c565e686d79808790959b9fa2aaa8a5a3a2a1a2a2a5a7aba49f9c96918981796d685d554b40362c1e150a000000000000000007121d27313c464f59606a6f7b828a91969c9fa3aba8a6a4a3a2a3a4a5a8a8aaa29f9b95908981796e695e564c42382d1f160c01000000000000000000000000000000000000000000000000000002080e11151a1e21222528292b2c2c2c2c2b2b29272522211e1a14120e0902000000000000000000000000000000040f19242d353d424546464646464646413f3c362f282f35393a404546494c4e4f51525253535251504e4b4847433c38342f271f19100a01000000000000000000000000030c19222d37404a525c636c717a81868c9196989a9c9e9f9f9f9f9e9d9c9a9895918d86817b716c645c524a40372d21180e030000000000000000000000020507081313131313131313131313131313131313131313131313131313131313131211100c09060503000000000000000000000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b0906010000000000000000000000000000000000000000000000010406070a0d10111213131312100e0b070705010000000000000000000000000000000000000000000810161c2023232d2d2d2d2d2d2d2323201c16100800000000000a16212b353d434849535353535353534a49453e362c22170c000000000000000000000000000000000000050b141c2228313940454f565e616d7279797979797979706c6155493c3023160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d868686868683766a5d5043372a1d100000000000000000000000000000000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d01000000000000000000000000000000000000000000000000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d0100000000000000000000000000000000000000000a141e262f383f444f54596063666d6f72747677787979797877767472706d66636059544e443f382f261e140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303a444c565e676d747c83898e9298999b9d9e9f9f9f9e9d9c9999938f8a847d756d675d564c433a2f241a0c030000000000000000010b151f2a343d474f5860696e767e848a8f9299999b9d9e9f9f9f9f9e9d9b9998928e89837d756d675e564d443a2f261c0d040000000000000000000000000000000000000000000000000002080d14191e20262b2e2f323436383939393938373634322e2d2b26201e1a140e0902000000000000000000000000000915202b353f474e52535353535353534d4c474038313a4045474b515356585a5c5d5e5f5f5f5f5e5d5b5855534e47454039312b221b130a0000000000000000000000000a151e2b343f49525c646e737e858d92999da0a8a9a29f9d9c9b9c9d9fa2aaa7a09d99928e857e736e645c52493f332a1f140900000000000000000002080e1114142020202020202020202020202020202020202020202020202020202020201f1e1c191613120f0b06000000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d06000000000000000000000000000000000000000001070d111314171a1c1e1e1f201f1e1d1b181413110d080200000000000000000000000000000000000008111a21272c2f3039393939393939302f2c27211a1108000000030f1b27323d474f545660606060606060575550483e33281c1104000000000000000000000000000000000000020a11171f272f353e444c525b62656c6c6c6c6c6c6c64615a5044392d20140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a9393939083766a5d5043372a1d10000000000000000000000000000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b0000000000000000000000000000000000000000000000000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b000000000000000000000000000000000000000000020c141d262d333d43484f54545c60636568696b6b6c6c6c6b6b6a676563605c54544f47433d332d261d140c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e28323a444c555c606b6f767c8185898c8e909192929291908f8d8a86827d79706b605d554c443a31281d120800000000000000000000030d18222b353d464e575e616c71787d82868a8c8f90919293929291908e8c8985817d77706b605d554d443b32281d140a00000000000000000000000000000000000000000000000000040c13191f252a2d31373a3b3e41434445464645454443403e3b3a37312d2a251f1a140d050000000000000000000000000e1a26313d4751595e5f6060606060605a58524a403a434b5153545c60626567696a6b6c6c6c6b6b6a6765625f5853514b433d342d251b12090000000000000000000006111c26303d46515b646e74808a92979fa3a9a19e999792908f8f8f909298989d9fa7a39f97928a80736e635b51453b31261a0e0400000000000000050d14191e20212d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2c2b292623201f1b17110c0600000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d1811090100000000000000000000000000000000040a0f13181d20202326292a2b2c2c2c2b2a272521201e1913100b0500000000000000000000000000000005101a232c33383c3d464646464646463d3c38332c231a1005000007131f2c38434f5960636c6c6c6c6c6c6c64615a5045392d2114080000000000000000000000000000000000000000060d151d2429323a41465156585f606060606060575550483e33281c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a979f9d9083766a5d5043372a1d1000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b201408000000000000000000000000000000000000000000000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b20140800000000000000000000000000000000000000000000020b141c222832383d44484a515356595b5d5e5f5f605f5f5e5d5b595653504a48443d383227221b140b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c162028323a434b515960636b6f75797d7f828385858685858482807d7a76716d666059514b433a32281f160c000000000000000000000000061019232b343d454d525a61666c70757a7d80828385858686858483817f7c7975706b636059514b433b322920160b02000000000000000000000000000000000000000000000000080e161e25293036393c4247484b4e50515253535252514f4d4b4846423c3a36302a251f170f080000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c67645c5247404b555d6064666d6f727475777878797978777674716e6a64605c554e463f372d251b11070000000000000000000c17232e38424f59626d74808d929ea1a9a39f97918c8885838282838385888b90959ea1a8a29f928d80736d62574d42362a20160a000000000000050e171e252a2d2e39393939393939393939393939393939393939393939393939393939393938373633302d2b27221b17110a0300000000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b1309000000000000000000000000000002080d151b1d24292c2d3033363738393939383634312e2d2a251e1c160f0a04000000000000000000000000000b16212c353d44484a535353535353534a48443d352c21160b00000915222f3b4854606b6f79797979797979716c6155493c3023170a000000000000000000000000000000000000000000030b1218202930363f454a4b525353535353534a49443e362c22170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f030000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f030000000000000000000000000000000000000000000000020a111721272c333839404446494c4e5051525253525251504e4c4946443f3838322b272017110a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e162028313940454f54596063676d707375777879797978777673716e6864605c544f454039312820160d0400000000000000000000000000071119222b333b424650545b6064676d707375777879797978787675726f6d67636059544f45403a312920170e050000000000000000000000000000000000000000000000020a121a202830353b4146474e5355585b5c5e5f5f5f5f5e5e5c5a5855534d4846423b363029211a120a02000000000000000000121f2c3845525e6a7579797979797979746e64584c45515d676d7176797c7f81828485858686858483817e7b77716d67605851493f372d23190b020000000000000003101c28343f4a54606b727f8c929ca4aaa299928c84807b787675757677797b7f838a91969fa6a49c928b7f72695f53463d32271b0f0300000000020d1720293036393b4646464646464646464646464646464646464646464646464646464646464544433f3c3937332d28231c150c0500000000000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b1106000000000000000000000000050d131920262b2f35393a3d404344454646464543413e3a3936302c28211b150e06000000000000000000000004101c27333d474f55566060606060606056554f473d33271c100400091623303c4956636f7d868686868686867e7164574a3e3124170b0000000000000000000000000000000000000000000001070e171e252a343a3d3f464646464646463d3c39332c231a10050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b0803000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d130800000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d13080000000000000000000000000000000000000000000000000000060b161b21272c2e34383a3c3f41434445464646454443413f3d3a38342e2c27211b160b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e161f272f343d43484f54555c606366686a6b6c6c6c6b6a696664615e5653514a423d352f271f160d04000000000000000000000000000000071019202930363e424a5053555d606366686a6b6c6c6c6c6b6a686663605c55554f48443d352f281f170e050000000000000000000000000000000000000000000000020b141c242c323a41464d5254575f626567696b6c6c6c6c6b6a696765615f5754524d46423b332c241c140a02000000000000000013202c3946535f6c79878686868686868074675a4d4753606d797e8286898b8d8f90919292929291908e8b88837e796f6a625b51493f352b1d140a0000000000000006121f2c3844505c666f7c87929fa4aba29892878079736f6a6a696869656c6e72777d848f949fa6a49f92867b6e61584e43382b1f13060000000008141e29323b41465353535353535353535353535353535353535353535353535353535353535352514f4c4946443f38342e261e170f070000000000000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d0100000000000000000000080e171e252a31373a4045474a4d4f515152535251504e4b4746413a38332b2620181009000000000000000000000714202c38444f5961636c6c6c6c6c6c6c6361594f44382c20140700091623303c4956636f7c8993939393938a7d7164574a3e3124170b000000000000000000000000000000000000000000000000050d131923292e31323939393939393931302d28221a1108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b010000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b01000000000000000000000000000000000000000000000000000000040a0f161c1c23282c2d3032353638383939393838373432302d2c28231c1b160f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d151d232932383d44484b515356595b5d5e5f5f5f5e5d5c5a5754524d464440393029241d150d040000000000000000000000000000000000070e171f252a2f383f44464b515457595c5d5e5f605f5f5e5d5b595653514b48443d383329241d160d050000000000000000000000000000000000000000000000010b141d262e363e444c52565e61666a6e717476777879797878777673716e6966615e57524d453e362e261c140a000000000000000013202c3946535f6c798692939393938d8074675a4d4f5c6875828b8f9298989a9c9d9e9f9f9f9e9e9d9a9895908b847c726d625b51473d2f261c1106000000000003101c28343f4a54606d78839099a3afa39992867d736d67625f585c5c535b6061656c707a828f949fa9a2988f82766a6054473b2e221508000000020e1925303b444c525f60606060606060606060606060606060606060606060606060606060605f5f5e5c5956535049443f38302921191007000000000000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d120600000000000000000008111a202930363c43474b515356595c5d5e5f5f5f5e5d5a5854524c48443e37312a221b120a0100000000000000000916232f3c4855616b7079797979797979706b6155483c2f23160900091623303c4956636f7c89969f9f9f978a7d7164574a3e3124170b0000000000000000000000000000000000000000000000000002080d181d2224252c2d2d2d2d2d2d2423201c17100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000000000000060a0e1011121313131212100e0b0707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b02000000000000000000000000000000000000000000000000000000000000050b1012181c1f202326282a2b2c2c2d2c2c2b2a282623201f1c17110f0b040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b121821272c3238394045464a4c4f505252535252514f4d4a4746413b38342e271e18120b0300000000000000000000000000000000000000050d141a1d262d33383a4145474a4d4f50525253535251504e4c494645403938332c272118130c0400000000000000000000000000000000000000000000000009131d262f38404850565e61686e73777b7e81838485868685858482807e7b77736e69615e57504840382e261c13090000000000000013202c3946535f6c7986929f9f9f9a8d8074675a4d4f5c6975828f9c9fa3aaa7a7a4a2a1a1a0a1a3a6a7a79f9d9691877f726d62594f42382d22170b000000000006121f2c3844505c66727f8b95a0aba89f92877d706b605d55534e4f4f495053555a61686d79829097a1a49f94897c6f6256493c2f23160900000005111e2a36414c565e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6a696663605b53504a423b332b23190f0600000000000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e221509000000000000000008121a232c323a41464e53555d606366696a6b6c6c6c6b696764615e56554f47433c342d241c130a01000000000000000a1723303d4a5663707d868686868686867d7063564a3d3023170a00091623303c4956636f7c8996a2aca4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000060c111517181f202020202020171614100b050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000000000000040b11161a1d1e1f2020201f1e1d1b181413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f080100000000000000000000000000000000000000000000000000000000000000000000070c10121316191b1d1e1f1f201f1f1e1d1b19161312100c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c161b21272c2e34383a3d40424445464646454443403e3b3936302c28231c150c070100000000000000000000000000000000000000000002090b141c22282b2f35393a3d40424445464646454543423f3c3a38342e2c27211c160d070100000000000000000000000000000000000000000000000007101b252f38404a525a61686d747b8084888b8e8f919292929291918f8d8b8884807b746e69615a524a40382e251b0f0600000000000013202c3946535f6c7986929faca79a8d8074675a4d4f5c6976828f9caaa29f9c9a97969594939496999ea0a8a8a099928b7f726b60544a3f33281c0f03000000000713202d3a4653606d7984919ea7ada1968d80736b6059514b474342423f44464850565d676d7a85929b9993908c8275685c4f4235291c0f0200000714202d3946525e6876797979797979797979797979797979797979797979797979797979797979787776726f6c65605c544d453d352b22180d0300000000000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b0000000000000008111a242c353e444c52585f62676d7073767778797979787674716d68636159534e463f362e251c1309000000000000000a1723303d4a5663707d899393939393897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000105090b0c131313131313130a0a080400000000000000000000000000000000000000000000000000000002050708080808080808080808080808080808080808080808080808080a1724313d4a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000000050e161c2227292a2c2c2d2c2c2b29282521201d19130f0a0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b08030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b08030000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e1011121313131211100e0c0a07060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f161b1d23282c2d303335373839393938373633312e2d2a251f1c18120b0300000000000000000000000000000000000000000000000000020a11171c1f24292c2d30333537383939393938373533302d2c28231d1c16100b0500000000000000000000000000000000000000000000000000030c19222d37404a525c636c717a81868c9196989a9c9e9f9f9f9f9e9d9c9a9895918d86817b716c645c524a40372d21180e03000000000013202c3946535f6c7986929faca79a8d8074675a4d4f5c6976828f9c9a9892908d8b8988878787898c91969fa2aaa39f93877d70665b5044382b1f120700000004101d2935404b5564717d8a96a1acaa9e9184796d60594f45403937312d3337393e444c555e68717e8b8e8a86837f7c6f6255483c2f2215090000000814212e3b4754616e7a8686868686868686868686868686868686868686868686868686868686868584827f7c78716d665e574f473d342a1f150b0100000000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c000000000000050f1a232c363e474f565e616a6f747a7d808284848586858483817e7a76706b625f58514840372e251b11070000000000000a1723303d4a5663707d89969f9f9f96897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e11141415151515151515151515151515151515151515151515151515151724313d4a5764707d8a97a39d9083766a5d5043372a1d1000000000000000000000000000000000000000000000000000040e1720272e3336373939393939383634312e2d2a251e1a150e060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b0f12181c1f202326282a2b2c2c2c2b2a29272421201e1914100c070000000000000000000000000000000000000000000000000000000000060b0f13181d20212426292a2b2c2d2c2c2b2a282623201f1c1812100b050000000000000000000000000000000000000000000000000000000a151e2b343f49525c646e737e858d92999da0a8a9a29f9d9c9b9c9d9fa2aaa7a09d99928e857e736e645c52493f332a1f1409000000000013202c3946535f6c7986929faca79a8d8074675a4d505c6976838f918d898583807e7c7b7a7a7b7d7f848b9298a2aba4999083786c605346392e23180c0000000613202c3945515d6775828f9ba8aea3988b7e71675d51473d352f2b2622272b2d323a434c56606d7883817e7a76736f6a5f53473b2e2115080000000814212e3b4754616e7a87939393939393939393939393939393939393939393939393939393999292918f8c89837e786e6960594f463c31271d1207000000000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d20130000000000020d17212c353e48505961686d757c8186898c8f909192929291908d8b86827d766f6a625b524940372d23190d0300000000000a1723303d4a5663707d8996a3aca396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000000000000000000000000000000010507080b0e10111213131211100e0b0807050100000000000000000000000000000000000000000000000000000000050d14191e202121212121212121212121212121212121212121212121212121212124313d4a5764707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000000000b16202932393f434445464646454543413e3a3936302b2620180f0900000000000000000000000000000000000000000000000000000004090e1112131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a0804000000000000000000000004090e1112131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130b0a0804000000000000000000000000000000000000000000040613131313131313131312110e090400000000000000000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b0906010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c10131317191c1d1f1f201f1f1e1c1a171414110e080400000000000000000000000000000000000000000000000000000000000000000003070d111314171a1c1d1f1f20201f1e1d1b19161313100c07000000000000000000000000000000000000000000000000000000000006111c26303d46515b646e74808a92979fa3a9a19e999792908f8f8f909298989d9fa7a39f97928a80736e635b51453b31261a0e040000000013202c3946535f6c7986929faca79a8d8074675a4d505c6976838a85807c797674716f6e6e6d6e7073787e869299a3aba0958a7e7164544b4034281c100400000714202d3a4753606d7a86929facac9f92867a6d60554b403529241d1a171b1f2028313a44515c666d7775716d6866625f584e43372b1f12060000000814212e3b4754616e7a87949f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa39f9e9d9c9995908b837b6f6b60584e43392f23180c02000000000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000009141f29333d47505a616b707a82888e9298999c9d9e9f9f9f9e9c9a99938f8a837c726d635c52493f352b1f150b01000000000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000000000000000000000000003080d111414171a1c1e1f20201f1e1d1a171414110d080300000000000000000000000000000000000000000000000000050e171f252a2d2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e313d4a5764707d8a97a39d9083766a5d5043372a1d1000000000000000000000000000000000000000000000000006111c27323b434a4f51525353535251504e4b4746413a37312a221b120900000000000000000000000000000000000000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c050000000000000000080f151a1d1f20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020171714110c050000000000000000000000000000000001070c10132020202020202020201f1d1a150f080000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070a0d0f11121313131211100d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000010406070a0d0f11121313131212100f0c09070604000000000000000000000000000000000000000000000000000000000000000c17232e38424f59626d74808d929ea1a9a39f97918c8885838282838385888b90959ea1a8a29f928d80736d62574d42362a20160a0000000013202c3946535f6c7986929faca79a8d8074675a4d4e5a6774807d7974706d666764636261606163656c727d87929faca79b8f8275665c5145382c1f130600000a1723303d4a5663707d8998a3aea89b8e8275675d51433a2f23181d1d1d1d1d161f2834404a545c606a6864615e5655534e463c32261b0f030000000814212e3b4754616e7a8794a1acacb4aeaca6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a8aaa9a7a09d9590857d6f6a5f554b4034291e130800000000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d201300000000020e1a25303b454f59616c717d858f939a9fa3aaa9aaa8a7a6a7a9a9aba49f9c9490867f736e635b51473d31271d1207000000000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000000000000000000000060b1014191e20212427292b2c2c2c2c2b2a272421201e19140f0b0600000000000000000000000000000000000000000000020d17202930363a3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3d4a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000a16222e39434d555b5d5f5f605f5f5e5c5b5854524c47433c342d241b1108000000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c17100800000000000009121920262a2c2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c1710080000000000000000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a262019120900000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d181109010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54606b727f8c929ca4aaa299928c84807b787675757677797b7f838a91969fa6a49c928b7f72695f53463d32271b0f0300000013202c3946535f6c7986929faca79a8d8074675a4d4c58646e74716d6663605c54585655545454535b606b74818d9aa9ac9f9285796d6053463a2d20130700000d1a2733404d5a6673808d99aab4aa978b7e7164554c4131282a2a2a2a2a2a2a2a2a232e39424a51535d5b5754524c4847433c342a20150a000000000814212e3b4754616e7a8794a7afb4aba39f9a9898989898989898989898989898989898989898999b9ea1a9aca79f9792857c6e675c51453a3025190d0100000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d20130000000005121e2a36424d57606b717e8791979ea5acaba9a19e9b9a9a9b9d9fa4abaca69f98928b80736d62594f43392f23180c000000000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000000000000000000020a11171c1f252a2d2e3134363839393938373634312e2d2a251f1b17110a02000000000000000000000000000000000000000009141f29323b4246474848484848484848484848484848484848484848484848484848484848484a5764707d8a97a39d9083766a5d5043372a1d100000000000000000000000000000000000000000000000020e1a27333f4a555f676a6c6c6c6c6c6b696764615e56534e463e362d23190b0200000000000000000000000000000000000000000008121b242b3136383939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a12080000000008121b242b3136383939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393931302d28221a1208000000000000000000000000030d151d23292c3939393939393939393836312b241b12080000000000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b13090000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b09060100000000000000000000000000000000000000050a0d0f101313100f0d0a050000000000000000000000000000000000000000000000000000000000000000060a0e1011121313131212100e0b0707050100000000000000000000000000000000000000000000000006121f2c3844505c666f7c87929fa4aba29892878079736f6a6a696869656c6e72777d848f949fa6a49f92867b6e61584e43382b1f130600000013202c3946535f6c7986929faca79a8d8074675a4d47525c646764605c5453514b4b4948474748495059626e7b8897a1ada298887c6f6255493c2f2216090004101c2834404b546976828f9ca9aea398887b6f6255483c2f3737373737373737373737373039404446514e4b4746413c3b37322a261f180f060000000814212e3b4754616e7a87959fa3aba399928d8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8c8f92979ea1a9a9a2979184796d60564c41362a1d110500000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a000000030e18212d3a46525e69707d879299a1a9ada79f9d97928f8d8d8e9093999fa2aaaaa39f928b7f726b60554b4034291c12070000000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000000000000001070c141c23282b3036393b3e414344454646454443413e3b3936302b27221b140b07000000000000000000000000000000000000020e1925303b444d5254545454545454545454545454545454545454545454545454545454545454545764707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000003101d2936434f5b6771777879797978787674716d68625f5850483e352b1d140a0000000000000000000000000000000000000000040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a10050000040f19242d353d4245464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646463e3c39332c241a100500000000000000000000010b151f272f343846464646464646464645423d352d24190f040000000000000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b1106000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d0600000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000000000000000000000000000000040b11161a1d1e1f2020201f1e1d1b181413110d080200000000000000000000000000000000000000000003101c28343f4a54606d78839099a3afa39992867d736d67625f585c5c535b6061656c707a828f949fa9a2988f82766a6054473b2e22150800000013202c3946535f6c7986929faca79a8d8074675a4d414a52585a5753504a4645403e3c3b3b3a3b3f47535f6a7885929eabaa968a7d7063574a3d3024170a0006131f2c3845515c667884919eabac9f9286796d6053464444444444444444444444444444444444444444444444444444443b3a36312a21180e0300000714202d3a4753606d79838c9299a29f9286807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f8082858a91969fa7a9a0968c7f73685e5246392d2013080000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f2316090000000915202c38444f59616e7b869299a3abada49c959089858281808183878c9298a0a8aea49f93877d6f675c5145392e23180c0000000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000000000000030b12181e262e34383b4146474a4d4f515253535251504d4a4746413b37332d261d18120b030000000000000000000000000000000005111e2a36424d565e61616161616161616161616161616161616161616161616161616161616161616164707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000004111e2a3744515d6a778385868686858483817e7a756e6a615a50473d2f261b1106000000000000000000000000000000000000000915202b353f474e52535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c00000915202b353f474e52535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c0000000000000000000007121d2731394045535353535353535353524e473f352b20150900000000000000000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d010000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d1811090100000000000000000000000000040d151c2226292a2d2d2a2926221c150d040000000000000000000000000000000000000000000000000000050e161c2227292a2c2c2d2c2c2b29282521201d19130f0a030000000000000000000000000000000000000006121f2c3844505c66727f8b95a0aba89f92877d706b605d55534e4f4f495053555a61686d79829097a1a49f94897c6f6256493c2f23160900000013202c3946535f6c7986929faca79a8d8074675a4d4141474c4e4a46443f3a38342e302f2e2d2d37434e586a7784909daaa4978b7e7164584b3e3125180b000713202d3a4653606d7986939facaa9d908477665c50505050505050505050505050505050505050505050505050505050504846423b332a1f140900000613202c3945515d676d787f879297a29992867e727272727272727272727272727272727272727375797e8490959fa9a89f92867a6d6154473a2f24190d0100000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c2014070000020f1a26313c4855616b75828f98a2abada39b928c837d7975747374767a7f869196a0a8afa4999184796d60544a4034281c100400000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000000000050d151d242930383f44464c5254575a5c5e5f5f5f5f5e5d5a5754524c46443f382f28231c150c030000000000000000000000000000000714202d3a46525e696e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e707d8a97a39d9083766a5d5043372a1d10000000000000000000000000000000000000000000000006121f2c3945525f6c78859292999292918f8e8b87827c716c61594f41382d22170b000000000000000000000000000000000000000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c1104000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c11040000000000000000000c18232f39434b515f606060606060605f5e5951473d31261a0e010000000000000000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d120600000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b1309000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000000000000000000000000000000040e1720272e3336373939393939383634312e2d2a251e1a150e060000000000000000000000000000000000000713202d3a4653606d7984919ea7ada1968d80736b6059514b474342423f44464850565d676d7a85929b9993908c8275685c4f4235291c0f02000013202c3946535f6c7986929faca79a8d8074675a4d41363c3f413e3a38342e2c2823232221212c3844505c667784919daaa5988b7f7265584b3f3225180c000815212e3b4854616e7b879aa4afa99c90837669545d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534d453b31261a0e020004101d2935404b555d666d727d859298a29892877f716b6565656565656565656565656565656566666d717a839097a1ada2988b7f7265564c4135291d11040005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c1004000006121f2b37434e5863707d8a939eaaafa59b918b8078706c66676768686d737b849196a0acaba0968c7f72665c5144382c1f120600000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000000000000050e161f272f353e424a5053565e616467696b6c6c6c6b6a696764615e56535049413d342e271e150c0300000000000000000000000000000814212e3b4754616e7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7f8b98a49d9083766a5d5043372a1d10000000000000000000000000000000000000000000000006121f2c3945525f6c7885929493939496999a99938e867e716b6053493f33271b0f03000000000000000000000000000000000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d21140800111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d211408000000000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d110400000000000000000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e2215090000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b110600000000000000000000000a151f2831383e4243464643423e3831281f150a0000000000000000000000000000000000000000000000000b16202932393f434445464646454543413e3a3936302b2620180f090000000000000000000000000000000004101d2935404b5564717d8a96a1acaa9e9184796d60594f45403937312d3337393e444c555e68717e8b8e8a86837f7c6f6255483c2f22150900000013202c3946535f6c7986929faca79a8d8074675a4d4134303334312d2c28231f1c18161e2429363e4653606d7985929facab978a7e7164574b3e3124180b000916232f3c4956626f7c8995acb6a89c8f82756a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a615f574d42362a1e120500010d18242f39434b545c606b707d86929fa29992877d70675d5858585858585858585858585859545c60686d7a85919ea9aa9c908376685d5245392c201306000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b0000000814212e3a47535f6a7683909ca5afa99e938b7f736c65605b545a565e61696e7a84919aa4afa89e9285796d6053463a2d22170b00000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000000040d162028313940454f545c6064686e7174767778797978777674716e6863605b534e44403930271e150c0300000000000000000000000000111e2a3744515d6a7784878787878787878787878787878787878787878787878787878787878787878787878b919ba99d9083766a5d5043372a1d10000000000000000000000000000000000000000000000006121f2c3945525f6c78858887868787898d92979f9892887d70655b5044372b1f1205000000000000000000000000000000000000121f2c3845525e6a7579797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a00121f2c3845525e6a7579797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a000000000000000006131f2c3845515c67767979797979797979756a5e5245382c1f12060000000000000000000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b00000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d0100000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000000000000000000000000000006111c27323b434a4f51525353535251504e4b4746413a37312a221b12090000000000000000000000000000000613202c3945515d6775828f9ba8aea3988b7e71675d51473d352f2b2622272b2d323a434c56606d7883817e7a76736f6a5f53473b2e21150800000013202c3946535f6c7986929faca79a8d8074675a4d413427262724201f1c1713141920282f353f48515b63707d8998a2aea399897c6f6356493c30231609000a1623303d495663707c8996a3afa89b8e8177777777777777777777777777777777777777777777777777777777777777776e695f53463a2d211407000007121d283139424a5059606b717e8b949fa39991857a6d60564c4c4c4c4c4c4c4c4c4c4c4c4c4a51565e68717e8b97a1a69f94877a6d6054473a2d211407000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a10050000000815222f3b4855626e7b88949fabada2978e81746d605b53504a4d4c52575e68707d87939facada1978a7d716453493f33271b0f03000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000000000010c161f28323a434b515961666d71767a7e808284858686858483807d7a76706c656058514a423930271e150a00000000000000000000000000111e2a3744515d6a778490949494949494949494949494949494949494949494949494949494949494949494989ba3a99d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000916232f3c4956626f7c7b7a7a7a7b7d808590959f9a9184786c605346392d20130600000000000000000000000000000000000013202c3946535f6c79878686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b0013202c3946535f6c79878686868686868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b00000000000000000714202d3a4753606d798686868686868687796c5f5346392c201306000000000000000000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d12060000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a000000000000000000000000000000000000000000000a16222e39434d555b5d5f5f605f5f5e5c5b5854524c47433c342d241b110800000000000000000000000000000714202d3a4753606d7a86929facac9f92867a6d60554b403529241d1a171b1f2028313a44515c666d7775716d6866625f584e43372b1f120600000013202c3946535f6c7986929faca79a8d8074675a4d4134271a1b171312100e171f252a323a4145515a626d76828f9caaac9f9286796d6053473a2d201407000a1724303d4a5763707d8a96a3b0ab9e928583838383838383838383838383838383838383838383838383838383838383837b6e6155483b2e2215080000010c161f2830383f444f59626c76828f9ca7a1978d8073685e52463f3f3f3f3f3f3f3f3f3f3f40444c56606d7985929a999896897c6f6356493c30231609000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a110800000005121e2a36424d576774808d9aa6b0ac9f92857a6d615b5049443f4041464d56606b75828f9baab3a99b8e8175655b5044372b1f1205000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000000008131e28313a444c555d606b70787e82868a8d8f919292929291908d8a87827d786f6a605c544a423930261c1106000000000000000000000000111e2a3744515d6a7784909da1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a4a7aca99d9083766a5d5043372a1d100000000000000000000000000000000000000000000000000815222e3b4754606a6f6e6d6d6d6e70737a83909da096897c6f6356493c3023160900000000000000000000000000000000000013202c3946535f6c798692939393939393939393939393939393939393939393939393939393939393939393939393939393939393938a7e7164574a3e3124170b0013202c3946535f6c798692939393939393939393939393939393939393939393939393939393939393939393939393939393939393938a7e7164574a3e3124170b00000000000000000714202d3a4753606d7a8693939393939286796c5f5346392c2013060000000000000000000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d20130000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e2215090000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d010000000000000000000000000000000000000000020e1a27333f4a555f676a6c6c6c6c6c6b696764615e56534e463e362d23190b02000000000000000000000000000a1723303d4a5663707d8998a3aea89b8e8275675d51433a2f23181d1d1d1d1d161f2834404a545c606a6864615e5655534e463c32261b0f0300000013202c3946535f6c7986929faca79a8d8074675a4d4134271a0e0b070b1218202930363e444c525b626c727f8b949faba89c8f8376675d5145392c1f1306000a1724313d4a5764707d8a97a3b0ada1979290909090909090909090909090909090909090909090909090909090909090887b6e6255483b2f221508000000040d161e262e343d47505a63707c8995a0a99f92867a6d6154473b3032323232323232322e343a45515c6674818e8e8c8b89887f7265584c3f3225190c000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c161008000000000714212d3a46535f697884919eabafa49a8c7f73685e52443f383330363b444f5963707d8a98a2aeab9f9285796c605346392d201306000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000000050e19242f3a434c565e676d747d848a8f93999a9c9e9f9f9f9e9d9c9a9a938f8a837c736d665c544a42382e23170b020000000000000000000000111e2a3744515d6a7784909d9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d9083766a5d5043372a1d1000000000000000000000000000000000000000000000000006131f2b38434e586062616160606163686f7c8899a4988b7e7265584b3f3225180c00000000000000000000000000000000000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b0013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b00000000000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c201306000000000000000000000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b0000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f03000000000000000000000000000000000000000003101d2936434f5b6771777879797978787674716d68625f5850483e352b1d140a000000000000000000000000000d1a2733404d5a6673808d99aab4aa978b7e7164554c4131282a2a2a2a2a2a2a2a2a232e39424a51535d5b5754524c4847433c342a20150a0000000013202c3946535f6c7986929faca79a8d8074675a4d4134271a0e030c151c2328323b41464f565d606d727e87929fa6ada1968b7e7165554b4035291d1004000a1724313d4a5764707d8a97a3b0b3a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d94887b6e6155483b2e22150800000000040c141c2328353f4854606b7783909daaa3988c7f7266574d42362a25252525252525232834404b5464717e8281807e7d7c796d6053473a2d201407000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b0500000000000815222e3b4855616e7b8896a1aca69f93877b6e61564c41332d28252a323d4653606c7985929fabada297887b6e6155483b2e221508000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000000020d17202935414c555e686d79818a91969c9fa4aba5aba49f9fa4aca5aca49f9c95908780786d665c544a3f34281d140a0000000000000000000000111e2a3744515d6a77839093939393939393939393939393939393939393939393939393939393939393939393939393939083766a5d5043372a1d10000000000000000000000000000000000000000000000000030f1b27323d464e5456555453545456606c7986939f998c807366594d4033261a0d00000000000000000000000000000000000013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a4978a7d7164574a3e3124170b0013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a4978a7d7164574a3e3124170b00000000000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000000000000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d201300000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c000000000000000003101d2a3643505d69768286868276695d5043362a1d1003000000000000000000000000000000000000000004111e2a3744515d6a778385868686858483817e7a756e6a615a50473d2f261b1106000000000000000000000004101c2834404b546976828f9ca9aea398887b6f6255483c2f3737373737373737373737373039404446514e4b4746413c3b37322a261f180f0600000013202c3946535f6c7986929faca79a8d8074675a4d4134271a0e0c151e272e343e444d525961686d757f879299a3afa59e9184796d6053463a2f24180c00000a1723303d4a5663707d8996a3b0b8b0aba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa9aaaaaaaaaa94877a6e6154473b2e2114080000000000020a1117232c38444f596673808c99a6aa9d918477695e52463a2d2019191919191918232e394955616c7176747371706f6d675d5145392c201306000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a000000000000000b1825313e4b5864717e8b939a979a9c908376695e52443a30221b19202b3844505b6676838f9ca9b3a9978a7d7064574a3d3124170a000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000008141e29323b45515d676d7a838e939ea0a8a7a09d99959993939a96999ea0a8a7a099928c81786d665c50443d2f261c110600000000000000000000111e2a3744515d6a77838686868686868686868686868686868686868686868686868686868686868686868686868686868683766a5d5043372a1d10000000000000000000000000000000000000000000000000000a162027333f49535b606060606062666e7b8799a4988c7f7265594c3f3226190c00000000000000000000000000000000000013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a978a7d7164574a3e3124170b0013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a978a7d7164574a3e3124170b00000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d2013000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000006121f2c3945525f6c78859292999292918f8e8b87827c716c61594f41382d22170b000000000000000000000006131f2c3845515c667884919eabac9f9286796d6053464444444444444444444444444444444444444444444444444444443b3a36312a21180e03000013202c3946535f6c7986929faca79a8d8074675a4d4134271a0b151e273039404450565e616b707a818b9299a3aba79e938b7e71665c5145382c1d12070000091623303c4956636f7c8996a2afb0a69f9c9393939393939393939393939393939393939393939393939c9ea6b0aea398877a6d6054473a2d2114070000000000000006101b27323d4956636f7c8996a9aca095877b6e6154483b2e21150c0c0c0c07121d2d3944505a6164696766656362605d554b4035291d1104000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a000000000000000c1925323f4c5865727f8486898b8d8f8c807366574d4232281e110f1c28333f4a546774808d9aa7b2a5988b7f7265584c3f3225190c000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000010d1925303b44515b606d798390959ea5a9a19e95908c8987868687898c91969ea1a9a39f938f81786d60584e42382d22170b00000000000000000000101d2936424f5b677177797979797979797979797979797979797979797979797979797979797979797979797979797979797671665b4e4236291c100000000000000000000000000000000000000000000000000005121f2b3744505b656c6d6c6c6d6f7278818e9ba095897c6f6356493c3023160900000000000000000000000000000000000013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7e7164574a3e3124170b0013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8a7e7164574a3e3124170b00000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a00000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000006121f2c3945525f6c7885929493939496999a99938e867e716b6053493f33271b0f03000000000000000000000713202d3a4653606d7986939facaa9d908477665c50505050505050505050505050505050505050505050505050505050504846423b332a1f1409000013202c3946535f6c7986929faca79a8d8074675a4d4134271a121d273039424a515a62686e757d848e939fa3aba8a0958f81756c61544b4034281c0b0100000815222f3b4855626e7b8895a9b3ab9f948f8686868686868686868686868686868686868686868686868f949eaaac9f928579675d5145392c20130600000000000000000b14212d3a4754606d7a8797a1ada7978b7e7164584b3e3125180b00000000101c28333e485055575c5b5958565553514b433a2f24180d01000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a000000000000000b1824313e4a56626d72787a7c7e8082847d7063574a3d3024160c0b17222d404c5966737f8c99a6b2a6998d8073665a4d4033271a0d000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000005111e2a36414c56626d75828f959fa7a8a097928a837f7c7a79797a7c7f848a9297a0a8a59e938d80736a60544a3f33281c0f030000000000000000000e1a27333f4a555f676a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a665f554a3e32261a0d000000000000000000000000000000000000000000000001080d13202d394653606c777979797a7b7e838e939e989083786c605346392d20130600000000000000000000000000000000000013202c3946535f6c7986929facb3a79a8d80808080808080808080808080808080808080808080808080808080808080808080808080807c6f6255483c2f2215090013202c3946535f6c7986929facb3a79a8d80808080808080808080808080808080808080808080808080808080808080808080808080807c6f6255483c2f22150900000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f2316090000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000006121f2c3945525f6c78858887868787898d92979f9892887d70655b5044372b1f1205000000000000000000000815212e3b4854616e7b879aa4afa99c90837669545d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534d453b31261a0e020013202c3946535f6c7986929faca79a8d8074675a4d4134271a18232e39434b545c606c717b818a91969ea5afa69f959083796d605a5042392e23180c0000000714212d3a4754606d7a8797a2ada99c8f82797979797979797979797979797979797979797979797979828f9ca9ab9e9184786b554b4135291d110400000000000000030613202c3945515d677885919eaba6998d8073665a4d4033271a0d0c0c0c0c0b17222c363e44494a4f4e4d4b4a484745403a31281d1307000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a000000000000000916222e3a46515b6265676d6f71737578706b6155483c2f231604061925323f4c5865727f8b98a5b2a79a8d8074675a4d4134271a0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000714202d3946525e68727f8b949ea7a9a09591857e77726f6d686c6d6f72787e859196a0a9a59f93877c6f665b5044382b1f13080000000000000000000a16222e39434d555b5d606060606060606060606060606060606060606060606060606060606060606060606060606060605d5b554d43382d22160a00000000000000000000000000000000000000000003090e13191d202d394653606c7984868687888b90959a9590867c6f665b5044382b1f120802000000000000000000000000000000000013202c3946535f6c7986929facada0938679737373737373737373737373737373737373737373737373737373737373737373737373736f6a5f53473a2e2115080013202c3946535f6c7986929facada0938679737373737373737373737373737373737373737373737373737373737373737373737373736f6a5f53473a2e21150800000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c201407000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000916232f3c4956626f7c7b7a7a7a7b7d808590959f9a9184786c605346392d201306000000000000000000000916232f3c4956626f7c8995acb6a89c8f82756a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a615f574d42362a1e12050013202c3946535f6c7986929faca79a8d8074675a4d41342716202834404b555c666d747e858e939ea1a8aca49f9490837b6e675d51483e30271d12070000000613202c3945515d677885929eabaa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c667784919eaaa99c8f8376695c50432f24180d010000000000040a0f13151d2935414b556a7783909daaa89b8f8275685c4f4235291c191919191919191a242c33393c3e4341403e3d3c3a39352f281f160c01000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a0000000000000006121e29343f495156555d60626467696b6361594f44382c2014070b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000005111d2935414c56616e7a85929fa6ada19791837b716c6662605d606163656c717b849197a1ada4999184786c6053463a3025190d01000000000000000006111c27313b434a4f5153535353535353535353535353535353535353535353535353535353535353535353535353535353504e4a433a31271c110500000000000000000000000000000000000000030a0f151a1e24292c2e3844505b6673808c9993999292908d89837c6f6a5f544a3f33281c19130d080100000000000000000000000000000013202c3946535f6c7986929facada093867a6d676767676767676767676767676767676767676767676767676767676767676767676767625f584e43372b1f12060013202c3946535f6c7986929facada093867a6d676767676767676767676767676767676767676767676767676767676767676767676767625f584e43372b1f120600000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c1004000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000815222e3b4754606a6f6e6d6d6d6e70737a83909da096897c6f6356493c30231609000000000000000000000a1623303d495663707c8996a3afa89b8e8177777777777777777777777777777777777777777777777777777777777777776e695f53463a2d2114070013202c3946535f6c7986929faca79a8d8074675a4d4134271e28323a45515c676d78818b92979ea5ada8a19a938d827a6e695e554c41362d1e150b0000000004111d2935414c55697683909ca9ab9f928578695f606060606060606060606060606060606060606d7986929faca79a8d8174675a4e4134271b070000000000070f161b1f2223242f43505d697683909ca9a99c908376695d5043362a2525252525252525252520282d303136343332302f2d2c29241d160d04000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a00000000000000010d18232d373f464a4b515356585a5c5e57554f473e33281c10040b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000713202d3946525e6874808d98a2aea69e92857b6e69615a5654525354535b60696e7b85929ea8aba0958a7d7063564c41362a1d11050000000000000000000b151f2931393f42444646464646464646464646464646464646464646464646464646464646464646464646464646464643423e3831281f150a00000000000000000000000000000000000000060b151a1f262b2f35393a40444a54616e7b87939f92878583817d786f6a5f584e4238342e29241e19130c04000000000000000000000000000013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261b0f030013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a55534e463c31261b0f0300000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b0000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f231609000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000006131f2b38434e586062616160606163686f7c8899a4988b7e7265584b3f3225180c000000000000000000000a1724303d4a5763707d8a96a3b0ab9e928583838383838383838383838383838383838383838383838383838383838383837b6e6155483b2e2215080013202c3946535f6c7986929faca79a8d8074675a4d41342724303a44515b606d79828e939fa2a9ada59d96918880786d685e564d433a2f241b0c0300000000010d19242f414d5a6774808d9aabaea298887b6e61555353535353535353535353535353535355626f7c8899a3afa9988b7e7265584b3f3225180c0000000007101921272c2f303236434f5c6976828f9ca9aa9d9083776a5d50443732323232323232323232322d2c28232429282625232220201d18130c0400000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a000000000000000006111b252d343a3a404547494b4d4f514a48443e352c21170b000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000714212e3a4754616d7a86929faaab9f948a7d70695e575049474546474950565e69717e8b96a0aca79c8f8275685e5246392d201307000000000000000000040d171f272e333637393939393939393939393939393939393939393939393939393939393939393939393939393939393736322d271f160d030000000000000000000000000000000000020a111720262b31373a4145474a5153555e6976828f9b8f82787774706c655f58504a46443f38353029241e160d070000000000000000000000000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c342a20150a000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4847433c342a20150a0000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a10050000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c201407000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000030f1b27323d464e5456555453545456606c7986939f998c807366594d4033261a0d000000000000000000000a1724313d4a5764707d8a97a3b0ada1979290909090909090909090909090909090909090909090909090909090909090887b6e6255483b2f2215080013202c3946535f6c7986929faca79a8d8074675a4d4134272935414c56626d75818e949da5ada9a19e938e847d736d665d564d443b31281e1209000000000000081724313e4a5764717d8a99a3afaa988b7e7165574d42464646464646464646464646424d5765727f8c98abada297887b6f6255483c2f221509000000040f19222b32383b3c3f3f434f5c6976828f9ca9aa9d9184776a5e51443f3f3f3f3f3f3f3f3f3f3f3f3a38342e271e151a1817151413110d070100000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a00000000000000000009131b23292e2f35393a3c3e4042453d3c38332c231a1005000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000005121e2a36424d5765727f8c98a2aea99c8f82766c61574d453e3a39393a3f444d57616c7784919eaaa99f93867a6d6154473a2e21140700000000000000000000050d151c2227292a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2a2926221c150d040000000000000000000000000000000000060c141c232831373c42474c5154545c60626466717e8a9792877b6e6a69676462605b5453504a45413a352f281f18120b03000000000000000000000013202c3946535f6c7986929facada093867a6d6053474040404040404040404040404040404040404040404040404040404040404040403c3a37312a22180e04000013202c3946535f6c7986929facada093867a6d6053474040404040404040404040404040404040404040404040404040404040404040403c3a37312a22180e040000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a110800000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c1004000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000a162027333f49535b606060606062666e7b8799a4988c7f7265594c3f3226190c000000000000000000000a1724313d4a5764707d8a97a3b0b3a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d94887b6e6155483b2e2215080013202c3946535f6c7986929faca79a8d8074675a4d4134272d3946525d68727e8b939ea6afa69f979189817a706b605c544c443b32291f160c000000000000000714212e3a4754616d7a86929faca89b8e8275695e53463d313939393939393939303946525e6976828f9ca9ab9e9285786c605346392d2013060000000a16212b343d4348494c4c4c4f5c6976828f9ca9aa9d9184776a5e514c4c4c4c4c4c4c4c4c4c4c4c4c4645403930271d12070a09070604010000000000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a000000000000000000010911181e1d24292c2d2f31343638302f2c28211a110800000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000714202d3a46525e697783909daaada197897d7063594f453b332d2c2d2d333b45505a66737f8c999d9c9c998a7d7063574a3d3024170a0000000000000000000000040b11161a1d1e202020202020202020202020202020202020202020202020202020202020202020202020202020201d1c1a16110a030000000000000000000000000000000000070f181e262e343c43474d53555d6064666d6f717375798592998c8078777673716e6c6663605c54524c45413a3128231d150c040000000000000000000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343434342f2e2b262018100600000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343434342f2e2b2620181006000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c161008000000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b00000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000005121f2b3744505b656c6d6c6c6d6f7278818e9ba095897c6f6356493c30231609000000000000000000000a1723303d4a5663707d8996a3b0b8b0aba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa9aaaaaaaaaa94877a6e6154473b2e2114080013202c3946535f6c7986929faca79a8d8074675a4d4134272e3a4754616d7a85929fa5afa59e948f857d746d676059514a423a322920170d04000000000000000713202d3946525d6876828f9ca9ac9f92867b6e61584e433b322c292424292c3139424d57616e7b86929faca89b8e8174655b5044372b1f12050000030f1b27323d474f5456585858585c6976828f9ca9aa9d9184776a5e585858585858585858585858585853514b42392e23180c00000000000000000000000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a0000000000000000000000060d1213181d2020232527292b2423201c1710080000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000815212e3b4854616e7b87959fabab9e9184786c6053463e33292120202227333e4956626f7c899191908f8e8d8073665a4d4033271a0d00000000000000000000000000060a0e10111313131313131313131313131313131313131313131313131313131313131313131313131313131310100d0a05000000000000000000000000000000000000081019212a30383f444e53575f62676d7175797c7e80828390979c928c848382807e7b7974706d66605d56524c433d342e271e160e0500000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2727272727272727272727272727272727272727272727272727272727272722211f1b150e060000000013202c3946535f6c7986929facada093867a6d6053473a2d2727272727272727272727272727272727272727272727272727272727272722211f1b150e0600000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b0500000000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a100500000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000613202d394653606c777979797a7b7e838e939e989083786c605346392d20130600000000000000000000091623303c4956636f7c8996a2afb0a69f9c9393939393939393939393939393939393939393939393939c9ea6b0aea398877a6d6054473a2d2114070013202c3946535f6c7986929faca79a8d8074675a4d41342935404b5565727f8c97a2ada59e938e827a706b605d554f444039302820170e05000000000000000005111d2935414c5664717e8b96a1ada3998d80746a60564d443e39352f2f35383c434b545e6973808d99a3aca096897d706353493f33271b0f03000007131f2c38434f59606365656565656976828f9ca9aa9d9184776a656565656565656565656565656565605c544b4034281c10040000000000000000000000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a0000000000000000000000000101070d11131416181a1c1e171614100b05000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000b1824313e4b5764717e8a97a7b1a79a8d8174665b5044382c2017131317202d3a4753606d79868584838281807e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a222b333c424a50585f62696e747a7e8185888b8d8f9095a0a49c9691908f8d8a8885817d79736d68605d564f454039302820160e05000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1515120f0a04000000000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1515120f0a040000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a000000000000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a11080000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000020a13202d394653606c7984868687888b90959a9590867c6f665b5044382b1f1206000000000000000000000815222f3b4855626e7b8895a9b3ab9f948f8686868686868686868686868686868686868686868686868f949eaaac9f928579675d5145392c2013060013202c3946535f6c7986929faca79a8d8074675a4d41342c3945515d677783909da9ac9e938e81786d686159514c433d342e271e160e05000000000000000000010d1924303a4653606d7984919ea7ab9f92877c6f685e564f47454141414045474e555c666e7b86929faba89e9184786c605346392d22170b0000000915222f3b4854606b6f72727272727276828f9ca9aa9d918477727272727272727272727272727272726d665c5145382c1f130600000000000000000000000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a00000000000000000000000000000001040607090b0d0f120a0a07040000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00010e1b2734414e5a6774818d9aa7b4aa978a7e7164544a3f33281a0e0606131f2c3845515c676d79787776757474716c6155493d3023170a0000000000000000000000000000000000000000000000000002050708080808080808060503000000000000000000000000000000000000000000000000000000000000000000000000000000000007111a232b343d454d545c606a6e757b81868a8e929897999c9da0a7aea8a19e9d9c9a9797928e8985807a736d686059514b423a322820170e050000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d090806030000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0908060300000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a000000000000000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c161008000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000001070c141c232b3844505b6673808c9993999292908d89837c6f6a5f544a3f33281c0f03000000000000000000000714212d3a4754606d7a8797a2ada99c8f82797979797979797979797979797979797979797979797979828f9ca9ab9e9184786b554b4135291d11040013202c3946535f6c7986929faca79a8d8074675a4d41342d3a4753606d7a86929faca49a8f81776d665e564f45413a3128231c150c04000000000000000000000008131f2c3845515c67727f8b95a0aba39991847a6e68615954514c4e4e4b5153575f676d78839098a2aca0968b7f72665b5044382b1b1106000000091623303c4956636f7d7f7f7f7f7f7f7f83919daaab9e91857f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6053463a2d201307000000000000000000000000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a000000000000000000000000000000000000000000010305000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0004111d2935414c566a7683909da9aea298887b6e6155483b2d2217080004101c2934404b555c606c6b6a6969686764615a5045392d211408000000000000000000000000000000000000000000000003090e12141515151515151513120f0b060000000000000000000000000000000000000000000000000000000000000000000000000000050f19232b353d464e575f666d727c81878e92999b9fa2aaa6a8aaa9a8a7a7a8a9aaa9a6a9a29e9a97928d85807a706b605c544c443a322920170c0300000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140701010101010101010101010101010101010101010101010101010101000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407010101010101010101010101010101010101010101010101010101010000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b0500000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000030b12181e262e34383f4a54616e7b87939f92878583817d786f6a5f584e42382d2218120b030000000000000000000613202c3945515d677885929eabaa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c667784919eaaa99c8f8376695c50432f24180d010013202c3946535f6c7986929faca79a8d8074675a4d41342f3c4855626f7b8899a3ac9f93877b6e655c544c443d352f281f18120b0300000000000000000000000004101c2834404b55606d78839099a3aba09690837a706b64605d555b5b555d60636a6e79818e959faaa49a9184796d60544a3f33281c0a000000000d1a2734404d5a6773808b8b8b8b8b8b8b9195a0acada197918b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b877a6d6054473a2d21140700000000000000000000000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000713202c3945525d687885929fabac9f9285796c605346392d20130600000c18232f39434b51535f5e5e5d5c5b5a575550483e33281d110500000000000000000000000000000000000000000000050d141a1e2121212121212121201f1b17110a020000000000000000000000000000000000000000000000000000000000000000000000030d17212b353d474f5860696e787f868e93999fa3ababaca8a9a29e9d9b9b9a9b9c9d9fa3aaa9aba9a19e98928c857d736d665d564c443a32291e150a00000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a000000000000000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000050d151d242930383f44464c535e6976828f9b8f82787774706c655f584e443f382f28231c150c03000000000000000004111d2935414c55697683909ca9ab9f928578695f606060606060606060606060606060606060606d7986929faca79a8d8174675a4e4134271b07000013202c3946535f6c7986929faca79a8d8074675a4d4134303c4956636f7c8996abaa9e918477695e534a423a3229241e160d070000000000000000000000000000000c18232e3944515c666f7c87929fa4a8a09590847d76716d6769676869676d70757b838e939ea7a59f93887d70665c5142382d22170b000000000d1a2734404d5a6773808d9898989898989da0a7b1b3a9a19e98989898989898989898989898989893877a6d6054473a2d21140700000000000000000000000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000714212d3a4754606d7a8797a2adaa9d918477655b5044372b1f1205000007121d273139404547525251504f4e4d4b49453e362c22170c00000000000000000000000000000000000000000000050f171f252a2d2e2e2e2e2e2e2e2d2b27221b140b02000000000000000000000000000000000000000000000000000000000000000000010b151f29333d474f59606a6f7b838c92999fa4abadaaa29f9b979792908f8e8e8e8f909298989d9fa7acaaa29f97918880786d685e564c443a30261c1106000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c07060401000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c070604010000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a000000000000000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000050e161f272f353e424a5053565e6164717e8a9792877b6e696764615e56535049413d342e271e150c0300000000000000010d19242f414d5a6774808d9aabaea298887b6e61555353535353535353535353535353535355626f7c8899a3afa9988b7e7265584b3f3225180c000013202c3946535f6c7986929faca79a8d8074675a4d41342f3c4955626f7c8895a7ab9e9184786a5f544a423930281f160d040000000000000000000000000000000007121d2834404a54606a727f8c929ca4a7a096918a827d7a7775747475767a7d818790959ea5a59e938d80736b60544b402f261c1106000000000d1a2734404d5a6773808d9a9f9f9f9f9fa9aab0b8bab2acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f93877a6d6054473a2d211407000000000000000000000000000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000815222f3b4855626e7b8895a9b3a99c8f82766953493f33271b0f030000010b151f272f34383a464544434241413e3d39332c241a1006000000000000000000000000000000000000000000030c17212931363a3b3b3b3b3b3b3b3937332d261d140a00000000000000000000000000000000000000000000000000000000000000000007121d27313b454f59606b707c8590959fa3abaea9a19e98928e8a87858382818181828386888b90959b9fa4aca9a19a938d837a6d685e564c42382e23170d040000000013202c3946535f6c7986929facada093867a6d6053473a2d2019191919191919191919191919191919191919191919191919191413110d070100000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2019191919191919191919191919191919191919191919191919191413110d0701000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a000000000000000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000040d162028313940454f545c6064686e7174798592998c80777674716e6863605b534e44403930271e150c0300000000000000081724313e4a5764717d8a99a3afaa988b7e7165574d42464646464646464646464646424d5765727f8c98abada297887b6f6255483c2f221509000013202c3946535f6c7986929faca79a8d8074675a4d41342e3a4754616d7a8795a0aca196887c6f665c544b423a31281f160d03000000000000000000000000000000000c18232e39424e58626d73808c929ea1a8a19e948f8a8683828181828386898e93999fa7a39f938f81786d60594f42392e1d140a00000000000d1a2734404d5a6773808d9393939393939c9fa6b0b2a8a09393939393939393939393939393939393877a6d6054473a2d21140700000000000000000000000000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00091623303c4956636f7c8996a2afa89b8e8175685b4e422d22170b00000000030d151d23292c2d3938373636353431302d28221a1208000000000000000000000000000000000000000000000a151e29333b42464848484848484846443f382f261b110600000000000000000000000000000000000000000000000000000000000000000c18242f39434d57606b707d8692979fa7aeaba39f96918b86817e7b7876757474757677797c7f83888e939a9fa7aca49f9590837a6d685e544a3f34281f160c0100000013202c3946535f6c7986929facada093867a6d6053473a2d26262626262626262626262626262626262626262626262626262621201d18130c04000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d26262626262626262626262626262626262626262626262626262621201d18130c040000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a0000000000000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000010c161f28323a434b515961666d71767a7e80828f979c928c8483807d7a76706c656058514a423930271e150a000000000000000714212e3a4754616d7a86929faca89b8e8275695e53463d313939393939393939303946525e6976828f9ca9ab9e9285786c605346392d201306000013202c3946535f6c7986929faca79a8d8074675a4d41342d3946525e687784919da8a89c9082786d665c544b433a31281f150b0100000000000000000000000000000007121c27303d46515b646e73808a92979fa3a69f9c9992908f8e8e8f9092989b9fa4a69f99928c81786d665c50473d30271d0b0200000000000d1a2734404d5a677380868686868686868f949faaaca0968986868686868686868686868686868686867a6d6054473a2d2114070000000000000000000000000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000a1724303d4a5763707d8a96a3b0a79a8d8174675a4e4134271b060000000000030b12181c1f202c2b2b2a2928272423211d1710080000000000000000000000000000000000000000000006111c26303b454d535454545454545453504941382d22170b0000000000000000000000000000000000000000000000000000000000000004101d2935404b555e69707d879298a2a9b1a8a099928c847f7a75716e696a6868676869666d6f72767b818790959da4afa79f9590837a6d665c50443e31281d130700000013202c3946535f6c7986929facada093867a6d6053473a333333333333333333333333333333333333333333333333333333332d2c29241d160d040000000000000013202c3946535f6c7986929facada093867a6d6053473a333333333333333333333333333333333333333333333333333333332d2c29241d160d0400000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a0000000000000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000008131e28313a444c555d606b70787e82868a8d8f949fa49c9691908d8a87827d786f6a605c544a423930261c11060000000000000713202d3946525d6876828f9ca9ac9f92867b6e61584e433b322c292424292c3139424d57616e7b86929faca89b8e8174655b5044372b1f1205000013202c3946535f6c7986929faca79a8d8074675a4d41342935414c5666727f8c96a1ab9f948e81786d665d554c433a31271d1207000000000000000000000000000000000b151e2b343f49525c646e737e858e92999ea1a8a39f9d9c9a9b9c9d9fa3a9a29f9b948f877f776d665c544a3f352c1e150b0000000000000d1926333f4c58646e7379797979797979828f9ca9aa9d9184797979797979797979797979797979797976685d5245392c201307000000000000000000000000000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f231609000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000a1724313d4a5764707d8a97a3b0a79a8d8074675a4d4134271a0e01000000000001070c1013141f1f1e1d1c1b1a181714110c0600000000000000000000000000000000000000000000000c17232e38424d575e61616161616161605b53493f33271b0f03000000000000000000000000000000000000000000000000000000000005101a232c3945515d676e7b859299a2aab1a79f9691878079726d6764615e575c5b5b5b545c6062656a6e747c838d929fa3aba7a0959082786d60594f433a2f24180d02000013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a39352f281f160c0100000000000013202c3946535f6c7986929facada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3a39352f281f160c01000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a00000000000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000050e19242f3a434c565e676d747d848a8f93999a9c9fa6aca8a09e9c9a9a938f8a837c736d665c544a42382e23170b02000000000005111d2935414c5664717e8b96a1ada3998d80746a60564d443e39352f2f35383c434b545e6973808d99a3aca096897d706353493f33271b0f03000013202c3946535f6c7986929faca79a8d8074675a4d413425303a4754606d79849199a4a69e938e81786d675d564c43392f24180d03000000000000000000000000000000030c19222d37404a525c636c717a81868d9196989b9c9e9f9f9f9f9e9d9b9997928e89827c736c655c544b42382e231a0c030000000000000b17232f3b47525c64676c6c6c6c6c6c76828f9ca9aa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5d564c4135291d110400000000000000000000000000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000b1724313e4a5764717d8a97a4b0a69a8d8073675a4d4034271a0d010000000000000000040607131211100f0e0e0b0a080500000000000000000000000000000000000000000000000003101c28343f4a545e696e6e6e6e6e6e6e6c655b5044372b1f120500000000000000000000000000000000000000000000000000000000000b16212b37434e58606d79839097a1abb1a79f9590847c736d67605d5554524d4f4e4e4e4a505355585f626a6f78808a9299a3aba79f948d80736b61554b4035291f1409000013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4745413a31281d130700000000000013202c3946535f6c7986929facada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4745413a31281d1307000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a00000000000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000020d17202935414c555e686d79818a91969c9fa4aba5aba49f9fa4aca5aca49f9c95908780786d665c544a3f34281d140a0000000000010d1924303a4653606d7984919ea7ab9f92877c6f685e564f47454141414045474e555c666e7b86929faba89e9184786c605346392d22170b00000013202c3946535f6c7986929faca79a8d8074675a4d4134272c3945515d67707d87939fa3a59e938f82796d685d554b4035291f150b0100000000000000000000000000000007101b252e38404a525a61686d747b8084888b8e90919292929291908e8c8985817c766f6a605b534b423930261c11080000000000000007131f2b36404a52585a60606060606976828f9ca9aa9d9184776a6060606060606060606060606060605f524c443a2f24190d0100000000000000000000000000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000a1724313d4a5764707d8a97a3b0a79a8d8074675a4d4134271a0e010000000000000105090b0b121111100f0e0d0908060300000000000000000000000000000000000000000000000006121f2c3844505c66767b7b7b7b7b7b7b776c605346392d2013060000000000000000000000000000000000000000000000000000000004101c27333a47535f6a74808d95a0a9b2a89f9590837a6f6a605c55514b484642424141423f4446494e53585f666d737e879299a4afa69f93887d70675d51453b30251a0e020013202c3946535f6c7986929facada093867a6d605959595959595959595959595959595959595959595959595959595959595954514b433a2f24180d01000000000013202c3946535f6c7986929facada093867a6d605959595959595959595959595959595959595959595959595959595959595954514b433a2f24180d010000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a000000000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000008141e29323b45515d676d7a838e939ea0a8a7a09d99959993939a96999ea0a8a7a099928c81786d665c50443d2f261c1106000000000008131f2c3845515c67727f8b95a0aba39991847a6e68615954514c4e4e4b5153575f676d78839098a2aca0968b7f72665b5044382b1b110600000013202c3946535f6c7986929faca79a8d8074675a4d4134272935414b55606b727f8c919fa3a59e948f837a6d675d51453e31271d12070000000000000000000000000000000009131c262e38404850565e61696e73787c7e818384858686858583817f7c79746f6a625f585049413930271e150a0000000000000000020e19242e3840474c4d535353535c6976828f9ca9aa9d9184776a5e53535353535353535353535353535345413a32281e13080000000000000000000000000000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c201306000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000a1724303d4a5763707d8a96a3b0a79a8d8074675a4d4134271a0e010000000000060c111517181f1e1d1c1b1a191615130f0a04000000000000000000000000000000000000000000000713202d3a4653606d7986878787878786796d6053473a2d201407000000000000000000000000000000000000000000000000000000000714202c38444f59626e7c87929fa7b1aaa1969083796d685f58514b45413b3a363035342e34383a3c43474e545c606c717e87939fa5afa49a9185796d60574d42362a1e11050013202c3946535f6c7986929facada093867a6d6666666666666666666666666666666666666666666666666666666666666666605d554b4135291d1104000000000013202c3946535f6c7986929facada093867a6d6666666666666666666666666666666666666666666666666666666666666666605d554b4135291d11040000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a0000000000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000010d1925303b44515b606d798390959ea5a9a19e95908c8987868687898c91969ea1a9a39f938f81786d60584e42382d22170b000000000004101c2834404b55606d78839099a3aba09690837a706b64605d555b5b555d60636a6e79818e959faaa49a9184796d60544a3f33281c0a0000000013202c3946535f6c7986929faca79a8d8074675a4d413427242f3a434f59626d727f8b9299a2a69f959083796d605a5043392f24180c000000000000000000000000000000000915202b353f474e524c52575e61666a6f7274767878797978787675726f6d66626058534e4846423c332a1f140900000000000000000008121c262e363b3f404646464f5c6976828f9ca9aa9d9184776a5e51464646464646464646464646464639352f2820160c010000000000000000000000000000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d1104000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000a1623303d495663707c8996a3afa79a8e8174675b4e4134281b0700000000000911181d2124252c2b2a2928272622211f1b150e060000000000000000000000000000000000000000000713202d3a4653606d79869394949493867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000916232f3c4855616b76828f99a3afaea39891847a6d675e564e454039352f2d2a25282823282c2d31373c424a505a616c727f8b939ea8aca1978c8073695e52463a2d2014070013202c3946535f6c7986929facada09386797272727272727272727272727272727272727272727272727272727272727272726d675d5145392c201306000000000013202c3946535f6c7986929facada09386797272727272727272727272727272727272727272727272727272727272727272726d675d5145392c2013060000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a00000000000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000005111e2a36414c56626d75828f959fa7a8a097928a837f7c7a79797a7c7f848a9297a0a8a59e938d80736a60544a3f33281c0f0300000000000c18232e3944515c666f7c87929fa4a8a09590847d76716d6769676869676d70757b838e939ea7a59f93887d70665c5142382d22170b0000000013202c3946535f6c7986929faca79a8d8074675a4d4134271d28313d47515b636d727e879298a2a79f958e81756c61554b4035291d10040000000000000000000000000000010e1a26313d4751595e5f6060605e585f626568696b6c6c6c6c6b6a686663605c546060606055534d453c31261a0e020000000000000000010a141c242b2f33343939434f5c6976828f9ca9aa9d9184776a5e5144393939393939393939393939392c29241e160d040000000000000000000000000000000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d01000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000815222f3b4855626e7b8895a9b3a89b8f8275685c4f422e23180c0000000009121b22292e3132393837363534332f2e2b262018100600000000000000000000000000000000000000000713202d3a4653606d798693a0a1a093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000005121e2a36424d5763707d89949fabb2a89f92867c6f685e554c443c342e2924201e1a1b1b171c1f20262b30383f44505a626d75818e96a0aca79f92867b6e6154473b2e2114080013202c3946535f6c7986929facb2a6998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6054473a2d211407000000000013202c3946535f6c7986929facb2a6998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f796d6054473a2d2114070000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a000000000000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000714202d3946525e68727f8b949ea7a9a09591857e77726f6d686c6d6f72787e859196a0a9a59f93877c6f665b5044382b1f1308000000000007121d2834404a54606a727f8c929ca4a7a096918a827d7a7775747475767a7d818790959ea5a59e938d80736b60544b402f261c11060000000013202c3946535f6c7986929faca79a8d8074675a4d413427161f2c353f49515b636c717d869299a3a79e938a7e71675d5145382c1f1307000000000000000000000000000004111d2a36424e59636a6c6c6c6c6b636059585b5d5e5f5f5f5f5e5d5b59575f626a6c6c6c6c6c5f574d42372b1e1205000000000000000000020a12191f2326272d36434f5c6976828f9ca9aa9d9184776a5e5144372d2d2d2d2d2d2d2d2d2d2d2d201d19130c040000000000000000000000000000000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3b0a396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000714212e3a4754616d7a8797a2ada99c90837669544a4034281c1004000006111b242d343a3d3e454444434241403c3b37322a22180e04000000000000000000000000000000000000000713202d3a4653606d798693a0aca093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000714212d3a46535e6975828f9ca6b0aca0968c7f736a60564c433a3228231d1814120e09060c1012131a1e262e343e48515b606d7984919ea09d95908a807366594d4033261a0d0013202c3946535f6c7986929facb9a89c918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877b6e6154483b2e211508000000000013202c3946535f6c7986929facb9a89c918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c877b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a0000000000000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000005111d2935414c56616e7a85929fa6ada19791837b716c6662605d606163656c717b849197a1ada4999184786c6053463a3025190d0100000000000c18232e39424e58626d73808c929ea1a8a19e948f8a8683828181828386898e93999fa7a39f938f81786d60594f42392e1d140a0000000000131f2c3946525f6c7985929faca79a8e8174675b4e4134281b1a232d373f49515a626b707d87929fa6a59e9184796d6053473a2f24180d010000000000000000000000000006121f2c3845525e6a757979797978706b605c544d5152535352524b515a61696e777979797976695f53463a2d2114070000000000000000000001080e1317191c2936434f5c6976828f9ca9aa9d9184776a5e5144372b202020202020202020201413110d0805030000000000000000000000000000000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d20130700000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3aca396897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000713202d3946525d687885929fabaa9e918477665c5144382c1f120600010c18222d363f454a4b5251504f4e4d4c4947433c342a20150a000000000000000000000000000000000000000713202d3a4653606d798693a0a7a093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87939facb2a89d9184796d60584e443a31292018120d0705020000000306090c151c2328363f45515d676f7d899395908a837e776c605346392d2013060013202c3946535f6c7986929facb9ada39c999999999999999999999999999999999999999999999999999999999999999994877b6e6154483b2e211508000000000013202c3946535f6c7986929facb9ada39c999999999999999999999999999999999999999999999999999999999999999994877b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a00000000000000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000713202d3946525e6874808d98a2aea69e92857b6e69615a5654525354535b60696e7b85929ea8aba0958a7d7063564c41362a1d1105000000000007121c27303d46515b646e73808a92979fa3a69f9c9992908f8e8e8f9092989b9fa4a69f99928c81786d665c50473d30271d0b020000000000121f2c3945525f6c7885929faba89b8e8275685b4f42302519111b252e373f485059606b717e8b949faba1968b7e7165554b4135291d1104000000000000000000000000000613202c3946535f6c7987868686847d736d665f5751464146454d555c606c717b83868686867b6e6155483b2e22150800000000000000000000000002070b101c2936434f5c6976828f9ca9aa9d9184776a5e5144372b1e13131313130b101316171e1a1613120f0b060300000000000000000000000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d110500000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d89969f9f9f96897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0005111d2935414c566a7683909da9ac9f9286796d6053463a2d2013070005111d29343f485056585f5e5d5c5b5a5955534e463c32261b0f030000000000000000000000000000000000000713202d3a4653606d7986939a9a9a93867a6d6053473a2d201407000000000000000000000000000000000000000000000000000005121e2a36424d576673808d99a4afaca0968a7e71665c51463c32281f170e0700000000000000000000030a1117242935414b55606b75818e8a837d78706c655b5044372b1f12050013202c3946535f6c7986929facb9b5ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a194877b6e6154483b2e211508000000000013202c3946535f6c7986929facb9b5ada8a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a194877b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a0000000000000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000714212e3a4754616d7a86929faaab9f948a7d70695e575049474546474950565e69717e8b96a0aca79c8f8275685e5246392d2013070000000000000b151e2b343f49525c646e737e858e92999ea1a8a39f9d9c9a9b9c9d9fa3a9a29f9b948f877f776d665c544a3f352c1e150b000000000000121e2b3845515e6b7884919eaba99c8f827669564c41362a1e11131c252e363e474f59626d76828f9caaa99c908376675d5145392c20130600000000000000000000000000000b1825323e4b5865717e8b9296918780786e69625b524c4550575f676d747e869095948d8074695f53463a2d211407000000000000000000000000000003101c2936434f5c6976828f9ca9aa9d9184776a5e5144372b1e110600080f161c2022232b2723201f1b17120f0b0600000000000000000000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d0100000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d899393939393897d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00010d192430414e5b6774818e9aa7afa399887b6f6255483c2e23180c060615212e3a45505a62656c6b6a69686766625f584e43372b1f13060000000000000000040607080808080808080813202d3a4653606d79868d8d8d8d8d86796d6053473a2d20140808080808080808070604000000000000000000000000000000000714212d3a46535f697784919eabb5ab9d9184786c60544b40342b20160d0500000000000000000000000000061218242f3a434f59616e7b837e78716c65605b53493f33271b0f030013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e211508000000000013202c3946535f6c7986929facb9afa7a2a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a0000000000000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000005121e2a36424d5765727f8c98a2aea99c8f82766c61574d453e3a39393a3f444d57616c7784919eaaa99f93867a6d6154473a2e211407000000000000030c19222d37404a525c636c717a81868d9196989b9c9e9f9f9f9f9e9d9b9997928e89827c736c655c544b42382e231a0c03000000000000101d2a3643505d697683909ca9ab9e918478685e5246392d20140a131c242d353d47505a63707d8998a3ac9f92867a6d6054473a2d21140700000000000000000000000000000b1724313d4a56626d73808c9399938d837b726d615e56515a61696e79818a9298958f82786d60574d42372b1e1205000000000000000000000000000003101c2936434f5c6976828f9ca9aa9d9184776a5e5144372b1e070008111921272c2f3038342f2d2b27221f1c17110a020000000000000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e13080000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000a1723303d4a5663707d868686868686867d7063564a3d3023170a00091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000081825313e4b5864717e8b97a7b1ab988b7e7165554b4034281d1413131624313d4a56626c71787777767574736f6a5f53473b2e211508000000000001070c101314151515151515151515202d394653606c7880808080808080786d6053463a2d201515151515151515151413100c0701000000000000000000000000000815222e3b4855616e7b8896a0acafa3998c7f72665b5042392e22190e0500000000000000000000000000000007131d28313d46535f696e77716c65605b53504941382d22170b000013202c3946535f6c7986929facb9a79d95939393939393939393939393939393939393939393939393939393939393939393877b6e6154483b2e211508000000000013202c3946535f6c7986929facb9a79d95939393939393939393939393939393939393939393939393939393939393939393877b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f23160900000000000000000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000714202d3a46525e697783909daaada197897d7063594f453b332d2c2d2d333b45505a66737f8c999d9c9c998a7d7063574a3d3024170a0000000000000007101b252e38404a525a61686d747b8084888b8e90919292929291908e8c8985817c766f6a605b534b423930261c1108000000000000000f1b2835424e5b6875818e9ba8ada196877a6e6154473b30251b1413121b232b353f4653606d7986929faca399897c6f6256493c2f23160900000000000000000000000000000915212e3a45505a636e74818e939f9590867e756d68605c606c717b838e939f969083796d665c50453c31261a0e02000000000000000000000000000003101c2936434f5c6976828f9ca9aa9d9184776a5e51442f24180d050f19232b33383c3d45403c3937332d2b28221c140b050000000000000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c020000000000000000000000000000000000000000000000000000000000000000000000010b1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000916232f3c4855616b7079797979797979706b6155483c2f23160900091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000815212e3b4854616e7b87959faba89b8e8175675c5145392e2521201f202935404b5565717e8584838281807f7c6f6255493c2f22160900000000030b12181d1f20212121212121212121212b3844505b666c747474747474746d665c5044382c21212121212121212121201f1d18120b030000000000000000000000000c1825323f4b5865727e8b98a8b2ac9f92867a6e61544a3f30271d100700000000000000000000000000000000010c161f2a36424d575f616a64605b535049443f382f261b1106000013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868686868686868686868686868686868686867b6e6154483b2e211508000000000013202c3946535f6c7986929facb9a2958b868686868686868686868686868686868686868686868686868686868686868686867b6e6154483b2e2115080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f2215080000000000000000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000815212e3b4854616e7b87959fabab9e9184786c6053463e33292120202227333e4956626f7c899191908f8e8d8073665a4d4033271a0d000000000000000009131c262e38404850565e61696e73787c7e818384858686858583817f7c79746f6a625f585049413930271e150a00000000000000000c1926323f4c5965727f8c98a9b2a8978a7d7064564d42362b2621201f1f20232c3845515c667784919eaaab978a7d7164574a3e3124170b000000000000000000000000000005111d29343f48525b606d78818f959f98928b827a706b676d747e8690959d9891847b6e675d544a3f332a1f1409000000000000000000000000000000020f1c2935424f5c6875828f9ba8ab9e9184786b554b4035291d110b16212b353d44484a514d4946443f3938332d261d170e0500000000000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e04000000000000000000000000000000000000000000000000000000000000000105090b0b0d0d1825313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000714202c38444f5961636c6c6c6c6c6c6c6361594f44382c20140700091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000714202d3a46525e697783909daaab9f9285796d60544b4036312d2c2c2d323a45515d6775818e91908f8e8d897c6f6356493c30231609000000030d151d24292c2d2e2e2e2e2e2e2e2e2e2e2e333f4a545b6067676767676767605c544a3f342e2e2e2e2e2e2e2e2e2e2e2d2c29241d150d030000000000000000000004101d2935404b556875828f9ba8b5a99c908376685e5242382d1e150b000000000000000000000000000000000000040d1a26313b454d53555d57535049443f38332d261d140a00000013202c3946535f6c7986929facada093867979797979797979797979797979797979797979797979797979797979797979797976695e52463a2d201407000000000013202c3946535f6c7986929facada093867979797979797979797979797979797979797979797979797979797979797979797976695e52463a2d2014070000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d211407000000000000000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1824313e4b5764717e8a97a7b1a79a8d8174665b5044382c2017131317202d3a4753606d79868584838281807e7164574b3e3124180b0000000000000000010a141c262e363e444c52575e61666a6f7274767878797978787675726f6d66626058534e443f382f271e150c030000000000000000091623303c4956636f7c8997a2ada89b8f8275695e52463f37312e2d2c2c2d2e343b45515d677885919eaba4978b7e7164584b3e3125180b0000000000000000000000000000010c18222d364044505c666d79829095a09f938f857d746f79818a9298a09992867c6f695e554b42382e21180e03000000000000000000000000000000020f1b2835424e5b6875818e9ba8ab9f928578675d5145392c2017161c27333d474f54565e5a5653504946443f382f2920170d0200000000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c00000000000000000000000000000000000000000000000000000000000000060c111517181a1a1a25313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e0004101c27333d474f55566060606060606056554f473d33271c100400091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000005121e2a36424d5765727f8c98a2aea2988b7e71665c5146423b3a39383a3d444d57606d7a85929e9d9c9b9285796d6053463a2d2013070000010b151f272f35383a3b3b3b3b3b3b3b3b3b3b3b3b3b424a50535a5a5a5a5a5a5a53504a423b3b3b3b3b3b3b3b3b3b3b3b3b3a39352f271f150b0100000000000000000006131f2c3845515d677884919eabb6ac998c7f7266564c412f261c0c030000000000000000000000000000000000000009141f29333b424648504a46443f38332d27221b140b0200000013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e1205000000000013202c3946535f6c7986929facada093867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c20130600000000000000000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f231609000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000010e1b2734414e5a6774818d9aa7b4aa978a7e7164544a3f33281a0e0606131f2c3845515c676d79787776757474716c6155493d3023170a000000000000000000020a131c242c323a41464d5254585f626568696b6c6c6c6c6b6a686663605c54544e47433c332d261d150c030000000000000000000713202d3a4653606d7985929fabac9f92877b6e615a5147433c3b3a38383a3b40444d56606d7a86939facaa978a7d7164574a3e3124170b00000000000000000000000000000006111b2428343f4a545d676d7a839196a19e979188807b838e929fa29f93877d706a5f574d433a30261c0f0600000000000000000000000000000000010d1a2734404d5a6773808d9aa6ac9f93867a6d6053473a2e262323262c38444f5960636b6762605b5353504a423b33291f1409000000000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e040000000000000000000000000000000000000000000000000000000000000911181d21242527272727313e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e00000b16212c353d44484a535353535353534a48443d352c21160b0000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000020e1a25303b4754616d7a86929fa9aa9e9184796d605b534d4847454546484f565e69727f8c98a2aaa69b8e8275665c5044382c1f1206000007121d27313940454748484848484848484848484848484848484d4d4d4d4d4d4d48484848484848484848484848484848484745403931271d12070000000000000000000714202d3a4753606d7a86939facafa49a897c6f6356493c3023140a0000000000000000000000000000000000000000030d17212931363a3b443e3937332d27221b17110a020000000013202c3946535f6c7986929facada093867a6d60606060606060606060606060606060606060606060606060606060606060605f524d453b30251a0e02000000000013202c3946535f6c7986929facada093867a6d60606060606060606060606060606060606060606060606060606060606060605f524d453b30251a0e020000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d11040000000000000000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f221508000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000004111d2935414c566a7683909da9aea298887b6e6155483b2d2217080004101c2934404b555c606c6b6a6969686764615a5045392d21140800000000000000000000010a121a202830363b4246484e5361696b6c6c6c68605c545d5b595653514a47433d373127221b140b030000000000000000000006121f2c3844505c6674818e9ba6afa3998e81756c625b534e494746444446484a51575e68727e8b99a4aea398897c6f6256493c2f23160900000000000000000000000000000000091217232e38424b555d686e7b849197a2a19a938d8890959da59d928b7f726b61584e453b31281e140a0000000000000000000000000000000000000c1825323f4b5865727e8b98aaafa49a897c7063544b403631303031363f4854606b7078736f6c6563605b544d453b30251a0e02000000000000000000000009121c252e363e454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b110800000000000000000000000000000000000000000000000000000000000009121b22292e313234343434343e4b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000005101a232c33383c3d464646464646463d3c38332c231a10050000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000914202d3946525d6874808d97a2aca0968d80746d615e575554515153555960686e7b86929faaab9f94897c6f63544a3f34281c100300000c18242f39434b5153545454545454545454545454545454545454545454545454545454545454545454545454545454545453514b43392f24180c0000000000000000000915222f3c4855626f7b889aa4afac9f93867a6d6054473a2d211407000000000000000000000000000000000000000000060f171f262a2d2e37312d2b27221b17110b0600000000000013202c3946535f6c7986929facada093867a6d60535353535353535353535353535353535353535353535353535353535353534846423b33291f140900000000000013202c3946535f6c7986929facada093867a6d60535353535353535353535353535353535353535353535353535353535353534846423b33291f1409000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d010000000000000000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d211407000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000713202c3945525d687885929fabac9f9285796c605346392d20130600000c18232f39434b51535f5e5e5d5c5b5a575550483e33281d1105000000000000000000000000080e161e252a30363a3c505d697378797979746d665e564e4c494644403937322b262017110a02000000000000000000000003101c28343f4a54626f7c89949fabab9e938b7e726d625f5856545351505355545c60696e7a85929eabac9f92867a6d6053473a2d201407000000000000000000000000000000000006111c263039434c565e696f7c859299a3a49f9a959da0a79e948d80746d62594f463c33291f160c02000000000000000000000000000000000000091623303c4956636f7c8998a2aeac998c8073665c5146423e3d3c3d4246515b63707d84807c78746f6c665e574d42362a1e11050000000000000000000000000a131c242c333b42464d5355575f626466696a6b6b6c6c6c6b6a686663605d55544f4c4841382f241b130900000000000000000000000000000000000000000000000000000000000006111b242d343a3d3e4040404040404b5864717e8b97a4b1a79a8e8174675b4e4134281b0e000008131e28313a414547494949494949494745413a31281e13080000091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000005111d2935414c56616d7a85929fa5a89d928c7f756e696461605d5c6062656b6f7a839198a2aea3999083766b605442382e23170c000004101d2935404b555d606161616161616161616161616161616161616161616161616161616161616161616161616161616161605d554b4035291d100400000000000000000b1724313e4a5764717d8a97acb6aa9e918477675d5145392c20130600000000000000000000000000000000000000000000060d141a1e21222a24201f1b17110b06000000000000000013202c3946535f6c7986929facada093867a6d60534746464646464646464646464646464646464646464646464646464646463b3a36302921170d0200000000000013202c3946535f6c7986929facada093867a6d60534746464646464646464646464646464646464646464646464646464646463b3a36302921170d02000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e211407000000000000000000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c201306000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000714212d3a4754606d7a8797a2adaa9d918477655b5044372b1f1205000007121d273139404547525251504f4e4d4b49453e362c22170c0000000000000000000000000000050c13191f252a3845525f6b788586868681786d685f584f473f38342e2b27201b150b0600000000000000000000000000000c17232e384754606a76828f99a3aea59f92877f756f6a666261605c5c606164666d727b839097a1ada59c8f8275675d5145392c1f13060000000000000000000000000000000000000a141e27313a444d575f6a707d879299a49f9f9f9fa9a0958f82786d605b51473e342a21170d04000000000000000000000000000000000000000714202d3a4753606d7985929facab9e9185796d605a534d4b4a494a4d535b626d76828f8d8984807c786e695e52463a2d201407000000000000000000000000020e1925303b444c525f6060606060605d5c5d5e5f5f5f5f5e5d5b6060606060605a58534a41362b2014080000000000000000000000000000000000000000000000000000000000010c18222d363f454a4b4d4d4d4d4d4d4d5864717e8b97a4b1a79a8e8174675b4e4134281b0e00010d19242f3a434c52545656565656565654524c433a2f24190d0100091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000010d1924303a46525e68727e8b939ea7a49c918c827b75716e6d67666d6f71767d849195a0aaa69f92877c6f63594f4330261c1106000006131f2c3845515d676d6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6d675d5145392c1f130600000000000000000c1926323f4c5965727f8c98a5b2a99c8f837669554b4135291d1104000000000000000000000000000000000000000000000003090e1214151d1713120f0b060000000000000000000013202c3946535f6c7986929facada093867a6d6053473a393939393939393939393939393939393939393939393939393939392e2d2a251f170f050000000000000013202c3946535f6c7986929facada093867a6d6053473a393939393939393939393939393939393939393939393939393939392e2d2a251f170f0500000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d201307000000000000000000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d1104000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000815222f3b4855626e7b8895a9b3a99c8f82766953493f33271b0f030000010b151f272f34383a464544434241413e3d39332c241a100600000000000000000000000000000002080d141a26323f4c5965727f8c93938e827a6f6a615951444039302820180f0a0300000000000000000000000000000006111c2b38434e58626f7c87929fa5afa399928b817c76726f6e6d66666d6e7074797f859095a0a9a89e93897d7063554b4035291d1004000000000000000000000000000000000000020c151f28323b454e58606b717e8793939393939393969083796d665c50493f352c22190f05000000000000000000000000000000000000000006131f2c3845515c6775828f9ba7ada1978c80736c615f5757565657575f616d727f8b949a96918d89857b6e6154473b2e21140800000000000000000000000005111e2a36414c565e6c6c6c6c6c6c6c6a675f555253534f5960636c6c6c6c6c6c67645c53483c3024180b000000000000000000000000000000000000000000000000000000000005111d29343f485056585a5a5a5a5a5a5a5a64717e8b97a4b1a79a8e8174675b4e4134281b0e0004111d2935414c565d6062626262626262605d564c4135291d110400091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b0000000008131e2a36414c56626d75818e959fa6a49c948f86827e7b7a7979797b7e83899196a0a7a59e948c7f736b6054473d321e150a0000000714202d3a4753606d797b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b796d6053473a2d20140700000000000000000d192633404c5966737f8c99a6b2a89b8e8175685b4e422f24180d010000000000000000000000000000000000000000000000000002050708110b06050300000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21201e1a140d05000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21201e1a140d050000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d11050000000000000000000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d01000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000091623303c4956636f7c8996a2afa89b8e8175685b4e422d22170b00000000030d151d23292c2d3938373636353431302d28221a120800000000000000000000000000000000000003091825313e4a56626d75818f969490847c706b625b514a423a322a21191106000000000000000000000000000000000f1b27323d47535f6a727f8c939da5aba39f938e87827f7c7a797879797b7d81858b9297a0a7a8a0968f82756b605443392f24180c0000000000000000000000000000000000000000030d162029333c464f59616c727f8686868686868686847b6e675d544a3f372d231a100700000000000000000000000000000000000000000004101c2934404b5563707d8a95a0aca99f93887e746e69666463636366696e757f87939fa6a19e9a908377695e52463a2d2014070000000000000000000000000714202d3946525e68767979797979797771675b4f464854606b70797979797979746e64584c4033271a0d01000000000000000000000000000000000000000000000000000000000915212e3a45505a6265676767676767676767717e8b97a4b1a79a8e8174675b4e4134281b0e000613202c3945525d686d6f6f6f6f6f6f6f6d685d5245392c20130600091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b00000000020d1925303a44515b606d798390949da5a69e98928f8b8887858586888b90949ea1a8a39f938e82786d60594f43352b210c030000000a1723303d4a5663707d87878787878787878787878787878787878787878787878787878787878787878787878787878787877e7164574a3e3124170b00000000000000000d1a2734404d5a6773808d9aa6b3a79a8d8074675a4d4134271a07000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2020202020202020202020202020202020202020202020202020201514120e090200000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d2020202020202020202020202020202020202020202020202020201514120e0902000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d0100000000000000000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e21140700000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724303d4a5763707d8a96a3b0a79a8d8174675a4e4134271b060000000000030b12181c1f202c2b2b2a2928272423211d17100800000000000000000000000000000000000000000916222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a0200000000000000000000000000000a16202b37434e58606c77818e939fa2aaa59e9a938f8c898786858586888a8d92979ea1a9a59e9691847a6d61594f4431271d1207000000000000000000000000000000000000000000040e17212a343d47505a626d727979797979797979786e695e554b42382e251b110800000000000000000000000000000000000000000000000c18232f394653606c7883909aa4afa49a938b817b767371706f7072767b818b9399a4afa99f948a7e7164574d42362a1e11050000000000000000000000000814212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000b1724313d4a56626d71737373737373737373737e8b97a4b1a79a8e8174675b4e4134281b0e000714212d3a4754606d7a7c7c7c7c7c7c7c7a6d6054473a2d21140700091623303c4956636f7c8996a2afa4978a7d7164574a3e3124170b000000000008131e28323f45515d676d7a828e939da0a7a39f9b97949892929895989c9fa6a7a099928d81786d665c50463d3223190f000000000a1723303d4a5663707d899494949494949494949494949494949494949494949494949494949494949494949494949494948a7d7164574a3e3124170b00000000000000000e1b2734414e5a6774818d9aa7b3a69a8d8073675a4d4034271a0d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20141313131313131313131313131313131313131313131313131308070502000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201413131313131313131313131313131313131313131313131313080705020000000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e13080000000000000000000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d20130700000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d8a97a3b0a79a8d8074675a4d4134271a0e01000000000001070c1013141f1f1e1d1c1b1a181714110c0600000000000000000000000000000000000000000006121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c0300000000000000000000000000040f1b26323c44505b656d78818b92989fa4aca49f9c9995949892929894979a9ea1a9a7a09d938f847b6e685d52473d331f150b0100000000000000000000000000000000000000000000050f18222b353e48515b62656c6c6c6c6c6c6c6c6b615e574d433a30261c130900000000000000000000000000000000000000000000000007121f2b3844505b66707d88939fa5aca49f938e8783807e7d7c7d7f82878e939fa4aba9a1978f82766c6155453b30251a0e020000000000000000000000000814212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000b1825323e4b5865717f80808080808080808080828f9ca9b4a79a8e8174675b4e4134281b0e000a1723303d4a5663707d898989898989897d7063564a3d3023170a00091623303c4956636f7c8996a2aca4978a7d7164574a3e3124170b0000000000020c16202935404b555d686d78818991959c9fa3aba4aaa29f9fa2aaa4aba49f9c95908780786d665c544a3f342b211007000000000a1723303d4a5663707d8996a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1978a7d7164574a3e3124170b00000000000000000e1b2835414e5b6874818e9ba7b3a6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0b0a080500000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d20140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0b0a0805000000000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d110500000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1724313e4a5764717d8a97a4b0a69a8d8073675a4d4034271a0d010000000000000000040607131211100f0e0e0b0a08050000000000000000000000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c03000000000000000000000000000a152027333f49535c666d747f868e939a9ea1a8a7a5a2aaa29f9fa2aaa3a7aaa29f9b959089827a6e695e564c41352b210d03000000000000000000000000000000000000000000000000061019232c363f4951565860606060606060605e54524d453b31281e140a01000000000000000000000000000000000000000000000000030f1c28333f4a54606b73808d939da4aca59d99938f8c8a89898a8c8f93999ea5aea79f9791857b6e615a504533291f1409000000000000000000000000000814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000003101d293643505c6976828d8d8d8d8d8d8d8d8d8d8f949eaab4a79a8e8174675b4e4134281b0e000a1723303d4a5663707d899595959595897d7063564a3d3023170a00091623303c4956636f7c89969f9f9f978a7d7164574a3e3124170b000000000000050e18242f3a434c565d666d747d848a8f92999a9c9e9e9f9f9e9d9c9a99938f8a837c736c665c544a42382e22190f00000000000a1723303d4a5663707d89969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b00000000000000000e1b2835414e5b6874818e9ba7b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171714110c050000000000000013202c3946535f6c7986929facada093867a6d6053473a2d201a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a171714110c0500000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e0400000000000000000000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d0100000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d8a97a3b0a79a8d8074675a4d4134271a0e010000000000000105090b0b121111100f0e0d09080603000000000000000000000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b00000000000000000000000000040b17222d38414a545c606d727b81878d9196989a9c9d9e9f9f9f9e9d9d9b9898928e8a837d756d685e574d443a3023190f000000000000000000000000000000000000000000000000000007111a242d373f464a4c5353535353535353524846423b33291f160c0200000000000000000000000000000000000000000000000000000b17222d38424f59606c78818d929ea0a8aba49f9c9997969696999c9fa4abaaa29f9590857c6f695e53483e3420170d02000000000000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000003101d293643505c6976838f9a9a9a9a9a9a9a9a9a9c9ea6b0b4a79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a2a2a296897d7063564a3d3023170a00091623303c4956636f7c8993939393938a7d7164574a3e3124170b0000000000000007131d28313a444c545c606b70787e82868a8d8f9192929291918f8d8a86827d786f6a605b544a423930261c100700000000000a1723303d4a5663707d899393939393939393939393939393939393939393939393939393939393939393939393939393938a7d7164574a3e3124170b00000000000000000e1b2734414e5a6774818d9aa7b3a69a8d8073675a4d4034271a0d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a2d27272727272727272727272727272727272727272727272727272727272423211c17100800000000000013202c3946535f6c7986929facada093867a6d6053473a2d27272727272727272727272727272727272727272727272727272727272423211c171008000000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c0000000000000000000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e13080000000000000000000000000000000203101d2a3643505d69768390908376695d5043362a1d100302000000000000000a1724303d4a5763707d8a96a3b0a79a8d8074675a4d4134271a0e010000000000060c111517181f1e1d1c1b1a191615130f0a04000000000000000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d12070000000000000000000000000006111b262f38424a505b62696e757b8084888b8d8f90929292929191908e8b8985817d78706b605d564d453b32281e110700000000000000000000000000000000000000000000000000000008121b252d343a3e3f4646464646464646453b3a36302921170d0400000000000000000000000000000000000000000000000000000006111c262f3d44505b666d78808a91969d9fa7a7a9a6a4a3a2a3a5a9a7a8a09e98928c837b6f6a5f574d42362c220e0500000000000000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca6a6a6a6a6a6a6a6a9aab0acaca79a8e8174675b4e4134281b0e000a1723303d4a5663707d8996a3aca396897d7063564a3d3023170a00091623303c4956636f7d868686868686867e7164574a3e3124170b00000000000000010c161f28323a424b515960666c71767a7d808284858686858483807d7a75706c666058504a423930271e140a0000000000000a1723303d4a5663707d86868686868686868686868686868686868686868686868686868686868686868686868686868686867e7164574a3e3124170b00000000000000000d1a2734404d5a6773808d9aa6b3a79a8d8174675a4e4134271b09000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343431302d28221a1208000000000013202c3946535f6c7986929facada093867a6d6053473a34343434343434343434343434343434343434343434343434343434343431302d28221a12080000000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e04000000000000000000000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a0500000000000a1623303d495663707c8996a3afa79a8e8174675b4e4134281b0700000000000911181d2124252c2b2a2928272622211f1b150e0600000000000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c00000000000000000000000000000a141d2630383f4451575f61696e73787b7e80828485858685858483817f7c7a75706d666059524c443b332920160c000000000000000000000000000000000000000000000000000000000009131b23292e31323939393939393939382e2d2a251f170f0500000000000000000000000000000000000000000000000000000000000a141d28333f4a545c666d747d848b9095979a9c9e9f9f9f9f9e9d9a9896918c857f786e695f584e453b31241a100000000000000000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000003101d293643505c6976838f9c9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e000a1723303d4a5663707d89969f9f9f96897d7063564a3d3023170a000915222f3b4854606b6f79797979797979716c6155493c3023170a0000000000000000040d162028303940454f545b6064686e7174767778797978777673716e6863605b544e443f382f271e150c020000000000000916232f3c4855616b707979797979797979797979797979797979797979797979797979797979797979797979797979797979716c6155493c3023170a00000000000000000d192633404c5966737f8c99a6b2a89b8f8275685c4f4230251a0e020000000000000000000000000000000000000000000000000000010203000000000000000000000000000000000013202c3946535f6c7986929facada093867a6d605347404040404040404040404040404040404040404040404040404040404040403e3c39332c241a10050000000013202c3946535f6c7986929facada093867a6d605347404040404040404040404040404040404040404040404040404040404040403e3c39332c241a100500000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000009121c252e363e454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b110800000000000000000000000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e04000000000000000000000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b161009010000000815222f3b4855626e7b8895a9b3a89b8f8275685c4f422e23180c0000000009121b22292e3132393837363534332f2e2b262018100600000000000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c100400000000000000000000000000020b151e262e343f454d53575f6266696e71747677787979797877767472706d6763605c544f45413a322921170e040000000000000000000000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2d2b21201e1a140d05000000000000000000000000000000000000000000000000000000000000020b17222d38424a545c606b70797e83878b8d8f919292929291908e8b88847f7a736d665f574e463c33291f12090000000000000000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000003101d293643505c6976838f939393939393939393939393939393938e8174675b4e4134281b0e000a1723303d4a5663707d899393939393897d7063564a3d3023170a0007131f2c38434f5960636c6c6c6c6c6c6c64615a5045392d211408000000000000000000040d161e272e343d424a5053565e616467696b6b6c6c6b6a696764615e5653504a423c332d261d150c03000000000000000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d21140800000000000000000b1825313e4b5864717e8b97a4b1a99d9083766a574d42362a1e1105000000000000000000000000000000000000000000000003080c0e0e0f0b0707040100000000000000000000000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49453e362c22170c0000000013202c3946535f6c7986929facada093867a6d60534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4a49453e362c22170c00000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000a131c242c333b42464d5355575f626466696a6b6b6c6c6c6b6a686663605d55544f47423c332d241b1309000000000000000000000000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c000000000000000000000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a0100000714212e3a4754616d7a8797a2ada99c90837669544a4034281c1004000006111b242d343a3d3e454444434241403c3b37322a22180e0400000000000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f13060000000000000000000000000000030c151c2328333c42464d5355575f626567696a6b6c6c6c6b6a6a686563605d5553504a423d35302820170f050000000000000000000000000000000000000000000000000000000000000000060d1216181920202020202020201f1514120e0902000000000000000000000000000000000000000000000000000000000000000006111c262f38424a505961666d71767b7e818384858686858483817f7b77736d68605c544d453c342a21170d000000000000000000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c0000000000000000000000000000000000000000000000000000000003101d293643505c6976828686868686868686868686868686868686868174675b4e4134281b0e000a1723303d4a5663707d868686868686867d7063564a3d3023170a00030f1b27323d474f545660606060606060575550483e33281c110400000000000000000000040c151d23282f383f44464c5254575a5c5e5f5f5f5e5e5c5a5754524c46443f382f28221c140b03000000000000000004101c27333d474f55566060606060606060606060606060606060606060606060606060606060606060606060606060606060575550483e33281c110400000000000000000a1723303d4a5663707d8996aab4ab9f928578695e52463a2d20140700000000000000000000000000000000000000000001090f14181a1b1c181413110d08050100000000000000000013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c110500000013202c3946535f6c7986929facada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a575550483e33281c1105000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000010a121a212930363c4247484e5355596063676a6b6c6b6a666260585653514b48433d37312a211b1209010000000000000000000000000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e0400000000000000000000000009131c252c33373939393943505d69768390908376695d50433939393937332c251c130900000713202d3946525d687885929fabaa9e918477665c5144382c1f120600010c18222d363f454a4b5251504f4e4d4c4947433c342a20150a000000000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d201307000000000000000000000000000000030a1117212a31373c4247484d5355585a5c5d5f5f5f5f5e5e5d5b585653514b46443f383029241e160e05000000000000000000000000000000000000000000000000000000000000000000000106090b0c1313131313131313120807050200000000000000000000000000000000000000000000000000000000000000000000000a141d2630383f444f545c6064696e7174767778797978787674726f6a66605d56514a423c332a22180f05000000000000000000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b00000000000000000000000000000000000000000000000000000000020f1c2835414e5a667076797979797979797979797979797979797979746f64594c4033271a0d000916232f3c4855616b7079797979797979706b6155483c2f23160900000a16212b353d434849535353535353534a49453e362c22170c000000000000000000000000030b12181d262d33383b4146474a4d4f515253535251504d4a4746413b38332d261d17110a02000000000000000000000b16212c353d44484a53535353535353535353535353535353535353535353535353535353535353535353535353535353534a49453e362c22170c0000000000000000000815222e3b4855616e7b8898a2aeada297877b6e6154473b2e21140a0000000000000000000000000000000000000000030b131a20242728292521201d1913110d08020000000000000013202c3946535f6c7986929facada093867a6d6767676767676767676767676767676767676767676767676767676767676767676764615a5045392d21140800000013202c3946535f6c7986929facada093867a6d6767676767676767676767676767676767676767676767676767676767676767676764615a5045392d211408000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000080f171f252a31373e4850585f626b6f737778797877736f6a615f574f473d38322b2620180f090000000000000000000000000000000000000000000009121c252e363e454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b110800000000000000000000000005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b10050005111d2935414c566a7683909da9ac9f9286796d6053463a2d2013070005111d29343f485056585f5e5d5c5b5a5955534e463c32261b0f0300000000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e2114080000000000000000000000000000000000060f181f262b31373a3c4247484b4d4f51525253525251504e4c494745403a38342e261e19130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141e262e343e424a5153575e616467696b6c6c6c6c6b6a6765625f5854524c444039302a21181006000000000000000000000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e22160900000000000000000000000000000000000000000000000000000000000d1926323e49545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b000714202c38444f5961636c6c6c6c6c6c6c6361594f44382c2014070000040f19232b32383b3c464646464646463e3c39332c241a10050000000000000000000000000000070b141c22282b3036393b3e414344454646454443403e3b3936302b28221c140b0600000000000000000000000005101a232c33383c3d46464646464646464646464646463f44464f4f4f4f4f4f4f46444046464646464646464646464646463e3c39332c241a10050000000000000000000613202d394653606c7985929facb3a9968a7d7063574a3d31261b0f01000000000000000000000000000000000000000b151d252b30343536312d2c2924201d19130c0701000000000013202c3946535f6c7986929facada09386797373737373737373737373737373737373737373737373737373737373737373737373716c6155493c3023170a00000013202c3946535f6c7986929facada09386797373737373737373737373737373737373737373737373737373737373737373737373716c6155493c3023170a000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000050d15202a333e47505a616a6f767c808385868583807c756e6960594f473d32291f150e060000000000000000000000000000000000000000000000000a131c242c333b42464d5355575f626466696a6b6b6c6c6c6b6a686663605d55544f47423c332d241b1309000000000000000000000000000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a00010d192430414e5b6774818e9aa7afa399887b6f6255483c2e23180c060615212e3a45505a62656c6b6a69686766625f584e43372b1f13060000000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d201407000000000000000000000000000000000000060e141a1f262b2e31373a3b3e41434445464646454443413f3d3a39352f2b28231c140c0802000000000000000000000000000000000000000000000000030608090f1112131313110f0c0707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c141c232830394044464d5254585a5c5e5f5f5f5f5e5d5b5855534e4745413a342e271e180f06000000000000000000000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e120600000000000000000000000000000000000000000000000000000000000915212d38424c545a5c6060606060606060606060606060606060605b59534a41362b2014080004101c27333d474f55566060606060606056554f473d33271c100400000007101921272c2f303939393939393931302d28221a120800000000000000000000000000000000020a11171c1f252a2d2e3134363838393938373634312e2d2a251f1c17110a02000000000000000000000000000008111a21272c2f3039393939393939393939392d38424a50535c5c5c5c5c5c5c53514a42392e393939393939393939393931302d28221a12080000000000000000000006121f2b3844505b667683909ca9b3a79a8d807467584e43372b1e1308000000000000000000000000000000000000060f1d272f373c4041423e3a39352f2d29251e18120b030000000013202c3946535f6c7986929facb3a79a8d8080808080808080808080808080808080808080808080808080808080808080808080807e7164574a3e3124170b00000013202c3946535f6c7986929facb3a79a8d8080808080808080808080808080808080808080808080808080808080808080808080807e7164574a3e3124170b000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000020e1a26313c454f59616c707c82898d90929291908d88827b706b60594f443b3025190e02000000000000000000000000000000000000000000000000010a121a212930363c4247484e5355585a5c5d5e5f5a61646c6c6c6c66635c5248433d37312a211b120901000000000000000000000000000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f0000081825313e4b5864717e8b97a7b1ab988b7e7165554b4034281d1413131624313d4a56626c71787777767574736f6a5f53473b2e211508000000000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e11050000000000000000000000000000000000000003090e151a1e21262b2e2f32343637383939393837373532302d2c29241f1c17110a02000000000000000000000000000000000000000000000000030a0f1215151c1e1f1f201f1e1c181413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171e272e34383b4246484b4e50515253535251504e4c4847433c39353028231c150c06000000000000000000000000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d01000000000000000000000000000000000000000000000000000000000005101b26303a42494e505353535353535353535353535353535353534e4c4841382f251a0f0300000b16212c353d44484a535353535353534a48443d352c21160b0000000000070f161b1f22232d2d2d2d2d2d2d2423211c17100800000000000000000000000000000000000000060b0f14191e20212427292b2c2c2c2b2b29272421201e19140f0b0600000000000000000000000000000000000810161c2023232d2d2d2d2d2d2d2d2d2d28333f4a545b6068686868686868605c544a4034282d2d2d2d2d2d2d2d2d2d2423211c1710080000000000000000000000030f1c28333f4a546774808d9aaab4aa9d9184776a5f53473a2f24190b0200000000000000000000000000000000030e18212f3941484d4e4f4b4745413a39353029241d150d0300000013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8174675b4e4134281b0e01000013202c3946535f6c7986929facb9a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8174675b4e4134281b0e010000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000006121e2b37424d57616c707e868f949a9c9998999c99938f857d706b60564d42362a1f14080000000000000000000000000000000000000000000000000000080f171f252a31373a3c4247484b4d4f4a505b636c7079797979736e63574b3f322b2620180f09000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e1200000815212e3b4854616e7b87959faba89b8e8175675c5145392e2521201f202935404b5565717e8584838281807f7c6f6255493c2f2216090000000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e0200000000000000000000000000000000000000000003090e12151a1e21222527292a2c2c2c2c2b2b2a282523201f1d1812100b0600000000000000000000000000000000000000000000000000060e151b1f2122282a2b2c2c2c2b292521201d19130d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c151c23282c30363a3b3e414344454646454543413f3c3a37312c29241e18120b03000000000000000000000000000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b1107000000000000000000000000000000000000000000000000000000000000000a141e2830383e414346464646464646464646464646464646464641403c362f261d130800000005101a232c33383c3d464646464646463d3c38332c231a1005000000000000040a0f13151620202020202020171714110c050000000000000000000000000000000000000000000003080d111414171a1c1e1f20201f1e1d1a171414110e08030000000000000000000000000000000000000000050b101416172020202020202020201f2b3844505b666c757575757575756d665c5144382c1f202020202020202020171714110c05000000000000000000000000000b17222d3d4a5763707d8a98a2aeaca095887c6f62564c4135291d140a000000000000000000000000000000000915202a33414b53595b5c5854524c4746413a352f271f150b01000013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8e8174675b4e4134281b0e01000013202c3946535f6c7986929facb9aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a8e8174675b4e4134281b0e010000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000814212e3a47535f69707e87929899938f8c8b8c90949e9792877d6f695e52463b3025190e020000000000000000000000000000000000000000000000000000050d141a1f262b2e31373a3b3e444c545c606d727e868686868073665a4d4033271a150e060000000000000000000000000000000013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d201300000714202d3a46525e697783909daaab9f9285796d60544b4036312d2c2c2d323a45515d6775818e91908f8e8d897c6f6356493c3023160900000000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e14080000000000000000000000000000000000000000000000000206090e121415181a1c1e1f1f201f1f1e1d1b19161413100c0703000000000000000000000000000000000000000000000000000006101820262b2e2f3537383939393835322e2d2a251e19130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f252a2d2e3134363839393939383734322f2e2b26201d19130c07000000000000000000000000000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b13090000000000000000000000000000000000000000000000000000000000000000030c161e262d3235363939393939393939393939393939393939393433302b251d140b010000000008111a21272c2f3039393939393939302f2c27211a110800000000000000000003070909131313131313130b0a08040000000000000000000000000000000000000000000000000000010507080b0e10111213131211100d0b080705020000000000000000000000000000000000000000000000000407090a131313131313131313202d394653606c7881828282828281796d6053463a2d201313131313131313130b0a08040000000000000000000000000000000614202d3a4753606d7985929facb1a79a8d8073685d52453b2f261b1106000000000000000000000000000006101a26313c45535d64686964605d5654524c45403931271d1207000013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8e8174675b4e4134281b0e01000013202c3946535f6c7986929facacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a69a8e8174675b4e4134281b0e010000000000000000020714202d3a4753606d7a8693a0acac9f9286796c5f5346392c2013070502000000000000000000000000000000000006121f2b37434e58626e7b869299959187827f7f80838991969992857b6e61564d41362a1e110500000000000000000000000000000000000000000000000000000002090e151a1e21262b343d454d565d666d747f87929892857b6e6154473b2e21140903000000000000000000000000000000000013202d394653606c798686868686868686909494908686868686868686796c605346392d2013000005121e2a36424d5765727f8c98a2aea2988b7e71665c5146423b3a39383a3d444d57606d7a85929e9d9c9b9285796d6053463a2d2013070000000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d02000000000000000000000000000000000000000000000000000000020608080b0e1011121313131211100e0c0a07060400000000000000000000000000000000000000000000000000000000030e18222a31373a3c42444546464644423f3a39363029241e160e0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c10141a1e20212527292b2c2c2c2c2b2a282522211f1b15110d08020000000000000000000000000000000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e18110901000000000000000000000000000000000000000000000000000000000000000000040c141b212628292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d282724201a130b020000000000000810161c2023232d2d2d2d2d2d2d2323201c161008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060606060606060713202d3a4653606d79868f8f8f8f8f867a6d6053473a2d201407060606060606060000000000000000000000000000000000000006131f2c3845515c6775828f9ba8b2ab9f92857a6d60574d41382d2217110a020000000000000000000001081018222b37424e57646f7475716d6865615e56514b43392f24180c000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e01000013202c3946535f6c7986929f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9a8e8174675b4e4134281b0e0100000000000003090e1214202d3a4753606d7a86939f9f9f9f9286796c5f5346392c201514120e09030000000000000000000000000000000815212e3a47535f6a75828f989691837c76737273767d849197978e8174685e5246392d2014070000000000000000000000000000000000000000000000000000000000050c151d2328363e464f575f686d78818c939993877d70695e52463a2d20140700000000000000000000000000000000000013202d394653606c7986939393939393939c9f9f9c9393939393939386796c605346392d20130000020e1a25303b4754616d7a86929fa9aa9e9184796d605b534d4847454546484f565e69727f8c98a2aaa69b8e8275665c5044382c1f1206000000000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c4347484f5152525352514f4b4746413a35302820191108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e121415181b1d1e1f20201f1e1d1b191515120f0a0401000000000000000000000000000000000000000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d07000000000000000000000000000000000000000000000000000000000000000000000000030a1015191c1d2020202020202020202020202020202020201b1a18140f08010000000000000000050b1014161720202020202020171614100b05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939b9b9b93867a6d6053473a2d201407000000000000000000000000000000000000000000000000000004101c2934404b5563707d8a96a1acaea2988c7f73695e53493f3327221b140b090603000001000205080d1319222a343c47535f6a7481827e7a76716d68605d554b4035291d10040013202c3946535f6c79869293939393939393939393939393939393939393939393939393939393939393939393939393939393938e8174675b4e4134281b0e01000013202c3946535f6c79869293939393939393939393939393939393939393939393939393939393939393939393939393939393938e8174675b4e4134281b0e010000000000050d141a1e21212d3a4753606d7a8693939393939286796c5f5346392d2d21211e1a140d0500000000000000000000000000000915222f3c4855626f7b88949e91847a6f6a6665666b6f7b85929e93877b6e6154473b2e21140800000000000000000000000000000000000000000000000000000000060e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e110500000000000000000000000000000000000013202d394653606c7986939f9f9f9f9f9fa9ababa99f9f9f9f9f9f9386796c605346392d20130000000914202d3946525d6874808d97a2aca0968d80746d615e575554515153555960686e7b86929faaab9f94897c6f63544a3f34281c100300000000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d05000000000000000000000000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c090606030000000000000000000000000000000000000000000000030f1b26313c464e53555b5d5e5f5f5f5e5c5854524c46413a322b231a1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e10111213131212100e0c0908060300000000000000000000000000000000000000000000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b09060100000000000000000000000000000000000000000000000000000000000000000000000000000005090d0f101313131313131313131313131313131313130e0d0b08030000000000000000000000000407090a131313131313130a090704000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a030000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0a8a093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000c18232f394653606c7884919ea8b2aa9f92867b6e655b50443e332d261d1a1312100b060e090e1214191e2429343c46505a626e7b878f8b86827e7a766d675d5145392c1f13060013202c3946535f6c7987868686868686868686868686868686868686868686868686868686868686868686868686868686868686868174675b4e4134281b0e01000013202c3946535f6c7987868686868686868686868686868686868686868686868686868686868686868686868686868686868686868174675b4e4134281b0e0100000000050f171f252a2d2e393a4753606d798686868686868687796c5f53463939392e2d2a251f170f05000000000000000000000000000d192633404c5966737f8c99968a7d70685f5858596069717e8b98998b7e7165584b3e3225180b000000000000000000000000000000000000000000000000000000070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e0200000000000000000000000000000000000013202d394653606c7986939facacacacacb6b7b7b6acacacacac9f9386796c605346392d201300000005111d2935414c56616d7a85929fa5a89d928c7f756e696461605d5c6062656b6f7a839198a2aea3999083766b605442382e23170c00000000000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e0802000000000000000000000000000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b0600000000000000000000000000000000000000000006121f2b37434e585f62686a6b6c6c6c6b6865615e56524c443d352c241a110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d0400000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0aca093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000007121f2b3844505b66727f8b96a1acaea2988f82776c605a50443f382f2b26201f1c171b1a1b1a1e2124292f353e464e58626c75828f9999928f8b8682796d6053473a2d20140700121f2c3845525e6a757979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746f64594c4033271a0d010000121f2c3845525e6a757979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746f64594c4033271a0d01000000030d17212931363a3b464645515c67767979797979797979756a5e52464646463b3a36312921170d030000000000000000000000020f1c2935424f5c6875828f9b9184786b61564e4c4f57606d7a86929a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000000000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f14090000000000000000000000000000000000000013202d394653606c7986939facb9b9b9b9c3c4c4c3b9b9b9b9ac9f9386796c605346392d2013000000010d1924303a46525e68727e8b939ea7a49c918c827b75716e6d67666d6f71767d849195a0aaa69f92877c6f63594f4330261c1106000000000000000000000000000000000000000000000000000000000000000002050708121313131313131313080705020000000000000000000000000000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a030000000000000000000000000000000000000815212e3a47535f6a6f7577787979797775726d68615d564f473e362c231a1006000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b09060100000000000000000000000000000000000000000000000000020507080b0d0f1112131313131211100e0b08080602000000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a050000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939f9f9f93867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000030f1c28333f4a54606d7984919ea6b0aa9e948c7f726c615a5049413c37312d2b2823272728252a2d2f353a41454f585f6a717e8b939ea39f9c998f8275675d5145392c1f130600111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b000000111d2a36424e59636a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c67645d53483c3024180b0000000009141f29333b4246485353534b555c6c6c6c6c6c6c6c6c6c6a635953535353534846423b33291f1409000000000000000000000004101d2a3743505d6a7683909c8f827669594f443f45515d677784919c8f8275695c4f4236291c0f03000000000000000000000000000000000000000000000000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d020000000000000000000000000000000000000013202d394653606c7986939facb9c6c6c6cfd0d0cfc6c6c6b9ac9f9386796c605346392d20130000000008131e2a36414c56626d75818e959fa6a49c948f86827e7b7a7979797b7e83899196a0a7a59e948c7f736b6054473d321e150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e0903000000000000000000000000000000000915222f3c4855626f7c81848585868584827e7a746d68605950483e352c22180d0300000000000000000000000000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d060000000000000000000000000000000000000000000205090e121415181a1c1e1f1f20201f1f1e1c1a181514120e09060300000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a03000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869393939393867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000b17222d3845515c67717e8b949ea9b0a69f92877e716c605b534d47423c3a38342e34343531363a3b41454c5159616a6f7c86929fa5aea99f93877c6f62554b4035291d1004000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060605b59534a41362b2014080000000e1a26313d4751595e5f606060606060606060606060606060606060606060606060606060606060606060606060606060606060605b59534a41362b201408000000020e1a25313b454d535f6060606060605d606060606060605f5e5c6060606060605f534d453b31251a0e020000000000000000000004101d2a3743505d6a7683909c8f827669594f454045515d677784909c8f8275695c4f4236291c0f030000000000000000000000000000000000000000000000000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e05000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2d2dcdddddcd2d2c6b9ac9f9386796c605346392d201300000000020d1925303a44515b606d798390949da5a69e98928f8b8887858586888b90949ea1a8a39f938e82786d60594f43352b210c0300000000000000000000000000000000000000000000000000010406070a0d0f11121313131212100f0d0a070704010000000000000000000000000000000000000000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b060000000000000000000000000000000a1724313d4a5764707d8a9091929292918f8b86807a706b615a50473e342a1f150b01000000000000000000000000000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d18110901000000000000000000000000000000000003090e12141a1e21212527292a2b2c2c2c2c2c2a29272522211e1a15120f0a0400000000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d0400000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d040000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d0400000000000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7886868686868686796d6053473a2d2014070000000000000000000000000000000000000000000000000000000006111c2834404b55616c75828f97a2abafa39992877e726c655f57534d4946443f41414141424246484c52555d606b707c859298a2aeada2978f82756a5f5343392f24180c00000915202b353f474e52535353535353535353535353535353535353534d545b60666c6c6c6c6c6a5c544a53535353535353535353534e4c4841382f251a0f030000000915202b353f474e52535353535353534d575e6c6c6c6c6c6c6c6a665f55535353545e66696c6c6c6c6c6c6c5e574d5353535353534e4c4841382f251a0f0300000005121e2a36424d575e6c6c6c6c6c6c6c6a665f55535353545e66696c6c6c6c6c6c6c5e574d42362a1e120500000000000000000000020f1c2935424f5c6875828f9b9184786b61574f4d5058606d7a86929a8e8174675b4e4134281b0e010000000000000000000000000000000000000000000000030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b110800000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2dfe9eaeae9dfd2c6b9ac9f9386796c605346392d2013000000000008131e28323f45515d676d7a828e939da0a7a39f9b97949892929895989c9fa6a7a099928d81786d665c50463d3223190f00000000000000000000000000000000000000000000000004080d111314171a1c1d1f1f20201f1f1d1c1a171413110d080400000000000000000000000000000000000000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a02000000000000000000000000000a1724313d4a5764707d8a979e9f9f9f9e9b98928d847d716c61594f463c31271d12070000000000000000000000000000000000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b130900000000000000000000000000000003090e141a1e21252a2d2e31343637383939393938373634322f2e2b26211f1b150f0a0400000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d030000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d0300000000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a00000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c66767979797979797976675c5145382c1f130600000000000000000000000000000000000000000000000000000000000c18232e3943505a616e7b859299a3afaba39992877f776e69615f575553504a4e4e4d4e4f4d5354565d60676d747d859297a1aaaea49e92857b6e61584e4331271d12070000040f19242d353d424546464646464646464646464646464646424651575f666c72797979797975665c50444646464646464646464641403c362f261d130800000000040f19242d353d424546464646464646535e69767979797979797771665b4f464e5a66707679797979797976695e5346464646464641403c362f261d1308000000000714212d3a46535e69767979797979797771665b4f464e5a66707679797979797976695e53463a2d21140700000000000000000000000d192633404c5966737f8c99968a7d706960595a5a616a727e8b98998b7e7265584b3f3225180c00000000000000000000000000000000000000000000000007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2dfecf6f6ecdfd2c6b9ac9f9386796c605346392d20130000000000020c16202935404b555d686d78818991959c9fa3aba4aaa29f9fa2aaa4aba49f9c95908780786d665c544a3f342b21100700000000000000000000000000000000000000000000070c1013191d20212426292a2b2c2c2c2c2b2a28262421201d1913100c0701000000000000000000000000000000000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b030000000000000000000000000a1724313d4a5764707d8a979e9ea2a9a9aaa39f9691877e716b61584e43392f23180c030000000000000000000000000000000000000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b110600000000000000000000000000060b151a1f262a2d31363a3b3e4042444546464646454443413e3b3a37312e2b26201b150c070000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a00000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a0000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a00000000000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d01000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c6c5c554b4034291c1004000000000000000000000000000000000000000000000000000000000007121d27303e46525e69707d87929fa4acaba399938c827b746e696562605c545b5a5a5b5c575e6164686d737a808a9297a1a9afa59d928a7e70695e52463c321f150b0100000008121b242b31363839393939393939393939393930353e444d525b62696e787f8686868687796d6053463a3939393939393939393433302b251d140b01000000000008121b242b31363839393939393b4854616e7b86868686868683776a5d50444f5c6976828686868686867b6e6154483b393939393433302b251d140b01000000000815212e3b4854616e7b86868686868683776a5d50444f5c6976828686868686867b6e6154483b2e21150800000000000000000000000916222f3c4955626f7c88949e91847b706b6766676c717c85929f93877b6e6154473b2e2114080000000000000000000000000000000000000000000000000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b020000000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2dfececececdfd2c6b9ac9f9386796c605346392d2013000000000000050e18242f3a434c565d666d747d848a8f92999a9c9e9e9f9f9e9d9c9a99938f8a837c736c665c544a42382e22190f000000000000000000000000000000000000000000060b12181c1f24292c2d31333537383939393938373533302d2c29241f1c18120c0700000000000000000000000000000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d0300000000000000000000000a1724313d4a5764707d8a92919297979c9fa6a9a19992877d706a5f554b4034291f140900000000000000000000000000000000000000000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d0100000000000000000000020a11171f262b31363a3b4246484b4d4f51525253535252514f4d4b4847423c3a37312b262018120b0300000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c110500000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c1105000000000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f030000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424a505f606060606060605f514b43392f23180c000000000000000000000000000000000000000000000000000000000000000b151e2a36424d56606b717f8b939aa3ababa49f948f86817b76726f6d6668686767686869696e71757a7f858d929ea2a9afa59e938d80746c61574d42342a200d03000000000009121920262a2c2c2d2d2d2d2d2d2d2d2429323a414650565e616d727b828c929992877e71665c5044382b2d2d2d2d2d2d2d2d282724201a130b020000000000000009121920262a2c2c2d2d2d2e3b4854616e7b87939393939083776a5d50444f5c6976828f93939393877b6e6154483b2e2d2d2d282724201a130b0200000000000815212e3b4854616e7b87939393939083776a5d50444f5c6976828f93939393877b6e6154483b2e21150800000000000000000000000815212e3b47535f6a76828f989691847d77747374777e859297978e8174695e52463a2d2014070000000000000000000000000000000000000000000000000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e04000000000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2dfdfdfdfdfdfd2c6b9ac9f9386796c605346392d20130000000000000007131d28313a444c545c606b70787e82868a8d8f9192929291918f8d8a86827d786f6a605b544a423930261c100700000000000000000000000000000000000000020a11171c23282c2f35393a3d4042444546464645454342403d3a39352f2c29231d18120b0300000000000000000000000000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d03000000000000000000000a1724313d4a5764707d87858585868a8f949fa2aaa39992867c6f675c51453b31261a0e030000000000000000000000000000000000000000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d1206000000000000000000040c141c232831373b4246484d5354585a5c5d5e5f5f5f5f5f5d5c5a5855534d4847433c373228231d150c0500000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a0000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a000000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a00000000000000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f4453535353535353535345403931271d120700000000000000000000000000000000000000000000000000000000000000030c1925303b444f59626d727f889299a1a8afa69f99928e88837f7c797775747474747576787b7e82868c92979da4adaba39f938e81786d605a50453b3022180e00000000000000080f151a1d1f202020202020191f282f353e444c525a61696e767f8690949a93877e716c61544a3f34281c202020202020201b1a18140f0801000000000000000000080f151a1d1f202020212e3b4854616e7b87949f9f9d9083776a5d50444f5c6976828f9c9f9f94877b6e6154483b2e2120201b1a18140f08010000000000000815212e3b4854616e7b87949f9f9d9083776a5d50444f5c6976828f9c9f9f94877b6e6154483b2e211508000000000000000000000006131f2b37434e58626f7c86929a96918984818081848a92979892857a6e61564d42362a1e11050000000000000000000000000000000000000000000000000d1a2633404d59667380868686868686868680746c61574e43392f251b100700000000000000000000000000000000000000000000000013202d394653606c7986939facb9c6d2d2d2d2d2d2d2d2c6b9ac9f9386796c605346392d201300000000000000010c161f28323a424b515960666c71767a7d808284858686858483807d7a75706c666058504a423930271e140a00000000000000000000000000000000000000050b141c22282e34383a4145474a4d4f50525253535252504f4d4a4745413a38342f28231d150c070000000000000000000000000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b010000000000000000000714202d3a4753606d79797878787a7d828a9298a1a9a2989083796d60574d42362a20150a00000000000000000000000000000000000000000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e2215090000000000000000050e161e262e343c42474d5355575e616467696a6b6c6c6c6c6b6a696765625f5755534e47433c342e271e170e05000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d0100000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d010000000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d01000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000000000000000000a151e262e343846464646464646464638342f271f150b01000000000000000000000000000000000000000000000000000000000000000009141f29323d47505a626d727e8791969ea5acaba39f9a95908c8885848281818081828385878b8f92989fa2a9ada8a099928d81786d665c50483e33291f1006000000000000000004090e1112131313130f19222b313a41454f565e616c717b828b92989a93887e716c615a5042382e23170b1313131313130e0d0b080300000000000000000000000004090e1112131315212e3b4854616e7b8794a1aa9d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e2115130e0d0b080300000000000000000815212e3b4854616e7b8794a1aa9d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e2115080000000000000000000000030f1b26323c47535f6a717e8892989e95908d8d8e91969e9792867d6f685e52443b3025190e020000000000000000000000000000000000000000000000000c1925323f4b57636d737979797979797979746e645a50453c31281d12090000000000000000000000000000000000000000000000000013202d394653606c7986939facb9c6c6c6c6c6c6c6c6c6c6b9ac9f9386796c605346392d20130000000000000000040d162028303940454f545b6064686e7174767778797978777673716e6863605b544e443f382f271e150c02000000000000000000000000000000000000070f171d262d33394044464c525457595c5d5e5f5f5f5f5e5d5b595754524c47454039342e271e1810090000000000000000000000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d120700000000000000000006131f2c3845515c676d6d676b676d70767e869297a1aaa0958c8073695f53463c31261a0f0300000000000000000000000000000000000000000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b00000000000000050e17202830383f444d53575f6166696e71737577787979797978777674716e6967625f58544e454039302920170e050000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f0300000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f030000000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f03000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000030c151c23282c3939393939393939392c29231d150d03000000000000000000000000000000000000000000000000000000000000000000020d17202b353f48515b626c717d848e939da0a7abaca79f9d989892908f8e8d8d8e8f909298979c9fa3aaada9a29f96918780786c665c544a3f362c21170d00000000000000000000000104060606000a16212b343d434b515961686d757e858f949f9f93887f716c625a50483e30261c110600060606060601010000000000000000000000000000000000010406060815212e3b4854616e7b8794a1a99d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e211508010100000000000000000000000815212e3b4854616e7b8794a1a99d9083776a5d50444f5c6976828f9ca9a194877b6e6154483b2e2115080000000000000000000000000a15202b37434e58616c717e868f949a9d9a999a9d99938f857d706b60564d4132291f1409000000000000000000000000000000000000000000000000000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c000000000000000000000000000000000000000000000000000013202d394653606c7986939facb9b9b9b9b9b9b9b9b9b9b9b9ac9f9386796c605346392d2013000000000000000000040d161e272e343d424a5053565e616467696b6b6c6c6b6a696764615e5653504a423c332d261d150c0300000000000000000000000000000000000007101921292f383f444a5153565d606466686a6b6c6c6c6c6b6a686663605d5653514b454039302a221a12090000000000000000000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e05000000000000000004101c2934404b555c60605c555d60646c717c859298a3a79f92867b6e61584e43372b1f14090000000000000000000000000000000000000000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c000000000000030c172029323a424a50575f62696e73777b7e8082848585868685858482807e7b78736f6a625f58514b423a322920170c030000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2d1f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000050e19232d363f49515a626b6f7a818990959c9fa6a9aca9aaa29f9d9b9b9a9a9b9b9c9fa2aaa8acaaa9a19e97928c847c736c665b544a42382e241a0f0500000000000000000000000000000000030f1b27323d464e555d606b707a818a92979f9b918b7f726d625a50483e362c1e140a0000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87949c9c9c9083776a5d50444f5c6976828f9c9c9c94877b6e6154483b2e211508000000000000000000000000000815212e3b4854616e7b87949c9c9c9083776a5d50444f5c6976828f9c9c9c94877b6e6154483b2e211508000000000000000000000000040f1b26313c46505a616c717c82898d90929291908d88827b706b60594f443b3020170d020000000000000000000000000000000000000000000000000007131e2a35404952575960606060606060605a58524a40362c21180d04000000000000000000000000000000000000000000000000000013202d394653606c7986939facacacacacacacacacacacacacac9f9386796c605346392d201300000000000000000000040c151d23282f383f44464c5254575a5c5e5f5f5f5e5e5c5a5754524c46443f382f28221c140b03000000000000000000000000000000000000071119222b333b424a50545c6064686d70737577787979797878767573706d6864605c55514b423c342c241b1209000000000000000000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d0200000000000000000c18232f39434b515353514b51535a616a6f7c86929fa7a3988e81756a5f53473b30251a0e01000000000000000000000000000000000000000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d20130000000000000b151e29323a444c545c60696e757b8084878b8d8f90919292929292908f8d8b8884807c766f6a605c544c443b32291e150b0000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000060c101220202020202020202013100c07010000000000000000000000000000000000000000000000000000000000000000000000000008111b242d373f48505960686d757d83898f94989c9fa3aba7a8aaa8a7a7a7a7a8a9a9a7a5a8a09e9a97918c8580796f6b605b544a423830261c1108000000000000000000000000000000000007131f2c38434e5860676d747d858e939fa29b918b7f726d625a50483f362d241a0c020000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f83776a5d50444f5c6976828f8f8f8f8f877b6e6154483b2e211508000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f83776a5d50444f5c6976828f8f8f8f8f877b6e6154483b2e211508000000000000000000000000000a15202a343e48505a616a6f767c808385868583807c756e6960594f473d32291f0e050000000000000000000000000000000000000000000000000000020d19242e3740474b4d53535353535353534d4c4740382f241a0f0600000000000000000000000000000000000000000000000000000013202d394653606c7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9386796c605346392d20130000000000000000000000030b12181d262d33383b4146474a4d4f515253535251504d4a4746413b38332d261d17110a02000000000000000000000000000000000000060f19232b343d454d545b60666d71767a7d8082838585868685858382807d7a76716d67605c544e463e362d241b1108000000000000000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e1408000000000000000007121d27313940454747454045475058606a727f8c959faa9f93877c6f62574d42362a1d120700000000000000000000000000000000000000000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000007121d27303a444c565d666d737b81878c9196979a9c9d9e9f9f9f9f9e9d9c9a9896918d88827c746d665e564c443b30271d120700000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000003061313131313131313130604000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b252d363f474f565e616b70787d82878b909299989a9c9d9e9f9f9f9e9e9d9c9b999696918d89857f7a736d676059504a42382f261e140a0000000000000000000000000000000000000915222e3b4854606a6f79818a91979ea39c918c7f726d625b51483f362d241b1208000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8283838383828074675a4e414d5a6673808283838383827a6e6154473b2e211408000000000000000000000000000814212e3b4754616e7a8283838383828074675a4e414d5a6673808283838383827a6e6154473b2e21140800000000000000000000000000030e18222c363e4850585f626b6f737778797876736f6a615e574f473d342b20170d0000000000000000000000000000000000000000000000000000000007121c252e353b3f404646464646464646413f3c362f261d12080000000000000000000000000000000000000000000000000000000013202d394653606c798693939393939393939393939393939393939386796c605346392d201300000000000000000000000000070b141c22282b3036393b3e414344454646454443403e3b3936302b28221c140b0600000000000000000000000000000000000000030c18212b353d464f575e666c71797e82868a8c8f90919292929291908e8c8a86837e79726d665f5850483f362d231a0e05000000000000000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e0200000000000000010b151f272f34383a3a3835393e464e58606c7883909da6a49a8e8175695e5246392f23180c0000000000000000000000000000000000000000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d201300000000000c18232e39434c565e686d7880868e93999da0a8aba39f9d9d9c9c9c9d9fa2aaa8a19e9a948f8780786d685e564c42392e23180c03000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b242d353d444c525960656c70767b7f8386898b8d8f9091929292929190908e8c8a8784807c79726d67605d554f443f382f261d140c020000000000000000000000000000000000000916232f3c4956626f7c848e9393939393918c7f726d625b51493f362d241b120900000000000000000000000000000000000000000000000000000000000000000714202d3946525e686e767676767676746e64584c404b58636e737676767676766e685e5246392d201407000000000000000000000000000714202d3946525e686e767676767676746e64584c404b58636e737676767676766e685e5246392d201407000000000000000000000000000006101a242c363e464e53596063676a6b6c6b6a66625f58534d453d352b22190e0500000000000000000000000000000000000000000000000000000000000a131c242a2f323339393939393939393433302b241d140b000000000000000000000000000000000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686796c605346392d20130000000000000000000000000000020a11171c1f252a2d2e3134363838393938373634312e2d2a251f1c17110a0200000000000000000000000000000000000000000a151e2a333d474f5960696e787e848a8f9299999b9d9e9f9f9f9f9e9d9b9999928f8b857f796f6a615a50483f352b20170d02000000000000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e14080000000000000000030d151d23292c2d2d2c292c343d44505b666f7c89949eac9f92877b6e61554b4034291c10040000000000000000000000000000000000000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d20130000000004101c2834404b555e686d7a828c92999fa4a9a19e99999291908f8f90909298989da0a8a69e99928d837a6e685e544b40342820150a000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000010406070a0d10111213131211100d0a070604000000000305050606060606060000000000000000000000000000000000000000000000000000000000000000000000000000000000000109121b232b323a41464f535b6063696e7276797c7f8182848585868685848483817f7d7b7773706d66605d55514b433d332d261d140b02000000000000000000000000000000000000010e1b2734414e5a67748186868686868686867f736d635b51493f372d241b120900000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e6169696969696967645c52473c47525c6366696969696969615e564c41362a1e11050000000000000000000000000005111e2a36414c565e6169696969696967645c52473c47525c6366696969696969615e564c41362a1e110500000000000000000000000000000008121a242c343c43474f54565a5d5f5f5e5d5a55534e46423b332b23191007000000000000000000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b02000000000000000000000000000000000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979766c5f5346392d201300000000000000000000000000000000060b0f14191e20212427292b2c2c2c2b2b29272421201e19140f0b0600000000000000000000000000000000000000000006111c26303c454f59606b6f7b828b91969c9fa3a9a19e9c9b9a9b9c9d9fa2aaa39f9c97928c847c716c625a50473d32291e130800000000000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d010000000000000000030b12181c1f20201f1d2228333f4a54606b75828f9ca8a3998d8073675c5145382c1f14090000000000000000000000000000000000000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a000000020d17202c3845515c676d7a838f949fa3aaa29f97918c898684838282838485888b91969ea1a9a39f9590837a6e665c51453c31261a0f020000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000001080d111314171a1d1e1f1f201f1e1c1a171413100c07010c0f11121313131313130909070300000000000000000000000000000000000000000000000000000000000000000000000000000000091019202830363d41495053575e6165676d6f7274757778787979787877767472706e696763605c54514c45403a3128221c140b0200000000000000000000000000000000000000010d1a2733404c58646e747979797979797979736d635b51493f372d251b120900000000000000000000000000000000000000000000000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5a58524a4136404a52585a5c5c5c5c5c5c54524c443b3025190d0100000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5a58524a4136404a52585a5c5c5c5c5c5c54524c443b3025190d010000000000000000000000000000000008121a222a31373d4348494d50525352504d4947433c36312921191107000000000000000000000000000000000000000000000000000000000000000000070d1316191a20202020202020201a1a17130e0801000000000000000000000000000000000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e1200000000000000000000000000000000000003080d111414171a1c1e1f20201f1e1d1a171414110e080300000000000000000000000000000000000000000000000c17232e38424d57606b707d8590949ea1a8a29e9997918f8e8e8e8f909298999ea2a9a19e9691867e716c62594f443a3025190d0400000000000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e110500000000000000000001070c10131414131017222d38424f5963707d8995a0ab9e9285796d6053473b31261a0e000000000000000000000000000000000000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f23160900000009141f2b37434e58606d798390959fa6a8a098928b85807c79777675757677797c7f848a92979fa7a79f959083786d60584e43372b1e13080000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000003090e13191d20212427292b2b2c2c2c2b292724201f1c18120e181c1e1f2020202020201615130f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000070e161e252a2f383f44464d5354555c60636567696a6b6c6c6c6b6b6a69686663615e575653504a45413a352f281f17110a020000000000000000000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c6c66635b51493f372d251b130900000000000000000000000000000000000000000000000000000000000000000000000008141e29323b4146475050505050504e4c4741382f3840474b4d5050505050504746413b32291e140800000000000000000000000000000008141e29323b4146475050505050504e4c4741382f3840474b4d5050505050504746413b32291e140800000000000000000000000000000000000008101820262b32383b3c404445464543403c3b37322a251f170f07000000000000000000000000000000000000000000000000000000000000000000000002070a0c0d13131313131313130e0d0b070300000000000000000000000000000000000000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060605f5a52493e33271b0f0000000000000000000000000000000000000000010507080b0e10111213131211100d0b0807050200000000000000000000000000000000000000000000000003101c28343f4a545f69707d8692979fa6a49d97928c888583828181828385898c92979fa3a8a09892887e716b60564c41362a20150a0000000000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d201409000000000000000000000000040607070606111c262f3d4854606b7784919daba2978a7e7164574d42362a1b11060000000000000000000000000000000000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c2014070000020e1925303a47535f6a73808d959fa7aaa09691867f79736f6d676a696969666d6f72787d8590959fa9a79f958d80736a5f53473a3025190d0100000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000060e141a1e24292c2d3033363738393939383634302d2c29231d1a24282b2c2d2d2d2d2d2d23221f1b160f07000000000000000000000000000000000000000000000000000000000000000000000000000000050c13191d262d33373b4246484b515356585a5c5d5e5f5f5f5f5e5d5d5b595754534d4946443f38352f29241d160d0600000000000000000000000000000000000000000000000814202b36414a53585a60606060606060605957514940372e251b130900000000000000000000000000000000000000000000000000000000000000000000000000020d1720293036393b43434343434341403c362f262e353b3f404343434343433b3936302920170d02000000000000000000000000000000020d1720293036393b43434343434341403c362f262e353b3f404343434343433b3936302920170d0200000000000000000000000000000000000000060e151b21272c2f30343738393837332f2e2b26201a140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353534f4940372c21160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c666e7b859298a2a9a49f928d857f7c78767574747576797c80858c9299a2aaa39a92877d70685e52463c32261b0f0200000000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e0200000000000000000000000000000000000a141d2c38444f5965727f8c99a3a99c8f8276695f5346382d22170b000000000000000000000000000000000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c1004000005111e2a36424d56626f7c87929fa7aea29891847c726d6763605c555c5c545c6062656c707a839097a1ada79f92877c6f62564c41362a1e110500000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000070f181f262a2f35393a3d404344454646454443403d3a38342f2a252f3437383939393939392f2e2c272119100700000000000000000000000000000000000000000000000000000000000000000000000000000002080b141b22272b31363a3b404547494c4e4f5152525353525151504e4c4a4846423d3a38342e29241e18130c04000000000000000000000000000000000000000000000000030f1a252f3841484c4e53535353535353534c4b4640372e251c1309010000000000000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e3636363636363433302b241d242a2f32333636363636362e2d2a251e170e050000000000000000000000000000000000050e171e252a2d2e3636363636363433302b241d242a2f32333636363636362e2d2a251e170e05000000000000000000000000000000000000000000040a0f161b1f2223272a2c2c2b2a2722211f1b150e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b13131313131313090806030000000000000005101b252e373e4346464646464646464646464646464646464646464646433e372e251b10050000000000000000000000030613131313131313130d0c0a07020000000000000000000000000003060809131313131313130b0b090501000000000000000004111d2935414c56606d78839097a2aaa49a938b807a736f6a6968676869666d6f737a80879298a2aba39992857a6d61584e43372b1e14080000000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e12050000000000000000000000000000000000020b1c27333d4754616d7a86929fac9f93877b6e6153493f33271b0f03000000000000000000000000000000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b0000000714202d3a46525e6975828e99a3afa89f92867c6f6a605c5553514b4f4f4a5053535b60686e7a85919ea7afa3998e8175685e5246392d20130700000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000030b1218212a31363a4145474a4d505152525352514f4d4a4745403936313a4044454646464646463c3b38322b22190f0400000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f252a2d2f34383a3c3f4142444545464645454443413f3d3b3a36312d2c28231c19130d0701000000000000000000000000000000000000000000000000000008131d262f363c40414646464646464646403e3b352e251c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212929292929292726241f1a13191f23262729292929292921201e19140d0500000000000000000000000000000000000000050d14191e20212929292929292726241f1a13191f23262729292929292921201e19140d05000000000000000000000000000000000000000000000000040a0f1315161a1d1f201f1d1a1615130f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c11151718202020202020201615130f0a0400000000000009131c252c33373939393939393939393939393939393939393939393937332c251c130900000000000000000000060c101220202020202020201a1917130e0800000000000000000000040a0f13151620202020202020181715110c06000000000000000713202c3945525d68727f8c95a0a9a69f93887f746d68625f585b5b5b545c6063676d737d869299a4aba2978e81756a5f54473b3025190d010000000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d2114070000000000000000000000000000000000000b13202d3a4653606d7985929eaba49a8c8073655b5044372b1f1207000000000000000000000000000000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a10050000000814212e3b4754616e7b87939fabaca0958a7e716a5f58514b47454042423f44464950565e68707d8a95a0acab9f92867a6d6154473a2e21140700000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000030c151c2328333b42464c5254575a5c5e5e5f5f5f5e5c5a5753514b46423b454c50525353535353534948433d342b21160a000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f141a1e2123292c2d303234363738393939383837363533302e2d2a25201f1c17110d080100000000000000000000000000000000000000000000000000000000010b141d252b303334393939393939393933322f2a231c130a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1114141d1d1d1d1d1d1b1a17140e080e1317191a1d1d1d1d1d1d1414110d080200000000000000000000000000000000000000000002080d1114141d1d1d1d1d1d1b1a17140e080e1317191a1d1d1d1d1d1d1414110d0802000000000000000000000000000000000000000000000000000000030709090d11121312100d090806030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000911171d2124252d2d2d2d2d2d2d22211f1b150e060000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000000000030a11171c1f2d2d2d2d2d2d2d2d2726231f19120a0200000000000000070f161b1f22232d2d2d2d2d2d2d2524211d1811090000000000000714212d3a4754606d7a85929fa7ab9f948c7f726d605d56534e4f4e4e4a5053555d606b707d87939faaa99e93887c6f62564c41362a1e11050000000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e221506000000000000000000000000000000000005111d2a36414c5664707d8a97a1adac9e9184786c605346392f24180c000000000000000000000000000000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a1108000000000c1925323f4c5865727f8b99a4afaa9d9184786c60574e45403a38342f2e34383a3f444d56616b7783909daaafa3998b7e7265584b3f2f24180d01000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000b151e272e343f454d53565d606366696a6b6c6c6c6b696763605c55534d444f575c5f60606060606056544e463d32271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214181c1f20232527292a2b2c2c2c2c2b2a2a28262421211e1a1312100c060000000000000000000000000000000000000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2d2625231e19120a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507081010101010100e0d0b08030002070a0c0d1010101010100807050100000000000000000000000000000000000000000000000000010507081010101010100e0d0b08030002070a0c0d101010101010080705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b22292d3031393939393939392f2e2b26201810060000000000010910161b1e202020202020202020202020202020202020202020201e1b161009010000000000000000030c151c23282c393939393939393933322f2a241c140a00000000000007101920272b2e2f3939393939393932312e29221b12090000000006131f2b37434e5866727f8c97a2ada79c9083786c605b524c47434241413f44464c5159616b73808d98a2aea59b8f8275685e5246392d2014070000000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b00000000000000000000000000000000000713202d3946525e6875828f9ba9b3aca196897c6f63554b4035291d10040000000000000000000000000000000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c1610080000000004111d2935414c556975828f9cabb2a9988b7e72655b50453c342e2c292323282b2d333b444f5965727e8b98a9b3ab9b8f827568554b4035291d1004000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000007121c273039404451575f61686d7073767778797978777673706d67615e57505761686b6c6c6c6c6c6c6260584e43382c1f13070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070c10131416191b1c1e1f1f20201f1e1e1d1b19171514120e090603000000000000000000000000000000000000000000000000000000000000000000000001080f14181a1b2020202020202020191916120d070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090f1112131313110f0c070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b242d34393d3e464646464646463c3b37322a22180e04000000000000050a0f1213131313131313131313131313131313131313131313120f0a05000000000000000000000a151e262e34384646464646464646403f3b362e261c120800000000040f19222b32383b3c464646464646463e3d3a342d241b11060000000815222e3b4754606a7784919ea9aca095897d70655b5045413a3732342e34383a41454f59606d7a85929fabac9f92867a6e6154473b2e23180c0000010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f03000000000000000000000000000000000714212e3a4754616d7a86929facb9b2a89a8e8174675d5145382c1f14080000000000000000000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b0500000000000613202c3945515d677885929eabada196887b6e6153493f3328231f1c18171c1f2227323e4855626e7b8897a2adab9e918578675d5145392c201306000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000c18232e39424a515b63696e747a7d808384858586858482807d79746e69605b536873787979797979796f6a6054483b2e22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0e0f1112121313121211100e0c0a080705020000000000000000000000000000000000000000000000000000000000000000000000000000000003080b0d0e13131313131313130d0c0a0602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708121313131313130a090704000000000000000000000000000000000000000000000000000000060b0e1011131313131313131313131313131313130b0a080400000000000000000000000000030a0f1215151c1e1f1f201f1e1c181413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17222d363e45494b535353535353534947433c342a20150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f4453535353535353534d4b4740382e24190e020000000a16202b343d434749535353535353534b4a453f362d22180c0100000916222f3c4955626f7c8896a0acaa9d9084776b6053493f35302b262823282c2f353e45525d6874818d9aaaafa3998b7f7265544b4034281c10040005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f120500000000000000000000000000000006131f2b37434e5865727f8c99a3aeb7b8ab9f9285796d6053473b3025190e0200000000000000000000000000000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a000000000000000714212d3a4754606d7a8797a1adab9e918578695f5341382d211813100c0b101217202d394653606c7985929fabada196867a6d6053473a2d201407000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000004101c2834404a545c606d727b81868a8d8f9191929292918f8d8a85807b726c655c6b78858686868686867c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151f202020202020171614100b050000000000000000000000000000000000000000000000040b12171b1d1e20202020202020202020202020202020171714110c0500000000000000000000060e151b1f2122282a2b2c2c2c2b292521201d19130d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d29343e485056586060606060606055534e463c32261b0f0300000000000000000000000000000000000307090a0e111213131211100e0b090706030000000000000000000c17232e38424a505f606060606060605a58524a40362a1f13070000030f1b27323d464e545660606060606060585650483f34291d110500000d192633404c5966737f8c99a8b2ab998c807366594f41382d241e1b1b171c1f242935414c5663707c8998a2aeab9c8f8276665c5145382c1f1306000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d2013060000000000000000000000000000000815222e3b4754606a7783909dabacababaea2988a7e7164564c41362a1e110500000000000000000000000000000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a000000000000000915222f3c4855626f7b8895a9b3a99c8f827669574d422f261b0f070400000306121f2b3744505b657683909da9b2a995887b6e6255483b2f221508000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000030e18212c3844515c666d757f878d9298999c9d9e9f9f9f9e9c9a98928d867f776d666679869293939393887b6e6255483b2f22150800000000000000000000000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c08030000000000000000000000000000030608090f1112131313110f0c0707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a131313131313120807050200000000000000000000060d141a1e21222c2d2d2d2d2d2c2423201c161008000000000000000000000000000000000000000000050e161d23272a2b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c171008000000000000000006101820262b2e2f3537383939393835322e2d2a251e19130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212d3945505a62646c6c6c6c6c6c6c625f584e43372b1f1306000000000000000000000000000000040b101316161a1d1f201f1e1e1d1a18151312100b0600000000000003101c28343f4a545c6c6c6c6c6c6c6c6c66635c52473b2f23170a000006131f2b38434e5860626c6c6c6c6c6c6c65625a50453a2e2115090005111d2935414c566976828f9ca9afa399897c6f6356493d2f261b130f0a0c101319242f3a4653606d7985929facac9f9285796d6053463a2d201307000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e211408000000000000000000000000000004101c2834404b55626f7c8895a0a8a19e9fa2aa9c8f8275685e5246392d20150a00000000000000000000000000000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a000000000000000916232f3c4956626f7c8995a2afa89b8e8275685b4f423128140a0000000000030f1b27333f49536976828f9ca9afa295897c6f6256493c2f231609000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000915202c38434f59606d78818c92999fa2aaa9a8aaa29f9e9e9e9fa29f98928c81786d6d798699a39f9f94877a6e6154473b2e2114080000000000000000000000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f090100000000000000000000030a0f1215151c1e1f1f201f1e1c181413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b101416172020202020201f1514120e090300000000000000060f181f262a2d2e38393939393939302f2c28211a110800000000000000000000000000000000000000040e1720282e3336373939393939393939393939393939393931302d28221a1208000000000000030e18222a31373a3c42444546464644423f3a39363029241e160e070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4956626c7179797979797979766a5f53473b2e2115080000000000000000000000000002090e161b202223272a2c2c2c2b2a29272522201f1c17110a020000000006121f2c3844505c667679797979797979736e63584b3f3226190c00000815222e3b4754606a6f79797979797979716c62564a3d3124170b000713202d3946525e687885929eabac9f92867a6d6053473a2d20140a0200000308131f2c3844505c667683909ca9aea298887c6f6255493c2f221609000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f221509000000000000000000000000000006131f2c3845515c6774808d9aa7a196919298a29f92867a6e6154473c31261b0f000000000000000000000000000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a00000000000000091623303c4956636f7c8996a2afa79a8d8174675a4e4134271b080000000000000b17222d424e5b6875818e9ba8afa296897c6f6356493c30231609000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000020e1a26313b4854606b74808d939fa3ababa49f9b979892919192939a989d9f938f82786d7a8794abb4a094877a6d6154473a2e211407000000000000000000000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b030000000000000000060e151b1f2122282a2b2c2c2c2b292521201d19130d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810161c2023242c2d2d2d2d2d2c22211e1a140d060000000000030d18212931363a3b454646464646463d3c38332c231a10070000000000000000000000000000000000000b16202932393f4344464646464646464646464646464646463e3c39332c241a100500000000000a15202a343c4347484f5152525352514f4b4746413a3530282019110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e868686868686867c6f6255493c2f221609000000000000000000000000050d141a21272c2f30343738393938373634312f2d2b28231c140c020000000713202d3a4653606d78868686868686868073665a4d4033271a0d00000916232f3c4956626f7c868686868686867e7165584b3e3225180b000714212e3a4754616d7a8797a1adaa9e918477675d5145382c1f13020000000003101c28343f4a546774818e9aa7b4aa978b7e7164584b3e3125180b000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a00000000000000000000000000000713202d3a4653606d7985929fab9e918485929fa3998c7f7265584e43372b1c11060000000000000000000000000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a000000000000000815222f3b4855626e7b8895aab4a79a8e8174675b4e412f24190d010000000000061b2835424e5b6875818e9ba8b4aa95887b6f6255483c2f221509000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000006121e2b37424e57636f7c87939fa5afa9a199938f8a878584848586888c90959e948d80747b8794a1ada093877a6d6054473a2d2114070000000000000000000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b0100000000000006101820262b2e2f3537383939393835322e2d2a251e19130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a21282c2f30393939393939382e2d2a261f180f060000000009141f29333b424648525353535353534a48443e352c22190f060000000000000000000000000000000006121d28323b444b4f51535353535353535353535353535353534a49453e362c22170c00000000030f1b26313c464e53555b5d5e5f5f5f5e5c5854524c46413a322b231a1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b9393939393887c6f6255493c2f2216090000000000000000000000060f171f252a32383b3d4144454646454443413e3c3a38342e261e140a0000000713202d3a4653606d798693939393938d8073665a4d4033271a0d00000916232f3c4956626f7c8993939393938b7e7165584b3e3225180b000915222f3c4855626f7c8895a9b3a99c8f837669554b4035291d100400000000000c17232e3f4c5966727f8c99a5b2a6998c807366594d4033261a0d000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a0000000000000000000000000005111e2a36424d5764717e8a97a2a99a8d80818e9baa9d9083776a5f5347382e23170b00000000000000000000000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a000000000000000814212e3b4754616e7a8798a2aea89b8f827568564c4135291d11070400010407101d2935404b556976828f9ca9aea398877a6e6154473b2e211408000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000814212e3a47535f6a76828f9aa4afaba1979287827d7a79787778797b7f838a9196928a7e7b8895a1ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d13090000000000030e18222a31373a3c42444546464644423f3a39363029241e160e0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101a232c33383c3d464646464646453b3a36312921180d030000020e1a26313b454d53555f60606060605f57554f473e342b21180d040000000000000000000000000000000b17232e39444d565b5e60606060606060606060606060606060575550483e33281c110400000006121f2b37434e585f62686a6b6c6c6c6b6865615e56524c443d352c241a11080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b979f9f9f95887c6f6255493c2f22160900000000000000000000060f18212930363d4448494d505253525151504d4b4846443f3830261c110600000713202d3a4653606d7986939f9f9f998d8073665a4d4033271a0d00000916232f3c4956626f7c89959f9f9f988b7e7165584b3e3225180b000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422f24180c000000000000061825323e4b5865717e8b98a4b1a79a8e8174675b4e4134281b0e000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b000000000000000000000000000714202d3a46525e6976828f9ca9a297897d7d8a98a2a095887c6f62544a3f34281c1003000000000000000000000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a000000000000000613202d394653606c7985929faba99d908376685d5245392c221813100c0d101318202c3945515d677783909daaac9f9286796d6053463a2d201307000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000815222f3b4855626e7b88949facaea39992857d75716e686b6b666d6e72767d84909492857d8996a3aca09386796d6053463a2d20130700000000000000000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f03000000000a15202a343c4347484f5152525352514f4b4746413a3530282019110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f19222c353e44484a535353535353524846423b33291f1409000005121e2a36424d575f616b6c6c6c6c6c6c6361594f463d332a1f160b0200000000000000000000000000000e1b27333f4b565f676a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d2114080000000815212e3a47535f6a6f7577787979797775726d68615d564f473e362c231a100600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4aca295887c6f6255493c2f221609000000000000000000020c18212a333b42464f54565a5d5f5f5f5e5d5c5a585553504a42382e23170b00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2aca4988b7e7165584b3e3225180b000b1724313e4a5764717d8a97a4b0a79a8e8174675b4e4134281b070000000000000b1724313e4a5764717d8a97a4b0a89c8f8275695c4f4236291c0f000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000814212e3b4754616e7b87939fab9e9285797985929fa79a8d8073665c5044382b1f13070000000000000000000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a0000000000000006121f2b3844505b6676828f9cabac9f92867a6d6054473e3429241f1c18181d202328323b4753606d7a86929faca99c908376665c5144382c1f1206000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000d192633404c5966737f8c99a6b0ac9f92877c6f6b64615e56545c6062656c707a8290949083909daaaca09386796d6053463a2d201307000000000000000000000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b201408000000030f1b26313c464e53555b5d5e5f5f5f5e5c5854524c46413a322b231a12080000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18212b343e474f55575f60606060605f55534d453b31261a0e02000714212d3a46535f696e78797979797979706b61584e453b31281d140a0000000000000000000000000000101d2a36434f5b67717779797979797979797979797979797979716c6155493c3023170a0000000915222f3c4855626f7c81848585868584827e7a746d68605950483e352c22180d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000000000a141e2a333b454d52596063676a6b6c6c6b6a69676462605c544a3f34281c1003000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000b1824313e4b5764717e8a97a4b1a79a8d8074675a4d4134271a0e0100000000000a1724313d4a5764707d8a97a3b0a99c8f8376695c504336291d10000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b00000000000000000000000007131f2c38434f5966727f8c99a4aa9b8e817475818e9baa9e9184796d6053463a2f24180d01000000000000000000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a00000000000000030f1c28333f4a5466727f8c99a3aea3998a7d71645a50463d352f2c292324292c2e343b444f5963707d8a99a3aea6998d807366544a4034281c1004000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000005111e2a36424d576976838f9ca9b1a79a8d80736a605954524c4a5053555a61676d798290959095a0abaca09386796d6053463a2d201307000000000000000000000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c00000006121f2b37434e585f62686a6b6c6c6c6b6865615e56524c443d352c241a1108000000000000000000000000000000000000000000000000000000000000000000000000000000020b16202a333d474f5961636c6c6c6c6c6c6b615f574d42362a1e1205000815222e3b4855616e7b858686868686867d706a60574d433a2f261b110600000000000000000000000000111e2b3744515e6a7784868686868686868686868686868686867e7164574a3e3124170b0000000a1724313d4a5764707d8a9091929292918f8b86807a706b615a50473e342a1f150b010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000000000000000006111c26303b454d575e616b70747778797978777674716f6d665c5044382b1f1206000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000b1824313e4b5764717e8a97a4b1a79a8d8074675a4d4134271a0e0100000000000a1724313d4a5764707d8a97a3b0a99d9083766a5d5043372a1d10000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a0000000000000000000000000915222f3b4854606b7784919eaba2988a7d70707d8a98a2a197897d7063554b4135291d11040000000000000000000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a00000000000000000b17222d3b4754616e7b86929faaab9d9083766c61584e45403a38342f2f35393a40454d56606b75828f9babab9f94887b6f6255483c2e23180c00000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000714202d3a46525e697885929fabaca095877b6e61584f4746413f44464850555d676e7b85929da0a7b1aca09386796d6053463a2d201307000000000000000000000000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e0000000815212e3a47535f6a6f7577787979797775726d68615d564f473e362c231a100600000000000000000000000000000000000000000000000000000000000000000000000000000a141d28323c454f59616b70797979797979786e695f53463a2d211407000714212d3a46535f696f7c86929a939992867d6f695f554c41382d22170d04000000000000000000000000111e2b3744515e6a77849193939393939393939393939393938a7e7164574a3e3124170b0000000a1724313d4a5764707d8a979e9f9f9f9e9b98928d847d716c61594f463c31271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f22160900000000000000000b17232e38424d575f696e767c8083858685848483807e7c786d6053463a2d201307000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000b1724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b070000000000000b1724313e4a5764717d8a97a4b0a99d9083766a5d5043372a1d10000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a000000000000000000000004101d2935404b55636f7c8996a0ab9f9285796d6d7985929fa99b8e8175675d5145392c20140900000000000000000000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a00000000000000000614202d3946525e6874818e98a2ab9f958a7e716a6058514b47454042434045474b51575f696f7c89939eaaa4998f82766a5f53473a2e1c120700000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000814212e3b4754616e7b8798a2aeaa9d908377695e53463d393634383a3e434c555e69717e8b97a1adb9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e0000000915222f3c4855626f7c81848585868584827e7a746d68605950483e352c22180d0300000000000000000000000000000000000000000000000000000000000000000000000006111c262f3a444d57606b707d868686868686857b6e6155483b2e2215080005121e2a36424d57606a707e88939fa29892857b6e675d53493f33271f160c010000000000000000000000111e2b3744515e6a7784919d9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b0000000a1724313d4a5764707d8a979e9ea2a9a9aaa39f9691877e716b61584e43392f23180c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204050606060504020b1825313e4b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000003101c28343f4a545f696e7b82898d9092929291908f8d8b887e7164584b3e3125180b000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000a1724303d4a5763707d8a96a3b0a89b8e8175685b4e422e23180c0000000000000b1825313e4b5864717e8b97a4b1a99c8f8376695c504336291d10000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f23160900000000000000000000000613202c3945515d6774818e9aa8aa9b8e8175676775818e9baa9f92867a6d6054473b31251a0e020000000000000000000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a000000000000000005111e2a36414d56616e7b85929fa4a79f92867c6f6a605d5553514b4f4f4b5153545c60696e7b84919ea6a69f93877c6f63584e43372b1f0b0000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000091623303c4956636f7c8996aab4a79a8e817467574d42342d2a282b2d313a434d57606d7985929eabb8aca09386796d6053463a2d201307000000000000000000000000000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c302316090000000a1724313d4a5764707d8a9091929292918f8b86807a706b615a50473e342a1f150b0100000000000000000000000000000000000000000000000000000000000000000000040d17222d38424c565f696f7d869299939a92867c6f695f53463a2d21140700020e1a26313b454e58616c73808c949ea1979183796d655b50443d31281d13070000000000000000000000111e2b3744515e6a7784919daab0a69e9b98989898989898978a7d7164574a3e3124170b0000000a1724313d4a5764707d8a92919297979c9fa6a9a19992877d706a5f554b4034291f1409000000000000000000000000000000000000000000000000000000000000000000000000000000020608080c0f111213131312110f0c1825313e4b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000006121f2b3844505c666e7b848f949a9d9e9f9f9e9d9c9a978b7e7164584b3e3125180b000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000916222f3c4955626f7c8895a9b3a99c8f827669544a4034281c100400000000000c1926333f4c5966727f8c99a5b2a89c8f8275695c4f4236291c0f000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e21150800000000000000000000000714202d3a4753606d7a85929faca3988a7d716464707d8a98a2a2988b7e7165574d42362a1e120500000000000000000000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a0000000000000000020e1925303b46535e69717e8b929da4a29891847c726d6763605c555c5c555d6063666d727b839096a1a69f948d80736b6054463c31261a0f0000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f31261e1c1f2028313b45515c6673808d99aab4aca09386796d6053463a2d201307000000000000000000000000000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f2215090000000a1724313d4a5764707d8a979e9f9f9f9e9b98928d847d716c61594f463c31271d1207000000000000000000000000000000000000000000000000000000000000000000010c161f28333f4a545d686e7b859298a29f93887e706a60574d42362a1e1205000009141f29333d46505a606c77828f96a1a0958f82776c60594f433a2f24180c0300000000000000000000111e2b3744515e6a7784919daaaa9e938f8b8b8b8b8b8b8b8b8a7d7164574a3e3124170b0000000a1724313d4a5764707d87858585868a8f949fa2aaa39992867c6f675c51453b31261a0e0300000000000000000000000000000000000000000000000000000000000000000000000003090e121415191b1d1f1f201f1f1d1b191825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000000000000000713202d3a4653606d788390969fa6aaababa5a1a0a0a1978b7e7164584b3e3125180b000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000814212e3b4754616e7a8797a2adaa9d918477665c5144382c1f120600000000000e1b2734414e5a6774818d9aa7b4a89b8e8175685b4e4235281b0f000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d2013070000000000000000000005121e2a36424d5764717e8b98a2ac9f92867a6d60606d7985929faa9c8f8376695e53463a2d21160a0000000000000000000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a00000000000000000008141f2a36424d57626c74808d929fa2a19691877f79736f6d676969696a676d6f73797f869095a0a49f949082796d60594f43342a20150a0000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1824313e4b5764717e8a97a4b0a4978a7d7164574a3e3124171012161f2834404b54626f7c8998a3aeaca09386796d6053463a2d2013070000000000000000000000000000000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f13070000000a1724313d4a5764707d8a979e9ea2a9a9aaa39f9691877e716b61584e43392f23180c03000000000000000000000000000000000000000000000000000000000000000008131e28313a44505b666d7a849197a29e948c80736c61584e453b31261a0e020000030d18212b343e44505b656d7a849199a49e948c7f726b60554b4135291e150b00000000000000000000111e2b3744515e6a7784919daaa89b8f817f7f7f7f7f7f7f7f7f7b6e6155483b2e2215080000000714202d3a4753606d79797878787a7d828a9298a1a9a2989083796d60574d42362a20150a00000000000000000000000000000000000000000000000000000000000000000000060b0f151a1e212225282a2c2c2d2c2b2a28262225313e4b5864717e8b97a4afa295887c6f6255493c2f22160900000000000004101c2834404b5564717e8a959fa8b0a9a19e9894939394968b7e7164584b3e3125180b000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000714202d3946525e687885929fabac9f9286796d6053463a2d20130a0400000006121f2b37434e586976828f9ca9b4a79a8e8174675b4e4134281b0e0006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f1306000000000000000000000714212d3a46535f6976838f9caaaa9b8f8275675d5d6775828e9baa9f93877b6e6154483d32271b0f0000000000000000000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a000000000000000000020e1a25313b45505a646e74808b92989fa199928c85807c797776757676777a7c80858b9298a09f9a938d82796d675d51473d3222180e030000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825313e4b5864717e8b97a4b0a396897d7063564a3d3023170a060d18232e3a4653606d7986929facaca09386796d6053463a2d20130700000000000000000000000000000000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f030000000a1724313d4a5764707d8a92919297979c9fa6a9a19992877d706a5f554b4034291f140900000000000000000000000000000000000000000000000000000000000000030d19242f3a434f59606c78828f96a0a1968f82776c605a50463d33291f140900000000060f192227333f49535e68707d87939fa69f92877d6f675d51453d30271d1207000000000000000000111e2b3744515e6a7784919daaa5998c7f7272727272727272726e695f53463a2d21140700000006131f2c3845515c676d6d676b676d70767e869297a1aaa0958c8073695f53463c31261a0f0300000000000000000000000000000000000000000000000000000000000000020a11171b1f262b2e2f32353738393939383735322f2e313e4b5864717e8b97a4afa295887c6f6255493c2f22160900000000000006131f2c3845515c6776828f9ca7b1aaa197928b88868687898b7e7164584b3e3125180b000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0005111e2a36414c56697683909ca9aea399897c6f6256493d32271b13100c090e1117212e3a47535f6a7885929eabb3a6998d8073665a4d4033271a0d0003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c1004000000000000000000030f1c28333f4a54616e7b87939faca2988a7e7164555564717e8a98a3a49a8c7f7366584e43372b1d1207000000000000000000000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a0000000000000000000009141f29333f48525c646e747e868e92999c9f97928d898684838282838486898d92979f9c99948f8780796d675d554b40342b211006000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa296897c6f6356493c302316090007131f2c3845515c667683909da9aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a000000000a1724313d4a5764707d87858585868a8f949fa2aaa39992867c6f675c51453b31261a0e030000000000000000000000000000000000000000000000000000000000010b151f2935414c56606b737f8c949ea49991847a6d655b50483e342b21180d030000000000071017222d38414c56606b74808d96a0a3999184796d60594f42392e23180c020000000000000000111e2b3744515e6a7784919daaa5998c7f726665656565656565615f574d42362a1e120500000004101c2934404b555c60605c555d60646c717c859298a3a79f92867b6e61584e43372b1f1409000000000000000000000000000000000000000000000000000000000000060b141b22272b31373a3b3f4244454646464544423f3b3a373e4b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000713202d3a4653606d7986929facaea39892857f7b79797b7c7f7c6f6256493c2f231609000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00010d192530404d5a6673808d99a9b2ab998c7f7266584e43372b251f1c181b1a1b2228343f4a54626f7c8897a2adb1a4978b7e7164584b3e3125180b00000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c0000000000000000000006121f2b3844505b6673808c9aa4ac9f92867a6d605454606d7a86929fac9d9184776a605447392e23180c00000000000000000000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a00000000000000000000030d17212d36414a525c646c717b81868c8f92979e99999291908f8f90919299999e9892908c88827d746d675d554b43392f22190f00000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090004101c2834404b546875828f9ba8aca09386796d6053463a2d201307000000000000000000000000000000000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f04000000000714202d3a4753606d79797878787a7d828a9298a1a9a2989083796d60574d42362a20150a000000000000000000000000000000000000000000000000000000000007121d27313945525d68707d87939fa69f93877d6f685e53493f362c22190f060000000000000006111b262f3a444f59606d7984919ea5a0968e81746b60544b4034281e13080000000000000000111e2b3744515e6a7784919daaa5998c7f72665958585858585855534d453b31261a0e02000000000c18232f39434b515353514b51535a616a6f7c86929fa7a3988e81756a5f53473b30251a0e0100000000000000000000000000000000000000000000000000000000080f181d262d33373c4247484c4e505252535252504e4c4847433e4b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000916232f3c4956626f7c8999a3aeac9f92867c726e6d6d6e70726f6a6054473b2e221508000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000081623303c4956636f7c8997a1adaa9d9083776a6054473f36302c282328252a2d333c44505c6673808c99a9b3b3a996897c6f6356493c3023160900000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d30231607000000000000000000000613202d394653606c7884919eaca99b8e8175675d51515d6775828f9caba096897c6f62544b4034281c100400000000000000000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a0000000000000000000000050f1b242f38414a525a62696e747b7f8285929faba39f9d9c9c9c9d9d9fa3ab9f928682807b766f6b605d554b433a31271d100700000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000c18232e414e5b6874818e9ba7aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f241907000000000006131f2c3845515c676d6d676b676d70767e869297a1aaa0958c8073695f53463c31261a0f03000000000000000000000000000000000000000000000000000000000c18232f39434f59606d7a849199a4a0968d80736b60564c41382d231a10070000000000000000000a141d28323d45515d67707d89939ea89d93897d70665c51453a3025190d0200000000000000111e2b3744515e6a7784919daaa5998c7f7266594c4c4c4c4c4c4846423b332a1f1409000000000007121d27313940454747454045475058606a727f8c959faa9f93877c6f62574d42362a1d120700000000000000000000000000000000000000000000000000000008111a212a2f383f44464d5355585b5d5f5f605f5e5d5b5955534e464b5864717e8b97a4afa295887c6f6255493c2f2216090000000000000a1724313d4a5764707d8a97abb5a79a8e81746a6160606163656260584e43372b1f1306000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000713202d3a4653606d7984919eaaab9f95897c6f625b5146413a38342e343136383f444d57606d7984919eabb7ada297877a6d6154473a2e21140700000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d20130700000000000000000004111d2935414c5663707d8996a1aca1978a7d7063554b4b5564717e8b99a3a89a8d8174665c5145382c1f13080000000000000000000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f231609000000000000000000000000091217232e38424a535b606a6f767c8084919eaaa7a4a2a1a0a0a1a2a4a7a99c8f837f7b756e6a625b514b433a31281f150b0000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000071a2734404d5a6773808d9aa6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e1308000000000004101c2934404b555c60605c555d60646c717c859298a3a79f92867b6e61584e43372b1f140900000000000000000000000000000000000000000000000000000004101c2934404b55606b74818e96a1a59d9184796d60594f443a2f261b110800000000000000000000020b16202935404b55606b75818e98a2a59d9184796d60564c41362a1f140800000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3f3f3f3f3b3a36312a21180e030000000000010b151f272f34383a3a3835393e464e58606c7883909da6a49a8e8175695e5246392f23180c000000000000000000000000000000000000000000000000000008111a232c333c41495053575f6265686a6b6c6c6c6b6a6865625f5853505864717e8b97a4afa295887c6f6255493c2f2216090000000000000b1825313e4b5864717e8b97a4b1a4978a7e716458535354565856544e463d32271b0f03000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000006121f2b3844505c6673808d98a2aea79c8f82766d625b524c46454041414242464950575f69727e8b96a1adb8ab9e928578685e5246392d201307000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f13060000000000000000000613202c3945525d6875818e9ba8ab9e9285796d6053464754616d7a86929fab9e9285796d6053463a3025190d010000000000000000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f2215080000000000000000000000020c162028343f4a545c656c737c82888c9196a09f9a97959493939495979a9e9f948f8b86817b726d645d534a40352c1f150b0100000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c010000000000000c18232f39434b515353514b51535a616a6f7c86929fa7a3988e81756a5f53473b30251a0e0100000000000000000000000000000000000000000000000000020d17212c3845515c67707d89939da89e93897d6f675c51473d32281d140a000000000000000000000000050e18242f39434f59616e7b86929fa9a0968c7f72685e52463b3025190e01000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f333232322e2d2a261f180f0600000000000000030d151d23292c2d2d2c292c343d44505b666f7c89949eac9f92877b6e61554b4034291c1004000000000000000000000000000000000000000000000000060f1a232c353e454d535b6064696e72757778797979787775726e6a64605c5464717e8b97a4afa295887c6f6255493c2f2216090000000000000c1825323f4b5865727e8b98a5afa295897c6f6256494648494c4947433d342b20150a00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000003101c28343f4a54616e7b86929fa8ab9f948b7f726d615e5653514b4e4e4f4d53535b60696e7b85929fa8b2b5a89c8f827569564c4135291d11050000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c10040000000000000000000714212d3a4754606d7a86929faca89a8d8174665c514446525d6876828f9caba2978a7d7064564c4135291d11050000000000000000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d211407000000000000000000000008131e28323a44505c666d777f878f94999e9f97928e8b8887868687888b8d92979e9c99928e867f746f645c52473e31271d120700000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c2013040000000000000007121d27313940454747454045475058606a727f8c959faa9f93877c6f62574d42362a1d12070000000000000000000000000000000000000000000000000009141f2a36414c56606d7984919ea5a2988e81756b60554b40352b20160b020000000000000000000000000007121d27313d46525e6973808d97a2a89f92857a6d61564d41362a1e1308000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326252522211e1a140e06000000000000000000030b12181c1f20201f1d2228333f4a54606b75828f9ca8a3998d8073675c5145382c1f14090000000000000000000000000000000000000000000000030e18212c353e474f575f656c71767b7f8183858586858583817f7b77716d665f64717e8b97a4afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea195887b6e6255483b3b3d3f3c3b37322b22190f0400000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000b17232e3846525e6973808d96a0aaa69f93877f746d6863605c545b5b5c575e61656c717b849198a2aebab3a9988c7f7265594c3f3025190d010000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c00000000000000000006121f2b37434e5865727e8b98a2aca096897c6f63544a40414c5665727e8b99a4a99b8f8275685e5246392d2015090000000000000000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c20130600000000000000000000010d1924303a44505a606d78818c93999fa098928c85817e7b7a797a7a7b7e81858b92979f9f99928b81746e63594f43392f24180c00000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d110400000000000000010b151f272f34383a3a3835393e464e58606c7883909da6a49a8e8175695e5246392f23180c000000000000000000000000000000000000000000000000020e1a25303946525e68737f8c96a0a99f92867a6e61594f43392f23190e040000000000000000000000000000010b151f2a36424d57606d7a85929eaaa2978d8074685e52463a2f24190d010000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f332619191514120e0903000000000000000000000001070c10131414131017222d38424f5963707d8995a0ab9e9285796d6053473b31261a0e000000000000000000000000000000000000000000000009141f2a333e474f5961696e787e83888b8e909292939291908e8c88847e786e6a64717e8b97a4afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e30322f2e2b27201910070000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000006111c2a36424d56606d79849198a2aba499938b807a736f6d666968676869696e71787e859196a1aab3b9ada297887c6f6255493c2f2216080000000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d12070000000000000000000814212e3a47535f6a7683909daaaa9e9184776b605442393b4754616e7b86939fac9f92867a6d6154473c31261a0e0000000000000000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d11040000000000000000000004111d2935414c56616c74808d939fa4a09591867f7a74716f6e6d6d6e6f7174797e8590959fa39f938d80736b61554b4035291d1004000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d010000000000000000030d151d23292c2d2d2c292c343d44505b666f7c89949eac9f92877b6e61554b4034291c1004000000000000000000000000000000000000000000000005121e2a36424d57616e7a86929fa8a1978c8073685e52473d31271d110700000000000000000000000000000000030d1a25303b45525d6873808c98a2a99f92867b6e61554c4135291d11040000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0807050200000000000000000000000000000000040607070606111c262f3d4854606b7784919daba2978a7e7164574d42362a1b1106000000000000000000000000000000000000000000020b1a26313b454f59616b707b838a9095989b9d9e9f9f9f9e9d9b9895908b837c6f6b717e8a97a4afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e232523221f1b150f07000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000e1925303b45515d676f7c869299a2aaa49f928d86807c79767574747576787b7e838a9297a1a8b2bcb8ab9e9285796c605346392d20130600000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b00000000000000000003101c28343f4a54626e7b88959faba7998c807366594f43303946525e687683909ca9a3998b7f7265574d42372b1b1106000000000000000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d01000000000000000000000713202c3945525d68717e8a929da5a19791837b726d676462616060616264676d717a839096a1a59c928a7d70675d5145392c1f150a000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000000000000030b12181c1f20201f1d2228333f4a54606b75828f9ca8a3998d8073675c5145382c1f140900000000000000000000000000000000000000000000000714202d3a46525e6974818d98a2aa9e92857a6d60564c41352b1f150b00000000000000000000000000000000000009141f2935414c56616d7a86929faca3988d8073675d5145392c20150a0000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000a141d2c38444f5965727f8c99a3a99c8f8276695f5346382d22170b0000000000000000000000000000000000000000000a141d2a36424d57616b707d8690959d9fa7a8aaaaa39f9e9e9e9fa3a09d9590867d6f717d8a97a4afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22191615130f0a0400000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000009141f2935404b55606a707e879298a0a7a49d98928d898583828181828384878b90959ea1a9b2babeb2a99b8e8175665b5044382b1f1206000000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c0300000000000000000006121f2c3844505c6673808d9aa7ab9f95887b6e6255483d3236414d5665727f8c98a7ab9d908376695f5347382d22170b0000000000000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e2114070000000000000000000003101c28343f4a54606d7a85929ea4a79e91857b6e69605d55555453535455555c60686e7a84919ea8a49e9184796d6053473c31261b0f030000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c01000000000000000000000001070c10131414131017222d38424f5963707d8995a0ab9e9285796d6053473b31261a0e0000000000000000000000000000000000000000000004111d2935414c56616e7b86929faaa2988c7f73675d51443b3023190d03000000000000000000000000000000000000020d19242f3a46525e6874808d9aa6aa9f92857a6d6054473c31261b0f0300000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000000000000020b1c27333d4754616d7a86929fac9f93877b6e6153493f33271b0f030000000000000000000000000000000000000006111b262f3846535f69707d8792989fa7aba8a09d9898929191919299989d9f9892867c707d8a96a3afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221509080603000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000020c18242f39434e58616c707d8690959ea1a9a29f9a9892908f8e8e8f8f9196989da09f9da0a8b2b9ada1978a7d7063544a3f33281c0f030000000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f000000000000000000000713202d3a4653606d7985919eabab9d908377695f53473a2b303b4854616e7b8795a0ab9f95887b6e6253493f33271b0f0300000000000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d2013070000000000000000000006121f2b3844505c66737f8c97a1ab9f958a7d70695f57514b4847464747484b51565e68717e8a96a0aca1968b7f7265584e43372b1f12060000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c201304000000000000000000000000000000040607070606111c262f3d4854606b7784919daba2978a7e7164574d42362a1b11060000000000000000000000000000000000000000000713202c3945525d6874808d99a3ab9f92857a6d60554c4132291e1107000000000000000000000000000000000000000008131e2935414c56626f7b88949faba2988b7f7265584e43372b1f120600000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000000000000000b13202d3a4653606d7985929eaba49a8c8073655b5044372b1f1207000000000000000000000000000000000000000b17222d3841505a616e7b859299a2aaaba39f96918c888584848586888c90959e9891847a7d8996a3afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000007121d27313d46505a616b707c838b91979c9fa3aaa29f9d9c9b9a9b9c9ea1a29f9a939196a0acb8ab9e9184796d6053463a2d22170b0000000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c22110800000000000000000005111d2a36414c5663707d8a97a1ada3998c7f7265574d42372b2d3a46535e697783909daaa7998d8073655b5044372b1f1207000000000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d1105000000000000000000000713202d3a4653606d7984919ea9a99d9083766b61574d45403c3b3a3a3b3c40454c56606c7884919eaaa89d9184776a5f53473a2e2115080000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d11040000000000000000000000000000000000000000000a141d2c38444f5965727f8c99a3a99c8f8276695f5346382d22170b0000000000000000000000000000000000000000000714212d3a4754606d7a86929faba69a8d8074685d52433a2f20170d000000000000000000000000000000000000000000010d1925303a47535f6a7683909cacaa9d9184776a5f53473a2e21150a00000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000000000000000005111d2a36414c5664707d8a97a1adac9e9184786c605346392f24180c000000000000000000000000000000000000030f1b27333f4953616c76828f97a2ababa399928c847f7b79787778797b7f838a9197968e817d8996a3afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000010b151f2b343e485059616a6e787e858a8f9299999b9d9e9f9f9f9e9e9c9998928e8684919daab0a69a8d8073665c5044382b1c110600000000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a10000000000000000000000713202d3946525e6875828f9ba9ac9f92867a6e6154473c31262a36424d5766737f8c99a7ab9e9184786c605346392f24180c0000000000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d0100000000000000000000091623303c4956636f7c8996a1adab988b7f7265594f453c352f2e2d2d2e2e343b44505b6674808d9aa7aca095887b6f6255483c2f2215090000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d01000000000000000000000000000000000000000000020b1c27333d4754616d7a86929fac9f93877b6e6153493f33271b0f030000000000000000000000000000000000000006131f2b37434e5865727f8c98a2ab9f94887b6e62564c4131281e0e050000000000000000000000000000000000000000000008131e2b37434e5865727f8b9aa4aca095887b6f6255483c32261b0f03000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000713202d3946525e6875828f9ba9b3aca196897c6f63554b4035291d1004000000000000000000000000000000000005121f2b3744505b65717e8a949fa9aea39992877f78726e6c666b666d6f72777e859095938c7f8c99a6afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000030d19222c363e474f575f666d72797e82868a8c8e909192929292918f8d8a86817c838f9ca9aa9e93887b6e62544a3f34281c0a00000000000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f1208000000000000000000000714212e3a4754616d7a86929facaa9c8f8276685e5246392a2025313b4855626e7b8895a0aca196897d7063554b4035291d100400000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e130800000000000000000000000c1926333f4c5966727f8c99a8afa499887b6e6255483e332924212020212328333f4a5464717d8a97a4b1a7988b7e7265584b3f3225180c0000000000000000000203101d2a3643505d69768390908376695d5043362a1d10030200000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000b13202d3a4653606d7985929eaba49a8c8073655b5044372b1f1207000000000000000000000000000000000000000815212e3b47535f6a7784919daaac9c8f83766a5f53443a301f160c0000000000000000000000000000000000000000000000020f1a26313c4754616e7b87939faca7998c807366584e43372b1f1306000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000714212e3a4754616d7a86929facb9b2a89a8e8174675d5145382c1f140800000000000000000000000000000000000613202d394653606c7883909da6b0a79f92877d726d6662605b545c6062656c717a8390969285929facafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000007101a232c353e454e545c60676d71767a7d7f828385858686858482807d79757d89949faba69b8f82756a5f5342382e23170b000000000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d0000000000000000000006131f2b37434e5865727f8b99a3aea2988b7e7164564c41362a18212e3a47535f6a7784919daaa89b8e8174675d5145392c1f14090000000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000000020f1c2935424f5c6875828f9ba8ac9f9386796c605346392d20181413141418222d3c4956626f7c8995a2afa79a8e8174675b4e4134281b0e01000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a050000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000305101d2a3643505d69768390908376695d5043362a1d1005030000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c010000000000000000000000000000000000000000000005111d2a36414c5664707d8a97a1adac9e9184786c605346392f24180c000000000000000000000000000000000000000916222f3c4955626f7c8896a0aca49a8b7e7265574e4232281e0d040000000000000000000000000000000000000000000000000a15202d3a46525e697683909da9aa9e9184776a5f54473b2e221506000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000000000006131f2b37434e5865727f8c99a3aeb7b8ab9f9285796d6053473b3025190e02000000000000000000000000000000030f1c28333f4a5463707c8995a0acab9f958b7f726b605c5453504a5153555a61686e7a8491989298a2aeafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0600000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000000008111a232c333c424a50555c6064676d707375767878797978777673716d7883909da6ac9e93887c6f62584e4330261c110600000000000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e05000000000000000000000815222e3b47545f6a7783909dabac9f92867a6d6054473b3025191e2b37424e576673808c99a8ab9f9285796d6053473b3025190e0200000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e04000000000000000000000003101d2a3643505d697683909ca9ab9e928578665b5044382b1f120707070715222e3b4855616e7b8894a1aea89b8f8275685c4f4235291c0f0200000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b16100901000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000060b0f12131d2a3643505d69768390908376695d5043362a1d13120f0b06000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c20130400000000000000000000000000000000000000000000000713202d3946525e6875828f9ba9b3aca196897c6f63554b4035291d1004000000000000000000000000000000000006131f2b37434e586673808d99a8ac9f93877b6e6154473c3121160c0000000000000000000000000000000000000000000000000005111e2a36424d5765727f8c98a9aca096887c6f6255493c2d22170b000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000000000000000815222e3b4754606a7783909dabacababaea2988a7e7164564c41362a1e110500000000000000000000000000000006121f2b3844505b6674818e9ba7b1a99d9083786c6059504a46444044464850565e68707d89939fa2aab4afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca79a8d8174675a4e412d22170b00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000000000000008111a212a30383f444b5153555d606366686a6b6c6c6c6b6b696668717e8b95a0aca49a8f82756a5f54463c311e140a000000000000000000000000050e172029313940454f54596063676d70727576787879797878777573706d6865605d55504a423c332b231911070000000000000000000004101c2834404b55626f7c8895a0aca99b8e8175675d514539291e141a26313c4955626f7c8896a0aca2988a7e7164564d42362a1e11050000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c00000000000000000000000004111e2b3744515e6a7784919daaab9e9184786b554b4034281c100400000814212e3b4754616e7a8794a1ada99c908376695d5043362a1d1003000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a010000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000020a11171b1f202a2d3643505d69768390908376695d5043362d2a201f1b17110a0200000000000000000000000000101d2a3643505d69768390908376695d5043362a1d10000000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000714212e3a4754616d7a86929facb9b2a89a8e8174675d5145382c1f140800000000000000000000000000000000000815222e3b4754606a7784919eaaa99c908376685e5246392d20140400000000000000000000000000000000000000000000000000020e1a25303b4855616e7b8896a1ada8998c7f7366544a3f33281c0f030000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000004101c2834404b55626f7c8895a0a8a19e9fa2aa9c8f8275685e5246392d20150a0000000000000000000000000000000613202d394653606c7985929eabada1978a7d70655b50443f393834383a3e444c56606b75828f9ba8b1bcafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca89b8e827568544a3f33281c0f03000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000000000030e1a242f3841474c4e4c474c515457595b5d5e5f5f5f5f5e59616d7a85929ea7a89f93877c6f62584e43342a200c0200000000000000000000000000050e171f272f343d43484f54555c606366686a6b6c6c6c6c6b6a686664615e5653514b443f38302a21191108000000000000000000000006131f2c3845515c6774808d9aa7ada1978a7d7063554b413529170d15212e3b47535f6a7784919eaaaa9c8f8276695e52463a2d20150a00000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e0400000000000000000000000004111e2b3744515e6a7784919daaab9f928578675c5145382c1f130f0b0c1015222f3b4855626e7b8895a1aea99c8f8376695c504336291d100300000009131c252c33373939393943505d69768390908376695d50433939393937332c251c13090000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000020b141b22272b2d37393943505d69768390908376695d50433939372d2b27221b140b0200000000000000000000000811192a3643505d69768390908376695d5043362a1911080000000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d010000000000000000000000000000000000000000000006131f2b37434e5865727f8c99a3aeb7b8ab9f9285796d6053473b3025190e02000000000000000000000000000000000916222f3c4955626f7c8896a0aca8988c7f7265564d41362a1e110500000000000000000000000000000000000000000000000000000914212d3a46535f697884919eaba99c8f8276665b5044382b1f12060000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000006131f2c3845515c6774808d9aa7a196919298a29f92867a6e6154473c31261b0f0000000000000000000000000000000916222f3c4955626f7c8897a1adab9e9285796d6053493f342e2b282c2d323b444f59626f7c8995a0acb8afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0aca99c8f8376665b5044382b1f120700091623303c4956636f7c8996a2afa4988b7e7165584b3e3225180b00000000000000000008141f2b36414a52585a5954524c474a4c4f50525253534c56616b74818e97a1ada1968d81746a5f54463c3222180e000000000000000000000000000000050d151d232932383d44484b515356595b5d5e5f5f5f5a61646c6c6c6c66635c524739342e261e180f080000000000000000000000000713202d3a4653606d7985929eabab9e9285796d6053463a2f241807131f2b37434e586773808d9aa8ac9f93877b6e6154473c32261b0f0000000000000000000009121c252e363e454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b11080000000000000000000000000003101d2a3643505d697683909ca9aea29886796d6053463a2f241f1c17181c1f262f3d495663707c8996a3afa89b8f8275685c4f4235291c0f02000005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b100500000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000a141d262d33373943464646505d69768390908376695d50464646433937332d261d140a0000000000000000000009111a232b3443505d69768390908376695d5043342b231a110900000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000815222e3b4754606a7783909dabacababaea2988a7e7164564c41362a1e110500000000000000000000000000000003101c28343f4a546673808c99a8ada196887b6e6155483b3025190e02000000000000000000000000000000000000000000000000000005121e2a36424d576875828f9ba8ab9f9285796c605346392d2013060000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000000000713202d3a4653606d7985929fab9e918485929fa3998c7f7265584e43372b1c110600000000000000000000000000000c1926323f4c5965727f8c98a9b3a89b8e8175665c5041382d231f1c1f2029323d4854606a7784919daab7afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acab9f9285796c605346392e23180d060a1723303d4a5663707d8996a3b0a4978b7e7164584b3e3125180b0000000000000000000b1724303c47525c646766615e56544e46454045453f49535d68707d8a939da9a59e91847a6d60584e43342a200f0600000000000000000000000000000000030b121821272c323839404546494c4f50514a505b636c7079797979736e63574b3f32231c150c0600000000000000000000000005111e2a36424d5664717d8a97a2ada89a8d8174665c514438281d13070f1b26323c4956626f7c8996a1ada4998c7f7265584e43372b1c1106000000000000000000000a131c242c333b42464d5355575f626466696a6b6b6c6c6c6b6a686663605d55544f47423c332d241b13090000000000000000000000000000020e1b2835414e5b6874818e9ba7b3aa96897c6f63554b40352f2b282223282c3038414e5865727f8c98a5b5ab9a8d8073675a4d4034271a0d0100000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a00000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000006111b262f383f444650535353535d69768390908376695d535353535046443f382f261b1106000000000000000006121b232c353d464e576976839090837669574e463d352c231b1206000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000000000000000000000000000004101c2834404b55626f7c8895a0a8a19e9fa2aa9c8f8275685e5246392d20150a00000000000000000000000000000006121f2b3844505c6676828f9ca9ab9e918478695f53463a2d1f1408000000000000000000000000000000000000000000000000000000020e1a26313f4c5965727f8c98abaea298887c6f6255483c2f2215090000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000000000005111e2a36424d5764717e8a97a2a99a8d80818e9baa9d9083776a5f5347382e23170b00000000000000000000000000020f1b2835424e5b6875818e9ba8b5ab988b7e7165544a3f2f261b12101217202c38434e586673808d99abb5afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acada297887c6f62544a4034281f1612101724313e4a5764717d8a97a4b0a4978a7e7164574b3e3124180b0000000000000000000d1a2633404c58646e74736e6862605853514b464244505b656d7a84919ea5a79e938a7d70675d51463c3222190e00000000000000000000000000000000000001070c161b21272c2e34383a3d3f42444c545c606d727e868686868073665a4d4033271a0a03000000000000000000000000000714202d3a46525e6975828f9ca9aca096897c6f63544a403428160c010a13202d394653606c7884919eabab9d9084776a5f5347382e23170c00000000000000000000010a121a212930363c4247484e5355585a5c5d5e5f5f5f5f5e5d5b595653514b48433d37312a211b1209010000000000000000000000000000000c1925323f4c5865727f8b98a7b1a6998c8073675d5145403938332d2e34383a4149535f6a76828f9ca9afa4998a7e7164574b3e3124180b0000000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f00000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000b17222d38414950535d6060606060697683909083766960606060605d53504941382d22170b000000000000020a1117242d363e474f585f69768390908376695f584f473e362d2417110a0200000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000000000000000000000000000006131f2c3845515c6774808d9aa7a196919298a29f92867a6e6154473c31261b0f0000000000000000000000000000000713202d3a4653606d7985929faba89b8e827568574d42362a1e0d0200000000000000000000000000000000000000000000000000000000091623303c4956636f7c8999a3aeaa988b7e7265584b3f322518070000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000714202d3a46525e6976828f9ca9a297897d7d8a98a2a095887c6f62544a3f34281c100300000000000000000000000005111d2a36414c566a7784909daaafa499887c6f6255483c2e22140a04060e1b27323d495663707c8999a4afafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acb3a9998c7f73665c51443b3128201f1c1f25323f4c5865727f8b98a5b0a3968a7d7063574a3d3024170a0000000000000000010e1b2734414e5a6774807f7a756f6a64605c55524d505a606c77828f96a1a9a0958e81756b61554c41342a2010070000000000000000000000000000000000000000040a0f161b1d23282c2d343d454d565d666d747f87929892857b6e6154473b2e21140800000000000000000000000000000814212e3b4754616e7b86929facaa9e9184776b605442392e2318040005121f2b3744505b6574808d9aa9aca095887c6f62544a3f34281c10030000000000000000000000080f171f252a31373a3c4247484b4d4f51515253535252504f4c4a4745403938322b2620180f0900000000000000000000000000000000000815222f3b4855626e7b88959fabab9e9185796d605a514b46443f42424045464c525b656e7b87939facac9f93867a6e6154473b2e211408000000121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e1200000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000030f1b27333f49535b606a6c6c6c6c6c6c7683909083766c6c6c6c6c6c6a605b53493f33271b0f0300000000020b141b2227363f485059606a6f7b859191857b6f6a605950483f3627221b140b02000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000713202d3a4653606d7985929fab9e918485929fa3998c7f7265584e43372b1c110600000000000000000000000000000916222f3c4955626f7c8898a2aeab988c7f7265594c3f31261a0e02000000000000000000000000000000000000000000000000000000000714202d3a4753606d7986929faca79b8e8174685b4e412e23180c0000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000814212e3b4754616e7b87939fab9e9285797985929fa79a8d8073665c5044382b1f13070000000000000000000000000713202d3946525e687985929facac9f93867a6d6053473a2d20140700000a14202d3a4753606d7a86939facafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acb8ab9e9184796d60574d433a322d2c282b2d36414c566774808d9aa7b3aa95897c6f6256493c2f2316090000000000000000020f1c2935424f5c6875828c86817c76716d67615e5759616c727f8c949ea9a2979083796d60594f433a2f22190e0000000000000000000000000000000000000000000000040b0c151d2328363e464f575f686d78818c939993877d70695e52463a2d2014070000000000000000000000000007131f2c38434f5966727f8c99a3afa7998c807366594f4330271c120700030f1b27333f495363707c8997a1ada79a8d8074665c5044382c1f1206000000000000000000000000050d141a1f262b2e31373a3b3e4042444545464646454442403d3a38352f2c27211a150e060000000000000000000000000000000000000814212e3a47535f6a7683909da6ada1978c80736c605c5553504a4e4f4b5153565d616c77828f99a4afa69c8f8276685e5246392d20140700000013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d201300000000000000000000101d2a3643505d69768390908376695d5043362a1d0a0000000000000000000005121f2b3744505b656c76797979797979798390908379797979797979766c655b5044372b1f1205000000000a141d262d334048505a616b6f7c8591979791857c6f6b615a504840332d261d140a000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d010000000000000000000000000000000000000000000005111e2a36424d5764717e8a97a2a99a8d80818e9baa9d9083776a5f5347382e23170b00000000000000000000000000000c1825323f4b5865727e8b98aaaea399897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000006131f2c3845515c677784919eaaa99c90837669554b4034281c100400111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000007131f2c38434f5966727f8c99a4aa9b8e817475818e9baa9e9184796d6053463a2f24180d0100000000000000000000000714212e3a4754616d7a8798a2aeab9e918478675c5145382c1f1306000006131f2c3945515d677784919eaaafa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acb9ada1968b7e71695e554c443e3a383437393e46525e687683909ca9aea298877a6e6154473b2e2114080000000000000000020f1c2935424f5c6875828f928e89837e79736e6963606b707e88939fa6a39992857b6e675d51473e31281e10070000000000000000000000000000000000000000000000060e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e1105000000000000000000000000000915222f3b4854606b7784919d9f9f9f95887b6e6255483d3222150b0000000b17222d3a4653606d7985929e9f9f9e9185796d6053463a2d2013070000000000000000000000000002090e151a1e21262b2e2f31333637383839393938373533302d2c29241d1b160e09030000000000000000000000000000000000000006121e2b37424e5764707d8a949fa9a99c928b7e746d6762605b545b5b555c6062686d75808d949eaba99e94897d7063564c41362a1e110500000013202d394653606c798686868686868686909494908686868686868686796c605346392d2013000000000000000000020b142a3643505d69768390908376695d504331261a0b020000000000000000000613202d394653606c798386868686868686909494908686868686868683796c605346392d20130600000006111b262f383f44515a626c707d8591938e8e9391857d706c625a51443f382f261b11060000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000714202d3a46525e6976828f9ca9a297897d7d8a98a2a095887c6f62544a3f34281c1003000000000000000000000000020e1b2835414e5b6874818e9ba7ac9f9286796d6053473a2d201407000000000000000000000000000000000000000000000000000000000004101c2934404b556976828f9ca9ab9e918478675c5145382c1f130600111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000000000915222f3b4854606b7784919eaba2988a7d70707d8a98a2a197897d7063554b4135291d110400000000000000000000000915222f3c4855626f7b8895aab4a99d9083766a554b4034291c1004000004101d2935404b556976828f9ca9afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acb1a8a09d92857b6e675e56504846443f4446484f58616d7a86929facab9f928578695e52463a2d2014070000000000000000020f1c2935424f5c6875828f999b95908b85807b756f6b6f7d86929aa4a49f92877d70695f554b41352c1f160c0000000000000000000000000000000000000000000000070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e0200000000000000000000000000091623303c4956636f7c8996939393939083776a5f53473a2e21140300000006121f2b3844505c6674818e93939393978a7d7063574a3d3024170a00000000000000000000000000000003090e12151a1e21222527292a2b2c2c2c2c2b2a282623201f1d18120f0a04000000000000000000000000000000000000000000020e1a26313c4955616c76828f97a1aaa49f93888079736f6c6669686869676d6f747a818d929ca6aaa1978f82766b6055443b3025190e0200000013202d394653606c798693939393939393969696969393939393939386796c605346392d20130000000000000000000a141d2b37434e586976839090837669584e43372b1d140a00000000000000000005121f2b3744505b656f7c899393939393939c9f9f9c939393939393897c6f655b5044372b1f12050000000b17222d384149505b636c717e8692928c81818c9292867e716c635b504941382d22170b0000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c0100000000000000000000000000000000000000000000000814212e3b4754616e7b87939fab9e9285797985929fa79a8d8073665c5044382b1f130700000000000000000000000004101c2934404b55697683909ca9aa9e918477675c5145382c1f13060000000000000000000000000000000000000000000000000000000000000c18232f414e5b6774818e9aa7ac9f9386796d6053463a2d20130700111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000004101d2935404b55636f7c8996a0ab9f9285796d6d7985929fa99b8e8175675d5145392c20140900000000000000000000000a1623303d495663707c8996a3afa89c8f8275695c4f422f23180c000000000c18242f414e5a6774818d9aa7afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508000000000000000000000713202d3a4653606d798693a0acaca09591959082796d68615a5553504a50535459616a73808c99a3afa99c8f827669564d42362a1e11050000000000000000000d1a2633404d59667380878c91979c97928c86827c777c859298a2a49a938b7f726b60574d433a2f231a0d0400000000000000000000000000000000000000000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f140900000000000000000000000000000e1b2834414e5b677481868686868686867f7265574e42372b1e120600000003101c28343f4a5463707d868686868686868175685b4f4235281c0f00000000000000000000000000000000000206090e121415181a1c1e1e1f20201f1f1d1c19171413100c07010000000000000000000000000000000000000000000000000915202d3944505a616e7b859298a1a9a49a938d85807b79767575757677797c81858e939ca4a9a19892857b6e61594f4432291e14080000000013202d394653606c798693928d8989898989898989898989898d929386796c605346392d2013000000000000000006111b262f3847535f6a7683909083766a5f53473d2f261b11060000000000000000030f1b27333f4953606b75828f99a39f9f9fa9ababa99f9f9fa3998f82756b6053493f33271b0f030000030f1b27333f49535b606d737e8792928b807474808b9292877e736d605b53493f33271b0f0300000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c201304000000000000000000000000000000000000000000000007131f2c38434f5966727f8c99a4aa9b8e817475818e9baa9e9184796d6053463a2f24180d01000000000000000000000006131f2c3845515c677885919eaba99c8f827669554b4034291c1004000000000000000000000000000000000000000000000000000000000000071926333f4c5966727f8c99a5afa49a887b6e6255483b2f22150800111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000613202c3945515d6774818e9aa8aa9b8e8175676775818e9baa9f92867a6d6054473b31251a0e02000000000000000000000a1724313d4a5764707d8a97a3b0a89b8e8175685b4e4235281b0700000000071a2633404d596673808c99a6afa295887c6f6255493c2f2216090000000000000c1925323f4c5865727f8b98a5aea194887b6e6155483b2e221508080400000000000000000713202d3a4653606d798693a0acaa9d9184919590837a716c6662605c545b6061646b707c87929fabb0a6998c7f7266594c3f3025190e020000000000000000000c1926323f4b57636e737b80858a90949a99928e8984869297a2a49a93887f726d62594f453b3128221c140b020000000000000000000000000000000000000000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d0200000000000000000000000000000d1a2733404c59646f7479797979797979726d6256453c31261a0e02000000000b17232e384855616b7079797979797979756f65594d4034271b0e0000000000000000000000000000000000000000020608080b0d0f11121213131312110f0d0a07060400000000000000000000000000000000000000000000000000000003101c28333e46525e696f7c8692979fa6a49f97918c888583828182828386898d92989ea5a69f9792867c6f695e52473d3320170d020000000013202d394653606c7986938d807d7d7d7d7d7d7d7d7d7d7d7d808d9386796c605346392d201300000000000000000b17222d38414f59626f7c879292877c6f62594f41382d22170b0000000000000000000b17222d38414f59616e7b86929fa9b3acb6b7b7b6acb3a99f92867b6e61594f41382d22170b00000005121f2b3744505b656c747f8b9292877e736d6d737e8792928b7f746c655b5044372b1f120500000b1825323e4b5865717e8b98a4aca295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000915222f3b4854606b7784919eaba2988a7d70707d8a98a2a197897d7063554b4135291d110400000000000000000000000714202d3a4753606d7a86939faca79a8e8174675b4e412f23180c000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b6ac96897d7063564a3d3023170a00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000714202d3a4753606d7a85929faca3988a7d716464707d8a98a2a2988b7e7165574d42362a1e1205000000000000000000000b1724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b0e010000000c1926323f4c5965727f8c98a5afa295887c6f6255493c2f2216090000000000050c1925323f4c5865727f8b98a5aea194887b6e6155483b2e22171614100b050000000000000713202d3a4653606d798693a0aca4978a7e85929590847e77726f6d666b656c6e71767d859299a3aeac9f94887b6e6155483b2e221509000000000000000000000a17232f3b47525c63696e73797e83888d92989b95909298a2a99f93887f726d625b514c47433c332d261d140a00000000000000000000000000000000000000000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e050000000000000000000000000000000b1824303c48535d64676c6c6c6c6c6c6c65625b5146332a201509000000000006111c2c38444f5961636c6c6c6c6c6c6c68655d53483d3125180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222a36424d57606a6f7c858f949ea1a8a19e999892908f8e8e8f9092999a9fa2a8a09e948f857c6f6a60564d42352c210e05000000000013202d394653606c7986938b7e7270707070707070707070727e8b9386796c605346392d201300000000000000030f1b27333f4953606b75828f99998f82756b6053493f33271d1207000000000000000006111b262f3d46535f6974808d97a2adbac3c4c4c3b9ada2978d8073695f53473d2f261b11060000000613202d394653606c77808c9192867d716c63636c717d8692918c80776c605346392d20130600000b1825323e4b5865717e8b989f9f9f95897c6f6256493c2f23160900000d1a2733404d5a6673808d999f9f9f9386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d010000000000000000000000000000000000000000000004101d2935404b55636f7c8996a0ab9f9285796d6d7985929fa99b8e8175675d5145392c20140900000000000000000000000815222f3b4855626e7b889aa4afa5998c7f7266594c3f3326190700000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afa4978b7e7164584b3e3125180b00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000005121e2a36424d5764717e8b98a2ac9f92867a6d60606d7985929faa9c8f8376695e53463a2d21160a000000000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e010000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000000000810171c25323f4c5865727f8b98a5aea194887b6e6155483b2e262423201c17100800000000000713202d3a4653606d798693a0aca4978a7e7e8b9296918a837f7b79787778797b7e828a9297a2abafa49a8f8276695f53473a2d2114080000000000000000000007131f2a35404a52575e61666d71767c81869196a09d9fa2aaa6998c8075706b65605d55534e443f382f261c1106000000000000000000000000000000000000030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b1108000000000000000000000000000000000814202b36414a53595b60606060606060595651493f3521180e03000000000000101c28333e474f5557606060606060605b59534b41372c2014080000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c0906060300000000000000000000000000000000000000000000000000050e1a25303b454e58606a6f7b828b91969c9fa3aaa29f9d9c9b9b9c9d9fa3aba39f9b96918a827b6f6a60584e443b30231a0f00000000000013202d394653606c7986938b7e7265636363636363636365727e8b9386796c605346392d2013000000000000010c161f2b3744505b65707d89949e9e94897d70655b5044392e23180c0100000000000000000a141d2b37424d57606d7a85929fa8b2bdc8c8bdb2a89e92857a6d60574d42352b1d140a000000020f1b2835424e5b6875818d9292857c706b625a5a626b707c8592928d8175685b4e4235281b0f02000b1825323e4b5865717e8b9393939393897c6f6256493c2f2316110b0b101a2733404d5a6673808d939393939386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e130800000000000000000000000000000000000000000000000613202c3945515d6774818e9aa8aa9b8e8175676775818e9baa9f92867a6d6054473b31251a0e02000000000000000000000a1724303d4a5763707d8a96acb6a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000000714212d3a46535f6976838f9caaaa9b8f8275675d5d6775828e9baa9f93877b6e6154483d32271b0f000000000000000000000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e010000000b1825323e4b5865717e8b98a4afa295887c6f6255493c2f22160900000008121a22282d323f4c5865727f8b98a5aea194887b6e6155483b333331302d28221a1108000000000713202d3a4653606d798693a0aca4978b7e74818e949e95908c888685848585878b8f949fa2a9aea59f93877c6f62574d42372b1e120600000000000000000000020e19242e3840454d52545c60646a6f747b84919eaba39f9da09f9287827d77726d67625f58504a42382d22170b00000000000000000000000000000000000007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000000000000000000000000000030f1a252f3841484c4e535353535353534c4a463f372d230f06000000000000000b16212c353e44484a535353535353534f4d4841392f251a0f0400000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b0600000000000000000000000000000000000000000000000009141f29333d464e5860696e767e848a8f9299999b9d9e9f9f9f9f9e9d9b9999928f8a847e766e6960584e463d32291f110800000000000013202d394653606c7986938b7e7265585656565656565865727e8b9386796c605346392d201300000000000008131e2834404b54606c7883909da6a69d9083786c60544b4034281e13080000000000000000020b1a26313c45525d68727f8c96a0acb9c2c7b8aca0968b7f72685d52453b3123190b02000000000b1724313e4a5764717e869293877f746d665d5d666d747f879392867e7064574a3d3124170a00000b1825323e4b5865717e868686868686867c6f6256493c2f23221d16161b202733404d5a66738086868686868686786d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c0100000000000000000000000000000000000000000000000714202d3a4753606d7a85929faca3988a7d716464707d8a98a2a2988b7e7165574d42362a1e1205000000000000000000000b1825313e4b5864717e8b97a4afa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aea5988c7f7265594c3f3226190c00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000000030f1c28333f4a54616e7b87939faca2988a7e7164555564717e8a98a3a49a8c7f7366584e43372b1d12070000000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e010000000b1825323e4b5865717e8b98a4afa295887c6f6255493c2f221609000005101a242c33393c3f4c5865727f8b98a5aea194887b6e6155484040403d3c39332c231a10050000000713202d3a4653606d798693a0aca5988b7e7278828e939f9d999a939291919298979c9fa6adaba39f938d80736a6054453c31261a0e0200000000000000000000030e18212a31373e434b51575e666c727c849196a1a0999290959b99928f89847f7a746f6a605b544a3f33281c0f0300000000000000000000000000000000000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b0200000000000000000000000000000000000008131d262f363c4041464646464646463f3e3a352d251b11000000000000000005101a232c33383c3d4646464646464642403d372f271e13090000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a03000000000000000000000000000000000000000000020d17212b343d464e565e616c71787e82868a8c8f90919292929291908e8c8986827d78716c615e574e463d342b20170d0000000000000013202d394653606c7986938b7e7265584b4a4a4a4a4b5865727e8b9386796c605346392d20130000000000010d19242f3845515c66717e8a959fabab9f958a7e71665c51453a2f24190d02000000000000000009141f2935414c56606d7984919ea6b0bebeb0a69e9184796d60564c41332a1f100700000000000a1623303c4955616c717d8692938c80786d67676d78808c9392867d706c6155493c3023160a00000b1724313d4a56626c71797979797979796f6a6054473b36332e272021272c2f303f4b58636e737979797979797976665c5044382c1f1206000000000000000000000000000000000000000000000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c201304000000000000000000000000000000000000000000000005121e2a36424d5764717e8b98a2ac9f92867a6d60606d7985929faa9c8f8376695e53463a2d21160a000000000000000000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aea6998c7f7366594c403326190d00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000006121f2b3844505b6673808c9aa4ac9f92867a6d605454606d7a86929fac9d9184776a605447392e23180c0000000000000000000b1724313e4a5764717d8a97a4b0a79a8d8174675a4e4134271b0e010000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f22160900000c17222c363e45494a4d5865727f8b98a5aea194887b6e61554d4d4d4d4a49443e362c22170b0000000713202d3a4653606d798693a0aca5988b7f726d78818b92989fa29f9e9e9e9fa3aaa9a9aaa29f99928b81786d60584e43332a1f1509000000000000000000000009151f2a333c42474f555c60696e787f879196a09f95918684898e92989b95918b85817c766c665b5044382b1f120600000000000000000000000000000000000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e0400000000000000000000000000000000000000010b141d252b3033343939393939393932312e29231b130900000000000000000008111a21282c2f30393939393939393534312c251e150c02000000000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e09030000000000000000000000000000000000000000050f19222b343c444d525a61666d71757a7d80828385858686858483827f7d7a75716d66615a524d453d342b22190e050000000000000013202d394653606c7986938b7e7265584b3f3d3d3f4b5865727e8b9386796c605346392d2013000000000004111d2935414c56606d7984919ea7b1b1a79e9184796d60564c4135291f14090000000000000000030d1924303a44515c66707d8a949facb6b6ac9f948a7d70665c51443a3021180e0000000000000814212d3944505a616b707c8591928d82796e6e79828e9291857c706b615a5044392d20140800000915212e3a45505a62656c6c6c6c6c6c6c6260584e4344433f3932292b32383b3d4647525c63666c6c6c6c6c6c6c6c5c544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000714212d3a46535f6976838f9caaaa9b8f8275675d5d6775828e9baa9f93877b6e6154483d32271b0f000000000000000000000c1926323f4c5965727f8c98a5aea195887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0ada6998d8073665a4d4033271a0d00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000000000613202d394653606c7884919eaca99b8e8175675d51515d6775828f9caba096897c6f62544b4034281c100400000000000000000a1724303d4a5763707d8a96a3b0a89b8e8175685b4e4235281b07000000000c1926323f4c5965727f8c98a5afa295887c6f6255493c2f2216090005111c28333e48505557595965727f8b98a5aea194887b6e615959595959575550483e33281c100400000713202d3a4653606d798693a0aca5998c7f72666d757f868d92989a9c9e9e9f9f9e9d9c9998928d867f746d665c50463d3221180e0300000000000000000000020e1a26313c454d535961676d727b828c92999f99928d837c777c81868c91969c98928d8882786c605346392d20130600000000000000000000000000000000000d1a2633404d59667380868686868686868680746c61574e43392f251b1007000000000000000000000000000000000000000000020b131a202427282d2d2d2d2d2d2d2625221e18110901000000000000000000000810161c2023242d2d2d2d2d2d2d282725201a130c03000000000000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b060000000000000000000000000000000000000000071019222b323b424650545c6064676d70737577787979797878767573706d6764605c545046423b332b22191007000000000000000013202d394653606c7986938b7e7265584b3f3d3d3f4b5865727e8b9386796c605346392d201300000000040e18222c3945525d68727f8b96a0acb9b9aca0968b7f72685d52453b30251a0e04000000000000000008131e2834404a54616c7682909aa4afafa49a9082766c61544a4032281e0f0600000000000004101c28333e485059606a6f7b8490948f837a7a838f9490847b6f6a605950483e33281c1004000005111d29343f485056586060606060606056544e5353514f4a443b32353d44484953535352585a606060606060605f504a42382e23170c000000000000000000000000000000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000030f1c28333f4a54616e7b87939faca2988a7e7164555564717e8a98a3a49a8c7f7366584e43372b1d12070000000000000000000d192633404c5966737f8c99a6aea194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada79a8d8074675a4d4134271a0e00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000004111d2935414c5663707d8996a1aca1978a7d7063554b4b5564717e8b99a3a89a8d8174665c5145382c1f130800000000000000000916232f3c4956626f7c8995acb6a89c8f8275695c4f422e23180c000000000d1a2633404d596673808c99a6afa295887c6f6255493c2f221609000814212d3945505a6164666666727f8b98a5aea194887b6e66666666666664615a5044392d20140800000713202d3a4653606d798693a0aca6998c7f7366606d727b80858a8d8f9192929291908f8c8985807b726d605c544a3f342b200f06000000000000000000000006121e2b37424d575f616b70797f868f949f9d948f8780796f6a6f747a7f84898f93999a9486796d6053463a2d20130700000000000000000000000000000000000c1925323f4b57636d737979797979797979746e645a50453c31281d1209000000000000000000000000000000000000000000000001080f14181a1b20202020202020191816120d0700000000000000000000000000050b10141617202020202020201c1b18140f09020000000000000000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a0200000000000000000000000000000000000000071019202930363e424a5053555d606366686a6b6c6c6c6c6b6a686663605d5553504a423e3630292119100700000000000000000013202d394653606c7986938b7e7265584b4a4a4a4a4b5865727e8b9386796c605346392d2013000000000a15202a36424d57606d7a85929ea8b2bdbdb2a89e92857a6d60574d42362a20150a0000000000000000020c18232e3942505a626f7c87939faaaa9f93877c6f625a5042392e20160c00000000000000000b17222c363e474f585f696e7a839094908484909490837a6e695f584f473e362c22170b000000010c18222d363f454a4b5353534c525f6060606060605d5b554d44393d474f54566060606060605a58535353535353443f3830261c11060000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e1308000000000000000000000000000000000000000000000006121f2b3844505b6673808c9aa4ac9f92867a6d605454606d7a86929fac9d9184776a605447392e23180c0000000000000000000d1a2734404d5a6773808d9aa6ada094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0ada79a8d8074675a4d4134271a0e00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000613202c3945525d6875818e9ba8ab9e9285796d6053464754616d7a86929fab9e9285796d6053463a3025190d01000000000000000815222e3b4855616e7b889aa4afa99d9083766a554b4034281c10040000010e1b2834414e5b6774818e9aa7afa295887c6f6255493c2f221609000a1723303c4955616c71737373737f8b98a5aea194887b73737373737373706c6155493c3023160a00000713202d3a4653606d798693a0aca6998d8073665b62686e74797d808284858685858482807d7a746e69625b504a42382e22190f0000000000000000000000000814212d3a47535f696e757d848c92989395908a827c736d676062686d72787d82878d929786796d6053463a2d20130700000000000000000000000000000000000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c000000000000000000000000000000000000000000000000000003080b0d0e131313131313130c0b090601000000000000000000000000000000000407090a131313131313130f0e0c0804000000000000000000000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b0300000000000000000000000000000000000000070e171f252a30383f44464c515457595c5d5e5f5f5f5f5e5d5b595653514b46443f38302a251f170f070000000000000000000013202d394653606c7986938b7e7265585757575757575865727e8b9386796c605346392d2013000000020b1b26313a46525e6973808d97a1adbac4c4b9ada1978d8073695e52463c31261b0b02000000000000000007121c27303e4754606a75818e98a2a2988e81756a6054483e30271c0e04000000000000000005101a242c353d464e575f686e7a828f949191948f827a6e685f574e463d352c241a10050000000006111b242d343a3d3e46414c565e6c6c6c6c6c6c6c6a675f554a3f444f5960636c6c6c6c6c6c67645c534846464638342e261e150a0000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000613202d394653606c7884919eaca99b8e8175675d51515d6775828f9caba096897c6f62544b4034281c100400000000000000000e1a2734414d5a6774808d9aa7ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0ada6998d8073665a4d4033271a0d00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000000000714212d3a4754606d7a86929faca89a8d8174665c514446525d6876828f9caba2978a7d7064564c4135291d1105000000000000000714202d3a4753606d7a86939facab9e918478675c5145382c1f1306000004111d2935414c566976828f9ca9afa295887c6f6255493c2f221609000b1724313e4a5764717e80808080828f9ca8b3a79a8d80808080808080807e7064574a3d3124170a00000713202d3a4653606d798693a0aca6998d8073665a565e61666d7073757778797978777673706d67615e5751443f3830261c10070000000000000000000000000815222e3b4855616e7b8286868686868686837d766f6a605c55565d61656c70757b80858a867a6d6053473a2d201407000000000000000000000000000000000007131e2a35404952575960606060606060605a58524a40362c21180d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d0300000000000000000000000000000000000000050d14191e262e34383a4145474a4d4f50525253535251504f4c4a4745403a38342e261e1a140d05000000000000000000000013202d394653606c7986938b7e7265646464646464646465727e8b9386796c605346392d20130000000a141d2b37434e58616e7b86929fa9b3becccabeb3a99f92867b6e61584e43372b1d140a0000000000000000000b151e2b37434e58616e7b86929f9f92867b6e61584e43362c1e150b0000000000000000000008121a232b343c454d565e686d79828e93938e82796d685e564d453c342b231a120800000000000009121b22292e31323946525e68767979797979797771675b4f434854606b70797979797979746e64584c4039392c28231c150c0300000000000000000000000000000000000000000000000000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c201304000000000000000000000000000000000000000000000004111d2935414c5663707d8996a1aca1978a7d7063554b4b5564717e8b99a3a89a8d8174665c5145382c1f130800000000000000000e1a2734414d5a6774808d9aa7ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aea6998c7f7366594c403326190d00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000006121f2b37434e5865727e8b98a2aca096897c6f63544a40414c5665727e8b99a4a99b8f8275685e5246392d2015090000000000000006131f2c3845515c677885919eabac9f9286796d6053463a2d20130600000713202c3945525d687884919eabafa295887c6f6255493c2f221609000f1c2835424f5b6875828c8c8c8c8f949eaab5a99d928d8c8c8c8c8c8c8c8174685b4e4135281b0e02000713202d3a4653606d798693a0aca6998d8073665a4d52545c606367696b6b6c6c6b6a696663605d55534d453f342e261e140a000000000000000000000000000814212d3a47535f696e757979797979797976706b625f58514b4c52535b6063696e73797e83796d6053473a2d2014070000000000000000000000000000000000020d19242e3740474b4d53535353535353534d4c4740382f241a0f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a0d10111213131211100d0a07060400000000030505060606060606000000000000000000000000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d030000000000000000000000000000000000000002090c151c23282c2f35393a3d4042444546464645454342403d3a39352f2b28231c140c090200000000000000000000000013202d394653606c7986938b7e7270707070707070707070727e8b9386796c605346392d2013000006111b262f3847535f6a74818e98a2aebbb9b9b9b9baaea2988e81746a5f53473d2f261b11060000000000000000030c1b27323c46525e6973808d97978c8073695e52463c32241a0c030000000000000000000000081119222a333c444d565d676d78818d8d81786d675d564d443c332a2219110800000000000000000911181d21212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271f1c17110a0300000000000000000000000000000000000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d110400000000000000000000000000000000000000000000000613202c3945525d6875818e9ba8ab9e9285796d6053464754616d7a86929fab9e9285796d6053463a3025190d01000000000000000d1a2734404d5a6773808d9aa6ada094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aea5988c7f7265594c3f3226190c00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000000000814212e3a47535f6a7683909daaaa9e9184776b605442393b4754616e7b86939fac9f92867a6d6154473c31261a0e0000000000000004101c2934404b55697683909ca9afa399887b6f6255483c2e23170b00010714212d3a4754606d7a8796a1acafa295887c6f6255493c2f221609000f1c2835424f5b6875828e9999999c9ea6b0b9aea49d9a9999999999998e8174685b4e4135281b0e02000713202d3a4653606d798693a0aca6998d8073665a4d464b5153575a5c5e5f5f5f5e5d5c595654514b46423b3328231c140c020000000000000000000000000006121e2b37424d575f61696c6c6c6c6c6c6c6a636159534e45404146495053575e61666d71766d675d5145392c1f130600000000000000000000000000000000000007121c252e353b3f404646464646464646413f3c362f261d1208000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d111314171a1d1e1f1f201f1e1c1a171413100c07010c0f11121313131313130909070300000000000000000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b010000000000000000000000000000000000000000030a11171c1f24292c2d30333537383939393938373533302d2c29241f1c17110a02000000000000000000000000000013202d394653606c7986938d807d7d7d7d7d7d7d7d7d7d7d7d808d9386796c605346392d201300000b17222d38414f59626f7c87939faab4acacacacacacb4aa9f93877c6f62594f41382d22170b0000000000000000000a15202a36424d57606d7a85919185796d60574d42342b20110800000000000000000000000000071019212a323b444c555d666d748080746d665d554c443b322a2118100700000000000000000000060c1114212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000714212d3a4754606d7a86929faca89a8d8174665c514446525d6876828f9caba2978a7d7064564c4135291d1105000000000000000d192633404c5966737f8c99a6aea194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000003101c28343f4a54626e7b88959faba7998c807366594f43303946525e687683909ca9a3998b7f7265574d42372b1b1106000000000000000c18232f414d5a6774808d9aa7b5ab988b7e7165544a3f34281c100b0e131c2834404a5464707d8a97a8b2afa295887c6f6255493c2f221609000f1c2835424f5b6875828e9b9f9fa0acaeb5bdb1a9a3a19f9f9f9f9f9b8e8174685b4e4135281b0e02000713202d3a4653606d798693a0aca6998d8073665a4d404045464a4d4f5152535252514f4d4a4745413a3631292117110a020000000000000000000000000000020e1a26313c454d53555c606060606060605d57554f47433c3435383f44464d53545c606469605d554b4035291d1004000000000000000000000000000000000000000a131c242a2f323339393939393939393433302b241d140b0000000000000000000000000000000000000000000000000000000000000000000000000000000003090e13191d20212427292b2b2c2c2c2b292724201f1c18120e181c1e1f2020202020201615130f0a04000000000000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d120700000000000000000000000000000000000000000000060c1013191d20212426292a2b2c2c2c2c2b2a282623201f1d1812100b060000000000000000000000000000000013202d394653606c798693928d8a8a8a8a8a8a8a8a8a8a8a8a8d929386796c605346392d201300030f1b27333f4953606b76828f99a49f9f9f9f9f9f9f9f9f9fa4998f82756b6053493f33271b0f030000000000000000040e1a25303b45515d67727e8b8b7e71675d51453b3022190f000000000000000000000000000000070f182029323a434b545c606e73736e605c544b433a322920180f07000000000000000000000000010814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e1308000000000000000000000000000000000000000000000006121f2b37434e5865727e8b98a2aca096897c6f63544a40414c5665727e8b99a4a99b8f8275685e5246392d201509000000000000000c1926323f4c5965727f8c98a5aea195887b6e6255483b2f22150800000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afa4978b7e7164584b3e3125180b00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000006121f2c3844505c6673808d9aa7ab9f95887b6e6255483d3236414d5665727f8c98a7ab9d908376695f5347382d22170b00000000000000071824313e4b5764717e8a97a7b1a79b8e8174665c5044382b221b171a1d242c3844515c6674818d9aa7b4afa295887c6f6255493c2f221609000f1c2835424f5b6875828e939393939fa3abb5a99f98949393939393938e8174685b4e4135281b0e02000713202d3a4653606d798693a0aca6998d8073665a4d4034383a3d404244454646454443403d3a39352f2a251f170f06000000000000000000000000000000000009151f2a333c4247484f53535353535353504a48443e373129292d33373b42464b5153575d53514b43392f24180c0000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b02000000000000000000000000000000000000000000000000000000000000000000000000000000060e141a1e24292c2d3033363738393939383634302d2c29231d1a24282b2c2d2d2d2d2d2d23221f1b160f07000000000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e05000000000000000000000000000000000000000000000003080d111314171a1c1d1f1f20201f1e1d1c19171413100c070300000000000000000000000000000000000013202d394653606c798693939393939393939393939393939393939386796c605346392d20130005121f2b3744505b65707d8994939393939393939393939393939394897d70655b5044372b1f120500000000000000000009141f2935414b55606d788383786d60554b4033291f100700000000000000000000000000000000060e1720283139424a505c636767635c504a4239312820170e0600000000000000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000814212e3a47535f6a7683909daaaa9e9184776b605442393b4754616e7b86939fac9f92867a6d6154473c31261a0e000000000000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b6ac96897d7063564a3d3023170a00111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000000000713202d3a4653606d7985919eabab9d908377695f53473a2b303b4854616e7b8795a0ab9f95887b6e6253493f33271b0f030000000000000814212e3b4754616e7b8795a0acab9e9285796d6053463e342b2722262a2f35404b55606d7985929eabb8afa295887c6f6255493c2f221609000f1c2835424f5b68758186868686868b99a3aea3988d88868686868686868174685b4e4135281b0e02000713202d3a4653606d798693a0aca6998d8073665a4d40332c2d3034363838393938373633302d2c29241d1a140d05000000000000000000000000000000000000030e18212a31373a3b4246464646464646433d3c38332b26201b22272b3136394045464b504745403931271d120700000000000000000000000000000000000000000000070d1316191a20202020202020201a1a17130e0801000000000000000000000000000000000000000000000000000000000000000000000000000000070f181f262a2f35393a3d404344454646454443403d3a38342f2a252f3437383939393939392f2e2c272119100700000000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d02000000000000000000000000000000000000000000000000010406070a0d0f11121313131212100f0d0a07060400000000000000000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686796c605346392d2013000613202d394653606c798386868686868686868686868686868686868683796c605346392d201306000000000000000000030d18242f3a44505c66707d7d70665c50433a2f21170d000000000000000000000000000000000000050d161f2730383f4452585a5a5852443f3830271f160d050000000000000000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c201304000000000000000000000000000000000000000000000003101c28343f4a54626e7b88959faba7998c807366594f43303946525e687683909ca9a3998b7f7265574d42372b1b11060000000000000b1825313e4b5864717e8b97a4afa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5afa49a887b6e6255483b2f22150800111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000005111d2a36414c5663707d8a97a1ada3998c7f7265574d42372b2d3a46535e697783909daaa7998d8073655b5044372b1f12070000000000000714202d3a46525e697784909dabada1978a7d70635a50463d37332d31363a4045515d67717e8b97a1adb9afa295887c6f6255493c2f221609000e1b2834414d59656f75797979797987929faca194887b79797979797979746f64594d4034271a0e01000713202d3a4653606d798693a0aca6998d8073665a4d403327202427292b2c2c2c2b2a29262321201d18130e09030000000000000000000000000000000000000000060f181f262b2d2e363939393939393937302f2c28211b1511171b1f252a2e34383a3e433a39352f271f150b01000000000000000000000000000000000000000000000002070a0c0d13131313131313130e0d0b0703000000000000000000000000000000000000000000000000000000000000000000000000000000030b1218212a31363a4145474a4d505152525352514f4d4a4745403936313a4044454646464646463c3b38322b22190f0400000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979766c5f5346392d20130005121f2b3744505b656c77797979797979797979797979797979797979776c655b5044372b1f12050000000000000000000007131d28343f4a54606b70706b60544a3f31281d0f0500000000000000000000000000000000000000040d151e262e3440474b4d4d4b4740342e261e150d04000000000000000000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d1104000000000000000000000000000000000000000000000006121f2c3844505c6673808d9aa7ab9f95887b6e6255483d3236414d5665727f8c98a7ab9d908376695f5347382d22170b0000000000000a1724303d4a5763707d8a96acb6a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7ac9f9386796d6053463a2d20130700111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000713202d3946525e6875828f9ba9ac9f92867a6e6154473c31262a36424d5766737f8c99a7ab9e9184786c605346392f24180c00000000000005111e2a36424d5666737f8c99a3afa99c9083766c61584f46443f414142464b515b606d7984919ea9afb8afa295887c6f6255493c2f221609000c1925313d48535d65686c6c6c677683909da9a194887b6e6c6c6c6c6c6c68645d53483c3024180c00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a171a1c1e1f201f1f1e1c1a171413110d07010000000000000000000000000000000000000000000000060e151a1e2122292d2d2d2d2d2d2d2a2423201c160f0a060b0f141a1d23282c2d31362d2c29241d150d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c2328333b42464c5254575a5c5e5e5f5f5f5e5c5a5753514b46423b454c50525353535353534948433d342b21160a0000000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e0200000000000000000000000000000000000000000000000002070b0d0d131313131313130f0e0c0804000000000000000000000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e1200030f1b27333f49535b606a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a605b53493f33271b0f0300000000000000000000010b17232e38424f5960636360594f42382e1f160c000000000000000000000000000000000000000000030c151c2328363b3f40403f3b3628231c140c0300000000000000000000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000713202d3a4653606d7985919eabab9d908377695f53473a2b303b4854616e7b8795a0ab9f95887b6e6253493f33271b0f0300000000000815222f3b4855626e7b889aa4afa5998c7f7266594c3f3326190700000000000000000000000000000000000000000000000000000000000004101d2935404b556976838f9ca9ab9e918478675c5145382c1f130600111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000000000714212e3a4754616d7a86929facaa9c8f8276685e5246392a2025313b4855626e7b8895a0aca196897d7063554b4035291d10040000000000020e1925303b4854616e7b87929fabab9f948a7e716a60595350494e4e4d53555d606d74808d969b9ea5afafa295887c6f6255493c2f221609000915202c37424b53595b6060606774808d9aa7a194887b6e6160606060605b59534b41372b20140800000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d0d0f111213131211100d0a07060401000000000000000000000000000000000000000000000000000003090e1214151c202020202020201d171614100b0500000003090e12181c1f20242a201f1d18120b03000000000000000000000000000000000000000000000000000000000000000000010406070a0d10111213131211100d0a07060400000000030505060606060606000000000000000000000000000000000b151e272e343f454d53565d606366696a6b6c6c6c6b696763605c55534d444f575c5f60606060606056544e463d32271b0f030000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e14080000000000000000000000000000000000000000000001080e1317191a202020202020201b1b18140f0901000000000000000000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060605f5a52493e33271b0f00000b17222d38414950535d6060606060606060606060606060606060605d53504941382d22170b00000000000000000000000006111c26303d474f555656554f473d30261c0d0400000000000000000000000000000000000000000000030a1117242a2f323434322f2a2417110a020000000000000000000000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000005111d2a36414c5663707d8a97a1ada3998c7f7265574d42372b2d3a46535e697783909daaa7998d8073655b5044372b1f120700000000000714202d3a4753606d7a86939faca79a8e8174675b4e412f24180c00000000000000000000000000000000000000000000000000000000000006131f2c3845515d677784919eaaa99c90837669554b4034281c100400111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000006131f2b37434e5865727f8b99a3aea2988b7e7164564c41362a18212e3a47535f6a7784919daaa89b8e8174675d5145392c1f14090000000000000914202d3a46525e6975818e99a3afa69f92857c706b62605b535a5b575f61676d747f8b92938f939eaaafa295887c6f6255493c2f22160900040f1b25303942484d4f53535764717e8a97a9a194887b6e6155535353534e4d4841392f251a0f0300000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d01030505060605040300000000000000000000000000000000000000000000000000000000000000000000020608080f13131313131313100a0907040000000000000000070c101313181d1413100c0701000000000000000000000000000000000000000000000000000000000000000001080d111314171a1d1e1f1f201f1e1c1a171413100c07010c0f111213131313131309090703000000000000000000000007121c273039404451575f61686d7073767778797978777673706d67615e57505761686b6c6c6c6c6c6c6260584e43382c1f1307000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d010000000000000000000000000000000000000000020a12191f2326272d2d2d2d2d2d2d282724201a130b030000000000000000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353534f4940372c21160a000006111b262f383f4446505353535353535353535353535353535353535046443f382f261b1106000000000000000000000000000a141e2c353d44484a4a48443d352c1e140a00000000000000000000000000000000000000000000000000060c191f2326272726231f190b0600000000000000000000000000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000000000000000713202d3946525e6875828f9ba9ac9f92867a6e6154473c31262a36424d5766737f8c99a7ab9e9184786c605346392f24180c000000000006131f2c3845515d677885919eaba99c8f827669554b4035291d100400000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a86929faca79b8e8174685b4e412e23180c0000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000000000815222e3b47545f6a7783909dabac9f92867a6d6054473b3025191e2b37424e576673808c99a8ab9f9285796d6053473b3025190e02000000000005121e2a36424d57626e7c87929fa7ada29792857d756f6c6568676869696e7379818b91948f828f9ba8afa295887c6f6255493c2f221609000009141e2730373d4142464854616e7b8796a1a194887b6e61554846464641403c372f271d13090000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060606060606060400000000000000000000000000000406070b1007060400000000000000000000000000000000000000000000000000000000000000000003090e13191d20212427292b2b2c2c2c2b292724201f1c18120e181c1e1f2020202020201615130f0a040000000000000000000c18232e39424a515b63696e747a7d808384858586858482807d79746e69605b536873787979797979796f6a6054483b2e22150900000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e110500000000000000000000000000000000000000010a141c242b2f3334393939393939393534312c251d150b01000000000000000000000000000000000000000005101b252e373e4346464646464646464646464646464646464646464646433e372e251b10050000000a141d262d33373944464646464646464646464646464646464646443937332d261d140a0000000000000000000000000000020c1a232c33383c3d3d3c38332c231a0c020000000000000000000000000000000000000000000000000000080e1317191a1a1917130e0800000000000000000000000000000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e22160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c2013040000000000000000000000000000000000000000000000000714212e3a4754616d7a86929facaa9c8f8276685e5246392a2025313b4855626e7b8895a0aca196897d7063554b4035291d10040000000004101d2935404b55697683909ca9aa9e918477675d5145382c1f13060000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8999a3afaa988b7e7265584b3f322518070000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000004101c2834404b55626f7c8895a0aca99b8e8175675d514539291e141a26313c4955626f7c8896a0aca2988a7e7164564d42362a1e11050000000000020e1a25303b47535f6a73808d95a0a8a9a1979288817c797674747476787b7f858d929790827d8996a3afa295897c6f6256493c2f2316090000020c151e252c3134353a46535e697884919ea194887b6e6155483b39393534302b251d150b010000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e141a1e24292c2d3033363738393939383634302d2c29231d1a24282b2c2d2d2d2d2d2d23221f1b160f070000000000000004101c2834404a545c606d727b81868a8d8f9191929292918f8d8a85807b726c655c6b78858686868686867c6f6256493c2f2316090000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d2014090000000000000000000000000000000000000008121c262e363b3f404646464646464642403d372f271d130900000000000000000000000000000000000000000009131c252c33373939393939393939393939393939393939393939393937332c251c130900000000020b141b22272b2d37393939393939393939393939393939393939372d2b27221b140b0200000000000000000000000000000008111a21272c2f30302f2c27211a11080000000000000000000000000000000000000000000000000000000002070a0d0d0d0d0a070200000000000000000000000000000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d1104000000000000000000000000000000000000000000000006131f2b37434e5865727f8b99a3aea2988b7e7164564c41362a18212e3a47535f6a7784919daaa89b8e8174675d5145392c1f140900000000000c18242f414e5b6874818e9ba7ac9f92867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99abaea298887b6f6255483c2f2215090000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000006131f2c3845515c6774808d9aa7ada1978a7d7063554b413529170d15212e3b47535f6a7784919eaaaa9c8f8276695e52463a2d20150a00000000000009141f2b37434e58606d79839096a0a8a9a19a938e8985828181818284888c91979992857b7c8996a2afa296897c6f6356493c30231609000000030c141b2025282a36424d576875828e9ba194887b6e6155483b2e2d282724201a130b03000000000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c090606030000000000000000000000000000000000000000000000000000000000070f181f262a2f35393a3d404344454646454443403d3a38342f2a252f3437383939393939392f2e2c27211910070000000000030e18212c3844515c666d757f878d9298999c9d9e9f9f9f9e9c9a98928d867f776d666679869293939393887b6e6255483b2f2215080000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e020000000000000000000000000000000000020e19242e3840474c4d535353535353534e4d4841392f251a0f040000000000000000000000000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000020a11171b1f202a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2a201f1b17110a020000000000000000000000000000000000080f161c2023232323201c160f08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000000000815222e3b47545f6a7783909dabac9f92867a6d6054473b3025191e2b37424e576673808c99a8ab9f9285796d6053473b3025190e0200000000071925323f4c5865727f8b98aaafa399897c6f6356493c302316090000000000000000000000000000000000000000000000000000000006121e2b37424d576875828f9ba8ab9f9285796c605346392d2013060000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000000000713202d3a4653606d7985929eabab9e9285796d6053463a2f241807131f2b37434e586773808d9aa8ac9f93877b6e6154473c32261b0f000000000000030f1a26313c45515c676e7b8491969fa4aca49f9b97928f8e8d8e8f9196999e9892877d707b8895a2aea396897c706356493d3023160a0000000002090f15191a25313f4c5965727f8c989f94887b6e6155483b2e221b1a18140f090100000000000713202d3a4653606d7986939f9f9f998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b0600000000000000000000000000000000000000000000000000030b1218212a31363a4145474a4d505152525352514f4d4a4745403936313a4044454646464646463c3b38322b22190f04000000000915202c38434f59606d78818c92999fa2aaa9a8aaa29f9e9e9e9fa29f98928c81786d6d798699a39f9f94877a6e6154473b2e211408000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e1205000000000000000000000000000000000007131f2b36404a52585a606060606060605b59534b41372c201408000000000000000000000000000000000000000000010910161b1e202020202020202020202020202020202020202020201e1b161009010000000000000000060b0f12131d2020202020202020202020202020202020201d13120f0b060000000000000000000000000000000000000000050b10141617171614100b050000000000000000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d090500000000000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b1107000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e1308000000000000000000000000000000000000000000000004101c2834404b55626f7c8895a0aca99b8e8175675d514539291e141a26313c4955626f7c8896a0aca2988a7e7164564d42362a1e1105000000000916222f3c4955626f7c8898a2aeab988c7f7265594c3f31261a0e020000000000000000000000000000000000000000000000000000000814212d3a47535f697885919eaba99c8f8276665b5044382b1f12060000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000005111e2a36424d5664717d8a97a2ada89a8d8174665c514438281d13070f1b26323c4956626f7c8996a1ada4998c7f7265584e43372b1c11060000000000000a15202934404b555e696e7b848e939a9fa3aba9a19e9c9b9a9b9c9ea09d9590867d706e7b8894abb5a396897d7063564a3d3023170a0000000000000409091623303c4956636f7c89999393887b6e6155483b2e2215080c0803000000000000000713202d3a4653606d798693939393938d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a03000000000000000000000000000000000000000000030c151c2328333b42464c5254575a5c5e5e5f5f5f5e5c5a5753514b46423b454c50525353535353534948433d342b21160a000000020e1a26313b4854606b74808d939fa3ababa49f9b979892919192939a989d9f938f82786d7a8794abb4a094877a6d6154473a2e21140700000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d21140700000000000000000000000000000000000b17232f3b47525c64676c6c6c6c6c6c6c68655d53483d3124180c0000000000000000000000000000000000000000000000050a0f1213131313131313131313131313131313131313131313120f0a0500000000000000000000000003050611131313131313131313131313131313131313110605030000000000000000000000000000000000000000000000000407090a0a0907040000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201c1c1915100a02000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000000000006131f2c3845515c6774808d9aa7ada1978a7d7063554b413529170d15212e3b47535f6a7784919eaaaa9c8f8276695e52463a2d20150a000000000713202d3a4653606d7985929faca89b8f827568574d42362a1e12050000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8897a1ada8998c7f7366544a3f33281c0f030000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000714202d3a46525e6975828f9ca9aca096897c6f63544a403428160c010a13202d394653606c7884919eabab9d9084776a5f5347382e23170c000000000000030c18232f39434d575e696e7981878f92999b9d9e9f9f9f9e9d9b9895908b837c706b6d7a8799a49f9f978a7d7064574a3d3124170a00000000000000000713202d3a4653606d7987868686867b6e6155483b2e221508000000000000000000000713202d3a4653606d78868686868686868073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e0903000000000000000000000000000000000000000b151e272e343f454d53565d606366696a6b6c6c6c6b696763605c55534d444f575c5f60606060606056544e463d32271b0f03000006121e2b37424e57636f7c87939fa5afa9a199938f8a878584848586888c90959e948d80747b8794a1ada093877a6d6054473a2d21140700000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e22150600000000000000000000000000000000000d1926333f4c58646e7379797979797979756f65594d4034271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d292825211b140c04000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e181109010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040906111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c20130f0c07010000000000000000000000000000000000000000000713202d3a4653606d7985929eabab9e9285796d6053463a2f241807131f2b37434e586773808d9aa8ac9f93877b6e6154473c32261b0f0000000006121f2b3844505c6676838f9ca9ab9e918578695f53463a2d211409000000000000000000000000000000000000000000000000000005121e2a36424d5766727f8c99a9aca096887c6f6255493c2d22170b000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000000814212e3b4754616e7b86929facaa9e9184776b605442392e2318040005121f2b3744505b6574808d9aa9aca095887c6f62544a3f34281c100300000000000007121d27313b454d575e676d747c82868b8e909192929291908e8b88837e786f6a606c798693939393938a7e7164574b3e3124180b000000000000000006131f2c3845515c6775797979797976695f53463a2d2114070000000000000000000006121f2c3844505c667679797979797979736e63584b3f3226190c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b06000000000000000000000000000000000007121c273039404451575f61686d7073767778797978777673706d67615e57505761686b6c6c6c6c6c6c6260584e43382c1f130700000814212e3a47535f6a76828f9aa4afaba1979287827d7a79787778797b7f838a9196928a7e7b8895a1ada093867a6d6053473a2d20140700000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b00000000000000000000000000000000010d1a2734404d5a677380868686868686868175685b4e4235281b0f0200000000000000000000000000000000000000000000000000000000000000060a0e1011131313131313100f0d0a0500000000000000000000000000000000000000000000000000000000060a0e1011131313131313100f0d0a05000000000000000000000000000005090d0f101313100f0d0a050000000000000000000000000000000000000000000000000000000000000000000000000000000000030d161f272d32353639393635322c261e160c0200000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f151a1d1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d1e1c18130c050000000000000000000000000000000000000005111e2a36424d5664717d8a97a2ada89a8d8174665c514438281d13070f1b26323c4956626f7c8996a1ada4998c7f7265584e43372b1c110600000003101c28343f4a546673808c99a8ada197887b6e6155483b30251a0e02000000000000000000000000000000000000000000000000000714212d3a46535e697783909daaaa9e9184776a5f53473b2e1c1106000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c000000000000000000000007131f2c38434f5966727f8c99a3afa7998c807366594f4330271c120700030f1b27333f495363707c8997a1ada79a8d8074665c5044382c1f1206000000000000010b151f29333b454d555d606a6f757a7e8183858586858583817f7b77716d665f5b6678848686868686867f7265584c3f3225190c000000000000000004101c2834404b555c6a6c6c6c6c6c6c5f574d42372b1e12050000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c66635c52473b2f23170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a020000000000000000000000000000000c18232e39424a515b63696e747a7d808384858586858482807d79746e69605b536873787979797979796f6a6054483b2e22150900000815222f3b4855626e7b88949facaea39992857d75716e686b6b666d6e72767d84909492857d8996a3aca09386796d6053463a2d20130700010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f03000000000000000000000000000000010d1a2734404d5a6773808d93939393938e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000000040b11161a1d1e2020202020201d1c1916100a03000000000000000000000000000000000000000000000000040b11161a1d1e2020202020201d1c1916100a0300000000000000000000020a1015191c1c20201d1c1a16110a030000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2831383e4243464643413d3830281e140a0000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b09060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121a20262a2c2d2b3844505b66737f8c999393939393939084776b6054443a30242c2b28241e170f070000000000000000000000000000000000000714202d3a46525e6975828f9ca9aca096897c6f63544a403428160c010a13202d394653606c7884919eabab9d9084776a5f5347382e23170c000000000b17232e3c4956626f7c8996a0aca9988c7f7265574d42362a1e1205000000000000000000000000000000000000000000000000000815212e3b4854616e7b87959faba8998c807366584e43372b1f0a00000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000915222f3b4854606b7784919d9f9f9f95887b6e6255483d3222150b0000000b17222d3a4653606d7985929e9f9f9e9185796d6053463a2d20130700000000000000030d172129333b434b51586062686e71747678797978787675726e6a64605c5454687278797979797979726d62564a3e3124180b0000000000000000000c18232e39434b51535f6060606055534d453c31261a0e0200000000000000000000000c17232e38424a505f606060606060605a58524a40362a1f130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b030000000000000000000000000004101c2834404a545c606d727b81868a8d8f9191929292918f8d8a85807b726c655c6b78858686868686867c6f6256493c2f23160900000d192633404c5966737f8c99a6b0ac9f92877c6f6b64615e56545c6062656c707a8290949083909daaaca09386796d6053463a2d2013070005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f1205000000000000000000000000000000010d1a2734404d5a6773808d9a9f9f9f9b8e8175685b4e4235281b0f0200000000000000000000000000000000000000000000000000000000050d151c2227292a2d2d2d2d2d2d292926211c150d0400000000000000000000000000000000000000000000050d151c2227292a2d2d2d2d2d2d292926211c150d040000000000000000040c141b212528292d2d2a2926221c150d040000000000000000000000000000000000000000000000000000000000000000000000000005111c27313a434a4e5053534f4e49423a30261b1005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242b3236393939333f4a54616e7a8786868686868686867f7265594f433239393837342f2921190f0500000000000000000000000000000000000814212e3b4754616e7b86929facaa9e9184776b605442392e2318040005121f2b3744505b6574808d9aa9aca095887c6f62544a3f34281c10030000000615222e3b4754606a7784919eaaa99d908376695e52463a2d20150a00000000000000000000000000000000000000000000000006131f2b37434e5865727f8c98a7aca095887c6f6255483c32261b0f00000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0000000000000000000000091623303c4956636f7c8996939393939083776a5f53473a2e211417110b0b10121f2b3844505c6674818e93939393978a7d7063574a3d3024170a0000000000000000050f172129313a40454e54565e6164686a6b6c6c6c6b6a6865625f5753504a5660686b6c6c6c6c6c6c65625b51463a2e22160900000000000000000007121d27303940454653535353534846423c332a1f140900000000000000000000000006111c2630383f4453535353535353534d4b4740382e24190e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d030000000000000000000000030e18212c3844515c666d757f878d9298999c9d9e9f9f9f9e9c9a98928d867f776d666679869293939393887b6e6255483b2f2215080005111e2a36424d576976838f9ca9b1a79a8d80736a605954524c4a5053555a61676d798290959095a0abaca09386796d6053463a2d201307000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d201306000000000000000000000000000000010d1a2734404d5a6773808d9aa6aca89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000000000000000000040d171f272e3336373939393939393635322d261f160d030000000000000000000000000000000000000000040d171f272e3336373939393939393635322d261f160d03000000000000020c161e262c32353639393635322d271f160d030000000000000000000000000000000000000000000000000000000000000000000000000a16222d38434c545a5d60605c5a544c42382c211509000000000000000000000000000000000000030608090b0d0f1112121313121211100e0c0a070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f1a242d363d42454646464646525e686e797979797979797979726d625647454646464544403a332b21170c0100000000000000000000000000000007131f2c38434f5966727f8c99a3afa7998c807366594f4330271c120706040f1b27333f495363707c8997a1ada79a8d8074665c5044382c1f120600000006131f2b37434e586673808d99a8ac9f93877b6e6154483c31261b0f0200000000000000000000000000000000000000000000020c15212e3b47535f6a7683909da9aa9d9184776a5f53473a2a20150a00000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000e1b2834414e5b677481868686868686867f7265574e42372b2a27221d16161b202228343f4a5463707d868686868686868175685b4f4235281c0f000000000000000000050f171f282f353d43474c5254585b5d5e5f5f5f5e5d5b5855534e46443f4e565c5e606060606060585651493f34291e1206000000000000000000000b151e272e34383a46464646463b3a37312a21180e03000000000000000000000000000a151e262e34384646464646464646403f3b362e261c1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d03000000000000000000000915202c38434f59606d78818c92999fa2aaa9a8aaa29f9e9e9e9fa29f98928c81786d6d798699a39f9f94877a6e6154473b2e211408000714202d3a46525e697885929fabaca095877b6e61584f4746413f44464850555d676e7b85929da0a7b1aca09386796d6053463a2d201307000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e211408000000000000000000000000000000010d1a2734404d5a6773808d9aa6aca89b8e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000b151f2931393f424446464646464643423e3831281f150a00000000000000000000000000000000000000000b151f2931393f424446464646464643423e3831281f150a0000000000000a141e2830383d4143464643423e3831281f150a0000000000000000000000000000000000000000000000000000000000000000000000010d1a26323e4a545e66696c6c69665e54493d3225190d00000000000000000000000000000003070a0f121515181a1c1e1e1f1f201f1f1e1d1b19161413110d08040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202b363f484e5253535353514d565e616c6c6c6c6c6c6c6c6c65625b514b5253535352504c453d33291e13070000000000000000000000000000000915222f3b4854606b7784919d9f9f9f95887b6e6255483d3222151b1313100c17222d3a4653606d7985929e9f9f9e9185796d6053463a2d201307000000030f1b27323d4955626f7c8896a0aca49a8b7f7265584e43372b1e13080000000000000000000000000000000000000000000008131e2a36414c56626f7c88959faba2988c7f7265584e43372b1f120600000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000d1a2733404c59646f7479797979797979726d6256453c313736332e272021272c2f302e384855616b7079797979797979756f65594d4034271b0e00000000000000000000050d161d242932373b4146474b4e505252535252504e4c4847423c3834454b50515353535353534c4a463f372d23180d0100000000000000000000030c151d23282c2d39393939392e2d2b261f180f060000000000000000000000000000030c151c23282c393939393939393933322f2a241c140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b010000000000000000020e1a26313b4854606b74808d939fa3ababa49f9b979892919192939a989d9f938f82786d7a8794abb4a094877a6d6154473a2e211407000814212e3b4754616e7b8798a2aeaa9d908377695e53463d393634383a3e434c555e69717e8b97a1adb9aca09386796d6053463a2d201307000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f221509000000000000000000000000000000010d1a2734404d5a6773808d9a9f9f9f9b8e8175685b4e4235281b0f02000000000000000000000000000000000000000000000000000006111c27313b434a4f51535353535353504e49423a31261c100500000000000000000000000000000000000006111c27313b434a4f51535353535353504e49423a31261c10050000000005101b26303a42494e4f5353504e4a433a31271c110500000000000000000000000000000000000000000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4135281c0f00000000000000000000000000040a0f13151b1f21222527292a2b2c2c2d2c2b2b2a28262321201d1913100c07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a26323d4851595e606060605e575552545f606060606060606058565053585f6060605f5c574f453a2f24180c000000000000000000000000000000091623303c4956636f7c8996939393939083776a5f53473a2e2d2d28201f1c18121f2b3844505c6674818e93939393978a7d7063574a3d3024170a000000000a15212e3b47535f6a7784919daaac9c9083766a5f53473a3025190d010000000000000000000000000000000000000000010d1924303946525e6874818e9aa7aa9f92857a6d6054473c31261b0f0300000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000b1824303c48535d64676c6c6c6c6c6c6c65625b5146464644433f3932292b32383b3d4646444f5961636c6c6c6c6c6c6c68655d53483d3125180c0000000000000000000000040c131820272b3036393b3e4143454646454543423f3b3a37312c283a4043454646464646463f3e3a342d251b1106000000000000000000000000030b12181c1f202c2d2d2d2d22211e1a140e0600000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2726231f19120a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d1207000000000000000006121e2b37424e57636f7c87939fa5afa9a199938f8a878584848586888c90959e948d80747b8794a1ada093877a6d6054473a2d21140700091623303c4956636f7c8996aab4a79a8e817467574d42342d2a282b2d313a434d57606d7985929eabb8aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a000000000000000000000000000000010d1a2734404d5a6773808d93939393938e8175685b4e4235281b0f0200000000000000000000000000000000000000000000000000000a16222e39434d555b5d6060606060605c5a544c42382d21160a0000000000000000000000000000000000000a16222e39434d555b5d6060606060605c5a544c42382d21160a000000000915212c38424c545a5c60605d5a544c43382d22160a0000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768286868276695c4f4336291c100000000000000000000000040b10161b1f22262b2e2f3233353738383939393837373532302d2c29241f1d18120b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2a36424e59636b6c6c6c6c6b64615a534d53535353535353534d535b60656c6c6c6c6b6861574c4034281c0f0300000000000000000000000000000e1b2834414e5b677481868686868686867f7265574e4237393939352d2c28231d1c28343f4a5463707d868686868686868175685b4f4235281c0f0000000006131f2b37434e5865727f8c98a2ab9f94887c6f62564c4135291e1308000000000000000000000000000000000000000005111d2935414c56616e7a86929faca3988d8074685d5245392a20150a0000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c00000000000000000000000814202b36414a53595b6060606060606059565153535353514f4a443b32353d444849535353534f5557606060606060605b59534b41372c20140800000000000000000000000001070d151b1e252a2d2e31353738393939383735322f2e2b261f282f34373839393939393932312e29231b1309000000000000000000000000000000070c10131320202020201514120e090300000000000000000000000000000000000000060c101220202020202020201a1917130e0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e05000000000000000814212e3a47535f6a76828f9aa4afaba1979287827d7a79787778797b7f838a9196928a7e7b8895a1ada093867a6d6053473a2d201407000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f31261e1c1f2028313b45515c6673808d99aab4aca09386796d6053463a2d201307000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000000000000000000000000000000010d1a2734404d5a677380868686868686868175685b4e4235281b0f0200000000000000000000000000000000000000000000000000010e1a27333f4a555f676a6c6c6c6c6c6c69665e54493e3226190d0100000000000000000000000000000000010e1a27333f4a555f676a6c6c6c6c6c6c69665e54493e3226190d010000000d1925323d49545e66696c6c69665e544a3e32261a0d0100000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000000000000000060c161b21272c2f31373a3c3e4042444545464645454443413f3d3a39352f2c29241d17110a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3945525e6b757979797978706c615f57514b434646424b51575f656c71787979797873685c5044372b1e110500000000000000000000000000000d1a2733404c59646f7479797979797979726d6256453c45464646413a38342e271e232e384855616b7079797979797979756f65594d4034271b0e00000000030f1b26323c4754606d7a86929faaa69a8d8174685e52463a2f24190d02000000000000000000000000000000000000040d1a232d3946525d6873808d98a3aa9f92867b6e61564c413529180e040000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326190c0807050200000000000000030f1a252f3841484c4e53535353534c525f6060606060605d5b554d44393d474f54566060606060605a585353535353534f4d4841392f251a0f040000000000000000000000000000040a0f14191e202125282a2b2c2c2c2b2a282522211e1a151d23272a2b2d2d2d2d2d2d2524221e1811090100000000000000000000000000000000000406071313131313080705020000000000000000000000000000000000000000000000030613131313131313130d0c0a070200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d020000000000000815222f3b4855626e7b88949facaea39992857d75716e686b6b666d6e72767d84909492857d8996a3aca09386796d6053463a2d201307000b1824313e4b5764717e8a97a4b0a4978a7d7164574a3e3124171012161f2834404b54626f7c8998a3aeaca09386796d6053463a2d201307000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b000000000000000000000000000000000d1926333f4c58646e7379797979797979756f65594d4034271b0e010000000000000000000000000000000000000000000000000003101d2936424f5b6771777979797979797670665a4e4235291c0f030000000000000000000000000000000003101d2936424f5b6771777979797979797670665a4e4235291c0f030000000f1c2835414e5a66707679797670665a4e4235291c0f0300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000000000000030a111721272c32383b3c4347484b4d4f5151525253525251504e4c494745413a39352f28221c140b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7987868686847d756e69605c554f46454f545c60696e777e8586868685786b5f5245382c1f120500000000000000000000000000000b1824303c48535d64676c6c6c6c6c6c6c65625b514c50525353534e464540393029202c38444f5961636c6c6c6c6c6c6c68655d53483d3125180c00000000000a15202c3945525d6874808d98a3ac9f92867a6d61564c4135291f14090000000000000000000000000000000000010c161f2a36424d57616d7a85929faaa2988d8074695e52433a2f241906000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f332619191514120e090300000000000008131d262f363c4041464646414c565e6c6c6c6c6c6c6c6a675f554a3f444f5960636c6c6c6c6c6c67645c534846464642403d372f271e1309000000000000000000000000000000000002080e111414181b1d1f1f201f1f1d1b191514120e0912171b1e1e202020202020191816120d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e14080000000000000d192633404c5966737f8c99a6b0ac9f92877c6f6b64615e56545c6062656c707a8290949083909daaaca09386796d6053463a2d201307000b1825313e4b5864717e8b97a4b0a396897d7063564a3d3023170a060d18232e3a4653606d7986929facaca09386796d6053463a2d201307000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b000000000000000000000000000000000b17232f3b47525c64676c6c6c6c6c6c6c68655d53483d3124180c000000000000000000000000000000000000000000000000000004111e2a3744515d6a77838686868686868276695c504336291d10030000000000000000000000000000000004111e2a3744515d6a77838686868686868276695c504336291d1003000000101c2936434f5c69768286868276695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000000000030c151c232832383d4348494e5355585a5c5d5e5f5f605f5e5e5d5b595654514c47454039332d261d181008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e889396918a827b736d67615953525960666d737b828b929792877e7064574a3d3124170a0000000000000000000000000000000814202b36414a53595b606060606060605956514f575d5f6060605b53514b423a322a28333e474f5557606060606060605b59534b41372c201408000000000004111d2935414c56616e7b86929faaa2988c8073685d52453b30251a0d030000000000000000000000000000000007121d28313946535e6973808d98a2a89f92857a6d61564d4231281e1308000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3326252522211e1a140e060000000000010b141d252b30333439393946525e68767979797979797771675b4f434854606b70797979797979746e64584c4039393534312c251e150c0200000000000000000000000000000000000000020507080b0e101213131212100f0c0808060200070b0f11121313131313130c0b09060100000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000000000000000000000000000000000000000000020608080b0e1011121313121211100d0b080705020000000000000000000000000000000000000000000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e020000000005111e2a36424d576976838f9ca9b1a79a8d80736a605954524c4a5053555a61676d798290959095a0abaca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa296897c6f6356493c302316090007131f2c3845515c667683909da9aca09386796d6053463a2d201307000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b0000000000000000000000000000000007131f2b36404a52585a606060606060605b59534b41372c201408000000000000000000000000000000000000000000000000000004111e2a3744515d6a778490939393938f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a778490939393938f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000000030d151e262e343d44484f5456585f626566686a6b6b6c6c6c6b6a6a686563605d5553514b443f382f2a221a11080000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4956626c717f8b919e948f868079706b615f5d606b6f797f868f949f93887e716c6155493c3023160a000000000000000000000000000000030f1a252f3841484c4e535353535353534c4a4c5761696b6c6c6c68605c544c443c342c2c353e44484a535353535353534f4d4841392f251a0f040000000000010d19242f3a46525e6974808d98a2aa9f92857a6d60574d42362a1f150b010000000000000000000000000000050e18242f39434f59616e7b86929faaa0968c7f72685e52443b301f160c01000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f333232322e2d2a261f180f060000000000020b131a202427282d2e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e41342d282725201a130c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000000000000000000000000000000000205090e121415181b1d1e1f20201f1f1e1c1a181514120e090502000000000000000000000000000000000000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e1408000000000714202d3a46525e697885929fabaca095877b6e61584f4746413f44464850555d676e7b85929da0a7b1aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090004101c2834404b546875828f9ba8aca09386796d6053463a2d201307000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a00000000000000000000000000000000020e19242e3840474c4d535353535353534e4d4841392f251a0f04000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000000020b151f2730383f444f54596063676a6f7173757778787979787877767472706d6764605d55504a423c342c231a100700000000000000000000000000000000000000000000000000000000000000000000000000000000000815212d3945505a626d727f8b919c98928c847d756e69686d747c838c92989c918b7f726c625a5044392d2014080000000000000000000000000000000008131d262f363c4041464646464646463f44505d697378797979746d665e564e463e35282c33383c3d4646464646464642403d372f271e13090000000000000008131e2a36424d57616d7a85929fa8a2978d8073695e52463d31271d120700000000000000000000000000020b17202935404b55606b75828f98a3a59d9184796d60564c4132291f0d0400000000000000111e2b3744515e6a7784919daaa5998c7f7266594c3f3f3f3f3f3b3a36312a21180e03000000000001080f14181a1b212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271c1b18140f090200000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b09060100000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d04000000000000000000000000000000000000000000000000000002080e11151a1e21222528292b2c2c2c2c2b2b29272522211e1a14120e09020000000000000000000000000000000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d010000000814212e3b4754616e7b8798a2aeaa9d908377695e53463d393634383a3e434c555e69717e8b97a1adb9aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000c18232e414e5b6874818e9ba7aca09386796d6053463a2d201307000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a00000000000000000000000000000000020e1a26313c454e53556060606060606055534e463c31261b0f03000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000000a141d273139424a505960636b6f74787b7e8082848485858685858483817f7c7a75716d67605b544e463e352c23190d040000000000000000000000000000000000000000000000000000000000000000000000000000000005111d29343e48505a626d727f8c929c9f96918a827b73717a818891959f9d928c7f736d625a50483e33281c100400000000000000000000000000000000010b141d252b303334393939393939393845525f6b788586868681786d685f584f473f342e272c2f30393939393939393534312c251e150c0200000000000000010e1a25303b46525e68727f8c96a0a99f92867b6e61594f43392f24180e040000000000000000000000000a141d29323a45515d67707d89939ea89d93897d70675c51443a3020170d0000000000000000111e2b3744515e6a7784919daaa5998c7f7266594c4c4c4c4c4c4846423b332a1f14090000000000000003080b0814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e0c08040000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d060000000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000000000000000000000000000002080d14191e20262b2e2f323436383939393938373634322e2d2b26201e1a140e090200000000000000000000000000000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e1105000000091623303c4956636f7c8996aab4a79a8e817467574d42342d2a282b2d313a434d57606d7985929eabb8aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000071a2734404d5a6773808d9aa6aca09386796d6053463a2d201307000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f2316090000000000000000000000000000000006121e2b37424e575f6c6c6c6c6c6c6c6c625f584e43372b1f1206000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000006111b262f39434b545c606b70767c8184888b8d8f9091929293929191908e8c8986827e79716c665f584f473e352b1f160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000c17222d363f48515b636d737f8c929ca09e948f867f7d848d939aa09d938d80736d635b51483e362c22170b000000000000000000000000000000000000020b131a202427282d2d2d2d2d2d2d323f4c5965727f8c93938e827a6f6a615951444039302823242d2d2d2d2d2d2d282725201a130c0300000000000000000009141f2a36414c56606d7984919da5a2988e81756b60554b40352920160b020000000000000000000006111c262f3a444f59606d7984919ea5a1968e81746b60554b4032291e0e050000000000000000111e2b3744515e6a7784919daaa5998c7f72665958585858585855534d453b31261a0e020000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d181109010000000000000000000000000a151f2831383e4243464643423e3831281f150a00000000000000000000000000000000000000000000040c13191f252a2d31373a3b3e41434445464645454443403e3b3a37312d2a251f1a140d0500000000000000000000000000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d2014090000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f31261e1c1f2028313b45515c6673808d99aab4aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e211508000000000000000000000000000000000814212e3a47535f6a7679797979797979766a5f53473a2e211508000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000b17222d38414b555c666d737d82898e919698999b9d9e9e9f9f9f9e9d9d9b9898928f8a857e786f6a61594f473d31281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000006101b242d363f49515b636d73808d929da49e98928c8a91969fa49e938e81746e645b51493f362d241a10050000000000000000000000000000000000000001080f14181a1b20202020202025313e4a56626d75818f969490847c706b625b514a423a322a21192020202020201c1b18140f090200000000000000000000020d1925303a45515c67707d89939da89e93897d70675d51453d32281d140a000000000000000000071017222d38424c56606b74808d96a0a3999184796d60594f43392e20170d000000000000000000111e2b3744515e6a7784919daaa5998c7f726665656565656565615f574d42362a1e12050000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b1309000000000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000000000000000000000000080e161e25293036393c4247484b4e50515253535252514f4d4b4846423c3a36302a251f170f08000000000000000000000000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e0200000b1824313e4b5764717e8a97a4b0a4978a7d7164574a3e3124171012161f2834404b54626f7c8998a3aeaca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d201307000000000000000000000000000000000815222f3b4855626e7b868686868686867c6f6255483c2f22140a000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000030f1b27333f49535c676d7880888f949a9ea1a8a6a9a19e9d9d9c9d9d9ea1a9aaa39f9b97918b837c706b61594f433a2f24190d010000000000000000000000000000000000000000000000000000000000000000000000000000000009121b242d373f49525b636e74808d929da5a39f99979ea1a69e948e81786c605c524940372d241b11080000000000000000000000000000000000000000000003080b0d0e131313131316222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a1313130f0e0c08040000000000000000000000000008131e2834404b55606b74818e96a1a59d9184796d60594f443a2f261b110600000000000000060f192228333f4a545e68707d88939fa69f92877d6f675d51473d30271d0e05000000000000000000111e2b3744515e6a7784919daaa5998c7f7272727272727272726e695f53463a2d2114070000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e0100000000000000000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b1106000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a000000000000000000000000000000000000020a121a202830353b4146474e5355585b5c5e5f5f5f5f5e5e5c5a5855534d4846423b363029211a120a020000000000000000000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e120500000b1825313e4b5864717e8b97a4b0a396897d7063564a3d3023170a060d18232e3a4653606d7986929facaca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f1306000000000000000000000000000000000714212d3a4754606d7a879893939393897d7063564a3d2f261b11060000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000005121f2b3744505b656d79828d939a9fa6a7a09d999697929090909090929795999da0a7a19e9590867d706b60564c4135291d1307000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b252d374049525c646e74808d939da59f9f9f9fa79f948f82786d665b504a40372e251b1209000000000000000000000000000000000000000000000000000001010606060606121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c0300020100000000000000000000000000000000020c18232e39434f59606d79849199a3a0968d80736b60564c41382d221710070000000000030d18212b343d44505b666d7a85919aa49e948c7f726b60554b41352b1e150b00000000000000000000111e2b3744515e6a7784919daaa89b8f817f7f7f7f7f7f7f7f7f7b6e6155483b2e2215080000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e01000000000000000000000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d010000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d0100000000000000000000000000000000020b141c242c323a41464d5254575f626567696b6c6c6c6c6b6a696765615f5754524d46423b332c241c140a020000000000000000000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d21140700000b1825323e4b5865717e8b98a4afa296897c6f6356493c302316090007131f2c3845515c667683909da9aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c1004000000000000000000000000000000000613202c3945525d687985929f9f9f998c7f7366584e41382d2217110a02000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000005111e2a36414c56606c77818e949fa4a7a09d95908c89878584838383848587898c90959ea1a7a09892867d6f685d52453a2f24180d01000000000000000000000000000000000000000000000000000000000000000000000000000000000009131c252e37404a525c606c77818e93939393939393959082796d665c544a3f382e251c1309000000000000000000000000000000000000000000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c030000000000000000000000000000000000000007121d27303d45515d676f7d87929fa69f93877d6f685e53493f332722190f060000000009141f29333d46505a606c78828f97a1a0958f82776c60594f433a2f23190c0300000000000000000000111e2b3744515e6a7784919daaaa9e938f8b8b8b8b8b8b8b8b8a7d7164574a3e3124170b0000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c000000000000000000000000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d12060000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f03000000000000000000000000000000010b141d262e363e444c52565e61666a6e717476777879797878777673716e6966615e57524d453e362e261c140a0000000000000000000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e22150600000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090004101c2834404b546875828f9ba8aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c000000000000000000000000000000000004111d2935414c566976838f9caca99d9083766a6053493f3327221b140b040000000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000713202d3946525e68727f8c939ea6a59d959089837f7c7a787776767677787a7c7f838a9297a1a9a29891847a6d60554b4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e384044505b656c7881868686868686868683796d675d544a42382d261c130a0100000000000000000000000000000000000000000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b00000000000000000000000000000000000000000b151e2935414b55606b727f8c949ea49991847a6d655b50443e342b21180d030000020e1a26313b454e58616c73808d949ea19791837a6d655b50473d31281d11070000000000000000000000111e2b3744515e6a7784919daab0a69e9b98989898989898978a7d7164574a3e3124170b0000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b0000000000000000000000000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e221509000000000000000003101d2a3643505d69768286868276695d5043362a1d100300000000000000000000000000000009131d262f38404850565e61686e73777b7e81838485868685858482807e7b77736e69615e57504840382e261c130900000000000000000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b00000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000c18232e414e5b6874818e9ba7aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d302316070000000000000000000000000000000000010d19242f3f4c5966727f8c9aa4ab9f95897c6f655b50443e332d261d160e0600000000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100004101c2834404a54616d7a85929fa5a69d938e837d77736f6d686a6a696a6a676d6f73787e859196a1aaa1968d8073675d5145392c201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c2627333f49535b666c757979797979797979776d675d554b42392f261c140a0100000000000000000000000000000000000000000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d120700000000000000000000000000000000000000030c18242f3a434f59606c77828f95a0a1968f82776c605a50463d33291f1409000005121e2a36424d57606a717e8a929ca29892857b6e685d53493f352b1f160c000000000000000000000000111e2b3744515e6a7784919d9f9f9f9f9f9f9f9f9f9f9f9f978a7d7164574a3e3124170b00000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e221609000000000000000000000000000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000007101b252f38404a525a61686d747b8084888b8e8f919292929291918f8d8b8884807b746e69615a524a40382e251b0f06000000000000010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f03000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000071a2734404d5a6773808d9aa6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d2013070000000000000000000000000000000000000815222f3b4855626e7b87939faba79c9082776c605a50443f382f282017110a020000000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100006121f2c3844515c6674808d98a2aa9e948e8179706b6663605d565d5d5d555d6062656c717b84919ea8a99f92857a6d6054473a2d21140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a1417222d38414a545b60686c6c6c6c6c6c6c6c6a605d554c433930271d140a0200000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c000000000000000000000000000000000000000007131d28313d44505b656d7a839197a19e948c80736c61584e453b31261a0e02000714212d3a46535f696f7c869293939992867c6f695f564c41382d23190d04000000000000000000000000111e2b3744515e6a77849193939393939393939393939393938a7d7164574a3e3124170b000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e120600000000000000000000000000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000030c19222d37404a525c636c717a81868c9196989a9c9e9f9f9f9f9e9d9c9a9895918d86817b716c645c524a40372d21180e03000000000005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f1205000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f13060000000000000000000000000000000000000814212e3a47535f6975828f99a3ab9f948c7f726c615a5049413a3227221b140b0400000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000713202d3a4653606d7885929fa9a2988f82786d6760595654524c5050504c5154535b6069707d8a96a0aca2988a7e7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f38424a50535b60606060606060605d54514c433a31271e150b02000000000000000000000000000000000000000000000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c100400000000000000000000000000000000000000010c161f27333f49535d686e7b859298a29f93887e706a60574d42362a1e1205000815222e3b4855616e7b858686868686867d706a60574d433a2f261b110700000000000000000000000000111e2b3744515e6a7784868686868686868686868686868686867d7164574a3e3124170b0000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d01000000000000000000000000000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000a151e2b343f49525c646e737e858d92999da0a8a9a29f9d9c9b9c9d9fa2aaa7a09d99928e857e736e645c52493f332a1f140900000000000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d201306000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c100400000000000000000000000000000000000006121e2b37424d57626f7c87929fa7a69f93877e716c605b534c443d332d261d160e06000000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000a1723303d4a5663707d899297979992857b6e665c554f49474541434343414547495057616b7784919daaaa9a8d8174675a4e4134271b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262f383f44464e5353535353535353504745413a31281f150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f13060000000000000000000000000000000000000000040d17222d38414c565f696f7d869299939a92867c6f695f53463a2d211407000714212d3a46535f696e78797979797979706b61584e453b31281d140a0000000000000000000000000000101d2a36434f5b67717779797979797979797979797979797979716c6155493c3023170a00000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b11070000000000000000000000000000000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000006111c26303d46515b646e74808a92979fa3a9a19e999792908f8f8f909298989d9fa7a39f97928a80736e635b51453b31261a0e04000000000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e211408000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c00000000000000000000000000000000000000020e1a26313c4754606a73808d959fa8a49992877e736c655e564f443f382f2820180f070000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000a1724313d4a5764707d8285878a8c8d8073685e544b433d3a39352f362f35393a3f444f596774818d9aa7a99c908376695d5043362a1d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141d262d333839424646464646464646443a39352f281f160d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d20130700000000000000000000000000000000000000000006111b262f3a434d57606a707d868686868686857b6e6155483b2e2215080005121e2a36424d575f616b6c6c6c6c6c6c6361594f463d332a1f160b0200000000000000000000000000000e1b27333f4b565f676a6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d2114080000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b130900000000000000000000000000000000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000c17232e38424f59626d74808d929ea1a9a39f97918c8885838282838385888b90959ea1a8a29f928d80736d62574d42362a20160a000000000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f221509000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d120700000000000000000000000000000000000000000915202b37434e58606d79839096a0a7a39992877f776d6860595049413a322a2119100700000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000a1623303c4955616c7076787b7d80827c6f62564d4239302d2c29242a24292c2d33404c5966737f8c99a6aa9d9184776a5e5144372b1e110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c22282b2d353939393939393939372d2c29241e160d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e211408000000000000000000000000000000000000000000000a141d28313b454e58616b70797979797979786e695f53463a2d21140700020e1a26313b454d53555f60606060605f57554f473e342b21180d040000000000000000000000000000000b17232e39444d565b5e60606060606060606060606060606060575550483e33281c1104000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e181109010000000000000000000000000000000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d2013000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000003101c28343f4a54606b727f8c929ca4aaa299928c84807b787675757677797b7f838a91969fa6a49c928b7f72695f53463d32271b0f030000000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b000000000000000000000000000000000000000000030f1b27323c45515d676e7a8490959ea6a399938c827a6f6b605b534c443c332b22191107000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000814202d39444f59616469696e7073756f6a5f53443b302721201f2023282c2f353a424d566673808c99a6aa9e9184776b5e5144382b1e11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f20282d2d2d2d2d2d2d2d2a21201d19130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d20140700000000000000000000000000000000000000000000020b161f2a333d464f5961636c6c6c6c6c6c6b615f574d42362a1e1205000009141f29333b424648525353535353534a48443e352c22190f060000000000000000000000000000000006121d28323b444b4f51535353535353535353535353535353534a49453e362c22170c000000000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d0700000000000000000000000000000000000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000006121f2c3844505c666f7c87929fa4aba29892878079736f6a6a696869656c6e72777d848f949fa6a49f92867b6e61584e43382b1f13060000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c03000000000000000000000000000000000000000000000a15202935404b555e686e7b838f949fa3a49f948f847d726c655d564d453d342b23190f060000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100004101c28333e474f5557575e61646669625f584e4332292122282b2d2e34383a40454c545e6975828f9ba8aa9d9083776a5d5044372a1d110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131b20202020202020201d1413110d0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e11050000000000000000000000000000000000000000000000040d18212b343e474f55575f60606060605f55534d453b31261a0e020000030d18212931363a3b454646464646463d3c38332c231a10070000000000000000000000000000000000000b16202932393f4344464646464646464646464646464646463e3c39332c241a100500000000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b090601000000000000000000000000000000000000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f231609000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000003101c28343f4a54606d78839099a3afa39992867d736d67625f585c5c535b6061656c707a828f949fa9a2988f82766a6054473b2e2215080000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f0000000000000000000000000000000000000000000000040c18242f39434c565e696e7a828c9299a1a69e9691877f776d685f574e463d352b21180c0300000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000b17212c353e44494a4d535457595c55534e463c312a2d2d3338393c4045464b51565d666e7b86929faca89c8f8275695c4f4236291c0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060f1313131313131313110706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e02000000000000000000000000000000000000000000000000060f19222c353e44484a535353535353524846423b33291f140900000000060f181f262a2d2e38393939393939302f2c28211a110800000000000000000000000000000000000000040e1720282e3336373939393939393939393939393939393931302d28221a120800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c201407000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000006121f2c3844505c66727f8b95a0aba89f92877d706b605d55534e4f4f495053555a61686d79829097a1a49f94897c6f6256493c2f2316090000000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c22110800000000000000000000000000000000000000000000000007121d27313b444d565e686d777f8791979fa6a199928c827a6e6960584f473d332a1e150a00000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000005101a232c33393c3d4246484a4d4f4847433c3431363a3b3f4446494b5153555d60686d78828f98a2aea7998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e1408000000000000000000000000000000000000000000000000000007101a232c33383c3d464646464646453b3a36312921180d030000000000060d141a1e21222c2d2d2d2d2d2c2423201c161008000000000000000000000000000000000000000000050e161d23272a2b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c171008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c1313131313130d0c0a070200000000000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c1004000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000713202d3a4653606d7984919ea7ada1968d80736b6059514b474342423f44464850565d676d7a85929b9993908c8275685c4f4235291c0f0200000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a1000000000000000000000000000000000000000000000000000010b151f29323b444d565d656c727d858f949fa3a39f948f847b6f6a60594f453c30261c1106000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000008111a21282d3031363a3b3d40423c3a37373b3c4246484a505355555c6063676d727a818f949eaaab9f95887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c08030000000000000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d0200000000000000000000000000000000000000000000000000000008111a21282c2f30393939393939382e2d2a261f180f060000000000000003090e1214151f202020202020171614100b050000000000000000000000000000000000000000000000040b12171b1d1e20202020202020202020202020202020171714110c0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d121618192020202020201a1917130e0800000000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b00000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000004101d2935404b5564717d8a96a1acaa9e9184796d60594f45403937312d3337393e444c555e68717e8b8e8a86837f7c6f6255483c2f2215090000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f12080000000000000000000000000000000000000000000000000000030d172029323b444c535b606b707a828c9299a1a69e9691857d6f6b60574d42382e23170c020000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000810171c2023252a2d2e31333036393c4347494d5354545b606266676d7074797e858f939ea6aea49d9083776a6054473b2e2215080000000000000000000000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f090100000000000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000810161c2023242c2d2d2d2d2d2c22211e1a140d060000000000000000000002050708121313131313130a090704000000000000000000000000000000000000000000000000000000060b0e1011131313131313131313131313131313130b0a080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010911181e2225252d2d2d2d2d2d2726231f19120a020000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a100500000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000613202c3945515d6775828f9ba8aea3988b7e71675d51473d352f2b2622272b2d323a434c56606d7883817e7a76736f6a5f53473b2e2115080000000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d00000000000000000000000000000000000000000000000000000000050e172029323a4149505960686d777f879297a0a8a09792867d6f695f544a3f34281e13080000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000000050b1014161a1e21282f353a4146474e5455575e6165666c6f7276797d81858b91979ea5afa69d92897d7063584e43372b1f1306000000000000000000000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b0300000000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d0500000000000000000000000000000000000000000000000000000000000000050b101416172020202020201f1514120e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b23292e313239393939393933322f2a241c140a0000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a11080000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000714202d3a4753606d7a86929facac9f92867a6d60554b403529241d1a171b1f2028313a44515c666d7775716d6866625f584e43372b1f12060000000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f231609000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e050000000000000000000000000000000000000000000101020000000000050e1720282f383f444f565e656c727d859196a0a9a29892857b6e665c50443a3025190d0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000000000409121b232b323a41454c525458606266696e7175797c7f8285898d92979ea1a9ada59e948d80746b6054463c32271b0f030000000000000000000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b010000000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e0802000000000000000000000000000000000000000000000000000000000000000000000407090a13131313131312080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002070a0c0d13131313090907030005090d0f101313131312100d0903000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000007111b252d343a3e3f464646464646403f3b362e261c120800000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c161008000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000a1723303d4a5663707d8998a3aea89b8e8275675d51433a2f23181d1d1d1d1d161f2834404a545c606a6864615e5655534e463c32261b0f030000000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e211508000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000000050e1720353f474e524f54596063676d70727576787879797878777573706d6865605d55504a46423c332a1f14090000000000000000000000000000020507080a0b0c0c0d0e0f090907030000050d161d262d333d444c535b606b6f7b849196a1aaa2979083786d60564c41362a1b110600000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000000000009121b242d353d444c52565e61666a6f73777b7e8285888c8f92989a9fa2a9aca9a19e938e82786d60594f44342b20150a00000000000000000000000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d13090000000000000000000000000000000000000000000000000000000000000205070812131313131313131308070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e1317191a202020201615130f0a1015191c1d202020201f1d19140e07000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a03000000000000000000000000010d18232d373f464a4c5353535353534d4b4740382e24190e02000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b0500000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000d1a2733404d5a6673808d99aab4aa978b7e7164554c4131282a2a2a2a2a2a2a2a2a232e39424a51535d5b5754524c4847433c342a20150a000000000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700000000000000010e1a26313d4751595e5f606060555c606366686a6b6c6c6c6c6b6a686664615e566060606055534d453c31261a0e02000000000000000000000002090e111414171818191a1b1c1615130f0a0400040b141b2227323a4149505960696e7b849199a3a99f958c7f73685e5246382d22170b00000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000000006101b242d373f474f565d60686d72777c8084878b8e9297999c9fa2aaababa8a19e96918a81796d665c51473d3322190e040000000000000000000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c1313131313130d0c0a07020000000000000000000000000000000000000000000000010a12191f2326262d2d2d2d23221f1b161b212628292d2d2d2c2b29251f19110800000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d04000000000000000000000006121e29343f495156586060606060605a58524a40362a1f1307000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000004101c2834404b546976828f9ca9aea398887b6f6255483c2f3737373737373737373737373039404446514e4b4746413c3b37322a261f180f0600000006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f1306000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000004111d2a36424e59636a6c6c6c6c6b636059595b5d5e5f5f5f5f5e5d5c5a575f626a6c6c6c6c6c5f574d42372b1e120500000000000000000000050d14191e20212324252627282823221f1b160f0700020a111720292f383f444f575f696f7d87929fa9a79f92867a6d6153493f33271b0f03000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000000040e18222d363f49515960686d737a7f84888d9196989b9ea2a9a9acaaaaa29f9b96918c847e746d675c544a40352b2110070000000000000000000000000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b2014080000000000000003060809131313131313130b0a08050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070f111213131312110e0b0706040000000000000000000000000000000000070d121618192020202020201a1917130e08000000000000000000000000000000000000000000000a131c242a2f323339393939302f2c2721262d323536393939393835312a231a11070000000000000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000006131f2c3845515c667884919eabac9f9286796d6053464444444444444444444444444444444444444444444444444444443b3a36312a21180e03000003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c1004000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b98a4aca295897c6f6256493c2f23160906040d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070000000000000006121f2c3845525e6a757979797978706b605c544d5152535352524b515a61696e777979797976695f53463a2d211407000000000000000000050e171f252a2d2e30313233343435302f2c27211910070000060e171d262d333d454d57606b73808d97a2ada2988c8073655b5044372b1f1205000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000000a15202a343e48515b626b707a80868c9196999da0a8a8abaaa7a7a09d9a98928e8a847f79716c605c554b42392e231a0f000000000000000000000000000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c0000000000040a0f13151620202020202020181715110c060000000000000000000000000000000000000000000000000000000000000000000000000000000001080d1113141c1e1f1f20201f1e1b181413100c0701000000000000000000000000010911181e2225252d2d2d2d2d2d2726231f19120a020000000000000000000000000000000000000007121c262e353b3f40464646463c3b38322b30383e41434646464645413c352c23190e03000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a000000000000000000000b1825313e4a56626d72797979797979736e63584b3f3226190c000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000713202d3a4653606d7986939facaa9d908477665c50505050505050505050505050505050505050505050505050505050504846423b332a1f14090000000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c00000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b989f9f9f95897c6f6256493c2f231b1313100c1a2733404d5a6673808d999f9f9f9386796d6053463a2d201307000000000000000613202c3946535f6c7987868686847d736d665f5751464146454d555c606c717b83868686867b6e6155483b2e2215080000000000000000020d17202930363a3b3d3e3f3f4041423c3b38322b23190f040000050b141b2227333b454f59606d7a85929fabaa9e9185786c605346392d201306000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000000030f1b26313c46505a626d727d848d92989ea0a8aaaba8a8a09e9a9795908d8985817d78726d67615a514b433930271c1108000000000000000000000000000000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e00000000060e151b1f21222d2d2d2d2d2d2d2524211d1711090000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d2021292a2c2c2d2c2c2a2824201f1c18120b03000000000000000000000009131b23292e313239393939393933322f2a241c140a000000000000000000000000000000000000020e19242e3840474b4d535353534948433d353a42494e5053535353514d473e352a1f140900000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000c1925323f4c5865727f8686868686868073665a4d4033271a0d0006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000815212e3b4854616e7b879aa4afa99c90837669545d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d55534d453b31261a0e0200000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d3023160700000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e8b9393939393897c6f6256493c2f2d28201f1c181a2733404d5a6673808d939393939386796d6053463a2d20130700000000000000000b1825323e4b5865717e8b9296918780786e69625b524c4550575f676d747e869095948d8074695f53463a2d211407000000000000000009141f29323b4246474a4b4b4c4d4e4f4948433d352b21160a000000020a11172129333d45525d6874808d9aa7ada197887c6f6255483c2f221509000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000006121f2b37434e58626c727f8791969fa2aaaaaaa29f9b9896918e8a8784807d7975706d66605d555045403930271e150b00000000000000000000000000000000000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e00000006101820262b2e2f3939393939393931302d29221b1209000000000000000000000000000000000000000000000000000000000000000000000000040d161e24292c2d363738393939383735312d2c29231d150d0600000000000000000007111b252d343a3e3f464646464646403f3b362e261c1208000000000000000000000000000000000007131f2a35404a5257596060606056544f473d424c545a5c6060605f5e5850473c3125190d0100000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a0000000000000000000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d0004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000916232f3c4956626f7c8995acb6a89c8f82756a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a615f574d42362a1e120500000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d20130700000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1825323e4b5865717e868686868686867c6f6256493c3939352d2c28231d2733404d5a66738086868686868686786d6053463a2d20130700000000000000000b1724313d4a56626d73808c9399938d837b726d615e56515a61696e79818a9298958f82786d60574d42372b1e120500000000000000020e1925303b444d5254565758595a5b5b56544f473d32271b0f0300000000060f18212935414c5663707d8996aab3a9988c7f7265594c3f3226190c000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000815212e3a47535f6a717e889299a1a9aca69f9c98928e8b8784817e7a7773706d6663605c54514b433e342e271e150c0300000000000000000000000000000000000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c302316090000040e18222a32373b3c464646464646463e3d39342d241b110600000000000000000000000000000000000000000000000000000000000000000000010c161f282f35393a4244454646464544413e3a38342f271f17110a02000000000000010d18232d373f464a4c5353535353534d4b4740382e24190e02000000000000000000000000000000000a17232f3b47525c63666c6c6c6c6360594f4349545e66696c6c6c6c6a62584d4135291d100400000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d0100000000000000000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d00000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1623303d495663707c8996a3afa89b8e8177777777777777777777777777777777777777777777777777777777777777776e695f53463a2d211407000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f130600000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000b1724313d4a56626c71797979797979796f6a605447464646413a38342e2726323f4b58636e737979797979797976665c5044382c1f120600000000000000000915212e3a45505a636e74818e939f9590867e756d68605c606c717b838e939f969083796d665c50453c31261a0e020000000000000005111e2a36424d565e61636465666767686360594f43382c1f13070000000000060f1924303a4753606d798698a2aea79a8e8174675b4e4134281b0e000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000006121f2b37434e58626f7c86929aa3aba8a09e948f8a85827e7b7774716e686763605c5453504a4540393128231f1c17110a02000000000000000000000000000000000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f22150900000a15202a343c434749535353535353534b49453e362d22170c0000000000000000000000000000000000000000000000000000000000000000000008131e28313a4145474f515252535352514e4b474540393127221b140b02000000000006121e29343f495156586060606060605a58524a40362a1f1307000000000000000000000000000000000c1926323f4b57636e73797979796f6b6054484e5a66707679797979746a5e5145382b1f120500000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f0300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724303d4a5763707d8a96a3b0ab9e928583838383838383838383838383838383838383838383838383838383838383837b6e6155483b2e2215080000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c100400000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000915212e3a45505a62656c6c6c6c6c6c6c6260584e525353534e4645403930292f3b47525c63666c6c6c6c6c6c6c6c5c544a3f34281c1003000000000000000005111d29343f48525b606d78818f959f98928b827a706b676d747e8690959d9891847b6e675d544a3f332a1f140900000000000000000714202d3a46525e696e707172727374756f6b6054483b2f22150800000000000008131f2c3845515c677885929faba89b8f8275685c4f4235291c0f000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000815212e3a47535f6a76828f98a3aca7a0969189827d7975716e696764615e565653514a46443f38352f312f2d2b28221c140b0200000000000000000000000000000000000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f130700030f1b26323c464e535560606060606060585650483e34291d11050000000000000000000000000000000000000000000000000000000000000000010d19242f3a434c52545c5d5f5f605f5f5d5b5753514b433f332d261d140a00000000000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a000000000000000000000000000000000d1a2633404d59667380868686867d6f635649505c69768286868686796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d8a97a3b0ada1979290909090909090909090909090909090909090909090909090909090909090887b6e6255483b2f2215080000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c0000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d2013070005111d29343f48505658606060606060605654575d5f6060605b53514b423a322a36404a52585a606060606060605f504a42382e23170c000000000000000000010c18222d364044505c666d79829095a09f938f857d746f79818a9298a09992867c6f695e554b42382e21180e0300000000000000000814212e3b4754616e7b7d7e7e7f8081827d6f6356493c3024190d02000000000004101c2934404b556b7784919eaaa99c908376695d5043362a1d10000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000915222f3c4855626f7b88949faaaca09590847d76706d6765615e575754524c494644403a444442413f3e3c3938332d261d140a000000000000000000000000000000000000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f030006131f2b37434e585f626c6c6c6c6c6c6c64625a5045392d211508000000000000000000000000000000000000000000000000000000000000000004111d2935414c565d60696a6b6c6c6c6b6a6864605c5550443f382f261b1106000000000b1825313e4a56626d72797979797979736e63584b3f3226190c000000000000000000000000000000000d1a2633404d596673808c9393897c6f635649505c6976838f939286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d8a97a3b0b3a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d94887b6e6155483b2e22150800000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d12070000000b1825323e4b5865717e8b98a4aca295897c6f6256493c2f23160900040d1a2733404d5a6673808d99a6aca09386796d6053463a2d20130700010c18222d363f454a4b53535353535353495761696b6c6c6c68605c544c443c342e3840474b4d5353535353535353443f3830261c11060000000000000000000006111b2428343f4a545d676d7a839196a19e979188807b838e929fa29f93877d706a5f574d433a30261c0f060000000000000000000b1724313e4a5764717e898a8b8c8d8e8c807366564c4135291e130b060400020509121f2b3844505c667885929eaba99c908376695d5043362a1d10000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000c1926333f4c5966727f8c99a6afa49a90837a706b64605c5554524d4b4746413d3a434a4f50514f4d4c4a4946443f382f261c11060000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a00000815212e3b47535f6a7679797979797979716c6256493d3024170a00000000000000000000000000000000000000000000000000000000000000000613202c3945525d686d757778797979787774716d67625a504941382d22170b030000000c1925323f4c5865727f8686868686868073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1723303d4a5663707d8996a3b0b8b0aba99f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa9aaaaaaaaaa94877a6e6154473b2e211408000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b000000000b1825323e4b5865717e8b989f9f9f95897c6f6256493c2f2316090b10141a2733404d5a6673808d999f9f9f9386796d6053463a2d201307000006111b242d343a3d3e46464646464646505d697378797979746d665e564e463e3528363b3f40464646464646464638342e261e150a000000000000000000000000091217232e38424b555d686e7b849197a2a19a938d8890959da59d928b7f726b61584e453b31281e140a000000000000000000000815222f3b4855626e7c889798999a9a8f8275685d52463a30241d1512100c0e12141a202d3a4653606d7986939faca99c8f8276695c4f4336291c10000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000020f1c2835424f5b6875828e9ba8ac9f93877c6f68605953514b4846423e3b393634434d555b5d5d5c5a59575553504a42382d22170b00000000000000000000000000000000000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f0400000916222f3c4955626f7c868686868686867e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8284858586868584817e79716c605b53493f33271f14090000000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000091623303c4956636f7c8996a2afb0a69f9c9393939393939393939393939393939393939393939393939c9ea6b0aea398877a6d6054473a2d2114070000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c03000000000b1825323e4b5865717e8b9393939393897c6f6256493c2f231610171c20232733404d5a6673808d939393939386796d6053463a2d20130700000009121b22292e313239393939393945525f6b788586868681786d685f584f473f342e2f323339393939393939392c28231c150c030000000000000000000000000006111c263039434c565e696f7c859299a3a49f9a959da0a79e948d80746d62594f463c33291f160c02000000000000000000000613202d394653606c7785929ea5a69f92867a6d61564c41352e27201f1c181a1e21252a34404b55626f7c889aa4afa79b8e8174685b4e4135281b0e000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000003101d293643505c6976838f9ca9a99d9083766a5f564f4645403b3a36302e2d2f3c46555f666a6a6967656462605b544a3f33281c0f030000000000000000000000000000000000000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f2419070000000916222f3c4955626f7c8893939393938b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87909292939292908e8a847e746c655b50443b30251a0e0200000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000815222f3b4855626e7b8895a9b3ab9f948f8686868686868686868686868686868686868686868686868f949eaaac9f928579675d5145392c20130600000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f00000000000b1825323e4b5865717e868686868686867c6f6256493c2f23161a22282d303139404d5a66738086868686868686786d6053463a2d201307000000000911181d2124252d2d2d2d2d323f4c5965727f8c93938e827a6f6a6159514440393028272d2d2d2d2d2d2d2d1f1c17110a030000000000000000000000000000000a141e27313a444d575f6a707d879299a49f9f9f9fa9a0958f82786d605b51473e342a21170d04000000000000000000000005121f2b3744505b6575828f9baaaea3988b7f72685d52454039302d2c2823252a2d30363e45515c6773808c99acb4aa998c7f7366594c403326190d000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000004101d2a3743505d6a7683909da9a79b8e817468584e443d38342e2d2a2a2d2f38424e5866717777757472716f6c665b5044382b1f120600000000000000000000000000000000000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e13080000000916222f3c4955626f7c88959f9f9f978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87949e9f9f9f9e9d9b96918b80776c60574d42362a1e120500000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000714212d3a4754606d7a8797a2ada99c8f82797979797979797979797979797979797979797979797979828f9ca9ab9e9184786b554b4135291d1104000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c22110800000000000b1724313d4a56626c71797979797979796f6a6054473b2e2217242c33393c3d46464b58636e737979797979797976665c5044382c1f12060000000000060c111517182020202025313e4a56626d75818f969490847c706b625b514a423a322a211920202020202012100c060000000000000000000000000000000000020c151f28323b454e58606b717e8793939393939393969083796d665c50493f352c22190f05000000000000000000000000030f1b27333f495364717e8a98a2aeaa9e91857a6d605b514b423d3a38342e31363a3b42465059606d7984919eabaea398897d7063564a3d3023170a000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000003101d293643505c6976838f9ca9a79a8d817467564c413a39352f363036393c424a54606a77838482807f7d7c786c605346392d201306000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c010000000916222f3c4955626f7c8895a2aca4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87949fa3aba6abaaa9a19e928b7f72695e52463a2d20140800000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000613202c3945515d677885929eabaa9d9184776c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c667784919eaaa99c8f8376695c50432f24180d010000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a100000000000000915212e3a45505a62656c6c6c6c6c6c6c6260584e43382b1c2328363e44494a525353525c63666c6c6c6c6c6c6c6c5c544a3f34281c10030000000000000105090b0b13131316222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a13131306030000000000000000000000000000000000000000030d162029333c464f59616c727f8686868686868686847b6e675d544a3f372d231a100700000000000000000000000000000b17222d3a4753606d7a85929faaada1978e81746d605c544f4946444043434246484d525a616b737f8c96a1acac9f92867a6d6053473a2d201407000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000020e1b2835414e5b6874818e9ba7a99c8f8276685e534c4745414343434146474d545b666f7c88908f8d8c8a85796c605346392d201306000000000000000000000000000000000000000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c201304000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8799929995999fa2aaada49f92867b6e6154483b3025190e02000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000004111d2935414c55697683909ca9ab9f928578695f606060606060606060606060606060606060606d7986929faca79a8d8174675a4e4134271b070000000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f120800000000000005111d29343f485056586060606060606056544e463d3227262e343f485055575f6060605a585a606060606060605f504a42382e23170c000000000000000000000000060606121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c03000000000000000000000000000000000000000000000000040e17212a343d47505a626d727979797979797979786e695e554b42382e251b11080000000000000000000000000000000613202c3945515d6773808d98a2aea99d938c7f736d6660595653514a50504d5354575e616c707d87929fa8b0a69b8e8275675d5145392c201306000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000c1926323f4c5965727f8c98a7ac9f92867a6d655e5654514b504f504d5254575f666c7882909c9c9a988e8174655b5044372b1f12050000000000000000000000000000000000000000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d1104000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87878686888d9298a2abaea2988c807366564d41362a1e1105000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000010d19242f414d5a6774808d9aabaea298887b6e61555353535353535353535353535353535355626f7c8899a3afa9988b7e7265584b3f3225180c00000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d00000000000000010c18222d363f454a4b535353535353534947433d342b2830383f44515a61646c6c6c6c66635c5253535353535353443f3830261c11060000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c03000000000000000000000000000000000000000000000000050f18222b353e48515b62656c6c6c6c6c6c6c6c6b615e574d433a30261c13090000000000000000000000000000000004111d2935404b55616e7b86929fa6afa59c918c8079706b6562605c545c5d575e6164696e747e869299a3afaa9f94897d7063554b4035291d1104000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000915222f3c4855626f7b88959faba3998e81776d6863605d555d5c5d565e6164696e78808e949fa8a0958a7d706453493f33271b0f0300000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d01000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d787c7a79797c80869299a4afaa9e918477685e5246392d201407000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000081724313e4a5764717d8a99a3afaa988b7e7165574d42464646464646464646464646424d5765727f8c98abada297887b6f6255483c2f2215090000000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e05000000000000000006111b242d343a3d3e464646464646463c3b38322b29323a424a505b636c7079797979736e63574b46464646464638342e261e150a00000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b00000000000000000000000000000000000000000000000000061019232c363f4951565860606060606060605e54524d453b31281e140a0100000000000000000000000000000000010d18242f3a46525e68727f8c949fa8ada49c928d837d77726f6d666a69696a696e71757b818a9298a2abaea2988f82766b6054433a2f24180d01000000000000000205111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d100d0b08030000000000000000000000000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d1003000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000815212e3a47535f6a7683909da5ab9e938e817a74706d676a6969696a686e71757b828e929da6a59d9083786c605346392d22170b00000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e130800000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b020405060606050402000000000000000000000000000000000000000000000006121f2c3844515c666d6f6d686d6f737d87939facaca096877a6e6154473b2e211408000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000714212e3a4754616d7a86929faca89b8e8275695e53463d313939393939393939303946525e6976828f9ca9ab9e9285786c605346392d201306000000000000000000050e172029313940454f54596063676d70727576787879797878777573706d6865605d55504a423c332b231911070000000000000000000009121b22292e3132393939393939392f2e2b272b333b444c545c606d727e868686868073665a4d4039393939392c28231c150c03000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d12070000000000000000000000000000000000000000000000000007111a242d373f464a4c5353535353535353524846423b33291f160c0200000000000000000000000000000000000007131d2a36414d56606d78829096a1a8ada49d959089837f7c797777767677787b7d82868e939fa2aaaea39f92867b6e61594f4431281d130700000000000002080e11141e2a3744515d6a778490939393938f8376695c50433629201b1a18140f0801000000000000000000000004111e2a3744515d6a778490939393938f8376695c504336291d1001000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c1000000006121f2b37434e5863707d89939da6a59e938e86807d7a787776767677787a7e82878f949da5a69d938a7d70655b5044372b1b1106000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c0100000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180c0e101213131312100e0b0807050200000000000000000000000000000000000004101c2834404a545c6062615e60626b75818e9ba8b2a8968a7d7063574a3d3024170a000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f231609000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000713202d3946525d6876828f9ca9ac9f92867b6e61584e433b322c292424292c3139424d57616e7b86929faca89b8e8174655b5044372b1f120500000000000000000000050e171f272f343d43484f54555c606366686a6b6c6c6c6c6b6a686664615e5653514b443f38302a211911080000000000000000000000000911181d2124252d2d2d2d2d2d2d2322242c343d454d565d666d747f87929892857b6e6154473b2e2d2d2d2d1f1c17110a03000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c000000000000000000000000000000000000000000000000000008121b252d343a3e3f4646464646464646453b3a36302921170d0400000000000000000000000000000000000000010e1925303b44505c666e7a849196a0a7afa7a09d95908c8985848383838485878a8e92999da5aeaaa39f918a7e71695f53473d321f160c010000000000050d14191e20212d3744515d6a77838686868686868276695c5043362d2d272724201a130b020000000000000000000004111e2a3744515d6a77838686868686868276695c504336291c140a000000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000030f1a26313c4855606b74818e949da5a59e98928d898785838382838485878a8f93999fa6a49d948e81746c6153493f33271b0a000000000000000000000000000000000000000000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c2013040000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312518191b1d1f1f201f1f1d1b181414110e080200000000000000000000000000000000000c18232e39424a5153555452535964717e8a97a4b1a5988b7f7265584c3f3225190c000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f221508000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000005111d2935414c5664717e8b96a1ada3998d80746a60564d443e39352f2f35383c434b545e6973808d99a3aca096897d706353493f33271b0f030000000000000000000000050d151d232932383d44484b5161696b6c6c6c68605c5f5e5d5c5a5754524c47454039342e261e180f080000000000000000000000000000060c11151718202020202020151d2328363e464f575f686d78818c939993877d70695e52463a2d2020202012100c06000000000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c1004000000000000000000000000000000000000000000000000000009131b23292e31323939393939393939382e2d2a251f170f0500000000000000000000000000000000000000000008141f28343f4a545e686e7b8490959fa3abaca7a09d98989291908f90919297979b9fa3abaca7a098928b7f726c61574d42352b210d040000000000050e171e252a2d2e3939424f5b6771777979797979797670665a4e423939393433302b251d140b0100000000000000000003101d2936424f5b6771777979797979797670665a4e42352e261c12070000101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c10000000000a15202c38444f59606d79828e939da0a7a29f9a96979290908f90909297979b9fa4a7a09d928d82786d605a5041382d22170b000000000000000000000000000000000000000000000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d11040000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e31252225282a2b2c2d2c2b2a282521201e19140f0a0400000000000000000000000000000007121c2730394044464847464855626f7b8895a2aea6998c7f7366594c403326190d000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d211407000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000010d1924303a4653606d7984919ea7ab9f92877c6f685e564f47454141414045474e555c666e7b86929faba89e9184786c605346392d22170b00000000000000000000000000030b121821272c323839505d697378797979746d665e564e4f4d4a4746413a39352f28231c150c06000000000000000000000000000000000105090b0b131313130e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e1113130603000000000000000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f13060000000000000000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d2d2b21201e1a140d0500000000000000000000000000000000000000000000020b17232e38424d565f696e7b838d92999fa4acacaaaaa39f9e9d9c9c9d9ea1a9a8acaca8a19e9590867e726d625a50453c3123190f0000000000020d1720293036393b4646464a555f676a6c6c6c6c6c6c69665e54494646464641403c362f261d1308000000000000000000010e1a27333f4a555f676a6c6c6c6c6c6c69665e544b4740382e24190e0200101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683908f8276695c4f4336291c100000000003101c27333d45515c676d79818990959b9fa2aaa9a19e9d9c9c9c9d9fa2a9aaa29f9b95908a80786d665c51473e2f261b11060000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312d2e32353738393939383735312e2d2a251f1b150d070100000000000000000000000000000b151e272e34383a3c3a3a4754606d7a8793a0b5a69a8d8073675a4d4034271a0d000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c201306000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000008131f2c3845515c67727f8b95a0aba39991847a6e68615954514c4e4e4b5153575f676d78839098a2aca0968b7f72665b5044382b1b1106000000000000000000000000000001070c161b21273845525f6b788586868681786d685f584f473f3a3936302c29241d17110a03000000000000000000000000000000000000000000000600070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e020600000000000000000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d20130700000000000000000000000000000000000000000000000000000000060d1216181920202020202020201f1514120e090200000000000000000000000000000000000000000000000006111c26303b444d575f696e7880878f939a9ea1a8a7a9aaaaaaa9a9aaaaa9a8aaa39f9c96918b837c716c625b51483e332a1f1107000000000008141e29323b4146535353535353555b5d6060606060605c5a545353535353534e4c4841382f251a0f030000000000000000000a16222e39434d555b5d6060606060606060605a57524a40352a1f130700101c2936434f5c6976828f908376695d5043362a1d10030000000000000000000000000000000000000000000000010507070b0b0b0b0b0b0b101d2a3643505d697683908f8276695c4f4336291c1000000000000b16212834404b555c676d747d838a8e9298989a9c9d9e9f9f9f9e9e9c9a9898928e8a837d746d665c544a40352c1d140a0000000000000000000000000000000000000000000000000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e1308000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e373a3b3f4143454646464543413e3b3936302b272018130c0400000000000000000000000000030c151c23282c2d2f2e3a4653606d798699a3afa79a8d8074675a4d4134271a0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d1104000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000004101c2834404b55606d78839099a3aba09690837a706b64605d555b5b555d60636a6e79818e959faaa49a9184796d60544a3f33281c0a0000000000000000000000000000000000040a0f1926323f4c5965727f8c93938e827a6f6a6159514440393028201d18120c0600000000000000000000000000000000000000000000000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f14090000000000000000000000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000106090b0c131313131313131312080705020000000000000000000000000000000000000000000000000000000a141e29323c454d575e666d737c82878d9196989a9c9d9e9f9f9f9f9e9c9b9998928f8a847f786f6a625a51493f362c21180e0000000000020e1925303b444c525f6060606060605d5b5553535353534f54566060606060605a58534a41362b20140800000000000000000006111c27313b434a4f5153515a61646c6c6c6c66635c52473b2f23170a00101c2936434f5c6976828f908376695d5043362a1d100300000000000000000000000000000000000000000002080d11131417171717171717171d2a3643505d697683908f8276695c4f4336291c100000000000050c18232e39434b555c606b6f787d8185898b8e9091919292929191908e8c8985827d77706b605c544b42392e231a0b0200000000000000000000000000000000000000000000000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c01000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e4246484c4e505252535252504e4b4746413b373229241d160d0500000000000000000000000000030b12181c1f20222c3844505c667986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d01000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000c18232e3944515c666f7c87929fa4a8a09590847d76716d6769676869676d70757b838e939ea7a59f93887d70665c5142382d22170b000000000000000000000000000000000000000b1825313e4a56626d75818f969490847c706b625b514a423a322a2119110600000000000000000000000000000000000000000000000000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d02000000000000000000000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c17202a333c454d545c606a6f757b8084888b8d8f91929293929291908e8c8986827d79726d665f5850483f372d241a0f06000000000005111e2a36414c565e6c6c6c6c6c6c6c6a675f554a46444f5960636c6c6c6c6c6c67645c53483c3024180b0000000000000000000008101f2931323a424a505b636c7079797979736e63574b3f3226190c00101c2936434f5c6976828f908376695d5043362a1d10030000000000000000000000000000000000000000050d13191e20212424242424242424242a3643505d697683908f8276695c4f4336291c1000000000000007121d273039434b515960666c7075797c7f81838485858685858483817f7d7975706b636159514b423930271c110800000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c20130400000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b464d5355585b5d5e5f605f5e5d5b5854524d47433d352f281f170f050000000000000000000000000000070c1012131c28343f4a5f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e21140700000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000007121d2834404a54606a727f8c929ca4a7a096918a827d7a7775747475767a7d818790959ea5a59e938d80736b60544b402f261c1106000000000000000000000000000000000000000916222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a0200000000000000000000000000000000000000000000000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e050000000000000000000000000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e1105000000000000000000000000000000000000000000000000000000000000000000000000020608080c0e111212131312110e0c080705020000000000000000000000000000000000000000050e18212a333b424b51585f626a6e73787b7e80828485858686858483817f7c7975716d66605c544e463f362d251b12080000000000000714202d3946525e68767979797979797771675b4f434854606b70797979797979746e64584c4033271a0d00000000000000000007121a222b333b444c545c606d727e868686868073665a4d4033271a0d00101c2936434f5c6976828f908376695d5043362a1d100b0b0b0b0b0b0b07070501000000000000000000050e171e252a2d2e313131313131313131313643505d697683908f8276695c4f4336291c10000000000000000b151e27303940454f545b6063676d7072747677787879797877767472706d66636159554f45403930271e150b0000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d110400000000000000000916222f3c4955626f7c8895a2afa4978b7e7164585053575f6165686a6b6c6c6c6b6a6864615e56544e45403a312921170f0500000000000000000000000000000004060c17232e46535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d20130700000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000c18232e39424e58626d73808c929ea1a8a19e948f8a8683828181828386898e93999fa7a39f938f81786d60594f42392e1d140a000000000000000000000000000000000000000006121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c03000000000000000000000000000000000000000000030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b11080000000000000000000000000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e020000000000000000000000000000000000000000000000000000000000000000000003090e121415191b1d1e1f201f1f1e1b191514120e090300000000000000000000000000000000000000060f182129303940454e53575f6266696e71747677787979797877767572706d6764605c54504a423c342d241b1309000000000000000814212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271b0e00000000000000030b1218242c343d454d565d666d747f87929892857b6e6154473b2e21140800101c2936434f5c6976828f908376695d5043362a1d17171717171717171413110d0802000000000000020d1720293036393a3e3e3e3e3e3e3e3e3e3e3e43505d697683908f8276695c4f4336291c1000000000000000030c151e272e343d424a5053555d60636567696a6b6c6c6c6b6b69676563605c54554f48443e342e271e150c0300000000000000000000000000000000000000000000000000000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d0100000000000000000916222f3c4955626f7c8895a2afa4978b7e7164545c6064696e72747678797979787674716e68626058514b433b332921170d030000000000000000000000000000000013202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d110500000000000000000000000000000203101d2a3643505d69768390908376695d5043362a1d100302000000000000000000000007121c27303d46515b646e73808a92979fa3a69f9c9992908f8e8e8f9092989b9fa4a69f99928c81786d665c50473d30271d0b020000000000000000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c03000000000000000000000000000000000000000007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000000000000000000000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e1408000000000000000000000000000000000000000000000000000000000000000000060c11151a1e212226282a2b2c2c2c2b2a282522211e1a14100b05000000000000000000000000000000000000060f171e272e343c43474e5355575f626567696a6b6c6c6c6c6b69686663605c5553504a443f38302a221b120901000000000000000814212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b0e000000000000050c151d2328363e464f575f686d78818c939993877d70695e52463a2d20140700101c2936434f5c6976828f908376695d5043362a24242424242424242421201e19130d05000000000008131e29323a4146474a4a4a4a4a4a4a4a4a4a4a4a505d697683908f8276695c4f4336291c100000000000000000030c151d23282f383f44464b515356585b5d5e5e5f5f5f5e5e5d5b595653514b48443e383328231d150c0300000000000000000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e13080000000000000000000916222f3c4955626f7c8895a2afa4978b7e716460666d71777b7f8183858586858583817e7b756f6a605d554d453b33291f150b0100000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d01000000000000000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a05000000000000000000000b151e2b343f49525c646e737e858e92999ea1a8a39f9d9c9a9b9c9d9fa3a9a29f9b948f877f776d665c544a3f352c1e150b00000000000000000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b00000000000000000000000000000000000000000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b02000000000000000000000000000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d020000000000000000000000000000000000000000000000000000000000000002090e171d1f262b2e2f32353738393939383735322e2d2b261f1c160c07010000000000000000000000000000000000050c151d232831373c4247484d5355585a5c5e5f5f605f5f5e5d5b595653514b46443f38342e261e1810090000000000000000000814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e0000000000060e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e110500101c2936434f5c6976828f908376695d504336313131313131313131312e2d2a251e170e05000000010d1925303a444c5254575757575757575757575757575d697683908f8276695c4f4336291c10000000000000000000030b12181d262d333839404547494c4e5051525253525251504e4c4a4645403938332c282118120b0300000000000000000000000000000000000000000000000000000000000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c010000000000000000000916222f3c4955626f7c8895a2afa4978b7e71646a6f787e83888b8e909192939291908e8b86827c746d675e574d453b31271d120700000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e13080000000000000000000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b161009010000000000000000030c19222d37404a525c636c717a81868d9196989b9c9e9f9f9f9f9e9d9b9997928e89827c736c655c544b42382e231a0c03000000000000000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d1207000000000000000000000000000000000000000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e040000000000000000000000000000000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000050d141a22282d31373a3b3f4144454546464544413f3b3a37312c272118120b030000000000000000000000000000000000030b121820262b31373a3c4247484b4d4f51525253535251504e4c494745403a38342e28231c140c06000000000000000000000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e00000000070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e0200101c2936434f5c6976828f908376695d50433e3e3e3e3e3e3e3e3e3e3e3a3936302920170d02000005111e2a36414c565e616464646464646464646464646464697683908f8276695c4f4336291c100000000000000000000000070b141c22282b2f35383a3d3f41434445454646454443413f3d3a38342e2c28211c160c070000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000916222f3c4955626f7c8895a2afa4978b7e716c717c838b9095989b9d9e9f9f9f9e9d9b99928f8781796e695e574d43392f23180c03000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a01000000000000000007101b252e38404a525a61686d747b8084888b8e90919292929291908e8c8985817c766f6a605b534b423930261c1108000000000000000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c000000000000000000000000000000000000000d1a2633404d59667380868686868686868680746c61574e43392f251b100700000000000000000000000000000000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d0500000000000000000000000000000000000000000000000000000000000000060f171f252a34393c4247484c4e505152535252514e4c4846423c383329241d150d03000000000000000000000000000000000000070c151b20262b2e31373a3b3e41434445464646454443423f3d3a38342f2c28231c17110a0200000000000000000000000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f14090000101c2936434f5c6976828f908376695d504a4a4a4a4a4a4a4a4a4a4a4a4746413a32291e130800000713202d3946525e686d7171717171717171717171717171717683908f8276695c4f4336291c10000000000000000000000000020a11171c1f24292c2d3032343637383939393838363432302d2c28231d1c16100b050000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d1104000000000000000000000916222f3c4955626f7c8895a2afa4978b7e71717e8790959da09e9c9b9a9b9c9ea1a9aba39f9a938e847b6e695e554b403429201509000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e04000000000000000000000009131c252c33373939393943505d69768390908376695d50433939393937332c251c130900000000000000000009131c262e38404850565e61696e73787c7e818384858686858583817f7c79746f6a625f585049413930271e150a0000000000000000000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c10040000000000000000000000000000000000000c1925323f4b57636d737979797979797979746e645a50453c31281d120900000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e080200000000000000000000000000000000000000000000000000000000000000060f18212930363e45494d5355595b5d5e5f5f5f5e5d5b5855534d48443d352f271f150d03000000000000000000000000000000000000030a0f151a1e21262b2e2f32343637383939393938363533302d2c29231f1c17110b06000000000000000000000000000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e0000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d020000101c2936434f5c6976828f908376695d5757575757575757575757575754524c443a3025190d01000714212e3a4754616d7a7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7e83918f8276695c4f4336291c100000000000000000000000000000060b0f12181d1f202325282a2b2b2c2c2c2b2b2a282623201f1c1812100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d01000000000000000000000916222f3c4955626f7c8895a2afa4978a7e717e8892999e9896918f8e8d8e8f92979b9fa4aca49f9691847b6e675c51453c31261a0e020000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c000000000000000000000005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b10050000000000000000010a141c262e363e444c52575e61666a6f7274767878797978787675726f6d66626058534e443f382f271e150c03000000000000000000000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f13060000000000000000000000000000000000000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708121313131313131313080705020000000000000000000000000000000000000000000000000000000000000000030d18212a333b42465055575f6265686a6b6c6c6c6b6a6865615f57544f45403931271f150b010000000000000000000000000000000000000003090e12151a1e21222527292b2c2c2d2c2c2b2a282623201f1c1812100c060000000000000000000000000000000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e00000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e05000000101c2936434f5c6976828f908376696464646464646464646464646464615e564c41362a1e1105000a1723303d4a5663707d898a8a8a8a8a8a8a8a8a8a8a8a8a8a8a91958f8276695c4f4336291c100000000000000000000000000000000003070c10131416191b1d1e1f1f201f1f1e1d1b19171313100c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e130800000000000000000000000916222f3c4955626f7c8895a2afa4978a7e7c86929a96918c8784828181818285898e939aa1a9a8a0969083796d60574e42372b1f14090000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d0000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e0400000000000000000000000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a000000000000000000020a131c242c323a41464d5254585f626568696b6c6c6c6c6b6a686663605c54544e47433c332d261d150c03000000000000000000000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d20130700000000000000000000000000000000000007131e2a35404952575960606060606060605a58524a40362c21180d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2a333c454d525a6164696e72747778787979787774726e69636059514b433931271d12070000000000000000000000000000000000000000000206090e121415181a1c1e1f1f20201f1e1d1b19161413100c070300000000000000000000000000000000000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c00030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b110800000000101c2936434f5c6976828f9083767171717171717171717171717171716d685e5246392d201307000a1723303d4a5663707d8993939393939393939393939393939393938f8276695c4f4336291c10000000000000000000000000000000000000000406070a0c0e1011121213131211100e0c0a07060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c0100000000000000000000000916222f3c4955626f7c8895a2afa3978a7e839098938d847f7b777574747476797c81889297a1a9a89f958d80736a5f53473b30251a0e0200000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d000000000000000009121c252e363e454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b11080000000000000000000000000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f00000000000000000000010a121a202830363b4246484e5355585b5d5e5f5f5a61646c6c6c6c66635c52473d373127221b140b03000000000000000000000000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e211408000000000000000000000000000000000000020d19242e3740474b4d53535353535353534d4c4740382f241a0f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000030613131313131313130d0c0a07020000000000000000000000000003060809131313131313130b0b090501000000000000000007121d27313c464e575e616c71777b7f8183848586858584817f7b76706b605d554b43392f23180c040000000000000000000000000000000000000000000000020608080b0e1011121313131211100f0c0a07060400000000000000000000000000000000000000000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b0007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000101c2936434f5c6976828f91837e7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7a6d6154473a2e211407000a1723303d4a5663707d868686868686868686868686868686868686868276695c4f4336291c1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c2013040000000000000000000000000916222f3c4955626f7c8895a2afa89b8e818e9593878079726e6969686768656c6f757d859297a2ada79f92877b6e62574d42362a1e110500000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000c1925323f4c5865727f8686868686868073665a4d4033271a0d0000000000000000000a131c242c333b42464d5355575f626466696a6b6b6c6c6c6b6a686663605d55544f47423c332d241b130900000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e12000000000000000000000000080e161e252a30363a3c4347484b4e504a505b636c7079797979736e63574b3f32262017110a020000000000000000000000000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d2014070000000000000000000000000000000000000007121c252e353b3f404646464646464646413f3c362f261d12080000000000000000000000000000000000000000000000000000000000000000000000000000000000060c101220202020202020201a1917130e0800000000000000000000040a0f13151620202020202020181715110c06000000000000000c18242f39434e585f696e767e83888c8e909192929291908e8b87827d746d675d554b40342920150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e221609000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b020000000000101c2936434f5c6976828f95918a8a8a8a8a8a8a8a8a8a8a8a8a8a8a897d7063564a3d3023170a000916222f3c4854606b70797979797979797979797979797979797979797670665a4e4135281c0f00000000000000000000000000000000000003080b0d0e13131313131313131313131313131313131313131313131313131313131313131311100e0a06000000000000000000000000000000000000000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d11040000000000000000000000000916222f3c4955626f7c8895a2afaa9e938e9393877e736d67615e575b5a535b60626b707c85929fa6afa3998e8175695e52463a2d20140800000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825313e4a56626d72797979797979736e63584b3f3226190c000000000000000000010a121a212930363c4247485761696b6c6c6c68605c5f5f5e5d5b595653514b48433d37312a211b1209010000000000000000000000000013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d201300000000000000000000000000050c13191f252a2d32373b3c3f444c545c606d727e868686868073665a4d4033271a0b060000000000000000000000000000000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e110500000000000000000000000000000000000000000a131c242a2f323339393939393939393433302b241d140b00000000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2726231f19120a0200000000000000070f161b1f22232d2d2d2d2d2d2d2524211d181109000000000004101d2935404b555f6a6e7b838a9095989b9c9a989898999c9b9a938f8981796d675c51453d32271b0f00000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e1206000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e04000000000000101c2936434f5c6976828f9393939393939393939393939393939393897d7063564a3d3023170a000713202c38444f5960636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69665e54493d3225190d0000000000000000000000000000000001080f14181a1b2020202020202020202020202020202020202020202020202020202020202020201e1d1a16110b04000000000000000000000000000000000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d010000000000000000000000000916222f3c4955626f7c8895a2afafa59e9b958c7f736c605c55524d4e4e49505359606a717e8a949fabab9f92877b6e6154473b3025190e02000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a0000000000000000000000080f171f252a313744505d697378797979746d665e564e504f4c4a4745403938322b2620180f0900000000000000000000000000000013202d394653606c798686868686868686909494908686868686868686796c605346392d2013000000000000000000000000000002080d141a1e20262b343d454d565d666d747f87929892857b6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e020000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b02000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c23282c393939393939393933322f2a241c140a00000000000007101920272b2e2f3939393939393932312e29221b12090000000006131f2c3945515d676e7c8490959d9d9993908d8b8b8b8d8f92999f9c938e82796d60584e43372b1c110600000000000000000000000106090b0c0e06060300000000000000020405060605040200000000000002070a0c0d0b0b0905010000000000000000000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d01000d1a2633404d59667380868686868686868680746c61574e43392f251b100700000000000000101c2936434f5c697682868686868686868686868686868686868686867d7063564a3d3023170a0004101c27333d474f5456606060606060606060606060606060606060605c5a544c42382c211509000000000000000000000000000000020b131a202427272d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2a2927221c150d0500000000000000000000000000000000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e1308000000000000000000000000000916222f3c4955626f7c8895a2afb7afa89d9083786d605a514b464241413f44464f58616c76828f9ca9afa3998c7f7266564c41362a1e1105000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000006121e29343f495156586060606060605a58524a40362a1f1307000000000000000000000000050d141a1f263845525f6b788586868681786d685f584f47403d3a38352f2c27211a150e060000000000000000000000000000000013202d394653606c798693939393939393969696969393939393939386796c605346392d201300000000000000000000000000000000050c151d2328363e464f575f686d78818c939993877d70695e52463a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e14080000000000000000000000000000000000000000000000070d1316191a20202020202020201a1a17130e0801000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e262e34384646464646464646403f3b362e261c120800000000040f19222b32383b3c464646464646463e3d3a342d241b1106000004111d2935414c55606d798391969f9b938e8783807f7e7f8082878f949e9d948e81746a605447382e23170b00000000000000000000070d121618191b13120f0b06000608080c0e1112131312110f0c09080603080e1317191a181715110c06000000000000000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b110700000c1925323f4b57636d737979797979797979746e645a50453c31281d120900000000000000000f1c2835414e5a66707679797979797979797979797979797979797979706b6054483c2f22160900000b16212b353d44484a535353535353535353535353535353535353534f4e49423a30261b10050000000000000000000000000000010b141d252b3033343939393939393939393939393939393939393939393939393939393939393939393736332e271f170d040000000000000000000000000000000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c01000000000000000000000000000916222f3c4955626f7c8895a2afb9ada1968a7d70665c5045403936302d33373d46505a63707d8a97a1adab9d908377685e5246392d201407000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000d1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000010d18232d373f464a4c5353535353534d4b4740382e24190e020000000000000000000000000002090e1926323f4c5965727f8c93938e827a6f6a6159514440393029241d1b160e0903000000000000000000000000000000000013202d394653606c798693928d89898989898989898989898989898986796c605346392d2013000000000000000000000000000000060e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e11050000000000000000000000000000000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d0200000000000000000000000000000000000000000000000002070a0c0d13131313131313130e0d0b0703000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f4453535353535353534d4b4740382e24190e020000000a16202b343d434749535353535353534b4a453f362d22180c01000613202c3945515d6773808d95a09b918c817b767372717273767b828f939e9f93877c6f62544a3f34281c100300000000000000010911181e22252628201f1c17110e121415181b1e1e1f201f1e1c191615130f12191f2326272524211d181109000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b13090000000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c0000000000000000000d1925323d49545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6360594f44382c2013070000050f19232b33383c3d4646464646464646464646464646464646464643413d3830281e140a00000000000000000000000000000008131d262f363c404146464646464646464646464646464646464646464646464646464646464646464644423f3931291f150b00000000000000000000000000000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c20130400000000000000000000000000000916222f3c4955626f7c8895a2afb7ab9e9184786c60544a3f342e2a2522272b343e4653606c7885919eabac9f93877a6e6154473b2e211408000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000002090e1a2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000007111b252d343a3e3f464646464646403f3b362e261c1208000000000000000000000000000000000b1825313e4a56626d75818f969490847c706b625b514a423a322a211911060000000000000000000000000000000000000013202d394653606c7986938d807d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7063564a3d3023170a0000000000000000000000000000070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424a505f606060606060605a58524a40362a1f13070000030f1b27323d464e545660606060606060585650483f34291d1105000714212d3a4754606d7a85929f9e948c7f746e696765656566696e78818f98a39a8e8175665c5044382b1f12060000000000000009131b23292e3132352d2b28221c1a1e212225282a2b2c2c2b2a282622221f1b1c242a2f323332312e29221b1209000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e1811090100000007131e2a35404952575960606060606060605a58524a40362c21180d040000000000000000000915212c38424c545a5c6060606060606060606060606060606060606056544f473d33271c100400000008111921272c2f30393939393939393939393939393939393939393635322c261e160c020000000000000000000000000000030f1a252f3841484c4e535353535353535353535353535353535353535353535353535353535353535353514f4a433b31271c11060000000000000000000000000000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d110400000000000000000000000000000916222f3c4955626f7c8895a2afb6ac9a8d8073665b5042382e231d1a171b222b3744505b6574818e9ba7afa49a8a7e7164574b3e31241807000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000040a0f141a1e2633404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000009131b23292e313239393939393933322f2a241c140a00000000000000000000000000000000000916222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a02000000000000000000000000000000000013202d394653606c7986938b7e727070707070707070707070707070706b6054483c2f22160900000000000000000000000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f14090000000000000000000000000000000000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000001070b0f1112131313131313130a090704000001070b0f1112131313131313130a0907040000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c66635c52473b2f23170a000006131f2b38434e5860626c6c6c6c6c6c6c65625a50453a2e211509000b1825323e4b5865717e8b989e9c8f82756d615e57585858575e666e7b86929f9e9285786d6053463a2d20130700000000000009121b252d353a3e3f413938332d26262b2e2f323537383939383735322f2e2b27262e353b3f403e3d3a342d241b120900000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d070000000000020d19242e3740474b4d53535353535353534d4c4740382f241a0f060000000000000000000005101b26303a42494e4f535353535353535353535353535353535353534a48443d352b21160b0000000000080f161c2022232d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292825211b140c040000000000000000000000000000000814202b36414a53585a6060606060606060606060606060606060606060606060606060606060606060605d5b554d43392e22160a0000000000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000916222f3c4955626f7c8895a2afafa49a897d7063544a3f30261c120e0b0f1b27333f495364717e8b97abb5ac9a8d8073675a4d402e23180c000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000000000002080d161b1f252a2d33404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000010911181e2225252d2d2d2d2d2d2726231f19120a02000000000000000000000000000000000006121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c030000000000000000000000000000000013202d394653606c7986938b7e7265636363636363636363636363636360594f44382c201307000000000000000000000000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d0200000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e08020000000000000000000000000000000000000000000000000000000000000000000000000000000000050c12171b1e1f20202020202020171613100b050c12171b1e1f20202020202020171613100b05000000000006121f2c3844505c667679797979797979736e63584b3f3226190c00000815222e3b4754606a6f79797979797979716c62564a3d3124170b000e1b2835414e5b6874818e909192897c6f635b524d4c4b4c4d545e6976828f9ca297887b6e6155483b2e221508000000000009121b252d373f464a4c4e46443f382f31373a3b3f41444546464544423f3c3b37322c3840474b4d4b4a453f362d241a120800000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b0906010000000000000007121c252e353b3f404646464646464646413f3c362f261d12080000000000000000000000000a141e2830383d4143464646464646464646464646464646464646463d3c38332b23190f05000000000000050b10131617202020202020202020202020202020202020201c1c1915100a02000000000000000000000000000000000b1824303c48535c64676c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a675f554a3f33271a0e00000000000000000000000000000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e13080000000000000000000000000000000916222f3c4955626f7c8895a2afac9f93867a6d6053473a2d20140a00000b17222d3c4855626f7b8899a4afa99c8f837669554b4034281c10040000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000050c131921272c30363a3b404d596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000070d121618192020202020201a1917130e0800000000000000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c0300000000000000000000000000000013202d394653606c7986938b7e72655856565656565656565656565656544f473d33271c10040000000000000000000000000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070812131313131313131308070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f171e23282a2b2d2d2d2d2d2d2d2322201c160f171e23282a2b2d2d2d2d2d2d2d2322201c160f08000000000713202d3a4653606d78868686868686868073665a4d4033271a0d00000916232f3c4956626f7c868686868686867e7165584b3e3225180b000c1926323f4c5965727f8283848586786d605346423f3e3f424d576773808d9aa995897c6f6256493c2f2316090000000008121b242d373f495157595b53504a42383c4247484b4e5151525352514f4c4947433c39404a52585a585650483f362c241a1108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a131c242a2f323339393939393939393433302b241d140b00000000000000000000000000020c161e262c32353639393939393939393939393939393939393939302f2c27211911080000000000000000000407090a13131313131313131313131313131313131313100f0d09050000000000000000000000000000000000000d1a2733404c58646e747979797979797979797979797979797979797979797979797979797979797979797771675b4f4236291d10000000000000000000000000000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c020000000000000000000000000000000916222f3c4955626f7c8895a2afaa9e918477675d5145392c20130200000613202d3a4653606d7986939facab9e918478675c5145382c1f13060000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000000070e171e252a32383b4246474b4e596673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000070d121618192020202020201a1917130e080000000000000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b00000000000000000000000000000013202d394653606c7986938b7e7265584b4a4a4a4a4a4a4a4a4a4a4a4a48443d352b21160b000000000000000000000000030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b11080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f1821282f34373839393939393939302f2c27211921282f34373839393939393939302f2c27211911080000000713202d3a4653606d798693939393938d8073665a4d4033271a0d00000916232f3c4956626f7c8993939393938b7e7165584b3e3225180b000c1825313e4a57636d7275767778796d665c5044383030363f4c5966727f8c99ab96897d7063564a3d3023170a000000040d1a242d363f49515b626568605b544a45464d5355585b5d5e5f5f5e5d5b5955544e47454a525c636665625a50483e362c231a0d0400000000000000000003060809131313131313131313131313131313131313131313131313130b0a0804000000000000000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b020000000000000000000000000000040c141b212528292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2322201c160f0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a67748186868686868686868686868686868686868686868686868686868686868686868683776a5d5144372a1e110000000000000000000000000000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c201304000000000000000000000000000000000916222f3c4955626f7c8895a2afa89c8f827569554b4035291d1104000006131f2c3845515c677884919eabac9f9386796d6053463a2d2013070000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000071019202930363d44484d5254575b5d6673808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000010911181e2225252d2d2d2d2d2d2726231f19120a020000000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d1207000000000000000000000000000013202d394653606c7986938b7e7265584b3f3d3d3d3d3d3d3d3d3d3d3d3c38332b23190f0500000000000000000000000007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000000000000000000000000000000000000002070c0f11121313131313131313131313131313131313131313131313131313131313131313131313131308070502000000000000000000000001070b0f1112131313131313130a09070400000000000000010c17212a333a404345464646464646463d3c38332b232a333a404345464646464646463d3c38332b23190f0500000713202d3a4653606d7986939f9f9f998d8073665a4d4033271a0d00000916232f3c4956626f7c89959f9f9f988b7e7165584b3e3225180b000916222e3a46515b636568696b676d675c544a3f41414142464e586673808d99a399887c6f6255493c2f2216090000010c161f2c363f48515b626d72746c665b545153575f6265686a6b6c6c6b6a68656260585452525c636e73716c625a50483e352c1f160c01000000000000040a0f12151520202020202020202020202020202020202020202020202020171714110c05000000000000000000070d1316191a20202020202020201a1a17130e080100000000000000000000000000000000020a1015191c1c20202020202020202020202020202020202020171613100b05000000000000000000000000000000000000000003090d1012131313131313130e0d0b080300000000000000000000000000000000000000000e1b2734414e5a6774818d939393939393939393939393939393939393939393939393939393939393939083776a5d5144372a1e1100000000000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d1104000000000000000000000000000000000916222f3c4955626f7c8895a2afa79a8d8174675a4e412f24180d01000004101c2834404b556a7683909da9afa49a887b6e6155483b2e2215080000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000061019222b323a41464f54575e6164676a6b73808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000009131b23292e313239393939393933322f2a241c140a00000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c000000000000000000000000000013202d394653606c7986938b7e7265584b3f3d3d3d3d3d3d3d3d3d3d3d3c39332c231a10050000000000000000000000000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b02000000000000000000000000000000000000000000060d13181c1e1f202020202020202020202020202020202020202020202020202020202020202020202020201514120e09030000000000000000050c12171b1e1f20202020202020171613100b05000000000007121e28333c454b5052535353535353534a48443d352b333c454b5052535353535353534a48443d352b21160b00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2aca4988b7e7165584b3e3225180b0006121e2a353f495157595b5d555c605c554b474e4e4e4e4d52575f6a76838f9c9f92867a6d6054473a2d211407000007131d28313e48505a626d727f81786c665b5c6064696e727477787979787775726f6a65605d5c636e73807e716c615a50473e31281e13080000000000060e151b1f21222d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c17100800000000000000000002070a0c0d13131313131313130e0d0b0703000000000000000000000000000000000000000005090d0f10131313131313131313131313131313131313130a090704000000000000000000000000000000000000000000070e14191d1f202020202020201b1a17140e08010000000000000000000000000000000000000e1b2734414e5a6774818d9a9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9d9084776a5d5144372a1e1100000000000000000000000000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d01000000000000000000000000000000000916222f3c4955626f7c8895a2afa6998c807366594d4033261a07000000000c18232e424f5c6975828f9ca8b6ac95887c6f6255493c2f2216090000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000050e18222b343d444c52596063696e7174767778808c9996897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000007111b252d343a3e3f464646464646403f3b362e261c120800000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c10040000000000000000000000000013202d394653606c7986938b7e7265584b4a4a4a4a4a4a4a4a4a4a4a4a49443e362c22170b0000000000000000000000000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e04000000000000000000000000000000000000000000070f171e24282b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d22211e1a140e06000000000000060f171e23282a2b2d2d2d2d2d2d2d2322201c160f08000000000b17232f3a454e565c5e6060606060606056544f473d333a454e565c5e6060606060606056544f473d33271c1004000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00010d18232d373f464a4c4f504b5153514c52545a5a5a5b575e61696f7c87929f9c8f8376675d5145392c20130600010d18242f3a43505a626c727f8b8e81786c66666d71767b7e81848485868584827f7c77726d68606e73808d877e716c61594f433a2f24190d0100000006101820262b2e2f3939393939393939393939393939393939393939393939393931302d28221a1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000811191f25292b2c2d2d2d2d2d2d2726241f1a130b0200000000000000000000000000000000000e1b2734414e5a6774818d9aa7acacb2a9a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9084776a5d5144372a1e11000000000000000000000000000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e130800000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c00000000071b2835424e5b6875818e9ba8b0a396897d7063564a3d3023170a0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000020c16202a343d464e565e616b6f757b7e8183848587939f96897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000010d18232d373f464a4c5353535353534d4b4740382e24190e0200000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f13060000000000000000000000000013202d394653606c7986938b7e726558575757575757575757575757575550483e33281c100400000000000000000000000d1a2633404d59667380868686868686868680746c61574e43392f251b1007000000000000000000000000000000000000000000060f1921292f343738393939393939393939393939393939393939393939393939393939393939393939393939392e2d2b261f180f0600000000050f1821282f34373839393939393939302f2c27211911080000000f1b2834404b5660686b6c6c6c6c6c6c6c6360594f4438404b5660686b6c6c6c6c6c6c6c6360594f44382c201307000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000007111c252d353a3e3f42434045474c565d616767676869696e727b8491999e938a7d7063554b4135291d11040004111d2935404b55616c717e8893938e81786c70797e83888b8e9091929291908e8c88847f7a726d73808d9292877e716b61554c4135291d11040000040e18222a32373b3c464646464646464646464646464646464646464646464646463e3c39332c241a1005000000000000000000000000020608080c0b09060100000000000000000000000000000000000000000004080a0b0807050200000000000000000000000000000000000205070813131313131313130707050100000000000000000007111a232a313538393939393939393433302b241d140b01000000000000000000000000000000000e1b2734414e5a6774818d9aa9b3b9ada1979191919191919191919191919191919191919191919191919083776a5d5144372a1e110000000000000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000008131e28323c464e5860686d767c82878a8e9091929399a496897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000006121e29343f495156586060606060605a58524a40362a1f1307000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d2013070000000000000000000000000013202d394653606c7986938b7e72656464646464646464646464646464615a5044392d20140800000000000000000000000c1925323f4b57636d737979797979797979746e645a50453c31281d1209000000000000000000000000000000000000000000020d17212b333b404445464646464646464646464646464646464646464646464646464646464646464646464646463b3a37312a21180e030000010c17212a333a404345464646464646463d3c38332b23190f050000111e2a3743505c68727879797979797979706b6054483c43505c68727879797979797979706b6054483c2f221609000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000a131c232a2e3132352f343946525d686d7474747475777b7f8591969e938e81746b6155433a2f24180d01000613202c3945515d67717e87939a9d938e81797d848b9095989b9d9e9f9f9e9d9b9895918c857f79808d929c9992877d70675d5145392c20130600000a15202a343c434748535353535353535353535353535353535353535353535353534a49453e362c22170c0000000000000000000003090e121415191815120d06000000000000000000000000000000000000050c111417171514120e09030000000000000000000000000002090e12141520202020202020201413110d0802000000000000030e19232c353c414546464646464646413f3c362f261d1308000000000000000000000000000000000e1a2734414d5a6774808d97a2adb8ab9e91858484848484848484848484848484848484848484848484848275685c4f4235291c0f00000000000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c2013040000000000000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000010d1925303a444e58606a6f7a82898f94979a9d9e9f9fa4ab96897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d100000000000000000000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a0000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e2114080000000000000000000000000013202d394653606c7986938b7e727070707070707070707070707070706c6155493c3023160a00000000000000000000000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c0000000000000000000000000000000000000000000007131e29333d454c5052535353535353535353535353535353535353535353535353535353535353535353535353534846423c332a1f1409000007121e28333c454b5052535353535353534a48443d352b21160b0000121f2b3845525e6b7884868686868686867d7063564a3d45525e6b7884868686868686867d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000010a11181e22252628232e3a4754616d7a808181818284878c929796918b81796d60594f4431281d130700000714202d3a4753606d7a859297a2a59d938e848991969d9fa7a7aaa8a7a7a8aaa8a7a09d97928b858d929ca4a39892857a6d6054473a2d21140700030f1b26323c464e535560606060606060606060606060606060606060606060606060575550483e33281c11040000000000000000060e151a1e21222524221e181109010000000000000000000000000000000810171c21232422211e1a140d060000000000000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c05000000000009141f2a353e474d51535353535353534e4c4741382f241a0e030000000000000000000000000000000815212e3b4854616e7b85929ea4aea99d9083787777777777777777777777777777777777777777777777756f65594d4134281b0e000000000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d11040000000000000000000000000000000000000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000005111d2a36414c565f6a6f7d848f949c9ea6a7a9aaabacafa296897c6f635649505c6976838f9c9286796c5f5346392c201306000000000000000000000000030a0f1d2a3643505d69768390908376695d5043362a1d0f0a03000000000000000b1825313e4a56626d72797979797979736e63584b3f3226190c000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d2014070000000000000000000000000013202d394653606c7986938d807d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7e7064574a3d3124170a000000000000000000000007131e2a35404952575960606060606060605a58524a40362c21180d04000000000000000000000000000000000000000000000c18242f3b454f575d5f6060606060606060606060606060606060606060606060606060606060606060606060606055534d453c31261a0e02000b17232f3a454e565c5e6060606060606056544f473d33271c100400121f2b3845525e6b7885919393939393897d7063564a3d45525e6b7885919393939393897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000070d121618191c212e3b4854616e7b878d8d8e8f9193938f8d89847e756d675c51473e331f160c0100000613202c3945515d676f7c859298a2a59d9591959da0a8aba8a09d9b9a9a9b9d9fa4aca9a19e9691969ca4a39992867d70675d5145392c2013060006121f2b37434e585f626c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d21140800000000000000060f181f262b2e2f32312e29231b130a010000000000000000000000000008121a22282d30312e2d2a261f180f06000000000000000000050f171f252a2d2e39393939393939392e2d2a251e160e05000000010d1925313c4750585e5f6060606060605a58524a41362b1f14080000000000000000000000000000000714202d3a46525e69707d8a929da7ab9f958d80736b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a68655d54493d3125190c000000000000000000000000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d010000000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000713202d3946525e686f7c8691969ea6aab0b4b6b7b8b9afa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000000060e151a1f2a3643505d69768390908376695d5043362a1f1a150e060000000000000c1925323f4c5865727f8686868686868073665a4d4033271a0d00000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e11050000000000000000000000000013202d394653606c798693928d8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a86796c605346392d20130000000000000000000000020d19242e3740474b4d53535353535353534d4c4740382f241a0f0600000000000000000000000000000000000000000000000f1c2834404c5761686b6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5f574d42372b1e1205000f1b2834404b5660686b6c6c6c6c6c6c6c6360594f44382c20130700121f2b3845525e6b7885919e9f9f9f96897d7063564a3d45525e6b7885919e9f9f9f96897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000000000106090c0c15212e3b4854616e7b87949a9b9c9e938682807d78716c605c554b40352c210d0400000004111d2935404b55606a6f7c869298a2a7a09da0a7a9a29f9996918f8e8d8e90939a9ea1a8a8a19ea1a8a39992877d706b60554c4135291d1104000815212e3b47535f6a7679797979797979797979797979797979797979797979797979716c6155493c3023170a000000000000060f18212a31373a3b3f3e3a342d251c130a01000000000000000000000008121a242c33393c3e3b3a36312921180f0500000000000000020d17212930363a3b4646464646464646463936302820160c02000004101d2935414d58626a6c6c6c6c6c6c6c67645c52473c3024170b00000000000000000000000000000005121e2a36424d57616c74808d95a0aaa79f93887d70685e545e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5c59544b42372c2115090000000000000000000000000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e1308000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c000000010e1b2834414e5b6774818e9aa7b0a4978a7d7164574a3e3124170b0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000005121e2a36424d57616d7a849198a1a8b0b7bbc1c3c4c5bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000000006101820262b2e3643505d69768390908376695d5043362e2b262018100600000000000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e020000000000000000000000000013202d394653606c798693939393939393939393939393939393939386796c605346392d201300000000000000000000000007121c252e353b3f404646464646464646413f3c362f261d1208000000000000000000000000000000000000000000000000111e2b3744505d6873787979797979797979797979797979797979797979797979797979797979797979797979797976695f53463a2d21140700111e2a3743505c68727879797979797979706b6054483c2f22160900121f2b3845525e6b7885919eabaca396897d7063564a3d45525e6b7885919eabaca396897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000000000060b0f12131c212e3b4854616e7b8793939495989a9285817d756e685e574d43392e23180c00000000010d18242f3a434e58606a6f7d86929aa4acaaaca59d97928c88848281818283878b91969fa3ababadac9f92877d706b61594f433a2f24190d01000915222f3c4855626f7c868686868686868686868686868686868686868686868686867e7164574a3e3124170b0000000000050f18212a333c4247484c4a463f372e251c130a0100000000000000000008121a242c363e45494a4846423b332921170e0500000000000009141f29333b42464853535353535353535346413a32281e1308000005121f2b3845515e6a7479797979797979746e64584c3f33261a0d000000000000000000000000000000020e1a25303b454f59606d79839098a2aea49a92857a6e665b5051515151515151515151515151515151514f4d49423930261b100400000000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa6998c7f7366594c4033261907000000020f1b2835424e5b6875818e9ba8b0a3978a7d7064574a3d3124170a0000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000714212d3a46535f6974818e96a1aab2bac2c7ccd0d1c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c201306000000000000000000061018222a31373a3c43505d69768390908376695d50433c3a37312a22181006000000000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e1408000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686796c605346392d2013000000000000000000000000000a131c242a2f323339393939393939393433302b241d140b00000000000000000000000000000000000000000000000000121f2c3845525f6b7885868686868686868686868686868686868686868686868686868686868686868686868686867b6e6155483b2e22150800121f2b3845525e6b7884868686868686867d7063564a3d3023170a00121f2b3845525e6b7885919eabaca396897d7063564a3d45525e6b7885919eabaca396897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000020a11171c1f2028232e3b4854616e7b86868687898c9195928e89827a6e695e544a4034281c10040000000007131d28313d464e58606b6f7c87939facaba39f938e857f7b7775747475777a7e848c9299a2a9b3a4978a7e716b61594f473d31281e130800000916232f3c4956626f7c8993939393939393939393939393939393939393939393938a7d7164574a3e3124170b00000000050e172129333c454d5355585651493f372e251c130a010000000000000008121a242c363e4850555755534d453b332920170e0500000000020e1a25303b454d525f60606060606060605f524c443a3025190d01000613202c3946535f6c79868686868686868074675a4e4134271b0e0100000000000000000000000000000009141f29333e45515c676e7b86929fa5aca1978f82786c60594f4444444444444444444444444444444442413d3730271e140900000000000000000000000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c20130400000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa79a8d8174675a4e412e23180c000000030f1c2936424f5c6975828f9ca8afa296897c6f6356493c302316090000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000815222e3b4855616e7b87929fa8b2bcc4ccd3d7dcd5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000000060f18222a343c43474847505d69768390908376695d50474847433c342a22180f060000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d02000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979766c5f5346392d201300000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b0200000000000000000000000000000000000000000000000000121f2c3845525f6b7885929393939393939393939393939393939393939393939393939393939393939393939393887b6e6155483b2e22150800121f2b3845525e6b7885919393939393897d7063564a3d3023170a00121f2b3845525e6b7885919e9f9f9f96897d7063564a3d45525e6b7885919e9f9f9f96897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000020b141c22282b2d352e343a46535e69767979797a7c7f848c9399948f847b6e665c5144382c1f150900000000010c161f2b343d45515d67717e8b9aa4afa399928b817a736e6968676768686e72797f879297a2aaa6998c7f73695f53463e352b1f160c010000091623303c4956636f7c89969f9fa8a19e9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c978a7d7164574a3e3124170b000000020b172029333b454d575f6265625b51493f372e251c130a01000000000008121a242c363e48505a6164615f574d453b322920170c0200000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d1105000613202c3946535f6c798692939393938d8174675a4e4134271b0e01000000000000000000000000000000030d17212834404b555f69717e8a939da8a99f948c7f736b60564c4135373737373737373737373737373534312c261e150c02000000000000000000000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d110400000000000000000000000000000000000000000916222f3c4955626f7c8895a2afa89b8f827568544a4034281c1004000004101c2934404b556a7683909da9b4aa95887b6f6255483c2f2215090000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0006121e2b37424d576774818d99a3afbac4ced6dfe3e2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c20130600000000000000030e18212a343c464e535554525d69768390908376695d525455534e463c342a21180e0300000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e05000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e12000000000000000000000000000000070d1316191a20202020202020201a1a17130e08010000000000000000000000000000000000000000000000000000121f2c3845525f6b7885929e9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94887b6e6155483b2e22150800121f2b3845525e6b7885919e9f9f9f96897d7063564a3d3023170a00121f2b3845525e6b7885919393939393897d7063564a3d45525e6b7885919393939393897d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000a141d262d33383942434045464d575e6c6c666d6d6f72787f87939f969083786d6053463c31261a0e0200000000040f1b27333f4953606d7984919eaca49f92877f746d68615f575b5a565e61676d727d859298a2ac9f92867b6e61564c41362a1e11050000000a1623303d495663707c899aa4aca196918f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8a7d7164574a3e3124170b0000000a141d29323b454d575f696e726d635b51493f372d251c130a0100000008121a242c363e48505a616c716e695f574d443b32291e140a0000000714202d3a46525e6976797979797979797976685e5246392d201307000613202c3946535f6c7986929f9f9f9a8d8174675a4e4134271b0e0100000000000000000000000000000000050f18232e39434d57616c74818e95a0aaa69f92877d6f685d52463f342a2b2b2b2b2b2b2b2b2b2b2b292825211b140c03000000000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000916222f3c4955626f7c8895a2afaa9d908477665c5144382c1f1206000006131f2c3845515c677884919eabaea298877a6d6154473a2e2114070000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000814212d3a47535f697884919eabb5c0ccd6e0e8f1e2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000009151f2a333c464e585f62615e566976839090837669565e61625f584e463c332a1f150900000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d05000000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060605f5a52493e33271b0f0000000000000000000000000000000002070a0c0d13131313131313130e0d0b070300000000000000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabacacaea9a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a194887b6e6155483b2e22150800121f2b3845525e6b7885919eabaca396897d7063564a3d3023170a00121f2b3845525e6b7884868686868686867d7063564a3d45525e6b7884868686868686867d7063564a3d3023170a000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000006111c262f383f44464f504b51535452535f605c606162666c727f8b95a0958c7f7265574e42372b1e12060000000005121f2b3744505b65727f8c97a1a89c928a7e726d615d56534d4e4e4c52555c606b707c86929fa6a3988e8175685e5246392d2014070000000815222f3b4855626e7b87939fa99e91848383838383838383838383838383838383827d706356493d3023160a000006111b262f3b444d575f696e7b7f726d635b51493f372d251c130a010008121a242c363e48505a616c717d7b6e695e564d443a30261c110600000815212e3b4854616e7b86868686868686867a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000007121d27303c45505a606d79839198a3aea39991847a6d615b51463c31281d1e1e1e1e1e1e1e1e1e1c1b191510090200000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e13080000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afac9f9286796d6053463a2d20130900000714202d3a4753606d7a86939facac9f928579685e5246392d2013070000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222e3b4855616e7b8896a1adbdc7d1dee8f2efe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c201306000000000000020e1a26313c454e585f6a6f6d685e69768390908376695e686d6f6a5f584e453c31261a0e02000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e080200000000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353534f4940372c21160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabb8aea49d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a94887b6e6155483b2e22150800121f2b3845525e6b7885919eabaca396897d7063564a3d3023170a00111e2a3743505c68727879797979797979706b6054483c43505c68727879797979797979706b6054483c2f221609000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000b17222d38424a50535b5d555c60605d564c4a505354545b606c7883909d9e9184786a5f53473a2e211408000000000613202d394653606c7884919ea9a0968d80736c625b524c4642414141464b5159606a717e8a939eaa9f92867a6e6154473b2f24180c0000000814212e3a47535f6975818e97a29d9084787676767676767676767676767676767676706b6054483b2f22160900000b17222d38414d565e696e7b848b7f726d635b51493f372d251b130a08121a242c363e48505a616c717e86847b6e695e564c42382e23170b00000815212e3b4854616e7b87939393939393877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000b151e2a333e45515d676f7c86929fa5aba1968f82756d62584e433a2f24180f111111111111110f0e0c09040000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3221160c020000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afaea399887c6f6255493c31261a0d06030615222f3c4855626f7b8899a4afaa9d9084776a564c41362a1e11050000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000b1825313e4b5864717e8b97a8b2bdcfd9e3f0faefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c20130600000000000006121e2b37424d575f6a6f7b7a6d686976839090837669686d7a7b6f6a5f574d42372b1e1206000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000002050708121313131313131313080705020000000000000000000000000000000000000005101b252e373e4346464646464646464646464646464646464646464646433e372e251b10050000000000000000000000000000000000000003080b0e0e131313131313130a090704000000000000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabb8a99d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d887b6e6155483b2e22150800121f2b3845525e6b7885919e9f9f9f96897d7063564a3d3023170a000f1b2834404b5660686b6c6c6c6c6c6c6c6360594f4438404b5660686b6c6c6c6c6c6c6c6360594f44382c201307000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00030f1c28333f4a545b6068696b676d6d685d52454446474a505b6573808c99a196887b6e6255483b2f221508000000000a1623303d495663707d8996a0a99e9184786d605a5146413a373130363940454f58616c75828f99a3a3998c7f7266554b4035291d1004000006121e2b37424d57616e7b85929fa0958c80736c6969696969696969696969696969696360594f44382c20130700030f1b27333f49535e696e7b8491918c7f726d635b51493f372d251b13121a242c363e48505a616c717e879291847b6e685e544a3f34281c1003000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000030c18212935404b555f6a727f8b939ea8a89e948b7f726a5f554b41352921180d030404040404020200000000000000000000000000000000000000000000000000000000000000000000000000000001070c06111c2a36424d5763707d8a96a1acaaa8aab0a79b8e8174685d5245392c201304000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afb5ab998c7f7266574d42372b1f15120f121c2834404a5465717e8b98abb5a89b8e8175685b4e423025190d010000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000d192633404c5966737f8c99a6b2bfcfd9eaf5ffefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000814212d3a47535f696f7c85837a6d68768390908376686d7a83857c6f695f53473a2d211408000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131c252c33373939393939393939393939393939393939393939393937332c251c130900000000000000000000000000000000000001080f14181a1b20202020202020171614100b0500000000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabb4a79a8d8080808080808080808080808080808080808080808080808080808080807a6d6154473a2e21140700121f2b3845525e6b7885919393939393897d7063564a3d3023170a000b17232f3a454e565c5e6060606060606056544f473d333a454e565c5e6060606060606056544f473d33271c1004000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0006121f2b3844505b666c75767778797a6d60544b403a3a3f495364717e8b97a8978a7d7164574a3e3124170b00000003101c28343f4a546773808d9aa8a2978a7e71665c51483f35302b26252a2e343d46505a626e7b87929fab9d908376675d5145382c1f13060000020e1a26313c46525e68717e8a929c9f93887e716c605b535c5c5c5c5c5c5c5c5c5c5c56544f473d32271b10030005121f2b3744505b656e7b8491969c918c7f726d635b51493f372d251b1a242c363e48505a616c717e8792999691837a6d665c5044382b1f1206000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000060f18242f39434e58626d75818e96a1aba69f92867c6f675d51453f332a1f150b010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c13181b1e1a25313b4653606c7884919e9f9f9f9f9fa095897c6f63564c4135291d1104000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afb6a99c908376695f53473c3127201f1c1f232c3844515c6675818e9ba8b3a9988c7f7265594c3f32261908000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000d1a2734404d5a6773808d9aa6b3c0cdd9e6f3fcefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000815222e3b4855616e7b859290837a6d7683909083766d7a839092857b6e6155483b2e221508000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000010406070a0d101112131312100e0b080705020000000000000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000000000000000000000000000020b131a202427282d2d2d2d2d2d2d2323201c160f08000000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a73737373737373737373737373737373737373737373737373737373736d685e5246392d20130700121f2b3845525e6b7884868686868686867d7063564a3d3023170a0007121e28333c454b5052535353535353534a48443d352b333c454b5052535353535353534a48443d352b21160b00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000613202d394653606c7881838485868275665c5145403f414a5464717e8b97a4988b7e7165584b3e3225180b00000006121f2b3844505c667683909da99f9285796d60544a403629241e1a191d2328343e47535f6a7683909ca99f92867a6d6053473a2d2014070000000915202a36414d56616c73808d939d9a92877e736c655d554e5050505050505050504948443d352b21160b00000613202d394653606c79839096a0a39c918c7f726d635b51493f372d25242c363e48505a616c717e879299a3a0959083796d6053463a2d201307000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000007121d28313c46515b606d7a849199a3aea3999184796d605a50463c31271d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f171e23282a2b2d2b3844505b66737f8c999393939393939084776b6054443a302419120b030000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afb7ab9f94887b6e62574e4339312d2b282b2e343f4953606d7985929fabada297897c6f6356493c30231609000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000e1b2835414e5b6874818e9ba7b4c1cedae7f4fcefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c2013060000000000000713202d3a4653606d78818e9390837a7683909083767a8390938e81786d6053463a2d201307000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000020608080d0606030000000000000000000000000000000104080d111314171a1d1e1f201f1f1d1b181414110e080200000000000000000000000000010910161b1e202020202020202020202020202020202020202020201e1b161009010000000000000000000000000000000000010b141d252b30333439393939393939302f2c27211a11080000000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e67676767676767676767676767676767676767676767676767676767615e564c4135291d110500111e2a3743505c68727879797979797979706b6054483c2f22160900010c17212a333b434a4f5053535353534c4a463f372d232a333b434a4f5053535353534c4a463f372d23190f0500000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0006121f2b3844505b6677849091929285796d6058514a4c4b515b6673808d99a9978a7d7164574a3e3124170b0000000713202d3a4653606d7986929fa89b8e8175665c5042392e2419130e0d1218222b37434e5866727f8c99a5a399897c6f6356493c30231609000000030e1925303b44505a606c77818e939c99928b80776d675f585045414343434343433d3b38322b23190f04000005121f2b3744505b65707d869298a2a39c918c7f726d625b51493f372d2c363e48505a616c717e879299a3a39992877e71665c5044382b1f1206000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000010c161f2a343f45525d686f7c87929fa6aba0968e81756c62584e43392f24180f060000000000000000000000000000000000000000000000000000000000000000000000000000000000050f1821292f3437383939333f4a54616e7a8786868686868686867f7265594f43322c29231d150d0700000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbdb0a69a8d81746a5f554b433c39383338393f44505b65717e8a97a2adab9f9285796d6053463a2d201307000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000e1b2835414e5b6874818e9ba7b4c1cedae7f4fcefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c20130600000000000006121f2c3844505c666d78818e9390837a839090837a8390938e81786d665c5044382c1f1206000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000003090e1214151913120f0b06000000000000000000000003070d1013191d202124272a2b2c2d2c2b2a282521201e19140f0a0400000000000000000000000000050a0f1213131313131313131313131313131313131313131313120f0a050000000000000000000000000000000000000008131d262f363c4041464646464646463d3c38332c231a0f0500000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e615a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a54524c443a3025190d01000f1b2834404b5660686b6c6c6c6c6c6c6c6360594f44382c20130700000a16222e39434d555b5d6060606060585651493f34292e39434d555b5d6060606060585651493f34291e120600000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00030f1c28333f4a546774818e9a9f978b7e716a605c5459555d606c7884919da297897c6f6356493c302316090000000714212e3a4754616d7a8798a3a5988b7f7265544a3f30271c1208020007101a26313d495663707c8996a3ab978a7d7164574a3e3124170b0000000008141f29323e44505b656c78818d929f9f928c81796f6a625a514c433c34363636302f2c2721191107000000030f1b27333f4953606b707d869298a2a39c918c7f726d625b51493f37363e48505a616c717e879299a3a39992877e716c61544a3f34281c1003000815212e3b4854616e7b87939393939393877a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000040d18222935414c56606a727f8c949fa9a89e938b7e716a5f554b40352921170c03000000000000000000000000000000000000000000000000000000000000000000000000000000010c17212a333a4044454646463a46525e686e797979797979797979726d6256473f3a38342f271f191007000000000000000000000000000000000000000916222f3c4955626f7c8895a2afb4aba39f92877b6e675d554e4846443f44464a5059606c7883909da9b1a89b8e8175665c5044382b1f1206000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000e1b2734414e5a6774818d9aa7b4c0cddae7f6ffefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c20130600000000000003101c28343f4a545c666d78818e939084839191838490938e81786d665c544a3f34281c1003000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000060e151a1e212226201f1c17110a0200000000000003060c1012181d2024292c2d30343638393939383735322e2d2a251e1b150d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1a252f3841484c4e535353535353534a48443d352c21160b00000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e61544d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4746413a32281e130800000b17232f3a454e565c5e6060606060606056544f473d33271c100400010e1a27333f4a555f676a6c6c6c6c6c65625b51463a2e333f4a555f676a6c6c6c6c6c65625b51463a2e22160900000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000b17222d3c4956626f7c89949f9f92857c716d66666666676d737f8c96a09f9285796d6053463a2d2013070000000815222f3b4855626e7b8895aaa4978a7d7164574a3e2e24150b000000000915222f3b4855626e7b8895a1a5988b7e7265584b3f3225180c00000000020d172027333f49535b666c74808b92989c938f847c716c605d554e463e362e292322201b160f0700000000000b17222d38414f59606b707d869298a2a39b918c7f726d625b51493f3e48505a616c717e879299a3a39992877e716c615a5042382e23170b00000815212e3b4854616e7b86868686868686867a6d6154473a2e211407000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000061019242f3a444e58606c77828f97a1aba59f92867c6e675d51453e33291e150b00000000000000000000000000000000000000000000000000000000000000000000000000000007131e29333c454c505253535246444d565e616c6c6c6c6c6c6c6c6c65625b51504c47454039312a221910060000000000000000000000000000000000000916222f3c4955626f7c8895a2afaea39992999083796d6760585553504a5053545c606b727f8b95a0acaca095897d7063544a3f34281c1003000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000d192633404c5966737f8c99a6b2bfced9e5f1feefe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c201300000000000000000c17232e38424a545c666c78818e92909195959191928d81786c665c544a42382e23170c00000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000060f181f262b2d2e332d2b28221c140b08060406060b0f12171c1f24292c2f35393a3d4043444546464543413e3b3936302b272019130c04000000000000000000000000000000000000000000050a0d0f101313100f0d0a05000000000000000000000000000000000000000000000000000814202b36414b53595b6060606060606056554f473d33271c1004000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e615447404040404040404040404040404040404040404040404040403a3935302820160c02000007121e28333c454b5052535353535353534a48443d352b21160b000003101d2936424f5b6771777979797979726d62564a3e3136424f5b6771777979797979726d62564a3e3124180b00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000615222e3b4754606a76828f98a29792857e7975737273757a8088939fa1978d8074665c5144382c1f12060000000916222f3c4955626f7c8895a2a396897d7063564a3d30231706000000000714212e3a4754616d7a8794a0a5998c7f7266594c3f3326190c0000000000050e17222d38414a545b606e737e8691969e9691867e756d675f58504840372e261c13100b0400000000000006111b262f3d474f59606b707d869298a2a39b918c7f726d625b514948505a616c717e879299a3a39992877e716c615a50483e30261c110600000714202d3a46525e6976797979797979797976685e5246392d201307000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000008131e28323d44505b656d7a859199a4aea2989083796d605a50453b30271c120700000000000000000000000000000000000000000000000000000000000000000000000000000c18232f3a454f575c5e60605f53504a4d52545f60606060606060605c5e5f5f5c5853514b433c342a22180c0200000000000000000000000000000000000916222f3c4955626f7c8895a2afac9f928692958f81796f6a6462605b545b6062666d727d87929fa7b0a69d9184786c605346392e23170b00000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000b1824313e4b5764717e8a97a8b2bdc8d4e2edf8efe2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c20110c0600000000000006111c263038424a545b666c77808d929da0a09d928d80776c665b544a423830261c110600000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000030e18212a31373a3b403938332d261d191312101314171c1f23282c2f35393a4145474a4d505152535252504e4b4746413b373229241e160e05000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000000000000000000000b1824303c48535d64676c6c6c6c6c6c6c6360594f44382c201407000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b3434343434343434343434343434343434343434343434342e2d29251e160e04000000010c17212a333b434a4f5053535353534c4a463f372d23190f05000004111d2a3744505d6a778386868686867f7265584c3f323744505d6a778386868686867f7265584c3f3225190c00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000006131f2b37434e58616e7b869298a097928b8582807f8082858d939aa19892857a6d61544a4034281c10040000000815222e3b4855616e7b8894aaa4978a7d7164574a3e2d22170b000000000815222f3b4855626e7b8895a1a5988b7e7265584b3f3225180c00000000000006111b262f38424a505c636c717c848e939f98928b817a6f6a625a524940382e251c110800000000000000000a141d2b353d474f59606b707d869298a2a39b918c7f726d625b51505a616c717e879299a3a39992877e716c615a50483e362c1e140a00000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d1105000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000010c162027333f49535e68707d87939fa6aaa0958d81746c61574d42392e23180e05000000000000000000000000000000000000000000000000000000000000000000000000030f1b2834404c5761686b6c6c6c605c544a46475353534c52565d6065696b6c6b6965605c554e463c342a1e140a00000000000000000000000000000000000916222f3c4955626f7c8895a2afa5988b7f8b93938f837c76716e6c666b666c6e72787f879299a3aea99f948a7e71665b5044382b1c110600000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222e3b4855616e7b8896a0acb8c6d0dbe7f0f9e2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f5346392c211d1711090000000000000a151e263038424a545b656c77808d939d9d938d80776c655b544a423830261e150a0000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000009151f2a333c4247484c46443f382f2925201f1d1f2022282b2e34383a4045474c5254575a5d5e5f605f5e5d5b5854524c47433c35302820170e0500000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d04000000000000000000000000000000000000000000010e1a2733404c59646f7479797979797979706b6055483c2f231609000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e272727272727272727272727272727272727272727272721201d19130c0400000000000a16222e39434d555b5d6060606060585651493f34291e1206000004111e2b3744515e6a7784919393938c7f7265594c3f323744515e6a7784919393938c7f7265594c3f3226190c00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000030f1b27323d46535f69707d8691969e9f97928e8c8c8d8f92989f9f9691867d6f685e5242392e23180c000000000714212e3a4754616d7a8798a2a5988b7f7265544a3f33281c1107010006101823303c4956636f7c8996a2aa978a7d7164574a3e3124170b000000000000000a141d262f383f44525a616a6f7a818b92989f938e847c716c635b524a40372e231a0d0400000000000000020b19232b353d474f59606b707d869298a2a39b918c7f726d625b5a616c707e879299a3a39992877e716c615a50483e362c241a0c02000000020e1a25303b454d525f60606060606060605f524c443a3025190d01000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000040d17222d38414c56606b73808d949fa9a79d928a7e71695f544a40342820170b02000000000000000000000000000000000000000000000000000000000000000000000005111e2a3744505c6873787979796d665c504441454c52565e61686d727678797876726d675f584e463c30261c1106000000000000000000000000000000000916222f3c4955626f7c8895a2afa396897d818e96959087827e7b79787778797b7f848c9299a3abaaa2978f82776c60544a3f33281c0a0000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000714212d3a46535f697784919eaab4bfcad6dee8eee2d5c9bcafa296897c6f635649505c6976838f9c9286796c5f534639302d29221b12090000000000030c151e262f38424a535b656c74818e9b9b8e81746c655b534a42382f261e150c030000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00020e1a26313c454d53555953504a423b35302d2b292c2d2d3338393f44464b5153565d606367696b6c6c6c6b6a6865615e56544e46413a322920170d020000000000000000000000000000030d161f272d32353639393635322d271f160d030000000000000000000000000000000000000000010e1b2834414e5b677481868686868686867d7063564a3d3023170a000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1413110d08020000000000010e1a27333f4a555f676a6c6c6c6c6c65625b51463a2e221609000005111e2b3844515e6b7784919e9f998c7f7266594c3f333844515e6b7784919e9f998c7f7266594c3f3326190c00000713202d3a4653606d798693a0aca6998d8073665a4d4033271a0d00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000a15202a36424d57606b707c848c9196999c9b9999999b9d9a97928d847d6f6b60564c4130271c1207000000000613202d394653606c7985929fa79b8e8174665b5044382d2218120d0c1117222b37424d5765727f8c98a5a398897c6f6256493c2f23160900000000000000020b141d262d33404850585f686d757e8690959d9691867e736d645c524940352c1f160c0100000000000000071119232b353d474f59606b707d869298a2a39b918c7f726d62616c707e879299a3a39992877e716c615a50483e362c241a1208000000000009141f29333b42464853535353535353535346413a32281e130800000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000006111b262f3a444f59606d78829097a2ada49f92857b6e665c51443e32291d140a000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885868686786d60534a4c51565e61686d737a7f82858685837f796f6a5f584e42382e23170b000000000000000000000000000000000916222f3c4955626f7c8895a2afa3968a7d7a84919899938f8b888685848486888c91969fa3aba9a29892857b6e655b5042382d22170b0000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0005121e2a36424d576673808c98a2aebac3ccd7dce3e7d5c9bcafa296897c6f635649505c6976838f9c9286796c5f53463e3d39342d241b110600000000060f19232b353d464e58606a6f7c8592989891857c6f6a60584e463d352b23190f060000000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0006121e2b37424d575f6166605b544d46413b393835393a3c3f44464a5053555d6064686d70737677787979787674716e68626058524c443a32291e130800000000000000000000000000000a151f2831383e4243464643423e3831281f150a0000000000000000000000000000000000000000010e1b2734414e5a6774818d93939393938a7d7064574a3d3124170a000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e21140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d070705010000000000000003101d2936424f5b6771777979797979726d62564a3e3124180b000005121e2b3845515e6b7884919ea6998c807366594d40333845515e6b7884919ea6998c807366594d4033261a0d00000713202d3a4653606d798693a0aca69a8d8073675a4d4034271a0700000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b000000040e1a26313b454f59606a6f797f848a8d8f9192929291908d8a8580796f6b60594f443a301e150b000000000006121f2b3844505b667683909ca99e9285786c60544a3f3329241d19181b2227343c46535f6976838f9ca99f9286796d6053463a2d2013070000000000000000020b141c2228363e464e565d606c717b838d929f98928b80736e645b51473d31281e13080000000000000000071119232b353d474f59606b707d869298a2a39b918c7f726d6c707e879299a3a39992877e716c615a50483e362c241a1208000000000000020d17212930363a3b4646464646464646463936302820160c0200000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000a141d29323d44505c666e7b85929ea4ada2979083786d60594f443b2f261c11060000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d6976839098897c6f635a56555d60686d737a80858b8f9192928f8b847c6f6a5f544a3f34281c10030000000000000000000000000000000916222f3c4955626f7c8895a2afa4978a7d717d8692989f9c9799929291919298989ea0a8aba69f9792867d70695f53493f2f261c11060000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00020e1a26313b4754616e7a86929fa7b1bac2cbd1d6dcd5c9bcafa296897c6f635653535c6976838f9c9286796c5f53534b49453e362d22170c000000030e18212b353d474f58606a6f7c8592918c8c9191857c6f6a60584f473d352b21180e0300000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000814212d3a47535f696e736c665f57524c484644404547494a5053545c6063676d71757a7d8083848586858583817e7a756f6a615d564c443a3025190d0100000000000000000000000005111c27313a434a4e505353504e4a433a31271c110500000000000000000000000000000000000000010e1a2734414d5a6774808d9a9f9f9f978a7d7164574a3e3124170b000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080101010101010101010101010101010101010101000000000000000000000004111d2a3744505d6a778386868686867f7265584c3f3225190c000005121f2b3845525e6b7885919ea6998d8073665a4d40333845525e6b7885919ea6998d8073665a4d4033271a0d00000713202d3a4653606d798693a0aca79a8e8174675b4e412e23180c00000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b0000000009141f29333d474f5860676d72787d8082848586858483807e79736d6760594f473d32281e0c030000000000030f1c28333f4a546673808d99a7a1978a7d70665b50443e352f292423282d333d464f59616e7b86929faa9c908376665c5145382c1f13060000000000000001070d111317242d343c444c525a62696e78808b92999f928c80736d63594f433a2f24190d010000000000000000071119232b353d474f59606b707d869298a2a39b918c7f72707e879299a3a39992877e716c615a50483e362c241a12080000000000000000050f171f252a2d2e39393939393939392e2d2a251e160e050000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000020b172028343f4a545e69707d8a929da7a99f958d80736b61564d42382d22170e05000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9a8e81756c656364676d737a80868d92989c9e9f9e9c9691857c6f665c5044382b1f13080000000000000000000000000000000916222f3c4955626f7c8895a2afa4978a7e71707d8690959da0a39f9e9e9e9fa3aaa9a8a69f9c948f857d706b60574d41382d1d140a000000000000000000000000000613202c3946535f6c7986929f9f9f9a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000914202d3946525e6873808c95a0a8b1bbc0c7cbd0d0c9bcafa296897c6f63606060606976838f9c9286796c606060585650483e34291d110500000915202a333d474f59606a6f7c8592918c7f7f8c9192857c6f6a60594f473d332a20150900000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222e3b4855616e7b7f786e69615e565453504b515356545b6063666d70757a7e82868a8d909192939291908e8b86827c746d685e564c41362a1e11050000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a00000000000000000000000000000000000000000d1a2633404d596673808c99a6aca4978b7e7164584b3e3125180b000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000004111e2b3744515e6a7784919393938c7f7265594c3f3226190c000005121f2c3845525f6b7885929ea69a8d8073675a4d40343845525f6b7885929ea69a8d8073675a4d4034271a0d01000713202d3a4653606d798693a0aca89b8f827568544b4034281c1004000916232f3c4956626f7c8995a2afa4988b7e7165584b3e3225180b00000000030d17212b353d464e555c60666d70737677787978787674716d67605d554f473d352b20160c000000000000000b17222d3c4956636f7c8995a0a99d9083786c605a50454039352f2e34383f444e58616b75818e99a3a3988c7f7265544b4034281c1004000000000000040c13181d202021222a323a414550575f666d747e8792989c928c7f726b61564c4135291d1307000000000000000000071119232b353d474f59606b707d869298a2a39b918b7f7d879299a3a39992877e716c615a50483e362c241a120800000000000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c05000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000050e17232e38424d57616c74808d95a0aaa79f93887d70695e544a3f332820160b020000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98938b7f75717071747a80858d92989fa2aaa4a3a5a8a1979083786d6053463a2f24190d0100000000000000000000000000000916222f3c4955626f7c8895a2afa4978a7e716b707c838b9195989b9d9e9f9f9f9e9d9b9894908a827b706b60594f453b2f261b0b02000000000000000000000000000613202c3946535f6c798692939393938d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000005111e2a36414c56606d798390969fa7afb5babfc2c3c4bcafa296897c6f6c6c6c6c6c6c76838f9c9286796c6c6c6c64625a5045392d21150800020f1a26313c464f59606b6f7c8592918b7f72727f8b9192857c6f6b60594f463c31261a0f02000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222f3b4855626e7b88827b736d686461605b555d606265666c7074797d81858a8f92999a9c9e9f9f9f9e9d9b99928f87817a6d685e5246392d2013070000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d01000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2a5988b7f7265584c3f3225190c000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000005111e2b3844515e6b7784919e9f998c7f7266594c3f3326190c000006131f2c3946525f6c7985929fa79a8d8074675a4d41343946525f6c7985929fa79a8d8074675a4d4134271a0e01000713202d3a4653606d798693a0aca99d908376665c5145382c1f130700091623303c4956636f7c8996a2afa4988b7e7165584b3e3225180b0000000000060f19232b343d434b51545c606366696b6c6c6c6b6a6764605d55514b433d342b23190e04000000000000000615222f3b4854606b7784919da8a0958c7f726c615a514b4541403f4045495058606a707d8a939eaa9f92867a6d6154473a2e23180c000000000000040d161d24292c2d2e2f30302f353e454d545c606c717d8692999f93887d70685d52453a2f24180d01000000000000000000071119232b353d474f59606b707d869298a2a39b918b869299a3a39992877e716c615a50483e362c241a120800000000000000000000000002090e12141520202020202020201413110d080200000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000006111c26303b45505a606d79839098a2aea49a92857b6e665b50443d32281d140a0000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b88959b918b827e7d7e81858c92989fa2a29f9a9796989c9f9f958a7d7164554c4135291d110400000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e71646a6e787e84888c8e909192929291908e8b88837d766e6960594f473d33291d140a00000000000000000000000000000613202c3946535f6c79878686868686868074675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000020e1925303b45515c666e7b8490959fa3abaeb4b6b7b8b9afa296897d7979797979797979828f9c92867979797979716c6256493d3024170a0006121f2b37434e58606b707d8692918b7f726d6d727f8b9192867d706b60584e43372b1f1206000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222f3b4855626e7b888f86807a75716e6c666b676d6f7175797c81858a8e92989c9fa3aba39f9e9d9d9d9fa3a39f9a938e847a6d6154473a2e2114070000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f03000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0a6998c807366594d4033261a0d000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919ea6998c807366594d4033261a0d00000613202c3946535f6c7986929fa79a8d8174675a4e41343946535f6c7986929fa79a8d8174675a4e4134271b0e01000713202d3a4653606d798693a0acac9f9286796d6053463a2e23180d060a1723303d4a5663707d8996a3b0a4978b7e7164584b3e3125180b000000000000081119222b303940454a5053575a5c5e5f5f5f5e5d5a5753514b45413a312b22191107000000000000000007131f2c38434f5965727f8b96a1a79f93887e716c605d55524c4c4c4b51535b606a6f7c86929fa5a3988e8174685e5246392d1d12070000000000010c161f282f35393a3b3c3c3d3d3c383b424a515a626b707e87939f9a92857a6d60554b4135291d110400000000000000000000071119232b353d474f59606b707d869298a2a39b999299a3a39992877e716c615a50483e362c241a120800000000000000000000000000000002050708131313131313131307070501000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000040404000a141e29333e45515c676e7b86929fa5aca1978f82786c60594f443a2f261b110600000000000000000000000000000000000000000000000000000000000000000814212e3a47535f6a7784919d9b948f8b898a8d92989fa2a29f98928d8a898b90949c9c8f8276675d5145392c20130600000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e71645f666d71777b7f8183858586858583817e7b76706b615e574f473d352b21180b02000000000000000000000000000006121f2c3845525e6a7579797979797979746e64584c3f33261a0d000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000008141e2834404b545e696e7b838d92999fa3aaa9aaabacaea5998f8986868686868686868f949f988986868686867e7164584b3e3125180b000814212e3a47535f6a707d8692918b7f726d62626d727f8b9192867d706a5f53473a2e211408000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222f3b4855626e7b8898928d86827e7b797877787a7c7e8285898d92979b9fa2a7a09d9999929190909192999a9ea19f96887b6e6255483b2f221508000000000000000000000003101d2a3643505d69768286868276695d5043362a1d1003000000000000000000000000000000000000000916232f3c4956626f7c8995aab4a79a8e8174675b4e4134281b09000000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919ea6998d8073665a4d4033271a0d000006121f2c3844515c667986939fa79b8e8174685b4e41353844515c667986939fa79b8e8174685b4e4135281b0e02000713202d3a4653606d798693a0acaea398897c6f62544b4034281f1612101824313e4b5764717e8a97a4b1a4978a7e7164574b3e3124180b000000000000000810191e272e34383f44464a4d505152535251504d4a47454039352f281f191007000000000000000000030c1b27323d4753606d7984919eaca49a92867e736d67605d565959545c60656c717c859198a2ac9f92867b6e61564c4135291d0c03000000000007131d28313a4045474848494a4a48443d3940445059616c73808c96a0978d8073675d5145392c2013060000000000000000000000071119232b353d474f59606b707d869298a2aba39fa3a39992877e716c615a50483e362c241a12080000000000000000000000000000000000000000060606060606060600000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000306080911111111110c17212834404b555f69717e8a939da8a99f948c7f736b60564c41382d22170d040000000000000000000000000000000000000000000000000000000000000006121e2b37424e5765727e8b95a09e9c9896979a9fa2a39f98928c85817e7d7e838c929f92867a6d6054473a2d21140700000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164545c60646a6e72757778787979787675726e69636159534d453d352b23190f0600000000000000000000000000000004111d2a36424e59636a6c6c6c6c6c6c6c67645c52473c3024170b000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000020c18232e39424d575e696e7880878d9298999c9d9e9fa39fa1999693939393939393939c9fa6a393939393938b7e7164584b3e3125180b000815222f3b4855626e7b8592938b7f726d625b5b626d727f8b9192857b6e6255483b2f221508000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222f3b4855626e7b88959f98928e8b878685848586898b8e92979a9ea1a8a09e9995908c89868483838486898d92979e95887b6e6255483b2f221508000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000814212e3b4754616e7a8798a2aea89b8f8275685c4f4230251a0e020000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929ea69a8d8073675a4d4034271a0d01000713202d3a4653606d79869aa4a89b8e8175685b4e42353a4653606d79869aa4a89b8e8175685b4e4235281b0f02000713202d3a4653606d798693a0acb4aa998d8073665c51453b3128201f1c1e26323f4c5965727f8c98a5b0a3968a7d7063574a3d3024170a0000000000000000070c151d23282e34383a3d4043444546454543413e3a38352f29241d160d07000000000000000000000b151e2b353d45515c67717d8a9aa4aca298928a8079716d6867666567666d70787e869197a1aaa6998c8073695e53493f372d1e150b00000000010d18242f3a434b51535455565756554f473d343f47505a606d7884919e9f92857a6d6054473a2d211407000000000000000000000000071119232b353d474f59606b707d86929facafacac9f92877e716c615a50483e362c241a1208000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000030a0f1215151e1e1e1e1e1e1e18232e39434d57616c74818e96a0aaa69f93877d70685e53493f33271f160c01000000000000000000000000000000000000000000000000000000000000020e1a26313c4653606c78839097a1a8a4a3a4aaa29f98928d86807a74717072767f8c94998a7d7063574a3d3024170a00000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164585053585f6265686a6b6c6c6c6b6a6865615f57554f46423b332b2319110700000000000000000000000000000000010e1a26313d4751595e5f6060606060605a58524a41362b1f1408000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000007121d27303b454d575e666d747b8186898d8f909192999393939393939393939393939393939393939393938b7e7164584b3e3125180b000814212e3a47535f6a74808d887f726d625b51515b626d727f8b8d80746a5f53473a2e211408000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000815222f3b4855626e7b88949fa29f9b979992919192939a989b9ea1a9a29e9a96918c8883807d7a78767677797c80858b9297887b6e6255483b2f221508000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000613202d394653606c7985929facaa9d9083776a574d42362a1e11050000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000006131f2c3946525f6c7985929fa79a8d8074675a4d4134271a0e01000714202d3a4753606d7a8693a0a89b8e8275685b4f42353a4753606d7a8693a0a89b8e8275685b4f4235281c0f02000713202d3a4653606d798693a0acb8ab9e9285796d60574d433a322d2c282a2d36424d576774818e9aa7b3a995897c6f6256493c2f231609000000000000000000030b12181c23282b2d30333638393939383734312d2c29241d18130c040000000000000000000007121c27303d474f59606b707d87939facaaa29f928d847e7a767473727375797d838b9298a1a9b3a5998c7f726d625b51493f30271d120700000004111d2935404b555d60616263636360594f4438353e44505c66727f8b98a2988a7e7164574b3e3124180b00000000000000000000000000071119232b353d474f59606b727f8c98a5b2b3a79a8d80746c615a50483e362d241b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000000060e151a1f21222b2b2b2b2b2b2b2b2b27303c45505a606d79849198a3aea49991847a6d655b50443d31281e13080000000000000000000000000000000000000000000000000000000000000009151f2b3844505b666f7c8591969c9f9f9e9c98928d86807a736d686463656d76828f998d8073665a4d4033271a0d00000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b464e5355595b5d5e5f5f5f5e5d5b5855534d48443e363129211911070000000000000000000000000000000000000915202b353f474e52535353535353534e4c4741382f241a0e03000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000b151e29333b454d545c60696e747a7d808384858686868686868686868686868686868686868686868686867e7164584b3e3125180b0006121f2b37434e58646e74817e726d625b514949515b626d727f80746e64584e43372b1f1206000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000714212d3a4754606d79828b92989ea1a8a39f9e9e9f9fa4aca9a19e9a97928e89847f7b7773706d676a6a666d6f73797f858f887b6e6255483b2f221508000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000005121f2b3744505b657783909daaac9f928579695e52463a2d2014070000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929fa79a8d8174675a4e4134271b0e01000714212d3a4754606d7a8793a0a89b8f8275685c4f42353a4754606d7a8793a0a89b8f8275685c4f4235291c0f02000713202d3a4653606d798693a0acb9ada1978b7e71695e554c443e3a3834363a3d46535e697784909daaada297877a6e6154473b2e2114080000000000000000000000070c11171c1f202427292b2c2c2c2b2a2724201f1d18120d070100000000000000000000000c18232e39424f59606b707d86929aa4aba9aca49c96918b8682807f7f8082858a90959fa3aaaaaca79c918b7f726d625b5142392e23180c0000000613202c3945515d676d6e6f6f70706b6055483d32343f4a54616e7b8899a49a8d8174675a4e4134271b0e010000000000000000000000071119232b353d474f59606b707d86929facacacac9f92877e716c615a50483e362d241b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e01000000000000000000000000000000000006101820262b2e2f3737373737373737373737333e45515d676f7c86929fa5aba1968f82776c60584e433a2f24190d06000000000000000000000000000000000000000000000000000000000000030f1c28333f4a545f6a6f7c848c909292918f8b86807b746e68605d56565b64707d8a998f8275685c4f4235291c0f02000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e4347484c4e505252535252504e4b4846423b38332a251f170f0700000000000000000000000000000000000000040f19242d353d424546464646464646413f3c362f261d130800000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000030c172129333b424a51575e61676d7073767778797979797979797979797979797979797979797979797979716c6256493d3024170a00020f1a26313c46525c646e74726d625b51493f3f49515b626d72746e645c52463c31261a0f02000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000613202c3945515d676d767e858c9196989b9d9e9f9f9e9d9a9897928e8a85817c77736e696663605d55545c6063676d727a81887b6e6255483b2f221508000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000030f1b27333f49536874818e9ba7aea298877b6e6154473b2e2114080000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000006121f2c3844515c667986939fa79b8e8174685b4e4135281b0e02000814212e3b4754616e7a8794a1a89c8f8275695c4f42363b4754616e7a8794a1a89c8f8275695c4f4236291c0f03000713202d3a4653606d798693a0acb1a7a09d92857b6e675d56504846443f4246474f58616e7b8795a0acab9f928578685e5246392d20140700000000000000000000000000060b101213171a1d1e1f201f1e1d1a171413100c070100000000000000000000000004101c2834404a54606b707d869298a3a69f9c9fa4a8a19e99928f8d8c8c8d8f92989da0a7a7a09da0a7a39b918b7f726d62544b4034281c100400000714202d3a4753606d797b7b7c7d7d7063584e4338313a4653606d7986939f9c8f8276695c4f4336291c100300000000000000000000071119232b353d474f59606b707d869298a2a39f9fa3a39992877e716c615a50483e362d241b12090000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79b8e8174685b4e4135281b0e0200000000000000000000000000000000030e18222a31373a3c44444444444444444444444444404b555f6a727f8b939ea8a89e948c7f726a60554c41352922180c010000000000000000000000000000000000000000000000000000000000000b17222d38424e585f6a6f797f83858684827f7a736e69615e56524c4a54606d7987868683776a5e5144372b1e1104000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e373a3b3f4244454546464543423f3b3a36312c28211a140d050000000000000000000000000000000000000000000a16202b343d4347494949494949494846423b33291f140900000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000050f172029303940444d53555d606366696a6b6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64625a5045392d21150800000915202a33414a525c646765625b51493f37373f49515b626567645c524a41332a20150900000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0004111d2935414b555d606d717a7f84898c8f9091929291908e8b8885817d79746f6b66615f575653514b4b5153555c60686d757f7b6e6155483b2e221508000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000b17222d3f4c5865727f8b98aab4aa96897c706356493d302316080000000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869aa4a89b8e8175685b4e4235281b0f02000815212e3b4854616e7b8794a1a99c8f8376695c5043363b4854616e7b8794a1a99c8f8376695c504336291d1003000713202d3a4653606d798693a0acaca09590959082796d68615a5553504a4d525459606a74808d9aa7b1a99c8f827669564d41362a1e11050000000000000000000000000000000306070a0d101112131212100e0b07060400000000000000000000000000000006121f2c3844515c66707d869298a3a39c948f939aa0a7aba39f9c9a99989a9b9fa2aaa8a19e9590959ba3a39b918b7f72665c5145382c1f13060003101c2936434f5c6976828788898a85786a605448423f404653606d798699a49c8f8376695c504336291d1003000000000000000000071119232b353d474f59606b707d869298a2a399929299a3a39992877e716c615a50483e362d241b120900000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca89b8e8275685b4f4235281c0900000000000000000000000000000000000a15202a343c4347485151515151515151515151515151514e58626d75818f96a1aba69f92877c6f675d51453f34291d110500000000000000000000000000000000000000000000000000000000000006111c262f3c464e585f676d727678797876726d68615e56524c454145515d67757979797771675b4f43362a1d1004000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312e2f32353738393939383735322e2d2a261f1c170e0903000000000000000000000000000000000000000000030f1b27323d464e545656565656565654534d453b31251a0e02000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000050e171e272e343b42464b5153565a5c5d5e5f6060606060606060606060606060606060606060606060585650483e34291d11050000030e18212f38414a52585a585651493f372d2d373f495156585a58524a41382f21180e0300000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00010d18242f3a434b515a62686d72797c7f82848586858583817f7c7974706d6663605955534d494745404045464b51565e616d726e695f53473a2d211408000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000616232f3c4956626f7c8998a3aea5988c7f7265594c3f3025190d0100000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0a89b8e8275685b4f4235281c0f02000815222e3b4855616e7b8894a1a99c908376695d5043363b4855616e7b8894a1a99c908376695d5043362a1d1003000713202d3a4653606d798693a0acaa9d9084909490827a716c6562605c54565e61646b707c87929facb0a6998c7f7266594c3f3025190e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79849197a1a49c918c838790959c9fa4aca9a7a6a5a6a8a8a7a09d96918a848c919ba3a0959084796d6053463a2d20130700000d1a2733404d5a6673808d959697897c6f625b534d4c4d4f58626f7c8895ab9b8e8275685b4f4235281c0f020000000000000000071119232b353d474f59606b707d869298a2a3999286869299a3a39992877e716c615a50483f362d241b1209000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca89c8f8275695c4f4230251a0e02000000000000000000000000000000030f1a26313c464e53555e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5b606d7a849199a3aea39991847a6d605a50453a2e211509000000000000000000000000000000000000000000000000000000000000000a141d2a343c464e555d6065696c6c6b6965615e56524d46413b35414b555d6b6c6c6c6a675f564b3f33271b0e02000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e31252226282a2b2c2c2c2b2a282522211e1a14100b05000000000000000000000000000000000000000000000006131f2b37434e586062626262626262615e574d42362a1e1205000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000000050c151c232831363a4045474a4d5051525353535353535353535353535353535353535353535353534b49453e362d22170c00000000060f1d262f3841474c4e4b4a453f372d25252d373f464a4b4e4c4741382f261d0f060000000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d000007131d28313a414550565d60666d6f727577787979787674726f6c6663605c54544f4846423d3a393534383a40454c525b6265615f574d42372b1e1206000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000713202d3a4653606d7986929faca89b8e817568564c41362a1e110500000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0a89b8f8275685c4f4235291c0f02000815222f3b4855626e7b8895a1a99d9083766a5d5043373b4855626e7b8895a1a99d9083766a5d5043372a1d1004000713202d3a4653606d798693a0aca396897d85929490847d76726e6d666b6b696e71757d859299a3afab9f94887b6e6155483b2e2215080000000000000002060a0c0d1313131313131313131313131313131313131313131312110f0c0701000000000000000006121f2c3844515c666e7c8591979c928c7f767c838a8f939a9a9d9e9f9f9e9d9b9895908b847e777f8c919b9691837a6e665c5145382c1f130600000916232f3c4956626f7c89959f9c8f82756d615e57595959616a73808d99a8998d8073665a4d4033271a0d0000000000000000071119232b353d474f59606b707d869298a2a39992877d7d879299a3a39992877e716c625a50483f362d241b12090000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaa9d9083776a574d42362a1e120500000000000000000000000000000006121f2b37434e585f626a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a686f7c87929facaba0968e81756c62564a3d3124170b00000000000000000000000000000000000000000000000000000000000000020b18222a343c434b5154595d5f5f5e5c5854524c46423b36302f3a434b515e6060605e5b564d44392e22170b00000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312518191b1d1f1f201f1f1d1b181514120e0903000000000000000000000000000000000000000000000000000815222e3b4754606a6f6f6f6f6f6f6f6e695e53463a2d211407000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000030b12181f252a2f35393a3d404344454646464646464646464646464646464646464646464646463e3d39342d241b110600000000000b141d262f363c40413f3d3a342d251b1b252d343a3d3f413f3c362f261d140b000000000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d0000010c161f282f353f444c52545c606265686a6b6c6c6b6a676562605b5453514a48433d3a36312d2c29282c2f343a414651575955534d453c31261a0e02000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000006121f2c3844515c667683909ca9aa9e918477685e5246392d20130700000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a89c8f8275695c4f4236291c0f03000915222f3c4855626f7b8895a2aa9d9083776a5d5044373c4855626f7b8895a2aa9d9083776a5d5044372a1d1104000714202d3a4753606d7a8693a0ada194887b7e8b9296918a837f7b79787778797a7d82889297a1abafa4998f8276695f53473a2d211408000000000000070d12161919202020202020202020202020202020202020202020201f1e1b18130c050000000000000004101c2834404a545f6a6e7c8591928c7f736d6f787d82878b8e9091929291908e8b88837e79716d727f8c9191847a6e685e544b4034281c100400000815222e3b4754606a7783909a9e948c7f756e69676666676b707c86929fa096897c6f6356493c3023160900000000000000071119232b353d474f59606b707d869298a2a39992877e70717e879299a3a39993877e716c625a50483f362d241b120900000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facac9f928579695e52463a2d2014060000000000000000000000000000000815212e3a47535f6a6f777777777777777777777777777777777777777777777f8c99a5b2a89e938b7e7165584b3e3225180b0000000000000000000000000000000000000000000000000000000000000000061018222a313a4145474c50525352504c4746413a36302a2528313a414547535353514f4b443b32281d110600000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180c0f111212131312100f0c080705020000000000000000000000000000000000000000000000000000000916232f3c4956626f7c7c7c7c7c7c7c7b6e6154483b2e211508000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d0000000000000000000000070c141a1d24292c2d303336373839393939393939393939393939393939393939393939393931302d29221b1209000000000000020b141d242b30333432312e29231b12131b23292e31323433302b241d140b02000000000c1925323f4c5865727f8686868686868073665a4d4033271a0d000000040d161d2429323a41454a505356595c5d5e5f5f5e5d5b585553504a4644403938322d2a2620201d1c1f232930363f464a4c4847423c332a1f150900000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000004101c2834404a5466737f8c99a9aca096877a6d6154473a2e21140a00000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1a99c8f8376695c504336291d1003000916232f3c4956626f7c8995a2aa9d9084776a5d5144373c4956626f7c8995a2aa9d9084776a5d5144372a1e1104000714212d3a4754606d7a8793a0ada194877b74818e949e95908c888685848585878a8f939aa1a9afa59f93877c6f62574d42372b1e120600000000010a12191e2325262d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b2b28241e170f06000000000000000c18232e39424e575f6a6e7c858c80736d63666d70767b7e81838485858584817f7c77726d67626d727f8b847b6e685e564c42392e23180c00000006131f2b38434e5863707d88939f9c918c817b7673727374777d859298a29e9184786d6053463a2d201307000000000000071119232b353d474f59606b707d869298a2a39992877e706c6c717e879299a3a49993877e716c625a50483f362d241b1209000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facaea298877b6e6154483b2d22170b0607080808060200000000000000000915222f3c4855626f7c8484848484848484848484848484848484848484848484919daab7afa59f9285786c5f5245392c1f120600000000000000000000000000000000000000000000000000000000000000000610181f282f35393a3f43454645433f3a3936302a251f191f282f35393a46464644433f39322920160b0000000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b020405060606050402000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c79878989898989898074675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000000000000003090e13181d20202327292a2b2c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2524211d1711090000000000000000020b131a1f2426272524221d1811090911181d2224252726241f1a130b0200000000000b1825313e4a56626d72797979797979736e63584b3f3226190c00000000040c131820282f35383f4446494c4f5152535252504e4c4946443f3a38342e2c27211e1a1413101013181e252a353a3e3f3b3a37312a21180e0300000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000c18232e3c4956626f7c8997a2ada8978a7e7164574a3e31261b0f03000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1a99c908376695d5043362a1d100300091623303c4956636f7c8996a2aa9e9184776b5e5144383c4956636f7c8996a2aa9e9184776b5e5144382b1e1105000714212e3a4754616d7a8794a0b4ab94877a6d78828f939f9d989a939291919298979b9fa4acaba39f938d80736a6054453c31261a0e02000000000a131c232a2f3233393939393939393939393939393939393939393939393837342f2921180f0500000000000007121c27303c454e575f6a6e7c7f736e635b5c6064696e717477787979787775726f6a65605d5b626d727e7b6e695e564d443b30271d1207000000030f1b27323d4854606b73808d939f9c938e8783807f8081848a9297a19f928a7d70665c5044382b1f12060000000000071119232b353d474f59606b707d869298a2a39992877e716c61616c717e879299a3a49993877e716c625a50483f362d241b12090000000000000000000000000000060606060606060600000000000000000000000613202c3946535f6c7986929facb4aa978a7d7064544a3f33281c131313151514120f0a030000000000000916222f3c4955626f7c889191919191919191919191919191919191919191919196a0acb8b8ac9f9285796c5f5246392c1f1306000000000000000000000000000000000000000000000000000000000000000000060d161d24292c2d323639393836322e2d2a251e19140d161d24292c2d3939393736332e2820170e040000000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c798692959595958d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d000000000000000000000000000001070d111314171a1d1e1f202020202020202020202020202020202020202020202020181715110c060000000000000000000001080e14171a1b181815120c060000060c121518181b1a17140e08010000000000000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a000000000001070d161e24292e34383a3c3f42444546464543413f3c3938332d2c28231c1b16120e09060404070c131923292e31322e2d2b261f180f060000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000713202d3a4653606d7985929eaba79b8e817468584e43372b1f1206000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1a99d9083766a5d5043372a1d1004000a1623303d495663707c8996a3ab9e9184786b5e5145383d495663707c8996a3ab9e9184786b5e5145382b1e1205000814212e3b4754616e7a87949f9fa39986796d6d79818c92989fa29f9e9e9e9fa2aaa8a9aaa29f99928b81786d60584e43332a1f15090000000007121c252e353b3e40464646464646464646464646464646464646464646464544403a332b21170c010000000000000b151e2a333c454e575f6a6e726d635c525053575e6164676a6b6c6c6b6a6865625f585351515b626c716e695e574d443b32291e150b00000000000a16202c38444f59606c77808c92989f9992908d8c8c8e91969e9f99928c80736b61544a3f34281c100300000000040f19232b353d474f59606b707d869298a2a49992877e716c615a5a616c717e879299a3a49993877e716c625a50483f362d241b110600000000000000000002050708131313131313131307070501000000000000000613202c3946535f6c7986929facb4a79a8e8174665b5044382d22201f202222211f1a150e0600000000000916222f3c4955626f7c88959d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9da0a8b2acacac9f9285796c5f5246392c1f130600000000000000000000000000000000000000000000000000000000000000000000040c13181d2021262a2c2c2b292521201d19130e09040c13181d20212d2d2d2b2a27221d160e05000000000000000000000000000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929fa2a29a8d8174675a4e4134271b0e000c1925323f4c5865727f8b98a5a6998d8073665a4d4033271a0d00000000000000000000000000000000010406070a0d1011121313131313131313131313131313131313131313131313130b0a0805000000000000000000000000000003080b0d0e0c0b090501000000000106090b0c0e0d0b0803000000000000000006121e29343f495156586060606060605a58524a40362a1f130700000000000000040c13191c23282b2d2f323537383939383734322f2d2b28221f1c18120f0a0502000000000002080d181e22252622211e1a150e06000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000006121f2b3844505c6674818e9baaab9e9184786a5f53473a2e21150a000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aa9d9083776a5d5044372a1d1104000a1723303d4a5663707d8996a3ab9e9185786b5e5245383d4a5663707d8996a3ab9e9185786b5e5245382b1f1205000815222e3b4855616e7b889393939392867966676d787f868d92989a9c9e9e9f9f9e9d9c9998928d877f746d665c50463d3221180e03000000020d19232e3740464b4c5353535353535353535353535353535353535353535352504c453d33291e1307000000000000030c18212a333c454e575f6266635b524944464d5354585b5d5e5f5f5e5d5b5855534e474549515a6265615e574d453b322920170c03000000000004101c27323d44505b656c777f868e92999b9c9a99999a9d9b99938f867f736e63594f42382e23170b00000000000b16212b353d474f59606b707d869298a2a49993877e716c615a50505a616c717e879299a3a49993887e716c625a51483f372d23180c0100000000000002090e12141520202020202020201413110d080200000000000613202c3946535f6c7986929facb8ab9e9185786c60544a3f332d2c2c2d2f2f2e2b2620180f06000000000916222f3c4955626f7c88959f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9285796c5f5246392c1f1306000000000000000000000000000000000000000000000000000000000000000000000001070d111314191d1f201f1d191413110d0802000001070d1113142020201e1d1b17110b0400000000000000000000000000000000000916222f3c4955626f7c8895a2aca4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929faca79a8d8174675a4e4134271b0e000c1925323f4c5865727f8b989f9f998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18232d373f464a4c5353535353534d4b4740382e24190e02000000000000000001080d11171c1f202326292a2b2c2c2b2a282522201f1c1712100c070000000000000000000000070d121618191514120e090300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000003101c28343f4a5464707d8a98a2ada196887b6f6255483c31261a0f000000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2aa9d9084776a5d5144372a1e1104000a1724303d4a5763707d8a96a3ab9e9285786b5f5245383d4a5763707d8a96a3ab9e9285786b5f5245382c1f0600000916232f3c4956626f7c86868686868685786b5c666c727b80858a8d8f9192929291908f8c8a86807b726d605c544a3f342b200f060000000006121e2a354049515759606060606060606060606060606060606060606060605e5c574f453a2f24180c00000000000000060f18212a333c454e53555957514940383b4246484b4e5051525252514f4c4847433c393f4850565854534d453b332920170e05000000000000000b162127333f49535b656c727b81868b8e9091929291908e8b87827c726d635c52473e30261c11060000000003101b27323d474f59606b707d869298a2a49a93877e716c615a504848505a616c717e879299a4a49a93887e716c625b51493f34291d11050000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c05000000000613202c3946535f6c7986929facb4aba1978a7e71665b50443f3a39383a3b3b3a37312a22180e030000000916222f3c4955626f7c8893939393939393939393939393939393939393939393939393939393939285796c5f5246392c1f130600000000000000000000000000000000000000000000000000000000000000000000000000010406070c10121312100c070705010000000000000104060713131311100e0b06000000000000000000000000000000000000000916222f3c4955626f7c88959f9f9f978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929f9f9f9a8d8174675a4e4134271b0e000c1925323f4c5865727f8b939393938d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000040613131313131313131312110e09040000000000000000000000000000000000040613131313131313131312110e0904000000000000000000000000000000000007111b252d343a3e3f464646464646403f3b362e261c1208000000000000000000000000060b10121316191c1e1f201f1f1d1b191613120f0b060400000000000000000000000000000106090b0c08080602000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000b17232e3a4753606d7985929faca8998c7f7366584e43372b1c11060000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2aa9e9184776b5e5144382b1e1105000a1724313d4a5764707d8a97a3ab9f9285786c5f52452e3d4a5764707d8a97a3ab9f9285786c5f52452e23170b00000815222e3b4754606a6f797979797979787368545b60696e74797d808284858685858482807d7a746e69625b504a42382e22190f00000000000a16232f3b46515b63666c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b6861574c4034281b0f0000000000000000060f18212a333c4247484c4b463f372b31363a3b3e41444546464544423f3c3a37312c363f454a4b4846423b332920170e050000000000000000050b17222d384149535b606a6e757a7e81838585868584817f7b756f6a635b524940352c1e140a00000000000713202c38444f59606b707d869298a2a49a93887e716c615a50483e3e48505a616c717e879399a4a49a93887f726d625b51453a2e22150900000000050f171f252a2d2e39393939393939392e2d2a251e160e050000000613202c3946535f6c7986929facaea399929183786c6059504947454546484847433c342a20150a0000000916222f3c4955626f7c8686868686868686868686868686868686868686868686868686868686868686796c5f5246392c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8893939393938b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c798692939393938d8174675a4e4134271b0e000c1925323f4c5865727f8686868686868073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000001070c10132020202020202020201f1d1a150f080000000000000000000000000001070c10132020202020202020201f1d1a150f08000000000000000000000000000000000009131b23292e313239393939393933322f2a241c140a000000000000000000000000000000030607090c0f1112131312100e0c090606030000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000006131f2c3845515d6774818e9ba8aa9d9184776a5f5347382e23170b0000000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3ab9e9184786b5e5145382b1e1205000b1824313e4b5764717e8a97a4ac9f9285796c5f4a3f343e4b5764717e8a97a4ac9f9285796c5f4a3f34281c10030006131f2b37434e5860626c6c6c6c6c6c6b68615750575e61676d7073767778797978777673706d67615e5751443f3830261c100700000000000c1925323e4b57636d73797979797979797979797979797979797979797979797873685c5044372b1e11000000000000000000060f18212a31373a3b3f3e3a352e25252a2d2e313437383939383735322f2e2b26242d343a3d3e3b3a36312921170e050000000000000000000006111b262f38414950575f62686e717477787979787775726e69625f58514940372e231a0c0200000000000916222f3b4854606b707d869298a2a49a93887e716c625a50483e36363e48505a616c717e879399a4a49a93887f726d62564a3d3124180b000000020d17212930363a3b4646464646464646463936302820160c0200000613202c3946535f6c7986929facac9f9286928c7f736b605b53535151535555534e463c31261a0f0200000815222e3b4754606a76797979797979797979797979797979797979797979797979797979797979797974695d5144382b1f120500000000000000000000000000000000000003080c0e0e131313131313130f0e0c09040000000000000000000000000000000000000000000000000000000000000003070b0d0e131313131313130e0e0c08030000000000000916222f3c4955626f7c868686868686867e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c79878686868686868074675a4e4134271b0e000b1825313e4a56626d72797979797979736e63584b3f3226190c000000000000000000000000000000000000000000000000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a26201912090000000000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a262019120900000000000000000000000000000000010911181e2225252d2d2d2d2d2d2726231f19120a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000004101d2935404b5563707d8996a1aca095887b6f62544a3f34281c100300000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3ab9e9185786b5e5245382b1f1205000b1825313e4b5864717e8b97a4ac9f938679665c5044383e4b5864717e8b97a4ac9f938679665c5044382b1f120600030f1b27323d464e54566060606060605f5c574f444d53555c606367696b6b6c6c6b6a696663605d55534d453f342e261e140a0000000000000d192633404c5966737f8686868686868686868686868686868686868686868685786b5e5245382b1f1200000000000000000000060f1820262b2e2f33322f2a231c1a1e212125282a2b2c2c2b2a282522211f1b1b22292e31322e2d2a251f170f050000000000000000000000000a141d262f383f444e53565e6165686a6b6c6c6b6a6865615e57534e463f372e251c11080000000000000a1623303d495663707d869298a2a39f93887f716c625a50483e362c2c363e48505a616c717e879399a4a49a93887e7265584b3f3225180c00000009141f29333b42464853535353535353535346413a32281e1308000005121f2b3744505b657986939faca79a8d818d93877d726c6562605d5c6062625f584e43372b1f1206000006131f2b37434e5860626c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6962584d4135291c10030000000000000000000000000000000001090f14181a1b202020202020201c1b191510090200000000000000000000000000000000000000000000000000000001080e1317191a202020202020201b1a18140f0901000000000815212e3b47535f6a7679797979797979716c6256493d3024170a0000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3845525e6a7579797979797979746e64584c3f33261a0d000916222e3a46515b62656c6c6c6c6c6c66635c52473b2f23170a0000000000000000000000000000000000000000000000000000000000030d151d23292c3939393939393939393836312b241b1208000000000000000000030d151d23292c3939393939393939393836312b241b12080000000000000000000000000000000000070d121618192020202020201a1917130e08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a0500000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000c18242f394653606c7884919eaba7998c8073665c5044382b1f140900000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3ab9e9285786b5f5245382c1f0600000b1825323e4b5865717e8b98a4afa49986796d6053463a3e4b5865717e8b98a4afa49986796d6053463a2d20130700000a16202b343d43474953535353535352504c453b42464b5153575a5c5e5f5f5f5e5d5c595754514c46423b3328231c140c020000000000000d192633404c5966737f8c93939393939393939393939393939393939393939185786b5e5245382b1f120000000000000000000000060e151a1e21222625221e18120e121415181b1d1e1f1f1f1e1c191515120f11181d21242521211e1a140d0500000000000000000000000000020b141d262d333c42474c5254585b5d5e5f5f5e5d5b5854524d47433c342d251c130a000000000000020f1c2935424f5c6875828f949fa39b918b7f726d625a50483e362d24242c363e48505a616c717e879399a49e938e8175685b4e4235281b0f0200020e1a25303b454d525f60606060606060605f524c443a3025190d01000613202d394653606c78869aa4afa396897d869292877f78726e6d67676d6e6e6a5f53473a2e2114080000030f1b27323c464e5455606060606060606060606060606060606060606060606060606060606060605f5d5850463b3025190d00000000000000000000000000000000030b131a202427282d2d2d2d2d2d2d292825211b140c0300000000000000000000000000000000000000000000000000020b12191f2326272d2d2d2d2d2d2d282724201a130b0300000006131f2b37434e585f626c6c6c6c6c6c6c64625a5045392d2115080000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2a36424e59636a6c6c6c6c6c6c6c67645c52473c3024170b0006121e29343f495156586060606060605a58524a40362a1f130700000000000000000000000000000000000000000000000000000000010b151f272f343846464646464646464645423d352d24190f0400000000000000010b151f272f343846464646464646464645423d352d24190f0400000000000000000000000000000000000106090b0c1313131313130d0c0a07020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a030000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000007121f2b3844505b6673808c99a3ab9e9184796d6053463b30251a0e01000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3ab9f9285786c5f52452e23170b00000c1825323f4b5865727e8b98a5b5a093867a6d6053473a3f4b5865727e8b98a5b5a093867a6d6053473a2d2014070000040f19222b32373b3c4646464646464544403a3136394045474a4d4f5152535252514f4d4a4745413a3631292117110a02000000000000000d192633404c5966737f8c999999999999999da0a7a9a29f999999999999999185786b5e5245382b1f1200000000000000000000000003090e121415191816120d07020507080b0e1112131312110f0c09080603060c111517181514120e0903000000000000000000000000000000020b141b222731373b4146474b4e5152525352514e4c4846423b37312a221c130a01000000000000000714202d3a4753606d79828f949b918b7f726d625a50483f362d241b1a242c363e48505a626c717e87939a938e81786d6053463a2d201307000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d1105000713202d3a4653606d798693a0b6a295887c818e99928c837f7b7a7979797b7c6e6255483b2f2215080000000a15202b343c4347495353535353535353535353535353535353535353535353535353535353535352514d463e342a1f1408000000000000000000000000000000010b151d252b303435393939393939393534312c261e150c000000000000000000000000000000000000000000000000000b141d242b303334393939393939393534302b251d150b010000030f1b26323c464e535560606060606060585650483e34291d110500000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a26313d4751595e5f6060606060605a58524a41362b1f140800010d18232d373f464a4c5353535353534d4b4740382e24190e020000000000000000000000000000000000000000000000000000000007121d2731394045535353535353535353524e473f352b2015090000000000000007121d2731394045535353535353535353524e473f352b20150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d0400000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000030f1c28333f4a54616e7b87929faca1968a7d7063574d42362a1d1307000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4ac9f9285796c5f4a3f34281c1003000c1925323f4c5865727f8b98a5ada093877a6d6054473a3f4c5865727f8b98a5ada093877a6d6054473a2d21140700000007101920272b2e2f3939393939393837342f252a2f34383a3d404344454646454443403d3a39352f2a251f170f060000000000000000000d192633404c5966737f8c8c8c8c8c8c8c8c9095a0a297928c8c8c8c8c8c8c8c85786b5e5245382b1f120000000000000000000000000000020608080c0c0a060200000000000001040506060504020000000000000105090b0b08070502000000000000000000000000000000000000020a111720262b3036393b3e41444546464544423f3b3a36302b262018100a01000000000000000006131f2c3845515c676d79828f918b7f726d625b51483f362d241b12121a242c363e48505a626c717e88938e81786d665c5044382b1f120600000714202d3a46525e6976797979797979797976685e5246392d201307000714202d3a4753606d7a8693a0ada194887b7c88949f95918c8886858586888073675a4d4034271a0d000000040f19222b32373b3c464646464646464646464646464646464646464646464646464646464646464644413b342c22180d0200000000000000000000000000000009131d272f373c40414646464646464642413d3730271e0e050000000000000000000000000000000000000000000000030d1d262e363c3f414646464646464641403c372f271d13090000000a15202a343c434749535353535353534b49453e362d22170c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202b353f474e52535353535353534e4c4741382f241a0e03000007111b252d343a3e3f464646464646403f3b362e261c120800000000000000000000000000000000000000000000000000000000000c18232f39434b515f606060606060605f5e5951473d31261a0e010000000000000c18232f39434b515f606060606060605f5e5951473d31261a0e0100000000000000000000000000000000000000000000000000000000000106090b0c131313130c0b09060100000000000000000000000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d03000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000b17222d3846525e6975828f9ba7a89b8f8275695e52463a2f24180d000000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4ac9f938679665c5044382b1f1206000c1926333f4c5966727f8c99a5ada094877a6d6154473a3f4c5966727f8c99a5ada094877a6d6154473a2e21140700000000070f161b1f22232d2d2d2d2d2d2c2b28241a1d23292c2d3034363838393938373633302d2c29241e1a140d0500000000000000000000091623303c4956636f7d808080808080808083909d9f928580808080808080807f7265594c3f3226190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b151a1e252a2d2e323537383939383735322e2d2a251f1a150e060000000000000000000004101c2934404b555c676d79828a7f726d625b51493f362d241b120909121b242d363e48505a626c717e8681786d665c544a3f34281c100300000815212e3b4854616e7b86868686868686867a6d6154473a2e211407000714212d3a4754606d7a8793a0ada194877a76828f99a09d9895989292988d8073675a4d4034271a0d0000000007101920272b2e2f39393939393939393939393939393939393939393939393939393939393939393835302a221a1006000000000000000000000000000000030f1a252f3941484d4e535353535353534f4d4942393020170d02000000000000000000000000000000000000000000010b151f2e3840474c4d535353535353534e4d4841392f251a0f030000040e18222a32373b3c464646464646463e3d39342d241b1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f19242d353d424546464646464646413f3c362f261d13080000000009131b23292e313239393939393933322f2a241c140a000000000000000000000000000000000000000000000000000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d1104000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d110400000000000000000000000000000000000000000000000000000000070d1216181920202020181815120c060000000000000000000000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000006111c2a36424d5763707d89959fac9f92867b6e61554b4135291d12070000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4afa49986796d6053463a2d201307000d192633404c5966737f8c99a6ada194877a6e6154473b404c5966737f8c99a6ada194877a6e6154473b2e2114080000000000040a0f1315162020202020201f1e1c180e12181c1f202427292b2c2c2c2b2a29262421201d19130e090300000000000000000000000915222f3b4854606b6f7373737373737374818e9b9e91847873737373737373726d62574a3e3125180b0000000000000105090b0b1313131307060405090b0b131313130706040005090b0b13131313070604000000000000000000000000000000000000000000000000000000000000000003090e14191e202125282a2b2c2c2b2a282521201e1a140f0a030000000000000000000000000c18232f39434b555c676d797d726d625b51493f372d241b1209000009121b242d363f48505a626c717d786d665c544a42382e23170b0000000815212e3b4854616e7b87939393939393877a6d6154473a2e211407000814212e3b4754616e7a8794a1aca093877a6f7c87929fa5a5aaa29f9f9a8d8073675a4d4034271a0d0000000000070f151b1f22222d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f181008000000000000000000000000000000000814202b37414b53595b606060606060605c59544b4232291f140900000000000000000000000000000000000000000007121d2731404a52585a606060606060605b59534b41372b20140800000006101820262b2e2f3939393939393931302d29221b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242b313638393939393939393433302b241d140b0100000000010911181e2225252d2d2d2d2d2d2726231f19120a02000000000000000000000000000000000000000000000000000000000006131f2c3845515c67767979797979797979756a5e5245382c1f1206000000000006131f2c3845515c67767979797979797979756a5e5245382c1f12060000000000000000000000000000000000000000000000000000010911181e2225252d2d2d2d2524221d1811090000000000000000000000000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c11050000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000e1a25303b4854606b7683909da8a3998d8073675d5145392e23180c0000000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b5a093867a6d6053473a2d201407000d1a2633404d596673808c99a6aea194887b6e6155483b404d596673808c99a6aea194887b6e6155483b2e221508000000000000000306080913131313131312110f0c01070c101314171a1c1e1f201f1f1e1c1a171413110d0801000000000000000000000000000713202c38444f5960636666666666666874818e9b9e9184786b66666666666665625b51463a2e2216090000000000060c111517182020201f141310111517182020201f1413100c111517182020201f1413100c07010000000000000000000000000000000000000000000000000000000000000002080d111414181b1e1f1f201f1e1b191514120e0903000000000000000000000000000007121d273139434b555c676d716c625b51493f372d251b12090000000009121b242d363f48505a626b706d665c544a423830261c11060000000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e211407000815222e3b4855616e7b88949f9fa39986796d73808c939fa2aaaaaba69a8d8073675a4d4034271a0d000000000000040a0f131516202020202020202020202020202020202020202020202020202020202020201f1f1c19140d0600000000000000000000000000000000000c1824303c48535d64686c6c6c6c6c6c6c68655d54443b3025190e0000000000000000000000000000000000000000000c18232f3943525c64676c6c6c6c6c6c6c68645d53483c3024180c00000000060e151b1f21222d2d2d2d2d2d2d2524211d1711090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121920262a2c2c2d2d2d2d2d2d2726241f1a130b0200000000000000070d121618192020202020201a1917130e08000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d798686868686868687796c5f5346392c20130600000000000714202d3a4753606d798686868686868687796c5f5346392c201306000000000000000000000000000000000000000000000000000009131b23292e31323939393932312e29231b13090000000000000000000000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a0000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000009141f2c38444f5964717e8a96a0ab9f92857a6d60544b4034281d120700000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5ada093877a6d6054473a2d211407000d1a2733404d5a6673808d99a6aea195887b6e6255483b404d5a6673808d99a6aea195887b6e6255483b2f2215080000000000000000000000060606060606050503000000000406070a0d10111213131211100d0a07060401000000000000000000000000000000030f1b27323d474f545659595959595b6874818e9b9e9184786b5e5959595959595751493f35291e1206000000000911181d2124252d2d2d2c201f1c1d2124252d2d2d2c201f1c181d2124252d2d2d2c201f1c18120b030000000000000000000000000000000000000000000000000000000000000000010507080b0e1112131312110f0c0807050200000000000000000000000000000000010b151f273139434b555c6064615a51493f372d251b130900000000000009121b242d363f4850596063605c544a423830261e140a000000000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e211407000915222f3c4855626f7b8893939393928679666c77818c92989b9e9f9f9a8d8073675a4d4034271a0d000000000000000003060809131313131313131313131313131313131313131313131313131313131313131312100d08020000000000000000000000000000000000000e1a2734404d59646f7479797979797979756f65564d42362a1c11060000000000000000000000000000000000000004101c2934404b55646e7479797979797979746f64594d4034271a0e0000000000040a0f13151620202020202020181715110c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f151a1d1f202020202020201b1a17140e08010000000000000000000106090b0c1313131313130d0c0a070200000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693939393939286796c5f5346392c20130600000000000714202d3a4753606d7a8693939393939286796c5f5346392c2013060000000000000000000000000000000000000000000000000007111b252d343a3e3f464646463f3d3a342d251b110600000000000000000000000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d0100000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000002101b27323d4653606c7884919da8a2978b7f72665c5145392e23180c01000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5ada094877a6d6154473a2e211407000d1a2734404d5a6773808d9aa6aea295887b6f6255483c404d5a6773808d9aa6aea295887b6f6255483c2f22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212b353d4448494d4d4d4d4e5b6874818e9b9e9184786b5e514d4d4d4d4c4a463f372d23180d0100000009121b22292e3132393939392d2c29292e3132393939392d2c2923292e3132393939392d2c29231d150d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d151f273139434b5153575550483f372d251b1309000000000000000009121b242d363f474f545653504a423830261e140c02000000000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e211407000916222f3c4955626f7c86868686868685786c656c777f868b8e919292928d8073675a4d4034271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2835414e5b687481868686868686868175695e5246382d22170b0000000000000000000000000000000000000006131f2c3845515c677480868686868686868174685b4e4135281b0e0000000000000003060809131313131313130b0a080500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e1112131313131313130e0d0b080300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c20130600000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c201306000000000000000000000000000000000000000000000000010d18232d373f464a4c535353534b4a463f372d23180c01000000000000000000000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f0300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000b161f2b3844505b66717e8b96a0a99e9184796d60554b4034281e1308000000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6ada194877a6e6154473b2e211408000e1b2734414e5a6774818d9aa7afa295887c6f6255493c414e5a6774818d9aa7afa295887c6f6255493c2f2216090000000000000105080b0b1313131313130c0b090501000000000000000000000000000002070a0c0d1313131313130b0a08050000000000000000040f19232b32383b3c404040414e5b6874818e9b9e9184786b5e51454040403f3e3a352d251b110700000006111b242d343a3d3e464646463a3834343a3d3e464646463a38342f343a3d3e464646463a38342f271f150b0100000000000000000000000000000000000000030608090d1012131312110f0b0707050100000306060b0f121312110e080705020000000000000000000000000000030d151f2731394045474a49453e362d251b13090100000000000000000009121b242d353d44484a46443f3830261e140c0200000000000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e211407000815222e3b4754606a767979797979797873695b656c727a7f8284858685837e7164574b3e3124180b00000000000004090c0e0f131313131313131313131313131313131313131313131313131313131313131313100f0d09050000000000000000000000000000000000000916232f3c4956626f7c89959393939392867b6e61544a3f33281c0f030000000000000000000000000000000000000714202d3a4753606d7985929393939395897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a05000000000000000000000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000006121e29343f4951565860606060585651493f34291d120600000000000000000000000000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000030f1c28333f4a54606d7884919da7a1968b7e72675c51453a2f24190d030000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6aea194887b6e6155483b2e221508000e1b2834414e5b6774818e9aa7afa295897c6f6256493c414e5b6774818e9aa7afa295897c6f6256493c2f2316090000000000060c11151718202020202020181815110c06000000000000000000000000070e1316191a202020202020181715110c060000000000000007111921272c2f30333335414e5b6874818e9b9e9184786b5e514538333332312e29231b130a000000010c18222d363f454a4b535353524745403f454a4b53535352474540393f454a4b535353524745403931271d12070000000000000000000000000000000000040a0f1315161a1d1f1f201f1e1b181413110d080b0f1213181c1f201f1e1b1514120e090300000000000000000000000000030d151f272f34383a3e3c39332c241b130901000000000000000000000009121b232b33383c3d3a38342e261e140c020000000000000815212e3b4854616e7b87939393939393877a6d6154473a2e2114070006131f2b37434e5860626c6c6c6c6c6c6c6961535b60686d72757778797876716c6155493d3023170a0000000002091015191b1c2020202020202020202020202020202020202020202020202020202020202020201d1c1915100a03000000000000000000000000000000000915222e3b4854606a7783909daa9fa3998c7f73665b5044382b1f1409000000000000000000000000000000000006121f2b37434e5864717e8a97a29f9f9d9083776b6054483b2f22150900000000000000000000000000000000000000000406070a0c0f11111213131312110f0d0b070705010000000000000000000000000000000000000000000000000003060809131313131313130b0a08050000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000916222e3a46515b62656c6c6c6c65625b51463a2e22150900000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000b17222d3844505c66717e8a95a0a89e9184796d60564c4135291f14090000000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6aea195887b6e6255483b2f221508000e1b2835414e5b6874818e9ba7afa396897c706356493d414e5b6874818e9ba7afa396897c706356493d3023160a000000000911171d2124252d2d2d2d2d2d2524221d181109000000000000000000010a12191e2325262d2d2d2d2d2d2524211d17110900000000000000070f161b202223262835414e5b6874818e9b9e9184786b5e5145382b262625221e18110a0100000005111d29343f485056586060605f53514b485056586060605f53514b43485056586060605f53514b43392f23180c00000000000000000000000000000003090e151b1f2222272a2b2c2c2c2a282521201d1913171c1f2024292b2c2c2a2821211e1a140d0500000000000000000000000000030d151d23292c2d31302d28221a1209010000000000000000000000000009111921272c2f302d2b28231c140c02000000000000000815212e3b4854616e7b86868686868686867a6d6154473a2e21140700030f1b27323c464e54556060606060605f5d574950565d6065686b6c6c6b6a64615a5045392d211408000000030c141b212528292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292826211b140c0400000000000000000000000000000007131f2c38434e5865727e8b98a2aeab9e9184786c6053463b30251a0e00000000000000000000000000000000000814212e3a47535f6a7683909ca9aea2988b7f7265594f43382c1f1307000000000000000000000000000000000001070c10131417191b1d1e1f20201f1f1e1c1a171413110d0804010000000000000000000000000000000000000000040a0f13151620202020202020181715110c060000000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d04000000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000b1825313e4a56626d7279797979726d62564a3d3124180b00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000006111c28343f4a54606c7883909da6a1968c7f72685d52453b31261a0c0300000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000d1a2734404d5a6773808d9aa6aea295887b6f6255483c2f221509000f1b2835424e5b6875818e9ba8b0a396897d7063564a3d424e5b6875818e9ba8b0a396897d7063564a3d3023170a00000009121b22292d303139393939393932312e29231b120900000000000000000a131c242a2f323339393939393931302d29221b120900000000000000040b0f1315161b2835414e5b6874818e9b9e9184786b5e5145382b1e191816120d0700000000000915212e3a45505a62656c6c6c6c605c55505a62656c6c6c6c605c554b505a62656c6c6c6c605c554b4034291c100400000000000000000000000000060e141a20262b2e2f3336383939383735322e2d2a251e22282b2d313638393937342e2d2a251f170f0500000000000000000000000000030b12181c1f202423211c17100800000000000000000000000000000000080f161c202223201f1c17110a0200000000000000000714202d3a46525e6976797979797979797976685e5246392d20130700000a15202b343c43474953535353535352514c3f444c5254585b5e5f5f5f5d575550483e33281d11050000020c151e262c3134353939393939393939393939393939393939393939393939393939393939393939393635322d261e160c030000000000000000000000000000030f1b27323d4754606d7a85929facaca1968a7d7063574d42362a1c110600000000000000000000000000000004101c2934404b55626e7b88949fabac9f92867a6d6054473d32271b0f03000000000000000000000000000000050b1012181c1f202326282a2b2c2c2c2c2c2a29272421201d1913100d07010000000000000000000000000000000000060e151b1f21222d2d2d2d2d2d2d2524211d171109000000000000000000000000000000000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d030000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000c1925323f4c5865727f868686867f7265584b3f3225180c00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000b17232e3844505b66707d89949fa89e92857a6d60574d42362a1e150a00000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d9aa7afa295887c6f6255493c2f221609000f1c2835424f5b6875828e9ba8b0a3968a7d7063574a3d424f5b6875828e9ba8b0a3968a7d7063574a3d3024170a000006111b242d34393d3e4646464646463f3d3a342d241b0b02000000000000030d1c252e353b3f404646464646463e3d39342d241b110600000000000000000307090e1b2835414e5b6874818e9b9e9184786b5e5145382b1e120b0906010000000000000b1724313d4a56626c71797979796d675c56626c71797979796d675c5156626c71797979796d675c5145382c1f1306000000000000000000000000080f181f262a32373b3c40434546464544423e3a3936302a2d3338393e4245464544413b3a36312921170d030000000000000000000000000001070c101314171714110c05000000000000000000000000000000000000050b101316171312100b060000000000000000000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d11050000040f19222b32373b3c464646464646454441333a4145474b4f51525352504b49453e362c22170c00000009141e2730373d414246464646464646464646464646464646464646464646464646464646464646464643413e3830281e140a0000000000000000000000000000000a16202c3945515d6774818e9aa7b1a89b8f8275695e5246382e23170b00000000000000000000000000000006131f2c3845515c6774808d9aa6b0a79b8e8174685d5245392b21160a0000000000000000000000000000040b10161c1d23292c2d30333537383839393938373633312e2d2a25201d18120b0600000000000000000000000000000006101820262b2e2f3939393939393931302d29221b120900000000000000000000000000000000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a0000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000c1926323f4c5965727f8c93938b7f7265584c3f3225190c00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000006111c28333f4a54616b76828f99a4a1978d8073695f53463d30261c1106000000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000e1b2834414e5b6774818e9aa7afa295897c6f6256493c2f231609000f1c2936424f5c6975828f9ca8b0a3978a7d7064574a3d424f5c6975828f9ca8b0a3978a7d7064574a3d3124170a00010c17222d363f45494b5353535353534b4a453f372d1d140a0000000000010b151f2e3740474b4d5353535353534b49453e362d22170c00000000000000000000020e1b2835414e5b6874818e9b9e9184786b5e5145382b1e12050000000000000000000b1825323e4b5865717e86868686796d605865717e86868686796d60535865717e86868686796d6053473a2d20140a0000000000000000000000081119212a31363c4347494d5052525352514e4b4746413a36383f44464b4f525352514e4846423b33291f1409000000000000000000000000000000000406070b0a0805000000000000000000000000000000000000000000000407090a070603000000000000000000000000020e1a25303b454d525f60606060606060605f524c443a3025190d0100000007101920272b2e2f393939393939393835272f35393a3f4244454645433e3d39332c241a1006000004101b26303942494d4f535353535353535353535353535353535353535353535353535353535353535353504e49423a30261b1005000000000000000000000000000004111d2935414b55626f7c88959fabac9f92877b6e61544a3f34281c100300000000000000000000000000000714202d3a4753606d7985929eabaca095897c6f63564c413529190f0400000000000000000000000000060b161b21282c2f34383a3d3f42444445464646454442403e3a3936302c29241d17110a02000000000000000000000000040e18222a32373b3c464646464646463e3d39342d241b110600000000000000000000000000000000000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c110500000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99988c7f7265594c3f3226190c00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000b17222d38424f59626f7c87939fa99f92867b6e61594f42382e23170c020000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000e1b2835414e5b6874818e9ba7afa396897c706356493d3023160a00101c2936434f5c6976828f9ca9aca4978a7d7164574a3e434f5c6976828f9ca9aca4978a7d7164574a3e3124170b0005111d29343f48505658606060606060585651493f2f261b11060000000007121d27314049525759606060606060585650483e34291d1105000000000000000205070e1b2835414e5b6874818e9b9e9184786b5e5145382b1e12050000000000000000000a1723303d4a5663707d8993988a7d70635763707d8993988a7d7063575663707d8993988a7d7063574a3d31261b0f03000000000000000000060f19232b333b42464e54555a5d5e5f5f5f5d5b5854524c4641424a5053575c5e5f5f5d5b54534d453b31251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f29333b42464853535353535353535346413a32281e13080000000000070f151b1f22222d2d2d2d2d2d2c2b281e24292c2d3235383939383731302d28221a12080000000915212c37424b54595c6060606060606060606060606060606060606060606060606060606060606060605c5a544c42382d2115090000000000000000000000000000010d18242f3a47535f6a7683909da9afa3998c7f73665c5044382b1f14090a0a0a0a0a0a0a0a0a0a0a0a0a0a121f2b37434e5864717e8b97a2adaa9d9083776b6054443a2f241907000000000000000000000000020a111721272c3338394045474a4c4e50515253535252514f4d4a4746413a39352f28231c140c0600000000000000000000000a15202a343c434749535353535353534b49453e362d22170c0000000000000000000000000000000000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a00000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000d192633404c5966737f8c99998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000006111c262f3d47535f6a74818e97a2a3988e82756b60544a3f34281f14090000000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000f1b2835424e5b6875818e9ba8b0a396897d7063564a3d3023170a00101d293643505c6976838f9c9f9f9f978b7e7164584b3e43505c6976838f9c9f9f9f978b7e7164584b3e3125180b000815212d3945505a62646c6c6c6c6c6c65625b5141382d22170b000000000c18232f3943525b63666c6c6c6c6c6c64625a5045392d211508000000000002090e1114141b2835414e5b6874818e9b9e9184786b5e5145382b1e12050000000000000000000815222f3b4855626e7b88959a8d81746758626e7b88959a8d8174675855626e7b88959a8d817467584e43372b1f12060000000000000000030e18222b353d454d53585f6266696b6c6c6b6a6865615e56524c4c545b6064696b6c6c6a67615e574d42362a1e1205000000000000000000000000000000010406070b0e101213131312100e0b07060401000000000000000000000000000000000000000000000000000000000000020d17212930363a3b4646464646464646463936302820160c02000000000000040a0f1315162020202020201f1e1c13191d202125282b2c2c2c2a2423211d171008000000000c1925313d49545d65686c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69665e54493e3226190d00000000000000000000000000000007131d2b37434e5864717e8b97a2adab9e9184786d6053463b31251a16161616161616161616161616161616212e3a47535f6a7683909ca9aea2988b7f7265594f4332281e13080000000000000000000000030b141c222832383e44484b515356595b5d5e5f5f5f5f5f5d5c5a5754524c47454039342e261e170f07000000000000000000030f1b26323c464e535560606060606060585650483e34291d110500000000000000000000000000000000000000000000000000000000000000000d1a26323e4a545e66696c6c69665e544a3e32261a0d00000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000d1a2633404d596673808c99998c7f7366594c403326190d00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000a141d2b37434e58616d7a85929fa79e93897d70665c50443b30251a0d0300000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000f1c2835424f5b6875828e9ba8b0a3968a7d7063574a3d3024170a00101d2a3643505d6976839093939393938b7e7165584b3e43505d6976839093939393938b7e7165584b3e3225180b000b1724303d4956626c71797979797979726d6253493f33271b0f03000004101c2934404b55636e73797979797979716c6256493d3024170a00000000050d14191e2021272835414e5b6874818e9b9e9184786b5e5145382b1e12050000000000000000000714202d3a4753606d7a86979e9184786a5f606d7a86979e9184786a5f53606d7a86979e9184786a5f53473a2e21150800000000000000000a15202a343d474f575f616a6f7376787979787775716d68615e56565d666c717578797877746e695e53463a2d2114070000000000000000000000000001070d111314181b1d1f1f201f1f1d1b181413110d07010000000000000000000000000000000000000000000000000000000000050f171f252a2d2e39393939393939392e2d2a251e160e0500000000000000000003060809131313131313121210080d111314181c1e1f201f1d181714110c0600000000000e1b2834414d59656f757979797979797979797979797979797979797979797979797979797979797979797670665a4e4135281c0f000000000000000000000000000000010f1b26323c4753606d7985929fabada1968a7d7063574d42362a23232323232323232323232323232323232934404b55626e7b88949fabac9f92867a6d6054473d3221160c0100000000000000000000030c151d262d333d44484f55555c606366686a6b6b6c6c6c6b6a696664615e5653514b443f38302921191007000000000000000006131f2b37434e585f626c6c6c6c6c6c6c64625a5045392d21150800000000000000000000000000000000000000000000000000000000000000000f1c2935424e5a66707679797670665a4e4235291c0f00000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99998c807366594d4033261a0d00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000020b1b26323c46525e68727f8c95a0a59d9083786d60574d42362a1f150b01000000000000121f2c3845525f6b7885929eabada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000f1c2936424f5c6975828f9ca8b0a3978a7d7064574a3d3124170a00101d2a3743505d6a7683868686868686867f7265584b3f43505d6a7683868686868686867e7265584b3f3225180c000b1825313e4b5864717e8686868686867f72655b5044372b1f150a000006131f2c3845515c6773808686868686867e7164584b3e3125180b000000050e171f252a2d2e342d35414e5b6874818e9b9e9184786b5e5145382b1e120500000000000000000006131f2c3945515d677885929e96887b6f625d677885929e96887b6f62555d677885929e96887b6f6255483c3025190d01000000000000020f1a26313c464f5960696e767c80838585868583817e7a746d68605d686d787e8285868584817b6e6154483b2e211508000000000000000000000002080e13181d202024272a2b2c2d2c2b2a272421201d18130e090300000000000000000000000000000000000000000000000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c05000000000000000000000000000006060606060606050300010406070c0f11121312100b0a0805000000000000000f1c2935424f5c6875828686868686868686868686868686868686868686868686868686868686868686868276695c504336291d10000000000000000000000000000000000a151f2c3845515d6774808d9aa6b0a89c8f8275695e5346382e3030303030303030303030303030303030303845515c6774808d9aa6b0a79b8e8174685d5245392c20130400000000000000000000000b151e272f383f444f54596163676d70727577777879797978777573716d6865605d55504a423b332a22190f06000000000000000815212e3b47535f6a7679797979797979716c6256493d3024170a0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768386868376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9a998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000000a15202a36414c56606d7883909aa4a0958c7f72695e52463e31271d1207000000000000121f2c3845525f6b7885929eabaca194877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f9ca9aca4978a7d7164574a3e3124170b00101c2936424f5b66717679797979797979726d62564a3d424f5b66717679797979797979726d62564a3d3124180b000713202d3a4653606d7984919393939184786c6053463c31261a0f02000714202d3a4753606d7985929393939184796d6053463a2d2013070000020d17202930363a3b413a38414e5b6874818e9b9e9184786b5e5145382b1e120500000000000000000004101d2935404b556a7783909d998c7f7266566a7783909d998c7f726656556a7783909d998c7f7266564c41362a1d110500000000000006121f2b37434e58606b707b82888d9091929292908e8b86817a706b606d7a828a8f91929290897d7063564a3d3023170a00000000000000000000050d14191d24292c2d31343738393939383634312d2c29241d1a140d050000000000000000000000000000000000000000000000000000000002090e12141520202020202020201413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875828f939393939393939393939393939393939393939393939393939393939393938f8276695c504336291d100000000000000000000000000000000004101d2935404b55626e7b88949fabac9f93877b6e61544a3f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4753606d7985929eabaca095897c6f63564c4135291d11040000000000000000000007121d273039424a505960636b7075797d7f81838485868685858482807d7a76716d67605c544d453c342a21180c030000000000000916222f3c4955626f7c868686868686867e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9a9a8d8073675a4d4034271a0d01000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000040d1925303a44515c666f7d88939fa79f92867b6e61594f43392f24180c020000000000121f2c3845525f6b7885929e9f9f9f94877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000101d293643505c6976838f9c9f9f9f978b7e7164584b3e3125180b000e1a26323e4a555f666a6c6c6c6c6c6c6c65625b51453a3e4a555f666a6c6c6c6c6c6c6c65625b51453a2e2215090006131f2c3845515c66727f8c97a2a0958a7d7063584e43372b1e13080714202c38444f5965717e8b97a1a2978c7f72665c5144382c1f1206000009141f29323b4246474d4745404e5b6874818e9b9e9184786b5e5145382b1e1205000000000000000000000c18242f424f5c6875828f9b9c908376685e6875828f9b9c908376685e5c6875828f9b9c908376685e5246392d2013070000000000000814212e3a47535f6a707d858f94999c9e9f9c9b9c9b98928e857d706b75828f949c9e9f9f96897d7063564a3d3023170a000000000000000000080e171e252a2f35393a3e4143454646464543413e3a39352f2a251f170f09000000000000000000000000000000000000000000000000000000000002050708131313131313131307070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875828f9b9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9c8f8376695c504336291d1000000000000000000000000000000000000c18242f3947535f6a7683909ca9afa4998c8073665c504949494949494949494949494949494949494949494e5864717e8b97a2adaa9d9083776b6054443a2f24190d01000000000000000000040e18232e39434b545b606b70767d8185898c8e90919292929292908f8d8a86837e79726d665f574e463c332a1e150b0000000000000916222f3c4955626f7c8893939393938b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9a9a8d8074675a4d4134271a0e01000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000030709090c0c0c0c0c0c0c0c0c0c0c0c0c0c08131e2834404a54606b74818e97a1a2988e81756b61554b4035291e140a0000000000121f2c3845525f6b7885929393939393877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000101d2a3643505d6976839093939393938b7e7165584b3e3225180b000a16222d38434d555b5d60606060606060585651493f3438434d555b5d60606060606060585651493f34291d11050004101c2834404b54606d7a85929fa89c8f82766a5f53473a3025190d0916232f3c4855606b7783909da99f92857a6d60544a4034281c100400020e1925303b444d52545a53514b4e5b6874818e9b9e9184786b5e5145382b1e120500000000000000000000071a2734414d5a6774808d9a9f93867a6d616774808d9a9f93867a6d615a6774808d9a9f93867a6d6154473a2e23180c000000000007131f2c38434e58626e7c8692989fa29f97928f8e8f9196999792877d707d89949ea69e989291897d7063564a3d3023170a00000000000000010a121a202930363a4045474b4e505252535252504e4b4745413a363029211b120a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875828f939393939393939393939393939393939393939393939393939393939393938f8376695c504336291d10000000000000000000000000000000000007121d2b37434e5864717e8a97a1adab9e9184796d6056565656565656565656565656565656565656565656565f6a7683909ca9aea2988b7f7265594f4332281e1308000000000000000000020c16202834404b555c666c737d838a8e9298999b9d9e9e9f9f9f9e9d9c999993908b857f786e695f584e453c30271d120700000000000916222f3c4955626f7c88959f9f9f978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9a9a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000040b0f1315161919191919191919191919191919191918232e39424f59616d7a85929ea69e938a7d70675d51453c30261c110600000000121f2c3845525f6b7885868686868686867a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000101d2a3743505d6a7683868686868686867e7265584b3f3225180c0005111c27313b434a4f50535353535353534b4a453f372d313b434a4f50535353535353534b4a453f372d23180c0100000c18232e3945515d6773808d98a39f94887c6f62564c41362a1c12121f2b37434e5863707d8995a0a3988c8073675d5142392e23180c000005111e2a36424d565e6167605c554e5b6874818e9b9e9184786b5e5145382b1e1205000000000000000000000c1926323f4c5965727f8c98a4998b7e716465727f8c98a4998b7e71645465727f8c98a4998b7e7164544a4034281c1004000000000915222e3b4854606a76828f98a2a298928b8583828284878c929792857b818e9aa69e948f8684867d7063564a3d3023170a000000000000000a131c242c323b41464b5153575a5d5e5f605f5e5d5a5754514b46423b332d241c140a01000000000000000000000000000000000000000000000000000106090b0c13131313131313090806030000000000000000000000000003060809131313131313130b0b0905010000000000000000000000000000000000000000000f1c2935424f5c6875828686868686868686868686868686868686868686868686868686868686868686868376695c504336291d100000000000000000000000000000000000010f1a26313c4653606d7985929eacada1968a7d70646363636363636363636363636363636363636363636363636e7b88949fabac9f92867a6d6054473d3221160c0100000000000000000008131e28323a45515c676d78808990959b9fa2aaaba39f9d9d9c9d9ea1a9aba49f9d97928b837b6f6a5f574d42392e23180c02000000000916222f3c4955626f7c8895a2aca4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9b9a8e8174675b4e4134281b0e01000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000070f161b20222325252525252525252525252525252525252527303d46525e68717e8a949ea59e9184796d60584e42382e23170b02000000111e2b3744505d6873787979797979797976685e5246392d20140700000000000000000000000000000000000000000000000000000000000000101c2936424f5b66717679797979797979726d62564a3d3124180b00000a151f2931383e4243464646464646463f3d3a342d242931383e4243464646464646463f3d3a342d241b110600000007121d2935414c55616e7b86929fa69a8e8174685e5246392e231814212e3a47535f6a76828f9ca79f92867a6d61554b4030271c120700000714202d3a46525e696e746d675f585b6874818e9b9e9184786b5e5145382b1e1205000000000000000000000b1724313e4a5764717d8a97ab9b8e82756664717d8a97ab9b8e8275665c64717d8a97ab9b8e8275665c5144382c1f1206000000000916232f3c4956626f7c89949fa79f92867e79767576777b7f858f948f8283909daa9c8f82797779796d6053473a2d20140700000000000009121c252e363e444c52555d6064676a6b6c6c6c6b696764605d55524d453f362e261c1309000000000000000000000000000000000000000000000000060d12161819202020202020201615130f0a04000000000000000000040a0f13151620202020202020181715110c0600000000000000000000000000000000000000000e1b2834414d59656f757979797979797979797979797979797979797979797979797979797979797979797670665a4e4135281c0f00000000000000000000000000000000000009151f2c3845515c6673808d9aa4afa99c8f82757070707070707070707070707070707070707070707070707074808d9aa6b0a79b8e8174685d5245392c201304000000000000000000010d1925303a44515b606d79828d929d9fa7a8a19e999992919090919297979b9fa4a9a19e9590857c6f695f544b4034281e1408000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9b9b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000007111921272c2f30323232323232323232323232323232323232323235414c56616c75828f98a2a1968d80736a5f544a3f34281d140a0000000f1c2834404c5761686b6c6c6c6c6c6c6c6c5e564c41362a1e1105000000000000000000000000000000000000000000000000000000000000000e1a26323e4a555f666a6c6c6c6c6c6c6c65625b51453a2e2215090000030d171f272d3236373939393939393932312e29231b1f272d3236373939393939393932312e29231b120900000000000d19242f3a46525e6874818e9aa49f92867a6d61544a4034281c1d2a36414c56626e7b88949fa3998d8174685e52433a2f1e150b0000000814212e3b4754616e7b80796f6a605b6874818e9b9e9184786b5e5145382b1e1205000000000000000000000916232f3c4956626f7c8995ab9f9285796d626f7c8995ab9f9285796d60626f7c8995ab9f9285796d6053463a2d201309000000000d1a2733404d5a6673808d99a69f958a7d716d666869696e737a828e938f90959fa298887b6f676d6d675c5145382c1f13060000000000050f1b242e37404850565e61676d71747678797979787674716d67615e57504840382e251b0f06000000000000000000000000000000000000000000010911181e2224252d2d2d2d2d2d2d23221f1b160f0700000000000000070f161b1f22232d2d2d2d2d2d2d2524211d171109000000000000000000000000000000000000000c1925313d49545d65686c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69665e54493e3226190d00000000000000000000000000000000000004101c2834404b54616e7b87939facac9f93877d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d85929fabaca095897c6f63564c4135291d110400000000000000000005111d2935414c56626d75818e949ca4aba39f96918c88868483838485878a8f939a9fa7a79f9791857b6e665c51453b3025190d000000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000020f1c2835424f5b6875828e9b9b8e8175685b4e4235281b0f02000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000040f19232b32383b3c3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f44505a616e7b86929fa69f92877c6f665c50443c2f261b110600000c18242f3b454f575d5f606060606060605f524c443b3025190e02000000000000000000000000000000000000000000000000000000000000000a16222d38434d555b5d60606060606060585651493f34291d1105000000040d151c2226292a2d2d2d2d2d2d2d2524221d1811151c2226292a2d2d2d2d2d2d2d2524221d18110900000000000008131e2a36414d56626e7b87939fa3988c7f73665c5144382c1f202d3946525e6874818e9aa69f92877b6e61564c4131281d0c030000000815212e3b4854616e7b87837c726c656874818e9b9e9184786b5e5145382b1e1205000000000000000000000814212e3b4754616e7a8799a3a297897c70636e7a8799a3a297897c7063616e7a8799a3a297897c706356493d31261a0e02000000101d293643505c6976838f9ca99d9083766c605c54575e61686d78818e949d9fa79f9285796a5f60605c554b4034291c100400000000030d17212d364049515a61686e747a7e8183858586858583817e7a746e69625a524a40372d21180e03000000000000000000000000000000000000000009131b23292e3132393939393939392f2e2b2720191007000000000007101920272b2e2f3939393939393932312e29221b12090000000000000000000000000000000000000915212c37424b54595c6060606060606060606060606060606060606060606060606060606060606060605c5a544c42382d211509000000000000000000000000000000000000000c18232e3946535f6976828f9ca9afa499938a89898989898989898989898989898989898989898989898989899297a2adaa9d9084776b6054443a2f24190d010000000000000000000713202d3946525e68727f8b939ea6aba399928c84807c7977767677787a7e828790959ea5a9a1979083796d60564c41362a1c11060000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9b9b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000203101d2a3643505d69768390908376695d5043362a1d10030200000000000000000b16212b353d4448494c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c525e69727f8b949fa3999083786d60574d41382d22170b000007131e29333d454c5052535353535353535346413b32291e1408000000000000000000000000000000000000000000000000000000000000000005111c27313b434a4f50535353535353534b4a453f372d23180c0100000000030a11161a1c1d20202020202020181815110c060a11161a1c1d20202020202020181815110c0600000000000000010e1925303b47535f6975828f9ba69e9184796d6053463d32272834404b55616d7a86929fa69b8e8175695f53443a301f160c000000000815212e3b4854616e7b8790867f776e6974818e9b9e9184786b5e5145382b1e1205000000000000000000000613202d394653606c7986929fa99a8d8073676c7986929fa99a8d807367606c7986929fa99a8d807367574d42372b1e1206000000111e2b3744515e6a7784919da6998d80736659504a4d52565e666d78829099a3aa9e9184776b585353514b43392f23180c000000000009141f29333f48515b636c717a80868a8d909192939291908d8a86817b716d645c52493f332a2015090000000000000000000000000000000000000009121b252d343a3e3f464646464646463c3b38322b22190f04000000040f19222b32383b3c464646464646463e3d3a342d241b1108000000000000000000000000000000000004101b26303942494d4f535353535353535353535353535353535353535353535353535353535353535353504e49423a30261b10050000000000000000000000000000000000000007121d2a36424d5764707d8a96a1adaba49f9796969696969696969696969696969696969696969696969696969fa2a9aea2988b7f7265594f4332281e130800000000000000000003101c28343f4a54616d7a85929fa5aea39992877f79736f6d666a696a686e71757c838f939ea7a9a0958c8073685e5246382d22170b0000000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b0204050606060504020000000000000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9c9b8f8275685c4f4235291c0f02000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a050000000000030f1b27323d474f54565858585858585858585858585858585858585858585858585857606c77828f97a2a0958c7f72695f53493f33271b0f0300020d17212b333b404445464646464646463b3936302920170d020000000000000000000000000000000000000000000000000000000000000000000a151f2931383e4243464646464646463f3d3a342d241b110600000000000000050a0e1010131313131313130c0b0905010000050a0e1010131313131313130c0b09050100000000000000000008141f2b37424d57626f7c89949fa1978a7e7164594f44382c2c3845515c67737f8c98a39f94887c6f62574d4232291e0d04000000000815212e3b4854616e7b8798928c827b7174818e9b9e9184786b5e5145382b1e12050000000000000000000005121f2b3744505b657784919eaa9d91847769657784919eaa9d918477695f657784919eaa9d918477695f53473a2d211408000000121e2b3845515e6b7884919ea5988b7e7265584b3f42464c545c666f7c87929faa9d9084776a5d514745403931271d120700000000020e1a25313b45505a636d737e858d92989a9d9a9998999a9c9a98928d867e736e645b51463c31261a0f04000000000000000000000000000000000008111a242d373f464a4c535353535353534947433d342b20160a0000000a16202b343d434749535353535353534b4a453f362d241a1107000000000000000000000000000000000009141e2730373d414246464646464646464646464646464646464646464646464646464646464646464643413e3830281e140a0000000000000000000000000000000000000000000e1a26313b4653606d7984919eabb5afaca3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3abadb3ac9f92867a6d6054473d3221160c0100000000000000000006121f2b3844505c6673808d97a2aba79f92877d726d6762605c545d565e61646a6f79818f95a0aba79f92867a6e61544a3f33281c0f0300000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180c0e101213131312100e0b08070502000000000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000003101c2936434f5c6976828f9c9c8f8275695c4f4236291c0f03000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b161009010000000713202c38444f596063656565656565656565656565656565656565656565656565656565656e7b85929fa79f92867b6e655b5044372b1f12050000060f1921292f343738393939393939392e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000000000030d171f272d3236373939393939393932312e29231b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313c4854606a7683909ca79d9083776b6054483b312d3a4653606d7985919ea79c8f82766a5f54453b3120170d00000000000815212e3b4854616e7b879298948f857e74818e9b9e9184786b5e5145382b1e120500000000000000000000030f1b27333f49536976838f9ca9a096887b6e6976838f9ca9a096887b6e616976838f9ca9a096887b6e6155483b2f24190d010000111e2a3744515d6a7784909da5988b7f7265544a413d3b424b545f6a75828f9ca89d9084776a5d514438342f271f150b010000000005121e2a36424d57626c737f8a92979f9f97918e8c8b8c8e91969e9f98928b80736d62584e43372b21160b0000000000000000000000000000000007101a232c363f495156586060606060606056544e463d32271b0f0300030f1b27323d464e545660606060606060585650483f362c2319100700000000000000000000000000000000020c151e262c3134353939393939393939393939393939393939393939393939393939393939393939393635322d261e160c0300000000000000000000000000000000000000000009141f2c3844505c6673808c99a3afbbb9b1acaa9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa7a9afb8bab1a79b8e8174685d5245392c201304000000000000000000000713202d3a4653606d7985929b9d9e9f958b7e716b605c5553514a504c5254585f676d78839099a3aea2988c8073665b5044382b1f120600000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312518191b1d1f1f201f1f1d1b181414110e080200000000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000003101d293643505c6976838f9c9c8f8276695c4f4336291c1003000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a0100000915222f3b4854606b6f7272727272727272727272727272727272727272727272727272727272727e8b97a1a3989082776c605346392d201306000000070f171e24282b2c2d2d2d2d2d2d2d21201e19140d05000000000000000000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d2d2d2d2d2d2524221d181109000000000000000000000105070810101010101010101010101010101010101010101008070501000000000000000000000000000000000915202c38434e5863707d8a95a0a095897c6f63574d423638444f5964717e8b97a1a095897d7063584e43332a1f0e0500000000000613202d394653606c787f86909597928a81818e9b9e9184786b5e5145382b1e120500000000000000000000000b17222d414e5b6874818e9ba7a8988c7f726874818e9ba7a8988c7f72656874818e9ba7a8988c7f7265554c4135291d11040000101c2936434f5c6976828f9ca79a8d8074665c524c4a4847464e5865717e8b98a49d9084776a5d51443729231d150d0300000000000714212d3a46535e69717e8b919fa297928b85817f7f8081848a9196a09f928c7f726a5f53473d32271b10010000000000000000000000000000061019222c353e48515b62656c6c6c6c6c6c6c6260584e43382b1f13060006131f2b38434e5860626c6c6c6c6c6c6c65625a50483e352b22190f0600000000000000000000000000000000030c141b212528292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292826211b140c040000000000000000000000000000000000000000000003101c28343f4a54616e7b87929facb9b1a7a0939393939393939393939393939393939393939393939b9ea5afb8aca095897c6f63564c4135291d1104000000000000000000000a1623303d495663707c898c8e9092979083786c6059514b464440434146474e555d666f7c86929facaa9e9184786c605346392d20130600000916222f3c4955626f7c8895a2afa4978b7e7164584b3e31252225282a2b2c2d2c2b2a282521201e19140f0a040000000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000003101d2a3643505d697683909c9c8f8376695c504336291d1003000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000009131c252c33373939393943505d69768390908376695d50433939393937332c251c13090000091623303c4956636f7c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f85919eaa9f948b7f7265584b3f3225180c00000000060d13181c1e1f202020202020201414110e08020000000000000000000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20202020202020181815110c0600000000000000000002080d1114141c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1414110d08020000000000000000000000000000030f1b27323d4653606c7884919da79b8f8275695f53463a3c4854606b7783909da89d9083776b6054463c3221180e00000000000006121f2b3844505b666c727c838c9299938e8e939e9e9184786b5e5145382b1e12050000000000000000000000061a2633404d596673808c99a6a99c8f82766773808c99a6a99c8f8276676673808c99a6a99c8f8276675d5145392c20130600000c1926333f4c5966727f8c99a59e9184796d605d5656555453505663707c8996a39d9084776a5d5144372a18120b03000000000006121f2b37434e58616e7b86929fa29792857e787473727374787d849095a09f92867c6e62594f44382c1e130800000000000000000000000000060f18222b343e47505a626d72797979797979796f6a6054473b2e221508000815222e3b4754606a6f79797979797979716c625a50473d342b21180f050000000000000000000000000000000002091015191b1c2020202020202020202020202020202020202020202020202020202020202020201d1c1915100a030000000000000000000000000000000000000000000000000c17232e3846525e6975828f9ca8b2aca095898686868686868686868686868686868686868686868e939ea9b4aa9d9084776b6054443a2f24190d01000000000000000000000814212e3b4754616e7b7e7f81838587887e71655b5045403a38343036393c434b545f6a75818e9baaada196897c6f6256493c2f23160600000916222f3c4955626f7c8895a2afa4978b7e7164584b3e312d2e32353738393939383735312e2d2a251f1b150d0701000000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000004101d2a3743505d6a7683909d9c908376695d5043362a1d1003000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b1005000e1b2734414e5a6774808b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b9197a1ada69b8e8175685b4f4235281c0f000000000002070c0f11121313131313131308070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a0e1010131313131313130c0b090501000000000000000000050d14191e202129292929292929292929292929292929292929292921201e19140d0500000000000000000000000000000a161f2b3744505b65717e8b96a19f93877b6e61554c41424e5763707d8995a0a0968a7e7164594f44342a200f06000000000000030f1c28333f4a545b606a6e787f8690959b9b9ea59e9184786b5e5145382b1e120500000000000000000000000b1825323e4b5865717e8b98a4ac9f92867a6d717e8b98a4ac9f92867a6d65717e8b98a4ac9f92867a6d6054473a2d22170b00000915222f3c4855626f7c88939ea0968c7f746d6865636261605c5f626f7b8895a29d9084776a5d5144372a1e07010000000000000815212e3a47535f6a76828f98a29f92857b716c66666566656c707a839099a3989083766b6054483a2f24190d010000000000000000000000050e17212a343d474f59616c727f868686868686867c6f6256493c2f231609000916232f3c4956626f7c868686868686867e716c61594f463c332a21170e05000000000000000000000000000000000004090c0e0f131313131313131313131313131313131313131313131313131313131313131313100f0d0905000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1acaa9d9083797979797979797979797979797979797979797979818e9ba7aea2988b7f7265594f4332281e130800000000000000000000000714202d3a46525e696e71737476787a7c796d6053493f46464544423f3b3a39424e5863707d8998a2aea8998c7f7266594c3f2d22170b00000916222f3c4955626f7c8895a2afa4978b7e7164584b3e373a3b3f4143454646464543413e3b3936302b272018130c040000000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000004111d2a3744505d6a7783909d9d9083766a5d5043372a1d1004000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a000e1b2734414e5a6774818d9898989898989898989898989898989898989898989898989898989898989ea1a9b3a89b8e8175685b4f4235281c0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e3636363636363636363636363636363636363636362e2d2a251e170e0500000000000000000000000000030f1b27333f4953606d7984919ea4998d8074675d514547535f6a75828f9ca79e9184786d6053463d3320190e00000000000000000b17222d38424a50585f666d727c838c9299a0a79e9184786b5e5145382b1e120500000000000000000000000a1723303d4a5663707d8996a3aea3998a7d71707d8996a3aea3998a7d7164707d8996a3aea3998a7d7164544a3f33281c0f03000815212e3a47535f6a75828f97a29c918c807a7572706e6d6d666c6c6f7b8895a29d9084776a5d5144372a1e1104000000000003101c28343f4a54626f7c88949fa0958a7e7169605b5458535b60686e7b86929f9f95897d7063564c4135291d110400000000000000000000040d172029333c464f59616b717e88939393939791847a6d6154473a2e211407000714212e3a4754616d7a84919793939392877e706b60584e453c332920160d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a25303b4653606c7884919eabaca095897c6f6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a86929facac9f92867a6d6054473d3221160c01000000000000000000000005111e2a36424d575e616466686a686d6f6d675d515152535352514e4c4847423c4653606c7885929faba89b8f82756853493f33271b0f03000916222f3c4955626f7c8895a2afa4978b7e7164584b3e4246484c4e505252535252504e4b4746413b373229241d160d0500000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000004111e2a3744515d6a7784909d9d9083776a5d5044372a1d1104000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f000e1b2734414e5a6774818d9aa5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5abadb3aca89b8e8275685b4f4235281c0f00000000000000020507080c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0b0906010000000000000000000000000000000000000000000000020d1720293036393b4343434343434343434343434343434343434343433b3936302920170d02000000000000000000000000000b17222d3844515c66727f8c97a29f92857a6d60544a4c56626e7b87939fa1978b7e72665c5044382b1f1207000000000000000006111c262f383f444e545c606a6f788087909593939184786b5e5145382b1e120500000000000000000000000815222f3b4855626e7b8895a99f9f9b8e81746e7b8895a99f9f9b8e8174666e7b8895a99f9f9b8e8174665b5044382b1f12060006121f2b37434e58616e7b8592979f9c928d86827f7d7b7a79797978787c8895a29d9084776a5d5144372a1e1104000000000006121f2b3844505c6674818d9aa69d9083786c6057504a4c4950565f6974818d9aa79b8e8175685d5245392c201306000000000000000000030d161f29323b454e58606b707d87929aa4a29791857b6e685e5246392d201307000713202d3946525e686e7b859197a2a39992867d706a60574e453b32281f160c030000000000000000000000000000060a0e1011131313131313130b0a08080b0d0e131313131313130e0d0b07030000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66727f8c99a3aea79a8d8174675c606060606060606060606060605765717e8b98a2aea79b8e8174685d5245392c201304000000000000000000000000020e1a25303b454d525457595b565d6062605d555c5e5f5f5f5f5d5b5955534d4644505b6576838f9ca9aa9e918477655b5044372b1f1205000916222f3c4955626f7c8895a2afa4978b7e7164584b464d5355585b5d5e5f605f5e5d5b5854524d47433d352f281f170f05000000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000004111e2b3744515e6a7784919d9d9084776a5d5144372a1e1104000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e12000e1b2734414e5a6774818d9a9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9b8e8275685b4f4235281c0f000000000003090e12141519191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191816120d070000000000000000000000000000000000000000000008141e29323b4146474f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4746413b32291e14080000000000000000000000000006111b2834404a54606d7a85929fa2988b7f72665b50525e6874818d9aa49e9285796d60544a3f34281c10030000000000000000000a141d262d333c424a50585f666d737c838686868684786b5e5145382b1e120500000000000000000000000714202d3a4753606d7a8697939393939285796d7a8697939393939285796c6d7a8697939393939285796c605346392d20130600030f1b26313c46535e696f7c858f949c9f98928f8c898887868685858584919eaa9d9084776a5d5144372a1e110400000000000713202d3a4653606d7885929fa9988b7f72655b50443f3f3f444d57626f7c8897a19f92867a6d6054473a2d2114070000000000000000030c151f28313b444d575f6a6f7d869299a3a29892857c6f695f564c4135291d11050005111d2935414c565f696f7c859298a2a39892867c6f6a5f574d443a31281e150c020000000000000000000000040b11161a1d1e2020202020202018171514171a1b202020202020201a1a17130e08010000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a86929facab9f9285796d60535353535353535353535353535f697683909caaaca095897c6f63564c4135291d11040000000000000000000000000009141f29333b4246474a4c4e4c52545c606366696b6c6c6c6b6a6865625f5753504a536773808d9aa6ac9f9286796c605346392d201306000916222f3c4955626f7c8895a2afa4978b7e7164585053575f6165686a6b6c6c6c6b6a6864615e56544e45403a312921170f050000000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000005111e2b3844515e6b7784919e9d9184776a5e5144372b1e1104000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d2013000e1b2734414e5a6774808d9393939393939393939393939393939393939393939393939393939393939393939393938e8275685b4f4235281c0f00000000060d141a1e2122262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262525221e1811090100000000000000000000000000000000000000010d1925303b444c52545c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c54524c443b3025190d01000000000000000000000000000c18232e3945515d6773808d98a39e9184786c605354616d7a86929fa2988c7f73675c5142382e23170b00000000000000000000020b141c222830383f444e545c606a6f77797979797872685c5043372a1d1104000000000000000000000006131f2c3945515d677885868686868686867c6f7885868686868686867c6f677885868686868686867c6f6256493c2f23160900000a15202a36424d57606a6f7b828a8f9299999b9896959499929292919196a1aa9d9084776a5d5144372a1e110400000000000915222f3c4855626f7c8897a2a197887b6e6153493f332d333b4653606c7985929ea399897d706356493d3023160a00000000000000020b151e27313a434c565f696f7c859298a2a39992867d6f6a5f574d443a3025190d0100010d1925303a444d575f6a6f7d869299a3a29892857c6e695e564c433a30271e140a00000000000000000000050d151c2227292a2d2d2d2d2d2d2d2524211f2426272d2d2d2d2d2d2d2726231f19120b0200000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e6875828e9ba8ada2978a7e7164574d42464646464646463f4a54626e7b88949fabaa9d9084776b6054443a2f24190d0100000000000000000000000000020d17202930363a3b404850565d60666d70737677787979787775726e6964605c545966727f8c99a5aea399877a6d6154473a2e211407000916222f3c4955626f7c8895a2afa4978b7e7164545c6064696e72747678797979787674716e68626058514b433b332921170d0300000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000005121e2b3845515e6b7884919e9e9184776b5e5144382b1e1105000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000013202d394653606c798686868686868686909494908686868686868686796c605346392d2013000e1b2734414e5a67748086868686868686868686868686868686868686868686868686868686868686868686868686868175685b4f4235281c0f000000060f181f262a2d2e3232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232312e29231b13090000000000000000000000000000000000000005111e2a36414c565e61696969696969696969696969696969696969696969615e564c41362a1e11050000000000000000000000000007121c2935414b55616e7a86929fa0968a7d7064585c66737f8c98a29f92857a6d60554b4030261c11060000000000000000000000020a11171e262e343c424a51585f626a6c6c6c6c6b6860564b3f33271b0f02000000000000000000000004101d2935404b55687378797979797979796f6a7378797979797979796f6a687378797979797979796f6a6054483b2e2215090000030e1a25313b454e5860696e767d8286898c8e8f90909191919292929399a4aa9d9084776a5d5144372a1e110400000000000b1825323e4b5865717e8b98a99e928578695f5341382d222b3744505b6575828f9cab998c7f7266594c3f3326190c000000000000000a141d263039434c565e686e7b859197a2a49a92877d706b60584e453b32281e130800000008131e28323b454e58606b707d879299a4a19791847b6e685e554b433930261c11060000000000000000040d171f272e3336373939393939393931302d2b303334393939393939393433302b241d140b010000000000000000000000000000000000000000000000000000000000000000000000000006111c2a36414c5663707d8996a0aca99c8f8276695e5246382d393939393844505c6673808d99a6aea2988b7f7265594f4332281e1308000000000000000000000000000000050e171f252a38404a525a61686d73797d8082848586868584817f7b77716d66605865717e8b98a4b4ab94887b6e6155483b2e221508000916222f3c4955626f7c8895a2afa4978b7e716460666d71777b7f8183858586858583817e7b756f6a605d554d453b33291f150b01000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000005121f2b3845525e6b7885919e9e9184786b5e5145382b1e1205000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000013202d394653606c7986939393939393939c9f9f9c9393939393939386796c605346392d2013000d1a26333f4c58646e747979797979797979797979797979797979797979797979797979797979797979797979797979756f65594d4034271b0e0000030d18212931363a3b3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3e3a342d251b11070000000000000000000000000000000000000714202d3946525e686e7676767676767676767676767676767676767676766e685e5246392d20140700000000000000000000000000000d18242f3a46525e6874818e99a49c9083766a60606d7984919ea3998d8073685d5243392f1e140a0000000000000000000000000000060c141c2328303940444e54555d606060605e5c564e443a2f23170b000000000000000000000000000c18242f39435761686b6c6c6c6c6c6c6c6260686b6c6c6c6c6c6c6c626061686b6c6c6c6c6c6c6c6260584e43382c1f130700000009141f29333c464e575f626c70757a7d7f8182838484848585858687939faa9d9084776a5d5144372a1e110400000000000e1b2734414e5a6774808d9aa79d9083766a574d422f261b27333f49536774808d9aa79b8f8275685c4f4235291c0f00000000000006111b262f38424b555d686e7a849197a1a49f93887e716b61594f463c332a20160c02000000020c16202a333c464f59616b717e87939fa3a19691847a6d675d554b42382e2317130a000000000000000b151f2931393f4244464646464646463e3d39363c3f4146464646464646413f3c362f261d120800000000000000000000000000000000000000000000000000000000000000000000000000000d1925303b4854606b7784919daaac9f93877b6e6153493f33272d2d2d3a4653606d7984919eabac9f92867a6d6054473d3221160c01000000000000000000000000000000020c16202c36404a525c646c717a8085898d8f9192929292908e8c88837e786f6a6264717d8a97a4aea195887b6e6255483b2f221508000916222f3c4955626f7c8895a2afa4978b7e71646a6f787e83888b8e909192939291908e8b86827c746d675e574d453b31271d1207000000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000005121f2c3845525f6b7885929e9e9185786b5e5245382b1f1205000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000013202d394653606c798689898989898989909595908989898989898986796c605346392d2013000b1724303c47525c64676c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c68655d53483d3125180c000009141f29333b4246484c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4a463f372d23180d0100000000000000000000000000000000000814212e3b4754616e7a8282828282828282828282828282828282828282827a6e6154473b2e211408000000000000000000000000000007131d2a36414c56626e7b87939f9f94887c6f6264717e8b97a19f92867b6e61564c4131271d0c02000000000000000000000000000000020a11171e272e343c434749515353535351504b443c32281d12070000000000000000000000000007121d2731454f575d5f6060606060606056545d5f606060606060605654575d5f6060606060606056544e463d32271b0f030000020e1a25313b454d5354575a6164686d7072747576777778787878797c8895a29d9084776a5d5144372a1e110400000000000f1c2936424f5c6975828f9ca89b8e8175685b4e42312817222d3f4c5865727f8b98a59d9083766a5d5043372a1d100000000000091217222d38414a545d676d7a839096a0a49c928b7f726c61594f473d342a21180e040000000000040e18212a343d464f59616c727f8b919ca4a0969083796d675c544a3f3428251c1209000000000006111c27313b434a4f51535353535353534b494541474c4e535353535353534d4c4740382f24190e030000000000000000000000000000000000000000000000000000000000000000000000000008141e2c38444f5965727f8c98a3aea4998c7f73655b5044372b1f2a36414c5663707d8a97a1ada79b8e8174685d5245392c2013040000000000000000000000000000000008131e28323e48525c646e737e858d9297999c9e9f9f9f9e9d9b9895908b847c726d64717d8a97a4aea295887b6f6255483c2f221509000916222f3c4955626f7c8895a2afa4978b7e716c717c838b9095989b9d9e9f9f9f9e9d9b99928f8781796e695e574d43392f23180c030000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000006121f2c3945525f6c7885929f9e9285786b5f5245382c1f1205000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1723303d4a5663707d7d7d7d7d7d7d7d839090837d7d7d7d7d7d7d7d7063564a3d3023170a0008141f2b36414a52585a60606060606060606060606060606060606060606060606060606060606060606060606060605b59534b41372c20140800020e1a26313b454d535559595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959585651493f34291e120600000000000000000000000000000000000815212e3b4854616e7b878f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f877b6e6154483b2e2115080000000000000000000000000000010e1925303b47535f6975828f9ba69b8e8175686b7783909da49a8e8174695e52443a301f150b000000000000000000000000000000000000060c151c232832373b3c444646464645433f3a322a20160c0100000000000000000000000000010b151f333d454c505253535353535353494850525353535353535349484c5052535353535353534948433d342b21160a00000005121e2a36424d575e6163646566676663666869696a6b6b6b6b6c6f7b8895a29d9084776a5d5144372a1e11040000000000101d2a3643505d697682909ca79a8d8174675a4e4134271b25313e4b5864717e8b97a49d9184776a5e5144372b1e110000000008121b2427333f49535c666d79829095a0a59d928c7f736d625a50473e352b22180f0600000000000000060f18222b343d47505a626d727f8c929da59f958f82796d665c504440372e241b1208000000000a16222e39434d555b5d606060606060605856504a52585a606060606060605a58524a40362b1f13070000000000000000000000000000000000000000000000000000000000000000000000000002101c27333d4754616d7a86929facab9e9184786c6053463a2f242d3946525e6875828f9ba9aca095897c6f63564c4135291d1104000000000000000000000000000000010d1925303a44505a646e73808a92979ea1a9a9a8a19e9c9b9a9b9d9f9d9591877f736e717d8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa4978b7e71717e8790959da09e9c9b9a9b9c9ea1a9aba39f9a938e847b6e695e554b4034292015090000000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000006131f2c3946525f6c7985929f9f9285786c5f5245392c1f1200000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000916222f3c4854606b70707070707070768390908376707070707070706b6054483c2f22160900030e1a242f3841474c4e53535353535353535353535353535353535353535353535353535353535353535353535353534f4d4841392f251a0f040005121e2a36424d575f616565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565625b51463a2e22160900000000000000000000000000000000000815212e3b4854616e7b87949c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c94877b6e6154483b2e21150800000000000000000000000000000008141e2b37424d57626f7c89949f9f92867b6e707d8995a09f93877c6f62574d4232281e0d0300000000000000000000000000000000000000030b121820262b2e2f37393939393837332f2820180f05000000000000000000000000000000030d212b333b404445464646464646463c3b4445464646464646463c3b404445464646464646463c3b38322b22190f040000000714212d3a46535e696e7071727374736d63545c5d5d5e5e5e5f626f7b8895a29d9084776a5d5144372a1e11040000000000111e2a3744515d6a7783909da69a8d8073675a4d4034271a24313e4a5764717d8a97a49e9185786b5e5245382b1f12000000060f1a242d363f44505b656d78828f949fa69e938d80746d635b51483e352c23191006000000000000000000061019222c353e48515b636d73808d939da59f948f81786d605c52493f362d241a0f060000000e1a27333f4a555f676a6c6c6c6c6c6c6c64625a525c64676c6c6c6c6c6c6c67645c52473c3023170b00000000000000000000000000000000000000000000000000000000000000000000000000000b16202d3946525d6875818e9ba7aca096897c7063554b4135292e3a4754616d7a86929facaa9d9084776b6054443a2f24190d0100000000000000000000000000000005111d2935414c56616c73808d929fa2a9aaa29f9996918f8e8d8e9092999d99928c8073717d8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa4978a7e717e8892999e9896918f8e8d8e8f92979b9fa4aca49f9691847b6e675c51453c31261a0e0200000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000613202c3946535f6c7986929f9f9285796c5f52462e23170b00000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000713202c38444f5960636363636363697683909083766963636363636360594f44382c201307000008131d262f363c3f41464646464646464646464646464646464646464646464646464646464646464646464646464642403d372f271e130900000714212d3a46535f696e72727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272726d62564a3e3125180b00000000000000000000000000000000000815212e3b4854616e7b8794a1a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a194877b6e6154483b2e211508000000000000000000000000000000020e1a26313c4754606a7683909ca3998c807375828f9ca69c8f82756a5f53453b3020160c00000000000000000000000000000000000000000000070c151b1f22222a2d2d2d2d2b2a27231d160f0600000000000000000000000000000000000f1921292f343738393939393939392f2e3738393939393939392f2e343738393939393939392f2e2c2721191007000000000815212e3b4854616e7b7d7e7f7f807f73665b50505151515256636f7c8996a29c8f8376695c504336291d10030000000000111e2b3844515e6b7784919ea6998c807366594d4033261a24303d4a5763707d8a96a39f9285796c5f5246392c1f130000030e18212c363f48515b606c77818e949ea69e948e81776c605b52493f362c231a1007000000000000000000000007101a232c363f49515b646e74818e939ea69e938e81746e635b51483f362c21180e030000101d2936424f5b67717779797979797979716c6258646e7479797979797979746e64584c3f33261a0d000000000000000000000000000000000000000000000000000000000000000000000000000005111d2935414c56636f7c8995a0aca89b8e8174675d5145392c37434e5865727f8b99a3aea2988b7f7265594f4332281e1308000000000000000000000000000000000713202d3946525e68717e8a929da4ada79f98928d88848281818183868b91959f928b7f727d8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa4978a7e7c86929a96918c8784828181818285898e939aa1a9a8a0969083796d60574e42372b1f140900000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000006121f2b3844505c667986939f9f9286796c5f4a3f34281c1003000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000004101c27333d474f5456565656565d69768390908376695d5656565656544f473d33271c10040000010b141d242b30333439393939393939393939393939393939393939393939393939393939393939393939393939393534312c251e150c0200000815222e3b4855616e7b7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7265584c3f3225190c00000000000000000000000000000000000815212e3b4854616e7b87949f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e211508000000000000000000000000000000000915202b38434e5863707d8a95a09e9285797b87939f9f94897c6f63584e4333291f0e040000000000000000000000000000000000000000000000040a0f1315161e202020201e1d1b17120c05000000000000000000000000000000000000070f171e24282b2c2d2d2d2d2d2d2d23222b2c2d2d2d2d2d2d2d2322282b2c2d2d2d2d2d2d2d23221f1b160f0700000000000b1724313e4a5764717d8a8b8b8c8d86786c60544c4a494a4e5764717e8b97a49b8e8275685b4f4235281c0f020000000000111e2a3744515d6a7783909da6998d8073665a4d4033271a24313d4a5764707d8a97a39f9285786c5f5245392c1f1200000915202a333e48505a636d73808d939ea69f948f82786d655b504940372d241a11080000000000000000000000000008111a242d374049525c606d78818f949fa59d938d80736d635a50483e332a2015090000111e2a3744515d6a7783868686868686867e71645a677480868686868686868074675a4d4134271a0e0000000000000000000000000000000000000000000000000000000000000000000000000000010d1924303a4854606b7783909daaac9f92857a6d6054473c313b4754606a7783909dabac9f92867a6d6054473d3221160c0100000000000000000000000000000004111d2935414c56616d7a85929ea4aea79f959086807b7875747475767a7e848c939992867c7d8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa3978a7e839098938d847f7b777574747476797c81889297a1a9a89f958d80736a5f53473b30251a0e02000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000713202d3a4653606d79869aa49f938679665c5044382b1f1206000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b16212b353d44484a4a4a4a505d69768390908376695d504a4a4a4a48443d352b21160b00000000020b131a1f2426272d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d282725201a130c030000000a1724303d4a5763707d8a8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c86796c5f5346392c201300000000000000000000000000000000000815212e3b4854616e7b8793939393939393939393939393939393939393877b6e6154483b2e21150800000000000000000000000000000000030f1b27323d4653606c7883909da1978b7e808d9aa49c9083766b6054463c3121170d000000000000000000000000000000000000000000000000000003060809111313131312110f0b07010000000000000000000000000000000000000000060d13181c1e1f2020202020202016151e1f2020202020202016151c1e1f202020202020201615130f0a040000000000000814212e3b4754616e7a8793989998897d70665e56565657585f6975818e9ba7998c7f7266594c3f3326190c000000000000101d2a3643505d697682909ca79a8d8174675a4e4134271b24313e4b5764717e8a97a49e9184786b5e5245382b1f1200020f1a26313c46505a626d727f8c929da5a0959082796d665c53493f372e251b120800000000000000000000000000000008121b242e374044505c666d79828f959fa59c928c7f726c625a50463c31261a0f0200111e2a3744515d6a77849093939393938b7e71645a6774818d93939393938d8074675a4d4134271a0e00000000000000000000000000000000000000000000000000000000000000000000000000000008131e2c38434f5965727f8b98a2aea2988b7e7165574d4237404b55626f7c8895a0aca79b8e8174685d5245392c201304000000000000000000000000000000000713202c3945525d6873808d97a1adaa9f9590837b736e6969686768676d71797f87929890837e8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa89b8e818e9593878079726e6969686768656c6f757d859297a2ada79f92877b6e62574d42362a1e1105000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0a49a86796d6053463a2d201307000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000050f19232b33383c3d3d3d43505d69768390908376695d50433d3d3d3c38332b23190f05000000000001080e14171a1b20202020202020202020202020202020202020202020202020202020202020202020202020201c1b18140f0902000000000a1724303d4a5763707d8a96989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989286796c5f5346392c201300000000000000000000000000000000000815212e3b4854616e7b8686868686868686868686868686868686868686867b6e6154483b2e21150800000000000000000000000000000000000a161f2b3744505b65717e8b96a19e918486929fa0958a7d7064594f43342a200f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002070c0f111213131313131313090911121313131313131309090f1112131313131313130909070300000000000000000714202d3946525e6875828f9aa49d9083786e6865636363656a6e7b86929f9f95887c6f6255483c2f2215090000000000000f1c2935424f5c6875828f9ba79b8e8174685b4e4130251a25323f4b5865727e8b98a59d9083776a5d5144372a1e110006121f2b37434e58616c717f8b919ca4a09690837a6d675d544a41382d251c1309000000000000000000000000000000000009121c2528343f4a545c676d79839095a0a49c918b7e716c61584e43372b1f120600111e2a3744515d6a7784909d9f9f9f978b7e71645a6774818d9a9f9f9f9a8d8074675a4d4134271a0e000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b27323d4754606d7a86929facaa9c908376695f53473845515c6774808d9aa7aca095897c6f63564c4135291d1104000000000000000000000000000000000714212d3a4754606d7a85929fa9aea2989083796e69625f575b5a555d60666d737e8692958f828f9ca8afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afaa9e938e9393877e736d67615e575b5a535b60626b707c85929fa6afa3998e8175695e52463a2d201408000000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0a093867a6d6053473a2d201407000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000005101a232c33393c3d3d3d43505d69768390908376695d50433d3d3d3c39332c231a10050000000000000003080b0d0e13131313131313131313131313131313131313131313131313131313131313131313131313130f0e0c08040000000000000a1724303d4a5763707d8a969f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9286796c5f5346392c201300000000000000000000000000000000000714212d3a46535e697679797979797979797979797979797979797979797976695e53463a2d2114070000000000000000000000000000000000030f1b27333f4953606d7984919ea096919298a29d9184786c6053463d3220180e0000000000000000000000000000000000000000000000000000020507080c1011131311100c0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c56626f7c87939f9f958f827a757270707072757c849198a39a9083766a5f53473a2e2115080000000000000e1b2734414e5a6774818d9aa79c90837669574d42362a1e2733404d5a6673808d99a69c8f8276695c4f4336291c10000814212e3a47535f6a717e87939fa3a19691847a6e685d554b42382f261b130a010000000000000000000000000000000000000a1317232e38424b555d676d7a839196a1a39f92877e716a5f53473a2e21140800111e2a3744515d6a7784909daaaca4978b7e71645a6774818d9aa7aca79a8d8074675a4d4134271a0e000000000000000000000000000000000000000000000000000000000000000000000000000000000a16202c3945515d6774818e9aa7ab9f94887b6e62544a3f4653606d7985929fabaa9d9084776b6054443a3024190d0100000000000000000000000000000004111d2935414c5665727e8b98a2aeab9f92867b6e675e57534d4e4e4b51545c606c717e8a92948f949eaaafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afafa59e9b958c7f736c605c55524d4e4e49505359606a717e8a949fabab9f92877b6e6154473b3025190e020000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0a093877a6d6054473a2d211407000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000b17222c363e44494a4a4a4a505d69768390908376695d504a4a4a4a49443e362c22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a93939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939286796c5f5346392c2013000000000000000000000000000000000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e12050000000000000000000000000000000000000b17222d3844515c66727f8c97a2a09e9fa2a1968b7e71655b5044372b1f120600000000000000000000000000000000000000000000000003090e121415191c1e1f1f1e1c191514120e090300000000000000000000000000000000000105090b0b1313131307060400000105090b0b13131313070604000000000000000000000000000000000000000000000000010d1925303b4754606a73808d939f9e948f86817e7d7c7d7f82879196a09f93887d6f63584e43372b1f12060000000000000b1825323e4b5865717e8b98a99e918578695e52463a2d232b37424d576875828e9ba79a8d8074675a4d4134271a0e000815222f3b4855626e7b869299a4a29891847b6e685e564c433930261d140a01000000000000000000000000000000000000000006111c263039434b555e686e7b849197a2a39992867b6e6255483b2f22150800111e2a3744515d6a7784909daab1a4978b7e71645a6774818d9aa7b3a79a8d8074675a4d4134271a0e0000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c55626f7c88959faba6998d8073665c50444d5764717e8a97a2ada2988b7f7265594f4332281e1308000000000000000000000000000000000713202c3945525d687683909caaaea3998c8073695e554d4742414140454a515a616c74808d979c9ea6b0afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb7afa89d9083786d605a514b464241413f44464f58616c76828f9ca9afa3998c7f7266564c41362a1e11050000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a094877a6d6154473a2e211407000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000004101c28333e48505557575757575d69768390908376695d57575757575550483e33281c10040000000000000000000000000000000000000000000000000000000000000000050a0d0f101313100f0d0a05000000000000000000000000000000000a1724303d4a5763707d8686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c5f5346392c20130000000000000000000000000000000000020e1a25313b454d535f6060606060606060606060606060606060606060605f534d453b31251a0e0200000000000000000000000000000000000006111b2834404a54606d7a85929393939393939184796d6053493f33271b0f030000000000000000000000000000000000000000000002090e141a1e212226292b2c2c2b292521211e1a140e09020000000000000000000000000000060c111517182020201f1413100c070c111517182020201f1413100c07010000000000000000000000000000000000000000000008141e2b38434e58606d78818c92999f98928e8b89898a8b8f92999f98928b7f726b6054463c31261b0f030000000000000915222f3c4855626f7c8897a2a197877b6e6154483d342e303947535f697784919ea7978b7e7164584b3e3125180b000a1723303d4a5663707d8999a3ab9f92857b6f695e564c433a31271e150b02000000000000000000000000000000000000000000000a141e27303a434c565e696e7b85929faba398897d7063564a3d3023170a00111e2a3744515d6a7784909daaa89f978b7e71645a6774818d9aa7a09f9a8d8074675a4d4134271a0e00000000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3a47545f6a7783909da9ab9e9184796d605346525e6976828f9ca9ac9f92867a6d6054473d3221160c02000000000000000000000000000000000714212d3a4754606d7a86929facac9f92867a6d61574d433b37312f35394044505a606d7a85919eaab0b8afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb9ada1968a7d70665c5045403936302d33373d46505a63707d8a97a1adab9d908377685e5246392d2014070000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1a194877a6e6154473b2e211408000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000814202d3944505a616464646464646976839090837669646464646464615a5044392d201408000000000000000000000000000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a0300000000000000000000000000000916232f3c4855616b707979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979746a5e5145382b1f1200000000000000000000000000000000000009141f29333b4246485353535353535353535353535353535353535353534846423b33291f140900000000000000000000000000000000000000000c18232e3945515d67738086868686868686867f72665c5141382d22170b00000000000000000000000000000000000000000000050d141a1f262a2d2e32363839393836322e2d2a251f19140d050000000000000000000000000911181d2124252d2d2d2c201f1c1812181d2124252d2d2d2c201f1c18120b03000000000000000000000000000000000000000000020f1b27323d44505c666d777f868e92999a9b98969696989b9a98928e867f726d62594f44342a20150a000000000000000713202d3a4653606d7985929fa9988b7e7165594f443f3f3f424c56616e7b8896a0a095877b6e6154483b2e211508000a1723303d4a5663707d8996a1a9a2988b7e716b61584e463c332920160d03000000000000000000000000000000000000000000030c161f29323c454e58606b717e87939fa9a196897d7063564a3d3023170a00101d2a3743505d6a7683909d9e9b93938b7e71645a6773808d9aa19393938d8074675a4d4134271a0e000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e2b37434e5865717e8b97a2ada1968a7d7063564c54616e7b87939faca79b8e8174685d5245392c20130400000000000000000000000000000000000a1724313d4a5764707d8a99a3afa99c8f8276685e52453b312b2624292e343e45525d68727f8c98a2aebaafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb7ab9e9184786c60544a3f342e2a2522272b343e4653606c7885919eabac9f93877a6e6154473b2e2114080000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1a194877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1623303c4955616c70707070707070768390908376707070707070706c6155493c3023160a0000000000000000000000000000000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d04000000000000000000000000000714202c38444f5961636c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6a62584d4135291d10000000000000000000000000000000000000030d17212931363a3b4646464646464646464646464646464646464646463b3a36312921170d03000000000000000000000000000000000000000007121c2935414b55636e737979797979797979726d62544a402f261b1106000000000000000000000000000000000000000000080e171f252a31363a3b3f4344464644433f3b3a36312a251f170e070000000000000000000009121b22292e3132393939392d2c29231d22292e3132393939392d2c29231d150d030000000000000000000000000000000000000000000a162028343f4a545c656c737b82868b8e909192929291908d8b86817b726d625b51473d3222180e040000000000000006121f2b3844505c6674808d9aa69c9083766b6157504a4c4c4e545d68737f8c99a89d908377695e53463a2d211407000814212e3b4754616e7a849197a2aa9f92877d706a60584e453b32281f150c0200000000000000000000000000000000000000020b151e28313b444d57606a707d879299a4a29791847a6e6154473b2e21140800101d293643505c6976828f9c938e8686867e7164596673808c9997898686868074675a4d4134271a0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000010f1b26323c4753606d7985929faba99b8e8275685d525966737f8c99a4aca095897c6f63564c4135291d110400000000000000000000000000000000000d1a2733404d5a6673808d99abb5ab988b7f7265564c4133291f1a181c232935414c56606d7a85929fabb8afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb6ac9a8d8073665b5042382e231d1a171b222b3744505b6574818e9ba7afa49a8a7e7164574b3e312418070000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000000000010406070c0b0a09080815222f3b4855626e7b8895a1a194887b6e6155483b2e22150808090a0b0c07070501000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d7d7d7d7d7d7d7d839191837d7d7d7d7d7d7d7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000030d161f272d32353639393635322d271f160d0300000000000000000000000004101c28333e474f5557606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5e5850473c3125190d00000000000000000000000000000000000000050f171f252a2d2e3939393939393939393939393939393939393939392e2d2a251f170f05000000000000000000000000000000000000000000000d18242f3a43525c63666c6c6c6c6c6c6c6c65625b5142392e1d140a00000000000000000000000000000000000000000009111a202930363b4246484c4f515252514f4c4846423b36302920191109000000000000000006111b242d343a3d3e464646463a38342f272d343a3d3e464646463a38342f271f150b010000000000000000000000000000000000000000040b17232e38424a535b60696e757a7e8183848586858483817e7a756e69625b51493f352b211006000000000000000003101c28343f4a54626e7b88949e9f94897d7069605c5458595860666d7a85929fa1978b7f7265574d42362a1e1205000714202d3946525e686f7c859298a3a39992867d6f6a5f574d443a31271e140a000000000000000000000000000000000000000a141d27303a434c565f696f7c869299a3a29892857c6f685e5246392d201407000f1c2935424f5c6875828f9b8e81797979716c625965727f8c989285797979746e64584c3f33261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3945515d6774808d9aa6ac9f92867a6d6154606b7784919eabaa9d9084776b6054443a3024190d010000000000000000000000000000000003101c28343f4a546975828f9ca8afa399887c6f6255493c3022170d0d1219242f3a45525d6875818e9ba8b4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afafa49a897d7063544a3f30261c120e0b0f1b27333f495364717e8b97abb5ac9a8d8073675a4d402e23180c0000101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000000001080d11131419181716151415222f3c4855626f7b8895a2a195887b6e6255483b2f22151415161718181413110d080200000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000013202d394653606c79868a8a8a8a8a8a8a919595918a8a8a8a8a8a8a86796c605346392d2013000000000000000000000000000000000000000000000000000000000a151f2831383e4243464643423e3831281f150a000000000000000000000000000b16212c353e44484a5353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353514d473e352a1f14090000000000000000000000000000000000000000050d141a1e21212d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21211e1a140d05000000000000000000000000000000000000000000000007131d2831404a52585a6060606060606060595751493f30271c0b02000000000000000000000000000000000000000009121b232b333b42464d5355595c5e5f5f5e5c5854534d46423b322b231b1209000000000000010c18222d363f454a4b535353524745403931363f454a4b535353524745403931271d120700000000000000000000000000000000000000000006111c263038414950575f62686d71747778787978787674716d68615f5751493f372d23190f000000000000000000000b17232e3847535f6a75828f97a29e92857b716d66666566676a6f78828f97a29e9285796d6053473b31251a0e020005111e2a36414c565f6a6f7d869299a3a29892857c6e695e564c433930261c1106000000000000000000000000000000000006111c262f39434c565e686e7b859298a2a39992867d6f6a5f564c41362a1e1105000f1b2835424e5b6875818e9b9083766c6c64625a5865727e8b989386796d6c67645c52473c3023170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55626f7b88949faba3998b7e726557636f7c8996a0aca2988b7f7265594f4332281e1308000000000000000000000000000000000006121f2b3844505c667884919eabac9f9286796d6053463a2d2013070008131e2935414c5664717d8a97a8b2afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afac9f93867a6d6053473a2d20140a00000b17222d3c4855626f7b8899a4afa99c8f837669554b4034281c100400101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000000000040c13191d20212524232221201f222f3c4955626f7c8895a2a295887b6f6255483c2f221f20212223242521201d19130c04000000000000000000000203101d2a3643505d69768390908376695d5043362a1d1003020000000000000013202d394653606c798693939393939393939393939393939393939386796c605346392d201300000000000000000000000000000000000000000000000000000005111c27313a434a4e505353504e4a433a31271c110500000000000000000000000005101a232c33383c3d464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464645413c352c23190e0300000000000000000000000000000000000000000003090e1214152020202020202020202020202020202020202020201514120e0903000000000000000000000000000000000000000000000000010c161f2e3840474b4d53535353535353534c4a463f372d1e150b000000000000000000000000000000000000000007111b242d353d454d52575f6165696b6c6c6b6965615e57524d443d352c241b1107000000000005111d29343f485056586060605f53514b43393f485056586060605f53514b43392f23180c000000000000000000000000000000000000000000000a141e262f383f444d53565e6165676a6b6c6c6c6b696764605d56534d453f372d251b11070000000000000000000006111c2b37434e58616e7b85929fa19792857e797573727274777c838f949f9e938b7e71675d514539291f14090000020e1925303b444e58606b707e87929fa3a29791847b6e685d554b42382e23171309000000000000000000000000000000091317222d38424b555d686e7a849197a1a39f92877d706b60584e443b3025190e02000d1a2633404d596673808c99918477695e5856505663707d89969a877b6e615a58524a40362b1f1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3947535f6a7683909ca9ab9d908376695f6774818e9aa8ac9f92867a6d6054473d3221160c0200000000000000000000000000000000000713202d3a4653606d7986929facaa9e918477665c5145382c1f130600010d19242f3a4754616d7a8796a0acafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afaa9e918477675d5145392c20130200000613202d3a4653606d7986939facab9e918478675c5145382c1f130600101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000000040d161e24292c2d3231302f2e2d2c292f3c4956626f7c8995a2a295887b6f6255483c2f292c2d2e2f3031322e2d29241e160e0400000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a05000000000013202d394653606c798686868686868686868686868686868686868686796c605346392d20130000000000000000000000000000000000000000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a0000000000000000000000000008111a21282c2f3039393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393835312a231a11070000000000000000000000000000000000000000000000000205070813131313131313131313131313131313131313131308070502000000000000000000000000000000000000000000000000000000040d1c262e363b3f4046464646464646463f3e3a352d251b0c0300000000000000000000000000000000000000050e19232d363e474f575e61696e72767779797776726e69615e564f473e362c23190e04000000000915212e3a45505a62656c6c6c6c605c554b4045505a62656c6c6c6c605c554b4034291c1004000000000000000000000000000000000000000000020c141d262d333c42474c5254585b5d5e5f5f5f5e5d5a5854524c46423b332d251b13090000000000000000000000000f1a26313c46525e69717e8a939aa197928b8581807f7f80848890959f9f948e81756c62554b403529170d0300000008141e29323c464f59616c717e8b919ca4a19691837a6d675d544a3f3428251b12080000000000000000000000000008121b2528333f4a545c676d7a839096a0a49c918b7e716b61594f463c32291e140800000b1724313e4a5764717d8a9796877b6e6154474754616e7a8797978a7e7164544a4740382f24190e030000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37434e5864717e8a97a1ab9f95887b6e616d7985929faba79b8e8174685d5245392c2013040000000000000000000000000000000000000815212e3b4854616e7b8799a3afa99c8f827669544b4034281c100400000813202d3946525d687784919eaaafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa89c8f827569554b4035291d1104000006131f2c3845515c677884919eabac9f9386796d6053463a2d20130700101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000000010c161f282f35393a3f3e3d3c3b3a38352f3c4956636f7c8996a2a295887c6f6255493c2f34383a3b3c3d3e3f3a3935302820160c0200000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b1610090100000013202d3946535f6c767979797979797979797979797979797979797979766c5f5346392d20130000000000000000000000000000000000000000000000000000010d1a26323e4a545e66696c6c69665e544a3e32261a0d01000000000000000000000000000810161c2023242d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f191108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141c242a2f3233393939393939393932312e29231b130900000000000000000000000000000000000000020c17202b353e48505960696e747b7f8284858584827f7b746e69605950483e352b20160c020000000b1724313d4a56626c71797979796d675c51454a56626c71797979796d675c5145382c1f130600000000000000000000000000000000000000000000020b141b222731373a4146474b4e505152535251504e4b4745413a36312a211b1309010000000000000000000000000a15202a36424d57616c727f8892979f9e97928e8c8b8c8d90959d9f99938d82796d605a5043392f24180500000000020d17202a343d47505a626c737f8c929da5a0959082796d665c504440372d241a1107000000000000000000000007111a242d373f44505b666d79828f95a0a59d928c7f726c62594f463d342a20170d0200000815222f3b4855626e7b8897978b7e7164574d46525e697885929a8e8174665c5044382c261d12080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f1a26313c4653606d7985929eaca7998c7f7366717d8a98a2aca095897c6f63564c4135291d11040000000000000000000000000000000000000916222f3c4955626f7c8895abb5a79b8e8174685b4e412e23180c00000005111d2935414c566875828f9ba8afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa79a8d8174675a4e412f24180d01000004101c2834404b556a7683909da9afa49a887b6e6155483b2e22150800101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000008131e28313a4145474c4b4a49484745404443495663707c8996a3a295897c6f625649434440454748494a4b4b4746413a32281e1308000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a010000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e120000000000000000000000000000000000000000000000000000030f1c2935424e5a66707679797670665a4e4235291c0f030000000000000000000000000000050b1014161720202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201f1d19140e070000000000000000000000000000000000000000000002070a0c0d131313130e0d0b0803000407090a131313131006050300000000000000000000000000000000000000000000000000000000000000000000020a12191f2326272d2d2d2d2d2d2d2d2625221e181109010000000000000000000000000000000000000008131e29323d47505a626b707b81878c8f919292918f8b87817b706b615a50473d32281e13080000000b1825323e4b5865717e86868686796d6053474b5865717e86868686796d6053473a2d20140a0000000000000000000000000000000000000000000000020a11171f262b3035393a3e4144454546454543413e3a3935302a261f180f090100000000000000000000000000030e1a25303b45505a626d727e858d92989a9c9b9998999a9d9b99938f8780786d675c51483e31281d12070000000000050e18222b353e47505a636d74808d939ea69f948f82786d605c52493f362c23191007000000000000000000071019232c363f49525c606c78818f949fa69e938d80746d635a50473e342b22180e050000000713202d3a4653606d7985929b8f8275695f53464d566975828f9c9184796d6053463e31271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa4aa9d9184776a75828e9baaaa9d9084776b6054443a3024190d010000000000000000000000000000000000000a1623303d495663707c8996a3afa69a8d8073675a4d4034271a07000000010d192430414d5a6774808d9aa7afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa6998c807366594d4033261a07000000000c18232e424f5c6975828f9ca8b6ac95887c6f6255493c2f22160900101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013060000000000000000010d19242f3a434c5154585756555453514b504f4e5663707c8996a3a296897c6f63564e4f504b5153545556575854524c443a3024190d01000009131c252c33373939393943505d69768390908376695d50433939393937332c251c130900000f1b27333e49525a5f60606060606060606060606060606060606060605f5a52493e33271b0f000000000000000000000000000000000000000000000000000003101d2a3643505d69768286868276695d5043362a1d1003000000000000000000000000000000000407090a131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131312100d090300000000000000000000000000000000000000000000070e1316191a202020201b1a18140f0b10141617202020201d13120f0b0600000000000000000000000000000000000000000000000000000000000000000000080e1317191a2020202020202020191816120d070000000000000000000000000000000000000000010d1925303a444f59626c717d858e92999c9a98989a9c99928e857d716c61594f443a3024190d0200000a1723303d4a5663707d8993988a7d7063574a4a5663707d8993988a7d7063574a3d31261b0f03000000000000000000000000000000000000000000000000060b151a1e25292d2e32343738393939383634312d2c29241e1a140e060000000000000000000000000000000009141f29333e48515b626c707a80858a8d909192939291908e8b87827c736d665c554b40362d1f160c01000000000000061019232c353f48515b606c78818e949fa69e948e81746e635b51483e352b22190f0600000000000000060f18222b353e48515b636e74808d939ea69f948e81776c605b51483f352c221910060000000006121f2b3844505c6675818e9b93877b6e61574d4b5864717e8b98978a7e7164594f43392f23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55616e7b87939faca095887b6f7985929faca3988b7f7265594f4332281e1308000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0a6998c807366594d4033261a0d00000000081926323f4c5965727f8c98a5afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c00000000071b2835424e5b6875818e9ba8b0a396897d7063564a3d3023170a00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201306000000000000000004111d2935414c555d606564636261605d555d5c5b5a63707d8996a3a396897c70635a5b5c5d555c606162636465615d564c4135291d11050005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b1005000a16212c3740494f535353535353535353535353535353535353535353534f4940372c21160a000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191f2325262d2d2d2d282724201a161c2022232d2d2d2d2a201f1b17110a0200000000000000000000000000000000000000000000000000000000000000000002070a0c0d13131313131313130c0b09060100000000000000000000000000000000000000000005111d2a36414c56606b717e8792979e96918d8c8c8d91969e9792877e716b60564c4135291e130800000815222f3b4855626e7b88959a8d817467584e4855626e7b88959a8d817467584e43372b1f12060000000000000000000000000000000000000000000000000003090e13191d202125282a2b2c2c2c2b2a272521201d19130e09030000000000000000000000000000000000020d17202c363f49515a61686d73797d8083848586858583817e7b756f6a605c544b43392f241b0d04000000000000000007101a232d364044505b666d79828f95a0a69d938d80736d625a50473d342a21180d040000000000040d18212a343d47505a626d73808c929da59f958f82786d655b50493f362d231a1007000000000003101c28343f4a5463707d8995998d8074695e534754606d7a86929d9083766b61554b4034291c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3946535f6976828f9ca9a7998c7f737d8a98a2ac9f92867a6d6054473d3221160c02000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0a5998c7f7266594c3f3326190c000000000b1825323e4b5865717e8b98a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000613202c3945515d676d7271706f6e6d676b6a69686766707d8a96a3a396897d70666768696a6b676d6e6f7071726d685d5246392d201307000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a0005101b252e373e4346464646464646464646464646464646464646464646433e372e251b1005000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000000000000010406070a0d10111213131211100d0a07060400000000030505060606060606000000000000000000000000000000000000040613131313131313131312110e0904000000000000000a131c242a2f3233393939393433302b2521272c2f3039393939372d2b27221b140b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e68707d87929997918a84807f7f81848a92979992877d6f685d52453a3024190d01000714202d3a4753606d7a86979e9184786a5f534753606d7a86979e9184786a5f53473a2e21150800000000000000000000000000000000000000000000000000000002080d111314181b1d1e1f201f1e1d1b181413110d08020000000000000000000000000000000000000000050e1a242d373f4850565e61676d70747678797979787774716e68625f58504a423931271d12090000000000000000000008111b2428333f4a545c676d79839096a0a59c928b7f726c61594f463c332a1f160c01000000010c161f2a333c464f59616c727f8b929ca4a0969083796d665c53493f372e241b1108000000000000000b17232e394653606c7883909d92867b6e615a50515d6774818e99958a7d70675c5145382c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37424d5764717d8a97a1aa9d908377818e9baaa79b8e8174685d5245392c20130400000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1a5988c7f7265594c3f3226190c000000000b1824313e4b5764717e8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa4978b7e7164584b3e3125180b000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000714212d3a4754606d797f7e7d7c7b7a79787776757473727d8a97a3a3968a7d72737475767778797a7b7c7d7e7f7a6d6154473a2e211407000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f000009131c252c33373939393939393939393939393939393939393939393937332c251c130900000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000000000000000001080d111314171a1d1e1f1f201f1e1c1a171413100c07010c0f111213131313131309090703000000000000000000000001070c10132020202020202020201f1d1a150f08000000000007121c252e353b3f404646464641403c362f2b33383c3d46464646433937332d261d140a00000000000000000000000000050a0d0f10131313130b0a0805050a0d0f10131313130b0a08050000000000000000000000000000000000000000000000000000000000000005111e2a36414c56616d7a8592999691857e7774727274787e8591969992857a6d60564c4135291d11040006131f2c3945515d677885929e96887b6f625548515d677885929e96887b6f6255483c3025190d0100000000000000000000000000000000000000000000000000000000010507070b0e111212131212100e0b07070401000000000000000000000000000000000000000000000008121b252d363e444c52555c606467696b6c6c6c6b6a6865615e56544e443f3830271f150b000000000000000000000000091217222d38424b555d676e7a849197a1a49f93887e716b60584e453b31281d130700000007131d28313b454e58606b717e87939fa4a19691847a6d675d544a41382d251c1209000000000000000006121f2b3744505b65717e8a94988f82756c61554c55616e7b8692939184796d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26313c4653606d7984919eaba095887b85929faba095897c6f63564c4135291d110400000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a5988b7f7265584c3f3225190c000000000b1724313e4a5764717d8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa4988b7e7165584b3e3225180b000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000815212e3b4854616e7b878a898887868584838281807f7e808d9aa7a79a8d807e7f808182838485868788898a887b6e6255483b2f22150800121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e120000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a0100000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000000003090e13191d20212427292b2b2c2c2c2b292724201f1c18120e181c1e1f2020202020201615130f0a040000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a2620191209000000020e19242e3740474b4d535353534e4c484138353d44484a535353535046443f382f261b110600000000000000000000030a1016191c1d20202020181714111016191c1d20202020181714110c0600000000000000000000000000000000000000000000000000000000000714202d3946525e6874808d979891847b716c676565656c717b849198978d8073685d5245392c2013070004101d2935404b556a7783909d998c7f7266564c4b556a7783909d998c7f7266564c41362a1d1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b242c323a41464b5153575a5d5e5f605f5e5d5b5854524d47433c342e261e150d030000000000000000000000000006111c262f39434c555e686e7b859298a2a49a92877d706a5f574d433a2f24180d0100010d18242f3a434d575f6a707d869299a4a29791847b6e685e554b42392f261b130a000000000000000000030f1b27333f4953616c7682868686867d7064574a535e69748086868686807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2c3844505c6673808c99a4a79c8f828f97a2aa9d9084776b6054443a3024190d0100000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1a5988c7f7265594c3f3226190c000000000b1825313e4b5864717e8b97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa5988b7e7265584b3f3225180c000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130600000000000000000815212e3b4854616e7b8794969594989291908f8e8d8c8b8d929da9a99d928d8b8c8d8e8f9091929894959695887b6e6255483b2f2215080013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d2013000000010910161b1e202020202020202020202020202020202020202020201e1b161009010000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000000000060e141a1e24292c2d3033363738393939383634302d2c29231d1a24282b2c2d2d2d2d2d2d23221f1b160f07000000000000030d151d23292c3939393939393939393836312b241b1208000007131f2a354049525759606060605b59534a413d474f5456606060605d53504941382d22170b000000000000000000040d151b212628292d2d2d2d2423211d1b212628292d2d2d2d2423211d171008000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a86929f92867c6e69615a59535b60696e7c86929f92867a6d6054473a2d21140700000c18242f424f5c6875828f9b9c908376685e524f5c6875828f9b9c908376685e5246392d20130700000000000000000000000106090b0c13131313130d0c0a070200050a0d0f1013131313130a0907040000000000000000000000000000000000000000000000000000000000000109111a20283035394045474a4d505152535252504e4b4746413b373228231c150c030000000000000000000000000000000a141d27303a434c565f696f7c869299a3a39992867c6f695f554b4035291d11040004111d2935404b555f696f7c869298a3a39892857c6f695e564c433930271d140a01000000000000000000000b17222d3841505a66707679797979706c6155494d57646e7479797979736e63574b3f3225190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87939fac9e948f949ea9a3988b7f7265594f4332281e13080000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0a5998c7f7266594c3f3326190c000000000c1825323f4b5865727e8b98a5afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa5988b7f7265584c3f3225190c000000010e1b2834414e5b6774818e9aa7b0a4978a7d7164574a3e3124170b00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c20130600000000000000000815212e3b4854616e7b8794a1a2aaa29f9e9d9c9b9a99989a9da4aeaea49d9a98999a9b9c9d9e9fa2aaa2a195887b6e6255483b2f2215080013202d394653606c798686868686868686909494908686868686868686796c605346392d20130000000000050a0f1213131313131313131313131313131313131313131313120f0a0500000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000000000070f181f262a2f35393a3d404344454646454443403d3a38342f2a252f3437383939393939392f2e2c272119100700000000010b151f272f343846464646464646464645423d352d24190f04000a16232f3b47525c63666c6c6c6c67645d5346444f5960636c6c6c6c6a605b53493f33271b110600000000000000000d161f262d3235363939393931302d28262d3235363939393931302d28221a12080000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b99998c7f736a5f57504c4950575f6a73808d99988a7e7164574b3e3124180b0000071a2734414d5a6774808d9a9f93867a6d61544d5a6774808d9a9f93867a6d6154473a2e23180c00000000000000000000070d1216181920202020201a1917130e0a1015191c1d2020202020161613100b05000000000000000000000000000000000000000000000000000000000000080e161e25292f34383a3d4143454646464544413e3b3936302b262017110a0300000000000000000000000000000000020b151e28313b444d57606a707d87929aa4a29892857b6e675d5145392c201306000613202c3945515d676e7b859198a2a39992867d6f6a5f574d443a31281e150b02000000000000000000000006111b262f3e48545e66696c6c6c6c64615a504445525c64676c6c6c6c66635b52473b2f23160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c17232e3846535e6975828f9ca8a69e9c9ea6ac9f92867a6d6054473d3222170b020000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0a6998d8073665a4d4033271a0d000000000d192633404c5966737f8c99a6afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa6998c7f7366594c4033261907000000020f1b2835424e5b6875818e9ba8b0a3978a7d7064574a3d3124170a00101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c20130600000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c20130600000000000000000815212e3b4854616e7b8794a1aaa29f9e9d9c9b9a999796999ca4aeaea49c999697999a9b9c9d9e9fa2aaa195887b6e6255483b2f2215080013202d394653606c798693939393939393969696969393939393939386796c605346392d2013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000000030b1218212a31363a4145474a4d505152525352514f4d4a4745403936313a4044454646464646463c3b38322b22190f0400000007121d2731394045535353535353535353524e473f352b201509000c1925323f4b57636e7379797979746f64584e4854606b7079797979766c655b5044382d22170b0000000000000008111f2831383e4243464646463e3d393431383e4243464646463e3d39342c241a100600000000000000000000000000000000000000000000000000000f1c2835424f5b6875818e9b92867a6d61574e453f3f444e58616e7b87969b8e8174685b4e4135281b0e00000c1926323f4c5965727f8c98a4998b7e7164544a5965727f8c98a4998b7e7164544a4034281c100400000000000000010911181e2225262d2d2d2d2d2726231f19141b212628292d2d2d2d2d2322201c160f07000000000000000000000000000000000000000000000000000000000000040c13191d23292c2d31343638393939383735322e2d2a251f1b150c0600000000000000000000000000000000000000030c161f29323c454e58606b717e8893939393979184796d6053473a2d201407000714202d3a4753606d7984919793939392877e706b60584e453b32281f160c03000000000000000000000000000a141d2c36424c545a5c60606060575550483e414a52585a606060605957524940352a1e1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2834404b545c66707d8a96a3b0aaa8aab0a79b8e8174685d544a3f33281d140a0000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afa79a8d8174675a4e4134271b08000000010e1b2734414e5a6774818d9aa7afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa79a8d8174675a4e412e23180c000000030f1c2936424f5c6975828f9ca8afa296897c6f6356493c3023160900101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d7a8693939393939286796c5f5346392c20130000000000000714202d3a4753606d7a8693939393939286796c5f5346392c20130600000000000000000815212e3b4854616e7b87949594989291908f8e8d8c8b8a8c929ca8a89c928c8a8b8c8d8e8f90919298949595887b6e6255483b2f2215080013202d394653606c79868989898989898989898989898989898d929386796c605346392d2013000000000000000105070810101010101010101010101010101010101010101008070501000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000000030c151c2328333b42464c5254575a5c5e5e5f5f5f5e5c5a5753514b46423b454c50525353535353534948433d342b21160a0000000c18232f39434b515f606060606060605f5e5951473d31261a0e000d1a2633404d596673808686868681746a5f534a5663707d8686868683776c6053493f33271b0f030000000000050f1a23313a42494e50535353534b49453e3a42494e50535353534b49453e362c22170c0000000000000000000000000000000000000000000000000000111d2a3744505d6a7783909d908377685e52453c33333c46525e697784919c8f8276695c504336291d1000000b1724313e4a5764717d8a97ab9b8e8275665c515764717d8a97ab9b8e8275665c5144382c1f12060000000000000009131b23292e3132393939393933322f2a241f262d3235363939393939302f2c272119110700000000000000000000000000000000000000000000000000000000000002080d12181c1f2024272a2b2c2d2c2b2a282521201e19140f0a04000000000000000000000000000000000000000000040d17202a333c464f59616c727f868686868686867b6e6154483b2e211508000815212e3b4854616e7b868686868686867e716c61594f463c332920160d040000000000000000000000000000020b1a24313a42494e50535353534a49443e363841474c4e535353534d4b4740372e24190e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303945515c666d78808d99a6a3a0a0a1a4a89c8f82756c665b50443e2f261b110600000000000000000000000000000000000000000815222e3b4855616e7b8894a9b3a89b8f8275685c4f423025190e02000005121e2a36424d576976828f9ca9afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa89b8f827568544a4034281c1004000004101c2934404b556a7683909da9b4aa95887b6f6255483c2f22150900101d2a3643505d69768390908376695d5043362a1d1000000000000000000714202d3a4753606d798686868686868687796c5f5346392c140c0200000000000714202d3a4753606d798686868686868687796c5f5346392c20130600000000000000000815212e3b4854616e7b878a8887868584838281807f7e7d808c99a6a6998c807d7e7f80818283848586878889887b6e6255483b2f221508000a1723303d4a5663707d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d808d9386796c605346392d2013000000000002080d1114141c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1414110d080200000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000000000b151e272e343f454d53565d606366696a6b6c6c6c6b696763605c55534d444f575c5f60606060606056544e463d32271b0f030004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d11000714202d3a4753606d7984919392877b6e62564c54606b75818e98958a7e71655b5044372b1f120600000000000b16212b35424c545a5c6060606057555048424c545a5c60606060575550483e34281d110500000000000000000000000000000000000000000000000000121f2b3845525e6b7885919b8f827568564c41332a2a36424d566976838f9c9184776a5e5144372b1e1100000916232f3c4956626f7c8995ab9f9285796d605356626f7c8995ab9f9285796d6053463a2d20130900000000000007111b252d353a3e3f4646464646403f3b352e2830383e424346464646463d3b38332b23190f050000000000000000000000000000000000000000000000000000000000000001070c101314171a1d1e1f201f1f1d1b181414110e0802000000000000000000000000000000000000000000000000050e18212b343d47505a626d727979797979797976695e53463a2d211407000714212d3a46535e697679797979797979716c625a50473d342a21170e050000000000000000000000000000000008121f2831383e4243464646463d3c39332c2f363c3f4146464646403f3b352e251c1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3943505a606d78828d929c9c97949394979d9e948e81786c60594f41382d22170b00000000000000000000000000000000000000000714202d3a4753606d7a8697a1ada99d9083766a564d41362a1e110500000714202d3a46525e697885919eabafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afaa9d908477665c5144382c1f1206000006131f2c3845515c677884919eabaea298877a6d6154473a2e21140700101d2a3643505d69768390908376695d5043362a1d10000000000000000006131f2c3845515c67767979797979797979756a5e52452e261e140a000000000006131f2c3845515c67767979797979797979756a5e5245382c1f120600000000000000000714212d3a4754606d797e7d7c7b7a7978767574737271727f8c98a5a5988b7f7271727374757678797a7b7c7d7e7a6d6054473a2d211407000916222f3c4854606b707070707070707070707070707070727e8b9386796c605346392d201300000000050d14191e202129292929292929292929292929292929292929292921201e19140d05000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000000007121c273039404451575f61686d7073767778797978777673706d67615e57505761686b6c6c6c6c6c6c6260584e43382c1f13070006131f2c3845515c67767979797979797979756a5e5245382c1f120006131f2c3845515c67707d8a95998e8275685e524f59616e7b86929d9184786c605346392d22170b0000000004101c27333d47545e66696c6c6c6c64615a5047545e66696c6c6c6c64615a5045392d21140800000000000000000000000000000000000000000000000000121f2b3845525e6b7884919b8f827568564c4135292a36414c566976828f9c9184776a5e5144372b1e1100000814212e3b4754616e7a8799a3a297897c70635654616e7a8799a3a297897c706356493d31261a0e0200000000010d18232d373f464a4c53535353534d4b474038303a42494e5053535353534948443d352b21160b000000000000000000000000000000000000000000000000000000000000000000000406070a0e101213131312110e0b08070502000000000000000000000000000000000000000000000000000000060f19222b353e48515b62656c6c6c6c6c6c6c6c5e574d42362a1e12050005121e2a36424d575e6c6c6c6c6c6c6c6c65625a50473e352b22180f050000000000000000000000000000000000000d161f262d3235363939393931302d2822242b3033343939393933322f2a241c130a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55616c75818e949c94908a8786878a90959d938d80746b6153493f33271b0f030000000000000000000000000000000000000006131f2c3945515d677885919eabab9f928578685e5246392d20140600000815212e3b4854616e7b8797a1adafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afac9f9286796d6053463a2d20130900000714202d3a4753606d7a86939facac9f928579685e5246392d20130700101d2a3643505d69768390908376695d5043362a1d10000000000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a6359443f3830261c110600000006111c263038404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d110400000000000000000613202c3945515d676d71706f6e6d676b6a696867666673808c99a6a6998c7f7366666768696a6b676d6e6f70716d685d5245392c201307000713202c38444f5960636363636363636363636363636365727e8b9386796c605346392d2013000000050e171e252a2d2e3636363636363636363636363636363636363636362e2d2a251e170e050000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000000000c18232e39424a515b63696e747a7d808384858586858482807d79746e69605b536873787979797979796f6a6054483b2e221509000714202d3a4753606d798686868686868687796c5f5346392c20130004101c2934404b55616b7683909d92867a6e615447525e6974808d9995897d7063544a3f33281c0f030000000714202c38444f5966707679797979716c61554f5966707679797979716c6155493d3023170a00000000000000000000000000000000000000000000000000111d2a3744505d6a7783909d908377685d52463c33333b46525e687784919c8f8276695c504336291d1000000613202d394653606c7986929fa99a8d8073675753606c7986929fa99a8d807367574d42372b1e12060000000006121e29353f4951575960606060605a57524a4038424c545a5c606060606056544f473d33271c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101a232c363f49515658606060606060605f534d453b31251a0e0200020e1a25313b454d535f60606060606060585650483f352c2319100600000000000000000000000000000000000000040d151c212629292d2d2d2d2423201c171a1f2426272d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c67717e8b939c928c837d7a797a7e838e939d928a7d70655b5044372b1f12050000000000000000000000000000000000000004101d2935404b55697683909ca9ada297877a6e6154473b2d22170b0107111e2a36414d5665717e8b98a9b3afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afaea399887c6f6255493c31261a0d06030615222f3c4855626f7b8899a4afaa9d9084776a564c41362a1e110500101d2a3643505d69768390908376695d5043362a1d100000000000000000000c18232f39434b515f6060606060606060605f5e504a42382e23170b0000000b17232e38424a505e5f60606060606060605f5e5951473d31261a0200000000000000000004111d2935414b555d6064636261605d555d5c5b5a5a6774818d9aa7a79a8d8074675a5a5b5c5d555d6061626364605d564c4135291d11040004101c27333d474f54565656565656565656565656565865727e8b9386796c605346392d20130000020d1720293036393b4343434343434343434343434343434343434343433b3936302920170d0200000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000004101c2834404a545c606d727b81868a8d8f9191929292918f8d8a85807b726c655c6b78858686868686867c6f6256493c2f231609000714202d3a4753606d7a8693939393939286796c5f5346392c201300000c18232f39434f5964717e8a97998b7f7265554b4d56616e7b87929b8e8175665b5044382b1f12060000000916222f3c4854606b7682868686867e71645754606b7682868686867e7164574b3e3124180b000000000000000000000000000000000000000000000000000f1c2835424f5b6875818e9b92867a6d61574d453f3f454e57616e7a87939b8e8174685b4e4135281b0e000005121f2b3744505b657784919eaa9d918477695f535b657784919eaa9d918477695f53473a2d211408000000000916222e3a46515b62656c6c6c6c6c66635c52473e49545e66696c6c6c6c6c6360594f44382c201307000000000000000000000000000000020507080c10121312110f0c080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a242d373f464a4c535353535353534846423b33291f140900000009141f29333b424648535353535353534b4a453f362d231a1107000000000000000000000000000000000000000000030a1016191c1d20202020171614100b0e14171a1b202020201a1916130e070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7984919e938c8076706d6d6e7178818e949d9083786c605346392d20130600000000000000000000000000000000000000000c18242f414d5a6774808d9aa7b3a9978a7d706453493f33271b100d1218252d3946525e6875828f9ca8b5afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb5ab998c7f7266574d42372b1f15120f121c2834404a5465717e8b98abb5a89b8e8175685b4e423025190d0100101d2a3643505d69768390908376695d5043362a1d100000000000000000040c131d2731394045534d545b60666c6c6c6c6c6a5c544a3f34281c10030003101c28343f4a545c6a6c6c6c6c6c66605b544d524e473f352019130c040000000000000000010d18242f3a434b51545857555453514b504f4e4f5b6875828e9ba8a89b8e8175685b4e4e4f504b51535455565854524c443a2f24190d0100000b16212b353d44484a4a4a4a4a4a4a4a4a4a4a4a4b5865727e8b9386796c605346392d2013000008141e29323b4146474f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4746413b32291e140800000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000000030e18212c3844515c666d757f878d9298999c9d9e9f9f9f9e9c9a98928d867f776d666679869293939393887b6e6255483b2f221508000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c2013000007121d27313e4653606d7984919d908376675d5146535e6975828f9b9285796c605346392d201306000006131f2b37434e5863707d8994998f82766c61555863707d8994998f82766c6155493d3023170a000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b99998c7f72695f57504c4c50575f6a73808c9a988a7e7164574b3e3124180b0000030f1b27333f49536976838f9ca9a096887b6e6155536976838f9ca9a096887b6e6155483b2f24190d010000000b1825313e4a57626d727979797979736e63574b424e5a6670767979797979706b6054483b2f2216090000000000000000000000000003090e121415191d1e1f1f1e1c181414110e080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b252d343a3e3f464646464646463b3a36312921170d03000000030d17212931363a3b464646464646463e3d3a342d241b1108000000000000000000000000000000000000000000000000050a0d0f10131313130a0a08040003080b0d0e131313130d0c0a0702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96998e81756e64616061666d78828f9c95897c6f6256493c2f2316090000000000000000000000000000000000000000071825313e4b5864717e8b97a8b2a79a8d8074655b5044372b221c191d242a36414c56616e7b86929facb9afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb6a99c908376695f53473c3127201f1c1f232c3844515c6675818e9ba8b3a9988c7f7265594c3f322619080000101d2a3643505d69768390908376695d5043362a1d1000000000000001070e161e2529323b424651575f666c72797979797975665c5044382b1f12060006121f2b3844505c66757979797979726c665f575146423b3229251e160e07010000000000000007131d28313a4145474b4a4948474540434243505c6976838f9ca9a99c8f8276695c4f43424340454748494a4b4745413a32281e1308000000050f19232b33383c3d3d3d3d3d3d3d3d3d3d3d3f4b5865727e8b9386796c605346392d201300010d1925303b444c52545c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c54524c443b3025190d01000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000000915202c38434f59606d78818c92999fa2aaa9a8aaa29f9e9e9e9fa29f98928c81786d6d798699a39f9f94877a6e6154473b2e211408000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c2013000008121d262c3844505c6674818e9b92867a6d6053474d5765717e8b9897887b6e6255483b2f22150800000815212e3b47535f6a7683909d92867b6e615a535f6a7683909d92867b6e615a5045392d211408000000000000000000000000000000000000000000000000000814212e3b4754616e7a86929f92857b6e69615a59595a61696e7c86929f92867a6d6154473a2e2114070000000b17222d414e5b6874818e9ba7a8988c7f7265555b6874818e9ba7a8988c7f7265554c4135291d11040000000c1926323f4c5965727f86868686868073665a4d43505c69768286868686867d706356493d3023160a000000000000000000000002080e141a1e212226292b2c2c2b292521201e19140d0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b23292e3132393939393939392e2d2a251f170f050000000000050f171f252a2d2e3939393939393932312e29221b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9a93877b6e615c5453545c666f7c8997998c807366594d4033261a0d00000000000000000000000000000000000000000815212e3b4854616e7b8796a0acab9e9184786c6053463e342c2924292f353e46525e6873808c99a3aebbafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb7ab9f94887b6e62574e4339312d2b282b2e343f4953606d7985929fabada297897c6f6356493c302316090000101d2a3643505d69768390908376695d5043362a1d100000000000040c1318202830353e444d525b62696e787f8686868687796d6053463a2d201307000713202d3a4653606d7987868686867f786e69625b524d443e3530282018130c04000000000000010c161f282f35393a3e3d3c3b3a38352f3744515d6a7784909daaaa9d9083776a5d50442e2f35383a3b3c3d3e3a39352f2820160c0100000005101a232c33393c3d3d3d3d3d3d3d3d3d3d3d3f4b5865727e8b9386796c605346392d20130005111e2a36414c565e61696969696969696969696969696969696969696969615e564c41362a1e1105000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000000020e1a26313b4854606b74808d939fa3ababa49f9b979892919192939a989d9f938f82786d7a8794abb4a094877a6d6154473a2e211407000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300030e19242f3840474a5464717e8a9799897c6f6256494854616e7b8796978a7d7164574a3e3124170b00000916222f3c4955626f7c88959b8e8174695f5355626f7c88959b8e8174695f53483e34281d1105000000000000000000000000000000000000000000000000000714202d3946525e6874808d979891837b706c676565676c717b849198978d8073685d5246392d201307000000061a2633404d596673808c99a6a99c8f8276675d596673808c99a6a99c8f8276675d5145392c2013060000000d192633404c5966737f8c9393938d8074675a4d43505d6a7683909393938a7d7064574a3d3124170a00000000000000000000050d14191f262a2d2e32363839393836322e2d2a251e19130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010911181e2225252d2d2d2d2d2d2d21211e1a140d0500000000000000050d141a1e21212d2d2d2d2d2d2d2524211d18110900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004060709090909090909090706030000000000000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9c908377695e5247464a54606a7885919b8e8175685b4e4235281b0f02000000000000000000000000000000000000000714212d3a46535e697784919eaaaca196897d70635a50463e38343035394045515b616e7a85929fabb2baafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afbdb0a69a8d81746a5f554b433c39383338393f44505b65717e8a97a2adab9f9285796d6053463a2d2013070000101d2a3643505d69768390908376695d5043362a1d1000000000070d161d2429323a414650565e616d727b828c929992877e71665c5044382b1f12060006121f2b3844505c66717e879399928c827b726d615e565046413a3229241d160d07000000000000040d161d24292c2d31302f2e2d2c292935404b556b7884919eabaa9e9184776b544a403428292c2d2e2f30312d2c29241e160d04000000000b17222c363e44494a4a4a4a4a4a4a4a4a4a4a4a4b5865727e8b9386796c605346392d2013000714202d3946525e686e7676767676767676767676767676767676767676766e685e5246392d201407000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000006121e2b37424e57636f7c87939fa5afa9a199938f8a878584848586888c90959e948d80747b8794a1ada093877a6d6054473a2d211407000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130007131f2b36404a52585a616e7b879a978a7e7164575055575e69788491998c7f7366594c403326190d0005121e2a36424d576673808d9994887c6f62574d576673808d9994887c6f62574d42362c22170c000000000000000000000000000000000000000000000000000005111e2a36414c56616d7a8592999591847d7774727274777e8591969992857a6d61564c4135291d11050000000b1825323e4b5865717e8b98a4ac9f92867a6d605865717e8b98a4ac9f92867a6d6054473a2d22170b0000010d1a2734404d5a6773808d9a9f9b8e8174685b4e44515e6a7784919d9f978a7e7164574b3e3124180b000000000000000000070e171f252a31363a3b3f4345464544423f3b39363029241e160d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d12161819202020202020201514120e090300000000000000000003090e12141520202020202020181715110c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c10131316161616161616161312100c06000000000000000000000000000000000000000000000000000000000000000004111d2a3744505d6a7783909c8f827569574d423a424e586a7783909c8f8276695c4f4336291c10030000000000000000000000000000000000000005121e2a36424d576673808d99a6b0a89c9083766c6258504745404241464b515a626d75818e989ea0a8b2afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afb5aba39f92877b6e675d554e4846443f44464a5059606c7883909da9b1a89b8e8175665c5044382b1f12060000101d2a3643505d69768390908376695d5043362a1d100000000710191f282f353e444c525a61696e767f8690949a93877e716c61544a3f34281c10030003101c28343f4a54616c717e87939a9490867f766e69615a524c443e352f281f191007000000000000040c13181d202125242221201f1f2c3845515d677985929facab9f928578665c5144382c1f1f202122232521201d19130c040000000004101c28333e485055575757575757575757575757575865727e8b9386796c605346392d2013000814212e3b4754616e7a8282828282828282828282828282828282828282827a6e6154473b2e211408000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000814212e3a47535f6a76828f9aa4afaba1979287827d7a79787778797b7f838a9196928a7e7b8895a1ada093867a6d6053473a2d201407000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000b1723303c47525c64676c6d798693998c7f7266595a61646c6c7683909b8e8174685b4e4135281b0e000714212d3a46535e697884919c8f82766a5f53535e697884919c8f82766a5f53453c31241a10060000000000000000000000000000000000000000000000000000020e1925303b46525e68707d87929996918a84807f7f81848a91979992877d70685e52443a3024190d010000000a1723303d4a5663707d8996a3aea3998a7d71645463707d8996a3aea3998a7d7164544a3f33281c0f0300010e1b2734414e5a6774818d9aa79b8e8275685b4f45515e6b7884919ea5988b7e7265584b3f3225180c0000000000000000081019202930363b4246484c50515252514f4b4746413b352f282018100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c13131313131313080705020000000000000000000000000002050708131313131313130b0b09050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f202323232323232323201f1c17110a0300000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9c908376675d51464446535f697884919b8e8275685b4f4235281c0f0200000000000000000000000000000000000000020e1a25313b4855626e7b88949eacab9f948b7e716a615a53514b4e4c52555d606c727f8b93969196a0acafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afafa39992999083796d6760585553504a5053545c606b727f8b95a0acaca095897d7063544a3f34281c10030000101d2a3643505d69768390908376695d5043362a1d100000040f19222b313a41454f565e616c717b828b92989a93887e716c615a5042382e23170b0000000b17232e3842505a616c717e88939a98928b827b716c615e564f45413a312b22190f0400000000000001070d111314181716151414202d3a4753606d7a8698a2aeaea29886796d6053463a2d201314151617181413110d080100000000000814202d3944505a61646464646464646464646464646465727e8b9386796c605346392d2013000815212e3b4854616e7b878f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000815222f3b4855626e7b88949facaea39992857d75716e686b6b666d6e72767d84909492857d8996a3aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000d1a26333f4c58646e7479797985929a8d8073675a616c71797979828f9b8f8275685c4f4235291c0f000815212e3b4854616e7b8796988c7f7265584e54616e7b8796988c7f7265584e433b33291f140900000000000000000000000000000000000000000000000000000008141e2a36414c56606b717e8792989e96918d8c8c8d91969e9892877e716b60564c4132281e1308000000000815222f3b4855626e7b8895a99f9f9b8e8174665b626e7b8895a99f9f9b8e8174665b5044382b1f120600020e1b2835414e5b6874818e9ba79c8f8276695c4f45525f6b7885929ea5988c7f7265594c3f3226190c0000000000000008111a222b323b41464d5355595c5e5f5f5e5c5854524c45413a322a2219100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d23282c2d30303030303030302d2c28231c150c030000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9b92867a6d605a5351535b616e7b88969a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000914212e3a47535f6975828f9aa4afa69f92867d716c64605c555b565d61676d737e8792989184919eaaafa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afac9f928692958f81796f6a6462605b545b6062666d727d87929fa7b0a69d9184786c605346392e23170b000000101d2a3643505d69768390908376695d5043362a1d1000000a16212b343d434b515961686d757e858f949f9f93887f716c625a50483e30261c110600000006111c26303e48505a626c717f88939f9f948f857e756d686159514b433d342b21160a0000000000000000010406070b0a09080815212e3b4854616e7b8794aab4b3aa94877a6e6154473b2e21140808090a0b07070401000000000000000a1623303c4955616c707070707070707070707070707070727e8b9386796c605346392d2013000815212e3b4854616e7b87949c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c94877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000000d192633404c5966737f8c99a6b0ac9f92877c6f6b64615e56545c6062656c707a8290949083909daaaca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a67748086868689979a8d8174675a64717e8686868f939c8f8276695c504336291d10000a1724313d4a5764707d8a9798887b6e6255525764707d8a9798887b6e6255524d453b30251a0e020000000000000000000000000000000000000000000000000000020d1925303a444f59626c717d868e93999c9a98989a9c99938e857d716c62594f443a3020160c02000000000714202d3a4753606d7a8697939393939285796c60606d7a8697939393939285796c605346392d20130600020f1c2935424f5c6875828f9ba89c908376695d5044505b667985929fa6998c807366594d4033261a0d00000000000006101a232c343d444d52575f6165696b6c6c6b6965615e56524c443c342b22190f0500000000000000000000050a0d0f1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100f0d09040000000000000000000000050a0d0f1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100f0d090400000000000000000b151e272e34383a3c3c3c3c3c3c3c3c3a38342e261e150a0000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b98988d80736d63605c60636d75818e9b97897d7063564a3d3023170a00000000000000000000000000000000000000000006121e2b37424d57626f7c87939fa7aea29892867e76706d67686869686d72798088929992867e8a97a4afa295887c6f6255493c2f221609000916222f3c4955626f7c8895a2afa6998c7f8c93938f837c76716e6c666b666c6e72787f879299a3aea99f948a7e71665b5044382b1c1106000000101d2a3643505d69768390908376695d5043362a1d1000030f1b27323d464e555d606b707a818a92979f9b918b7f726d625a50483e362c1e140a00000000000a141e2c363e48505a626d727f8b919b9e97928a817a706b605d554e463d32271b0f030000000000000000000000000000000915222f3c4855626f7b8895a2aeaea195887b6e6255483b2f2215080000000000000000000000000000000a1724313d4a5764707e7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d808d9386796c605346392d2013000815212e3b4854616e7b8794a1a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a194877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d1003000000000000000005111e2a36424d576976838f9ca9b1a79a8d80736a605954524c4a5053555a61676d798290959095a0abaca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d939393a19a8e8174675b64717d8a93939b9e9d9083766a5d5043372a1d10000c1926333f4c5966727f8c999285796a63615e5766727f8c999285796a63615e574d42362a1e110500000000000000000000000000000000000000000000000000000008131e29323d47505a626b707b81878c8f919292918f8c87817b706b625a50473d32281e0e04000000000006131f2c3945515d677885868686868686867c6f625d677885868686868686867c6f6256493c2f2316090003101c2936434f5c6976828f9ca99d9084776a5d514653606c798698a3a69a8d8073675a4d4034271a0d0100000000020c18222c353e474f565e61696e72767879787775726e68605d564e463d342b21170b0200000000000000030a1016191c1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1c1b1915100a0200000000000000030a1016191c1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1c1b1915100a02000000000007121d273039404546494949494949494946443f3830261c110600000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a86929f93887f756f6d666d7076808c939e9185796d6053463a2d201307000000000000000000000000000000000000000000020e1a26313c4754606a74818d95a0a9aaa298928a827d7977757575777a7f848d939a948c7f7c8895a2afa295897c6f6256493c2f231609000916232f3c4956626f7c8995a2afa296897d818e96959087827e7b79787778797b7f848c9299a3abaaa2978f82776c60544a3f33281c0a00000000101d2a3643505d69768390908376695d5043362a1d100007131f2c38434e5860676d747d858e939fa29b918b7f726d625a50483f362d241a0c020000000000020c1a242d363f48505a626d727f8b919ba29f938e857d746d6760584e43382c1f13070000000000000000000000000000000a1623303d495663707c8996a3acaca296897c6f6356493c3023160900000000000000000000000000000013202d394653606c79868a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8d929386796c605346392d2013000815212e3b4854616e7b87949f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f94877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000714202d3a46525e697885929fabaca095877b6e61584f4746413f44464850555d676e7b85929da0a7b1aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9a9fa0a79b8e8174685b64717d8a979fa8aa9d9084776a5d5144372a1e11000e1a2734414d5a6774808d9a91847770706e695e6774808d9a91847770706e695e52463a2d201407000000000000000000000000000000000000000000000000000000020d17202b353f48505961696e747b7f8284858584827f7b746e69615950483f352b20160c00000000000004101d2935404b55687378797979797979796f6a6055687378797979797979796f6a6054483b2e2215090003101d2a3643505d697683909ca99e9184776b5e514754606d7a8793aaa79a8d8174675a4e4134271b0e01000000000a141e2a343e474f5960686e747b7f8384858584827e7a736d685f584f473d33291d140a000000000000040d151c2126292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292825211b140c040000000000040d151c2126292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292825211b140c04000000000c18232e39424b5153565656565656565653504a42382e23170c00000000000000000000000000000000000000000000000000000000000713202d3946525e6873808c959a938b817c7978797d828c929c948b7e71665c5145382c1f13060000000000000000000000000000000000000000000009151f2b37434e58606d79839197a0a8aaa29f948f8a868382818284878b91969f958f82787b8894a1aea296897c6f6356493c3023160900091623303c4956636f7c8996a2aea295887c7a84919899938f8b888685848486888c91969fa3aba9a29892857b6e655b5042382d22170b00000000101d2a3643505d69768390908376695d5043362a1d10000915222e3b4854606a6f79818a91979ea39c918c7f726d625b51483f362d241b12080000000000000008121b242d363f48515b626d727f8c919ca39e97918a81796f6a6054483b2e2215090000000000000000000000000000000b1724313e4a5764717d8a979f9f9f9f978a7d7064574a3d3124170a00000000000000000000000000000013202d394653606c798693939393939393939393939393939393939386796c605346392d2013000815212e3b4854616e7b8793939393939393939393939393939393939393877b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000814212e3b4754616e7b8798a2aeaa9d908377695e53463d393634383a3e434c555e69717e8b97a1adb9aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9aa7b3a79b8e8174685b64717d8a97a4b0aa9d9084776a5d5144372a1e11000f1b2835424e5b6875818e9b91847d7d7d7b6e616875818e9b91847d7d7d7b6e6154473b2e21140800000000000000000000000000000000000000000000000000000000050e19232d363f474f575e61696e72767779797776726e69615e574f473f362d23190e05000000000000000c18242f39435761686b6c6c6c6c6c6c6c6260585761686b6c6c6c6c6c6c6c6260584e43382c1f13070004111e2a3744515d6a7784909daa9e9285786b5f4a4754616e7a8794a1a89b8e8175685b4e4235281b0f0200000006111c26303c464f59616b6f7a81878c8f919292918f8b86807a6f6a60594f453b2f261b110600000000030d161f262d323536363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363635312c261e160c02000000030d161f262d323536363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363635312c261e160c02000004101c2834404b545c606363636363636363605c544a3f34281c10030000000000000000000000000000000000000000000000000000000005111d2935414c56606d798390969f938e89868586898f949c958f82786c60544b4034281c100400000000000000000000000000000000000000000000030f1b27323d45515d676e7b8591969fa4aca69f9c9892908f8e8f90939a9e9f9490837a6d7a8794aab4a396897c706356493d3023160a000a1623303d495663707c8996a3aca194887b6f7d8692989f9c9799929291919298989ea0a8aba69f9792867d70695f53493f2f261c110600000000101d2a3643505d69768390908376695d5043362a1d10000916232f3c4956626f7c848e9393939393918c7f726d625b51493f362d241b120900000000000000000009121b242d363f49515b626d727f8c9193939393938e847c6f6256493c2f2316090000000000000000000000000000000c1825323f4b5865727e8b9393939393938b7e7165584b3e3225180b00000000000000000000000000000013202d394653606c798686868686868686868686868686868686868686796c605346392d2013000815212e3b4854616e7b8686868686868686868686868686868686868686867b6e6154483b2e211508000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d10030000000000000000091623303c4956636f7c8996aab4a79a8e817467574d42342d2a282b2d313a434d57606d7985929eabb8aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9aa7aca79b8e8174685b64717d8a97a4acaa9d9084776a5d5144372a1e11000f1c2936424f5c6975828f9c95918989897e72656975828f9c95918989897e7265584b3f3225180c000000000000000000000000000000000000000000000000000000000007111b242d353e454d52575f6165696b6c6c6b6965615f57524d453d352d241b1107000000000000000007121d2731454f575d5f6060606060606056544e4f575d5f6060606060606056544e463d32271b0f030005111e2b3844515e6b7784919eaa9f928579665b504855616e7b8894a1a89b8f8275685c4f4235291c0f020000000b17232e38424e58616b707d858e92999c9e9f9f9e9c98928d847c6f6b60574d41382d22170b000000000a151f2831383e42434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343413d3830281e140a0000000a151f2831383e42434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343413d3830281e140a000006131f2c3845515c666d6f6f6f6f6f6f6f6f6d665c5044382c1f120600000000000000000000000000000000000000000000000000000000010d1925303a45515d676e7a848f949d9b99929292999c9d938e83796d665b5042392e23180c0000000000000000000000000000000000000000000000000a15202935414b555f696e7b848e939a9fa3aaaaa39f9d9b9b9c9d9f9f99928d827a6d6d798698a29f9f96897d7063564a3d3023170a000a1723303d4a5663707d89969f9fa49a877a6d707d8690959da0a39f9e9e9e9fa3aaa9a8a69f9c948f857d706b60574d41382d1d140a0000000000101d2a3643505d69768390908376695d5043362a1d10000e1b2734414e5a67748186868686868686867f736d635b51493f372d241b1209000000000000000000000009121b242d373f49515b636d737f86868686868686868174675a4e4134271b0e0000000000000000000000000000000d192633404c5966737f86868686868686867f7265594c3f3226190c00000000000000000000000000000013202d3946535f6c767979797979797979797979797979797979797979766c5f5346392d2013000714212d3a46535e697679797979797979797979797979797979797979797976695e53463a2d211407000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f31261e1c1f2028313b45515c6673808d99aab4aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9a9f9f9f9b8e8174685b64717d8a979f9f9f9d9084776a5d5144372a1e1100101c2936434f5c6976828f9ca09d96968b7e72656976828f9ca09d96968b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000009121b232c333b42464d5355595c5e5f5f5e5c5955534d46423b332c231b1209000000000000000000010b151f333d454c505253535353535353494843454c5052535353535353534948433d342b21160a000005121f2b3845525e6b7885919eaba29886796c60534955626f7c8895a2a99c8f8376695c504336291d1003000003101c28343f4a545f6a707d8692979fa3ababacabaaaaa39f9691867d6f695e53493f33271b0f03000005101c26313a42494e50505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504f4e49423a30261b10040005101c26313a42494e50505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504f4e49423a30261b1004000713202d3a4653606d787c7c7c7c7c7c7c7c786d6053463a2d201307000000000000000000000000000000000000000000000000000000000008131e2935404b555e686e7a828a919598999a999795908981796d675d544a3f30271d1207000000000000000000000000000000000000000000000000040d18242f3a434d575f696e7981878e92989a9c9e9f9f9f9e9d9a98928e8680786d6866798592939393938a7d7164574a3e3124170b000b1724313e4a5764717d8a939393939386796d6b707c838b9195989b9d9e9f9f9f9e9d9b9894908a827b706b60594f453b2f261b0b020000000000101d2a3643505d69768390908376695d5043362a1d10000d1a2733404c58646e747979797979797979736d635b51493f372d251b12090000000000000000000000000009121b252d373f49515b636d737979797979797979746e64584c4033271a0d0000000000000000000000000000000c1825323e4b57636d737979797979797979726d63574a3e3125180c000000000000000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c645a4f43372b1e120005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c5e574d42362a1e1205000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1824313e4b5764717e8a97a4b0a4978a7d7164574a3e3124171012161f2834404b54626f7c8998a3aeaca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d93939393938e8174685b64717d8a93939393939084776a5d5144372a1e1100101d293643505c6976838f9ca9aaa3988b7e72656976838f9ca9aaa3988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000009111a212930363b4246484c4f515252514f4c4846423b363029211a11090000000000000000000000030d212b333b404445464646464646463c3b383b404445464646464646463c3b38322b22190f04000005121f2b3744505b657985929facaa93877a6d60544956636f7c8996a2a99d9083766a5d5043372a1d1004000006121f2b3844505c666f7c869298a1a9afb5b7b8b8b7b4aea8a19892857b6e655b5044372b1f140900000a16212d38424c545a5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5a544c42382c211509000a16212d38424c545a5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5a544c42382c211509000815212e3b4854616e7b87898989898989877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000020c18242f39434c565e686d777e84888b8c8d8c8b87837d746d675d554b42382d1e150b000000000000000000000000000000000000000000000000000007131d28313b454d575f676d747c81868a8d8f9192929291908d8a86817b736d665e6a77838686868686867e7165584b3e3225180b000b1825323e4b5865717e868686868686857866606a6e787e84888c8e909192929291908e8b88837d766e6960594f473d33291d140a000000000000101d2a3643505d69768390908376695d5043362a1d10000b1824303c48535c64676c6c6c6c6c6c6c6c66635b51493f372d251b130900000000000000000000000000000009131b252d373f49515b63666c6c6c6c6c6c6c6c67645c53483c3024180b0000000000000000000000000000000a16222f3b46515b63666c6c6c6c6c6c6c6c65635b51463a2e2216090000000000000000000000000000000f1b27333e49525a5f60606060606060606060606060606060606060605f5a52493e33271b0f00020e1a25313b454d535f6060606060606060606060606060606060606060605f534d453b31251a0e02000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825313e4b5864717e8b97a4b0a396897d7063564a3d3023170a060d18232e3a4653606d7986929facaca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a677480868686868686868174685b64717e8686868686868683776a5d5144372a1e1100101d293643505c6976838f9ca9b1a5988b7e72656976838f9ca9b1a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000080f171f252a31363a3b3f4344464644433f3b3a36312a251f170f08000000000000000000000000000f1921292f343738393939393939392f2e2c2f343738393939393939392f2e2c27211910070000000613202d394653606c7986939faca194877a6e61544a5663707d8996a3aa9d9184776a5e5144372b1e070000000713202d3a4653606d78839198a2aab3bbc0c4c5c5c4bfbab2aaa1979083776c6053463b31261a0e02000d1926323e49545e66696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969655e54493d3125190d000d1926323e49545e66696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969655e54493d3125190d000815212e3b4854616e7b87949696969694877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000007121d27313b444c565d656c71777b7e80807f7e7b76706b605c554b43392f261c0c030000000000000000000000000000000000000000000000000000010c161f2a333b454d555d606a6f757a7d8183848586858583817e7a746e69605c54677177797979797979716c62564a3d3124170b000b1724313d4a56626c71797979797979787368585f666d71777b7f8183858586858583817e7b76706b615e574f473d352b21180b02000000000000101d2a3643505d69768386868376695d5043362a1d10000814202b36414a53585a60606060606060605957514940372e251b1309000000000000000000000000000000000109131b252e37404951575960606060606060605a58534a41362b20140800000000000000000000000000000006121e2a3540495157596060606060606060595751493f352a1e12060000000000000000000000000000000a16212c3740494f535353535353535353535353535353535353535353534f4940372c21160a000009141f29333b4246485353535353535353535353535353535353535353534846423b33291f140900000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa296897c6f6356493c302316090007131f2c3845515c667683909da9aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000d1a26333f4c58646e7479797979797979746f6459616c71797979797979797771675b4f4236291d1000101d293643505c6976838f9ca9aca5988b7e72656976838f9ca9aca5988b7e7265584b3f3225180c000000000000000000000000000000000000000000000000000000000000000000050d141a1f262a2d2e32363839393836322e2d2a261f1a140d050000000000000000000000000000070f171e24282b2c2d2d2d2d2d2d2d23221f24282b2c2d2d2d2d2d2d2d23221f1b160f07000000000714202d3a4753606d7a869aa4afa195887b6e62554a5764707d8a97a3ab9e9184786b5e51452f23180c000006121e2b37424e5765717e8b95a0aab4bcc5cbd1d2d2d0cbc4bcb3a99f958a7e7164574d42362a1e1205000f1c2935424e5a667076767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767670655a4e4135281b0f000f1c2935424e5a667076767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767670655a4e4135281b0f000815212e3b4854616e7b8794a1a2a2a094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000010b151f29323b444c535b6064696e71737473716e69636059514b433931281d140a00000000000000000000000000000000000000000000000000000000040d18212a333b434b51585f62686d71747678787979787674716d67615f5750555f676a6c6c6c6c6c6c65625a50453a2e211509000915212e3a45505a62656c6c6c6c6c6c6b686157545c60646a6e72757778787979787675726e69636159534d453d352b23190f06000000000000000f1c2935424e5a66707679797670665a4e4235291c0f00030f1a252f3841484c4e53535353535353534c4b4640372e251c1309010000000000000000000000000000000000010a131c252e3740464b4c53535353535353534e4c4841382f251a0f03000000000000000000000000000000020d19232e3740464b4c53535353535353534c4a463f372d23180d0100000000000000000000000000000005101b252e373e4346464646464646464646464646464646464646464646433e372e251b10050000030d17212931363a3b4646464646464646464646464646464646464646463b3a36312921170d0300000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090004101c2834404b546875828f9ba8aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000b1723303c47525c64676c6c6c6c6c6c6c68645d535a61646c6c6c6c6c6c6c6a675f554a3f33271a0e00101d293643505c6976838f9c9f9f9f988b7e72656976838f9c9f9f9f988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000003090e141a1e212226292b2c2c2b292622211e1a140e090300000000000000000000000000000000060d13181c1e1f20202020202020161513181c1e1f202020202020201615130f0a0400000000000814212e3b4754616e7a8794a1b6a295887c6f62554b5864717e8b97a4ab9f9285786c554b4034291c1004000814212e3a47535f6a7784919ea7b1bcc5cfd7dcdfdedcd6cec5bbb1a79d908377695f53463a2d21140700101d293643505c697683838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838276695c4f4336291c1000101d293643505c697683838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838276695c4f4336291c10000815212e3b4854616e7b8794a1aeada094877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000030d172029323a41495053575f626566676664615e57544f45403931281f160b020000000000000000000000000000000000000000000000000000000000060f182129313a40454e53565d606467696b6c6c6c6b6a6764605d55534d444d555b5e606060606060585650483f34291d11050005111d29343f485056586060606060605f5c574f4a5153585f6265686a6b6c6c6c6b6a6865615f57554f46423b332b2319110700000000000000000d1a26323e4a545e66696c6c69665e544a3e32261a0d000008131d262f363c40414646464646464646403e3b352e251c130a0100000000000000000000000000000000000000010a131c252e353b3e40464646464646464641403c362f261d1308000000000000000000000000000000000007121c252e353b3e4046464646464646463f3e3a352d251c1107000000000000000000000000000000000009131c252c33373939393939393939393939393939393939393939393937332c251c130900000000050f171f252a2d2e3939393939393939393939393939393939393939392e2d2a251f170f050000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000c18232e414e5b6874818e9ba7aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130007131f2b36404a52585a606060606060605b59534b505557606060606060605d5b554d43392e22160a00101d293643505c6976828f93939393938b7e72656976838f93939393938b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000003090e121415191c1e1f1f1e1c191514120e09030000000000000000000000000000000000000002070c0f1112131313131313130909070c0f11121313131313131309090703000000000000000815222e3b4855616e7b8894a1aca396897c7063564b5865727e8b98a5ac9f928679675c5145382c1f1306000815222f3b4855626e7b8896a0acb9c3ced7e1e8ebebe7e0d6cdc2b8aca095887b6e6155483b2e2215080013202d394653606c79868f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f86796c5f5246392c1f130013202d394653606c79868f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f86796c5f5246392c1f13000815212e3b4854616e7b8794a1aeada094877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000050e1720282f383f44464d535558595a595854534d48443d342f271f160d0400000000000000000000000000000000000000000000000000000000000000060f181f282f353c43474c5254575a5c5e5f5f5f5e5d5a5754514b46423b444a4f515353535353534b4a453f362d22180c0100010c18222d363f454a4b53535353535352504c454044464e5355595b5d5e5f5f5f5e5d5b5855534d48443e363129211911070000000000000000000a16222d38434c545a5d60605d5a544c43382d22160a0000010b141d252b303334393939393939393933322f2a231c130a01000000000000000000000000000000000000000000010a131c232a2f323339393939393939393433302b251d140b010000000000000000000000000000000000000a131c232a2f3233393939393939393932312e2a231c130a000000000000000000000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b27211b130a010000000000050d141a1e21212d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d21211e1a140d05000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f2316090000071a2734404d5a6773808d9aa6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300030e19242f3840474c4d535353535353534e4d484145494a53535353535353514f4a433b31271c110600101d293643505c697682868686868686867f7265697682868686868686867e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000020507080c1011131311100c0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b88959f9f9f968a7d7063574c5965727f8c989f9fa399867a6d6053473a2d201407000c1825323f4b5865727e8b98a8b2bdccd5e0e9f3f9f8f2e8dfd4c8bcb1a7988b7e7165584b3e3225180b0013202d394653606c7986939c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9286796c5f5246392c1f130013202d394653606c7986939c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9286796c5f5246392c1f13000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000050e161d262d33373c4247484b4d4d4c4b4846423b383329231d150d04000000000000000000000000000000000000000000000000000000000000000000060d161d242932373a4145474a4e505152535252504e4b4745413a3631393f43444646464646463e3d3a342d241b110600000006111b242d343a3d3e4646464646464544403b34383c4347484c4e505252535252504e4b4846423b38332a251f170f070000000000000000000005111c27313a434a4e505353504e4a433a31271c1105000000020b131a202427272d2d2d2d2d2d2d2d2625231e19120a010000000000000000000000000000000000000000000000010a12191e2325262d2d2d2d2d2d2d2d272724201a130b0200000000000000000000000000000000000000010a12191e2225262d2d2d2d2d2d2d2d2625221e18110a0100000000000000000000000000000000000000010910161b1e202020202020202020202020202020202020202020201e1b161009010000000000000003090e1214152020202020202020202020202020202020202020201514120e090300000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000008121d262f363c3f414646464646464641403c37393c3e4646464646464644423f3931291f150b00000f1c2835414e5a66707679797979797979726d6266707679797979797979726d62564a3d3124180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8993939393938a7e7164574c5966737f8c9393939393877a6d6154473a2e211407000d1a2633404d596673808c99a6b3bfced9e7f2fbfffffaf1e4d9cebfb3a6998c807366594d4033261a0d0013202d394653606c7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9285796c5f5246392c1f130013202d394653606c7986939f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9285796c5f5246392c1f13000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000040b141b22272b31373a3b3e4041403e3b3a36312c272118120b030000000000000000000000000000000000000000000000000000000000000000000000040c131820262b2f35393a3e4143454546464543413e3a39352f2a262e33363739393939393932312e29221b1209000000000009121b22292e31323939393939393837342f282c31373a3b3f4244454546464543423f3b3a36312c28211a140d050000000000000000000000000a151f2831383e4243464643423e3831281f150a000000000001080f14181a1b2020202020202020191916120d07000000000000000000000000000000000000000000000000000000070d1216191920202020202020201b1a18140f080100000000000000000000000000000000000000000000070d121618192020202020202020191816120d070000000000000000000000000000000000000000000000050a0f1213131313131313131313131313131313131313131313120f0a0500000000000000000000000205070813131313131313131313131313131313131313131308070502000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130000010b141d242b303334393939393939393534302b2d3031393939393939393736332e271f170d0400000d1926323e49545e66696c6c6c6c6c6c6c65625b5e66696c6c6c6c6c6c6c65625b51453a2e2215090000000000000000000000000000000000000000000000000000000000000000050a0d0f10131313130b0a080500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d868686868686867e7165584d5a677380868686868686867b6e6155483b2e221508000e1b2734414e5a6774818d9aa7b4c0cddae7f7fffffffff5e7dacdc0b4a79a8d8174675a4e4134271b0e0013202d394653606c79869393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939285796c5f5246392c1f130013202d394653606c79869393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939285796c5f5246392c1f13000815212e3b4854616e7b87939393939393877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f262b2e2f32333433312e2d2a251f1c160c07010000000000000000000000000000000000000000000000000000000000000000000000000001070d151b1e24292c2d31343638393939383734312d2c29241d1a22272a2b2d2d2d2d2d2d2524211d181109000000000000000911181d2124252d2d2d2d2d2d2c2b28241c1f262b2e2f32353738393939383735322e2d2a261f1c170e090300000000000000000000000000030d161f272d32353639393635322d271f160d030000000000000003080b0d0e13131313131313130d0c0a0602000000000000000000000000000000000000000000000000000000000002060a0c0d13131313131313130e0d0b08030000000000000000000000000000000000000000000000000002060a0c0d13131313131313130c0c09060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000000020b12191f2326272d2d2d2d2d2d2d282724202123242d2d2d2d2d2d2d2a2927221c150d050000000915212d38424c545a5c60606060606060585651545a5c60606060606060585651493f34291d1105000000000000000000000000000000000000000000000000000000000000030a1016191c1d20202020181714110c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4855606b7079797979797979716c62564b58646e737979797979797976695f53463a2d211407000d1a2733404d5a6673808d99a6b3c0cfdae6f3fcfffffbf2e9d9ccc0b3a6998d8073665a4d4033271a0d0013202d394653606c79868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c5f5246392c1f130013202d394653606c79868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c5f5246392c1f13000815212e3b4854616e7b86868686868686867a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000000060b0f151a1e2122252627262521211e1a14100b050000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13191d20212427292b2c2c2c2b2a272421201d18130e171b1d1e202020202020181715110c06000000000000000000060c111517182020202020201f1e1c1810151a1f212226282a2b2c2c2c2b2a282522211e1a14100b0500000000000000000000000000000000040d151c2226292a2d2d2a2926221c150d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060712131313131311110e0b0601000000000000000000000000060a0e1011131313131313100f0d0a050000000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130000000001080e13171a1a202020202020201b1a1814141717202020202020201e1d1a16110b040000000005101b26303a42494e50535353535353534b4a45494e50535353535353534b4a453f372d23180c010000000000000000000000000000000000000000000000000000000000040d151b212628292d2d2d2d2423211d17100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202c38444f5960636c6c6c6c6c6c6c65625a5047525c64676c6c6c6c6c6c6c6c5f574d42362a1e1205000c1925323f4c5865727f8b98a9b3bec9d5e1eaf4f9f8f3e9e0d5c9bdb2a8988b7f7265584c3f3225190c0013202d3946535f6c7679797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797974695d5144382b1f120013202d3946535f6c7679797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797974695d5144382b1f12000714202d3a46525e6976797979797979797976685e5246392d20130700000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415181a1a19181514120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d111314171b1d1e1f201f1f1d1b181413110d07010b0e10111313131313130b0b09050100000000000000000000000105090b0b13131313131312110f0c040a0f121415191b1d1f1f201f1f1d1b181514120e090300000000000000000000000000000000000000030a11161a1c1d20201d1c1a16110a030000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0e111112131312110f0c0908060300000000000000000406070b0f1213131211100e0c0b09060100000000000000000000000000000000000000000000000000000406070a0d0f11121313131212100e0c09060603000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c1012131f20202020201e1d1b17120c04000000000000000000040b11161a1d1e2020202020201d1c1916100a03000000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300000000000003070b0d0e131313131313130e0e0c08080a0b1313131313131311100e0a06000000000000000a141e2830383e4143464646464646463f3d3a3e4143464646464646463f3d3a342d241b11060000000000000000000000000000000000000000000000000000000000000d161f262d3235363939393931302d28221a12080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c27333d474f55566060606060606058565048404a52585a606060606060605f534d453b31261a0e0200091623303c4956636f7c8997a1adb9c4cfd9e2e8ebebe7e1d7cec6b9ada196887c6f6255493c2f22160900121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6962584d4135291c1000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6962584d4135291c100005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d11050000000000000000000000000000000000000000000000000000000000000000000000000000000000020608080b0d0e0d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407070b0e101212131312100e0b07060401000000020404060606060606000000000000000000000000000000000000000000060606060606050503000000020608080c0f111212131312100f0c080705020000000000000000000000000000000000000000000000050a0d0f101313100f0d0a05000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415181b1d1e1f201f1f1d1b191515120f0a0401000000070c101313181c1e1f201f1e1d1b181815120d060000000000000000000000000000000000000000000001070c10131416191c1d1f1f20201f1e1d1b191613120f0b060000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f202c2d2d2d2d2d2b2a27231d160e0600000000000000050d151c2227292a2d2d2d2d2d2d292926211c150d040000000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c161e262d3235363939393939393932312e3235363939393939393932312e29231b120900000000000000000000000000000000000000000000000000000000000008111f2831383e4243464646463e3d39342c241a1006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212c353d44484a535353535353534b4a453f3840474b4d535353535353534846423b33291f140900000613202d394653606c7885929ea9b3bdc7d0d8dddfdedcd7cfc6bcb2a89e9184776c605346392d201306000f1b27333e49525a5f60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5d5850463b3025190d000f1b27333e49525a5f60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605f5d5850463b3025190d00020e1a25303b454d525f60606060606060605f524c443a3025190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f141a1e212125282a2b2c2c2c2b2a282622211f1b15110d08030b12181c1f2025292b2c2c2c2b2a272524221d18110901000000000000000000000000000000000000040a0f12181c1f202326282a2b2c2c2c2c2b2a282523201f1c17110f0a0300000000000000000000000000000000000000000000000000000000000000000000030c151c23282c2d3939393939393837332e2820180e040000000000040d171f272e3336373939393939393635322d261f160d0300000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300000000000002070a0c0d131313130e0d0b080303070b0d0e131313130d0c0a06020000000000000000000000040c141b212628292d2d2d2d2d2d2d2524222628292d2d2d2d2d2d2d2524221d181109000000000000000000000000000000000000000000000000000000000000050f1a23313a42494e50535353534b49453e362c22170c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f1a232c33383c3d464646464646463e3d3a342e363b3f40464646464646463b3a36312921170d03000006121f2b3844505b6673808c97a1abb5bdc5ccd2d2d2d1cbc4bcb4aaa0968c7f72655b5044372b1f1205000a16212c3740494f53535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535352514d463e342a1f1408000a16212c3740494f53535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535352514d463e342a1f1408000009141f29333b42464853535353535353535346413a32281e13080000000000000000000000000000000000000000000000000000000000030608091313131313120707050100000000000000000000000000000003060809131313131313131313131313131313131313131313131313130b0a080400000000000000000000000000000306131313131313131308070502000000000000000000000005080a0b13131313130e0d0b0803000000000000000000000306080913131313131313130603000000000000000000000000000004090c0e0f13131313131313130908060300000000000000000000000000000000000000000000000000000000020507081213131313131313100706040000000000000000000000000000000000060c161b1f252a2d2e31343738393939383735322f2e2b26201d19130c151d23282c2d32353839393838363432312e29231b130900000000000000000000000000000000040a0f161b1d23292c2d303335373839393939383635322f2d2b28221c1b150e090300000000000000000000000000000000000000000000000000000000000000000a151e262e34383a45464646464644433f39322a20160c01000000000b151f2931393f424446464646464643423e3831281f150a00000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130000000000070e1316191a202020201b1a18140f0e13171a1a20202020191916120d070000000000000000000000030a1015191c1d20202020202020181815191c1d20202020202020181815110c06000000000000000000000000000000000000000000000000000000000000000b16212b35424c545a5c60606060575550483e34281d11050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a21272c2f303939393939393932312e29242a2f3334393939393939392e2d2a261f170f06000000030f1c28333f4a54606d79859199a3abb3bbc0c4c5c5c4bfbab2aaa2989184796d6053493f33271b0f030005101b252e373e434646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464644413b342c22180d020005101b252e373e434646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464644413b342c22180d020000020d17212930363a3b4646464646464646463936302820160c02000000000000000000000000000000000000000000000000000000040a0f12151520202020201f1413110d08020000000000000000000000040a0f12151520202020202020202020202020202020202020202020202020171714110c0500000000000000000000060c101220202020202020201514120e090200000000000000060c1114171820202020201b1a18140f0801000000000000040a0f131516202020202020202012100c060000000000000000000002090f15191b1c20202020202020201615130f0a0400000000000000000000000000000000000000000000000002090e1114141f202020202020201d1312100c0700000000000000000000000000030a111720272b31363a3b3e4144444546464544423f3c3b37322c29241e191e272e34383a3e42454646454443413f3d3a342d251b11060000000000000000000000000000060b151b21272c2f34383a3d40424445464646454543413f3c3938332d2b26201a150b0600000000000000000000000000000000000000000000000000000000000006111c2630383f4446525353535353514f4b443c32281d120600000006111c27313b434a4f51535353535353504e49423a31261c1005000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000000010a12191f2325262d2d2d2d282724201a1a1f2426272d2d2d2d2625231e19120a01000000000000000000000005090d0f10131313131313130c0b090d0f10131313131313130c0b0905010000000000000000000000000000000000000000000000000000000000000004101c27333d47545e66696c6c6c6c64615a5045392d2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f161c2023232d2d2d2d2d2d2d2524211d191f2326272d2d2d2d2d2d2d22211e1a140d0600000000000b17222d3845515d67707d879299a2aaafb6b7b8b8b7b4aea8a19892867c6f665c5141382d22170b00000009131c252c3337393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393835302a221a100600000009131c252c3337393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393835302a221a100600000000050f171f252a2d2e39393939393939392e2d2a251e160e05000000000000000000000000000000000000000000000000000000060e151b1f21222c2d2d2d2d2c21201d19130c04000000000000000000060e151b1f21222d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2423211c17100800000000000000030a11171c1f2d2d2d2d2d2d2d2d21201e1a140d0500000000000810171d2123242d2d2d2d2d272724201a130b0200000000070f151b1f22222d2d2d2d2d2d2d2d1f1c17110a0300000000000000030c141b202528282d2d2d2d2d2d2d2c22211f1b150e0700000000000000000000000000000000000000000000050d141a1e20212c2d2d2d2d2d2d2d2a201f1c18120b0300000000000000000000030c151c232832373b4246484b4e505152535252504e4c4847433c39352f28222b30394045464b4f5152535251504e4b4a463f372d23180d010000000000000000000000020a111720262b323839404547494c4f50525253535251504e4c4946443f3837312b262017110a02000000000000000000000000000000000000000000000000000000000c17232e38424a50535f60606060605e5c564e44392e23170b0000000a16222e39434d555b5d6060606060605c5a544c42382d21160a000000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130000000a131c242a2f3233393939393433302b25242b3033343939393933322f2a231c130a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202c38444f5966707679797979716c6155493d3023170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1014161720202020202020181715110e1317191a202020202020201514120e090300000000000006111c2935404b55606b717e8792989fa4acabacabaaaaa39f9691867d706a5f544b402f261b1106000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f18100800000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c2b29251f181008000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c0500000000000000000000000000000000000000000000000000000006101820262b2e2f3939393939382e2d29251e160e040000000000000006101820262b2e2f3939393939393939393939393939393939393939393939393931302d28221a12080000000000030c151c23282c39393939393939392e2d2a251f170f0500000008121a22282d303139393939393433302b251d140b00000007101920272b2e2f39393939393939392c28231c150c030000000000020c151e252c31343539393939393939392f2e2b26201810070000000000000000000000000000000000000000050e171f252a2d2e3939393939393939372d2c28231c150c030000000000000000030d151e262e343d43474d5354585b5d5e5f5f5f5e5d5b5955534e4745413a3129343c424b5153585c5e5f5f5f5e5d5a585651493f34291d120600000000000000000000040b141c222832373d43484b515356595b5d5e5f5f5f5f5e5d5b585653504a47433c373127221b140b03000000000000000000000000000000000000000000000000000003101c28343f4a545c606c6c6c6c6c6c6b6760564b3f33271b0e0000010e1a27333f4a555f676a6c6c6c6c6c6c69665e54493e3226190d010000000000000000000000000000000003101d2a3643505d69768390908376695d5043362a1d100300000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000007121c252e353b3f404646464641403c362f2f363c3f4146464646403e3b352e251c0e0500000000000000000000060a0e1011121313131212100e0b07070501000000000000000000000000000000000000020507081313131313131313070705010000000000000000000916222f3c4854606b7682868686867e7164574b3e3124180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a131313131313130b0b090502070b0d0d13131313131313080705020000000000000000000d18242f3a434f59626c717d858e939a9c9e9f9f9d9c98928d847c706b61584e42392e1d140a0000000000010910161b1e2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201f1f1c19140d06000000000000010910161b1e2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201f1f1c19140d06000000000000000002090e12141520202020202020201413110d0802000000000000000000000000000000000000000000000000000000040e18222a31373a3c4646464646453a3935302820160c020000000000040e18222a32373b3c464646464646464646464646464646464646464646464646463e3c39332c241a1005000000000a151e262e343846464646464646463b3a36302921170d020006101a242c34393d3e464646464641403c362f261d0d0300040f19222b32373b3c464646464646464638342e261e150a000000000009141e2730373d414246464646464646463c3b37322a22180d03000000000000000000000000000000000000020b17202930363a3b4546464646464646433a38342e271e150b00000000000000010b151f2730383f444e54575e6164676a6b6c6c6c6b6a6865625f5854524c433f353c464e545c6065686b6c6c6b6b696765625b51463a2e221509000000000000000000040d161d262d333c43474f54555c606366686a6b6c6c6c6c6b69686562605b54534e47423c332d261d150d030000000000000000000000000000000000000000000000000006121f2c3844505c666d7879797979797772675c4f43372a1d11000003101d2936424f5b6771777979797979797670665a4e4235291c0f030000000000000000000000000000000203101d2a3643505d69768390908376695d5043362a1d100302000000000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300020e19242e3740474b4d535353534e4c4841383840474c4d535353534c4b4640372e20170d0200000000000000040b11161a1d1e1f2020201f1e1d1b181413110d0802000000000000000000000000000002090e12141520202020202020201413110d080200000000000006131f2b37434e5863707d8994998f82766c6155493d3023170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313d47505a626b707b81878c8f919292918f8b86807a6f6a61594f463c30271d0b0200000000000000050a0f121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131312100d0802000000000000000000050a0f121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131312100d080200000000000000000000000205070813131313131313130707050100000000000000000000000000000000000000000000000000000000000a15202a343c4347485353535353524746413a32281e130800000000000a15202a343c434748535353535353535353535353535353535353535353535353534a49453e362c22170c00000006111c2630383f4453535353535353534846423b33291f1409000c17222c363e45494b53535353534e4c4841382f1f150b010a15202b343c4347495353535353535353443f3830261c1106000000040f1b25303942484d4f53535353535353534947433c342a1f150b0100000000000000000000000000000000000a141d29333b4246475253535353535353504644403930271c120700000000000007121d273139424a50586062696e71747777787979787775726f6a66605d56504540454e5860666d717578797978777674726d62564a3d3124180b0000000000000000030c161f282f383f444e54596063676d707375777879797978787674726f6c66625f58534d443f382f271f150d030000000000000000000000000000000000000000000000000713202d3a4653606d7886868686868684776b5e5144382b1e11000004111e2a3744515d6a77838686868686868276695c504336291d100300000000000000000000000000050a0f12101d2a3643505d69768390908376695d5043362a1d10120f0a0500000000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130007131f2a354049525759606060605b58534a41404a52585a60606060595751494032291e1408000000000000050e161c2227292a2c2c2d2c2c2b29282521201d19130f0a030000000000000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c0500000000000815212e3b47535f6a7683909d92867b6e615a5045392d211408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2b353f48505961696e757b7f8384858584827e7b736d6860584f473e342a1e150b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c464e53555f606060605f54524c443a3025190c03000000030f1b26323c464e535560606060606060606060606060606060606060606060606060575550483e33281c110400000c17232e38424a505f606060606060605f524d453b30251a0e05111d28343e4850555760606060605a58534a4131271d12070f1b27323c464e5455606060606060605f504a42382e23170c0000000915202c37424b53595b606060606060605f55534e463c31271d12070000000000000000000000000000000006111b262f3b454d52545f606060606060605d53514a42392e23180c0000000000020c18242f39434b545c606a6f757b7e8183848586858583817f7c78726d68625a514b4d57606a6f797e82848586858483817f7265584b3f3225180c00000000000000000b151e283139424a50585f626b6f75797d7f828385858686858483817f7c79746f6a625f575049413931271f150b010000000000000000000000000000000000000000000000091623303c4956636f7c89989393938d8174675a4e4134271b0e000004111e2a3744515d6a778490939393938f8376695c504336291d10030000000000000000000000010910161b1e20202a3643505d69768390908376695d5043362a20201e1b161009010000000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000a16232f3b47525c63666c6c6c6c67645c534547525c64676c6c6c6c66635b51443b3025190e0100000000040e1720272e3336373939393939383634312e2d2a251e1a150e06000000000000000000050f171f252a2d2e39393939393939392e2d2a251e160e05000000000916222f3c4955626f7c88959b8e8174695f53483e34281d110500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d19232d363f474f575f61696e72767879787775726e69615e564e463e352c22190c0300000000000000000005090d0f101313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130f0f0d09040000000000000000000000000205070813131313131311100e0b0600000407090a1313131313130e0d0b0803000000000000000000000001070c0f11121313131313070705010000000000000000000000000105090b0b13131313100f0d09050000000000000000000000000000000000000000000000000006121f2b37434e585f626c6c6c6c6c6b615e564c4135291e150b00000006121f2b37434e585f626c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c64615a5045392d2114080003101c28343f4a545c6c6c6c6c6c6c6c6c6c5e574d42362a1e120814212d3945505a61646c6c6c6c6c67645c5343392f23180c131f2b37434e5860626c6c6c6c6c6c6c6c5c544a3f34281c100300000c1925313d48535d65686c6c6c6c6c6c6c6c625f584e43392f24180e050000000000000000000000000000030c17222d38414d575e616c6c6c6c6c6c6c6c6a605c544a4034281c1004000000000a141e2935404b555d666d747c82878b8e909192929291908e8c88847f7a716d605d55535f696f7c848b8f9192929291908d86796c605346392d20130000000000000007121d273039434b545b606a6f767c8185898c8e90919292929291908e8b8985817c756e69605b534b433931271d12070000000000000000000000000000000000000000000004111d2935414c566673808c99aaa3998a7d7064574a3d3124170a000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d100300000000000000000000010a131b21272b2d2d2d3643505d69768390908376695d5043362d2d2d2b27211b130a0100000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000c1925323f4b57636e7379797979746f64574d4c58646e7479797979736d63564c41362a1d1207000000000b16202932393f434445464646454543413e3a3936302b2620180f0900000000000000020d17212930363a3b4646464646464646463936302820160c02000005121e2a36424d576673808d9994887c6f62574d42362c22170c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007111b242d353e454d53575f6266696b6c6c6a6965615e56524c443d342c231a10070000000000000000020a1015191c1c2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201c1b1915100902000000000000000002080e1114142020202020201e1d1a17110b0b101316162020202020201b1a18140f08010000000000000000050c12181b1e1f20202020201413110d0802000000000000000000060c11151718202020201c1c1915100a0200000000000000000000000000000000000000000000000815212e3a47535f6a6f7979797979786d685e52463d30271c120700000815212e3b47535f6a7679797979797979797979797979797979797979797979797979716c6155493c3023170a0006121f2c3844505c66767979797979797976695e52463a2d20140a1723303d4955616c717979797979746e64554b4034291c1015222e3b4754606a767979797979797976665c5044382c1f120600020e1b2834414d59656f7579797979797979796f6a5f554b40352920170b02000000000000000000000000000b151e27333f49535e696e7879797979797979766d665c5144382c1f120600000006111c26303845515d676d7880898f93999a9d9e9f9f9f9e9d9b9896918c857e756d675d58626e7b8691969b9e9f9f9e9e9c9386796c605346392d2013000000000000040d18232e39434b555d666c737c83898e9298999b9d9e9f9f9f9f9e9c9b9897918d88827b736c655d554b43392f24180e050000000000000000000000000000000000000000000713202c3945525d687683909da99f92867a6d6054473a2d211407000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000009131c252c33373939393943505d69768390908376695d50433939393937332c251c130900000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000d1a2633404d59667380868686868174695f534d5a677480868686867f73685e5246392f23180c00000006111c27323b434a4f51525353535251504e4b4746413a37312a221b120900000000000009141f29333b42464853535353535353535346413a32281e130800000714212d3a46535e697884919c8f82766a5f53453c31241a10060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b232c333b42464d5355595c5e5f5f5e5c5854524d46413a322b221a11080000000000000000040c141b212528292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d292825211b140c03000000000000050d14191e20212d2d2d2d2d2d2a2a27221d16161b2022232d2d2d2d2d2d272724201a130b02000000000000060f171e23282a2b2d2d2d2d2d21201d19130c04000000000000000911181d2124252d2d2d2d292826211b140c04000000000000000000000000000000000000000000000915222f3c4855626f7c8786868686857a6d61594f42392e23180c03000915222f3c4855626f7c868686868686868686868686868686868686868686868686867e7164574a3e3124170b000713202d3a4653606d78868686868686867b6e6154483b2e2115121e2a36424d5764717e86868686868074675c5145382c1f1416222f3c4955626f7c86868686868686786d6053463a2d20130700020f1c2835424f5b68758286868686868686867c6f675d51453e32291d140a00000000000000000000000007121d27303944505b656e7b858686868686868683796d6053463a2d2013070000000b17232e3842505a606d79828d929b9fa4ababa39f9d9c9b9c9d9fa19e97928b82796d685f6a76828f98a1a8aaa39f9995949386796c605346392d20130000000000010c161f2834404b555d676d78808790949b9fa2a9a29e9c9b9a9a9b9d9fa3a9a19e9a948f877f776d675d554b40352920170d0200000000000000000000000000000000000000000714212d3a4754606d7a86939fa99c908376675d5145392c201306000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000005101b252e373e434646464646505d69768390908376695d504646464646433e372e251b1005000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000714202d3a4753606d7984919392877b6e62564c54606d7a85919392867a6e61554b4034291c100400000a16222e39434d555b5d5f5f605f5f5e5c5b5854524c47433c342d241b110800000000020e1a25303b454d525f60606060606060605f524c443a3025190d01000815212e3b4854616e7b8796988c7f7265584e433b33291f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009111a212931363c4247484c50515252514f4b4746423b363028201910080000000000000000020c161e262c3235363939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393635312c261e150c0200000000050e171e252a2d2e3939393939393736332e272021272c2f303939393939393433302b251d140b0100000000050f1821292f3437383939393939392d29241e160e04000000000009121b22292e3132393939393635322d261e160c000000000000000000000000000000000000000000000815212e3a47535f6a73808d9693978e81746b60544a4034281f1409000916232f3c4956626f7c8993939393939393939393939393939393939393939393938a7d7164574a3e3124170b000713202d3a4653606d79869393939393877b6e6154483b2e211514212d3a46535e6976828f9393939285796d6053473b30251a16222f3c4955626f7c88939393939386796d6053463a2d20130700000714212d3a4754606d7a849199939393999183796d605a50443b2f261b110600000000000000000000040d18232e39424e58606c77828f979393939392867b6e665c5144382c1f1206000003101c28343f4a54616c74818e949da4aca7a09d9992908f8f8f9192999a9e9f948f837a6d666f7c88949faaaea398928c88878886796c605346392d2013000000000008131e28313a45515c676d79828d92999fa6a39f9a97928f8e8d8e8e9092989b9fa3a69e99928c82796d675d51453f32291e140800000000000000000000000000000000000000000b1724313e4a5764717d8a99a4a9998c7f7366554b4135291d1104000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000a16212c3740494f5353535353535d69768390908376695d5353535353534f4940372c21160a000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130006131f2c3845515c67707d8a95998e8175685e52515d67717e8a96988d8073675c5145382c1f130600000e1a27333f4a555f676a6c6c6c6c6c6b696764615e56534e463e362d23190b0200000005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d1105000a1724313d4a5764707d8a9798887b6e6255524d453b30251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f171f262a31373a3b3f4345464544423f3b3a36302a251e160e070000000000000000000a141e2830383d414346464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464642413d3730271e1409000000020d1720293036393b46464646464644433f3932292b32383b3d46464646464641403c362f261d1308000000010c17212a333a4044454646464646463935302820160c0200000006111b242d343a3d3e4646464643413e3830281e110700000000000000000000000000000000000000000006121f2b37434e58606d7984919e9f93887d6f665c51443b31261a0d04091623303c4956636f7c89969f9fa8a19e9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c978a7d7164574a3e3124170b000713202d3a4653606d7986939f9f9f94877b6e6154483b2e21151b27333f4953616e7b87939f9fa2978a7e7164574d42362a1e16222f3c4955626f7c88959f9f9f9386796d6053463a2d20130700000613202c3945525d686f7c87929fa69fa0958d81746c61564d41382d22170d030000000000000000010c161f2834404b545f6a727f8b949fa9a89e938b7e71695f544a4034281c1004000006121f2b3844505c66717e8b939ea6aea59d95908a86838282838486898d92979f959083786d73808d99a6b0a89f9286807c7a7b7d7063574a3d3024170a00000000010d19242f3a43505a606d79828f949fa3a7a099928e898583818181828386898e92999fa7a39f948f82796d605b51443b3025190e0200000000000000000000000000000000000006121e2b37424d576774818e9aaba297897c6f6256493c2f24180d01000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000f1b27333e49525a5f60606060606069768390908376696060606060605f5a52493e33271b0f000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130004101c2934404b55616b7683909d92867a6d61544c55606c7884919d9285796d6053473a2d2014070000101d2936434f5b6771777879797978787674716d68625f5850483e352b1d140a0000000714202d3a46525e6976797979797979797976685e5246392d201307000c1926333f4c5966727f8c999285796a63615e574d42362a1e1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d141a20262b2e2f33363839393736322e2d2a251f19130c0500000000000000000005101b26303a42494e4f5353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353534f4d49423930261b1004000008141e29323b414653535353535353514f4a443b32353d4448495353535353534e4c4841382f251a0f03000007121e29333c454b505253535353535346413a32281e13080000010c18222d363f454a4b535353534f4e49423a3023190f050000000000000000000000000000000000000000030f1b26313c45515d67707d8a939e9a9183786d60574d42362a1f160c0a1623303d495663707c899aa4aca196918f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8a7d7164574a3e3124170b000713202d3a4653606d798693a0aca194877b6e6154483b2e21151f2b3744505b65737f8c99a4afa99c8f8276695e52463a2d2016222f3c4955626f7c8895a2aca09386796d6053463a2d201307000004111d2935414c56606a727f8c949ea8a89d928a7d70695e53493f33271f150b010000000000000008131e28313a45515c666f7c86929fa6aba1968e81756c62574d42392e23180c0000000713202d3a4653606d7884919ea5afa69d938e837d797776757677797c80858c9298958e81747683909ca9aca0958a7e736f6e6e706b6155483c2f2316090000000004111d2935414c56616c74818e949ea6a69f959087817c79767474747577797d818790959ea5a69e948e81756d62564c41362a1e14080000000000000000000000000000000000000814212e3a47535f697884919eab9e9285796c605346392d20130700000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c7683909083766c6c6c6c6c6c6c6c645a4f43372b1e12000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300000c18232f39434f5964717e8a97998b7f7265554b505b65727e8b97978a7d7164574a3e2f24180c0000111e2a3744515d6a778385868686858483817e7a756e6a615a50473d2f261b110600000815212e3b4854616e7b86868686868686867a6d6154473a2e211407000e1a2734414d5a6774808d9a91847770706e695e52463a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e151a1e212226292b2c2c2b292521201e19140d0802000000000000000000000915212c38424c545a5c6060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605c5a544c42372c21150900020e1925303b444c525f6060606060605d5b554d44393d474f54566060606060605a58534a41362b20140800000c18232f3a454e575c5e60606060605f524c443a3024190d010005111d29343f48505658606060605c5a544c42352b21160b0000000000000000000000000000000000000000000a15202935404b55616b75818e98a0958c7f72695f53463e31281e130815222f3b4855626e7b87939fa99e91848383838383838383838383838383838383827d706356493d3023160a000713202d3a4653606d798693a0aca194877b6e6154483b2e2115202d394653606c7884919eabb5ac9f93877b6e6154473d32271b222f3c4955626f7c8895a2aca09386796d6053463a2d2013070000010d19242f3a434e58606c77828f96a1aba49e92857b6e655b50443c31271d1207000000000000050e19242f3a434f59606d79839098a3aea39991847a6d605a50453c30271c12070000000b1824313e4b5764717e8a96a0acac9f948e8179716d67696869676d70747a7f869095938a7e7885929fabaa9d9184776c6261616361594f44382c201407000000000613202c3945525d68717e8a939da6a89f948f837c746f6c6668676768666d70757c838f939ea7a69e938b7f72685e52463b3025190d0100000000000000000000000000000000000815222f3b4855626e7b8896a1a89b8e8275665b5044382b1f120600000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d3946535f6c767979797979797979839090837979797979797979766c5f5346392d2013000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000007121d27313e4653606d7984919c908376675d514953606d7985929b8e817468554b4035291d100400121f2c3945525f6c78859292999292918f8e8b87827c716c61594f41382d22170b00000815212e3b4854616e7b87939393939393877a6d6154473a2e211407000f1b2835424e5b6875818e9b91847d7d7d7b6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415191d1e1f1f1e1c181414110e09020000000000000000000000000d1925323d49545e66696c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c69655e54493d3125190d0005111e2a36414c565e6c6c6c6c6c6c6c6a675f554a3f444f5960636c6c6c6c6c6c67645c53483c3024180b00030f1b2834404b5760686b6c6c6c6c6c6c5d564c4135291d1105000915212e3a45505a62656c6c6c6c69665e54473d33271c10040000000000000000000000000000000000000000040c18242f39434f59616e7b85929f9f92867b6e615a50433a2f24190c14212e3a47535f6975818e97a29d9084787676767676767676767676767676767676706b6054483b2f221609000713202d3a4653606d798693a0aca194877b6e6154483b2e211d2935414c5563707d8996a0acacafa4998c7f7266584e43382c1d222f3c4955626f7c8895a2aca09386796d6053463a2d20130700000008131e28313d44505b656d7a849199a3ada1978f82776c60584e43392f24180e0500000000020b17202935414c56606b73808d95a0aaa69f92877d6f685d52483e332a1e150b00000005121e2a36424d576875818e9ba8afa49a8f82786d66605d555c555c6063676d727b838f9391857b8797a2ada79a8d8074675a545557554f473e33281c100400000004111d2935414c55606d7a85929ea5aca0968f82796e6a62605b545a5b545c60636a6e78818f959faba59f92857a6e61564c41362a1e11050000000000000000000000000000000003101c28343f4a5465727f8b98a8a7988b7e7165544a3f33281c0f0300000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c798686868686868686909494908686868686868686796c605346392d2013000b1825323e4b5865717e8b98a4afa295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000008121d262c3844505c6674818e9b92867a6d605347515d6775828f9b918477675d5145392c1f130600121f2c3945525f6c7885929493939496999a99938e867e716b6053493f33271b0f03000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e211407000f1c2936424f5c6975828f9c95918989897e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020608080c10121312110f0c0807050200000000000000000000000000000f1c2835414e5a6670767979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797570655a4d4135281b0f000714202d3946525e68767979797979797771675b4f434854606b70797979797979746e64584c4033271a0d0004111e2a3744505c687278797979797976685d5246392d201307000b1724313d4a56626d7179797979767066594f44382c20150a00000000000000000000000000000000000000000007121d27313e46525e69727f8b959f988f82756c61554c4135291e14121e2b37424d57616e7b85929fa0958c80736c6969696969696969696969696969696360594f44382c201307000713202d3a4653606d798693a0aca194877b6e6154483b2e21202c3945515d6775818e9ba8a39fa3ab9d9184776a605448392f24222f3c4955626f7c8895a2aca09386796d6053463a2d201307000000010c161f27333f49535e686f7d87929fa6a99f948c7f726a5f554b40352920170b020000000a141d29333b45525d68707d87939fa7aa9f948c80736b60564c41362d21180c030000000714202d3a46525e697885919eabac9f93877c6f665c54514b4f4b5153555d60696e79818f949083909da9b3a4988b7e7165584b484a48443e352c21160b000000000613202c3945515d6773808d97a1ada69e91847a6d675f5853504a4e4e4b5153585f666d79839099a3ada2978d8174685e5246392d2014090000000000000000000000000000000006121f2c3844505c6675828f9ba8a095877b6e6154483b2d22170b0000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c7986939393939393939c9f9f9c9393939393939386796c605346392d2013000b1825323e4b5865717e8b98a4aca295897c6f6256493c2f23160900000d1a2733404d5a6673808d99a6aca09386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c201300030e19242f3840474a5464717e8a9799897c6f6256494b5565727e8b9893867a6d6053473a2d20140700121f2c3945525f6c78858887868787898d92979f9892887d70655b5044372b1f1205000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e21140700101c2936434f5c6976828f9ca09d96968b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868275695c4f4236291c0f000814212e3b4754616e7a86868686868683776a5d5144495663707d8686868686868074675a4e4134271b0e0005121f2b3845525e6b788586868686867a6d6154473a2e211407000b1825323e4b5865717e8686868682766b6054483c32261b0f030000000000000000000000000000000000000000010b151f2a36424d56606c788390999e948a7e71675d51453c30261c111a26313c46525e68717e8a929c9f93887e716c605b535c5c5c5c5c5c5c5c5c5c5c56544f473d32271b1003000713202d3a4653606d798693a0aca194877b6e6154483b2e21212d3a4754606d7a86929fa3999299a3a096897c6f62554b403529222f3c4955626f7c8895a2aca09386796d6053463a2d20130700000000040d17222d38414c56606b737f8c949fa9a69f92867c6f675d51453e33291d140a000006111b262f3b45505a606d7a849199a4aea2989083786d60594f443a2f241b0f06000000000815212e3b4854616e7b8797a1adaa9d9083776a5f544b4540424045474b51575f676d78828f9590959fabb0a3968a7d7063574a3d3d3c38332c231a1005000000000714212d3a4754606d7a85929fa9aa9e94897d70685d554e46443f41414045464e545c676f7c87929faca99f92867a6e6154473c31261a0e020000000000000000000000000000000713202d3a4653606d7985929faa9d918477695e52463a2d1c11060000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c798689898989898989909595908989898989898986796c605346392d2013000b1825323e4b5865717e8b989f9f9f95897c6f6256493c2f23160900000d1a2733404d5a6673808d999f9f9f9386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c20130007131f2b36404a52585a616e7b879a978a7e71645753595b626f7b889599887c6f6255493c2f221609000916232f3c4956626f7c7b7a7a7a7b7d808590959f9a9184796c605346392d201306000815212e3b4854616e7b8794a1aeada094877a6d6154473a2e21140700101d293643505c6976838f9ca9aaa3988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393938f8275695c4f4236291c0f000814212e3b4754616e7a87939393939084776a5d5144495663707c89939393938d8174675a4e4134271b0e0004101d2935404b556c788592939393877b6e6154483b2e211508000613202d394653606c7883909994897d7063584e43372b1f1306000000000000000000000000000000000000000000030d1925303b44505b666f7c87929f9e91847a6d60584e42382e231715202a36414d56616c73808d939d9a92877e736c655d554e5050505050505050504948443d352b21160b00000713202d3a4653606d798693a0aca194877b6e6154483b2e212b37434e5865717e8b98a29f9286929fa89a8e8174675d5145382c222f3c4955626f7c8895a2aca09386796d6053463a2d201307000000000006111b262f3a444f59606c77828f97a1aba3999184796d605a50453b2f261b1106030c17222d38414d57616c75818e96a1aba59f92857b6e665c50473d32281e120900000000000916222f3c4955626f7c8895a9b3a79a8d817467584e4239352f34383a40454d555c666d7a85919d9fa7b1afa396897c706356493d302f2c28211a11080000000005111e2a36424d5765727f8b98a2aea99c8f82756b60564c433c38332d2e34383c424b555f6a74818e9ba8aea3988c7f7266574d42372b1e1205000000000000000000000000000000091623303c4956636f7c8998a2aa9a8d807467574d42362a1e0a000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000a1723303d4a5663707d7d7d7d7d7d7d7d839090837d7d7d7d7d7d7d7d7063564a3d3023170a000b1825323e4b5865717e8b9393939393897c6f6256493c2f23160900000d1a2733404d5a6673808d939393939386796d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000b1723303c47525c64676c6d798693998c7f7266595d64686c6d7a8799978a7d7164574a3e3124170b000815222e3b4754606a6f6e6d6d6d6e70737a83909da096897c6f6356493c30231609000815212e3b4854616e7b8794a1acaca094877a6d6154473a2e21140700101d293643505c6976838f9ca9b1a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292928f8275695c4f4236291c0f000814212e3b4754616e7a87949f9f9d9084776a5d5144495663707c89969f9f9a8d8174675a4e4134271b0e0006131f2c3945515d677986939f9f95887b6e6255483b2f2215080005121f2b3744505b656f7c87939d9083766a5f53473b2e2115090000000000000000000000000000000000000000000009141f28333f4a545f6a74808d96a1978d80746a60544a3f34281f141925303b44505a606c77818e939c99928b80776d675f585045414343434343433d3b38322b23190f0400000713202d3a4653606d798693a0aca194877b6e6154483b2e212e3a47535f6a7683909daa9b8e828e97a19f9285796d6053473b30252f3c4955626f7c8895a2aca09386796d6053463a2d2013070000000000000a141d28323d44505b656d7a859199a4aba0968e81746c61574d41382d22170d0b151e27333f49535e69717e8a939ea8a89e938a7e71695e544a3f352b20160c0000000000000a1723303d4a5663707d8996a3b0a6998c7f7366594c402f2924292c2f353b434b545d68707d8a959fabb7afa396897c706356493d3023201c16100800000000000714202d3a46525e697683909daaada196897d7063594f433a312b282223282c3039434e58626f7c8895a0acaa9d908477695f53463a2d211407000000000000000000000000000004111d2935414c566673808c99aaa3988a7d7063574a3d30251a0e000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000916222f3c4854606b70707070707070768390908376707070707070706b6054483c2f221609000b1825323e4b5865717e868686868686867c6f6256493c2f23160900000d1a2733404d5a66738086868686868686786d6053463a2d201307000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000d1a26333f4c58646e7479797985929a8d8073675a646f747979778692988b7e7165584b3e3225180b0006131f2b38434e586062616160606163686f7c8899a4988b7e7265584b3f3225180c000815212e3b4854616e7b87949f9f9f9f94877a6d6154473a2e21140700101d293643505c6976838f9ca9aca5988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875828585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858275685b4f4235281c0f000814212e3b4754616e7a8794a1aa9d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e000714202d3a4753606d7a8699a4a295897c6f6256493c2f23160900030f1b27333f49535f6a75828f9b95887c6f6255493c31261a0e02000000000000000000000000000000000000000000020b17222d38424e58606d7984919e9f93877c6f665c50443b30251a141f29323e44505b656c78818d929f9f928c81796f6a625a514c433c34363636302f2c27211911070000000713202d3a4653606d798693a0aca194877b6e6154483b2e28343f4a54626e7b88959fa398897d85919ea2988a7e7164574d42362a2f3c4955626f7c8895a2aca09386796d6053463a2d201307000000000000020b162027333f49535e68707d87939fa6a89d928a7e70695e53493f33271f15121d27303944505b656e7b85929fa5aba0968e81746c61574d42382e23190d040000000000000a1724313d4a5764707d8a97a3b0a5988c7f7265594c3f2e23181c1f24293139424c56616c7683909da9b3afa396897c706356493d302316100b050000000000000814212e3b4754616e7b87959fabab9e9184786c6053463d31281f1c17181c1f27313c47535f6a7784919daaaca095887b6e6155483b2e22150600000000000000000000000000000713202c3945525d687683909da99f92867a6d6053473a2d201409000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000713202c38444f5960636363636363697683909083766963636363636360594f44382c201307000b1724313d4a56626c71797979797979796f6a6054473b2e22150800000c1926323f4b58636e737979797979797976665c5044382c1f1206000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a67748086868689979a8d8174675b6874818686868999988b7f7265584c3f3225190c00030f1b27323d464e5456555453545456606c7986939f998c807366594d4033261a0d000815212e3b4854616e7b87939393939393877a6d6154473a2e21140700101d293643505c6976838f9c9f9f9f988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2834414d59656f75797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979756f65594d4134271b0e000814212e3b4754616e7a8794a1a99d9084776a5d5144495663707c8996a3a79a8d8174675a4e4134271b0e000714212e3a4754616d7a8794a0a396897c706356493d3023160a00000b17222d38414e58636f7c89959a8d807367574d42362a1e12050000000000000000000000000000000000000000000006111c262f3c45515d67707d8a949e999083786d60574d42362a1f15172027333f49535b666c74808b92989c938f847c716c605d554e463e362e292322201b160f07000000000713202d3a4653606d798693a0aca194877b6e6154483b2e2c3844505c6673808d9aa79f928679818e9baa9c8f8276695e52463a2d2f3c4955626f7c8895a2aca09386796d6053463a2d20130700000000000000040e17222d38414c56606b73808c949fa9a59e92857b6e655b50443c31271d18232e39424e58606c77828f97a2ada3999184796d605a50453b30261c1007000000000000000a1723303d4a5663707d8996abb5a6998d807366544a403428211e1a181f27303a44505a64707d8a97a2adafa396897c706356493d3023160a00000000000000000b1824313e4b5764717e8a97a7b1a79a8e8174665b5044382b1f160f0b0c10151f2b37434e586773808d9aa6b1a7988b7e7165584b3e2d22170b00000000000000000000000000000714212d3a4754606d7a86929fa99c8f8276675d5145392c1f1306000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000004101c27333d474f5456565656565d69768390908376695d5656565656544f473d33271c1004000915212e3a45505a62656c6c6c6c6c6c6c6260584e43382b1f130600000a17232f3b47525c63666c6c6c6c6c6c6c6c5c544a3f34281c1003000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d939393a19a8e8174675b6874818e939394a3998c7f7366594c403326190d00000a162027333f49535b606060606062666e7b8799a4988c7f7265594c3f3226190c000815212e3b4854616e7b86868686868686867a6d6154473a2e21140700101d293643505c6976828f93939393938b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925313d49545d65686c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c68655d53483d3125180c000814212e3b4754616e7a87949c9c9c9084776a5d5144495663707c89969c9c9a8d8174675a4e4134271b0e000815222e3b4855616e7b8894a1a3978a7d7064574a3d3124170a000006111b262f3c4854606b7783909d918478695f53463a2d21140700000000000000000000000000000000000000000000000a141d2935414b55616c75828f98a0958b7f72695e52463e31271d1217222d38414a545b606e737e8691969e9691867e756d675f58504840372e261c13100b0400000000000713202d3a4653606d798693a0aca194877b6e6154483b2e2d3a4653606d7985919ea99c8f82767e8a99a39f93877b6e6154483d322f3c4955626f7c8895a2aca09386796d6053463a2d201307000000000000000006111b262f3a444f59606d78828f97a1aca1978f82776c60584e43392f241f2834404b545f6a727f8c949fa9a69f92877c6f675d51483e33291e140a00000000000000000915222f3c4855626f7b8899a3afa89b8f8275665c51443a322d2b2627272628323e4653606d7985929fabafa396897c706356493d3023160a00000000000000010e1b2834414e5b6774818e9aa7b4aa978a7e7164544a3f3328190d040000040d1b26323d4a5764707d8a97aab4a79b8e81746853493f33271b0f03000000000000000000000000000b1724313e4a5764717d8a99a3a9988c7f7265554b4035291d1004000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000b16212b353d44484a4a4a4a505d69768390908376695d504a4a4a4a48443d352b21160b000005111d29343f485056586060606060606056544e463d32271b0f03000007131f2a36404a52585a606060606060605f504a42382e23170c00000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9a9fa0a79b8e8174685b6874818e9b9fa0a6998c807366594d4033261a0d000005121f2b3744505b656c6d6c6c6d6f7278818e9ba095897c6f6356493c30231609000714202d3a46525e6976797979797979797976685e5246392d20130700101d293643505c697682868686868686867e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915212c37424b54595c5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5b59534b42372c201509000814212e3b4754616e7a878f8f8f8f8f84776a5d5144495663707c898f8f8f8f8d8174675a4e4134271b0e000915222f3c4855626f7b8895a2a4978a7e7164574b3e3124180b000007111b252c38434f5966737f8c9996887b6e6155483b2e2215080000000000000000000000000000000000000000000000020b18242f3a43505a616e7b86929f9f92867b6e61594f43392f2418111b262f38424a505c636c717c848e939f98928b817a6f6a625a524940382e251c11080000000000000713202d3a4653606d798693a0aca194877b6e6154483b2e36414c5664707d8a97a1a8988c7f727a86929fa4998c7f7366594f43382f3c4955626f7c8895a2aca09386796d6053463a2d2013070000000000000000000a141d29323d44505c666e7b85929aa4a99f948c7f726a60554b40352928313a45515c666f7c86929fa6a99f948c7f736a60554b41362c21170c0200000000000000000714202d3a4753606d7a86929facab9e9285796d60564c443d3a373134333332323845515c6675828f9ca8afa396897c706356493d3023160a0000000000000005111e2a36414c566a7683909da9aea298887b6e6155483b2d221708000000000a15212e3b4854616e7b8798a2aeaa9d908377655b5044372b1f120500000000000000000000000006121e2b37424d576774818e9aaba197887c6f6255483c2f24180c00000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000050f19232b33383c3d3d3d43505d69768390908376695d50433d3d3d3c38332b23190f050000010c18222d363f454a4b535353535353534947433d342b20160a000000020e19242e3840474b4d5353535353535353443f3830261c110600000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9aa7b3a79b8e8174685b6874818e9ba7b3a6998c807366594d4033261a0d00000613202d394653606c777979797a7b7e838e939e989083786c605346392d2013060005121e2a36424d575e6c6c6c6c6c6c6c6c6c6c5e564c41362a1d1105000f1c2835414e5a66707679797979797979726d62564a3d3124180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101b26303942494d4f5252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252524f4d48423930251b0f04000714212d3a4754606d7a8283838383838174675b4e414855626f7c8283838383827f7265584c3f3225190c000916232f3c4956626f7c8995a2a5988b7e7265584b3f3225180c00010d18232d373f464956626f7c8999978a7d7164574a3e3124170b00000000000000000000000000000006060606060606060007131d28313e46535e69727f8c95a0988e81756b61554b4035291d14141d262f383f44525a616a6f7a818b92989f938e847c716c635b524a40372e231a0d0400000000000713202d3a4653606d798693a0aca194877b6e6154483b2e3946525e6875828f9ba9a196887b6f76828f9cab9e9184776b605448392f3c4955626f7c8895a2aca09386796d6053463a2d201307000000000000000000020b172028343f4a545e69707d88939fa7a69f92877c6f675d51453e332f3a434f59606d79839098a3ada2979082786c60584e433a2f241a0f0500000000000000000006131f2c3945515d677783909dabada1978a7e71685e564f484742424140403f3f3f404b546673808c99a6afa396897c706356493d3023160a000000000000000713202d3946525e687885929fabac9f9285796c605346392d201306000000000714212d3a46535e697985929facac9f9285796c605346392d2013060000000000000000000000000814212d3a47535f697884919eab9e9185786c605346392d20130700000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000005101a232c33393c3d3d3d43505d69768390908376695d50433630302f2c27211911080000000006111b242d343a3d3e464646464646463c3b38322b22190f040000000008121c262e363b3f40464646464646464638342e261e150a0000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9aa7aca79b8e8174685b6874818e9ba7aca6998c807366594d4033261a0d00000613202d394653606c7984868687888b90959a9590867c6f665b5044382b1f120600020e1a25303b454d525f60606060606060605f524c443a3025190d01000d1926323e49545e66696c6c6c6c6c6c6c65625b51453a2e22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141e2730373d414246464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464642413d3730271e140900000713202c3945525d686d767676767676746f64584c4047535f6a6f767676767676726d62564a3e3125180b000a1723303d4a5663707d8996a3a5988c7f7265594c3f3226190c0006121e29353f49515759606d798692998c7f7366594c403326190d0000000000000000000002060a0c0d131313131313131313130c161f2a36424d57606d788390999e938a7d70675d51453c2f261b11141d262d33404850585f686d757e8690959d9691867e736d645c524940352c1f160c01000000000713202d3a4653606d798693a0aca194877b6e6154483b2e3a4754616d7a86929fab9e9184786a727f8b99a4a096897c6f63554b40353c4955626f7c8895a2aca09386796d6053463a2d20130700000000000000000000050e17232e38424d56616b73808d959fa9a3999184796d605a50453b35414c56606b73808d95a0aaa59f92857b6e665b50463d31281d12080000000000000000000004101d2935404b5566737f8c99a3aea99e91847a6d68615955534d4f4e4d4c4c4c4b4b4c5865727f8b98a5afa396897c706356493d3023160a000000000000000714212e3a4754616d7a8798a2aeaa9d918477665b5044382b1f12060000000005121e2a36424d576a7784919daaaea298877a6e6154473b2e2114080000000000000000000000000815222e3b4855616e7b8896a1ac9b8e8174655b5044372b1f120500000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000b17222c363e44494a4a4a4a505d69768390908376695d5043362a2322201c160f0800000000000009121b22292e3132393939393939392f2e2b27201910070000000000000a141c242a2f323339393939393939392c28231c150c030000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d9a9f9f9f9b8e8174685b6874818e9b9f9f9f998c807366594d4033261a0d000006121f2b3844505b6673808c9993999292908d89837c6f6a5f544a3f33281c0f03000009141f29333b42464853535353535353535346413a32281e130800000915212d38424c545a5c60606060606060585651493f34291d1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c151e262c3134353939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393534312c251e150c02000004111d2935414c565d6069696969696967645c53483c434e585f6269696969696965625b51463a2e221609000a1724313d4a5764707d8a97a3a6998c807366594d4033261a0d000916222e3a46515b62656c667885919a8d8174675a4e4134271b0e000000000000000000070d121619192020202020202020202020201a25313b44505c666f7c87939f9e9184796d60584e41382d22170b141c2228363e464e565d606c717b838d929f98928b80736e645b51473d31281e1308000000000713202d3a4653606d798693a0aca194877b6e6154483b37434e5865727f8c99a3a99a8d8074676e7b87939fa89a8e8174675d5145393c4955626f7c8895a2aca09386796d6053463a2d201307000000000000000000000006111c26303b444f59606d78839097a2aba0968e81746c61574d423b45525d68707d87939fa7a89d938a7e71695e544a3f342b1f160c0000000000000000000000000c18242f3b4854616e7b86929fa8ada19690827a706b65615f575c5a5a5959585858585865717e8b98a4afa396897c706356493d3023160a000000000000000915222f3c4855626f7b8895aab4a99c8f837669544a3f33281c0f0300000000020e1a2531434f5c6976828f9ca9b4aa95887b6f6255483c2f221509000000000000000000000003101c28343f4a5465727f8b98a8a49a8a7e716453493f33271b0f0300000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000004101c28333e48505557575757575d69768390908376695d5043362a1d1613100b0500000000000000000911181d2124252d2d2d2d2d2d2d23221f1b160f0700000000000000020a12191f2326272d2d2d2d2d2d2d2d1f1c17110a03000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a6774808d93939393938e8174685b6874818e93939393938c807366594d4033261a0d0000030f1c28333f4a54616e7b87939f92878583817d786f6a5f584e42382d22170b000000020d17212930363a3b4646464646464646463936302820160c02000005101b26303a42494e50535353535353534b4a453f372d23180c0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c141b212528292c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c282725201b140c03000000010d1924303a444c52545c5c5c5c5c5c5b58534a41363c464e53555c5c5c5c5c5c585651493f34291e1206000b1824313e4b5764717e8a97a4a69a8d8073675a4d4034271a0d000b1825313e4a57626d7279797983909b8e8275685b4f4235281c0f00000000000000010a12191e2325262d2d2d2d2d2d2d2d2d2d2d2d2d2d28343f4a54606a74808d97a1968d80736a5f53493f33271e13111317242d343c444c525a62696e78808b92999f928c80736d63594f433a2f24190d010000000713202d3a4653606d798693a0aca194877b6e6154483b3b4754606a7784909daba197897c70636876838f9caa9f9285796d6053473b3c4955626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000a141e29323e44505c666e7b85929fa4a89d938a7e70695e544a45505a606d7a849199a4aba0968e81746c61574d42382d22190d040000000000000000000000000714202d3a46525e6974808d96a1a9a89f9590847d77726e696a6867666665656565646465717e8b98a4afa396897c706356493d3023160a000000000000000a1723303d4a5663707d8996a3b0a89b8e8275685b4f422d22170b000000000000091c2835424f5b6875828e9ba8b0a396897d7063564a3d3023170a000000000000000000000006121f2c3844505c6675828f9ba89f93877a6e6154473b2d22170b0000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000814202d3944505a6164646464646469768390908376695d5043362a1d1007040000000000000000000000060c11151718202020202020201615130f0a0400000000000000000000080e1317191a202020202020202012100c060000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000e1a2734414d5a677480868686868686868174685b68748186868686868686807366594d4033261a0d0000000b17222d3846535e6976828f9b8f82787774706c655f584e463c2f261c110600000000050f171f252a2d2e39393939393939392e2d2a251e160e05000000000a141e2830383e4143464646464646463f3d3a342d241b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002091015191b1c1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1c1b18150f0902000000000008131e28323a4145475050505050504e4c4841382f343c4347485050505050504c4a463f372d23180d01000c1825323f4b5865727e8b98a5a79a8e8174675b4e4134281b0e000c1926323f4c5965727f86868689959c8f8275695c4f4236291c0f000000000000000a131c232a2f32333939393939393939393939393939392e38424e58606d7a85919e9f92877c6f655b50443a3025191d202021222a323a414550575f666d747e8792989c928c7f726b61564c4135291d13070000000713202d3a4653606d798693a0aca194877b6e6154483b404b55626f7c8995a0ab9e9184796d6064717e8b98a2a2988a7e7164574d423c4955626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000020c172028343f4a545e69707d8a929da7a59e92857b6e665b504d57616c75818e96a1aba3999184796d605a50453b2f261c10070000000000000000000000000005121e2a36424d57606d79849197a1a9a79f969189837f7b78767574737372727271717171717e8b98a4afa396897c706356493d3023160a000000000000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b060000000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a00000000000000000000000713202d3a4653606d7985929faa9d908377685e5246392d1b11060000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000a1623303c4955616c70707070707070768390908376695d5043362a1d1003000000000000000000000000000105090b0b13131313131313090806030000000000000000000000000002070a0c0d1313131313131313060300000000000000000714202d3a4753606d7a8693a0adac9f9286796c5f5346392c2013000d1a26333f4c58646e7479797979797979746f6459646f7479797979797979736e63574b3f3226190c00000006111c2a36424d5764717e8a9792877b6e6763605b534e463c342a1d140a000000000000050d141a1e20212d2d2d2d2d2d2d2d21201d19130c050000000000030c161e262d3235363939393939393932312e29231b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090c0e0f1313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313130f0e0c090400000000000000020c1620283035393a43434343434341403c362f262a32373b3c4343434343433f3e3a342d251b110700000c1926323f4c5965727f8c98a5a89b8e8175685b4e4235281b0f000c1926323f4c5965727f8c93939d9f9c8f8276695c504336291d1000000000000007121c252e353b3e4046464646464646464646464646464646464645525d68717e8a949f999083776c60564c41362a24292c2d2e2f30302f353e454d545c606c717d8692999f93887d70685d52453a2f24180d0100000713202d3a4653606d798693a0aca194877b6e6154483b45515d6774818d9aa7a6998d8073665c606d7a85929faa9c8f8276695e53463c4955626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000050e17232e38424d57616c74808d959faaa2978f82786c6058535e69717e8a939ea8a69f92877c6f675d51483e33291d140a0000000000000000000000000000020e1a25303b45515d676f7c8591979ea5a8a09e95908b8885838281807f7f7f7e7e7e7e7d7d808d9aa7afa396897c706356493d3023160a000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b0a4978a7d7164574a3e3124170b0000000000000000000000091623303c4956636f7c8998a2aa998d807366564c41362a1e0a000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000a1724313d4a5764707d7d7d7d7d7d7d7d8391908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0acac9f9286796c5f5346392c2013000b1723303c47525c64676c6c6c6c6c6c6c68645d535d64686c6c6c6c6c6c6c66635c52473b2f23170a000000000e1a25313b4653606d798592998c8073665c535049413c342a22190b020000000000000002090e12141520202020202020201413110d080200000000000000040c141b212628292d2d2d2d2d2d2d2524221d18110900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e161e24292c2d3636363636363433302b251d20262b2e2f36363636363632312e29231b13090000000d1a2633404d596673808c99a6a89c8f8275695c4f4236291c0f000c1926323f4c5965727f8c989faaa99c8f8376695c504336291d100000000000020d19232e3740464b4c535353535353535353535353535353535353534c56616c76828f989f948b7e71685e52463d302f35393a3b3c3c3d3d3c383b424a515a626b707e87939f9a92857a6d60554b4135291d110400000713202d3a4653606d798693a0aca194877b6e6154483b4753606d7985929fab9f94887b6e62545d6774818e9ba89f93877b6e6154483d4955626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000006111c26303b45505a606d78839098a2a99f948c7f726a605b656e7b85929fa5a99f948c7f726a60554b40362c21170b0200000000000000000000000000000009141f2935414b555f6a6f7c858f939c9fa4a79f9d989892908f8d8d8c8c8b8b8b8b8a8a8a8d929da9afa396897c706356493d3023160a000000000000000b1825313e4b5864717e8b97a4b1a79a8d8074675a4d4134271a0e0100000000010e1a2734414d5a6774808d9aa7b1a4978b7e7164584b3e3125180b0000000000000000000004111d2935414c566673808c99aaa298897d706356493d3025190d000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c79868a8a8a8a8a8a8a9195908376695d5043362a1d1003000000000000000000000000000000000000000000010406070d0b0a08050000000003080b0d0e0d070604000000000000000000000000000000000000000000000714202d3a4753606d7a86939f9f9f9f9286796c5f5346392c20130007131f2b36404a52585a606060606060605b59534b53595b606060606060605957524a40352a1f13070000000009141f2c3845515c67748086868685796d6053463f382f2a22191007000000000000000000000205070813131313131313130707050100000000000000000000030a1015191c1d20202020202020181815110c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d2021292929292929282724201a13151b1f21222929292929292525221e181109010000000d1a2734404d5a6773808d9aa6a99c8f8376695c504336291d10000c1926323f4c5965727f8c98a5b2a99c8f8376695c504336291d10000000000006121e2a3540495157596060606060606060606060606060606060606060605a616e7b86929f9e92857a6d61594f42393a4045474848494a4a48443d3940445059616c73808c96a0978d8073675d5145392c20130600000713202d3a4653606d798693a0aca194877b6e615448424d5764717e8a97a2aa9c908376695f535563707d8996a1a49a8c7f7366594f444955626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000000a151e29333e45515c666e7b85929fa5a69f92877c6f67606c77828f97a2ada1978f82776c60584e43392f241a0f0500000000000000000000000000000000020d18242f3a434e585f6a6f7a82898f93999c9fa2aaa29f9d9b9a999998989898979797979a9da4aeafa396897c706356493d3023160a000000000000000b1824313e4b5764717e8a97a4b1a79a8d8174675a4e4134271b0e0100000000010e1b2734414e5a6774818d9aa7b1a4978a7e7164574b3e3124180b000000000000000000000713202c3945525d687683909da99f9285796d6053463a2d201308000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c7986939393939393939393908376695d5043362a1d10030000000000000000000000000000000000000001070d1113141a181715110c0601080f14181a1b191413100c0701000000000000000000000000000000000000000714202d3a4753606d798693939393939286796c5f5346392c201300030e19242f3840474c4d535353535353534e4d4841484d4e535353535353534d4b4740382e24190e020000000004101c2834404b55646e74797979786d665c5044382d261d18100700000000000000000000000000000000000000000000000000000000000000000000000000000005090d0f10131313131313130c0b090501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113141d1d1d1d1d1d1b1a18140f080a0f1215151d1d1d1d1d1d191816120d0700000000000e1b2734414e5a6774818d9aa7aa9d9083776a5d5044372a1d11000c1926323f4c5965727f8c98a5aca99c8f8376695c504336291d1000000000000a16232f3b46515b63666c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6b69727f8c95a0978e81746b60544b40434b51535455565756554f473d343f47505a606d7884919e9f92857a6d6054473a2d21140700000713202d3a4653606d798693a0aca194877b6e61544846535e6976828f9ca9a2988b7e7165574d53606c7884919eac9e9184776b6054484955626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000030c17212834404b545f69717e8a929da7a3999184796d6a727f8c949fa9a49e92857b6e655b50463c31281d120800000000000000000000000000000000000007131d28313c464e585f686d757c82878b8f929897999a9b9c9d9d9d9e9e9e9e9f9f9f9fa3abacb5afa396897c706356493d3023160a000000000000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e0100000000010e1b2834414e5b6774818e9aa7b0a3978a7d7064574a3d3124170a000000000000000000000714212d3a4754606d7a86929fa89c8f8275665c5145382c1f1306000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d394653606c7986868686868686868686868276695d5043362a1d1003000000000000000000000000000000000000040c13181d2020272524211d17100b131a2024272726201f1c18120b030000000000000000000000000000000000000714202d3a4753606d798686868686868687796c5f5346392c2013000008121d262f363c3f414646464646464641403c373c404146464646464646403f3b352e261c12070000000000000c18232e3943525c64676c6c6c6b605c544a3f34281b140b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407071010101010100e0d0b08030000030608091010101010100c0b0906010000000000000f1b2835424e5b6875818e9b9f9f9d9184776a5e5144372b1e11000c1926323f4c5965727f8c989f9f9f9c8f8376695c504336291d1000000000000c1925323e4b57636d737979797979797979797979797979797979797979797978736d7883919a9e93897d70665c51454b555d60616263636360594f4438353e44505c66727f8b98a2988a7e7164574b3e3124180b00000713202d3a4653606d798693a0aca194877b6e6154484953616e7b87939fac9f92867a6d605447505b6573808c99a6a096897c6f63554b4955626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000050f18232e39424d57616c74818e95a0aaa0968e81746f7c86929fa6a79d928a7d70695e53493f342b1f160c00000000000000000000000000000000000000010c161f2a343c464e565e616b6f757b7f8285888a8c8d8f8f9090919191919292929292999ba3acafa396897c706356493d3023160a000000000000000a1723303d4a5663707d8996a3b0a89b8e8175685b4e4235281b090000000000020f1b2835424e5b6875818e9ba8b0a3968a7d7063574a3d3024170a000000000000000000000b1724313e4a5764717d8a99a3a8988b7f7265544b4034281c1004000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000013202d3946535f6c7679797979797979797979797670665a4e4235291c0f030000000000000000000000000000000003090d161d24292c2d3431302d28221b141d252b303334332d2c29231d150d09030000000000000000000000000000000006131f2c3845515c67767979797979797979756a5e5245382c1f120000010b141d242b303334393939393939393534302b3034353939393939393933322f2a241c130a0000000000000007121d2730404a52585a6060605e53504a42382e23170a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875818f939393939184786b5e5245382b1f12000c1926323f4c5965727f8c93939393938f8376695c504336291d1000000000000d192633404c5966737f868686868686868686868686868686868686868686868578666f7d88939f9d9184796d60574d515d676d6e6f6f70706b6055483d32343f4a54616e7b8899a49a8d8174675a4e4134271b0e01000713202d3a4653606d798693a0aca194877b6e615448505b6573808c9aa4a89b8e8174675d51454953616e7b88949fa89a8e8174675d514955626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000007121d27303b45505a606d79839098a2a89d938a7e79839098a3aaa0958d80746c61564d41382d22190d040000000000000000000000000000000000000000040d18222a343c444c52596063696e7276797b7d7f81828383848484848585858585868b909ba7afa396897c706356493d3023160a000000000000000916222f3c4955626f7c8895aab4a99c8f8276695c4f4330251a0e0200000000030f1c2936424f5c6975828f9ca8b5ab95897c6f6256493c2f23160900000000000000000006121e2b37424d576774818e9aaba196887b6e6255483b2e23180c00000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000121e2b37434f5a646c6c6c6c6c6c6c6c6c6c6c6c69665e544a3e32261a0d01000000000000000000000000000000060e151a1f282f35393a403e3d39342d241d262f363c4041403a38342f271f1a140d0500000000000000000000000000000004101c2934404b555c6c6c6c6c6c6c6c6c6c6a63594e42362a1d11000000020b12191f2326272d2d2d2d2d2d2d282724202427282d2d2d2d2d2d2d2626231f19120a0100000000000000000b151e2f3840474c4d5353535246443f3830261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c69768286868686868685786c5f5245392c1f12000c1926323f4c5965727f868686868686868276695c504336291d1000000000000d192633404c5966737f8c93939393939393939393939393939393939393939185786b6b74818e97a0968c7f73695f5353606d797b7b7c7d7d7063584e4338313a4653606d7986939f9c8f8276695c4f4336291c1003000713202d3a4653606d798693a0aca194877b6e61544853606c7884919eaca096897c7063554b4146535f697683909caa9f92857a6d60534955626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000000000000b151e2a333e45515c676e7b86929fa5a59e9285818e95a0aaa3989183796d60594f443b2f261b1007000000000000000000000000000000000000000000050e171e252a323a41464f54575e6165666d6f717374757676777777787878787879797e8b98a4afa396897c706356493d3023160a000000000000000814212e3b4754616e7b8798a3aeaa9d9084776a574d42362a1e12050000000005111d2935414c566a7783909daaafa399877b6e6154483b2e2115080000000000000000000814212d3a47535f697784919eaa9e9184786a5f53473a2e1d120700000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000f1b27333e49525a5f60606060606060606060605d5a544c43382d22160a000000000000000000000000000000060f1820262b313a4045474d4b49453e362d222f3841484c4e4c47454039312a251f170f050000000000000000000000000000000c18232f39434b515f606060606060605f5e5951473d31261a0e0000000001080e13171a1a202020202020201b1a1814181a1b202020202020201a1917130e0700000000000000000000030c1d262f363c3f41464646453a38342e261e150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2835414e5a6670767979797979797873695d5144382b1e12000b1825313e4a57626d72797979797979797670665a4e4235291c0f00000000000d192633404c5966737f8c999999999999999da0a7a9a29f999999999999999185786b616d7a85929e9f92867b6e615a5c6976828788898a85786a605448423f404653606d798699a49c8f8376695c504336291d1003000713202d3a4653606d798693a0aca194877b6e61544c5663707d8996a1ab9e9184786c6053463a424d5765717e8b98a2a2988b7e7164574d55626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000000030c18212934404b555f69717e8b939ea7a297928e939da7a69f92867c6f675d51473e32291d140a000000000000000000000000000000000000000000020c1720293036393a3e3f44484d5354545c606264666768696a6a6a6b6b6b6b6c6c6c717e8b98a4afa396897c706356493d3023160a000000000000000713202d3a4653606d7986929facab9f928578695e52463a2d201407000000000713202d3946525d687885929eabac9f9286796d6053463a2d2013070000000000000000000815222e3b4855616e7b8896a0ab9a8e817467584e43372b1f0b0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000a16212c3740494f535353535353535353535353504e4a433a31271c11050000000000000000000000000000030e18212a31373e434b51535a585650483e322b34414a53585a5953514b433e36312921170d03000000000000000000000000000007121d2731394045535353535353535353524e473f352b20150900000000000003070b0d0e131313131313130e0e0c080c0e0e131313131313130d0c0a07020000000000000000000000000b141d242b303334393939382d2c28231c150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1926323e49545e66696c6c6c6c6c6c6c6961574c4135281c10000916222e3a46515b62656c6c6c6c6c6c6c69665e54493e3226190d00000000000d192633404c5966737f8c8c8c8c8c8c8c8c9095a0a297928c8c8c8c8c8c8c8c85786b5d68717e8b949f988f82766c61566673808d959697897c6f625b534d4c4d4f58626f7c8895ab9b8e8275685b4f4235281c0f02000713202d3a4653606d798693a0aca194877b6e6154525d6875818e9ba8a4998c7f73655b5044373b4754606d7a86929faa9c8f8276695e5355626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000000000060f18232f39434d57616c74818e95a0a9a29e9b9da5a99e948b7f726a5f554b40352c20170b0200000000000000000000000000000000000000000008131e29323a4146474b4c4d4e4f51524a50535557595a5c5c5d5d5e5e5e5e5f5f5f65717e8b98a4afa396897c706356493d3023160a0000000000000006121f2b3844505c667784909daaaea298877b6e6154483b2e21150a000000000714212e3a4754616d7a8797a1adaa9e918477665c5145382c1f1306000000000000000003101c28343f4a5465727e8b98a8a4998a7d7164574a3e31261a0f0000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000005101b252e373e4346464646464646464646464643423e3831281f150a0000000000000000000000000000000915202a333c424750555d606764615a50443a323d46535c646766605c554f46423b33291f14090000000000000000000000000000010b151f272f343846464646464646464645423d352d24190f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b131a1f2426272d2d2d2b201f1c17110a03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915212d38424c545a5c6060606060605f5d574f463b3024180c0006121e29353f49515759606060606060605c5a544c42382d21160a0000000000091623303c4956636f7d808080808080808083909d9f928580808080808080807f726556626c76828f989f948a7e71685d626f7c89959f9c8f82756d615e57595959616a73808d99a8998d8073665a4d4033271a0d00000713202d3a4653606d798693a0aca194877b6e615454606d7a86929fac9f93877b6e6153493f333945515d6775818e9ba89f93877b6e615355626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000000000007121d27313c45505a606d79839198a2adaba7a9ada1978f82776c60584e43392f231a0e05000000000000000000000000000000000000000000010d1925303a444c525457595a5b5c5d5e5b5953484a4c4e4f5050515151515252525965727f8c98a5afa396897c706356493d3023160a0000000000000003101c28343f4a546875818e9ba8b3aa978a7d7064574a3d32271b0d04000001081623303d495663707c8996a9b3a89c8f827569544b4034281c1004000000000000000006121f2c3844505c6675828f9ba89f93867a6d6054473a2d2114090000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000009131c252c33373939393939393939393939393635322d271f160d030000000000000000000000000000020e1a26313c454e535a61676d73716c61564c4137434e58646e74736d676159534d453b31251a0e020000000000000000000000000000030d151d23292c3939393939393939393836312b241b120800000000000000000000000104060712131313130908060300000000000000000000000000000000000000000000000000000001080e13171a1a2020201f1312100c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005101b26303a42494e4f53535353535352514c463d342a1f130800010d18232d373f464a4c53535353535353504e49423a31261c100500000000000915222f3b4854606b6f7373737373737374818e9b9e91847873737373737373726d62575a626e7b86929f9e91857a6d60606a7783909a9e948c7f756e69676666676b707c86929fa096897c6f6356493c3023160900000713202d3a4653606d798693a0aca194877b6e61545865727e8b98a3a99c8f8276695e5341382d35414b5563707d8996a1a49a8c7f73655b55626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000000000000000010b151f2a333e45515d676f7c86929facb8b4b8ab9e92857a6d655b50463c31271d11080000000000000000000000000000000000000000000005111d2a36414c565e6164656768696a6b68655d534840414243434444444545454d596673808c99a6afa295897c6f6256493c2f23160900000000000000000b17232e3f4b5865727e8b98a8b2a69a8d807367584e43372b1f15100c090e131e2a36414c5666727f8c99a5b3aa998c7f7366594c402e23180c0000000000000000000713202d3a4653606d7985929fa99d908376685d5245392c2013070000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000010a131b21272b2d2d2d2d2d2d2d2d2d2d2d2d2a2926221c150d0400000000000000000000000000000006121e2b37424e575f626c7179807e71685d52453c4754606a74817f79706b615e574d42362a1e1205000000000000000000000000000000030b12181c1f2d2d2d2d2d2d2d2d2c2c2a26201912090000000000000000000001070d1013141e202020201615130f0a0400000000000000000000000000000000000000000000000000000003070b0d0e131313120706030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e2830383e41434646464646464544413b342b22180d02000007111b252d353a3e3f4646464646464643423e3831281f150a0000000000000713202c38444f5960636666666666666874818e9b9e9184786b66666666666665625b51535f6973808c96a0978d80746a6063707d88939f9c918c817b7673727374777d859298a29e9184786d6053463a2d20130700000713202d3a4653606d798693a0aca194877b6e61545f6a7683909daaa2978a7e7164574d422f262f3a4653606c7884919eac9e9184786c6055626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000000000000030d18212935404b555f6a737f8c99a6b2bdb0a3968a7d70685e53493f342a1f150b00000000000000000000000000000000000000000000000713202d3946525e686d71727374767778756f65594d3d323536373737383835404b556774818e9aa7b2a995887b6e6255483b2f22150800000000000000000615222f3c4855626f7b8896a0acaa9d9184776a6054473c31271f1c181b1a1e242d3946525e6876838f9ca9aea298897c706356493d30231607000000000000000000091623303c4956636f7c8998a2aa998c807366564c4135291d11040000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000010910161b1e2020202020202020202020201d1c1a16110a03000000000000000000000000000000000814212e3a47535f6a6e767e848d857a6d60584e43505a626f7c888c847d756e695e53463a2d2114070000000000000000000000000000000001070c10132020202020202020201f1d1a150f0800000000000000000000040c12181d20202b2d2d2d2d22211f1b150e070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c161e262d323536393939393939393835302a22191006000000000a131b23292e3132393939393939393635322d261f160d03000000000000030f1b27323d474f545659595959595b6874818e9b9e9184786b5e5959595959595751494d57606d7984919e9f93877c6f66606b73808d939f9c938e8783807f8081848a9297a19f928a7d70665c5044382b1f120600000713202d3a4653606d798693a0aca194877b6e6154626f7c88959fab9f9285796d6053473b31202b3844505b6673808d99a7a096897c706355626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000000000000007121d27313c46505a606d7984919eaab7b9b1a4978b7e71695f554b40342820170b02000000000000000000000000000000000000000000000714212e3a4754616d7a7e7f8081828485817568584e43372e2c2823282c2f3945515d677783909daaada196877a6d6054473a2d21140700000000000000000815212e3a47535f6a7784919eabaca095887c6f62584e4339312c282327262b2f35414c56616d7a86929facab9f9285796d6053463a2d201307000000000000000004111d2935414c566673808c99aaa298897c6f6356493c3024190d010000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000050a0f12131313131313131313131313100f0d0a050000000000000000000000000000000000000815222f3b4855626e7c828a91968d80746a5f534b55616c76839096918a827b6e6154483b2e21150800000000000000000000000000000000000000040613131313131313131312110e090400000000000000000000040d161d24292c2d38393939392f2e2b2620181007000000000000000000000004090d0f0f131313131313130d0c0a060200000000000000000000000105090b0b13131313100f0d0905000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c141b212628292d2d2d2d2d2d2c2b28241f1810070000000000010a11181e2225262d2d2d2d2d2d2d292926211c150d0400000000000000000b16212b353d4448494d4d4d4d4e5b6874818e9b9e9184786b5e514d4d4d4d4c4a463f45515c67707d89939e999083786d60606c77808c92989f9992908d8c8c8e91969e9f99928c80736b61544a3f34281c100300000713202d3a4653606d798693a0aca194877b6e615c6673808d9aa7a79a8d8174675c5145382c1f28333f4a54626e7b88959fa89b8e8174675d626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000000000000000060f18242f39434e58626c75818e96a0acafacafac9f92867b6e675c51453e32291d140a000000000000000000000000000000000000000000000815212e3b4854616e7b878c8d8e8f909184786a6054473f3a38342e34383a404b55606d7a86929facab9e918578675d5145392c201306000000000000000006121f2b37434e586673808d99a3afa89b8e81756a5f554b433c38342e3431373a4145525d68737f8c99a3afa79b8e8175675c5145382c1f130600000000000000000713202c3945525d687683909da99f9285796d6053463a2d201308000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d949e9f92877c6f625a515c67717e8a949f9e93867d7063574a3d3024170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f282f35393a45464646463c3b37322a22180e04000000000000000002091015191b1c20202020202020191916120d07000000000000000000060c11151718202020201d1c1915100a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a1015191c1c2020202020201f1e1c18130d060000000000000000070d12161819202020202020201d1c1916100a03000000000000000000040f19232b32383b3c404040414e5b6874818e9b9e9184786b5e51454040403f3e3a34404b55606b75818e97a0958c7f72695e656c777f868e92999b9c9a99999a9d9b99938f867f736e63594f42382e23170b0000000713202d3a4653606d798693a0aca194877b6e61606d7985929eaba095897c6f62554b4034291c222d3847535f697683909daa9f92857a6d60626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000000000030c18212935404b555f6a717e8b939ea8aba39fa3aba2989083796d60594f443b2f261c11060000000000000000000000000000000000000000000714212d3a46535e697884919a9b9c9d96897c6f625a504a464440434044464b515c67717e8b98a3aeaa9b8f827568554b4135291d11040000000000000000030f1a26313c4854616e7b87929faaac9f92877c6f675d554e46454041414142474c515b606d7a85929eabaca095897d7063554b4034281c100400000000000000000714212d3a4754606d7a86929fa89b8f8275665c5044382c1f1206000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000004080a0a131313130d0c0a070200000000000000000000000713202d3a4653606d78839097a2999083766c6156606d7984919e9f958d80736b6155483c2f23160900000000000000000002070c0f11121313130e0706040000000000000000000000000000000000000000000007121d28313940454751535353534947433c342a20150a00000000000000030c141b212528292d2d2d2d2d2d2d2625231e19120a010000000000000911181d2124252d2d2d2d292826211b140c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005090d0f101313131313131212100c0802000000000000000000000106090b0c13131313131313100f0d0a0500000000000000000000000007111921272c2f30333335414e5b6874818e9b9e9184786b5e514538333332312e2e39434f59616d7a85929f9f92867b6e615b656c727b81868b8e9091929291908e8b87827c726d635c52473e30261c11060000000713202d3a4653606d798693a0aca194877b6e6164707d8a97a1ab9d9083776a605443392f23181c2b37424d5765727e8b98a3a2988b7e7164626f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000000000b151e2a333c45515d676f7c86929fa5a79f999299a3aaa0958d80746b61564d42382d22170d04000000000000000000000000000000000000000005121e2a36424d576774818e9aa6a9a89b8e81756c605c5453514a504a5153555d606d7983919daaaea2988b7e7165584b3e2f24180d010000000000000000000a15212d3a46535e6975818e98a3aea3999083796d675f5853514b4e4e4e4d53555d606d74818e97a1ada69d9083776b605443392e23180c0000000000000000000b1724313e4a5764717d8a99a3a8988b7e7265544a3f34281c1003000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000050b101416171f2020201a1917130e070000000000000000000006131f2c3845515c666e7b85929a9f948b7e71675e68737f8c96a1989083796d60594f44382c2014070000000000000000060d13181c1e1f2020201b1313100c0700000000000000000000000000000000000000010d18242f39434b51535e6060606055534e463c32261b0f040000000000020c151e262c3135363939393939393933322f2a231c130a000000000009121b22292e3132393939393635322d261e160c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b202223262835414e5b6874818e9b9e9184786b5e5145382b2626251d27303d46525e68717e8b949f988f82756c615b606a6e757a7e81838585868584817f7b756f6a635b524940352c1e140a000000000713202d3a4653606d798693a0aca194877b6e616875828f9ca9a3998c7f7265584e4331271d121a26313c4754606d7a86929faa9c8f837669626f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000000007121d27303c45505a606d79839198a2aa9f9590869299a4a79d928a7d70695e544a3f332820160c0100000000000000000000000000000000000000020e1a25313c4855626f7c88949faaaa9e938a7e726d6662605c545d545c6062676d75808d95a0aca99f92867a6d6154473a2e2114070000000000000000000005121e2a36424d57616e7b86929fa6aba0958f82796f6a63605c555b5a5b575f62676d747f8c939ea9a99f948a7d7064594f4430271d1207000000000000000005121e2b37424d576774818e9aaba096887b6e6155483b2e23170c00000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000810171c2023242c2d2d2d2726231f19120a01000000000000000004101c2834404b545e69707d88939f9e91857a6d616e7b86929f9f92867b6e665c51473e33281c1004000000000000000710171e24282b2c2d2d2d28201f1c18120b03000000000000000000000000000000000004101d2935404b555d606b6c6c6c6c625f584e43372b21160a000000000009141e2730373d414246464646464646403e3b352e251c120700000006111b242d343a3d3e4646464643413e3830281e1108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b0f1315161b2835414e5b6874818e9b9e9184786b5e5145382b1e1918151e2a36414c56606c778390999e938a7d70675d575f62686e717477787979787775726e69625f58514940372e231a0c02000000000713202d3a4653606d798693a0aca194877b6e616e7a86929fac9f92867a6d6154473d3221150b15202c3945525d6875818e9ba99f93877b6e626f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000000000060f18232e39434d57616c74818e95a0aaa29890837d87939fa7a49e92857b6e665b50443d32281e130800000000000000000000000000000000000000000915212e3b47535f6a76828f98a2aea59f92877f78726f6d666a696a666d6f7379818d929da7aca2978d8074685d5246392d20130700000000000000000000020e1a25313b46535f69737f8c949fa7a79f948f837c75706d676867676869696e737a818c919ca5aaa1978f82766c6155473d331e150b0000000000000000000714212d3a46535f697784919eaa9e918477695f53463a2d1c110600000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000000006111a22282d30313939393933322f2a241c140a0000000000000000000c18232e39424d57616b73808d949f978d80746a74818e989d938a7e71695f544b40352c21160b0000000000000006101922292f343738393939352d2c28231d150c05000000000000000000000000000000000613202c3945515d676d78797979796f6a5f53473d32271b0f0100000004101b26303942494d4f535353535353534c4b4640372e23190d0200010c18222d363f454a4b53535353504e49423a30231a0f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000307090e1b2835414e5b6874818e9b9e9184786b5e5145382b1e120b0c1925303a44505b656f7c87929f9e9184796d605853565e6165686a6b6c6c6b6a6865615e57534e463f372e251c110800000000000713202d3a4653606d798693a0aca194877b6e66727f8c99a3a99b8f8275685e5246392d201304111d2935414c5663707d8a97a1a49a8c8073656f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000000030c17212834404b555f69717e8a939da7a59f92867b73808d95a0aaa1978f82786c60594f443a2f241910060000000000000000000000000000000000000006121f2b37434e58626f7c86929fa4aca399928b837f7b797777767777797c80858e939da4aea49a92857a6d61564c4135291d1105000000000000000000000009141f2a36424d57606d78828f959fa7a69f959087817d79777574747476787b80858e939ca3aaa29892857b6e615a5044352b210c030000000000000000000815222e3b4855616e7b8896a0ab9a8d817467574d42362a1e0a0000000000000000000000000004111e2a3744515d6a7784909daaa99c8f8376695c504336291d100300000000000000000000000000000000000000000000030a1117242c33393c3d46464646403f3b352e261c120700000000000000050c121d27303b454f59606d788290979f92877c6f7c87939f958e81746c61574d42392e231a110c060000000000020d17222b333b404445464646413a38342e271e170e060000000000000000000000000000000714202d3a4753606d7a84868686877c6f62594f44382c1d12070000000915212c37424c545a5c606060606060605957514940352a1e12060005111d29343f48505658606060605c5a544c42352b21160b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9b9e9184786b5e5145382b1e120008131e27333f49535f6a73808d96a0968d80736a5f534c5254585b5d5e5f5f5e5d5b5854524d47433c342d251c130a0000000000000713202d3a4653606d798693a0aca194877b6e6a7784919daba1978a7d7064564c41362a1e11050d19242f3a4653606d7984919eac9e9184786c6f7c8895a2aca09386796d6053463a2d201307000000000000000000000000000000000b151e29333b45515c676e7b86929fa5a89e938b7e716d79839098a3a99f948c7f736b60564c41352922180d03000000000000000000000000000000000000030f1b26323c47535f6a717e8b939aa2aaa39f95918c8886848483838485898c92979ea5aaa39f93887d70685e52443a3024190d010000000000000000000000030e1a26313b44505c666d7a8390959da5a7a099938e898683828181818385888c92979da5a7a09892867d70695e52483e3323190f00000000000000000003101c28343f4a5465727e8b98a8a3998a7d7064574a3d31261a0e0200000000000000000000000004111e2a3744515d6a7784909d9f9f9c8f8376695c504336291d1003000000000000000000000000000000000000000000040c151c2328363e44494a525353534d4b4740382e24190e0200000000000810171d1e252a333e44505c666e7b85929a9990827982909a989183796d605a50453c302a251e1d1710090000000007131e29333d454c50525353534e4645403930292018100800000000000000000000000000000613202c3945515d67707d8a949a8f82766b605448392f24180c0000000d1925313d49545e65696c6c6c6c6c6c6c66635b51463b2f23160a000915212e3a45505a62656c6c6c6c69665e54473d33271c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070e1b2835414e5b6874818e9b9e9184786b5e5145382b1e1205020b17222d38414e58606d7984919e9f92877c6f655b5046474b4e5152525352514e4c4846423b37312a221c130a010000000000000713202d3a4653606d798693a0aca194877a6e6f7c8995a0ab9e9185796d6053463a3025190d0108131f2b3844505c6673808d9aa7a196897d706f7c8895a2aca09386796d6053463a2d20130700000000000000000000000000000007121c27303b45505a606d79839098a2aba0968e81756c666e7c86929fa6a69f92877c6f685d52453f342a1f150b010000000000000000000000000000000000000a15202b37434e58616c727f8892989fa3a7a09d99999291909090919298999ea2a9a69f98928b7f726c61564c4132281e13080000000000000000000000000009141f28343f4a545e686d7a838e929d9fa7a49f9b9892908e8e8d8e8f9197999ea1a9a29e9590867d706b60574d42362c22110800000000000000000006121f2c3844505c6675828f9ba89f92867a6d6054473a2d2114090000000000000000000000000004111e2a3744515d6a778490939393938f8376695c504336291d10030000000000000000000000000000000000000000060d161e262e343f485055575f6060605a57524a40352a1f13070000000008121a22282d3036393a3f4a545e69707d88939f948e828e949f92867c6f675d51483e3a3936302d28221b12090000000c18242f3b454f575d5f6060605b53514b423a322a221a11070000000000000000000000000004101d2935404b55616c75828f9c94897c6f63554b4035291d100400000f1b2835414d5a65707579797979797979736d63574b3e3225190c000b1724313d4a56626d7179797979767066594f44382c20150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e1114141b2835414e5b6874818e9b9e9184786b5e5145382b1e12050006111b262f3c45515d67707d8a939e999083776c60564c413e41444546464544423f3b3a36302b262018100a01000000000000000713202d3a4653606d798693a0aca094877a6d74818d9aa8a79a8d8073665c504438291e13080003101c28343f4a54626e7b88959fa89b8e81746f7c8895a2aca09386796d6053463a2d2013070000000000000000000000000000050f18232e39424d57616c74808d95a0aaa39991847a6d605f6a727f8b949fa9a39991847a6d605a50463c31271d1207000000000000000000000000000000000000040f1a26313c46505a636d727e868e92999da0a8aba39f9e9d9c9d9e9fa2aaaaa29f9b948f867e726d62594f443a3020160c0200000000000000000000000000030b17232e38424c565e686d79818990959b9fa2aaa39f9d9b9a9a9b9c9ea1a9a49f9c97928c837b706b60594f453b30241a10000000000000000000000713202d3a4653606d7985929fa99c908376675d5145392c2013060000000000000000000000000004111e2a3744515d6a77838686868686868276695c504336291d100300000000000000000000000000000000000000070f18202830383f44515a61646c6c6c6c66635c52473b2f23170a00000005101a242c33393a4146474a4d5357606b73808c949e938e939e938b7f726a5f55534d4b4746413a39342c241b100600000f1c2834404c5761696b6c6c6c68605c544c443c342c2318120b030000000000000000000000010d18242f3943505a626f7c89949b8e8175675d5145392c1f130600000f1c2936424f5c697582868686868686867f7366594c403326190d000b1825323e4b5865717e8686868682766b6054483c32271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e2021272835414e5b6874818e9b9e9184786b5e5145382b1e120500000a141d2935404b55616b75818e989f958b7e72685e52463d3037383939383735322e2d2a251f1a150e060000000000000000000713202d3a4653606d798693a0aca093877a6d7985919eab9f95887b6e62544a3f3428170d0200000b17232e3847535f6a7783909dab9f9285796f7b8895a2aca09386796d6053463a2d20130700000000000000000000000000020c17212834404a545f69717e8a929da7a69f92877c6f675d58606c77828f97a1aba1968e81756d62584e43392f23180f050000000000000000000000000000000000000a15202a343e48515b636c717b81878c919597999c9d9e9e9f9f9f9e9d9b9998928e89827b716c625b51473e32281e0e0400000000000000000000000000000006111c26303a444c565e676d747c83898e9298999b9d9e9f9f9f9f9e9d9b999993908b857f786e6960594f473d33291f120800000000000000000000091623303c4956636f7c8998a2a9998c7f7366554b4135291d1104000000000000000000000000020d17222b36424f5b6771777979797979797670665a4e4235291c0f030000000000000000000000000000000000000810192129323a424a505b636c7079797979736e63574b3f3226190c0000000c17222c363e45494c525457575f6165656d78828f9c9e9b9e9b8f82756d6865615e575754524c49453e362c22170c0000111e2b3744505d697378797979746d665e564e463e3528231c150c04000000000000000000000007121d28313e4754606a7683909c9285796d6053473a2d20140700000f1c2936424f5c6975828f93939393938c7f7366594c403326190d000613202d394653606c7883909994897d7063584e43372b1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171f252a2d2e342d35414e5b6874818e9b9e9184786b5e5145382b1e12050000020b18242f39434f59616e7b85929f9f92857a6e61594f43392e232c2c2b2a282521201e1a140f0a03000000000000000000000713202d3a4653606d798693a0aca093867a6f7c8997a1aa9d9083766a5f5342382e23170500000006111c2b37434e5865727f8b99a3a2988a7e717b8895a1aca09386796d6053463a2d201307000000000000000000000000000a141e29333b44515c666e7b85929fa4a99f948c7f726a6055505b656e7a85929ea5a89e938b7e716a5f554b40342921170c020000000000000000000000000000000000030e18222d363f49515a61696e747b8084888b8d8f90919292929291908e8c8985817c766e69615a51493f352c20160c00000000000000000000000000000000000a141e28323a444c555c606b6f777d8185898c8e90919292929291908f8d8a86837e79726d665f574f473d352b20170d0000000000000000000004111d2935414c566673808c99aaa197897c6f6256493c2f24180d0100000000000000000000000007131e29333d454c555f676a6c6c6c6c6c6c69665e54493e3226190d01000000000000000000000000000000000007121a222b333b444c545c606d727e868686868073665a4d4033271a0d000005111d28333e485055565e616467696e7175787c808d99a6a8a6998c807c7875716e696764615e565550483e34281d110500121f2c3845525f6b788586868681786d685f584f473f342e271e160e0600000000000000000000010c161f2b37434e5864717e8a99988a7e7164574a3e3124170700000f1c2936424f5c6975828f9c9f9f9f998c7f7366594c403326190d0005121f2b3744505b656f7c87939d9083776a6054473b2e221509000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d17202930363a3b413a38414e5b6874818e9b9e9184786b5e5145382b1e120500000007121d27313e46525e68727f8b959f978e81756b60554b4034281f201f1e1b191514120e09030000000000000000000000000713202d3a4653606d798693a0aca093867974808d9aa9a3988b7e7265584e4330261c1106000000000f1a26313c4754616d7a86929faa9b8f82757b8894a1aca09386796d6053463a2d20130700000000000000000000000006111c26303b454f59606d78839097a2ada1978f82786c60584e49535e68707e8a939da8a59f92867c6f675c51453e33291e140a00000000000000000000000000000000000006101b242e373f4850575e61696e73777b7e80828484858686858583827f7d79756f6b625f5750483f372d231a0e040000000000000000000000000000000000020c162029323a434b515960636b7075797c7f82838485868685858382807d7a76726d67605c544d453d352b23190e05000000000000000000000713202c3945525d687683909da99e9285796c605346392d201307000000000000000000000000000c18242f3b454f575d5f60606060606060605c5a544c42382d21160a00000000000000000000000000000000030b1218242c343d454d565d666d747f87929892857b6e6154473b2e21140800000814212d3945505a6164686d7174777b7e8185888d929ca8b3a89c928c8885817e7b7774716d6864615a5045392d211508000c1926323f4c5965727f8c93938e827a6f6a615951444039302820180f0700000000000000000000040d1b27323d4754606d7a86929a8d8174675a4e412f24180d01000f1c2936424f5c6975828f9ca8aca6998c7f7366594c403326190d00030f1b27333f49535f6a75828f9b95887c6f6255493c31261a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f29323b4246474d4745404e5b6874818e9b9e9184786b5e5145382b1e1205000000010b151f2a36414d56606c788390999e93897d70675c51453c31261a0e110f0c0807050200000000000000000000000000000713202d3a4653606d798693a0afa39986797884919eab9f92867a6d6054473c3121150a00000000000a15202d3946525d6875828f9ba99f92867a7b8894a1aca09386796d6053463a2d2013070000000000000000000000050e17232e38424d57616b73808d959fa9a49e92857b6e665b5046414d56616c74818e96a0aba2989083796d605a50453b30261c110600000000000000000000000000000000000009121c25333d45454d52575f62666a6e71737577787879797978777573706d67636059534d453e362d251b110800000000000000000000000000000000000000050e1720333d454c504f54596063676d70727576787879797878777573706d6865605d55504a423c332b2319110700000000000000000000000714212d3a4754606d7a86929fa89b8e8175665b5044382b1f1206000000000000000000000000000f1c2834404c5761696b6c6c6c68605c544c504e49423a31261c1005000000000000000000000000000000050c151d2328363e464f575f686d78818c939993877d70695e52463a2d20140700000a1723303d4955616c71777a7e8184888b8e9297999e9ea1a9a39f9e9997918e8b8784817e7a77716c6155493d3024170a000b1825313e4a56626d75818f969490847c706b625b514a423a322a2119110600000000000000000915202b353f4745515d677683909c9083766a554b4035291d1004000f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d00000b17222d38414e58636f7c89959a8d807367574d42372b1e120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1925303b444d52545a53514b4e5b6874818e9b9e9184786b5e5145382b1e120500000000030d1925303b44505b666f7c87929f9e9184796d60574d42372b20160c02000000000000000000000000000000000000000713202d3a4653606d798693a0ac9f9286797c8996a1a89b8e8175685d5245392c201303000000000005111d2935414c5663707d8a97a1a2988a7d7b8794a1aca09386796d6053463a2d20130700000000000000000000020b172028343f4a545e69707d8a929da7a79d928a7d70695e544a3f3b44505a606d79849199a3aaa0958d80746c61574d42382e23170e0400000000000000000000000000000000000c18242f3a454f575c5f606059575f626466696a6b6b6c6c6c6b6a686663605d55544f47423c332d241b130900000000000000000000000000000000000000000c18242f3a454f575c5f606059555c606366686a6b6c6c6c6c6b6a686664615e5653514b443f38302a211911080000000000000000000000000a1724313d4a5764707d8a99a3a7988b7e7165544a3f33281c0f0300000000000000000000000000111e2b3744505d697378797979746d665e564e463e3528231c150c040000000000000000000000000000060e161e272e344048505960696e7a828e939f948c7f736b60574d42362a1e110500000b1724313e4a5764717e83878a8e9196989b9e9c97919197a1989292979c9e9b9896918e8a87837e7164574b3e3124180b000916222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a020000000000010e1a26313d4751595e556673808d99928578675d5145392c201306000f1c2936424f5c6975828f9ca8aa9f998c7f7366594c403326190d000006111b262f3c4854606b7783909d918478695f53473a2d2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36424d565e6167605c554e5b6874818e9b9e9184786b5e5145382b1e1205000000000008141f28333f4a545f6a73808d96a0968c8073695f53473e32281e1308000000000000000000000000000000000000000713202d3a4653606d798693a0ac9f928579808d9aa8a196897d7063564c4135291d11040000000000010d1924303a4653606d7985929eaa9b8e817a8794a0b5a09386796d6053463a2d201307000000000000000000000a141d29323b44505c666e7b85929ea4aaa0958d80746c61574d4238323e45515d676f7c87929fa7a79d928a7e70695e544a3f342820160c02000000000000000000000000000000030f1c2834404c5761686b6c6c66635b55585a5c5d5e5f565e61666a6c6c6a66605d564e463c322a211b12090100000000000000000000000000000000000000030f1c2834404c5761686b6c6c66635b5356595b5d5e5f565e61666a6c6c6a66605d564e463c342e261e180f0800000000000000000000000005121e2b37424d576774818d9aaba095877b6e6154483b2d22170b0000000000000000000000000000121f2c3845525f6b788586868681786d685f584f473f342e271e160e06000000000000000000000000070f18202830394045525a616b6f7b838f949d968f82776c60594f453b30251a0e0200000a1724313d4a5764707d8a939a9a9ea09e9a938f8a8585919e9286858a8f93999ea09e9a9a938a7d7164574a3e3124170b0006121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c030000000004111d2a36424e59636a6c6c727f8b9897867a6d6053473a2d201407000f1c2935424f5c6875828f9b9f9d93938c7f7366594c403326190d000007111b252c38444f596673808c9996887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a46525e696e746d675f585b6874818e9b9e9184786b5e5145382b1e12050000000000020b17222d38424e58606d7984919e9f92867b6e625a50443a3024190c030000000000000000000000000000000000000713202d3a4653606d798693a0ab9f92857884919eac9e9184786c6053463a2f24190d0100000000000008131f2c3844505c6673808d9aa79e9285798699a3afa09386796d6053463a2d20130700000000000000000006111c262f3b444f59606d78829097a1ada3989083796d605a50453b2f2935404b55606a73808c959faaa49f92857b6e665c50443d32281e130800000000000000000000000000000005111e2b3744505c6873787979736d63574b4d4f50555d60686d7276787977736d685f584e443b3025190e02000000000000000000000000000000000000000005111e2b3744505c6873787979736d6357494c4f50555d60686d7276787977736d685f584e443b3025190c06000000000000000000000000000714212d3a46535f697784919eaa9d918477695e52463a2d1c110600000000000000000000000000000c1926323f4c5965727f8c93938e827a6f6a615951444039302820180f0700000000000000000000071019212a323a434b515b636c717d8591959f9991847a6d655b50473d33291f14090000000713202d3a4653606d7985929f9f9c97928d87827d7883909c9285787d82878c91969b9f9f9285796d6053473a2d20140700010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c0300000006121f2c3845525e6a757979797e8a9794877b6e6154483b2e211508000e1b2835414e5b6874818e9b95898686867f7366594c403326190d00010d18232d373f464956636f7c8999978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7b80796f6a605b6874818e9b9e9184786b5e5145382b1e120500000000000006111c262f3c45515d67707d8a939e988f82766c61564c4135291e150a0000000000000000000000000000000000000713202d3a4653606d798693a0ab9e92857b8896a1a49a8c8073655b504437281e13080000000000000003101c28343f4a54626f7c8895a0a197897c86929faca09386796d6053463a2d2013070000000000000000050e17222d38424c56606b73808d949fa9a69f92867c6f675d51473e3329242f3a434e58606d78839098a2ada2979082786d60594f443a3025191006000000000000000000000000000005121f2c3845525f6b788586867f7366574d4e535a61676d727a7f83858584807a6f6a5f564d42362a1f1408000000000000000000000000000000000000000005121f2c3845525f6b788586867f7366574d4e535a61676d727a7f83858584807a6f6a5f564d42362a1f1408000000000000000000000000000815222e3b4855616e7b8896a0aa9a8d807467574d42362a1e0a0000000000000000000000000000000b1825313e4a56626d75818f969490847c706b625b514a423a322a211911060000000000000000040f19222b333c444c555c606d737e869297a09f92877c6f685d53493f352b20170d0200000006131f2c3845515c6775818e9a948f8a85807b76717783909d92857971767b80848a8f92998e8175675d5145382c1f13060000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b0000000613202c3946535f6c798786868a909a95887b6e6255483b2f221508000e1b2734414e5a6774818d9a9083797979736d63574b3e3225190c0006121e29353f49515759606d798692998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87837c726c656874818e9b9e9184786b5e5145382b1e1205000000000000000a141d2935404b55616c75828f989f948a7e71685d52453d30261c110600000000000000000000000000000000000713202d3a4653606d798693a0ab9e91847f8c99a89f93877b6e6153493f3327160c0100000000000000000c17232e3847535f6a7783909da9998c7f85929faba09386796d6053463a2d20130700000000000000020b162028333f4a545e68707d88939fa6a99e938b7f726a5f554b40352c201d28313d44505c666e7b86929fa6a99f948c80736b60564c41352922180d030000000000000000000000000004101d2a3743505d6a7683908f8276695e54585f626c71797f858c909292908c857c6f695e52463b3025190e020000000000000000000000000000000000000004101d2a3743505d6a7683908f8276695e54585f626c71797f858c909292908c857c6f695e52463b3025190e02000000000000000000000003101c28343f4a5465727e8b98a8a398897d7063564a3d30251a0e0000000000000000000000000000000916222e3a46515b606d7a8491989691867d726d605c544c443c332b2317110a020000000000000a16212b343d454d565e676d757f8a9298a19e938b7f726a60564c41382d23190e050000000004101c2834404b5564707d8a8d88837e79736e696a7784919d9886796d696e73787d82868c8a7d7064554b4035291d100400000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d120700000613202c3946535f6c79869293979aa295887c6f6255493c2f221609000d1a2733404d5a6673808d99918578666c66635b51463b2f23160a000916222e3a46515b62656c667885919a8d8174675a4e4134271b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8790867f776e6974818e9b9e9184786b5e5145382b1e120500000000000000020b18242f3a43505a616e7b86929f9e92857a6d60594f42382e23170c03000000000000000000000000000000000713202d3a4653606d798693a0aa9e918482909caa9c8f8276695f5341382d22170400000000000000000006111c2b37434e5865727f8b99a39d908384919eaba09386796d6053463a2d201307000000000000000a141d28323a44505b666e7a85929aa4aba1968f82756d62584e43392f231a161f28343f4a545f69717e8b939ea9a69f93877d70685e52463f342a1f150b01000000000000000000000000020f1b2835424e5b6875818e92877b6e6663646a6f767e848c92989d9f9f9d9791857b6e61564d41362a1e110500000000000000000000000000000000000000020f1b2835424e5b6875818e92877b6e6663646a6f767e848c92989d9f9f9d9791857b6e61564d41362a1e1105000000000000000000000006121f2c3844505c6675828f9ba89f9286796d6053473a2d20140900000000000000000000000000000006121e29353f45525d686f7c86929f9892877f746d665d564d453d3528231c140c0300000000030f1b27323d464e575f686d79818c929fa3a0958e81756d62584e443a2f261b11080000000000000c18232e3a4653606d7984807b76716d66615f6b7884919e93877a6d6061666c70757a7f83796d6053463a2f24180c00000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c00000613202c3946535f6c7986929fa4a6a295887c6f6255493c2f221609000b1825323e4b5865717e8b989286796d605957514940352a1e1206000b1825313e4a57626d7279797983909b8e8275685b4f4235281c0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8798928c827b7174818e9b9e9184786b5e5145382b1e1205000000000000000007131d28313e46525e69727f8c95a0978e81746b60544a3f34281f1409000000000000000000000000000000000713202d3a4653606d798693a0ab9e918587929fa2988b7e7164574d422f261b1106000000000000000000000f1b26313c4754616d7a86929f9f928785929eaba09386796d6053463a2d20130700000000000006111b262f3a444f59606c78828f97a1aca49991847a6d615b51463c31271d110d17232e38424d57626d75828f97a1ada49991847a6d615b51463c31271d1207000000000000000000000000000c1926333f4c5966727f8c998f8279727071757c838a91969fa2aaa3a3a9a1978e8174685e5246392d20140600000000000000000000000000000000000000000c1926333f4c5966727f8c998f8279727071757c838a91969fa2aaa3a3a9a1978e8174685e5246392d20140600000000000000000000000713202d3a4653606d7985929fa99c8f8276675d5145382c1f1306000000000000000000000000000000010d18232935414c565f6a727e8b939e99938c81786d685f574f473f342e261e150c0300000007131f2c38434e5860696e7a828e939ca4a2989183796d605b51463d32281d140a0000000000000007131f2c3845515c676d78746e6a64605c545f6b7885929e94877b6e61545b6063686e72776d675c5145382c1d12070000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c1004000613202c3946535f6c7986929facafa295887c6f6255493c2f221609000916232f3c4956626f7c899a99897c6f6356494640372e23190d02000c1926323f4c5965727f86868689959c8f8275695c4f4236291c0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b879298948f857e74818e9b9e9184786b5e5145382b1e12050000000000000000010c161f2a36424d57606d788390999f93887c6f665c50443b31251a0d040000000000000000000000000000000713202d3a4653606d798693a0ada197919299a39f9285796d6053473b3120140a00000000000000000000000a15202d3946525e6875828f9ba399929297a1ada09386796d6053463a2d2013070000000000040e17222d38414c56606b737f8c949fa9a79f93877d70685e52493f342a1f150b06111c26303c45505a616d7a85919ea4aba1968f82756d62584e43392f24180f060000000000000000000000000a1623303d495663707c8998948f837e7d7e828790949ea1a19e9996979a9f9f92877b6e6154473b2d22170b00000000000000000000000000000000000000000a1623303d495663707c8998948f837e7d7e828790949ea1a19e9996979a9f9f92877b6e6154473b2d22170b0000000000000000000000091623303c4956636f7c8997a2a9988c7f7265554b4035291d100400000000000000000000000000000000070d19242f3a434e58626d75818e95a09f928e827a6e69605951443f3830271e150b0000000915222e3b4854606a6f7b8490949ea5a49f92867c6e675d51493f342b20160b020000000000000004101c2834404b555c666c66625f575351505b657985929f95887b6e62555053565e61666a605c554b4034281c0b01000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f1306000613202c3946535f6c7986929facafa295887c6f6255493c2f221609000714202d3a4753606d7a8693998c807366594f44382c251c120700000c1926323f4c5965727f8c93939da09c8f8276695c504336291d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c787f86909597928a81818e9b9e9184786b5e5145382b1e1205000000000000000000040d1a25303b44505c666f7c87939f9a9083786d60574d42362a1f160c0100000000000000000000000000000713202d3a4653606d798693a0b3a9a19e9fa3a89a8e8174675d5145392c1f1302000000000000000000000005111d2a36414c5664707d8a97a1a39f9ea1a9b3a09386796d6053463a2d20130700000000020c162027333f49535e686f7d87929fa6aa9f958d80736b60564c41372d22180d03000a151e2a333f46525e68707d8a929da8a89e938b7f726a5f554b40352921170d0300000000000000000000000713202d3a4653606d7985929f95908b898b8f93999fa39f97918c8a8a8e9299998c7f7265544a3f33281c0f03000000000000000000000000000000000000000713202d3a4653606d7985929f95908b898b8f93999fa39f97918c8a8a8e9299998c7f7265544a3f33281c0f0300000000000000000004111d2935414c566673808c99a9a197887c6f6255483c2f24180c00000000000000000000000000000000000008131e28313c46515b606d79839198a29d948f847b706b625b504a423930271d120700000916232f3c4956626f7c85919693939393928a7e716a5f554b40372d22190e040000000000000000000c18232e39434b545b605b54534e464653606c7986939f95897c6f625649464c5254595d53514b43392e23180c000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d201307000613202c3946535f6c7986929facaca295887c6f6255493c2f221609000613202c3945515d677783909d9083776b6054483d30261c110600000c1926323f4c5965727f8c989faaa99c8f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b666c727c838c9299938e8e939e9e9184786b5e5145382b1e12050000000000000000000009141f28343f4a54606a74808d97a0958c7f72695e53463e31281d130700000000000000000000000000000713202d3a4653606d798693a0acb3adabacaca095897c6f62554b4035291d10040000000000000000000000010d1925303a4653606d7985929eabacabadb3aca09386796d6053463a2d2013070000000008131e28323a44505b656d7a849199a3aea2989083786d60594f443a30251b10060000030c18212a36414c56616b74808d95a0aba69f92867c6f675d51453e33291f1409000000000000000000000006131f2c3845515c6774818d98a09d9896979b9fa49f99928d85807d7d818792998f8276665b5044382b1f12060000000000000000000000000000000000000006131f2c3845515c6774818d98a09d9896979b9fa49f99928d85807d7d818792998f8276665b5044382b1f12060000000000000000000613202c3945525d687683909da99e9185786c605346392d201307000000000000000000000000000000000000010c161f2a343f45515d676e7c86929fa59f9691857d726d605c544b42392e23180c00000d1a2633404d59667380868686868686868680746c61574e43392f251b10070000000000000000000007121d273039424a5053504a47423c4753606d7a869aa496897c706356493d4146474c504645403930271d12070000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e211408000613202c3946535f6c7986929f9f9f9f95887c6f6255493c2f2216090004101d2935404b556673808c9995897d7063584e42382e23170b00000c1926323f4c5965727f8c98a5b2a99c8f8376695c504336291d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a545b606a6e787f8690959b9b9ea59e9184786b5e5145382b1e120500000000000000000000030b17232e38424e58606d7a84919e9f92867b6e615a50433a2f24180d01000000000000000000000000000713202d3a4653606d798693a0acacacacb5ab9d9184776a605443392f24180c0000000000000000000000000008131f2c3844515c6674808d9aa7b1acacacaca09386796d6053463a2d201307000000010d1924303a444e58606c77828f96a1aba59f92857b6e665c50473d32281e130900000000060f1925303a444f59606d79839199a3aea3989183796d605a50453b31261a0e020000000000000000000004101c2834404b55616e7b86929fa4a5a3a4a7a09d948f868079737070747d87939285796c605346392d2013060000000000000000000000000000000000000004101c2834404b55616e7b86929fa4a5a3a4a7a09d948f868079737070747d87939285796c605346392d2013060000000000000000000714212d3a4754606d7a86929fac9b8e8174655b5044372b1f120500000000000000000000000000000000000000040d18222935404b555f6a717e8a939da7a09792877f746d665c544b4034281c1004000c1925323f4b57636d737979797979797979746e645a50453c31281d12090000000000000000000000000b151e272f383f4446443f38373a4754616d7a8794a0978a7d7064574a3d36393b3f443a38342e271e150b00000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d201407000613202c3946535f6c7986929393939393887c6f6255493c2f22160900010d18242f3b4855616e7b88949c8f82756a60544a3f34281c1003000c1926323f4c5965727f8c98a5aca99c8f8376695c504336291d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d38424a50585f666d727c838c9299a0a79e9184786b5e5145382b1e1205000000000000000000000006111c26303d45515d67717e8a949e988f82756c61554b4035291d1104000000000000000000000000000713202d3a4653606d7986939f9f9f9f9f9fa3998c7f7266584e4331271d12070000000000000000000000000004101c2834404a54626f7c8895a09f9f9f9f9f9f9386796d6053463a2d20130700000004111d2935414c56606a727f8c949ea8a89e938a7e71695f544a3f352b20160c00000000000008131e29323e45515d676f7c87929fa69fa0958e81746c61574d42362a1e120500000000000000000000000c18232e3946525e69727f8b929b9e9f9e9b959089827b736d6763646b74818e98887b6e6255483b2f22150800000000000000000000000000000000000000000c18232e3946525e69727f8b929b9e9f9e9b959089827b736d6763646b74818e98887b6e6255483b2f2215080000000000000000000a1724313d4a5764707d8a99a3a49a8a7e716453493f33271b0f030000000000000000000000000000000000000000071018242f39434e58616c74818e95a0a9a299928b80786d665c5145382c1f1306000a16232f3b47525b63666c6c6c6c6c6c6c6c67645c52483e332a1f160c00000000000000000000000000030c151d262d33383938332d2e3b4854616e7b87949f978a7e7164574b3e312d2e33372d2c28231d150c030000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e1105000613202c3946535f6c7987868686868686867c6f6255493c2f22160900000714212d3a47535f6975828f9c93877c6f665c5044382b1f1206000c1926323f4c5965727f8c989f9f9f9c8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f383f444e545c606a6f788087909593939184786b5e5145382b1e12050000000000000000000000000a141e2935414c55616c75828f9893948a7d70675d5145392c201306000000000000000000000000000713202d3a4653606d7986939393939393939392867b6e6154473d3221150b0100000000000000000000000000000c18232e394754606a778390939393939393939386796d6053463a2d2013070000000713202c3945525d686f7c879293939393968e81746c61574d42382e23190e04000000000000020c17202935404b55606a727f8c9493939393938a7e71695f53463a2d211407000000000000000000000007121d2a36424d56626d7380898f9292918f8a837d766e69605d5559626f7c89988a7d7063574a3d3024170a000000000000000000000000000000000000000007121d2a36424d56626d7380898f9292918f8a837d766e69605d5559626f7c89988a7d7063574a3d3024170a0000000000000000000e1b2734414e5a6774818d93939393877a6d6154473a2d22170b0000000000000000000000000000000000000000000007121d28313c46505a606d7983909893939393928d82796d6053463a2d2013070007131e2a35404952575960606060606060605a58524a40362c21180d040000000000000000000000000000030b141c22282b2d2b28222f3b4855626e7b889393938b7e7265584b3f322521262a201f1c18120b030000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e020006121f2c3845525e6a757979797979797979766a6054473b2e221508000006121e2b37424d57626f7c89939a9083786d6053463a2d201307000c1926323f4c5965727f8c93939393938f8376695c504336291d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262d333c424a50585f666d737c838686868684786b5e5145382b1e1205000000000000000000000000020c19242f3a43505a616e7b8686868686847a6d6053473a2d201407000000000000000000000000000713202d3a4653606d78868686868686868686868275685e5246392d20140300000000000000000000000000000007121c2b37434e5865727f86868686868686868686786d6053463a2d2013070000000714212d3a4754606d7a848686868686868684796d605a50453b30261c11070000000000000000050e18242f39434e58606c788286868686868686857b6e6155483b2e2215080000000000000000000000000e1925303b44515b636e737d82858684827d78706b625f57514b53606d788686867f7265584c3f3225190c0000000000000000000000000000000000000000000e1925303b44515b636e737d82858684827d78706b625f57514b53606d788686867f7265584c3f3225190c000000000000000000111e2b3844515e6b778486868686868377685e5246392d1b110600000000000000000000000000000000000000000000010c161f2a343e45515c676e7b8586868686868686867a6e6154473b2e21140800020d19242e3740474b4d53535353535353534d4c4740382f241a0f0600000000000000000000000000000000020a11171c1f201f1c222f3c4955626f7c86868686867f7265594c3f322619191d1313100c07000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e1408000004111d2a36424e59636a6c6c6c6c6c6c6c6c6260584e43372b1f13060000020e1a26313c4754606a7581868686867f7265584c3f3225190c000c1926323f4c5965727f868686868686868276695c504336291d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c222830383f444e545c606a6f77797979797872685c5043372a1d11040000000000000000000000000008131e28313e46535f696e7979797979786d675d5145392c2013060000000000000000000000000006121f2c3844505c667679797979797979797979757065564d41362a1e1105000000000000000000000000000000000f1b27323c4a57626d727979797979797979797976665c5044382c1f12060000000713202c3945525d686d7879797979797979776d675d51483e33291e150a0000000000000000000007121d27313c44505b666c7679797979797979786e695f53463a2d21140700000000000000000000000009141f29323f49525c636b707578797875706c656059534d4544505c6674797979726d62564a3e3124180b00000000000000000000000000000000000000000009141f29323f49525c636b707578797875706c656059534d4544505c6674797979726d62564a3e3124180b000000000000000000111d2a37434f5c6772777979797979777167564c41362a1e0a000000000000000000000000000000000000000000000000040d18222934404b555f696e78797979797979797976685e5246392d201407000007121c252e353b3f404646464646464646413f3c362f261d120800000000000000000000000000000000000000060b0f12131215222e3b4754606a767979797979726d63574a3e3125180c11070604000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d020000010e1a26313d4751595e5f6060606060606055544e463c32271b0f0300000009151f2b38434e58656f7579797979726d62564a3e3125180b000b1825313e4a57626d72797979797979797670665a4e4235291c0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171e262e343c424a51585f626a6c6c6c6c6b6860564b3f33271b0f0200000000000000000000000000010c161f2a36424d575f616c6c6c6c6c6b605d554b4035291d11040000000000000000000000000003101c28343f4a545c6c6c6c6c6c6c6c6c6c6c6c69655e54443b3025190e02000000000000000000000000000000000a15202e3a46515b62656c6c6c6c6c6c6c6c6c6c6c5c544a3f34281c100300000004111d2935414c565d606b6c6c6c6c6c6c6c6b605d554b40362c21170c0300000000000000000000010b151f28333f4a545b60696c6c6c6c6c6c6c6c615f574d42362a1e1205000000000000000000000000020d17202d37404952596063686b6c6b6864605b534f47423c3f4a545c6a6c6c6c65625b51463a2e221509000000000000000000000000000000000000000000020d17202d37404952596063686b6c6b6864605b534f47423c3f4a545c6a6c6c6c65625b51463a2e2215090000000000000000000f1b27333f4b5660676b6c6c6c6c6c6a675f55443a3025190d00000000000000000000000000000000000000000000000000060f18232f39434d575f616c6c6c6c6c6c6c6c6c6c5e564c41362a1e11050000000a131c242a2f323339393939393939393433302b241d140b0000000000000000000000000000000000000000000003060606131f2b37434e5860626c6c6c6c6c65635b51463a2e2216090400000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e05000000000915202b353f474e5253535353535353534947433c342b20150a00000000030f1b27323d46535d65686c6c6c6c65625b51463a2e221609000916222e3a46515b62656c6c6c6c6c6c6c69665e54493e3226190d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c141c2328303940444e54555d606060605e5c564e443a2f23170b000000000000000000000000000000040d1a26313b454d53555f606060605e53514b433a2f24180d0100000000000000000000000000000c17232e38424a505f606060606060606060605c5a544c4232291f1408000000000000000000000000000000000004121e29353f49515759606060606060606060605f504a42382e23170c00000000010d1924303a444c52545e606060606060605e53514b433a2f241a0f06000000000000000000000000030d17222d38424a50535d606060606060605f55534d453b31261a0e0200000000000000000000000000050e1b252e3740474f54565c5f5f5e5c57535049413d373138424a50535f6060585651493f34291e120600000000000000000000000000000000000000000000050e1b252e3740474f54565c5f5f5e5c57535049413d373138424a50535f6060585651493f34291e12060000000000000000000b17232e3a444e565c5e60606060605d5b554d4332291e1308000000000000000000000000000000000000000000000000000007121d27313c454d53555f60606060606060605f524c443b3025190e02000000010a12191e2325262d2d2d2d2d2d2d2d2726241f19130b0200000000000000000000000000000000000000000000000000030f1b27323c464e54556060606060595751493f352a1e1206000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d050000000000040f19242d353d424546464646464646463c3b37322b22190f0400000000000a16202b34414b53595b60606060585651493f34291e12060006121e29353f49515759606060606060605c5a544c42382d21160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171e272e343c434749515353535351504b443c32281d12070000000000000000000000000000000009141f29333b4246485253535353514745403a31281d130700000000000000000000000000000006111c2630383f4453535353535353535353534f4d4942393020170d020000000000000000000000000000000000010d18232d373f464a4c5353535353535353535353443f3830261c1106000000000008131e28323a4145475153535353535353514745403a31281d1208000000000000000000000000000006111c262f383f44465053535353535353524846423b33291f140900000000000000000000000000000009131c252e353d4448494f5253514f4a46443f382f2b2630383f44465353534c4a463f372d23180d01000000000000000000000000000000000000000000000009131c252e353d4448494f5253514f4a46443f382f2b2630383f44465353534c4a463f372d23180d0100000000000000000006121d28323c444b4f515353535353504f4a433b3120170d020000000000000000000000000000000000000000000000000000010b151f2a333c4246485253535353535353535346413b32291e1408000000000000070d1316191a20202020202020201a1a17130e08010000000000000000000000000000000000000000000000000000000a15202b343c43474953535353534c4a463f372d23180d010000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e08020000000000000008121b242b31363839393939393939392f2e2b2720191007000000000000040f19222f3941484d4e535353534c4a463f372d23180d0100010d18232d373f464a4c53535353535353504e49423a31261c1005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c151c232832373b3c444646464645433f3a322a20160c0100000000000000000000000000000000030d17212931363a3b4646464646453a39352f281f160c01000000000000000000000000000000000a151e262e3438464646464646464646464642413d3730271e0e050000000000000000000000000000000000000007111b252d353a3e3f464646464646464646464638342e261e150a000000000000020c1620283035393a4546464646464646443a39352f281f160c000000000000000000000000000000000a141d262d3338394346464646464646453b3a36312921170d03000000000000000000000000000000010a131c232b33383c3d42454645423d3937332d261d1e262e34383a4646463f3e3a342d251b1106000000000000000000000000000000000000000000000000010a131c232b33383c3d42454645423d3937332d261d1e262e34383a4646463f3e3a342d251b110600000000000000000000010c16202a323a3f4344464646464644423e3931291f0e0500000000000000000000000000000000000000000000000000000000030d18212a31373a3b4546464646464646463b3936302920170d020000000000000002070a0c0d13131313131313130e0d0b07030000000000000000000000000000000000000000000000000000000000040e19222b32373b3c46464646463f3e3a352d251c11070000000000000000000000000000000000000000000000000000000002050708121313131313131313080705020000000000000000000009121920262a2c2c2d2d2d2d2d2d2d22221f1b150f07000000000000000007101d272f373d4042464646463f3e3a342d251b110700000007111b252d353a3e3f4646464646464643423e3831281f150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b121820262b2e2f37393939393837332f2820180f05000000000000000000000000000000000000060f171f262a2d2e3939393939382d2c29241d160d040000000000000000000000000000000000030c151c23282c39393939393939393939393635312c261e150c0000000000000000000000000000000000000000000a131b23292e313239393939393939393939392c28231c150c0300000000000000040e161e24292c2d3839393939393939382d2c29241d160d0400000000000000000000000000000000020b141c22282b2d3639393939393939392e2d2a261f170f060000000000000000000000000000000000010a111921272c2f303538393835312d2b27221b14151c23282c2d39393932312e29231b13090000000000000000000000000000000000000000000000000000010a111921272c2f303538393835312d2b27221b14151c23282c2d39393932312e29231b1309000000000000000000000000040e1820282e33373839393939393736332e271f170d000000000000000000000000000000000000000000000000000000000000060f181f262b2d2e3939393939393939392e2d2a251e170e05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101920272b2e2f393939393932312e2a231c130a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f151a1d1f20202020202020201615130f0a04000000000000000000000b151d252c3134353939393932312e29231b130900000000000a131b23292e3132393939393939393635322d261f160d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c151b1f22222a2d2d2d2d2b2a27231d160f060000000000000000000000000000000000000000060d141a1e21222c2d2d2d2d2b20201d18130c0400000000000000000000000000000000000000030a11171c1f2d2d2d2d2d2d2d2d2d2d2d292825211b140c03000000000000000000000000000000000000000000010a11181e2225262d2d2d2d2d2d2d2d2d2d2d1f1c17110a03000000000000000000040c13191d20212b2d2d2d2d2d2d2d2b20201d18130c04000000000000000000000000000000000000020a11171c1f202a2d2d2d2d2d2d2d2c22211e1a140d060000000000000000000000000000000000000000070f161c202223292c2c2b2924201f1b17110a0a11171c1f202c2d2d2524221e1811090100000000000000000000000000000000000000000000000000000000070f161c202223292c2c2b2924201f1b17110a0a11171c1f202c2d2d2524221e1811090100000000000000000000000000060e161d23272a2b2d2d2d2d2d2a2926221c150d0500000000000000000000000000000000000000000000000000000000000000060e141a1e21222c2d2d2d2d2d2d2d2d21201e19140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e151b1f22222d2d2d2d2d2625221e18110a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e1112131313131313131309080603000000000000000000000000030b131a202427282d2d2d2d2525221e181109010000000000010a11181e2225262d2d2d2d2d2d2d292926211c150d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315161e202020201e1d1b17120c050000000000000000000000000000000000000000000003090e1214151f202020201e1413110d070100000000000000000000000000000000000000000000060c101220202020202020202020201c1b1915100902000000000000000000000000000000000000000000000000070d12161819202020202020202020202012100c0600000000000000000000000002080d1113141e202020202020201e1413110d0701000000000000000000000000000000000000000000060b0f12131d202020202020201f1514120e090300000000000000000000000000000000000000000000050b101316161c1f201e1c1713120f0b060000060c101213202020191815120d0600000000000000000000000000000000000000000000000000000000000000050b101316161c1f201e1c1713120f0b060000060c101213202020191815120d0600000000000000000000000000000000040c12171b1d1e20202020201d1d1a16110b0300000000000000000000000000000000000000000000000000000000000000000003090e1214151f20202020202020201414110e0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315162020202020191816120d0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001090f14181b1b20202020191816120d07000000000000000000070d12161819202020202020201d1c1916100a0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060809111313131312110f0b07010000000000000000000000000000000000000000000000000002050708131313131312070604010000000000000000000000000000000000000000000000000000030613131313131313131313130f0f0d09040000000000000000000000000000000000000000000000000000000106090b0c13131313131313131313130603000000000000000000000000000000000104070712131313131313131107060401000000000000000000000000000000000000000000000000000306061013131313131313120807050200000000000000000000000000000000000000000000000000000407090a0f1213120f0a0605030000000000000306071313130c0b090601000000000000000000000000000000000000000000000000000000000000000000000407090a0f1213120f0a0605030000000000000306071313130c0b09060100000000000000000000000000000000000001060b0f1111131313131311100e0a06000000000000000000000000000000000000000000000000000000000000000000000000000205070812131313131313131308070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306080913131313130c0c09060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004080c0e0f131313130c0b09060100000000000000000000000106090b0c13131313131313100f0d0a05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + m_StreamData: + offset: 0 + size: 0 + path: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta new file mode 100755 index 000000000..66e69d188 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8f586378b4e144a9851e7b34d9b748ee +timeCreated: 1484171803 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt b/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt new file mode 100755 index 000000000..a52cc38f7 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt @@ -0,0 +1 @@ +)]}〕〉》」』】〙〗〟’”⦆»ヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻‐゠–〜?!‼⁇⁈⁉・、%,.:;。!?]):;=}¢°"†‡℃〆%,. \ No newline at end of file diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta new file mode 100755 index 000000000..73ed66049 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fade42e8bc714b018fac513c043d323b +timeCreated: 1425440388 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt b/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt new file mode 100755 index 000000000..ccbb4aedc --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt @@ -0,0 +1 @@ +([{〔〈《「『【〘〖〝‘“⦅«$—…‥〳〴〵\[({£¥"々〇$¥₩ # \ No newline at end of file diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta new file mode 100755 index 000000000..cc684b308 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d82c1b31c7e74239bff1220585707d2b +timeCreated: 1425440388 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets.meta new file mode 100755 index 000000000..5171f1b68 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 512a49d95c0c4332bdd98131869c23c9 +folderAsset: yes +timeCreated: 1441876896 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset b/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset new file mode 100755 index 000000000..98e6d2771 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset @@ -0,0 +1,659 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2103686 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: TextMeshPro/Sprite + m_Shader: {fileID: 4800000, guid: cf81c85f95fe47e1a27f6ae460cf182c, type: 3} + m_ShaderKeywords: UNITY_UI_CLIP_RECT + m_LightmapFlags: 5 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _MainTex: + m_Texture: {fileID: 2800000, guid: dffef66376be4fa480fb02b19edbe903, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _ColorMask: 15 + - _CullMode: 0 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _UseUIAlphaClip: 0 + m_Colors: + - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} + - _Color: {r: 1, g: 1, b: 1, a: 1} +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 84a92b25f83d49b9bc132d206b370281, type: 3} + m_Name: EmojiOne + m_EditorClassIdentifier: + hashCode: -1836805472 + material: {fileID: 2103686} + materialHashCode: 0 + m_Version: 1.1.0 + m_FaceInfo: + m_FamilyName: + m_StyleName: + m_PointSize: 0 + m_Scale: 0 + m_LineHeight: 0 + m_AscentLine: 0 + m_CapLine: 0 + m_MeanLine: 0 + m_Baseline: 0 + m_DescentLine: 0 + m_SuperscriptOffset: 0 + m_SuperscriptSize: 0 + m_SubscriptOffset: 0 + m_SubscriptSize: 0 + m_UnderlineOffset: 0 + m_UnderlineThickness: 0 + m_StrikethroughOffset: 0 + m_StrikethroughThickness: 0 + m_TabWidth: 0 + spriteSheet: {fileID: 2800000, guid: dffef66376be4fa480fb02b19edbe903, type: 3} + m_SpriteCharacterTable: + - m_ElementType: 2 + m_Unicode: 128522 + m_GlyphIndex: 0 + m_Scale: 1 + m_Name: Smiling face with smiling eyes + m_HashCode: -1318250903 + - m_ElementType: 2 + m_Unicode: 128523 + m_GlyphIndex: 1 + m_Scale: 1 + m_Name: 1f60b + m_HashCode: 57188339 + - m_ElementType: 2 + m_Unicode: 128525 + m_GlyphIndex: 2 + m_Scale: 1 + m_Name: 1f60d + m_HashCode: 57188341 + - m_ElementType: 2 + m_Unicode: 128526 + m_GlyphIndex: 3 + m_Scale: 1 + m_Name: 1f60e + m_HashCode: 57188340 + - m_ElementType: 2 + m_Unicode: 128512 + m_GlyphIndex: 4 + m_Scale: 1 + m_Name: Grinning face + m_HashCode: -95541379 + - m_ElementType: 2 + m_Unicode: 128513 + m_GlyphIndex: 5 + m_Scale: 1 + m_Name: 1f601 + m_HashCode: 57188256 + - m_ElementType: 2 + m_Unicode: 128514 + m_GlyphIndex: 6 + m_Scale: 1 + m_Name: Face with tears of joy + m_HashCode: 239522663 + - m_ElementType: 2 + m_Unicode: 128515 + m_GlyphIndex: 7 + m_Scale: 1 + m_Name: 1f603 + m_HashCode: 57188258 + - m_ElementType: 2 + m_Unicode: 128516 + m_GlyphIndex: 8 + m_Scale: 1 + m_Name: 1f604 + m_HashCode: 57188261 + - m_ElementType: 2 + m_Unicode: 128517 + m_GlyphIndex: 9 + m_Scale: 1 + m_Name: 1f605 + m_HashCode: 57188260 + - m_ElementType: 2 + m_Unicode: 128518 + m_GlyphIndex: 10 + m_Scale: 1 + m_Name: 1f606 + m_HashCode: 57188263 + - m_ElementType: 2 + m_Unicode: 128521 + m_GlyphIndex: 11 + m_Scale: 1 + m_Name: 1f609 + m_HashCode: 57188264 + - m_ElementType: 2 + m_Unicode: 0 + m_GlyphIndex: 12 + m_Scale: 1 + m_Name: .notdef + m_HashCode: -600915428 + - m_ElementType: 2 + m_Unicode: 129315 + m_GlyphIndex: 13 + m_Scale: 1 + m_Name: 1f923 + m_HashCode: 57200239 + - m_ElementType: 2 + m_Unicode: 9786 + m_GlyphIndex: 14 + m_Scale: 1 + m_Name: 263a + m_HashCode: 1748406 + - m_ElementType: 2 + m_Unicode: 9785 + m_GlyphIndex: 15 + m_Scale: 1 + m_Name: 2639 + m_HashCode: 1748462 + m_SpriteGlyphTable: + - m_Index: 0 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 0 + m_Y: 384 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 1 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 128 + m_Y: 384 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 2 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 256 + m_Y: 384 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 3 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 384 + m_Y: 384 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 4 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 0 + m_Y: 256 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 5 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 128 + m_Y: 256 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 6 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 256 + m_Y: 256 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 7 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 384 + m_Y: 256 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 8 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 0 + m_Y: 128 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 9 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 128 + m_Y: 128 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 10 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 256 + m_Y: 128 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 11 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 384 + m_Y: 128 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 12 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 13 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 128 + m_Y: 0 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 14 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 256 + m_Y: 0 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + - m_Index: 15 + m_Metrics: + m_Width: 128 + m_Height: 128 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 115.6 + m_HorizontalAdvance: 128 + m_GlyphRect: + m_X: 384 + m_Y: 0 + m_Width: 128 + m_Height: 128 + m_Scale: 1 + m_AtlasIndex: 0 + sprite: {fileID: 0} + spriteInfoList: + - id: 0 + x: 0 + y: 384 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: Smiling face with smiling eyes + hashCode: -1318250903 + unicode: 128522 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 1 + x: 128 + y: 384 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 1f60b + hashCode: 57188339 + unicode: 128523 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 2 + x: 256 + y: 384 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 1f60d + hashCode: 57188341 + unicode: 128525 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 3 + x: 384 + y: 384 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 1f60e + hashCode: 57188340 + unicode: 128526 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 4 + x: 0 + y: 256 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: Grinning face + hashCode: -95541379 + unicode: 128512 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 5 + x: 128 + y: 256 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 1f601 + hashCode: 57188256 + unicode: 128513 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 6 + x: 256 + y: 256 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: Face with tears of joy + hashCode: 239522663 + unicode: 128514 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 7 + x: 384 + y: 256 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 1f603 + hashCode: 57188258 + unicode: 128515 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 8 + x: 0 + y: 128 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 1f604 + hashCode: 57188261 + unicode: 128516 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 9 + x: 128 + y: 128 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 1f605 + hashCode: 57188260 + unicode: 128517 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 10 + x: 256 + y: 128 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 1f606 + hashCode: 57188263 + unicode: 128518 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 11 + x: 384 + y: 128 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 1f609 + hashCode: 57188264 + unicode: 128521 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 12 + x: 0 + y: 0 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 1f618 + hashCode: 57188168 + unicode: 128536 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 13 + x: 128 + y: 0 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 1f923 + hashCode: 57200239 + unicode: 129315 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 14 + x: 256 + y: 0 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 263a + hashCode: 1748406 + unicode: 9786 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + - id: 15 + x: 384 + y: 0 + width: 128 + height: 128 + xOffset: 0 + yOffset: 115.6 + xAdvance: 128 + scale: 1 + name: 2639 + hashCode: 1748462 + unicode: 9785 + pivot: {x: 0.5, y: 0.5} + sprite: {fileID: 0} + fallbackSpriteAssets: [] +--- !u!21 &1369835458 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: TextMeshPro/Sprite + m_Shader: {fileID: 4800000, guid: cf81c85f95fe47e1a27f6ae460cf182c, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: [] + m_Floats: [] + m_Colors: [] diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta new file mode 100755 index 000000000..c7ac83f4d --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c41005c129ba4d66911b75229fd70b45 +timeCreated: 1480316912 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets.meta new file mode 100755 index 000000000..4958550d9 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4aecb92fff08436c8303b10eab8da368 +folderAsset: yes +timeCreated: 1441876950 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset b/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset new file mode 100755 index 000000000..ceb609b29 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset @@ -0,0 +1,68 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ab2114bdc8544297b417dfefe9f1e410, type: 3} + m_Name: Default Style Sheet + m_EditorClassIdentifier: + m_StyleList: + - m_Name: H1 + m_HashCode: 2425 + m_OpeningDefinition: <#40ff80>* + m_ClosingDefinition: '*' + m_OpeningTagArray: 3c00000073000000690000007a000000650000003d00000032000000650000006d0000003e0000003c000000620000003e0000003c000000230000003400000030000000660000006600000038000000300000003e0000002a000000 + m_ClosingTagArray: 2a0000003c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e000000 + - m_Name: Quote + m_HashCode: 92254330 + m_OpeningDefinition: + m_ClosingDefinition: + m_OpeningTagArray: 3c000000690000003e0000003c00000073000000690000007a000000650000003d0000003700000035000000250000003e0000003c0000006d000000610000007200000067000000690000006e0000003d0000003100000030000000250000003e000000 + m_ClosingTagArray: 3c0000002f000000690000003e0000003c0000002f00000073000000690000007a000000650000003e0000003c0000002f00000077000000690000006400000074000000680000003e0000003c0000002f0000006d000000610000007200000067000000690000006e0000003e000000 + - m_Name: Link + m_HashCode: 2687968 + m_OpeningDefinition: <#40a0ff> + m_ClosingDefinition: + m_OpeningTagArray: 3c000000750000003e0000003c000000230000003400000030000000610000003000000066000000660000003e0000003c0000006c000000690000006e0000006b0000003d0000002200000049000000440000005f0000003000000031000000220000003e000000 + m_ClosingTagArray: 3c0000002f000000750000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e0000003c0000002f0000006c000000690000006e0000006b0000003e000000 + - m_Name: Title + m_HashCode: 98732960 + m_OpeningDefinition: + m_ClosingDefinition: + m_OpeningTagArray: 3c00000073000000690000007a000000650000003d000000310000003200000035000000250000003e0000003c000000620000003e0000003c000000610000006c00000069000000670000006e0000003d00000063000000650000006e0000007400000065000000720000003e000000 + m_ClosingTagArray: 3c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000610000006c00000069000000670000006e0000003e000000 + - m_Name: H2 + m_HashCode: 2426 + m_OpeningDefinition: <#4080FF> + m_ClosingDefinition: + m_OpeningTagArray: 3c00000073000000690000007a000000650000003d000000310000002e00000035000000650000006d0000003e0000003c000000620000003e0000003c000000230000003400000030000000380000003000000046000000460000003e000000 + m_ClosingTagArray: 3c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e000000 + - m_Name: H3 + m_HashCode: 2427 + m_OpeningDefinition: <#FF8040> + m_ClosingDefinition: + m_OpeningTagArray: 3c00000073000000690000007a000000650000003d000000310000002e0000003100000037000000650000006d0000003e0000003c000000620000003e0000003c000000230000004600000046000000380000003000000034000000300000003e000000 + m_ClosingTagArray: 3c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e000000 + - m_Name: C1 + m_HashCode: 2194 + m_OpeningDefinition: + m_ClosingDefinition: + m_OpeningTagArray: 3c000000630000006f0000006c0000006f000000720000003d000000230000006600000066000000660000006600000034000000300000003e000000 + m_ClosingTagArray: 3c0000002f000000630000006f0000006c0000006f000000720000003e000000 + - m_Name: C2 + m_HashCode: 2193 + m_OpeningDefinition: + m_ClosingDefinition: + m_OpeningTagArray: 3c000000630000006f0000006c0000006f000000720000003d000000230000006600000066000000340000003000000046000000460000003e0000003c00000073000000690000007a000000650000003d000000310000003200000035000000250000003e000000 + m_ClosingTagArray: 3c0000002f000000630000006f0000006c0000006f000000720000003e0000003c0000002f00000073000000690000007a000000650000003e000000 + - m_Name: C3 + m_HashCode: 2192 + m_OpeningDefinition: + m_ClosingDefinition: + m_OpeningTagArray: 3c000000630000006f0000006c0000006f000000720000003d000000230000003800000030000000410000003000000046000000460000003e0000003c000000620000003e000000 + m_ClosingTagArray: 3c0000002f000000630000006f0000006c0000006f000000720000003e0000003c0000002f000000620000003e000000 diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta new file mode 100755 index 000000000..95fd96ed4 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f952c082cb03451daed3ee968ac6c63e +timeCreated: 1432805430 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset b/BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset new file mode 100755 index 000000000..c09a92f1c --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset @@ -0,0 +1,46 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2705215ac5b84b70bacc50632be6e391, type: 3} + m_Name: TMP Settings + m_EditorClassIdentifier: + m_enableWordWrapping: 1 + m_enableKerning: 1 + m_enableExtraPadding: 0 + m_enableTintAllSprites: 0 + m_enableParseEscapeCharacters: 1 + m_EnableRaycastTarget: 1 + m_GetFontFeaturesAtRuntime: 1 + m_missingGlyphCharacter: 0 + m_warningsDisabled: 0 + m_defaultFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_defaultFontAssetPath: Fonts & Materials/ + m_defaultFontSize: 36 + m_defaultAutoSizeMinRatio: 0.5 + m_defaultAutoSizeMaxRatio: 2 + m_defaultTextMeshProTextContainerSize: {x: 20, y: 5} + m_defaultTextMeshProUITextContainerSize: {x: 200, y: 50} + m_autoSizeTextContainer: 0 + m_fallbackFontAssets: [] + m_matchMaterialPreset: 1 + m_defaultSpriteAsset: {fileID: 11400000, guid: c41005c129ba4d66911b75229fd70b45, + type: 2} + m_defaultSpriteAssetPath: Sprite Assets/ + m_enableEmojiSupport: 1 + m_MissingCharacterSpriteUnicode: 0 + m_defaultColorGradientPresetsPath: Color Gradient Presets/ + m_defaultStyleSheet: {fileID: 11400000, guid: f952c082cb03451daed3ee968ac6c63e, + type: 2} + m_StyleSheetsResourcePath: + m_leadingCharacters: {fileID: 4900000, guid: d82c1b31c7e74239bff1220585707d2b, type: 3} + m_followingCharacters: {fileID: 4900000, guid: fade42e8bc714b018fac513c043d323b, + type: 3} + m_UseModernHangulLineBreakingRules: 0 diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta b/BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta new file mode 100755 index 000000000..32db3845d --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3f5b5dff67a942289a9defa416b206f3 +timeCreated: 1436653997 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders.meta new file mode 100755 index 000000000..29a90a6a6 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e9f693669af91aa45ad615fc681ed29f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader new file mode 100755 index 000000000..bab2b2c67 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader @@ -0,0 +1,143 @@ +Shader "TextMeshPro/Bitmap Custom Atlas" { + +Properties { + _MainTex ("Font Atlas", 2D) = "white" {} + _FaceTex ("Font Texture", 2D) = "white" {} + [HDR]_FaceColor ("Text Color", Color) = (1,1,1,1) + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 + + _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _Padding ("Padding", float) = 0 + + _StencilComp("Stencil Comparison", Float) = 8 + _Stencil("Stencil ID", Float) = 0 + _StencilOp("Stencil Operation", Float) = 0 + _StencilWriteMask("Stencil Write Mask", Float) = 255 + _StencilReadMask("Stencil Read Mask", Float) = 255 + + _CullMode("Cull Mode", Float) = 0 + _ColorMask("Color Mask", Float) = 15 +} + +SubShader{ + + Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + + Stencil + { + Ref[_Stencil] + Comp[_StencilComp] + Pass[_StencilOp] + ReadMask[_StencilReadMask] + WriteMask[_StencilWriteMask] + } + + + Lighting Off + Cull [_CullMode] + ZTest [unity_GUIZTestMode] + ZWrite Off + Fog { Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + ColorMask[_ColorMask] + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + + #include "UnityCG.cginc" + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + float4 mask : TEXCOORD2; + }; + + uniform sampler2D _MainTex; + uniform sampler2D _FaceTex; + uniform float4 _FaceTex_ST; + uniform fixed4 _FaceColor; + + uniform float _VertexOffsetX; + uniform float _VertexOffsetY; + uniform float4 _ClipRect; + uniform float _MaskSoftnessX; + uniform float _MaskSoftnessY; + + float2 UnpackUV(float uv) + { + float2 output; + output.x = floor(uv / 4096); + output.y = uv - 4096 * output.x; + + return output * 0.001953125; + } + + v2f vert (appdata_t v) + { + float4 vert = v.vertex; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + + vert.xy += (vert.w * 0.5) / _ScreenParams.xy; + + float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert)); + + fixed4 faceColor = v.color; + faceColor *= _FaceColor; + + v2f OUT; + OUT.vertex = vPosition; + OUT.color = faceColor; + OUT.texcoord0 = v.texcoord0; + OUT.texcoord1 = TRANSFORM_TEX(UnpackUV(v.texcoord1), _FaceTex); + float2 pixelSize = vPosition.w; + pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1])); + + // Clamp _ClipRect to 16bit. + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + + return OUT; + } + + fixed4 frag (v2f IN) : SV_Target + { + fixed4 color = tex2D(_MainTex, IN.texcoord0) * tex2D(_FaceTex, IN.texcoord1) * IN.color; + + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw); + color *= m.x * m.y; + #endif + + #if UNITY_UI_ALPHACLIP + clip(color.a - 0.001); + #endif + + return color; + } + ENDCG + } +} + + CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI" +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta new file mode 100755 index 000000000..0a416c85b --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 48bb5f55d8670e349b6e614913f9d910 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader new file mode 100755 index 000000000..006a271ee --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader @@ -0,0 +1,145 @@ +Shader "TextMeshPro/Mobile/Bitmap" { + +Properties { + _MainTex ("Font Atlas", 2D) = "white" {} + [HDR]_Color ("Text Color", Color) = (1,1,1,1) + _DiffusePower ("Diffuse Power", Range(1.0,4.0)) = 1.0 + + _VertexOffsetX("Vertex OffsetX", float) = 0 + _VertexOffsetY("Vertex OffsetY", float) = 0 + _MaskSoftnessX("Mask SoftnessX", float) = 0 + _MaskSoftnessY("Mask SoftnessY", float) = 0 + + _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + + _StencilComp("Stencil Comparison", Float) = 8 + _Stencil("Stencil ID", Float) = 0 + _StencilOp("Stencil Operation", Float) = 0 + _StencilWriteMask("Stencil Write Mask", Float) = 255 + _StencilReadMask("Stencil Read Mask", Float) = 255 + + _CullMode("Cull Mode", Float) = 0 + _ColorMask("Color Mask", Float) = 15 +} + +SubShader { + + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + + Stencil + { + Ref[_Stencil] + Comp[_StencilComp] + Pass[_StencilOp] + ReadMask[_StencilReadMask] + WriteMask[_StencilWriteMask] + } + + + Lighting Off + Cull [_CullMode] + ZTest [unity_GUIZTestMode] + ZWrite Off + Fog { Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + ColorMask[_ColorMask] + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma fragmentoption ARB_precision_hint_fastest + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + + #include "UnityCG.cginc" + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + struct v2f { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float4 mask : TEXCOORD2; + }; + + sampler2D _MainTex; + fixed4 _Color; + float _DiffusePower; + + uniform float _VertexOffsetX; + uniform float _VertexOffsetY; + uniform float4 _ClipRect; + uniform float _MaskSoftnessX; + uniform float _MaskSoftnessY; + + v2f vert (appdata_t v) + { + v2f OUT; + float4 vert = v.vertex; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + + vert.xy += (vert.w * 0.5) / _ScreenParams.xy; + + OUT.vertex = UnityPixelSnap(UnityObjectToClipPos(vert)); + OUT.color = v.color; + OUT.color *= _Color; + OUT.color.rgb *= _DiffusePower; + OUT.texcoord0 = v.texcoord0; + + float2 pixelSize = OUT.vertex.w; + //pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1])); + + // Clamp _ClipRect to 16bit. + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + + return OUT; + } + + fixed4 frag (v2f IN) : COLOR + { + fixed4 color = fixed4(IN.color.rgb, IN.color.a * tex2D(_MainTex, IN.texcoord0).a); + + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw); + color *= m.x * m.y; + #endif + + #if UNITY_UI_ALPHACLIP + clip(color.a - 0.001); + #endif + + return color; + } + ENDCG + } +} + +SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Lighting Off Cull Off ZTest Always ZWrite Off Fog { Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + BindChannels { + Bind "Color", color + Bind "Vertex", vertex + Bind "TexCoord", texcoord0 + } + Pass { + SetTexture [_MainTex] { + constantColor [_Color] combine constant * primary, constant * texture + } + } +} + +CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI" +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta new file mode 100755 index 000000000..d5fb125e1 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1e3b057af24249748ff873be7fafee47 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader new file mode 100755 index 000000000..8ce4937a0 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader @@ -0,0 +1,143 @@ +Shader "TextMeshPro/Bitmap" { + +Properties { + _MainTex ("Font Atlas", 2D) = "white" {} + _FaceTex ("Font Texture", 2D) = "white" {} + [HDR]_FaceColor ("Text Color", Color) = (1,1,1,1) + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 + + _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + + _StencilComp("Stencil Comparison", Float) = 8 + _Stencil("Stencil ID", Float) = 0 + _StencilOp("Stencil Operation", Float) = 0 + _StencilWriteMask("Stencil Write Mask", Float) = 255 + _StencilReadMask("Stencil Read Mask", Float) = 255 + + _CullMode("Cull Mode", Float) = 0 + _ColorMask("Color Mask", Float) = 15 +} + +SubShader{ + + Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + + Stencil + { + Ref[_Stencil] + Comp[_StencilComp] + Pass[_StencilOp] + ReadMask[_StencilReadMask] + WriteMask[_StencilWriteMask] + } + + + Lighting Off + Cull [_CullMode] + ZTest [unity_GUIZTestMode] + ZWrite Off + Fog { Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + ColorMask[_ColorMask] + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + + #include "UnityCG.cginc" + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + float4 mask : TEXCOORD2; + }; + + uniform sampler2D _MainTex; + uniform sampler2D _FaceTex; + uniform float4 _FaceTex_ST; + uniform fixed4 _FaceColor; + + uniform float _VertexOffsetX; + uniform float _VertexOffsetY; + uniform float4 _ClipRect; + uniform float _MaskSoftnessX; + uniform float _MaskSoftnessY; + + float2 UnpackUV(float uv) + { + float2 output; + output.x = floor(uv / 4096); + output.y = uv - 4096 * output.x; + + return output * 0.001953125; + } + + v2f vert (appdata_t v) + { + float4 vert = v.vertex; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + + vert.xy += (vert.w * 0.5) / _ScreenParams.xy; + + float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert)); + + fixed4 faceColor = v.color; + faceColor *= _FaceColor; + + v2f OUT; + OUT.vertex = vPosition; + OUT.color = faceColor; + OUT.texcoord0 = v.texcoord0; + OUT.texcoord1 = TRANSFORM_TEX(UnpackUV(v.texcoord1), _FaceTex); + float2 pixelSize = vPosition.w; + pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1])); + + // Clamp _ClipRect to 16bit. + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + + return OUT; + } + + fixed4 frag (v2f IN) : SV_Target + { + fixed4 color = tex2D(_MainTex, IN.texcoord0); + color = fixed4 (tex2D(_FaceTex, IN.texcoord1).rgb * IN.color.rgb, IN.color.a * color.a); + + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw); + color *= m.x * m.y; + #endif + + #if UNITY_UI_ALPHACLIP + clip(color.a - 0.001); + #endif + + return color; + } + ENDCG + } +} + + CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI" +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta new file mode 100755 index 000000000..7eb1870f8 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 128e987d567d4e2c824d754223b3f3b0 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader new file mode 100755 index 000000000..c50c5930d --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader @@ -0,0 +1,317 @@ +Shader "TextMeshPro/Distance Field Overlay" { + +Properties { + _FaceTex ("Face Texture", 2D) = "white" {} + _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0 + _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0 + [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceDilate ("Face Dilate", Range(-1,1)) = 0 + + [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineTex ("Outline Texture", 2D) = "white" {} + _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0 + _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0 + _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0 + _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 + + _Bevel ("Bevel", Range(0,1)) = 0.5 + _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0 + _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0 + _BevelClamp ("Bevel Clamp", Range(0,1)) = 0 + _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0 + + _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416 + [HDR]_SpecularColor ("Specular", Color) = (1,1,1,1) + _SpecularPower ("Specular", Range(0,4)) = 2.0 + _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10 + _Diffuse ("Diffuse", Range(0,1)) = 0.5 + _Ambient ("Ambient", Range(1,0)) = 0.5 + + _BumpMap ("Normal map", 2D) = "bump" {} + _BumpOutline ("Bump Outline", Range(0,1)) = 0 + _BumpFace ("Bump Face", Range(0,1)) = 0 + + _ReflectFaceColor ("Reflection Color", Color) = (0,0,0,1) + _ReflectOutlineColor("Reflection Color", Color) = (0,0,0,1) + _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ } + _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0) + + + [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0, 0.5) + _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 + _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 + _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 + _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 + + [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) + _GlowOffset ("Offset", Range(-1,1)) = 0 + _GlowInner ("Inner", Range(0,1)) = 0.05 + _GlowOuter ("Outer", Range(0,1)) = 0.05 + _GlowPower ("Falloff", Range(1, 0)) = 0.75 + + _WeightNormal ("Weight Normal", float) = 0 + _WeightBold ("Weight Bold", float) = 0.5 + + _ShaderFlags ("Flags", float) = 0 + _ScaleRatioA ("Scale RatioA", float) = 1 + _ScaleRatioB ("Scale RatioB", float) = 1 + _ScaleRatioC ("Scale RatioC", float) = 1 + + _MainTex ("Font Atlas", 2D) = "white" {} + _TextureWidth ("Texture Width", float) = 512 + _TextureHeight ("Texture Height", float) = 512 + _GradientScale ("Gradient Scale", float) = 5.0 + _ScaleX ("Scale X", float) = 1.0 + _ScaleY ("Scale Y", float) = 1.0 + _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 + _Sharpness ("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + + _MaskCoord ("Mask Coordinates", vector) = (0, 0, 32767, 32767) + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 +} + +SubShader { + + Tags + { + "Queue"="Overlay" + "IgnoreProjector"="True" + "RenderType"="Transparent" + } + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull [_CullMode] + ZWrite Off + Lighting Off + Fog { Mode Off } + ZTest Always + Blend One OneMinusSrcAlpha + ColorMask [_ColorMask] + + Pass { + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertShader + #pragma fragment PixShader + #pragma shader_feature __ BEVEL_ON + #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER + #pragma shader_feature __ GLOW_ON + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + #include "TMPro_Properties.cginc" + #include "TMPro.cginc" + + struct vertex_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + float4 position : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + + struct pixel_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + float4 position : SV_POSITION; + fixed4 color : COLOR; + float2 atlas : TEXCOORD0; // Atlas + float4 param : TEXCOORD1; // alphaClip, scale, bias, weight + float4 mask : TEXCOORD2; // Position in object space(xy), pixel Size(zw) + float3 viewDir : TEXCOORD3; + + #if (UNDERLAY_ON || UNDERLAY_INNER) + float4 texcoord2 : TEXCOORD4; // u,v, scale, bias + fixed4 underlayColor : COLOR1; + #endif + float4 textures : TEXCOORD5; + }; + + // Used by Unity internally to handle Texture Tiling and Offset. + float4 _FaceTex_ST; + float4 _OutlineTex_ST; + + pixel_t VertShader(vertex_t input) + { + pixel_t output; + + UNITY_INITIALIZE_OUTPUT(pixel_t, output); + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input,output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + float bold = step(input.texcoord1.y, 0); + + float4 vert = input.position; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + + float4 vPosition = UnityObjectToClipPos(vert); + + float2 pixelSize = vPosition.w; + pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); + float scale = rsqrt(dot(pixelSize, pixelSize)); + scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); + if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); + + float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; + weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; + + float bias =(.5 - weight) + (.5 / scale); + + float alphaClip = (1.0 - _OutlineWidth*_ScaleRatioA - _OutlineSoftness*_ScaleRatioA); + + #if GLOW_ON + alphaClip = min(alphaClip, 1.0 - _GlowOffset * _ScaleRatioB - _GlowOuter * _ScaleRatioB); + #endif + + alphaClip = alphaClip / 2.0 - ( .5 / scale) - weight; + + #if (UNDERLAY_ON || UNDERLAY_INNER) + float4 underlayColor = _UnderlayColor; + underlayColor.rgb *= underlayColor.a; + + float bScale = scale; + bScale /= 1 + ((_UnderlaySoftness*_ScaleRatioC) * bScale); + float bBias = (0.5 - weight) * bScale - 0.5 - ((_UnderlayDilate * _ScaleRatioC) * 0.5 * bScale); + + float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; + float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; + float2 bOffset = float2(x, y); + #endif + + // Generate UV for the Masking Texture + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); + + // Support for texture tiling and offset + float2 textureUV = UnpackUV(input.texcoord1.x); + float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex); + float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex); + + + output.position = vPosition; + output.color = input.color; + output.atlas = input.texcoord0; + output.param = float4(alphaClip, scale, bias, weight); + output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + output.viewDir = mul((float3x3)_EnvMatrix, _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz); + #if (UNDERLAY_ON || UNDERLAY_INNER) + output.texcoord2 = float4(input.texcoord0 + bOffset, bScale, bBias); + output.underlayColor = underlayColor; + #endif + output.textures = float4(faceUV, outlineUV); + + return output; + } + + + fixed4 PixShader(pixel_t input) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(input); + + float c = tex2D(_MainTex, input.atlas).a; + + #ifndef UNDERLAY_ON + clip(c - input.param.x); + #endif + + float scale = input.param.y; + float bias = input.param.z; + float weight = input.param.w; + float sd = (bias - c) * scale; + + float outline = (_OutlineWidth * _ScaleRatioA) * scale; + float softness = (_OutlineSoftness * _ScaleRatioA) * scale; + + half4 faceColor = _FaceColor; + half4 outlineColor = _OutlineColor; + + faceColor.rgb *= input.color.rgb; + + faceColor *= tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y); + outlineColor *= tex2D(_OutlineTex, input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y); + + faceColor = GetColor(sd, faceColor, outlineColor, outline, softness); + + #if BEVEL_ON + float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0); + float3 n = GetSurfaceNormal(input.atlas, weight, dxy); + + float3 bump = UnpackNormal(tex2D(_BumpMap, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y)).xyz; + bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5)); + n = normalize(n- bump); + + float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), -1.0)); + + float3 col = GetSpecular(n, light); + faceColor.rgb += col*faceColor.a; + faceColor.rgb *= 1-(dot(n, light)*_Diffuse); + faceColor.rgb *= lerp(_Ambient, 1, n.z*n.z); + + fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n)); + faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a; + #endif + + #if UNDERLAY_ON + float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z; + faceColor += input.underlayColor * saturate(d - input.texcoord2.w) * (1 - faceColor.a); + #endif + + #if UNDERLAY_INNER + float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z; + faceColor += input.underlayColor * (1 - saturate(d - input.texcoord2.w)) * saturate(1 - sd) * (1 - faceColor.a); + #endif + + #if GLOW_ON + float4 glowColor = GetGlowColor(sd, scale); + faceColor.rgb += glowColor.rgb * glowColor.a; + #endif + + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); + faceColor *= m.x * m.y; + #endif + + #if UNITY_UI_ALPHACLIP + clip(faceColor.a - 0.001); + #endif + + return faceColor * input.color.a; + } + + ENDCG + } +} + +Fallback "TextMeshPro/Mobile/Distance Field" +CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta new file mode 100755 index 000000000..56284e9fd --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: dd89cf5b9246416f84610a006f916af7 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader new file mode 100755 index 000000000..ed48574d5 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader @@ -0,0 +1,310 @@ +Shader "TextMeshPro/Distance Field SSD" { + +Properties { + _FaceTex ("Face Texture", 2D) = "white" {} + _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0 + _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0 + [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceDilate ("Face Dilate", Range(-1,1)) = 0 + + [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineTex ("Outline Texture", 2D) = "white" {} + _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0 + _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0 + _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0 + _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 + + _Bevel ("Bevel", Range(0,1)) = 0.5 + _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0 + _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0 + _BevelClamp ("Bevel Clamp", Range(0,1)) = 0 + _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0 + + _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416 + [HDR]_SpecularColor ("Specular", Color) = (1,1,1,1) + _SpecularPower ("Specular", Range(0,4)) = 2.0 + _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10 + _Diffuse ("Diffuse", Range(0,1)) = 0.5 + _Ambient ("Ambient", Range(1,0)) = 0.5 + + _BumpMap ("Normal map", 2D) = "bump" {} + _BumpOutline ("Bump Outline", Range(0,1)) = 0 + _BumpFace ("Bump Face", Range(0,1)) = 0 + + _ReflectFaceColor ("Reflection Color", Color) = (0,0,0,1) + _ReflectOutlineColor("Reflection Color", Color) = (0,0,0,1) + _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ } + _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0) + + + [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0, 0.5) + _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 + _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 + _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 + _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 + + [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) + _GlowOffset ("Offset", Range(-1,1)) = 0 + _GlowInner ("Inner", Range(0,1)) = 0.05 + _GlowOuter ("Outer", Range(0,1)) = 0.05 + _GlowPower ("Falloff", Range(1, 0)) = 0.75 + + _WeightNormal ("Weight Normal", float) = 0 + _WeightBold ("Weight Bold", float) = 0.5 + + _ShaderFlags ("Flags", float) = 0 + _ScaleRatioA ("Scale RatioA", float) = 1 + _ScaleRatioB ("Scale RatioB", float) = 1 + _ScaleRatioC ("Scale RatioC", float) = 1 + + _MainTex ("Font Atlas", 2D) = "white" {} + _TextureWidth ("Texture Width", float) = 512 + _TextureHeight ("Texture Height", float) = 512 + _GradientScale ("Gradient Scale", float) = 5.0 + _ScaleX ("Scale X", float) = 1.0 + _ScaleY ("Scale Y", float) = 1.0 + _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 + _Sharpness ("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + + _MaskCoord ("Mask Coordinates", vector) = (0, 0, 32767, 32767) + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 +} + +SubShader { + Tags + { + "Queue" = "Transparent" + "IgnoreProjector" = "True" + "RenderType" = "Transparent" + } + + Stencil + { + Ref[_Stencil] + Comp[_StencilComp] + Pass[_StencilOp] + ReadMask[_StencilReadMask] + WriteMask[_StencilWriteMask] + } + + Cull[_CullMode] + ZWrite Off + Lighting Off + Fog { Mode Off } + ZTest[unity_GUIZTestMode] + Blend One OneMinusSrcAlpha + ColorMask[_ColorMask] + + Pass { + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertShader + #pragma fragment PixShader + #pragma shader_feature __ BEVEL_ON + #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER + #pragma shader_feature __ GLOW_ON + #pragma shader_feature __ FORCE_LINEAR + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + #include "TMPro_Properties.cginc" + #include "TMPro.cginc" + + struct vertex_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + float4 position : POSITION; + float3 normal : NORMAL; + float4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + + struct pixel_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + float4 position : SV_POSITION; + float4 color : COLOR; + float2 atlas : TEXCOORD0; + float weight : TEXCOORD1; + float2 mask : TEXCOORD2; // Position in object space(xy) + float3 viewDir : TEXCOORD3; + + #if (UNDERLAY_ON || UNDERLAY_INNER) + float2 texcoord2 : TEXCOORD4; + float4 underlayColor : COLOR1; + #endif + float4 textures : TEXCOORD5; + }; + + // Used by Unity internally to handle Texture Tiling and Offset. + float4 _FaceTex_ST; + float4 _OutlineTex_ST; + + float4 SRGBToLinear(float4 rgba) { + return float4(lerp(rgba.rgb / 12.92f, pow((rgba.rgb + 0.055f) / 1.055f, 2.4f), step(0.04045f, rgba.rgb)), rgba.a); + } + + pixel_t VertShader(vertex_t input) + { + pixel_t output; + + UNITY_INITIALIZE_OUTPUT(pixel_t, output); + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input,output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + float bold = step(input.texcoord1.y, 0); + + float4 vert = input.position; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + + float4 vPosition = UnityObjectToClipPos(vert); + + float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; + weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; + + #if (UNDERLAY_ON || UNDERLAY_INNER) + float4 underlayColor = _UnderlayColor; + underlayColor.rgb *= underlayColor.a; + + float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; + float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; + float2 bOffset = float2(x, y); + #endif + + // Generate UV for the Masking Texture + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + + // Support for texture tiling and offset + float2 textureUV = UnpackUV(input.texcoord1.x); + float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex); + float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex); + + float4 color = input.color; + #if (FORCE_LINEAR && !UNITY_COLORSPACE_GAMMA) + color = SRGBToLinear(input.color); + #endif + + output.position = vPosition; + output.color = color; + output.atlas = input.texcoord0; + output.weight = weight; + output.mask = half2(vert.xy * 2 - clampedRect.xy - clampedRect.zw); + output.viewDir = mul((float3x3)_EnvMatrix, _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz); + #if (UNDERLAY_ON || UNDERLAY_INNER) + output.texcoord2 = input.texcoord0 + bOffset; + output.underlayColor = underlayColor; + #endif + output.textures = float4(faceUV, outlineUV); + + return output; + } + + + fixed4 PixShader(pixel_t input) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(input); + + float c = tex2D(_MainTex, input.atlas).a; + + float2 pixelSize = float2(ddx(input.atlas.y), ddy(input.atlas.y)); + pixelSize *= _TextureWidth * .75; + float scale = rsqrt(dot(pixelSize, pixelSize)) * _GradientScale * (_Sharpness + 1); + + float weight = input.weight; + float bias = (.5 - weight) + (.5 / scale); + float sd = (bias - c) * scale; + + float outline = (_OutlineWidth * _ScaleRatioA) * scale; + float softness = (_OutlineSoftness * _ScaleRatioA) * scale; + + half4 faceColor = _FaceColor; + half4 outlineColor = _OutlineColor; + + faceColor.rgb *= input.color.rgb; + + faceColor *= tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y); + outlineColor *= tex2D(_OutlineTex, input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y); + + faceColor = GetColor(sd, faceColor, outlineColor, outline, softness); + + #if BEVEL_ON + float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0); + float3 n = GetSurfaceNormal(input.atlas, weight, dxy); + + float3 bump = UnpackNormal(tex2D(_BumpMap, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y)).xyz; + bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5)); + n = normalize(n - bump); + + float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), -1.0)); + + float3 col = GetSpecular(n, light); + faceColor.rgb += col * faceColor.a; + faceColor.rgb *= 1 - (dot(n, light) * _Diffuse); + faceColor.rgb *= lerp(_Ambient, 1, n.z * n.z); + + fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n)); + faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a; + #endif + + #if (UNDERLAY_ON || UNDERLAY_INNER) + float bScale = scale; + bScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * bScale); + float bBias = (0.5 - weight) * bScale - 0.5 - ((_UnderlayDilate * _ScaleRatioC) * 0.5 * bScale); + #endif + + #if UNDERLAY_ON + float d = tex2D(_MainTex, input.texcoord2.xy).a * bScale; + faceColor += input.underlayColor * saturate(d - bBias) * (1 - faceColor.a); + #endif + + #if UNDERLAY_INNER + float d = tex2D(_MainTex, input.texcoord2.xy).a * bScale; + faceColor += input.underlayColor * (1 - saturate(d - bBias)) * saturate(1 - sd) * (1 - faceColor.a); + #endif + + #if GLOW_ON + float4 glowColor = GetGlowColor(sd, scale); + faceColor.rgb += glowColor.rgb * glowColor.a; + #endif + + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT + float2 maskZW = 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + (1 / scale)); + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * maskZW); + faceColor *= m.x * m.y; + #endif + + #if UNITY_UI_ALPHACLIP + clip(faceColor.a - 0.001); + #endif + + return faceColor * input.color.a; + } + + ENDCG + } +} + +Fallback "TextMeshPro/Mobile/Distance Field" +CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta new file mode 100755 index 000000000..08cd8ae5b --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 14eb328de4b8eb245bb7cea29e4ac00b +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader new file mode 100755 index 000000000..7019aaf4b --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader @@ -0,0 +1,247 @@ +// Simplified SDF shader: +// - No Shading Option (bevel / bump / env map) +// - No Glow Option +// - Softness is applied on both side of the outline + +Shader "TextMeshPro/Mobile/Distance Field - Masking" { + +Properties { + [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceDilate ("Face Dilate", Range(-1,1)) = 0 + + [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 + _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 + + [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) + _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 + _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 + _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 + _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 + + _WeightNormal ("Weight Normal", float) = 0 + _WeightBold ("Weight Bold", float) = .5 + + _ShaderFlags ("Flags", float) = 0 + _ScaleRatioA ("Scale RatioA", float) = 1 + _ScaleRatioB ("Scale RatioB", float) = 1 + _ScaleRatioC ("Scale RatioC", float) = 1 + + _MainTex ("Font Atlas", 2D) = "white" {} + _TextureWidth ("Texture Width", float) = 512 + _TextureHeight ("Texture Height", float) = 512 + _GradientScale ("Gradient Scale", float) = 5 + _ScaleX ("Scale X", float) = 1 + _ScaleY ("Scale Y", float) = 1 + _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 + _Sharpness ("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 + _MaskTex ("Mask Texture", 2D) = "white" {} + _MaskInverse ("Inverse", float) = 0 + _MaskEdgeColor ("Edge Color", Color) = (1,1,1,1) + _MaskEdgeSoftness ("Edge Softness", Range(0, 1)) = 0.01 + _MaskWipeControl ("Wipe Position", Range(0, 1)) = 0.5 + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 +} + +SubShader { + Tags + { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + } + + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull [_CullMode] + ZWrite Off + Lighting Off + Fog { Mode Off } + ZTest [unity_GUIZTestMode] + Blend One OneMinusSrcAlpha + ColorMask [_ColorMask] + + Pass { + CGPROGRAM + #pragma vertex VertShader + #pragma fragment PixShader + #pragma shader_feature __ OUTLINE_ON + #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + #include "TMPro_Properties.cginc" + + struct vertex_t { + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + struct pixel_t { + float4 vertex : SV_POSITION; + fixed4 faceColor : COLOR; + fixed4 outlineColor : COLOR1; + float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV + half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w) + half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw) + #if (UNDERLAY_ON | UNDERLAY_INNER) + float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved + half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y) + #endif + }; + + float _MaskWipeControl; + float _MaskEdgeSoftness; + fixed4 _MaskEdgeColor; + bool _MaskInverse; + + pixel_t VertShader(vertex_t input) + { + float bold = step(input.texcoord1.y, 0); + + float4 vert = input.vertex; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + float4 vPosition = UnityObjectToClipPos(vert); + + float2 pixelSize = vPosition.w; + pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); + + float scale = rsqrt(dot(pixelSize, pixelSize)); + scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); + if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); + + float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; + weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; + + float layerScale = scale; + + scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale); + float bias = (0.5 - weight) * scale - 0.5; + float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale; + + float opacity = input.color.a; + #if (UNDERLAY_ON | UNDERLAY_INNER) + opacity = 1.0; + #endif + + fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor; + faceColor.rgb *= faceColor.a; + + fixed4 outlineColor = _OutlineColor; + outlineColor.a *= opacity; + outlineColor.rgb *= outlineColor.a; + outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2)))); + + #if (UNDERLAY_ON | UNDERLAY_INNER) + + layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); + float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); + + float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; + float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; + float2 layerOffset = float2(x, y); + #endif + + // Generate UV for the Masking Texture + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); + + // Structure for pixel shader + pixel_t output = { + vPosition, + faceColor, + outlineColor, + float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y), + half4(scale, bias - outline, bias + outline, bias), + half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)), + #if (UNDERLAY_ON | UNDERLAY_INNER) + float4(input.texcoord0 + layerOffset, input.color.a, 0), + half2(layerScale, layerBias), + #endif + }; + + return output; + } + + + // PIXEL SHADER + fixed4 PixShader(pixel_t input) : SV_Target + { + half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x; + half4 c = input.faceColor * saturate(d - input.param.w); + + #ifdef OUTLINE_ON + c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z)); + c *= saturate(d - input.param.y); + #endif + + #if UNDERLAY_ON + d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; + c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a); + #endif + + #if UNDERLAY_INNER + half sd = saturate(d - input.param.z); + d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; + c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a); + #endif + + // Alternative implementation to UnityGet2DClipping with support for softness. + //#if UNITY_UI_CLIP_RECT + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); + c *= m.x * m.y; + //#endif + + float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a); + float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl; + a = saturate(t / _MaskEdgeSoftness); + c.rgb = lerp(_MaskEdgeColor.rgb*c.a, c.rgb, a); + c *= a; + + #if (UNDERLAY_ON | UNDERLAY_INNER) + c *= input.texcoord1.z; + #endif + + #if UNITY_UI_ALPHACLIP + clip(c.a - 0.001); + #endif + + return c; + } + ENDCG + } +} + +CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta new file mode 100755 index 000000000..3cbdbbb43 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bc1ede39bf3643ee8e493720e4259791 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader new file mode 100755 index 000000000..ce82bed5d --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader @@ -0,0 +1,240 @@ +// Simplified SDF shader: +// - No Shading Option (bevel / bump / env map) +// - No Glow Option +// - Softness is applied on both side of the outline + +Shader "TextMeshPro/Mobile/Distance Field Overlay" { + +Properties { + [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceDilate ("Face Dilate", Range(-1,1)) = 0 + + [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 + _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 + + [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) + _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 + _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 + _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 + _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 + + _WeightNormal ("Weight Normal", float) = 0 + _WeightBold ("Weight Bold", float) = .5 + + _ShaderFlags ("Flags", float) = 0 + _ScaleRatioA ("Scale RatioA", float) = 1 + _ScaleRatioB ("Scale RatioB", float) = 1 + _ScaleRatioC ("Scale RatioC", float) = 1 + + _MainTex ("Font Atlas", 2D) = "white" {} + _TextureWidth ("Texture Width", float) = 512 + _TextureHeight ("Texture Height", float) = 512 + _GradientScale ("Gradient Scale", float) = 5 + _ScaleX ("Scale X", float) = 1 + _ScaleY ("Scale Y", float) = 1 + _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 + _Sharpness ("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 +} + +SubShader { + Tags + { + "Queue"="Overlay" + "IgnoreProjector"="True" + "RenderType"="Transparent" + } + + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull [_CullMode] + ZWrite Off + Lighting Off + Fog { Mode Off } + ZTest Always + Blend One OneMinusSrcAlpha + ColorMask [_ColorMask] + + Pass { + CGPROGRAM + #pragma vertex VertShader + #pragma fragment PixShader + #pragma shader_feature __ OUTLINE_ON + #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + #include "TMPro_Properties.cginc" + + struct vertex_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + struct pixel_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + float4 vertex : SV_POSITION; + fixed4 faceColor : COLOR; + fixed4 outlineColor : COLOR1; + float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV + half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w) + half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw) + #if (UNDERLAY_ON | UNDERLAY_INNER) + float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved + half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y) + #endif + }; + + + pixel_t VertShader(vertex_t input) + { + pixel_t output; + + UNITY_INITIALIZE_OUTPUT(pixel_t, output); + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + float bold = step(input.texcoord1.y, 0); + + float4 vert = input.vertex; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + float4 vPosition = UnityObjectToClipPos(vert); + + float2 pixelSize = vPosition.w; + pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); + + float scale = rsqrt(dot(pixelSize, pixelSize)); + scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); + if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); + + float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; + weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; + + float layerScale = scale; + + scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale); + float bias = (0.5 - weight) * scale - 0.5; + float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale; + + float opacity = input.color.a; + #if (UNDERLAY_ON | UNDERLAY_INNER) + opacity = 1.0; + #endif + + fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor; + faceColor.rgb *= faceColor.a; + + fixed4 outlineColor = _OutlineColor; + outlineColor.a *= opacity; + outlineColor.rgb *= outlineColor.a; + outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2)))); + + #if (UNDERLAY_ON | UNDERLAY_INNER) + layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); + float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); + + float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; + float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; + float2 layerOffset = float2(x, y); + #endif + + // Generate UV for the Masking Texture + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); + + // Populate structure for pixel shader + output.vertex = vPosition; + output.faceColor = faceColor; + output.outlineColor = outlineColor; + output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y); + output.param = half4(scale, bias - outline, bias + outline, bias); + output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + #if (UNDERLAY_ON || UNDERLAY_INNER) + output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0); + output.underlayParam = half2(layerScale, layerBias); + #endif + + return output; + } + + + // PIXEL SHADER + fixed4 PixShader(pixel_t input) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(input); + + half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x; + half4 c = input.faceColor * saturate(d - input.param.w); + + #ifdef OUTLINE_ON + c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z)); + c *= saturate(d - input.param.y); + #endif + + #if UNDERLAY_ON + d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; + c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a); + #endif + + #if UNDERLAY_INNER + half sd = saturate(d - input.param.z); + d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; + c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a); + #endif + + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); + c *= m.x * m.y; + #endif + + #if (UNDERLAY_ON | UNDERLAY_INNER) + c *= input.texcoord1.z; + #endif + + #if UNITY_UI_ALPHACLIP + clip(c.a - 0.001); + #endif + + return c; + } + ENDCG + } +} + +CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta new file mode 100755 index 000000000..e6b149e0a --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a02a7d8c237544f1962732b55a9aebf1 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader new file mode 100755 index 000000000..df4d5b0b0 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader @@ -0,0 +1,106 @@ +// Simplified SDF shader: +// - No Shading Option (bevel / bump / env map) +// - No Glow Option +// - Softness is applied on both side of the outline + +Shader "TextMeshPro/Mobile/Distance Field SSD" { + +Properties { + [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceDilate ("Face Dilate", Range(-1,1)) = 0 + + [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 + _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 + + [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) + _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 + _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 + _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 + _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 + + _WeightNormal ("Weight Normal", float) = 0 + _WeightBold ("Weight Bold", float) = .5 + + _ShaderFlags ("Flags", float) = 0 + _ScaleRatioA ("Scale RatioA", float) = 1 + _ScaleRatioB ("Scale RatioB", float) = 1 + _ScaleRatioC ("Scale RatioC", float) = 1 + + _MainTex ("Font Atlas", 2D) = "white" {} + _TextureWidth ("Texture Width", float) = 512 + _TextureHeight ("Texture Height", float) = 512 + _GradientScale ("Gradient Scale", float) = 5 + _ScaleX ("Scale X", float) = 1 + _ScaleY ("Scale Y", float) = 1 + _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 + _Sharpness ("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 + _MaskTex ("Mask Texture", 2D) = "white" {} + _MaskInverse ("Inverse", float) = 0 + _MaskEdgeColor ("Edge Color", Color) = (1,1,1,1) + _MaskEdgeSoftness ("Edge Softness", Range(0, 1)) = 0.01 + _MaskWipeControl ("Wipe Position", Range(0, 1)) = 0.5 + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 +} + +SubShader { + Tags { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + } + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull [_CullMode] + ZWrite Off + Lighting Off + Fog { Mode Off } + ZTest [unity_GUIZTestMode] + Blend One OneMinusSrcAlpha + ColorMask [_ColorMask] + + Pass { + CGPROGRAM + #pragma vertex VertShader + #pragma fragment PixShader + #pragma shader_feature __ OUTLINE_ON + #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + #include "TMPro_Properties.cginc" + + #include "TMPro_Mobile.cginc" + + ENDCG + } +} + +CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta new file mode 100755 index 000000000..9b84c13d0 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c8d12adcee749c344b8117cf7c7eb912 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader new file mode 100755 index 000000000..d3f5866c8 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader @@ -0,0 +1,240 @@ +// Simplified SDF shader: +// - No Shading Option (bevel / bump / env map) +// - No Glow Option +// - Softness is applied on both side of the outline + +Shader "TextMeshPro/Mobile/Distance Field" { + +Properties { + [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceDilate ("Face Dilate", Range(-1,1)) = 0 + + [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 + _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 + + [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) + _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 + _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 + _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 + _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 + + _WeightNormal ("Weight Normal", float) = 0 + _WeightBold ("Weight Bold", float) = .5 + + _ShaderFlags ("Flags", float) = 0 + _ScaleRatioA ("Scale RatioA", float) = 1 + _ScaleRatioB ("Scale RatioB", float) = 1 + _ScaleRatioC ("Scale RatioC", float) = 1 + + _MainTex ("Font Atlas", 2D) = "white" {} + _TextureWidth ("Texture Width", float) = 512 + _TextureHeight ("Texture Height", float) = 512 + _GradientScale ("Gradient Scale", float) = 5 + _ScaleX ("Scale X", float) = 1 + _ScaleY ("Scale Y", float) = 1 + _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 + _Sharpness ("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 +} + +SubShader { + Tags + { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + } + + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull [_CullMode] + ZWrite Off + Lighting Off + Fog { Mode Off } + ZTest [unity_GUIZTestMode] + Blend One OneMinusSrcAlpha + ColorMask [_ColorMask] + + Pass { + CGPROGRAM + #pragma vertex VertShader + #pragma fragment PixShader + #pragma shader_feature __ OUTLINE_ON + #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + #include "TMPro_Properties.cginc" + + struct vertex_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + struct pixel_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + float4 vertex : SV_POSITION; + fixed4 faceColor : COLOR; + fixed4 outlineColor : COLOR1; + float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV + half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w) + half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw) + #if (UNDERLAY_ON | UNDERLAY_INNER) + float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved + half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y) + #endif + }; + + + pixel_t VertShader(vertex_t input) + { + pixel_t output; + + UNITY_INITIALIZE_OUTPUT(pixel_t, output); + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + float bold = step(input.texcoord1.y, 0); + + float4 vert = input.vertex; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + float4 vPosition = UnityObjectToClipPos(vert); + + float2 pixelSize = vPosition.w; + pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); + + float scale = rsqrt(dot(pixelSize, pixelSize)); + scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); + if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); + + float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; + weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; + + float layerScale = scale; + + scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale); + float bias = (0.5 - weight) * scale - 0.5; + float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale; + + float opacity = input.color.a; + #if (UNDERLAY_ON | UNDERLAY_INNER) + opacity = 1.0; + #endif + + fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor; + faceColor.rgb *= faceColor.a; + + fixed4 outlineColor = _OutlineColor; + outlineColor.a *= opacity; + outlineColor.rgb *= outlineColor.a; + outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2)))); + + #if (UNDERLAY_ON | UNDERLAY_INNER) + layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); + float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); + + float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; + float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; + float2 layerOffset = float2(x, y); + #endif + + // Generate UV for the Masking Texture + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); + + // Populate structure for pixel shader + output.vertex = vPosition; + output.faceColor = faceColor; + output.outlineColor = outlineColor; + output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y); + output.param = half4(scale, bias - outline, bias + outline, bias); + output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + #if (UNDERLAY_ON || UNDERLAY_INNER) + output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0); + output.underlayParam = half2(layerScale, layerBias); + #endif + + return output; + } + + + // PIXEL SHADER + fixed4 PixShader(pixel_t input) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(input); + + half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x; + half4 c = input.faceColor * saturate(d - input.param.w); + + #ifdef OUTLINE_ON + c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z)); + c *= saturate(d - input.param.y); + #endif + + #if UNDERLAY_ON + d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; + c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a); + #endif + + #if UNDERLAY_INNER + half sd = saturate(d - input.param.z); + d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; + c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a); + #endif + + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); + c *= m.x * m.y; + #endif + + #if (UNDERLAY_ON | UNDERLAY_INNER) + c *= input.texcoord1.z; + #endif + + #if UNITY_UI_ALPHACLIP + clip(c.a - 0.001); + #endif + + return c; + } + ENDCG + } +} + +CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta new file mode 100755 index 000000000..2ac6e76cd --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fe393ace9b354375a9cb14cdbbc28be4 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader new file mode 100755 index 000000000..be764aeb9 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader @@ -0,0 +1,138 @@ +// Simplified version of the SDF Surface shader : +// - No support for Bevel, Bump or envmap +// - Diffuse only lighting +// - Fully supports only 1 directional light. Other lights can affect it, but it will be per-vertex/SH. + +Shader "TextMeshPro/Mobile/Distance Field (Surface)" { + +Properties { + _FaceTex ("Fill Texture", 2D) = "white" {} + [HDR]_FaceColor ("Fill Color", Color) = (1,1,1,1) + _FaceDilate ("Face Dilate", Range(-1,1)) = 0 + + [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineTex ("Outline Texture", 2D) = "white" {} + _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0 + _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 + + [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) + _GlowOffset ("Offset", Range(-1,1)) = 0 + _GlowInner ("Inner", Range(0,1)) = 0.05 + _GlowOuter ("Outer", Range(0,1)) = 0.05 + _GlowPower ("Falloff", Range(1, 0)) = 0.75 + + _WeightNormal ("Weight Normal", float) = 0 + _WeightBold ("Weight Bold", float) = 0.5 + + // Should not be directly exposed to the user + _ShaderFlags ("Flags", float) = 0 + _ScaleRatioA ("Scale RatioA", float) = 1 + _ScaleRatioB ("Scale RatioB", float) = 1 + _ScaleRatioC ("Scale RatioC", float) = 1 + + _MainTex ("Font Atlas", 2D) = "white" {} + _TextureWidth ("Texture Width", float) = 512 + _TextureHeight ("Texture Height", float) = 512 + _GradientScale ("Gradient Scale", float) = 5.0 + _ScaleX ("Scale X", float) = 1.0 + _ScaleY ("Scale Y", float) = 1.0 + _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 + _Sharpness ("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + + _CullMode ("Cull Mode", Float) = 0 + //_MaskCoord ("Mask Coords", vector) = (0,0,0,0) + //_MaskSoftness ("Mask Softness", float) = 0 +} + +SubShader { + + Tags { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + } + + LOD 300 + Cull [_CullMode] + + CGPROGRAM + #pragma surface PixShader Lambert alpha:blend vertex:VertShader noforwardadd nolightmap nodirlightmap + #pragma target 3.0 + #pragma shader_feature __ GLOW_ON + + #include "TMPro_Properties.cginc" + #include "TMPro.cginc" + + half _FaceShininess; + half _OutlineShininess; + + struct Input + { + fixed4 color : COLOR; + float2 uv_MainTex; + float2 uv2_FaceTex; + float2 uv2_OutlineTex; + float2 param; // Weight, Scale + float3 viewDirEnv; + }; + + #include "TMPro_Surface.cginc" + + ENDCG + + // Pass to render object as a shadow caster + Pass + { + Name "Caster" + Tags { "LightMode" = "ShadowCaster" } + Offset 1, 1 + + Fog {Mode Off} + ZWrite On ZTest LEqual Cull Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #include "UnityCG.cginc" + + struct v2f { + V2F_SHADOW_CASTER; + float2 uv : TEXCOORD1; + float2 uv2 : TEXCOORD3; + float alphaClip : TEXCOORD2; + }; + + uniform float4 _MainTex_ST; + uniform float4 _OutlineTex_ST; + float _OutlineWidth; + float _FaceDilate; + float _ScaleRatioA; + + v2f vert( appdata_base v ) + { + v2f o; + TRANSFER_SHADOW_CASTER(o) + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex); + o.alphaClip = o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2; + return o; + } + + uniform sampler2D _MainTex; + + float4 frag(v2f i) : COLOR + { + fixed4 texcol = tex2D(_MainTex, i.uv).a; + clip(texcol.a - i.alphaClip); + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } +} + +CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta new file mode 100755 index 000000000..bff8b7aa9 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 85187c2149c549c5b33f0cdb02836b17 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader new file mode 100755 index 000000000..bcb2bb273 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader @@ -0,0 +1,158 @@ +Shader "TextMeshPro/Distance Field (Surface)" { + +Properties { + _FaceTex ("Fill Texture", 2D) = "white" {} + _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0 + _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0 + [HDR]_FaceColor ("Fill Color", Color) = (1,1,1,1) + _FaceDilate ("Face Dilate", Range(-1,1)) = 0 + + [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineTex ("Outline Texture", 2D) = "white" {} + _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0 + _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0 + _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0 + _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 + + _Bevel ("Bevel", Range(0,1)) = 0.5 + _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0 + _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0 + _BevelClamp ("Bevel Clamp", Range(0,1)) = 0 + _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0 + + _BumpMap ("Normalmap", 2D) = "bump" {} + _BumpOutline ("Bump Outline", Range(0,1)) = 0.5 + _BumpFace ("Bump Face", Range(0,1)) = 0.5 + + _ReflectFaceColor ("Face Color", Color) = (0,0,0,1) + _ReflectOutlineColor ("Outline Color", Color) = (0,0,0,1) + _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ } + _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0) + [HDR]_SpecColor ("Specular Color", Color) = (0,0,0,1) + + _FaceShininess ("Face Shininess", Range(0,1)) = 0 + _OutlineShininess ("Outline Shininess", Range(0,1)) = 0 + + [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) + _GlowOffset ("Offset", Range(-1,1)) = 0 + _GlowInner ("Inner", Range(0,1)) = 0.05 + _GlowOuter ("Outer", Range(0,1)) = 0.05 + _GlowPower ("Falloff", Range(1, 0)) = 0.75 + + _WeightNormal ("Weight Normal", float) = 0 + _WeightBold ("Weight Bold", float) = 0.5 + + // Should not be directly exposed to the user + _ShaderFlags ("Flags", float) = 0 + _ScaleRatioA ("Scale RatioA", float) = 1 + _ScaleRatioB ("Scale RatioB", float) = 1 + _ScaleRatioC ("Scale RatioC", float) = 1 + + _MainTex ("Font Atlas", 2D) = "white" {} + _TextureWidth ("Texture Width", float) = 512 + _TextureHeight ("Texture Height", float) = 512 + _GradientScale ("Gradient Scale", float) = 5.0 + _ScaleX ("Scale X", float) = 1.0 + _ScaleY ("Scale Y", float) = 1.0 + _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 + _Sharpness ("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + + _CullMode ("Cull Mode", Float) = 0 + //_MaskCoord ("Mask Coords", vector) = (0,0,0,0) + //_MaskSoftness ("Mask Softness", float) = 0 +} + +SubShader { + + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + + LOD 300 + Cull [_CullMode] + + CGPROGRAM + #pragma surface PixShader BlinnPhong alpha:blend vertex:VertShader nolightmap nodirlightmap + #pragma target 3.0 + #pragma shader_feature __ GLOW_ON + #pragma glsl + + #include "TMPro_Properties.cginc" + #include "TMPro.cginc" + + half _FaceShininess; + half _OutlineShininess; + + struct Input + { + fixed4 color : COLOR; + float2 uv_MainTex; + float2 uv2_FaceTex; + float2 uv2_OutlineTex; + float2 param; // Weight, Scale + float3 viewDirEnv; + }; + + + #define BEVEL_ON 1 + #include "TMPro_Surface.cginc" + + ENDCG + + // Pass to render object as a shadow caster + Pass + { + Name "Caster" + Tags { "LightMode" = "ShadowCaster" } + Offset 1, 1 + + Fog {Mode Off} + ZWrite On + ZTest LEqual + Cull Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #include "UnityCG.cginc" + + struct v2f { + V2F_SHADOW_CASTER; + float2 uv : TEXCOORD1; + float2 uv2 : TEXCOORD3; + float alphaClip : TEXCOORD2; + }; + + uniform float4 _MainTex_ST; + uniform float4 _OutlineTex_ST; + float _OutlineWidth; + float _FaceDilate; + float _ScaleRatioA; + + v2f vert( appdata_base v ) + { + v2f o; + TRANSFER_SHADOW_CASTER(o) + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex); + o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2; + return o; + } + + uniform sampler2D _MainTex; + + float4 frag(v2f i) : COLOR + { + fixed4 texcol = tex2D(_MainTex, i.uv).a; + clip(texcol.a - i.alphaClip); + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } +} + +CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} + diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta new file mode 100755 index 000000000..26e814c2c --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f7ada0af4f174f0694ca6a487b8f543d +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader new file mode 100755 index 000000000..011ee199a --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader @@ -0,0 +1,317 @@ +Shader "TextMeshPro/Distance Field" { + +Properties { + _FaceTex ("Face Texture", 2D) = "white" {} + _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0 + _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0 + [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceDilate ("Face Dilate", Range(-1,1)) = 0 + + [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineTex ("Outline Texture", 2D) = "white" {} + _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0 + _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0 + _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0 + _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 + + _Bevel ("Bevel", Range(0,1)) = 0.5 + _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0 + _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0 + _BevelClamp ("Bevel Clamp", Range(0,1)) = 0 + _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0 + + _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416 + [HDR]_SpecularColor ("Specular", Color) = (1,1,1,1) + _SpecularPower ("Specular", Range(0,4)) = 2.0 + _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10 + _Diffuse ("Diffuse", Range(0,1)) = 0.5 + _Ambient ("Ambient", Range(1,0)) = 0.5 + + _BumpMap ("Normal map", 2D) = "bump" {} + _BumpOutline ("Bump Outline", Range(0,1)) = 0 + _BumpFace ("Bump Face", Range(0,1)) = 0 + + _ReflectFaceColor ("Reflection Color", Color) = (0,0,0,1) + _ReflectOutlineColor("Reflection Color", Color) = (0,0,0,1) + _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ } + _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0) + + + [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0, 0.5) + _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 + _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 + _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 + _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 + + [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) + _GlowOffset ("Offset", Range(-1,1)) = 0 + _GlowInner ("Inner", Range(0,1)) = 0.05 + _GlowOuter ("Outer", Range(0,1)) = 0.05 + _GlowPower ("Falloff", Range(1, 0)) = 0.75 + + _WeightNormal ("Weight Normal", float) = 0 + _WeightBold ("Weight Bold", float) = 0.5 + + _ShaderFlags ("Flags", float) = 0 + _ScaleRatioA ("Scale RatioA", float) = 1 + _ScaleRatioB ("Scale RatioB", float) = 1 + _ScaleRatioC ("Scale RatioC", float) = 1 + + _MainTex ("Font Atlas", 2D) = "white" {} + _TextureWidth ("Texture Width", float) = 512 + _TextureHeight ("Texture Height", float) = 512 + _GradientScale ("Gradient Scale", float) = 5.0 + _ScaleX ("Scale X", float) = 1.0 + _ScaleY ("Scale Y", float) = 1.0 + _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 + _Sharpness ("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + + _MaskCoord ("Mask Coordinates", vector) = (0, 0, 32767, 32767) + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 +} + +SubShader { + + Tags + { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + } + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull [_CullMode] + ZWrite Off + Lighting Off + Fog { Mode Off } + ZTest [unity_GUIZTestMode] + Blend One OneMinusSrcAlpha + ColorMask [_ColorMask] + + Pass { + CGPROGRAM + #pragma target 3.0 + #pragma vertex VertShader + #pragma fragment PixShader + #pragma shader_feature __ BEVEL_ON + #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER + #pragma shader_feature __ GLOW_ON + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + #include "TMPro_Properties.cginc" + #include "TMPro.cginc" + + struct vertex_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + float4 position : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + + struct pixel_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + float4 position : SV_POSITION; + fixed4 color : COLOR; + float2 atlas : TEXCOORD0; // Atlas + float4 param : TEXCOORD1; // alphaClip, scale, bias, weight + float4 mask : TEXCOORD2; // Position in object space(xy), pixel Size(zw) + float3 viewDir : TEXCOORD3; + + #if (UNDERLAY_ON || UNDERLAY_INNER) + float4 texcoord2 : TEXCOORD4; // u,v, scale, bias + fixed4 underlayColor : COLOR1; + #endif + float4 textures : TEXCOORD5; + }; + + // Used by Unity internally to handle Texture Tiling and Offset. + float4 _FaceTex_ST; + float4 _OutlineTex_ST; + + pixel_t VertShader(vertex_t input) + { + pixel_t output; + + UNITY_INITIALIZE_OUTPUT(pixel_t, output); + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input,output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + float bold = step(input.texcoord1.y, 0); + + float4 vert = input.position; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + + float4 vPosition = UnityObjectToClipPos(vert); + + float2 pixelSize = vPosition.w; + pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); + float scale = rsqrt(dot(pixelSize, pixelSize)); + scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); + if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); + + float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; + weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; + + float bias =(.5 - weight) + (.5 / scale); + + float alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _OutlineSoftness * _ScaleRatioA); + + #if GLOW_ON + alphaClip = min(alphaClip, 1.0 - _GlowOffset * _ScaleRatioB - _GlowOuter * _ScaleRatioB); + #endif + + alphaClip = alphaClip / 2.0 - ( .5 / scale) - weight; + + #if (UNDERLAY_ON || UNDERLAY_INNER) + float4 underlayColor = _UnderlayColor; + underlayColor.rgb *= underlayColor.a; + + float bScale = scale; + bScale /= 1 + ((_UnderlaySoftness*_ScaleRatioC) * bScale); + float bBias = (0.5 - weight) * bScale - 0.5 - ((_UnderlayDilate * _ScaleRatioC) * 0.5 * bScale); + + float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; + float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; + float2 bOffset = float2(x, y); + #endif + + // Generate UV for the Masking Texture + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); + + // Support for texture tiling and offset + float2 textureUV = UnpackUV(input.texcoord1.x); + float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex); + float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex); + + + output.position = vPosition; + output.color = input.color; + output.atlas = input.texcoord0; + output.param = float4(alphaClip, scale, bias, weight); + output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + output.viewDir = mul((float3x3)_EnvMatrix, _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz); + #if (UNDERLAY_ON || UNDERLAY_INNER) + output.texcoord2 = float4(input.texcoord0 + bOffset, bScale, bBias); + output.underlayColor = underlayColor; + #endif + output.textures = float4(faceUV, outlineUV); + + return output; + } + + + fixed4 PixShader(pixel_t input) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(input); + + float c = tex2D(_MainTex, input.atlas).a; + + #ifndef UNDERLAY_ON + clip(c - input.param.x); + #endif + + float scale = input.param.y; + float bias = input.param.z; + float weight = input.param.w; + float sd = (bias - c) * scale; + + float outline = (_OutlineWidth * _ScaleRatioA) * scale; + float softness = (_OutlineSoftness * _ScaleRatioA) * scale; + + half4 faceColor = _FaceColor; + half4 outlineColor = _OutlineColor; + + faceColor.rgb *= input.color.rgb; + + faceColor *= tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y); + outlineColor *= tex2D(_OutlineTex, input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y); + + faceColor = GetColor(sd, faceColor, outlineColor, outline, softness); + + #if BEVEL_ON + float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0); + float3 n = GetSurfaceNormal(input.atlas, weight, dxy); + + float3 bump = UnpackNormal(tex2D(_BumpMap, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y)).xyz; + bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5)); + n = normalize(n- bump); + + float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), -1.0)); + + float3 col = GetSpecular(n, light); + faceColor.rgb += col*faceColor.a; + faceColor.rgb *= 1-(dot(n, light)*_Diffuse); + faceColor.rgb *= lerp(_Ambient, 1, n.z*n.z); + + fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n)); + faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a; + #endif + + #if UNDERLAY_ON + float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z; + faceColor += input.underlayColor * saturate(d - input.texcoord2.w) * (1 - faceColor.a); + #endif + + #if UNDERLAY_INNER + float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z; + faceColor += input.underlayColor * (1 - saturate(d - input.texcoord2.w)) * saturate(1 - sd) * (1 - faceColor.a); + #endif + + #if GLOW_ON + float4 glowColor = GetGlowColor(sd, scale); + faceColor.rgb += glowColor.rgb * glowColor.a; + #endif + + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); + faceColor *= m.x * m.y; + #endif + + #if UNITY_UI_ALPHACLIP + clip(faceColor.a - 0.001); + #endif + + return faceColor * input.color.a; + } + + ENDCG + } +} + +Fallback "TextMeshPro/Mobile/Distance Field" +CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta new file mode 100755 index 000000000..e1cf3f38f --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 68e6db2ebdc24f95958faec2be5558d6 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader new file mode 100755 index 000000000..e8283a78e --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader @@ -0,0 +1,116 @@ +Shader "TextMeshPro/Sprite" +{ + Properties + { + [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} + _Color ("Tint", Color) = (1,1,1,1) + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + + [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 + } + + SubShader + { + Tags + { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + "PreviewType"="Plane" + "CanUseSpriteAtlas"="True" + } + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull [_CullMode] + Lighting Off + ZWrite Off + ZTest [unity_GUIZTestMode] + Blend SrcAlpha OneMinusSrcAlpha + ColorMask [_ColorMask] + + Pass + { + Name "Default" + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + struct appdata_t + { + float4 vertex : POSITION; + float4 color : COLOR; + float2 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f + { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + float4 worldPosition : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO + }; + + sampler2D _MainTex; + fixed4 _Color; + fixed4 _TextureSampleAdd; + float4 _ClipRect; + float4 _MainTex_ST; + + v2f vert(appdata_t v) + { + v2f OUT; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); + OUT.worldPosition = v.vertex; + OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); + + OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); + + OUT.color = v.color * _Color; + return OUT; + } + + fixed4 frag(v2f IN) : SV_Target + { + half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color; + + #ifdef UNITY_UI_CLIP_RECT + color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); + #endif + + #ifdef UNITY_UI_ALPHACLIP + clip (color.a - 0.001); + #endif + + return color; + } + ENDCG + } + } +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta new file mode 100755 index 000000000..50ba195eb --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: cf81c85f95fe47e1a27f6ae460cf182c +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc new file mode 100755 index 000000000..589813044 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc @@ -0,0 +1,84 @@ +float2 UnpackUV(float uv) +{ + float2 output; + output.x = floor(uv / 4096); + output.y = uv - 4096 * output.x; + + return output * 0.001953125; +} + +fixed4 GetColor(half d, fixed4 faceColor, fixed4 outlineColor, half outline, half softness) +{ + half faceAlpha = 1-saturate((d - outline * 0.5 + softness * 0.5) / (1.0 + softness)); + half outlineAlpha = saturate((d + outline * 0.5)) * sqrt(min(1.0, outline)); + + faceColor.rgb *= faceColor.a; + outlineColor.rgb *= outlineColor.a; + + faceColor = lerp(faceColor, outlineColor, outlineAlpha); + + faceColor *= faceAlpha; + + return faceColor; +} + +float3 GetSurfaceNormal(float4 h, float bias) +{ + bool raisedBevel = step(1, fmod(_ShaderFlags, 2)); + + h += bias+_BevelOffset; + + float bevelWidth = max(.01, _OutlineWidth+_BevelWidth); + + // Track outline + h -= .5; + h /= bevelWidth; + h = saturate(h+.5); + + if(raisedBevel) h = 1 - abs(h*2.0 - 1.0); + h = lerp(h, sin(h*3.141592/2.0), _BevelRoundness); + h = min(h, 1.0-_BevelClamp); + h *= _Bevel * bevelWidth * _GradientScale * -2.0; + + float3 va = normalize(float3(1.0, 0.0, h.y - h.x)); + float3 vb = normalize(float3(0.0, -1.0, h.w - h.z)); + + return cross(va, vb); +} + +float3 GetSurfaceNormal(float2 uv, float bias, float3 delta) +{ + // Read "height field" + float4 h = {tex2D(_MainTex, uv - delta.xz).a, + tex2D(_MainTex, uv + delta.xz).a, + tex2D(_MainTex, uv - delta.zy).a, + tex2D(_MainTex, uv + delta.zy).a}; + + return GetSurfaceNormal(h, bias); +} + +float3 GetSpecular(float3 n, float3 l) +{ + float spec = pow(max(0.0, dot(n, l)), _Reflectivity); + return _SpecularColor.rgb * spec * _SpecularPower; +} + +float4 GetGlowColor(float d, float scale) +{ + float glow = d - (_GlowOffset*_ScaleRatioB) * 0.5 * scale; + float t = lerp(_GlowInner, (_GlowOuter * _ScaleRatioB), step(0.0, glow)) * 0.5 * scale; + glow = saturate(abs(glow/(1.0 + t))); + glow = 1.0-pow(glow, _GlowPower); + glow *= sqrt(min(1.0, t)); // Fade off glow thinner than 1 screen pixel + return float4(_GlowColor.rgb, saturate(_GlowColor.a * glow * 2)); +} + +float4 BlendARGB(float4 overlying, float4 underlying) +{ + overlying.rgb *= overlying.a; + underlying.rgb *= underlying.a; + float3 blended = overlying.rgb + ((1-overlying.a)*underlying.rgb); + float alpha = underlying.a + (1-underlying.a)*overlying.a; + return float4(blended, alpha); +} + diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta new file mode 100755 index 000000000..0d6eb56ce --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 407bc68d299748449bbf7f48ee690f8d +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc new file mode 100755 index 000000000..5969fec1a --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc @@ -0,0 +1,157 @@ +struct vertex_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + float4 position : POSITION; + float3 normal : NORMAL; + float4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; +}; + +struct pixel_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + float4 position : SV_POSITION; + float4 faceColor : COLOR; + float4 outlineColor : COLOR1; + float4 texcoord0 : TEXCOORD0; + float4 param : TEXCOORD1; // weight, scaleRatio + float2 mask : TEXCOORD2; + #if (UNDERLAY_ON || UNDERLAY_INNER) + float4 texcoord2 : TEXCOORD3; + float4 underlayColor : COLOR2; + #endif +}; + +float4 SRGBToLinear(float4 rgba) { + return float4(lerp(rgba.rgb / 12.92f, pow((rgba.rgb + 0.055f) / 1.055f, 2.4f), step(0.04045f, rgba.rgb)), rgba.a); +} + +pixel_t VertShader(vertex_t input) +{ + pixel_t output; + + UNITY_INITIALIZE_OUTPUT(pixel_t, output); + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + float bold = step(input.texcoord1.y, 0); + + float4 vert = input.position; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + + float4 vPosition = UnityObjectToClipPos(vert); + + float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; + weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; + + // Generate UV for the Masking Texture + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); + + float4 color = input.color; + #if (FORCE_LINEAR && !UNITY_COLORSPACE_GAMMA) + color = SRGBToLinear(input.color); + #endif + + float opacity = color.a; + #if (UNDERLAY_ON | UNDERLAY_INNER) + opacity = 1.0; + #endif + + float4 faceColor = float4(color.rgb, opacity) * _FaceColor; + faceColor.rgb *= faceColor.a; + + float4 outlineColor = _OutlineColor; + outlineColor.a *= opacity; + outlineColor.rgb *= outlineColor.a; + + output.position = vPosition; + output.faceColor = faceColor; + output.outlineColor = outlineColor; + output.texcoord0 = float4(input.texcoord0.xy, maskUV.xy); + output.param = float4(0.5 - weight, 1.3333 * _GradientScale * (_Sharpness + 1) / _TextureWidth, _OutlineWidth * _ScaleRatioA * 0.5, 0); + + float2 mask = float2(0, 0); + #if UNITY_UI_CLIP_RECT + mask = vert.xy * 2 - clampedRect.xy - clampedRect.zw; + #endif + output.mask = mask; + + #if (UNDERLAY_ON || UNDERLAY_INNER) + float4 underlayColor = _UnderlayColor; + underlayColor.rgb *= underlayColor.a; + + float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; + float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; + + output.texcoord2 = float4(input.texcoord0 + float2(x, y), input.color.a, 0); + output.underlayColor = underlayColor; + #endif + + return output; +} + +float4 PixShader(pixel_t input) : SV_Target +{ + UNITY_SETUP_INSTANCE_ID(input); + + float d = tex2D(_MainTex, input.texcoord0.xy).a; + + float2 UV = input.texcoord0.xy; + float scale = rsqrt(abs(ddx(UV.x) * ddy(UV.y) - ddy(UV.x) * ddx(UV.y))) * input.param.y; + + #if (UNDERLAY_ON | UNDERLAY_INNER) + float layerScale = scale; + layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); + float layerBias = input.param.x * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); + #endif + + scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale); + + float4 faceColor = input.faceColor * saturate((d - input.param.x) * scale + 0.5); + + #ifdef OUTLINE_ON + float4 outlineColor = lerp(input.faceColor, input.outlineColor, sqrt(min(1.0, input.param.z * scale * 2))); + faceColor = lerp(outlineColor, input.faceColor, saturate((d - input.param.x - input.param.z) * scale + 0.5)); + faceColor *= saturate((d - input.param.x + input.param.z) * scale + 0.5); + #endif + + #if UNDERLAY_ON + d = tex2D(_MainTex, input.texcoord2.xy).a * layerScale; + faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - layerBias) * (1 - faceColor.a); + #endif + + #if UNDERLAY_INNER + float bias = input.param.x * scale - 0.5; + float sd = saturate(d * scale - bias - input.param.z); + d = tex2D(_MainTex, input.texcoord2.xy).a * layerScale; + faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - layerBias)) * sd * (1 - faceColor.a); + #endif + + #ifdef MASKING + float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a); + float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl; + a = saturate(t / _MaskEdgeSoftness); + faceColor.rgb = lerp(_MaskEdgeColor.rgb * faceColor.a, faceColor.rgb, a); + faceColor *= a; + #endif + + // Alternative implementation to UnityGet2DClipping with support for softness + #if UNITY_UI_CLIP_RECT + float2 maskZW = 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + (1 / scale)); + float2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * maskZW); + faceColor *= m.x * m.y; + #endif + + #if (UNDERLAY_ON | UNDERLAY_INNER) + faceColor *= input.texcoord2.z; + #endif + + #if UNITY_UI_ALPHACLIP + clip(faceColor.a - 0.001); + #endif + + return faceColor; +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta new file mode 100755 index 000000000..4415e5078 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c334973cef89a9840b0b0c507e0377ab +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc new file mode 100755 index 000000000..2e962588c --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc @@ -0,0 +1,85 @@ +// UI Editable properties +uniform sampler2D _FaceTex; // Alpha : Signed Distance +uniform float _FaceUVSpeedX; +uniform float _FaceUVSpeedY; +uniform fixed4 _FaceColor; // RGBA : Color + Opacity +uniform float _FaceDilate; // v[ 0, 1] +uniform float _OutlineSoftness; // v[ 0, 1] + +uniform sampler2D _OutlineTex; // RGBA : Color + Opacity +uniform float _OutlineUVSpeedX; +uniform float _OutlineUVSpeedY; +uniform fixed4 _OutlineColor; // RGBA : Color + Opacity +uniform float _OutlineWidth; // v[ 0, 1] + +uniform float _Bevel; // v[ 0, 1] +uniform float _BevelOffset; // v[-1, 1] +uniform float _BevelWidth; // v[-1, 1] +uniform float _BevelClamp; // v[ 0, 1] +uniform float _BevelRoundness; // v[ 0, 1] + +uniform sampler2D _BumpMap; // Normal map +uniform float _BumpOutline; // v[ 0, 1] +uniform float _BumpFace; // v[ 0, 1] + +uniform samplerCUBE _Cube; // Cube / sphere map +uniform fixed4 _ReflectFaceColor; // RGB intensity +uniform fixed4 _ReflectOutlineColor; +//uniform float _EnvTiltX; // v[-1, 1] +//uniform float _EnvTiltY; // v[-1, 1] +uniform float3 _EnvMatrixRotation; +uniform float4x4 _EnvMatrix; + +uniform fixed4 _SpecularColor; // RGB intensity +uniform float _LightAngle; // v[ 0,Tau] +uniform float _SpecularPower; // v[ 0, 1] +uniform float _Reflectivity; // v[ 5, 15] +uniform float _Diffuse; // v[ 0, 1] +uniform float _Ambient; // v[ 0, 1] + +uniform fixed4 _UnderlayColor; // RGBA : Color + Opacity +uniform float _UnderlayOffsetX; // v[-1, 1] +uniform float _UnderlayOffsetY; // v[-1, 1] +uniform float _UnderlayDilate; // v[-1, 1] +uniform float _UnderlaySoftness; // v[ 0, 1] + +uniform fixed4 _GlowColor; // RGBA : Color + Intesity +uniform float _GlowOffset; // v[-1, 1] +uniform float _GlowOuter; // v[ 0, 1] +uniform float _GlowInner; // v[ 0, 1] +uniform float _GlowPower; // v[ 1, 1/(1+4*4)] + +// API Editable properties +uniform float _ShaderFlags; +uniform float _WeightNormal; +uniform float _WeightBold; + +uniform float _ScaleRatioA; +uniform float _ScaleRatioB; +uniform float _ScaleRatioC; + +uniform float _VertexOffsetX; +uniform float _VertexOffsetY; + +//uniform float _UseClipRect; +uniform float _MaskID; +uniform sampler2D _MaskTex; +uniform float4 _MaskCoord; +uniform float4 _ClipRect; // bottom left(x,y) : top right(z,w) +//uniform float _MaskWipeControl; +//uniform float _MaskEdgeSoftness; +//uniform fixed4 _MaskEdgeColor; +//uniform bool _MaskInverse; + +uniform float _MaskSoftnessX; +uniform float _MaskSoftnessY; + +// Font Atlas properties +uniform sampler2D _MainTex; +uniform float _TextureWidth; +uniform float _TextureHeight; +uniform float _GradientScale; +uniform float _ScaleX; +uniform float _ScaleY; +uniform float _PerspectiveFilter; +uniform float _Sharpness; diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta new file mode 100755 index 000000000..7b37f2f1d --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3997e2241185407d80309a82f9148466 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc new file mode 100755 index 000000000..622ae8758 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc @@ -0,0 +1,101 @@ +void VertShader(inout appdata_full v, out Input data) +{ + v.vertex.x += _VertexOffsetX; + v.vertex.y += _VertexOffsetY; + + UNITY_INITIALIZE_OUTPUT(Input, data); + + float bold = step(v.texcoord1.y, 0); + + // Generate normal for backface + float3 view = ObjSpaceViewDir(v.vertex); + v.normal *= sign(dot(v.normal, view)); + +#if USE_DERIVATIVE + data.param.y = 1; +#else + float4 vert = v.vertex; + float4 vPosition = UnityObjectToClipPos(vert); + float2 pixelSize = vPosition.w; + + pixelSize /= float2(_ScaleX, _ScaleY) * mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy); + float scale = rsqrt(dot(pixelSize, pixelSize)); + scale *= abs(v.texcoord1.y) * _GradientScale * (_Sharpness + 1); + scale = lerp(scale * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(v.normal.xyz), normalize(WorldSpaceViewDir(vert))))); + data.param.y = scale; +#endif + + data.param.x = (lerp(_WeightNormal, _WeightBold, bold) / 4.0 + _FaceDilate) * _ScaleRatioA * 0.5; // + + v.texcoord1.xy = UnpackUV(v.texcoord1.x); + data.viewDirEnv = mul((float3x3)_EnvMatrix, WorldSpaceViewDir(v.vertex)); +} + +void PixShader(Input input, inout SurfaceOutput o) +{ + +#if USE_DERIVATIVE + float2 pixelSize = float2(ddx(input.uv_MainTex.y), ddy(input.uv_MainTex.y)); + pixelSize *= _TextureWidth * .75; + float scale = rsqrt(dot(pixelSize, pixelSize)) * _GradientScale * (_Sharpness + 1); +#else + float scale = input.param.y; +#endif + + // Signed distance + float c = tex2D(_MainTex, input.uv_MainTex).a; + float sd = (.5 - c - input.param.x) * scale + .5; + float outline = _OutlineWidth*_ScaleRatioA * scale; + float softness = _OutlineSoftness*_ScaleRatioA * scale; + + // Color & Alpha + float4 faceColor = _FaceColor; + float4 outlineColor = _OutlineColor; + faceColor *= input.color; + outlineColor.a *= input.color.a; + faceColor *= tex2D(_FaceTex, float2(input.uv2_FaceTex.x + _FaceUVSpeedX * _Time.y, input.uv2_FaceTex.y + _FaceUVSpeedY * _Time.y)); + outlineColor *= tex2D(_OutlineTex, float2(input.uv2_OutlineTex.x + _OutlineUVSpeedX * _Time.y, input.uv2_OutlineTex.y + _OutlineUVSpeedY * _Time.y)); + faceColor = GetColor(sd, faceColor, outlineColor, outline, softness); + faceColor.rgb /= max(faceColor.a, 0.0001); + +#if BEVEL_ON + float3 delta = float3(1.0 / _TextureWidth, 1.0 / _TextureHeight, 0.0); + + float4 smp4x = {tex2D(_MainTex, input.uv_MainTex - delta.xz).a, + tex2D(_MainTex, input.uv_MainTex + delta.xz).a, + tex2D(_MainTex, input.uv_MainTex - delta.zy).a, + tex2D(_MainTex, input.uv_MainTex + delta.zy).a }; + + // Face Normal + float3 n = GetSurfaceNormal(smp4x, input.param.x); + + // Bumpmap + float3 bump = UnpackNormal(tex2D(_BumpMap, input.uv2_FaceTex.xy)).xyz; + bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5)); + bump = lerp(float3(0, 0, 1), bump, faceColor.a); + n = normalize(n - bump); + + // Cubemap reflection + fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDirEnv, mul((float3x3)unity_ObjectToWorld, n))); + float3 emission = reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a; +#else + float3 n = float3(0, 0, -1); + float3 emission = float3(0, 0, 0); +#endif + +#if GLOW_ON + float4 glowColor = GetGlowColor(sd, scale); + glowColor.a *= input.color.a; + emission += glowColor.rgb*glowColor.a; + faceColor = BlendARGB(glowColor, faceColor); + faceColor.rgb /= max(faceColor.a, 0.0001); +#endif + + // Set Standard output structure + o.Albedo = faceColor.rgb; + o.Normal = -n; + o.Emission = emission; + o.Specular = lerp(_FaceShininess, _OutlineShininess, saturate(sd + outline * 0.5)); + o.Gloss = 1; + o.Alpha = faceColor.a; +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta new file mode 100755 index 000000000..41ef4b102 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d930090c0cd643c7b55f19a38538c162 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites.meta b/BugsnagUnity/Assets/TextMesh Pro/Sprites.meta new file mode 100755 index 000000000..8b699e5fc --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Sprites.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d0603b6d5186471b96c778c3949c7ce2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt b/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt new file mode 100755 index 000000000..384180a92 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt @@ -0,0 +1,3 @@ +This sample of beautiful emojis are provided by EmojiOne https://www.emojione.com/ + +Please visit their website to view the complete set of their emojis and review their licensing terms. \ No newline at end of file diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta b/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta new file mode 100755 index 000000000..0d30e6532 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 381dcb09d5029d14897e55f98031fca5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json b/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json new file mode 100755 index 000000000..6c4e50bc8 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json @@ -0,0 +1,156 @@ +{"frames": [ + +{ + "filename": "1f60a.png", + "frame": {"x":0,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f60b.png", + "frame": {"x":128,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f60d.png", + "frame": {"x":256,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f60e.png", + "frame": {"x":384,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f600.png", + "frame": {"x":0,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f601.png", + "frame": {"x":128,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f602.png", + "frame": {"x":256,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f603.png", + "frame": {"x":384,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f604.png", + "frame": {"x":0,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f605.png", + "frame": {"x":128,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f606.png", + "frame": {"x":256,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f609.png", + "frame": {"x":384,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f618.png", + "frame": {"x":0,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "1f923.png", + "frame": {"x":128,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "263a.png", + "frame": {"x":256,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}, +{ + "filename": "2639.png", + "frame": {"x":384,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128}, + "pivot": {"x":0.5,"y":0.5} +}], +"meta": { + "app": "http://www.codeandweb.com/texturepacker", + "version": "1.0", + "image": "EmojiOne.png", + "format": "RGBA8888", + "size": {"w":512,"h":512}, + "scale": "1", + "smartupdate": "$TexturePacker:SmartUpdate:196a26a2e149d875b91ffc8fa3581e76:fc928c7e275404b7e0649307410475cb:424723c3774975ddb2053fd5c4b85f6e$" +} +} diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta b/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta new file mode 100755 index 000000000..762cf15c9 --- /dev/null +++ b/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8f05276190cf498a8153f6cbe761d4e6 +timeCreated: 1480316860 +licenseType: Pro +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.png b/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.png new file mode 100755 index 0000000000000000000000000000000000000000..c0de66d0ab8976d2e00122faa45887a4208c07af GIT binary patch literal 112319 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

xMw{_$ce~^VZld@MEWPn}OBCb-| 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΢MWdz93`CaT#q?@>~pm40=*o~e-A0G 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", + "defaultInstantiationMode": 1 + }, + "newSceneOverride": 0 +} \ No newline at end of file diff --git a/BugsnagUnity/ProjectSettings/TagManager.asset b/BugsnagUnity/ProjectSettings/TagManager.asset new file mode 100644 index 000000000..1c92a7840 --- /dev/null +++ b/BugsnagUnity/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/BugsnagUnity/ProjectSettings/TimeManager.asset b/BugsnagUnity/ProjectSettings/TimeManager.asset new file mode 100644 index 000000000..558a017e1 --- /dev/null +++ b/BugsnagUnity/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/BugsnagUnity/ProjectSettings/UnityConnectSettings.asset b/BugsnagUnity/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 000000000..a88bee0f1 --- /dev/null +++ b/BugsnagUnity/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + m_PackageRequiringCoreStatsPresent: 0 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/BugsnagUnity/ProjectSettings/VFXManager.asset b/BugsnagUnity/ProjectSettings/VFXManager.asset new file mode 100644 index 000000000..46f38e16e --- /dev/null +++ b/BugsnagUnity/ProjectSettings/VFXManager.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 + m_CompiledVersion: 0 + m_RuntimeVersion: 0 diff --git a/BugsnagUnity/ProjectSettings/VersionControlSettings.asset b/BugsnagUnity/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 000000000..dca288142 --- /dev/null +++ b/BugsnagUnity/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/BugsnagUnity/ProjectSettings/XRSettings.asset b/BugsnagUnity/ProjectSettings/XRSettings.asset new file mode 100644 index 000000000..482590c19 --- /dev/null +++ b/BugsnagUnity/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file diff --git a/BugsnagUnity/ProjectSettings/boot.config b/BugsnagUnity/ProjectSettings/boot.config new file mode 100644 index 000000000..e69de29bb From d1131cd613ac3841dedb7e3dfe2f3339eff94fe1 Mon Sep 17 00:00:00 2001 From: richard elms Date: Mon, 4 Nov 2024 15:58:12 +0100 Subject: [PATCH 02/46] ready to test big rake changes --- .gitmodules | 3 - .../Assets/Bugsnag}/Editor.meta | 0 .../Editor/BugsnagAddScriptingSymbol.cs | 0 .../Editor/BugsnagAddScriptingSymbol.cs.meta | 0 .../Bugsnag}/Editor/BugsnagEditor.EDM.cs | 0 .../Bugsnag}/Editor/BugsnagEditor.EDM.cs.meta | 0 .../Assets/Bugsnag}/Editor/BugsnagEditor.cs | 0 .../Bugsnag}/Editor/BugsnagEditor.cs.meta | 0 .../Assets/Bugsnag}/Editor/icon-dark.png | Bin .../Assets/Bugsnag}/Editor/icon-dark.png.meta | 0 .../Assets/Bugsnag}/Editor/icon-light.png | Bin .../Bugsnag}/Editor/icon-light.png.meta | 0 .../Assets/Bugsnag}/Plugins.meta | 0 .../Assets/Bugsnag/Plugins/Android.meta | 2 +- .../Assets/Bugsnag/Plugins/Cocoa.meta | 2 +- .../Bugsnag/Plugins/Cocoa}/BugsnagUnity.mm | 0 .../Plugins/Cocoa/BugsnagUnity.mm.meta | 44 +- .../Assets/Bugsnag/Plugins}/MacOS.meta | 2 +- .../Assets/Bugsnag/Plugins/iOS.meta | 2 +- .../Assets/Bugsnag}/Scripts.meta | 0 .../Scripts/AutomaticDataCollector.cs | 0 .../Scripts/AutomaticDataCollector.cs.meta | 0 .../Assets/Bugsnag}/Scripts/BlockingQueue.cs | 0 .../Bugsnag}/Scripts/BlockingQueue.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Bugsnag.cs | 0 .../Assets/Bugsnag}/Scripts/Bugsnag.cs.meta | 0 .../Bugsnag}/Scripts/BugsnagAutoInit.cs | 0 .../Bugsnag}/Scripts/BugsnagAutoInit.cs.meta | 0 .../Bugsnag}/Scripts/BugsnagSettingsObject.cs | 0 .../Scripts/BugsnagSettingsObject.cs.meta | 0 .../Scripts/BugsnagUnityWebRequest.meta | 0 .../BugsnagUnityWebRequest.cs | 0 .../BugsnagUnityWebRequest.cs.meta | 0 .../Scripts/BugsnagUnityWebRequest/README.md | 0 .../BugsnagUnityWebRequest/README.md.meta | 0 .../Assets/Bugsnag}/Scripts/Client.cs | 0 .../Assets/Bugsnag}/Scripts/Client.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Configuration.cs | 0 .../Bugsnag}/Scripts/Configuration.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Delivery.cs | 0 .../Assets/Bugsnag}/Scripts/Delivery.cs.meta | 0 .../Bugsnag}/Scripts/EndpointConfiguration.cs | 0 .../Scripts/EndpointConfiguration.cs.meta | 0 .../Assets/Bugsnag}/Scripts/IBreadcrumbs.cs | 0 .../Bugsnag}/Scripts/IBreadcrumbs.cs.meta | 0 .../Assets/Bugsnag}/Scripts/ICacheManager.cs | 0 .../Bugsnag}/Scripts/ICacheManager.cs.meta | 0 .../Assets/Bugsnag}/Scripts/IClient.cs | 0 .../Assets/Bugsnag}/Scripts/IClient.cs.meta | 0 .../Bugsnag}/Scripts/IFeatureFlagStore.cs | 0 .../Scripts/IFeatureFlagStore.cs.meta | 0 .../Assets/Bugsnag}/Scripts/IFilterable.cs | 0 .../Bugsnag}/Scripts/IFilterable.cs.meta | 0 .../Bugsnag}/Scripts/IMetadataEditor.cs | 0 .../Bugsnag}/Scripts/IMetadataEditor.cs.meta | 0 .../Assets/Bugsnag}/Scripts/INativeClient.cs | 0 .../Bugsnag}/Scripts/INativeClient.cs.meta | 0 .../Assets/Bugsnag}/Scripts/IUserEditor.cs | 0 .../Bugsnag}/Scripts/IUserEditor.cs.meta | 0 .../Assets/Bugsnag}/Scripts/LastRunInfo.cs | 0 .../Bugsnag}/Scripts/LastRunInfo.cs.meta | 0 .../Scripts/LogTypeSeverityMapping.cs | 0 .../Scripts/LogTypeSeverityMapping.cs.meta | 0 .../Scripts/MainThreadDispatchBehaviour.cs | 0 .../MainThreadDispatchBehaviour.cs.meta | 0 .../Bugsnag}/Scripts/MaximumLogTypeCounter.cs | 0 .../Scripts/MaximumLogTypeCounter.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Native.meta | 0 .../Bugsnag}/Scripts/Native/Android.meta | 0 .../Scripts/Native/Android/Breadcrumbs.cs | 0 .../Native/Android/Breadcrumbs.cs.meta | 0 .../Scripts/Native/Android/NativeApp.cs | 0 .../Scripts/Native/Android/NativeApp.cs.meta | 0 .../Native/Android/NativeAppWithState.cs | 0 .../Native/Android/NativeAppWithState.cs.meta | 0 .../Native/Android/NativeBreadcrumb.cs | 0 .../Native/Android/NativeBreadcrumb.cs.meta | 0 .../Scripts/Native/Android/NativeClient.cs | 0 .../Native/Android/NativeClient.cs.meta | 0 .../Scripts/Native/Android/NativeDevice.cs | 0 .../Native/Android/NativeDevice.cs.meta | 0 .../Native/Android/NativeDeviceWithState.cs | 0 .../Android/NativeDeviceWithState.cs.meta | 0 .../Scripts/Native/Android/NativeError.cs | 0 .../Native/Android/NativeError.cs.meta | 0 .../Scripts/Native/Android/NativeEvent.cs | 0 .../Native/Android/NativeEvent.cs.meta | 0 .../Scripts/Native/Android/NativeInterface.cs | 0 .../Native/Android/NativeInterface.cs.meta | 0 .../Android/NativePayloadClassWrapper.cs | 0 .../Android/NativePayloadClassWrapper.cs.meta | 0 .../Scripts/Native/Android/NativeSession.cs | 0 .../Native/Android/NativeSession.cs.meta | 0 .../Native/Android/NativeStackFrame.cs | 0 .../Native/Android/NativeStackFrame.cs.meta | 0 .../Scripts/Native/Android/NativeThread.cs | 0 .../Native/Android/NativeThread.cs.meta | 0 .../Scripts/Native/Android/NativeUser.cs | 0 .../Scripts/Native/Android/NativeUser.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Native/Cocoa.meta | 0 .../Scripts/Native/Cocoa/Breadcrumbs.cs | 0 .../Scripts/Native/Cocoa/Breadcrumbs.cs.meta | 0 .../Scripts/Native/Cocoa/NativeApp.cs | 0 .../Scripts/Native/Cocoa/NativeApp.cs.meta | 0 .../Native/Cocoa/NativeAppWithState.cs | 0 .../Native/Cocoa/NativeAppWithState.cs.meta | 0 .../Scripts/Native/Cocoa/NativeBreadcrumb.cs | 0 .../Native/Cocoa/NativeBreadcrumb.cs.meta | 0 .../Scripts/Native/Cocoa/NativeClient.cs | 0 .../Scripts/Native/Cocoa/NativeClient.cs.meta | 0 .../Scripts/Native/Cocoa/NativeCode.cs | 0 .../Scripts/Native/Cocoa/NativeCode.cs.meta | 0 .../Scripts/Native/Cocoa/NativeDevice.cs | 0 .../Scripts/Native/Cocoa/NativeDevice.cs.meta | 0 .../Native/Cocoa/NativeDeviceWithState.cs | 0 .../Cocoa/NativeDeviceWithState.cs.meta | 0 .../Scripts/Native/Cocoa/NativeError.cs | 0 .../Scripts/Native/Cocoa/NativeError.cs.meta | 0 .../Scripts/Native/Cocoa/NativeEvent.cs | 0 .../Scripts/Native/Cocoa/NativeEvent.cs.meta | 0 .../Scripts/Native/Cocoa/NativeImage.cs | 0 .../Scripts/Native/Cocoa/NativeImage.cs.meta | 0 .../Native/Cocoa/NativePayloadClassWrapper.cs | 0 .../Cocoa/NativePayloadClassWrapper.cs.meta | 0 .../Scripts/Native/Cocoa/NativeSession.cs | 0 .../Native/Cocoa/NativeSession.cs.meta | 0 .../Scripts/Native/Cocoa/NativeStackFrame.cs | 0 .../Native/Cocoa/NativeStackFrame.cs.meta | 0 .../Scripts/Native/Cocoa/NativeThread.cs | 0 .../Scripts/Native/Cocoa/NativeThread.cs.meta | 0 .../Scripts/Native/Cocoa/NativeUser.cs | 0 .../Scripts/Native/Cocoa/NativeUser.cs.meta | 0 .../Bugsnag}/Scripts/Native/Fallback.meta | 0 .../Scripts/Native/Fallback/Breadcrumbs.cs | 0 .../Native/Fallback/Breadcrumbs.cs.meta | 0 .../Scripts/Native/Fallback/CacheManager.cs | 0 .../Native/Fallback/CacheManager.cs.meta | 0 .../Scripts/Native/Fallback/NativeClient.cs | 0 .../Native/Fallback/NativeClient.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Native/MacOS.meta | 0 .../Scripts/Native/MacOS/NativeCode.cs | 0 .../Scripts/Native/MacOS/NativeCode.cs.meta | 0 .../Bugsnag}/Scripts/Native/Windows.meta | 0 .../Scripts/Native/Windows/NativeClient.cs | 0 .../Native/Windows/NativeClient.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Native/iOS.meta | 0 .../Bugsnag}/Scripts/Native/iOS/NativeCode.cs | 0 .../Scripts/Native/iOS/NativeCode.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Payload.meta | 0 .../Assets/Bugsnag}/Scripts/Payload/App.cs | 0 .../Bugsnag}/Scripts/Payload/App.cs.meta | 0 .../Bugsnag}/Scripts/Payload/AppWithState.cs | 0 .../Scripts/Payload/AppWithState.cs.meta | 0 .../Bugsnag}/Scripts/Payload/Breadcrumb.cs | 0 .../Scripts/Payload/Breadcrumb.cs.meta | 0 .../Scripts/Payload/BreadcrumbType.cs | 0 .../Scripts/Payload/BreadcrumbType.cs.meta | 0 .../Bugsnag}/Scripts/Payload/Correlation.cs | 0 .../Scripts/Payload/Correlation.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Payload/Device.cs | 0 .../Bugsnag}/Scripts/Payload/Device.cs.meta | 0 .../Scripts/Payload/DeviceWithState.cs | 0 .../Scripts/Payload/DeviceWithState.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Payload/Error.cs | 0 .../Bugsnag}/Scripts/Payload/Error.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Payload/Event.cs | 0 .../Bugsnag}/Scripts/Payload/Event.cs.meta | 0 .../Bugsnag}/Scripts/Payload/FeatureFlag.cs | 0 .../Scripts/Payload/FeatureFlag.cs.meta | 0 .../Bugsnag}/Scripts/Payload/HandledState.cs | 0 .../Scripts/Payload/HandledState.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Payload/IApp.cs | 0 .../Bugsnag}/Scripts/Payload/IApp.cs.meta | 0 .../Bugsnag}/Scripts/Payload/IAppWithState.cs | 0 .../Scripts/Payload/IAppWithState.cs.meta | 0 .../Bugsnag}/Scripts/Payload/IBreadcrumb.cs | 0 .../Scripts/Payload/IBreadcrumb.cs.meta | 0 .../Bugsnag}/Scripts/Payload/IDevice.cs | 0 .../Bugsnag}/Scripts/Payload/IDevice.cs.meta | 0 .../Scripts/Payload/IDeviceWithState.cs | 0 .../Scripts/Payload/IDeviceWithState.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Payload/IError.cs | 0 .../Bugsnag}/Scripts/Payload/IError.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Payload/IEvent.cs | 0 .../Bugsnag}/Scripts/Payload/IEvent.cs.meta | 0 .../Bugsnag}/Scripts/Payload/IPayload.cs | 0 .../Bugsnag}/Scripts/Payload/IPayload.cs.meta | 0 .../Bugsnag}/Scripts/Payload/ISession.cs | 0 .../Bugsnag}/Scripts/Payload/ISession.cs.meta | 0 .../Bugsnag}/Scripts/Payload/IStackframe.cs | 0 .../Scripts/Payload/IStackframe.cs.meta | 0 .../Bugsnag}/Scripts/Payload/IThread.cs | 0 .../Bugsnag}/Scripts/Payload/IThread.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Payload/IUser.cs | 0 .../Bugsnag}/Scripts/Payload/IUser.cs.meta | 0 .../Bugsnag}/Scripts/Payload/Metadata.cs | 0 .../Bugsnag}/Scripts/Payload/Metadata.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Payload/Method.cs | 0 .../Bugsnag}/Scripts/Payload/Method.cs.meta | 0 .../Scripts/Payload/MethodParameter.cs | 0 .../Scripts/Payload/MethodParameter.cs.meta | 0 .../Bugsnag}/Scripts/Payload/NotifierInfo.cs | 0 .../Scripts/Payload/NotifierInfo.cs.meta | 0 .../Scripts/Payload/PayloadContainer.cs | 0 .../Scripts/Payload/PayloadContainer.cs.meta | 0 .../Scripts/Payload/PayloadExtensions.cs | 0 .../Scripts/Payload/PayloadExtensions.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Payload/Report.cs | 0 .../Bugsnag}/Scripts/Payload/Report.cs.meta | 0 .../Bugsnag}/Scripts/Payload/Session.cs | 0 .../Bugsnag}/Scripts/Payload/Session.cs.meta | 0 .../Bugsnag}/Scripts/Payload/SessionReport.cs | 0 .../Scripts/Payload/SessionReport.cs.meta | 0 .../Scripts/Payload/StackTraceLine.cs | 0 .../Scripts/Payload/StackTraceLine.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Payload/User.cs | 0 .../Bugsnag}/Scripts/Payload/User.cs.meta | 0 .../Assets/Bugsnag}/Scripts/PayloadManager.cs | 0 .../Bugsnag}/Scripts/PayloadManager.cs.meta | 0 .../Bugsnag}/Scripts/PerformanceHelper.cs | 0 .../Scripts/PerformanceHelper.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Polyfills.cs | 0 .../Assets/Bugsnag}/Scripts/Polyfills.cs.meta | 0 .../Bugsnag}/Scripts/PostProcessBuild.cs | 0 .../Bugsnag}/Scripts/PostProcessBuild.cs.meta | 0 .../Assets/Bugsnag}/Scripts/SessionTracker.cs | 0 .../Bugsnag}/Scripts/SessionTracker.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Severity.cs | 0 .../Assets/Bugsnag}/Scripts/Severity.cs.meta | 0 .../Assets/Bugsnag}/Scripts/SimpleJson.cs | 0 .../Bugsnag}/Scripts/SimpleJson.cs.meta | 0 .../Assets/Bugsnag}/Scripts/TelemetryType.cs | 0 .../Bugsnag}/Scripts/TelemetryType.cs.meta | 0 .../Bugsnag}/Scripts/ThreadSendPolicy.cs | 0 .../Bugsnag}/Scripts/ThreadSendPolicy.cs.meta | 0 .../Assets/Bugsnag}/Scripts/Time.cs | 0 .../Assets/Bugsnag}/Scripts/Time.cs.meta | 0 .../Scripts/TimingTrackerBehaviour.cs | 0 .../Scripts/TimingTrackerBehaviour.cs.meta | 0 .../Assets/Bugsnag}/Scripts/TypeNameHelper.cs | 0 .../Bugsnag}/Scripts/TypeNameHelper.cs.meta | 0 .../Bugsnag}/Scripts/UniqueLogThrottle.cs | 0 .../Scripts/UniqueLogThrottle.cs.meta | 0 .../Bugsnag}/Scripts/UnityLogMessage.cs | 0 .../Bugsnag}/Scripts/UnityLogMessage.cs.meta | 0 .../Assets/BugsnagUnity.meta | 0 .../Assets/Resources.meta | 0 .../Bugsnag/BugsnagSettingsObject.asset | 0 .../Bugsnag/BugsnagSettingsObject.asset.meta | 0 {BugsnagUnity => Bugsnag}/Assets/Scenes.meta | 0 .../Assets/Scenes/SampleScene.unity | 0 .../Assets/Scenes/SampleScene.unity.meta | 0 {BugsnagUnity => Bugsnag}/Assets/Scripts.meta | 0 .../Assets/Scripts/Testing.cs | 0 .../Assets/Scripts/Testing.cs.meta | 0 .../Assets/TextMesh Pro.meta | 0 .../Assets/TextMesh Pro/Documentation.meta | 0 .../TextMesh Pro User Guide 2016.pdf | Bin .../TextMesh Pro User Guide 2016.pdf.meta | 0 .../Assets/TextMesh Pro/Fonts.meta | 0 .../Fonts/LiberationSans - OFL.txt | 0 .../Fonts/LiberationSans - OFL.txt.meta | 0 .../TextMesh Pro/Fonts/LiberationSans.ttf | Bin .../Fonts/LiberationSans.ttf.meta | 0 .../Assets/TextMesh Pro/Resources.meta | 0 .../Resources/Fonts & Materials.meta | 0 .../LiberationSans SDF - Drop Shadow.mat | 0 .../LiberationSans SDF - Drop Shadow.mat.meta | 0 .../LiberationSans SDF - Fallback.asset | 0 .../LiberationSans SDF - Fallback.asset.meta | 0 .../LiberationSans SDF - Outline.mat | 0 .../LiberationSans SDF - Outline.mat.meta | 0 .../LiberationSans SDF.asset | 0 .../LiberationSans SDF.asset.meta | 0 .../LineBreaking Following Characters.txt | 0 ...LineBreaking Following Characters.txt.meta | 0 .../LineBreaking Leading Characters.txt | 0 .../LineBreaking Leading Characters.txt.meta | 0 .../TextMesh Pro/Resources/Sprite Assets.meta | 0 .../Resources/Sprite Assets/EmojiOne.asset | 0 .../Sprite Assets/EmojiOne.asset.meta | 0 .../TextMesh Pro/Resources/Style Sheets.meta | 0 .../Style Sheets/Default Style Sheet.asset | 0 .../Default Style Sheet.asset.meta | 0 .../TextMesh Pro/Resources/TMP Settings.asset | 0 .../Resources/TMP Settings.asset.meta | 0 .../Assets/TextMesh Pro/Shaders.meta | 0 .../Shaders/TMP_Bitmap-Custom-Atlas.shader | 0 .../TMP_Bitmap-Custom-Atlas.shader.meta | 0 .../Shaders/TMP_Bitmap-Mobile.shader | 0 .../Shaders/TMP_Bitmap-Mobile.shader.meta | 0 .../TextMesh Pro/Shaders/TMP_Bitmap.shader | 0 .../Shaders/TMP_Bitmap.shader.meta | 0 .../Shaders/TMP_SDF Overlay.shader | 0 .../Shaders/TMP_SDF Overlay.shader.meta | 0 .../TextMesh Pro/Shaders/TMP_SDF SSD.shader | 0 .../Shaders/TMP_SDF SSD.shader.meta | 0 .../Shaders/TMP_SDF-Mobile Masking.shader | 0 .../TMP_SDF-Mobile Masking.shader.meta | 0 .../Shaders/TMP_SDF-Mobile Overlay.shader | 0 .../TMP_SDF-Mobile Overlay.shader.meta | 0 .../Shaders/TMP_SDF-Mobile SSD.shader | 0 .../Shaders/TMP_SDF-Mobile SSD.shader.meta | 0 .../Shaders/TMP_SDF-Mobile.shader | 0 .../Shaders/TMP_SDF-Mobile.shader.meta | 0 .../Shaders/TMP_SDF-Surface-Mobile.shader | 0 .../TMP_SDF-Surface-Mobile.shader.meta | 0 .../Shaders/TMP_SDF-Surface.shader | 0 .../Shaders/TMP_SDF-Surface.shader.meta | 0 .../TextMesh Pro/Shaders/TMP_SDF.shader | 0 .../TextMesh Pro/Shaders/TMP_SDF.shader.meta | 0 .../TextMesh Pro/Shaders/TMP_Sprite.shader | 0 .../Shaders/TMP_Sprite.shader.meta | 0 .../Assets/TextMesh Pro/Shaders/TMPro.cginc | 0 .../TextMesh Pro/Shaders/TMPro.cginc.meta | 0 .../TextMesh Pro/Shaders/TMPro_Mobile.cginc | 0 .../Shaders/TMPro_Mobile.cginc.meta | 0 .../Shaders/TMPro_Properties.cginc | 0 .../Shaders/TMPro_Properties.cginc.meta | 0 .../TextMesh Pro/Shaders/TMPro_Surface.cginc | 0 .../Shaders/TMPro_Surface.cginc.meta | 0 .../Assets/TextMesh Pro/Sprites.meta | 0 .../Sprites/EmojiOne Attribution.txt | 0 .../Sprites/EmojiOne Attribution.txt.meta | 0 .../Assets/TextMesh Pro/Sprites/EmojiOne.json | 0 .../TextMesh Pro/Sprites/EmojiOne.json.meta | 0 .../Assets/TextMesh Pro/Sprites/EmojiOne.png | Bin .../TextMesh Pro/Sprites/EmojiOne.png.meta | 0 .../ProjectSettings/AudioManager.asset | 0 .../ProjectSettings/ClusterInputManager.asset | 0 .../ProjectSettings/DynamicsManager.asset | 0 .../ProjectSettings/EditorBuildSettings.asset | 0 .../ProjectSettings/EditorSettings.asset | 0 .../ProjectSettings/GraphicsSettings.asset | 0 .../ProjectSettings/InputManager.asset | 0 .../ProjectSettings/MemorySettings.asset | 0 .../ProjectSettings/NavMeshAreas.asset | 0 .../ProjectSettings/NetworkManager.asset | 0 .../PackageManagerSettings.asset | 0 .../ProjectSettings/Physics2DSettings.asset | 0 .../ProjectSettings/PresetManager.asset | 0 .../ProjectSettings/ProjectSettings.asset | 0 .../ProjectSettings/ProjectVersion.txt | 0 .../ProjectSettings/QualitySettings.asset | 0 .../SceneTemplateSettings.json | 0 .../ProjectSettings/TagManager.asset | 0 .../ProjectSettings/TimeManager.asset | 0 .../UnityConnectSettings.asset | 0 .../ProjectSettings/VFXManager.asset | 0 .../VersionControlSettings.asset | 0 .../ProjectSettings/XRSettings.asset | 0 .../ProjectSettings/boot.config | 0 BugsnagUnity.sln | 75 - Makefile | 7 - Rakefile | 204 +- build.ps1 | 61 - build.sh | 50 - .../Editor/BugsnagAddScriptingSymbol.cs | 38 - .../Editor/BugsnagAddScriptingSymbol.cs.meta | 11 - .../Bugsnag/Editor/BugsnagEditor.EDM.cs | 174 -- .../Bugsnag/Editor/BugsnagEditor.EDM.cs.meta | 11 - src/Assets/Bugsnag/Editor/BugsnagEditor.cs | 252 -- .../Bugsnag/Editor/BugsnagEditor.cs.meta | 14 - src/Assets/Bugsnag/Editor/icon-dark.png | Bin 1563 -> 0 bytes src/Assets/Bugsnag/Editor/icon-dark.png.meta | 88 - src/Assets/Bugsnag/Editor/icon-light.png | Bin 1568 -> 0 bytes src/Assets/Bugsnag/Editor/icon-light.png.meta | 88 - src/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs | 56 - .../Bugsnag/Scripts/BugsnagAutoInit.cs.meta | 11 - .../Bugsnag/Scripts/BugsnagSettingsObject.cs | 221 -- .../Scripts/BugsnagSettingsObject.cs.meta | 11 - src/BugsnagUnity/AutomaticDataCollector.cs | 49 - src/BugsnagUnity/BlockingQueue.cs | 39 - src/BugsnagUnity/Bugsnag.cs | 172 -- src/BugsnagUnity/BugsnagUnity.Android.csproj | 7 - src/BugsnagUnity/BugsnagUnity.MacOS.csproj | 8 - src/BugsnagUnity/BugsnagUnity.Windows.csproj | 8 - src/BugsnagUnity/BugsnagUnity.csproj | 6 - src/BugsnagUnity/BugsnagUnity.iOS.csproj | 8 - src/BugsnagUnity/BugsnagUnityWebRequest | 1 - src/BugsnagUnity/Client.cs | 744 ------ src/BugsnagUnity/Configuration.cs | 385 --- src/BugsnagUnity/Delivery.cs | 622 ----- src/BugsnagUnity/EndpointConfiguration.cs | 60 - src/BugsnagUnity/IBreadcrumbs.cs | 14 - src/BugsnagUnity/ICacheManager.cs | 21 - src/BugsnagUnity/IClient.cs | 57 - src/BugsnagUnity/IFeatureFlagStore.cs | 13 - src/BugsnagUnity/IFilterable.cs | 8 - src/BugsnagUnity/IMetadataEditor.cs | 20 - src/BugsnagUnity/INativeClient.cs | 113 - src/BugsnagUnity/IUserEditor.cs | 10 - src/BugsnagUnity/LastRunInfo.cs | 13 - src/BugsnagUnity/LogTypeSeverityMapping.cs | 37 - .../MainThreadDispatchBehaviour.cs | 103 - src/BugsnagUnity/MaximumLogTypeCounter.cs | 70 - .../Native/Android/Breadcrumbs.cs | 54 - src/BugsnagUnity/Native/Android/NativeApp.cs | 24 - .../Native/Android/NativeAppWithState.cs | 16 - .../Native/Android/NativeBreadcrumb.cs | 31 - .../Native/Android/NativeClient.cs | 166 -- .../Native/Android/NativeDevice.cs | 29 - .../Native/Android/NativeDeviceWithState.cs | 16 - .../Native/Android/NativeError.cs | 37 - .../Native/Android/NativeEvent.cs | 193 -- .../Native/Android/NativeInterface.cs | 1291 ---------- .../Android/NativePayloadClassWrapper.cs | 287 --- .../Native/Android/NativeSession.cs | 26 - .../Native/Android/NativeStackFrame.cs | 24 - .../Native/Android/NativeThread.cs | 39 - src/BugsnagUnity/Native/Android/NativeUser.cs | 15 - src/BugsnagUnity/Native/Cocoa/Breadcrumbs.cs | 89 - src/BugsnagUnity/Native/Cocoa/NativeApp.cs | 46 - .../Native/Cocoa/NativeAppWithState.cs | 83 - .../Native/Cocoa/NativeBreadcrumb.cs | 53 - src/BugsnagUnity/Native/Cocoa/NativeClient.cs | 487 ---- src/BugsnagUnity/Native/Cocoa/NativeCode.cs | 337 --- src/BugsnagUnity/Native/Cocoa/NativeDevice.cs | 79 - .../Native/Cocoa/NativeDeviceWithState.cs | 27 - src/BugsnagUnity/Native/Cocoa/NativeError.cs | 43 - src/BugsnagUnity/Native/Cocoa/NativeEvent.cs | 225 -- src/BugsnagUnity/Native/Cocoa/NativeImage.cs | 119 - .../Native/Cocoa/NativePayloadClassWrapper.cs | 109 - .../Native/Cocoa/NativeSession.cs | 40 - .../Native/Cocoa/NativeStackFrame.cs | 48 - src/BugsnagUnity/Native/Cocoa/NativeThread.cs | 47 - src/BugsnagUnity/Native/Cocoa/NativeUser.cs | 20 - .../Native/Fallback/Breadcrumbs.cs | 65 - .../Native/Fallback/CacheManager.cs | 298 --- .../Native/Fallback/NativeClient.cs | 173 -- src/BugsnagUnity/Native/MacOS/NativeCode.cs | 7 - .../Native/Windows/NativeClient.cs | 220 -- src/BugsnagUnity/Native/iOS/NativeCode.cs | 7 - src/BugsnagUnity/Payload/App.cs | 127 - src/BugsnagUnity/Payload/AppWithState.cs | 63 - src/BugsnagUnity/Payload/Breadcrumb.cs | 143 -- src/BugsnagUnity/Payload/BreadcrumbType.cs | 51 - src/BugsnagUnity/Payload/Correlation.cs | 53 - src/BugsnagUnity/Payload/Device.cs | 162 -- src/BugsnagUnity/Payload/DeviceWithState.cs | 51 - src/BugsnagUnity/Payload/Error.cs | 294 --- src/BugsnagUnity/Payload/Event.cs | 388 --- src/BugsnagUnity/Payload/FeatureFlag.cs | 37 - src/BugsnagUnity/Payload/HandledState.cs | 151 -- src/BugsnagUnity/Payload/IApp.cs | 16 - src/BugsnagUnity/Payload/IAppWithState.cs | 12 - src/BugsnagUnity/Payload/IBreadcrumb.cs | 16 - src/BugsnagUnity/Payload/IDevice.cs | 22 - src/BugsnagUnity/Payload/IDeviceWithState.cs | 12 - src/BugsnagUnity/Payload/IError.cs | 16 - src/BugsnagUnity/Payload/IEvent.cs | 32 - src/BugsnagUnity/Payload/IPayload.cs | 26 - src/BugsnagUnity/Payload/ISession.cs | 15 - src/BugsnagUnity/Payload/IStackframe.cs | 30 - src/BugsnagUnity/Payload/IThread.cs | 14 - src/BugsnagUnity/Payload/IUser.cs | 12 - src/BugsnagUnity/Payload/Metadata.cs | 126 - src/BugsnagUnity/Payload/Method.cs | 53 - src/BugsnagUnity/Payload/MethodParameter.cs | 46 - src/BugsnagUnity/Payload/NotifierInfo.cs | 17 - src/BugsnagUnity/Payload/PayloadContainer.cs | 47 - src/BugsnagUnity/Payload/PayloadExtensions.cs | 47 - src/BugsnagUnity/Payload/Report.cs | 83 - src/BugsnagUnity/Payload/Session.cs | 127 - src/BugsnagUnity/Payload/SessionReport.cs | 65 - src/BugsnagUnity/Payload/StackTraceLine.cs | 189 -- src/BugsnagUnity/Payload/User.cs | 87 - src/BugsnagUnity/PayloadManager.cs | 133 - src/BugsnagUnity/PerformanceHelper.cs | 81 - src/BugsnagUnity/Polyfills.cs | 19 - src/BugsnagUnity/PostProcessBuild.cs | 79 - src/BugsnagUnity/SessionTracker.cs | 188 -- src/BugsnagUnity/Severity.cs | 55 - src/BugsnagUnity/SimpleJson.cs | 2190 ----------------- src/BugsnagUnity/TelemetryType.cs | 9 - src/BugsnagUnity/ThreadSendPolicy.cs | 10 - src/BugsnagUnity/Time.cs | 36 - src/BugsnagUnity/TimingTrackerBehaviour.cs | 38 - src/BugsnagUnity/TypeNameHelper.cs | 161 -- src/BugsnagUnity/UniqueLogThrottle.cs | 73 - src/BugsnagUnity/UnityLogMessage.cs | 37 - src/Directory.build.props | 35 - unity/PackageProject/.gitignore | 14 - .../Assets/Bugsnag/Plugins.meta | 8 - .../Android/BugsnagUnity.Android.dll.meta | 120 - .../Bugsnag/Plugins/BugsnagUnity.dll.meta | 125 - .../Assets/Bugsnag/Plugins/OSX.meta | 8 - .../Plugins/OSX/BugsnagUnity.MacOS.dll.meta | 123 - .../Plugins/OSX/bugsnag-osx.bundle.meta | 124 - .../OSX/bugsnag-osx.bundle/Contents.meta | 8 - .../bugsnag-osx.bundle/Contents/Headers.meta | 8 - .../Headers/BSG_KSCrashReportWriter.h.meta | 7 - .../Contents/Headers/Bugsnag.h.meta | 7 - .../Contents/Headers/BugsnagApp.h.meta | 7 - .../Headers/BugsnagAppWithState.h.meta | 7 - .../Contents/Headers/BugsnagBreadcrumb.h.meta | 7 - .../Contents/Headers/BugsnagClient.h.meta | 7 - .../Headers/BugsnagConfiguration.h.meta | 7 - .../Contents/Headers/BugsnagDevice.h.meta | 7 - .../Headers/BugsnagDeviceWithState.h.meta | 7 - .../BugsnagEndpointConfiguration.h.meta | 7 - .../Contents/Headers/BugsnagError.h.meta | 7 - .../Contents/Headers/BugsnagErrorTypes.h.meta | 7 - .../Contents/Headers/BugsnagEvent.h.meta | 7 - .../Headers/BugsnagLastRunInfo.h.meta | 7 - .../Contents/Headers/BugsnagMetadata.h.meta | 7 - .../Headers/BugsnagMetadataStore.h.meta | 7 - .../Contents/Headers/BugsnagPlugin.h.meta | 7 - .../Contents/Headers/BugsnagSession.h.meta | 7 - .../Contents/Headers/BugsnagStackframe.h.meta | 7 - .../Contents/Headers/BugsnagThread.h.meta | 7 - .../Contents/Headers/BugsnagUser.h.meta | 7 - .../Contents/MacOS/bugsnag-osx.meta | 7 - .../Assets/Bugsnag/Plugins/Windows.meta | 8 - .../Windows/BugsnagUnity.Windows.dll.meta | 123 - .../Plugins/iOS/BugsnagUnity.iOS.dll.meta | 120 - .../Assets/Bugsnag/Plugins/tvOS.meta | 8 - .../Plugins/tvOS/BugsnagUnity.iOS.dll.meta | 120 - .../Plugins/tvOS/libbugsnag-tvos.a.meta | 114 - unity/PackageProject/Logs/Packages-Update.log | 52 - unity/PackageProject/Packages/manifest.json | 49 - .../ProjectSettings/AudioManager.asset | 17 - .../ProjectSettings/ClusterInputManager.asset | 6 - .../ProjectSettings/DynamicsManager.asset | 29 - .../ProjectSettings/EditorBuildSettings.asset | 7 - .../ProjectSettings/EditorSettings.asset | 21 - .../ProjectSettings/GraphicsSettings.asset | 61 - .../ProjectSettings/InputManager.asset | 295 --- .../ProjectSettings/NavMeshAreas.asset | 91 - .../ProjectSettings/NetworkManager.asset | 8 - .../ProjectSettings/Physics2DSettings.asset | 37 - .../ProjectSettings/PresetManager.asset | 7 - .../ProjectSettings/ProjectSettings.asset | 641 ----- .../ProjectSettings/ProjectVersion.txt | 1 - .../ProjectSettings/QualitySettings.asset | 191 -- .../ProjectSettings/TagManager.asset | 43 - .../ProjectSettings/TimeManager.asset | 9 - .../UnityConnectSettings.asset | 34 - .../ProjectSettings/VFXManager.asset | 12 - .../ProjectSettings/XRSettings.asset | 10 - 540 files changed, 25 insertions(+), 17440 deletions(-) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Editor.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Editor/BugsnagAddScriptingSymbol.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Editor/BugsnagAddScriptingSymbol.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Editor/BugsnagEditor.EDM.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Editor/BugsnagEditor.EDM.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Editor/BugsnagEditor.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Editor/BugsnagEditor.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Editor/icon-dark.png (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Editor/icon-dark.png.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Editor/icon-light.png (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Editor/icon-light.png.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Plugins.meta (100%) rename {unity/PackageProject => Bugsnag}/Assets/Bugsnag/Plugins/Android.meta (77%) rename unity/PackageProject/Assets/Bugsnag.meta => Bugsnag/Assets/Bugsnag/Plugins/Cocoa.meta (77%) rename {src => Bugsnag/Assets/Bugsnag/Plugins/Cocoa}/BugsnagUnity.mm (100%) rename unity/PackageProject/Assets/Bugsnag/Plugins/iOS/libbugsnag-ios.a.meta => Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm.meta (69%) rename {unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents => Bugsnag/Assets/Bugsnag/Plugins}/MacOS.meta (77%) rename {unity/PackageProject => Bugsnag}/Assets/Bugsnag/Plugins/iOS.meta (77%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/AutomaticDataCollector.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/AutomaticDataCollector.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/BlockingQueue.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/BlockingQueue.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Bugsnag.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Bugsnag.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/BugsnagAutoInit.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/BugsnagAutoInit.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/BugsnagSettingsObject.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/BugsnagSettingsObject.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/BugsnagUnityWebRequest.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/BugsnagUnityWebRequest/README.md (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/BugsnagUnityWebRequest/README.md.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Client.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Client.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Configuration.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Configuration.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Delivery.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Delivery.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/EndpointConfiguration.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/EndpointConfiguration.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IBreadcrumbs.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IBreadcrumbs.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/ICacheManager.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/ICacheManager.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IClient.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IClient.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IFeatureFlagStore.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IFeatureFlagStore.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IFilterable.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IFilterable.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IMetadataEditor.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IMetadataEditor.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/INativeClient.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/INativeClient.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IUserEditor.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/IUserEditor.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/LastRunInfo.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/LastRunInfo.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/LogTypeSeverityMapping.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/LogTypeSeverityMapping.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/MainThreadDispatchBehaviour.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/MainThreadDispatchBehaviour.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/MaximumLogTypeCounter.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/MaximumLogTypeCounter.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/Breadcrumbs.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/Breadcrumbs.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeApp.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeApp.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeAppWithState.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeAppWithState.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeBreadcrumb.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeBreadcrumb.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeClient.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeClient.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeDevice.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeDevice.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeDeviceWithState.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeDeviceWithState.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeError.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeError.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeEvent.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeEvent.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeInterface.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeInterface.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativePayloadClassWrapper.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativePayloadClassWrapper.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeSession.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeSession.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeStackFrame.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeStackFrame.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeThread.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeThread.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeUser.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Android/NativeUser.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/Breadcrumbs.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/Breadcrumbs.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeApp.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeApp.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeAppWithState.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeAppWithState.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeBreadcrumb.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeBreadcrumb.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeClient.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeClient.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeCode.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeCode.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeDevice.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeDevice.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeDeviceWithState.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeDeviceWithState.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeError.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeError.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeEvent.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeEvent.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeImage.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeImage.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeSession.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeSession.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeStackFrame.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeStackFrame.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeThread.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeThread.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeUser.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Cocoa/NativeUser.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Fallback.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Fallback/Breadcrumbs.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Fallback/Breadcrumbs.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Fallback/CacheManager.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Fallback/CacheManager.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Fallback/NativeClient.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Fallback/NativeClient.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/MacOS.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/MacOS/NativeCode.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/MacOS/NativeCode.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Windows.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Windows/NativeClient.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/Windows/NativeClient.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/iOS.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/iOS/NativeCode.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Native/iOS/NativeCode.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/App.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/App.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/AppWithState.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/AppWithState.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Breadcrumb.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Breadcrumb.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/BreadcrumbType.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/BreadcrumbType.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Correlation.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Correlation.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Device.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Device.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/DeviceWithState.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/DeviceWithState.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Error.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Error.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Event.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Event.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/FeatureFlag.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/FeatureFlag.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/HandledState.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/HandledState.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IApp.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IApp.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IAppWithState.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IAppWithState.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IBreadcrumb.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IBreadcrumb.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IDevice.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IDevice.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IDeviceWithState.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IDeviceWithState.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IError.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IError.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IEvent.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IEvent.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IPayload.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IPayload.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/ISession.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/ISession.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IStackframe.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IStackframe.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IThread.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IThread.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IUser.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/IUser.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Metadata.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Metadata.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Method.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Method.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/MethodParameter.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/MethodParameter.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/NotifierInfo.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/NotifierInfo.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/PayloadContainer.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/PayloadContainer.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/PayloadExtensions.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/PayloadExtensions.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Report.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Report.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Session.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/Session.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/SessionReport.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/SessionReport.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/StackTraceLine.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/StackTraceLine.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/User.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Payload/User.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/PayloadManager.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/PayloadManager.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/PerformanceHelper.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/PerformanceHelper.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Polyfills.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Polyfills.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/PostProcessBuild.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/PostProcessBuild.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/SessionTracker.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/SessionTracker.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Severity.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Severity.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/SimpleJson.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/SimpleJson.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/TelemetryType.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/TelemetryType.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/ThreadSendPolicy.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/ThreadSendPolicy.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Time.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/Time.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/TimingTrackerBehaviour.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/TimingTrackerBehaviour.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/TypeNameHelper.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/TypeNameHelper.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/UniqueLogThrottle.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/UniqueLogThrottle.cs.meta (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/UnityLogMessage.cs (100%) rename {BugsnagUnity/Assets/BugsnagUnity => Bugsnag/Assets/Bugsnag}/Scripts/UnityLogMessage.cs.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/BugsnagUnity.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/Resources.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset (100%) rename {BugsnagUnity => Bugsnag}/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/Scenes.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/Scenes/SampleScene.unity (100%) rename {BugsnagUnity => Bugsnag}/Assets/Scenes/SampleScene.unity.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/Scripts.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/Scripts/Testing.cs (100%) rename {BugsnagUnity => Bugsnag}/Assets/Scripts/Testing.cs.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Documentation.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Fonts.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Fonts/LiberationSans.ttf (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Fonts & Materials.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Sprite Assets.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Style Sheets.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/TMP Settings.asset (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMPro.cginc (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Sprites.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Sprites/EmojiOne.json (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Sprites/EmojiOne.png (100%) rename {BugsnagUnity => Bugsnag}/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/AudioManager.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/ClusterInputManager.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/DynamicsManager.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/EditorBuildSettings.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/EditorSettings.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/GraphicsSettings.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/InputManager.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/MemorySettings.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/NavMeshAreas.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/NetworkManager.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/PackageManagerSettings.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/Physics2DSettings.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/PresetManager.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/ProjectSettings.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/ProjectVersion.txt (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/QualitySettings.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/SceneTemplateSettings.json (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/TagManager.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/TimeManager.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/UnityConnectSettings.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/VFXManager.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/VersionControlSettings.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/XRSettings.asset (100%) rename {BugsnagUnity => Bugsnag}/ProjectSettings/boot.config (100%) delete mode 100644 BugsnagUnity.sln delete mode 100644 Makefile delete mode 100644 build.ps1 delete mode 100755 build.sh delete mode 100644 src/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs delete mode 100644 src/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs.meta delete mode 100644 src/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs delete mode 100644 src/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs.meta delete mode 100644 src/Assets/Bugsnag/Editor/BugsnagEditor.cs delete mode 100644 src/Assets/Bugsnag/Editor/BugsnagEditor.cs.meta delete mode 100644 src/Assets/Bugsnag/Editor/icon-dark.png delete mode 100644 src/Assets/Bugsnag/Editor/icon-dark.png.meta delete mode 100644 src/Assets/Bugsnag/Editor/icon-light.png delete mode 100644 src/Assets/Bugsnag/Editor/icon-light.png.meta delete mode 100644 src/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs delete mode 100644 src/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs.meta delete mode 100644 src/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs delete mode 100644 src/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs.meta delete mode 100644 src/BugsnagUnity/AutomaticDataCollector.cs delete mode 100644 src/BugsnagUnity/BlockingQueue.cs delete mode 100644 src/BugsnagUnity/Bugsnag.cs delete mode 100644 src/BugsnagUnity/BugsnagUnity.Android.csproj delete mode 100644 src/BugsnagUnity/BugsnagUnity.MacOS.csproj delete mode 100644 src/BugsnagUnity/BugsnagUnity.Windows.csproj delete mode 100644 src/BugsnagUnity/BugsnagUnity.csproj delete mode 100644 src/BugsnagUnity/BugsnagUnity.iOS.csproj delete mode 160000 src/BugsnagUnity/BugsnagUnityWebRequest delete mode 100644 src/BugsnagUnity/Client.cs delete mode 100644 src/BugsnagUnity/Configuration.cs delete mode 100644 src/BugsnagUnity/Delivery.cs delete mode 100644 src/BugsnagUnity/EndpointConfiguration.cs delete mode 100644 src/BugsnagUnity/IBreadcrumbs.cs delete mode 100644 src/BugsnagUnity/ICacheManager.cs delete mode 100644 src/BugsnagUnity/IClient.cs delete mode 100644 src/BugsnagUnity/IFeatureFlagStore.cs delete mode 100644 src/BugsnagUnity/IFilterable.cs delete mode 100644 src/BugsnagUnity/IMetadataEditor.cs delete mode 100644 src/BugsnagUnity/INativeClient.cs delete mode 100644 src/BugsnagUnity/IUserEditor.cs delete mode 100644 src/BugsnagUnity/LastRunInfo.cs delete mode 100644 src/BugsnagUnity/LogTypeSeverityMapping.cs delete mode 100644 src/BugsnagUnity/MainThreadDispatchBehaviour.cs delete mode 100644 src/BugsnagUnity/MaximumLogTypeCounter.cs delete mode 100644 src/BugsnagUnity/Native/Android/Breadcrumbs.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeApp.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeAppWithState.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeBreadcrumb.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeClient.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeDevice.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeDeviceWithState.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeError.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeEvent.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeInterface.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativePayloadClassWrapper.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeSession.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeStackFrame.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeThread.cs delete mode 100644 src/BugsnagUnity/Native/Android/NativeUser.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/Breadcrumbs.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeApp.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeAppWithState.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeBreadcrumb.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeClient.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeCode.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeDevice.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeDeviceWithState.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeError.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeEvent.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeImage.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativePayloadClassWrapper.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeSession.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeStackFrame.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeThread.cs delete mode 100644 src/BugsnagUnity/Native/Cocoa/NativeUser.cs delete mode 100644 src/BugsnagUnity/Native/Fallback/Breadcrumbs.cs delete mode 100644 src/BugsnagUnity/Native/Fallback/CacheManager.cs delete mode 100644 src/BugsnagUnity/Native/Fallback/NativeClient.cs delete mode 100644 src/BugsnagUnity/Native/MacOS/NativeCode.cs delete mode 100644 src/BugsnagUnity/Native/Windows/NativeClient.cs delete mode 100644 src/BugsnagUnity/Native/iOS/NativeCode.cs delete mode 100644 src/BugsnagUnity/Payload/App.cs delete mode 100644 src/BugsnagUnity/Payload/AppWithState.cs delete mode 100644 src/BugsnagUnity/Payload/Breadcrumb.cs delete mode 100644 src/BugsnagUnity/Payload/BreadcrumbType.cs delete mode 100644 src/BugsnagUnity/Payload/Correlation.cs delete mode 100644 src/BugsnagUnity/Payload/Device.cs delete mode 100644 src/BugsnagUnity/Payload/DeviceWithState.cs delete mode 100644 src/BugsnagUnity/Payload/Error.cs delete mode 100644 src/BugsnagUnity/Payload/Event.cs delete mode 100644 src/BugsnagUnity/Payload/FeatureFlag.cs delete mode 100644 src/BugsnagUnity/Payload/HandledState.cs delete mode 100644 src/BugsnagUnity/Payload/IApp.cs delete mode 100644 src/BugsnagUnity/Payload/IAppWithState.cs delete mode 100644 src/BugsnagUnity/Payload/IBreadcrumb.cs delete mode 100644 src/BugsnagUnity/Payload/IDevice.cs delete mode 100644 src/BugsnagUnity/Payload/IDeviceWithState.cs delete mode 100644 src/BugsnagUnity/Payload/IError.cs delete mode 100644 src/BugsnagUnity/Payload/IEvent.cs delete mode 100644 src/BugsnagUnity/Payload/IPayload.cs delete mode 100644 src/BugsnagUnity/Payload/ISession.cs delete mode 100644 src/BugsnagUnity/Payload/IStackframe.cs delete mode 100644 src/BugsnagUnity/Payload/IThread.cs delete mode 100644 src/BugsnagUnity/Payload/IUser.cs delete mode 100644 src/BugsnagUnity/Payload/Metadata.cs delete mode 100644 src/BugsnagUnity/Payload/Method.cs delete mode 100644 src/BugsnagUnity/Payload/MethodParameter.cs delete mode 100644 src/BugsnagUnity/Payload/NotifierInfo.cs delete mode 100644 src/BugsnagUnity/Payload/PayloadContainer.cs delete mode 100644 src/BugsnagUnity/Payload/PayloadExtensions.cs delete mode 100644 src/BugsnagUnity/Payload/Report.cs delete mode 100644 src/BugsnagUnity/Payload/Session.cs delete mode 100644 src/BugsnagUnity/Payload/SessionReport.cs delete mode 100644 src/BugsnagUnity/Payload/StackTraceLine.cs delete mode 100644 src/BugsnagUnity/Payload/User.cs delete mode 100644 src/BugsnagUnity/PayloadManager.cs delete mode 100644 src/BugsnagUnity/PerformanceHelper.cs delete mode 100644 src/BugsnagUnity/Polyfills.cs delete mode 100644 src/BugsnagUnity/PostProcessBuild.cs delete mode 100644 src/BugsnagUnity/SessionTracker.cs delete mode 100644 src/BugsnagUnity/Severity.cs delete mode 100644 src/BugsnagUnity/SimpleJson.cs delete mode 100644 src/BugsnagUnity/TelemetryType.cs delete mode 100644 src/BugsnagUnity/ThreadSendPolicy.cs delete mode 100644 src/BugsnagUnity/Time.cs delete mode 100644 src/BugsnagUnity/TimingTrackerBehaviour.cs delete mode 100644 src/BugsnagUnity/TypeNameHelper.cs delete mode 100644 src/BugsnagUnity/UniqueLogThrottle.cs delete mode 100644 src/BugsnagUnity/UnityLogMessage.cs delete mode 100644 src/Directory.build.props delete mode 100644 unity/PackageProject/.gitignore delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/Android/BugsnagUnity.Android.dll.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/BugsnagUnity.dll.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/BugsnagUnity.MacOS.dll.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BSG_KSCrashReportWriter.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/Bugsnag.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagApp.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagAppWithState.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagBreadcrumb.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagClient.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagConfiguration.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagDevice.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagDeviceWithState.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagEndpointConfiguration.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagError.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagErrorTypes.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagEvent.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagLastRunInfo.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagMetadata.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagMetadataStore.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagPlugin.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagSession.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagStackframe.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagThread.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagUser.h.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/MacOS/bugsnag-osx.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/Windows.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/Windows/BugsnagUnity.Windows.dll.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/iOS/BugsnagUnity.iOS.dll.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/tvOS.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/tvOS/BugsnagUnity.iOS.dll.meta delete mode 100644 unity/PackageProject/Assets/Bugsnag/Plugins/tvOS/libbugsnag-tvos.a.meta delete mode 100644 unity/PackageProject/Logs/Packages-Update.log delete mode 100644 unity/PackageProject/Packages/manifest.json delete mode 100644 unity/PackageProject/ProjectSettings/AudioManager.asset delete mode 100644 unity/PackageProject/ProjectSettings/ClusterInputManager.asset delete mode 100644 unity/PackageProject/ProjectSettings/DynamicsManager.asset delete mode 100644 unity/PackageProject/ProjectSettings/EditorBuildSettings.asset delete mode 100644 unity/PackageProject/ProjectSettings/EditorSettings.asset delete mode 100644 unity/PackageProject/ProjectSettings/GraphicsSettings.asset delete mode 100644 unity/PackageProject/ProjectSettings/InputManager.asset delete mode 100644 unity/PackageProject/ProjectSettings/NavMeshAreas.asset delete mode 100644 unity/PackageProject/ProjectSettings/NetworkManager.asset delete mode 100644 unity/PackageProject/ProjectSettings/Physics2DSettings.asset delete mode 100644 unity/PackageProject/ProjectSettings/PresetManager.asset delete mode 100644 unity/PackageProject/ProjectSettings/ProjectSettings.asset delete mode 100644 unity/PackageProject/ProjectSettings/ProjectVersion.txt delete mode 100644 unity/PackageProject/ProjectSettings/QualitySettings.asset delete mode 100644 unity/PackageProject/ProjectSettings/TagManager.asset delete mode 100644 unity/PackageProject/ProjectSettings/TimeManager.asset delete mode 100644 unity/PackageProject/ProjectSettings/UnityConnectSettings.asset delete mode 100644 unity/PackageProject/ProjectSettings/VFXManager.asset delete mode 100644 unity/PackageProject/ProjectSettings/XRSettings.asset diff --git a/.gitmodules b/.gitmodules index feddaa92c..67f106eda 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,6 +4,3 @@ [submodule "bugsnag-android"] path = bugsnag-android url = https://github.com/bugsnag/bugsnag-android -[submodule "src/BugsnagUnity/BugsnagUnityWebRequest"] - path = src/BugsnagUnity/BugsnagUnityWebRequest - url = https://github.com/bugsnag/bugsnag-unity-web-request diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor.meta b/Bugsnag/Assets/Bugsnag/Editor.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Editor.meta rename to Bugsnag/Assets/Bugsnag/Editor.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs b/Bugsnag/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs rename to Bugsnag/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs.meta b/Bugsnag/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagAddScriptingSymbol.cs.meta rename to Bugsnag/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs b/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs rename to Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs.meta b/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.EDM.cs.meta rename to Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs b/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs rename to Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs.meta b/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Editor/BugsnagEditor.cs.meta rename to Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/icon-dark.png b/Bugsnag/Assets/Bugsnag/Editor/icon-dark.png similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Editor/icon-dark.png rename to Bugsnag/Assets/Bugsnag/Editor/icon-dark.png diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/icon-dark.png.meta b/Bugsnag/Assets/Bugsnag/Editor/icon-dark.png.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Editor/icon-dark.png.meta rename to Bugsnag/Assets/Bugsnag/Editor/icon-dark.png.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/icon-light.png b/Bugsnag/Assets/Bugsnag/Editor/icon-light.png similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Editor/icon-light.png rename to Bugsnag/Assets/Bugsnag/Editor/icon-light.png diff --git a/BugsnagUnity/Assets/BugsnagUnity/Editor/icon-light.png.meta b/Bugsnag/Assets/Bugsnag/Editor/icon-light.png.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Editor/icon-light.png.meta rename to Bugsnag/Assets/Bugsnag/Editor/icon-light.png.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Plugins.meta b/Bugsnag/Assets/Bugsnag/Plugins.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Plugins.meta rename to Bugsnag/Assets/Bugsnag/Plugins.meta diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/Android.meta b/Bugsnag/Assets/Bugsnag/Plugins/Android.meta similarity index 77% rename from unity/PackageProject/Assets/Bugsnag/Plugins/Android.meta rename to Bugsnag/Assets/Bugsnag/Plugins/Android.meta index 234a94541..0ccdfab5e 100644 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/Android.meta +++ b/Bugsnag/Assets/Bugsnag/Plugins/Android.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 01c58a14cbe5448d3864ee993b273f28 +guid: 845a01717472f4e05aceda5d86607b56 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/unity/PackageProject/Assets/Bugsnag.meta b/Bugsnag/Assets/Bugsnag/Plugins/Cocoa.meta similarity index 77% rename from unity/PackageProject/Assets/Bugsnag.meta rename to Bugsnag/Assets/Bugsnag/Plugins/Cocoa.meta index 9e904eed4..e1d649acc 100644 --- a/unity/PackageProject/Assets/Bugsnag.meta +++ b/Bugsnag/Assets/Bugsnag/Plugins/Cocoa.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b0a07e52b41074d3ea1038ab3f2d684c +guid: 418820f8c5ead4eaca55db49dc440f7a folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/src/BugsnagUnity.mm b/Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm similarity index 100% rename from src/BugsnagUnity.mm rename to Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/iOS/libbugsnag-ios.a.meta b/Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm.meta similarity index 69% rename from unity/PackageProject/Assets/Bugsnag/Plugins/iOS/libbugsnag-ios.a.meta rename to Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm.meta index 46d89b1da..5ad4b2bf2 100644 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/iOS/libbugsnag-ios.a.meta +++ b/Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5bd304f475517404bbeb8f50c81abe73 +guid: d85fba5776d0246faa0af00f533787b2 PluginImporter: externalObjects: {} serializedVersion: 2 @@ -12,21 +12,18 @@ PluginImporter: validateReferences: 1 platformData: - first: - '': Any + : Any second: enabled: 0 settings: Exclude Android: 1 Exclude Editor: 1 - Exclude Linux: 1 Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXUniversal: 1 + Exclude OSXUniversal: 0 Exclude WebGL: 1 Exclude Win: 1 Exclude Win64: 1 Exclude iOS: 0 - Exclude tvOS: 1 - first: Android: Android second: @@ -46,40 +43,16 @@ PluginImporter: CPU: AnyCPU DefaultValueInitialized: true OS: AnyOS - - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - first: Standalone: Linux64 second: enabled: 0 settings: - CPU: x86_64 - - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: None + CPU: AnyCPU - first: Standalone: OSXUniversal second: - enabled: 0 + enabled: 1 settings: CPU: AnyCPU - first: @@ -100,15 +73,14 @@ PluginImporter: enabled: 1 settings: AddToEmbeddedBinaries: false + CPU: AnyCPU CompileFlags: FrameworkDependencies: - first: tvOS: tvOS second: - enabled: 0 - settings: - CompileFlags: - FrameworkDependencies: + enabled: 1 + settings: {} userData: assetBundleName: assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/MacOS.meta b/Bugsnag/Assets/Bugsnag/Plugins/MacOS.meta similarity index 77% rename from unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/MacOS.meta rename to Bugsnag/Assets/Bugsnag/Plugins/MacOS.meta index 6ee32c65b..8120c49ba 100644 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/MacOS.meta +++ b/Bugsnag/Assets/Bugsnag/Plugins/MacOS.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3e70451587e74414fb23e7b87055ae2a +guid: 0d00fb107c1fb40529957e5d9f7185c0 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/iOS.meta b/Bugsnag/Assets/Bugsnag/Plugins/iOS.meta similarity index 77% rename from unity/PackageProject/Assets/Bugsnag/Plugins/iOS.meta rename to Bugsnag/Assets/Bugsnag/Plugins/iOS.meta index 49ad91c82..fefb07ef2 100644 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/iOS.meta +++ b/Bugsnag/Assets/Bugsnag/Plugins/iOS.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8e4f198065b6f4718ace5f78dd8344c3 +guid: a2e4a69a7add44f08b88bd690401223a folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts.meta b/Bugsnag/Assets/Bugsnag/Scripts.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts.meta rename to Bugsnag/Assets/Bugsnag/Scripts.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/AutomaticDataCollector.cs b/Bugsnag/Assets/Bugsnag/Scripts/AutomaticDataCollector.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/AutomaticDataCollector.cs rename to Bugsnag/Assets/Bugsnag/Scripts/AutomaticDataCollector.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/AutomaticDataCollector.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/AutomaticDataCollector.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/AutomaticDataCollector.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/AutomaticDataCollector.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs b/Bugsnag/Assets/Bugsnag/Scripts/BlockingQueue.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs rename to Bugsnag/Assets/Bugsnag/Scripts/BlockingQueue.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/BlockingQueue.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/BlockingQueue.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/BlockingQueue.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs b/Bugsnag/Assets/Bugsnag/Scripts/Bugsnag.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Bugsnag.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Bugsnag.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Bugsnag.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Bugsnag.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs rename to Bugsnag/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagAutoInit.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs rename to Bugsnag/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagSettingsObject.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest.meta b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest.meta rename to Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs rename to Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/README.md similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md rename to Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/README.md diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md.meta b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/README.md.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/BugsnagUnityWebRequest/README.md.meta rename to Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/README.md.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs b/Bugsnag/Assets/Bugsnag/Scripts/Client.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Client.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Client.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Client.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Client.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs b/Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Configuration.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs b/Bugsnag/Assets/Bugsnag/Scripts/Delivery.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Delivery.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Delivery.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Delivery.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Delivery.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs b/Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs rename to Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/EndpointConfiguration.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Scripts/IBreadcrumbs.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs rename to Bugsnag/Assets/Bugsnag/Scripts/IBreadcrumbs.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/IBreadcrumbs.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IBreadcrumbs.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/IBreadcrumbs.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs b/Bugsnag/Assets/Bugsnag/Scripts/ICacheManager.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs rename to Bugsnag/Assets/Bugsnag/Scripts/ICacheManager.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/ICacheManager.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/ICacheManager.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/ICacheManager.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/IClient.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs rename to Bugsnag/Assets/Bugsnag/Scripts/IClient.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/IClient.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/IClient.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs b/Bugsnag/Assets/Bugsnag/Scripts/IFeatureFlagStore.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs rename to Bugsnag/Assets/Bugsnag/Scripts/IFeatureFlagStore.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/IFeatureFlagStore.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IFeatureFlagStore.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/IFeatureFlagStore.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs b/Bugsnag/Assets/Bugsnag/Scripts/IFilterable.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs rename to Bugsnag/Assets/Bugsnag/Scripts/IFilterable.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/IFilterable.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IFilterable.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/IFilterable.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs b/Bugsnag/Assets/Bugsnag/Scripts/IMetadataEditor.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs rename to Bugsnag/Assets/Bugsnag/Scripts/IMetadataEditor.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/IMetadataEditor.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IMetadataEditor.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/IMetadataEditor.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/INativeClient.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs rename to Bugsnag/Assets/Bugsnag/Scripts/INativeClient.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/INativeClient.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/INativeClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/INativeClient.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs b/Bugsnag/Assets/Bugsnag/Scripts/IUserEditor.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs rename to Bugsnag/Assets/Bugsnag/Scripts/IUserEditor.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/IUserEditor.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/IUserEditor.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/IUserEditor.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs b/Bugsnag/Assets/Bugsnag/Scripts/LastRunInfo.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs rename to Bugsnag/Assets/Bugsnag/Scripts/LastRunInfo.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/LastRunInfo.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/LastRunInfo.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/LastRunInfo.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs b/Bugsnag/Assets/Bugsnag/Scripts/LogTypeSeverityMapping.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs rename to Bugsnag/Assets/Bugsnag/Scripts/LogTypeSeverityMapping.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/LogTypeSeverityMapping.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/LogTypeSeverityMapping.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/LogTypeSeverityMapping.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs b/Bugsnag/Assets/Bugsnag/Scripts/MainThreadDispatchBehaviour.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs rename to Bugsnag/Assets/Bugsnag/Scripts/MainThreadDispatchBehaviour.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/MainThreadDispatchBehaviour.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/MainThreadDispatchBehaviour.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/MainThreadDispatchBehaviour.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs b/Bugsnag/Assets/Bugsnag/Scripts/MaximumLogTypeCounter.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs rename to Bugsnag/Assets/Bugsnag/Scripts/MaximumLogTypeCounter.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/MaximumLogTypeCounter.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/MaximumLogTypeCounter.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/MaximumLogTypeCounter.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/Breadcrumbs.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeApp.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeAppWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeBreadcrumb.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDevice.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeDeviceWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeError.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeEvent.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeInterface.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativePayloadClassWrapper.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeSession.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeStackFrame.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeThread.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Android/NativeUser.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/Breadcrumbs.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeApp.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeAppWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeBreadcrumb.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeCode.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDevice.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeDeviceWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeError.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeEvent.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeImage.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeSession.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeStackFrame.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeThread.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Cocoa/NativeUser.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/Breadcrumbs.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/CacheManager.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/CacheManager.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/CacheManager.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/CacheManager.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/CacheManager.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Fallback/NativeClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/MacOS/NativeCode.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Windows.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Windows.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/Windows/NativeClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/iOS.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Native/iOS/NativeCode.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/App.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/App.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/App.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/App.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/App.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/AppWithState.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/AppWithState.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/AppWithState.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/AppWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/AppWithState.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Breadcrumb.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Breadcrumb.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Breadcrumb.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Breadcrumb.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Breadcrumb.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/BreadcrumbType.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/BreadcrumbType.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/BreadcrumbType.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/BreadcrumbType.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/BreadcrumbType.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Correlation.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Correlation.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Correlation.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Correlation.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Correlation.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Device.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Device.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Device.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Device.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Device.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/DeviceWithState.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/DeviceWithState.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/DeviceWithState.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/DeviceWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/DeviceWithState.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Error.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Error.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Error.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Error.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Error.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Event.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Event.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Event.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Event.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Event.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/FeatureFlag.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/FeatureFlag.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/FeatureFlag.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/FeatureFlag.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/FeatureFlag.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/HandledState.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/HandledState.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/HandledState.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/HandledState.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/HandledState.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IApp.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IApp.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IApp.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IApp.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IApp.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IAppWithState.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IAppWithState.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IAppWithState.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IAppWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IAppWithState.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IBreadcrumb.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IBreadcrumb.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IBreadcrumb.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IBreadcrumb.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IBreadcrumb.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IDevice.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IDevice.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IDevice.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDevice.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IDevice.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IDeviceWithState.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IDeviceWithState.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IDeviceWithState.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IDeviceWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IDeviceWithState.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IError.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IError.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IError.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IError.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IError.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IEvent.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IEvent.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IEvent.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IEvent.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IEvent.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IPayload.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IPayload.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IPayload.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IPayload.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IPayload.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/ISession.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/ISession.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/ISession.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/ISession.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/ISession.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IStackframe.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IStackframe.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IStackframe.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IStackframe.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IStackframe.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IThread.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IThread.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IThread.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IThread.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IThread.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IUser.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IUser.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/IUser.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/IUser.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/IUser.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Metadata.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Metadata.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Metadata.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Metadata.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Metadata.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Method.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Method.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Method.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Method.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Method.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/MethodParameter.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/MethodParameter.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/MethodParameter.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/MethodParameter.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/MethodParameter.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/NotifierInfo.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/NotifierInfo.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/NotifierInfo.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/NotifierInfo.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/NotifierInfo.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadContainer.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadContainer.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadContainer.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadContainer.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadContainer.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadExtensions.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadExtensions.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadExtensions.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/PayloadExtensions.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadExtensions.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Report.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Report.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Report.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Report.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Report.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Session.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Session.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/Session.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/Session.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/Session.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/SessionReport.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/SessionReport.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/SessionReport.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/SessionReport.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/SessionReport.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/StackTraceLine.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/StackTraceLine.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/StackTraceLine.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/StackTraceLine.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/StackTraceLine.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs b/Bugsnag/Assets/Bugsnag/Scripts/Payload/User.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/User.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Payload/User.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Payload/User.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Payload/User.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs b/Bugsnag/Assets/Bugsnag/Scripts/PayloadManager.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs rename to Bugsnag/Assets/Bugsnag/Scripts/PayloadManager.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/PayloadManager.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/PayloadManager.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/PayloadManager.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs b/Bugsnag/Assets/Bugsnag/Scripts/PerformanceHelper.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs rename to Bugsnag/Assets/Bugsnag/Scripts/PerformanceHelper.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/PerformanceHelper.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/PerformanceHelper.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/PerformanceHelper.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs b/Bugsnag/Assets/Bugsnag/Scripts/Polyfills.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Polyfills.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Polyfills.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Polyfills.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Polyfills.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs b/Bugsnag/Assets/Bugsnag/Scripts/PostProcessBuild.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs rename to Bugsnag/Assets/Bugsnag/Scripts/PostProcessBuild.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/PostProcessBuild.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/PostProcessBuild.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/PostProcessBuild.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs b/Bugsnag/Assets/Bugsnag/Scripts/SessionTracker.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs rename to Bugsnag/Assets/Bugsnag/Scripts/SessionTracker.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/SessionTracker.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/SessionTracker.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/SessionTracker.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs b/Bugsnag/Assets/Bugsnag/Scripts/Severity.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Severity.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Severity.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Severity.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Severity.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs b/Bugsnag/Assets/Bugsnag/Scripts/SimpleJson.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs rename to Bugsnag/Assets/Bugsnag/Scripts/SimpleJson.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/SimpleJson.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/SimpleJson.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/SimpleJson.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs b/Bugsnag/Assets/Bugsnag/Scripts/TelemetryType.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs rename to Bugsnag/Assets/Bugsnag/Scripts/TelemetryType.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/TelemetryType.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/TelemetryType.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/TelemetryType.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs b/Bugsnag/Assets/Bugsnag/Scripts/ThreadSendPolicy.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs rename to Bugsnag/Assets/Bugsnag/Scripts/ThreadSendPolicy.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/ThreadSendPolicy.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/ThreadSendPolicy.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/ThreadSendPolicy.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs b/Bugsnag/Assets/Bugsnag/Scripts/Time.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs rename to Bugsnag/Assets/Bugsnag/Scripts/Time.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/Time.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/Time.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/Time.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs b/Bugsnag/Assets/Bugsnag/Scripts/TimingTrackerBehaviour.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs rename to Bugsnag/Assets/Bugsnag/Scripts/TimingTrackerBehaviour.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/TimingTrackerBehaviour.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/TimingTrackerBehaviour.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/TimingTrackerBehaviour.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs b/Bugsnag/Assets/Bugsnag/Scripts/TypeNameHelper.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs rename to Bugsnag/Assets/Bugsnag/Scripts/TypeNameHelper.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/TypeNameHelper.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/TypeNameHelper.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/TypeNameHelper.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs b/Bugsnag/Assets/Bugsnag/Scripts/UniqueLogThrottle.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs rename to Bugsnag/Assets/Bugsnag/Scripts/UniqueLogThrottle.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/UniqueLogThrottle.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/UniqueLogThrottle.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/UniqueLogThrottle.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs b/Bugsnag/Assets/Bugsnag/Scripts/UnityLogMessage.cs similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs rename to Bugsnag/Assets/Bugsnag/Scripts/UnityLogMessage.cs diff --git a/BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs.meta b/Bugsnag/Assets/Bugsnag/Scripts/UnityLogMessage.cs.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity/Scripts/UnityLogMessage.cs.meta rename to Bugsnag/Assets/Bugsnag/Scripts/UnityLogMessage.cs.meta diff --git a/BugsnagUnity/Assets/BugsnagUnity.meta b/Bugsnag/Assets/BugsnagUnity.meta similarity index 100% rename from BugsnagUnity/Assets/BugsnagUnity.meta rename to Bugsnag/Assets/BugsnagUnity.meta diff --git a/BugsnagUnity/Assets/Resources.meta b/Bugsnag/Assets/Resources.meta similarity index 100% rename from BugsnagUnity/Assets/Resources.meta rename to Bugsnag/Assets/Resources.meta diff --git a/BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset b/Bugsnag/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset similarity index 100% rename from BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset rename to Bugsnag/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset diff --git a/BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset.meta b/Bugsnag/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset.meta similarity index 100% rename from BugsnagUnity/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset.meta rename to Bugsnag/Assets/Resources/Bugsnag/BugsnagSettingsObject.asset.meta diff --git a/BugsnagUnity/Assets/Scenes.meta b/Bugsnag/Assets/Scenes.meta similarity index 100% rename from BugsnagUnity/Assets/Scenes.meta rename to Bugsnag/Assets/Scenes.meta diff --git a/BugsnagUnity/Assets/Scenes/SampleScene.unity b/Bugsnag/Assets/Scenes/SampleScene.unity similarity index 100% rename from BugsnagUnity/Assets/Scenes/SampleScene.unity rename to Bugsnag/Assets/Scenes/SampleScene.unity diff --git a/BugsnagUnity/Assets/Scenes/SampleScene.unity.meta b/Bugsnag/Assets/Scenes/SampleScene.unity.meta similarity index 100% rename from BugsnagUnity/Assets/Scenes/SampleScene.unity.meta rename to Bugsnag/Assets/Scenes/SampleScene.unity.meta diff --git a/BugsnagUnity/Assets/Scripts.meta b/Bugsnag/Assets/Scripts.meta similarity index 100% rename from BugsnagUnity/Assets/Scripts.meta rename to Bugsnag/Assets/Scripts.meta diff --git a/BugsnagUnity/Assets/Scripts/Testing.cs b/Bugsnag/Assets/Scripts/Testing.cs similarity index 100% rename from BugsnagUnity/Assets/Scripts/Testing.cs rename to Bugsnag/Assets/Scripts/Testing.cs diff --git a/BugsnagUnity/Assets/Scripts/Testing.cs.meta b/Bugsnag/Assets/Scripts/Testing.cs.meta similarity index 100% rename from BugsnagUnity/Assets/Scripts/Testing.cs.meta rename to Bugsnag/Assets/Scripts/Testing.cs.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro.meta b/Bugsnag/Assets/TextMesh Pro.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro.meta rename to Bugsnag/Assets/TextMesh Pro.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Documentation.meta b/Bugsnag/Assets/TextMesh Pro/Documentation.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Documentation.meta rename to Bugsnag/Assets/TextMesh Pro/Documentation.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf b/Bugsnag/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf rename to Bugsnag/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf diff --git a/BugsnagUnity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf.meta b/Bugsnag/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf.meta rename to Bugsnag/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Fonts.meta b/Bugsnag/Assets/TextMesh Pro/Fonts.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Fonts.meta rename to Bugsnag/Assets/TextMesh Pro/Fonts.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt b/Bugsnag/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt rename to Bugsnag/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt diff --git a/BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta b/Bugsnag/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta rename to Bugsnag/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf b/Bugsnag/Assets/TextMesh Pro/Fonts/LiberationSans.ttf similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf rename to Bugsnag/Assets/TextMesh Pro/Fonts/LiberationSans.ttf diff --git a/BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta b/Bugsnag/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta rename to Bugsnag/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources.meta b/Bugsnag/Assets/TextMesh Pro/Resources.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources.meta rename to Bugsnag/Assets/TextMesh Pro/Resources.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials.meta b/Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat b/Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat rename to Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta b/Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset b/Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset rename to Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta b/Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat b/Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat rename to Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta b/Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset b/Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset rename to Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta b/Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt b/Bugsnag/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt rename to Bugsnag/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta b/Bugsnag/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt b/Bugsnag/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt rename to Bugsnag/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta b/Bugsnag/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets.meta b/Bugsnag/Assets/TextMesh Pro/Resources/Sprite Assets.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/Sprite Assets.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset b/Bugsnag/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset rename to Bugsnag/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta b/Bugsnag/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets.meta b/Bugsnag/Assets/TextMesh Pro/Resources/Style Sheets.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/Style Sheets.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset b/Bugsnag/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset rename to Bugsnag/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta b/Bugsnag/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset b/Bugsnag/Assets/TextMesh Pro/Resources/TMP Settings.asset similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset rename to Bugsnag/Assets/TextMesh Pro/Resources/TMP Settings.asset diff --git a/BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta b/Bugsnag/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta rename to Bugsnag/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders.meta b/Bugsnag/Assets/TextMesh Pro/Shaders.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc b/Bugsnag/Assets/TextMesh Pro/Shaders/TMPro.cginc similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMPro.cginc diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc b/Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc b/Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc b/Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc diff --git a/BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta b/Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta rename to Bugsnag/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites.meta b/Bugsnag/Assets/TextMesh Pro/Sprites.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Sprites.meta rename to Bugsnag/Assets/TextMesh Pro/Sprites.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt b/Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt rename to Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta b/Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta rename to Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json b/Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne.json similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json rename to Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne.json diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta b/Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta rename to Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.png b/Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne.png similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.png rename to Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne.png diff --git a/BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta b/Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta similarity index 100% rename from BugsnagUnity/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta rename to Bugsnag/Assets/TextMesh Pro/Sprites/EmojiOne.png.meta diff --git a/BugsnagUnity/ProjectSettings/AudioManager.asset b/Bugsnag/ProjectSettings/AudioManager.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/AudioManager.asset rename to Bugsnag/ProjectSettings/AudioManager.asset diff --git a/BugsnagUnity/ProjectSettings/ClusterInputManager.asset b/Bugsnag/ProjectSettings/ClusterInputManager.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/ClusterInputManager.asset rename to Bugsnag/ProjectSettings/ClusterInputManager.asset diff --git a/BugsnagUnity/ProjectSettings/DynamicsManager.asset b/Bugsnag/ProjectSettings/DynamicsManager.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/DynamicsManager.asset rename to Bugsnag/ProjectSettings/DynamicsManager.asset diff --git a/BugsnagUnity/ProjectSettings/EditorBuildSettings.asset b/Bugsnag/ProjectSettings/EditorBuildSettings.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/EditorBuildSettings.asset rename to Bugsnag/ProjectSettings/EditorBuildSettings.asset diff --git a/BugsnagUnity/ProjectSettings/EditorSettings.asset b/Bugsnag/ProjectSettings/EditorSettings.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/EditorSettings.asset rename to Bugsnag/ProjectSettings/EditorSettings.asset diff --git a/BugsnagUnity/ProjectSettings/GraphicsSettings.asset b/Bugsnag/ProjectSettings/GraphicsSettings.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/GraphicsSettings.asset rename to Bugsnag/ProjectSettings/GraphicsSettings.asset diff --git a/BugsnagUnity/ProjectSettings/InputManager.asset b/Bugsnag/ProjectSettings/InputManager.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/InputManager.asset rename to Bugsnag/ProjectSettings/InputManager.asset diff --git a/BugsnagUnity/ProjectSettings/MemorySettings.asset b/Bugsnag/ProjectSettings/MemorySettings.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/MemorySettings.asset rename to Bugsnag/ProjectSettings/MemorySettings.asset diff --git a/BugsnagUnity/ProjectSettings/NavMeshAreas.asset b/Bugsnag/ProjectSettings/NavMeshAreas.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/NavMeshAreas.asset rename to Bugsnag/ProjectSettings/NavMeshAreas.asset diff --git a/BugsnagUnity/ProjectSettings/NetworkManager.asset b/Bugsnag/ProjectSettings/NetworkManager.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/NetworkManager.asset rename to Bugsnag/ProjectSettings/NetworkManager.asset diff --git a/BugsnagUnity/ProjectSettings/PackageManagerSettings.asset b/Bugsnag/ProjectSettings/PackageManagerSettings.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/PackageManagerSettings.asset rename to Bugsnag/ProjectSettings/PackageManagerSettings.asset diff --git a/BugsnagUnity/ProjectSettings/Physics2DSettings.asset b/Bugsnag/ProjectSettings/Physics2DSettings.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/Physics2DSettings.asset rename to Bugsnag/ProjectSettings/Physics2DSettings.asset diff --git a/BugsnagUnity/ProjectSettings/PresetManager.asset b/Bugsnag/ProjectSettings/PresetManager.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/PresetManager.asset rename to Bugsnag/ProjectSettings/PresetManager.asset diff --git a/BugsnagUnity/ProjectSettings/ProjectSettings.asset b/Bugsnag/ProjectSettings/ProjectSettings.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/ProjectSettings.asset rename to Bugsnag/ProjectSettings/ProjectSettings.asset diff --git a/BugsnagUnity/ProjectSettings/ProjectVersion.txt b/Bugsnag/ProjectSettings/ProjectVersion.txt similarity index 100% rename from BugsnagUnity/ProjectSettings/ProjectVersion.txt rename to Bugsnag/ProjectSettings/ProjectVersion.txt diff --git a/BugsnagUnity/ProjectSettings/QualitySettings.asset b/Bugsnag/ProjectSettings/QualitySettings.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/QualitySettings.asset rename to Bugsnag/ProjectSettings/QualitySettings.asset diff --git a/BugsnagUnity/ProjectSettings/SceneTemplateSettings.json b/Bugsnag/ProjectSettings/SceneTemplateSettings.json similarity index 100% rename from BugsnagUnity/ProjectSettings/SceneTemplateSettings.json rename to Bugsnag/ProjectSettings/SceneTemplateSettings.json diff --git a/BugsnagUnity/ProjectSettings/TagManager.asset b/Bugsnag/ProjectSettings/TagManager.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/TagManager.asset rename to Bugsnag/ProjectSettings/TagManager.asset diff --git a/BugsnagUnity/ProjectSettings/TimeManager.asset b/Bugsnag/ProjectSettings/TimeManager.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/TimeManager.asset rename to Bugsnag/ProjectSettings/TimeManager.asset diff --git a/BugsnagUnity/ProjectSettings/UnityConnectSettings.asset b/Bugsnag/ProjectSettings/UnityConnectSettings.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/UnityConnectSettings.asset rename to Bugsnag/ProjectSettings/UnityConnectSettings.asset diff --git a/BugsnagUnity/ProjectSettings/VFXManager.asset b/Bugsnag/ProjectSettings/VFXManager.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/VFXManager.asset rename to Bugsnag/ProjectSettings/VFXManager.asset diff --git a/BugsnagUnity/ProjectSettings/VersionControlSettings.asset b/Bugsnag/ProjectSettings/VersionControlSettings.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/VersionControlSettings.asset rename to Bugsnag/ProjectSettings/VersionControlSettings.asset diff --git a/BugsnagUnity/ProjectSettings/XRSettings.asset b/Bugsnag/ProjectSettings/XRSettings.asset similarity index 100% rename from BugsnagUnity/ProjectSettings/XRSettings.asset rename to Bugsnag/ProjectSettings/XRSettings.asset diff --git a/BugsnagUnity/ProjectSettings/boot.config b/Bugsnag/ProjectSettings/boot.config similarity index 100% rename from BugsnagUnity/ProjectSettings/boot.config rename to Bugsnag/ProjectSettings/boot.config diff --git a/BugsnagUnity.sln b/BugsnagUnity.sln deleted file mode 100644 index a94adf20e..000000000 --- a/BugsnagUnity.sln +++ /dev/null @@ -1,75 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27428.2043 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnityEngine", "tests\UnityEngine\UnityEngine.csproj", "{7600F127-2CF0-4A1C-A12C-DE5630696DD4}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{330E1C29-F8C0-4FFC-9FE9-9FA71DE400FC}" - ProjectSection(SolutionItems) = preProject - src\BugsnagUnity.mm = src\BugsnagUnity.mm - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BugsnagUnity", "src\BugsnagUnity\BugsnagUnity.csproj", "{EF862675-0071-4BA7-B76A-A32E9A2BE362}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BugsnagUnity.Tests", "tests\BugsnagUnity.Tests\BugsnagUnity.Tests.csproj", "{72E9EC19-9A2F-4F39-82DC-2303E1461D05}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BugsnagUnity.Android", "src\BugsnagUnity\BugsnagUnity.Android.csproj", "{58CA57C8-93E9-4F3A-A625-B0FD4EBFF454}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BugsnagUnity.iOS", "src\BugsnagUnity\BugsnagUnity.iOS.csproj", "{40B25520-11F5-4F85-9F06-5CA277F35CD1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BugsnagUnity.MacOS", "src\BugsnagUnity\BugsnagUnity.MacOS.csproj", "{852B902E-EE68-411C-83EA-B89C483EBC66}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BugsnagUnity.Windows", "src\BugsnagUnity\BugsnagUnity.Windows.csproj", "{B8C265A4-657B-4378-8726-0BEC774108D1}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7600F127-2CF0-4A1C-A12C-DE5630696DD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7600F127-2CF0-4A1C-A12C-DE5630696DD4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7600F127-2CF0-4A1C-A12C-DE5630696DD4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7600F127-2CF0-4A1C-A12C-DE5630696DD4}.Release|Any CPU.Build.0 = Release|Any CPU - {EF862675-0071-4BA7-B76A-A32E9A2BE362}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EF862675-0071-4BA7-B76A-A32E9A2BE362}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EF862675-0071-4BA7-B76A-A32E9A2BE362}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EF862675-0071-4BA7-B76A-A32E9A2BE362}.Release|Any CPU.Build.0 = Release|Any CPU - {72E9EC19-9A2F-4F39-82DC-2303E1461D05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72E9EC19-9A2F-4F39-82DC-2303E1461D05}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72E9EC19-9A2F-4F39-82DC-2303E1461D05}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72E9EC19-9A2F-4F39-82DC-2303E1461D05}.Release|Any CPU.Build.0 = Release|Any CPU - {58CA57C8-93E9-4F3A-A625-B0FD4EBFF454}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {58CA57C8-93E9-4F3A-A625-B0FD4EBFF454}.Debug|Any CPU.Build.0 = Debug|Any CPU - {58CA57C8-93E9-4F3A-A625-B0FD4EBFF454}.Release|Any CPU.ActiveCfg = Release|Any CPU - {58CA57C8-93E9-4F3A-A625-B0FD4EBFF454}.Release|Any CPU.Build.0 = Release|Any CPU - {40B25520-11F5-4F85-9F06-5CA277F35CD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {40B25520-11F5-4F85-9F06-5CA277F35CD1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {40B25520-11F5-4F85-9F06-5CA277F35CD1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {40B25520-11F5-4F85-9F06-5CA277F35CD1}.Release|Any CPU.Build.0 = Release|Any CPU - {852B902E-EE68-411C-83EA-B89C483EBC66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {852B902E-EE68-411C-83EA-B89C483EBC66}.Debug|Any CPU.Build.0 = Debug|Any CPU - {852B902E-EE68-411C-83EA-B89C483EBC66}.Release|Any CPU.ActiveCfg = Release|Any CPU - {852B902E-EE68-411C-83EA-B89C483EBC66}.Release|Any CPU.Build.0 = Release|Any CPU - {B8C265A4-657B-4378-8726-0BEC774108D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B8C265A4-657B-4378-8726-0BEC774108D1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B8C265A4-657B-4378-8726-0BEC774108D1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B8C265A4-657B-4378-8726-0BEC774108D1}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1CE8CC5B-0DF2-4EB7-B9DA-0DBC2E0389DA} - EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - Policies = $0 - $0.TextStylePolicy = $1 - $1.FileWidth = 80 - $1.TabsToSpaces = True - $1.scope = text/x-csharp - $0.CSharpFormattingPolicy = $2 - $2.scope = text/x-csharp - EndGlobalSection -EndGlobal diff --git a/Makefile b/Makefile deleted file mode 100644 index 2d5e0a5b6..000000000 --- a/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -bump: -ifeq ($(VERSION),) - @$(error VERSION is not defined. Run with `make VERSION=number bump`) -endif - @echo Bumping the version number to $(VERSION) - @sed -i '' "s/## TBD/## $(VERSION) ($(shell date '+%Y-%m-%d'))/" CHANGELOG.md - @sed -i '' "s/^var version = \".*\";/var version = \"$(VERSION)\";/" build.cake \ No newline at end of file diff --git a/Rakefile b/Rakefile index abf874d81..d9150ba6e 100644 --- a/Rakefile +++ b/Rakefile @@ -40,11 +40,6 @@ def unity_executable dir=unity_directory end end -def unity_dll_location - [File.join(unity_directory, "Unity.app", "Contents", "Managed"), File.join(unity_directory, "Editor", "Data", "Managed")].find do |unity| - File.exist? unity - end -end ## # Get existing unity executable path or exit with error @@ -90,10 +85,10 @@ def current_directory end def project_path - File.join(current_directory, "unity", "PackageProject") + File.join(current_directory, "Bugsnag") end -def assets_path +def plugins_dir File.join(project_path, "Assets", "Bugsnag/Plugins") end @@ -105,7 +100,7 @@ end def assemble_android filter_abis=true abi_filters = filter_abis ? "-PABI_FILTERS=armeabi-v7a,x86" : "-Pnoop_filters=true" - android_dir = File.join(assets_path, "Android") + android_dir = File.join(plugins_dir, "Android") Dir.chdir"bugsnag-android" do sh "./gradlew", "assembleRelease", abi_filters @@ -255,20 +250,11 @@ end namespace :plugin do namespace :build do cocoa_build_dir = "bugsnag-cocoa-build" - if is_windows? - task all: [:assets, :csharp] - task all_android64: [:assets, :csharp] - else - task all: [:assets, :cocoa, :android, :csharp, ] - task all_android64: [:assets, :cocoa, :android_64bit, :csharp ] - end - + task all: [:cocoa, :android] + desc "Delete all build artifacts" task :clean do - # remove any leftover artifacts from the package generation directory - sh "git", "clean", "-dfx", "unity" - # remove cocoa build area FileUtils.rm_rf cocoa_build_dir unless is_windows? # remove android build area @@ -281,15 +267,12 @@ namespace :plugin do end end end - task :assets do - FileUtils.cp_r(File.join(current_directory, "src", "Assets"), project_path, preserve: true) - end + task :cocoa do next unless is_mac? build_type = "Release" # "Debug" or "Release" FileUtils.mkdir_p cocoa_build_dir FileUtils.cp_r "bugsnag-cocoa/Bugsnag", cocoa_build_dir - bugsnag_unity_file = File.realpath("BugsnagUnity.mm", "src") public_headers = Dir.entries(File.join(cocoa_build_dir, "Bugsnag", "include", "Bugsnag")) Dir.chdir cocoa_build_dir do @@ -329,7 +312,6 @@ namespace :plugin do source_files = Dir.glob(File.join("Bugsnag", "**", "*.{c,h,mm,cpp,m}")) .map(&File.method(:realpath)) - .tap { |files| files << bugsnag_unity_file } .map { |f| group.new_file(f) } target.add_file_references(source_files) do |build_file| @@ -366,11 +348,11 @@ namespace :plugin do end end - osx_dir = File.join(assets_path, "OSX") + osx_dir = File.join(plugins_dir, "OSX") - ios_dir = File.join(assets_path, "iOS") + ios_dir = File.join(plugins_dir, "iOS") - tvos_dir = File.join(assets_path, "tvOS") + tvos_dir = File.join(plugins_dir, "tvOS") #copy framework usage api file FileUtils.cp_r(File.join(current_directory,"bugsnag-cocoa", "Bugsnag", "resources", "PrivacyInfo.xcprivacy"), ios_dir) @@ -409,179 +391,19 @@ namespace :plugin do end task :android do - assemble_android(true) - end - - task :android_64bit do assemble_android(false) end - - task :csharp do - if is_windows? - env = { "UnityDir" => unity_dll_location } - unless system env, "powershell", "-File", "build.ps1" - raise "Failed to build csharp plugin" - end - else - env = { "UnityDir" => unity_dll_location } - unless system env, "./build.sh" - raise "Failed to build csharp plugin" - end - end - - Dir.chdir File.join("src", "BugsnagUnity", "bin", "Release", "netstandard2.0") do - FileUtils.cp File.realpath("BugsnagUnity.dll"), assets_path - windows_dir = File.join(assets_path, "Windows") - FileUtils.cp File.realpath("BugsnagUnity.Windows.dll"), windows_dir - FileUtils.cp File.realpath("BugsnagUnity.iOS.dll"), File.join(assets_path, "tvOS") - FileUtils.cp File.realpath("BugsnagUnity.iOS.dll"), File.join(assets_path, "iOS") - FileUtils.cp File.realpath("BugsnagUnity.MacOS.dll"), File.join(assets_path, "OSX") - FileUtils.cp File.realpath("BugsnagUnity.Android.dll"), File.join(assets_path, "Android") - end - end - - - end - - task :export_package do - export_package end desc "Generate release artifacts" task export: ["plugin:build:clean"] do - #Rake::Task["plugin:build:all"].invoke - #export_package("Bugsnag.unitypackage") - Rake::Task["plugin:build:all_android64"].invoke - export_package("Bugsnag.unitypackage") - end - - desc "Generate release artifacts from cache (using Android 64-bit)" - task :quick_export do - Rake::Task["plugin:build:all_android64"].invoke - export_package("Bugsnag.unitypackage") - end - - desc "Create a PR for the release. Usage: `rake \"plugin:bump[8.1.0]\"`. Quotes required around args in zsh." - task :bump, [:version] do |task, args| - new_version = args[:version] - if new_version == nil or new_version.length < 5 or new_version.chars.any? { |letter| !"0123456789.".include? letter } - throw "New version required e.g. `rake \"plugin:bump[8.1.0]\"`." - end - - branch = %x|git rev-parse --abbrev-ref HEAD|.strip - if branch != "next" - throw "Must be on the 'next' branch. Current branch is #{branch}." - end - - # Update CHANGELOG.md if it doesn't already have the new version - changelog = File.open("CHANGELOG.md").read - if not changelog.include? "## #{new_version}" - insert_index = changelog.index("## TBD") + 6 - changelog.insert(insert_index, "\n\n\n## #{new_version} (#{Time.now.strftime("%Y-%m-%d")})") - File.write("CHANGELOG.md", changelog) - puts "Updated CHANGELOG.md" - end - - # Update build.sh - build_sh = File.open("build.sh").read.lines.map { |line| line.start_with?("VERSION=\"") ? "VERSION=\"#{new_version}\"\n" : line }.join - File.write("build.sh", build_sh) - - # Commit - %x|git add CHANGELOG.md build.sh| - %x|git diff --exit-code| - if $?.exitstatus == 1 - throw "You have unstaged changes." - end - system("git commit -m \"Release v#{new_version}\"") - system("git push origin next") - system("open", "https://github.com/bugsnag/bugsnag-unity/compare/master...next?expand=1&title=Release%20v#{new_version}") - puts "Once you have merged the PR you can run `rake plugin:release`" - end - - desc "Releases the current master branch" - task :release do - version = get_current_version() - - system("git fetch origin") - if %x|git rev-parse --abbrev-ref HEAD|.strip != "master" - puts "Switching to the 'master' branch..." - system("git switch master") - if $?.exitstatus != 0 - throw "Cannot switch to 'master'." - end - system("git rebase origin/master") - if $?.exitstatus != 0 - throw "Cannot rebase." - end - end - system("git diff origin/master..master") - if $?.exitstatus != 0 - throw "You have unpushed commits." - end - system("git tag v#{version}") - if $?.exitstatus != 0 - throw "Cannot create tag." - end - system("git push origin tag v#{version}") - if $?.exitstatus != 0 - throw "Cannot push tag." + if is_windows? + else + Rake::Task["plugin:build:all"].invoke end + export_package("Bugsnag.unitypackage") end - desc "Create UPM and EDM packages" - task :package do - pwd = File.dirname(__FILE__) - upm_tools = File.join(pwd, "upm-tools") - package_file = File.join(pwd, "Bugsnag.unitypackage") - cli_args = "-quit -batchmode -nographics -logFile unity.log" - package_dir = File.join(pwd, "bugsnag-unity-upm") - edm_package = File.join(pwd, "bugsnag-unity-upm-edm4u") - - - - - puts "Creating UPM package" - create_upm(package_dir, upm_tools, package_file, cli_args) - puts "Creating EDM package" - create_edm(package_dir, upm_tools, edm_package) - puts "Testing generated package" - test_package(cli_args, package_dir) - puts "Committing changes" - update_package_git(package_dir) - update_package_git(edm_package) - - end -end - -namespace :example do - namespace :build do - task prepare: %w[plugin:export] do - # import the built bugsnag package into the sample application - example = File.absolute_path "example" - package = File.absolute_path "Bugsnag.unitypackage" - unity "-projectPath", example, "-importPackage", package - - # here we have to uncomment the lines that reference bugsnag. These are - # commented out so that we can import the package above and have it compile - # before the bugsnag references have been added. - bugsnag_file = File.join(example, "Assets", "Scripts", "Main.cs") - c = File.read(bugsnag_file).gsub("//", "") - File.write(bugsnag_file, c) - end - - task ios: %w[example:build:prepare] do - example = File.absolute_path "example" - unity "-projectPath", example, "-executeMethod", "Main.iOSBuild" - end - - task android: %w[example:build:prepare] do - example = File.absolute_path "example" - unity "-projectPath", example, "-executeMethod", "Main.AndroidBuild" - end - - task all: %w[example:build:ios example:build:android] - end -end namespace :test do namespace :android do diff --git a/build.ps1 b/build.ps1 deleted file mode 100644 index 89f0c1706..000000000 --- a/build.ps1 +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env pwsh -# Parse arguments. Must be the first non commented line for reasons of powershell. -param ( - [string]$configuration = "Release", - [string]$version = "8.0.0" -) - -# Define default arguments. -$CONFIGURATION = "Release" -$SOLUTION = "./BugsnagUnity.sln" -$VERSION = "8.0.0" - -# Set arguments if passed -if ($args) { - for ($i = 0; $i -lt $args.Length; $i++) { - switch ($args[$i]) { - '-c' { $CONFIGURATION = $args[$i + 1]; $i++ } - '--configuration' { $CONFIGURATION = $args[$i + 1]; $i++ } - '-v' { $VERSION = $args[$i + 1]; $i++ } - '--version' { $VERSION = $args[$i + 1]; $i++ } - } - } -} - -# Ensure configuration is set to provided argument value -$CONFIGURATION = $configuration -$VERSION = $version - -# Restore NuGet packages -# NOTE it is necessary to call restore on every project, not just the solution! -# Builds will intermittently fail if this is not done every time. -Write-Output "Restoring NuGet packages..." -dotnet restore $SOLUTION -dotnet restore "src/BugsnagUnity/BugsnagUnity.csproj" -dotnet restore "src/BugsnagUnity/BugsnagUnity.Android.csproj" -dotnet restore "src/BugsnagUnity/BugsnagUnity.iOS.csproj" -dotnet restore "src/BugsnagUnity/BugsnagUnity.MacOS.csproj" -dotnet restore "src/BugsnagUnity/BugsnagUnity.Windows.csproj" - -if ($LASTEXITCODE -ne 0) { - Write-Output "An error occurred while restoring NuGet packages." - exit 1 -} - -# Build the solution -Write-Output "Building the solution..." -dotnet build $SOLUTION -c $CONFIGURATION -p:Version=$VERSION -p:Platform="Any CPU" -if ($LASTEXITCODE -ne 0) { - Write-Output "An error occurred while building the solution." - exit 1 -} - -# Run tests -Write-Output "Running tests..." -dotnet test $SOLUTION -c $CONFIGURATION --no-build -if ($LASTEXITCODE -ne 0) { - Write-Output "An error occurred while running tests." - exit 1 -} - -Write-Output "Build and tests completed successfully." diff --git a/build.sh b/build.sh deleted file mode 100755 index 0347b85e0..000000000 --- a/build.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env bash - -# Define default arguments. -CONFIGURATION="Release" -SOLUTION="./BugsnagUnity.sln" -VERSION="8.2.0" - -# Parse arguments. -for i in "$@"; do - case $1 in - -c|--configuration) CONFIGURATION="$2"; shift ;; - -v|--version) VERSION="$2"; shift ;; - *) ;; - esac - shift -done - -# Restore NuGet packages -# NOTE it is necessary to call restore on every project, not just the solution! -# Builds will intermitently fail if this is not done every time. -echo "Restoring NuGet packages..." -dotnet restore "$SOLUTION" -dotnet restore src/BugsnagUnity/BugsnagUnity.csproj -dotnet restore src/BugsnagUnity/BugsnagUnity.Android.csproj -dotnet restore src/BugsnagUnity/BugsnagUnity.iOS.csproj -dotnet restore src/BugsnagUnity/BugsnagUnity.MacOS.csproj -dotnet restore src/BugsnagUnity/BugsnagUnity.Windows.csproj - -if [ $? -ne 0 ]; then - echo "An error occurred while restoring NuGet packages." - exit 1 -fi - -# Build the solution -echo "Building the solution..." -dotnet build "$SOLUTION" -c "$CONFIGURATION" /p:Version="$VERSION" -if [ $? -ne 0 ]; then - echo "An error occurred while building the solution." - exit 1 -fi - -# Run tests -echo "Running tests..." -dotnet test "$SOLUTION" -c "$CONFIGURATION" --no-build -if [ $? -ne 0 ]; then - echo "An error occurred while running tests." - exit 1 -fi - -echo "Build and tests completed successfully." diff --git a/src/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs b/src/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs deleted file mode 100644 index 9f2474ce4..000000000 --- a/src/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs +++ /dev/null @@ -1,38 +0,0 @@ -using UnityEditor; -using UnityEngine; -[InitializeOnLoad] -public class BugsnagAddScriptingSymbol : MonoBehaviour -{ - private const string DEFINE_SYMBOL = "BUGSNAG_UNITY_WEB_REQUEST"; - - private static BuildTargetGroup[] _supportedPlatforms = { BuildTargetGroup.Android, BuildTargetGroup.Standalone, BuildTargetGroup.iOS, BuildTargetGroup.WebGL }; - - static BugsnagAddScriptingSymbol() - { - foreach (var target in _supportedPlatforms) - { - try - { - SetScriptingSymbol(target); - } - catch - { - // Some users might not have a platform installed, in that case ignore the error - } - } - } - - static void SetScriptingSymbol(BuildTargetGroup buildTargetGroup) - { - var existingSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup); - if (string.IsNullOrEmpty(existingSymbols)) - { - existingSymbols = DEFINE_SYMBOL; - } - else if (!existingSymbols.Contains(DEFINE_SYMBOL)) - { - existingSymbols += ";" + DEFINE_SYMBOL; - } - PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, existingSymbols); - } -} diff --git a/src/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs.meta b/src/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs.meta deleted file mode 100644 index 671526312..000000000 --- a/src/Assets/Bugsnag/Editor/BugsnagAddScriptingSymbol.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8e3c9a6b6e3c84299b5a658c6849d7ac -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs b/src/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs deleted file mode 100644 index 47aef9c77..000000000 --- a/src/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using UnityEditor; -using UnityEngine; - -namespace BugsnagUnity.Editor -{ - // This class contains all the code for the EDM4U support menu item. This is removed in UPM releases by the upm-tools/build-upm-package.sh script. - public partial class BugsnagEditor : EditorWindow - { - - // The kotlin Version here needs to match the one in the rake build file. Both should reflect what the android notifier is using. - private const string ANDROID_DEPS_XML = "https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib"; - - private const string EDM_MENU_ITEM = "Window/BugSnag/Enable EDM4U Support"; - - private static string EDMDepsFilePath = "/Bugsnag/Editor/BugsnagAndroidDependencies.xml"; - - private static string KotlinLibsDirPath = "/Bugsnag/Plugins/Android/Kotlin"; - - [MenuItem(EDM_MENU_ITEM, false, 1)] - private static void ToggleEDM() - { - if (IsEDMEnabled()) - { - DisableEDM(); - } - else - { - EnableEDM(); - } - } - - [MenuItem(EDM_MENU_ITEM, true)] - private static bool ToggleEDMValidate() - { - UnityEditor.Menu.SetChecked(EDM_MENU_ITEM, IsEDMEnabled()); - return true; - } - - public static void EnableEDM() - { - try - { - EditDepsFile(true); - UpdateKotlinLibraryImportSettings(false); - AssetDatabase.Refresh(); - } - catch (Exception e) - { - Debug.LogError("Error enabling BugSnag EDM4U support: " + e.Message); - } - - if (IsEDMEnabled()) - { - ReportEDMSuccess("BugSnag EDM4U support successfully enabled.\n\nPlease restart Unity before building."); - } - else - { - ReportEDMError("Error enabling BugSnag EDM4U support.\n\nPlease check the console for error messages"); - } - } - - public static void DisableEDM() - { - try - { - EditDepsFile(false); - UpdateKotlinLibraryImportSettings(true); - AssetDatabase.Refresh(); - } - catch (Exception e) - { - Debug.LogError("Error disabling BugSnag EDM4U support: " + e.Message); - } - - if (!IsEDMEnabled()) - { - ReportEDMSuccess("BugSnag EDM4U support successfully disabled.\n\nPlease restart Unity before building."); - } - else - { - ReportEDMError("Error disabling BugSnag EDM4U support.\n\nPlease check the console for error messages"); - } - } - - private static void ReportEDMSuccess(string msg) - { - BugsnagEDMPopup.Open(msg); - Debug.Log(msg); - } - - private static void ReportEDMError(string msg) - { - BugsnagEDMPopup.Open(msg); - Debug.LogError(msg); - } - - private static void UpdateKotlinLibraryImportSettings(bool active) - { - foreach (var lib in GetKotlinLibs()) - { - lib.SetCompatibleWithPlatform(BuildTarget.Android, active); - lib.SaveAndReimport(); - } - } - - private static void EditDepsFile(bool create) - { - var path = Application.dataPath + EDMDepsFilePath; - if (create) - { - File.WriteAllText(path, ANDROID_DEPS_XML); - } - else - { - File.Delete(path); - File.Delete(path + ".meta"); - } - } - - private static List GetKotlinLibs() - { - var kotlinLibs = new List(); - foreach (var libPath in Directory.GetFiles(Application.dataPath + KotlinLibsDirPath, "*.jar")) - { - kotlinLibs.Add((PluginImporter)AssetImporter.GetAtPath(libPath.Replace(Application.dataPath, "Assets"))); - } - return kotlinLibs; - } - - private static bool IsEDMEnabled() - { - if (!File.Exists(Application.dataPath + EDMDepsFilePath)) - { - return false; - } - foreach (var lib in GetKotlinLibs()) - { - if (lib.GetCompatibleWithPlatform(BuildTarget.Android)) - { - return false; - } - } - return true; - } - } - - public class BugsnagEDMPopup : EditorWindow - { - private static string _msg; - - public static void Open(string msg) - { - _msg = msg; - BugsnagEDMPopup window = ScriptableObject.CreateInstance(); - window.position = new Rect(Screen.width / 2, Screen.height / 2, 200, 110); - window.ShowPopup(); - } - - void OnGUI() - { - var style = EditorStyles.wordWrappedLabel; - style.alignment = TextAnchor.MiddleCenter; - GUILayout.Space(5); - EditorGUILayout.LabelField(_msg, style); - GUILayout.Space(5); - if (GUILayout.Button("ok")) this.Close(); - } - } - -} diff --git a/src/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs.meta b/src/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs.meta deleted file mode 100644 index f417161c4..000000000 --- a/src/Assets/Bugsnag/Editor/BugsnagEditor.EDM.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 55fc4b302697348259084ed568410d50 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/Assets/Bugsnag/Editor/BugsnagEditor.cs b/src/Assets/Bugsnag/Editor/BugsnagEditor.cs deleted file mode 100644 index dc070068b..000000000 --- a/src/Assets/Bugsnag/Editor/BugsnagEditor.cs +++ /dev/null @@ -1,252 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEditor; -using System.IO; -using BugsnagUnity; -using UnityEditor.Callbacks; -using System.Linq; -using System; - -namespace BugsnagUnity.Editor -{ - public partial class BugsnagEditor : EditorWindow - { - - private bool _showBasicConfig = true; - - private bool _showAdvancedSettings, _showAppInformation, _showEndpoints, _showEnabledErrorTypes, _showSwitch; - - public Texture DarkIcon, LightIcon; - - private Vector2 _scrollPos; - - - private void OnEnable() - { - titleContent.text = "BugSnag"; - CheckForSettingsCreation(); - } - - [MenuItem("Window/BugSnag/Configuration", false, 0)] - public static void ShowWindow() - { - CheckForSettingsCreation(); - GetWindow(typeof(BugsnagEditor)); - } - - private void Update() - { - CheckForSettingsCreation(); - } - - private void OnGUI() - { - DrawIcon(); - if (SettingsFileFound()) - { - DrawSettingsEditorWindow(); - } - } - - private static bool SettingsFileFound() - { - return File.Exists(Application.dataPath + "/Resources/Bugsnag/BugsnagSettingsObject.asset"); - } - - private static void CheckForSettingsCreation() - { - if (!SettingsFileFound()) - { - CreateNewSettingsFile(); - } - } - - private void DrawIcon() - { - titleContent.image = EditorGUIUtility.isProSkin ? LightIcon : DarkIcon; - } - - private void DrawSettingsEditorWindow() - { - _scrollPos = EditorGUILayout.BeginScrollView(_scrollPos, - false, - false); - GUILayout.BeginVertical(); - - GUILayout.Space(10); - var settings = GetSettingsObject(); - var so = new SerializedObject(settings); - - var assemblyName = BugsnagUnity.Configuration.GetAssemblyName(); - var version = assemblyName.Version; - EditorGUILayout.LabelField($"BugSnag Unity version {version.Major}.{version.Minor}.{version.Build}"); - - _showBasicConfig = EditorGUILayout.Foldout(_showBasicConfig, "Basic Configuration", true); - if (_showBasicConfig) - { - DrawBasicConfiguration(settings); - } - - GUILayout.Space(5); - _showAdvancedSettings = EditorGUILayout.Foldout(_showAdvancedSettings, "Advanced Configuration", true); - if (_showAdvancedSettings) - { - DrawAdvancedSettings(so, settings); - } - - GUILayout.Space(5); - _showAppInformation = EditorGUILayout.Foldout(_showAppInformation, "App Information", true); - if (_showAppInformation) - { - DrawAppInfo(so, settings); - } - - GUILayout.Space(5); - _showEndpoints = EditorGUILayout.Foldout(_showEndpoints, "Endpoints", true); - if (_showEndpoints) - { - DrawEndpoints(so); - } - - GUILayout.Space(5); - _showSwitch = EditorGUILayout.Foldout(_showSwitch, new GUIContent("Nintendo Switch ⓘ", "Requires Nintendo Switch Bugsnag plugin"), true); - if (_showSwitch) - { - DrawSwitchOptions(so); - } - - GUILayout.Space(10); - - GUILayout.EndVertical(); - EditorGUILayout.EndScrollView(); - so.ApplyModifiedProperties(); - EditorUtility.SetDirty(settings); - } - - private void DrawBasicConfiguration(BugsnagSettingsObject settings) - { - EditorGUI.indentLevel++; - var originalWidth = EditorGUIUtility.labelWidth; - EditorGUIUtility.labelWidth = 70; - settings.ApiKey = EditorGUILayout.TextField("API Key", settings.ApiKey); - EditorGUIUtility.labelWidth = 280; - settings.StartAutomaticallyAtLaunch = EditorGUILayout.Toggle("Start Automatically (requires API key to be set)", settings.StartAutomaticallyAtLaunch); - EditorGUIUtility.labelWidth = originalWidth; - EditorGUI.indentLevel--; - } - - private void DrawEndpoints(SerializedObject so) - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(so.FindProperty("NotifyEndpoint")); - EditorGUILayout.PropertyField(so.FindProperty("SessionEndpoint")); - EditorGUI.indentLevel--; - } - - private void DrawAppInfo(SerializedObject so, BugsnagSettingsObject settings) - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(so.FindProperty("AppType")); - EditorGUILayout.PropertyField(so.FindProperty("AppVersion")); - EditorGUILayout.PropertyField(so.FindProperty("ReleaseStage")); - settings.VersionCode = EditorGUILayout.IntField(new GUIContent("Version Code ⓘ", "Android devices only"), settings.VersionCode); - settings.BundleVersion = EditorGUILayout.TextField(new GUIContent("Bundle Version ⓘ", "Apple devices only"), settings.BundleVersion); - EditorGUI.indentLevel--; - } - - private void DrawAdvancedSettings(SerializedObject so, BugsnagSettingsObject settings) - { - EditorGUI.indentLevel++; - var originalWidth = EditorGUIUtility.labelWidth; - EditorGUIUtility.labelWidth = 270; - var appHangThresholdMillisValue = EditorGUILayout.LongField(new GUIContent("App Hang Threshold Millis ⓘ", "Apple devices only"), (long)settings.AppHangThresholdMillis); - if (appHangThresholdMillisValue >= 0) - { - settings.AppHangThresholdMillis = (ulong)appHangThresholdMillisValue; - } - EditorGUILayout.PropertyField(so.FindProperty("AutoDetectErrors")); - EditorGUILayout.PropertyField(so.FindProperty("AutoTrackSessions")); - EditorGUILayout.PropertyField(so.FindProperty("GenerateAnonymousId")); - EditorGUILayout.PropertyField(so.FindProperty("BreadcrumbLogLevel")); - EditorGUILayout.PropertyField(so.FindProperty("Context")); - EditorGUILayout.PropertyField(so.FindProperty("DiscardClasses")); - EditorGUILayout.PropertyField(so.FindProperty("EnabledBreadcrumbTypes")); - DrawEnabledErrorTypesDropdown(settings); - EditorGUILayout.PropertyField(so.FindProperty("EnabledReleaseStages")); - EditorGUILayout.PropertyField(so.FindProperty("LaunchDurationMillis")); - settings.MaximumBreadcrumbs = EditorGUILayout.IntField("Max Breadcrumbs", settings.MaximumBreadcrumbs); - EditorGUILayout.PropertyField(so.FindProperty("MaxPersistedEvents")); - EditorGUILayout.PropertyField(so.FindProperty("MaxPersistedSessions")); - settings.MaxReportedThreads = EditorGUILayout.IntField(new GUIContent("Max Reported Threads ⓘ", "Android devices only"), settings.MaxReportedThreads); - EditorGUILayout.PropertyField(so.FindProperty("MaxStringValueLength")); - EditorGUILayout.PropertyField(so.FindProperty("NotifyLogLevel")); - EditorGUILayout.PropertyField(so.FindProperty("PersistUser")); - EditorGUILayout.PropertyField(so.FindProperty("RedactedKeys")); - EditorGUILayout.PropertyField(so.FindProperty("ReportExceptionLogsAsHandled")); - EditorGUILayout.PropertyField(so.FindProperty("SecondsPerUniqueLog")); - EditorGUILayout.PropertyField(so.FindProperty("SendLaunchCrashesSynchronously")); - EditorGUILayout.PropertyField(so.FindProperty("SendThreads")); - EditorGUILayout.PropertyField(so.FindProperty("Telemetry")); - EditorGUIUtility.labelWidth = originalWidth; - EditorGUI.indentLevel--; - - } - - private void DrawSwitchOptions(SerializedObject so) - { - EditorGUI.indentLevel++; - EditorGUILayout.PropertyField(so.FindProperty("SwitchCacheIndex")); - EditorGUILayout.PropertyField(so.FindProperty("SwitchCacheMaxSize")); - EditorGUILayout.PropertyField(so.FindProperty("SwitchCacheMountName")); - EditorGUILayout.PropertyField(so.FindProperty("SwitchCacheType")); - EditorGUI.indentLevel--; - } - - private void DrawEnabledErrorTypesDropdown(BugsnagSettingsObject settings) - { - - var style = new GUIStyle(GUI.skin.GetStyle("foldout")); - style.margin = new RectOffset(2, 0, 0, 0); - _showEnabledErrorTypes = EditorGUILayout.Foldout(_showEnabledErrorTypes, "Enabled Error Types", true, style); - if (_showEnabledErrorTypes) - { - EditorGUI.indentLevel += 2; - settings.EnabledErrorTypes.ANRs = EditorGUILayout.Toggle(new GUIContent("ANRs ⓘ", "Android devices only"), settings.EnabledErrorTypes.ANRs); - settings.EnabledErrorTypes.AppHangs = EditorGUILayout.Toggle(new GUIContent("App Hangs ⓘ", "Apple devices only"), settings.EnabledErrorTypes.AppHangs); - settings.EnabledErrorTypes.Crashes = EditorGUILayout.Toggle(new GUIContent("Crashes ⓘ", "Android and Apple devices only"), settings.EnabledErrorTypes.Crashes); - settings.EnabledErrorTypes.OOMs = EditorGUILayout.Toggle(new GUIContent("OOMs ⓘ", "iOS devices only"), settings.EnabledErrorTypes.OOMs); - settings.EnabledErrorTypes.ThermalKills = EditorGUILayout.Toggle(new GUIContent("Thermal Kills ⓘ", "iOS devices only"), settings.EnabledErrorTypes.ThermalKills); - settings.EnabledErrorTypes.UnityLog = EditorGUILayout.Toggle("Unity Logs", settings.EnabledErrorTypes.UnityLog); - EditorGUI.indentLevel -= 2; - } - } - - private BugsnagSettingsObject GetSettingsObject() - { - return Resources.Load("Bugsnag/BugsnagSettingsObject"); - } - - private static void CreateNewSettingsFile() - { - var resPath = Application.dataPath + "/Resources/Bugsnag"; - Directory.CreateDirectory(resPath); - var asset = CreateInstance(); - AssetDatabase.CreateAsset(asset, "Assets/Resources/Bugsnag/BugsnagSettingsObject.asset"); - AssetDatabase.SaveAssets(); - } - -#if UNITY_IOS || UNITY_TVOS - [PostProcessBuild(1400)] - public static void OnPostProcessBuild(BuildTarget target, string path) - { - var xcodeProjectPath = Path.Combine(path, "Unity-iPhone.xcodeproj"); - var pbxPath = Path.Combine(xcodeProjectPath, "project.pbxproj"); - var lines = new LinkedList(File.ReadAllLines(pbxPath)); - BugsnagUnity.PostProcessBuild.Apply(lines); - File.WriteAllLines(pbxPath, lines.ToArray()); - } -#endif - - } -} \ No newline at end of file diff --git a/src/Assets/Bugsnag/Editor/BugsnagEditor.cs.meta b/src/Assets/Bugsnag/Editor/BugsnagEditor.cs.meta deleted file mode 100644 index 926d16619..000000000 --- a/src/Assets/Bugsnag/Editor/BugsnagEditor.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -fileFormatVersion: 2 -guid: 935253df38ee5445abc731056be30899 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: - - m_PersistentViewDataDictionary: {instanceID: 0} - - DarkIcon: {fileID: 2800000, guid: 2785e0366c7a34c068497d1bb94c6cb2, type: 3} - - LightIcon: {fileID: 2800000, guid: 7ee8345965a96421e8a7b46a262d3567, type: 3} - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/Assets/Bugsnag/Editor/icon-dark.png b/src/Assets/Bugsnag/Editor/icon-dark.png deleted file mode 100644 index 32a7d0fa619af598848be1bd9a38447feee877b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1563 zcmaJ>c~BEq7!QYnICxNT0y4N=I~tG89@&H>B|?%78ZihV#kAu%?C}CCBpY`Z2`R0B zVy&GPMZtPaz3ogr#u?ku+E#0;R!dPFr+60}ZPhw59#gO$(+v>oAC5b-``-KB_xrxz zckRc81v8S9(vwswRkCv?^OTfDAF9j1O4gp2J6Ai03Tu zT)hi(1?`}mpBWZGak#+4hAUVT2j@(OvO{LYfFH;-6!KRFBy-3D_uDlq`-m8Yp?(#) z!U7MF^12EkyC4E6ON%2chG9^aNz2g;%`(h1h`rkpHrxhx0GC|X@zt*zE+1+fgpO(qkH5hy_*iUuOp1Y|md1f&U33lxx8kq^qe z5P%{UX-24$EwDm$AO?TX<$7T_APr_p$r&1=gD9@WP`^JCSiiO;yTSi7Ua2j4YJvcD z14*b7S*0Mp2~n_;yw^L5C@O5sb3|UL3SCJFY?U7bWG7{Tl^ZR`b7q}>z1~XMj5aH2k7Atx zNu~oVi2CLg--B4)Yq4g#2xwUlJ%UgfZG*ycK^CNPAqWvVEe2^^G|LAflF5-O4FpXA zkzWM3JW=pN{b@Gyub{x_N!G{#Bce0vX@sO{8lhRE4#8;BKV zi4sOI%Ep|90i6%ilZek~zz`!KS;XWcFvQ0geH<{*go)6>s6r8qbk0ki6cs7$8QH!V z4CU}*v_L?aCs7%kw)M6Sl`0l-QdUps(%rScPNf!(IoYH3JxE-4g0anFPA^-WTQbYF zXvG*u^QU`m6uDEzY77RrDQ#)vFR`aiH@L@c^+Kzv=Xd}6{LcG-uMMJ7*+lV9ac}Rp zN2D`78y~*id4190mcm(|r!bG-Nuug*6>3ToTwO!2G^FTK6FbwI;>SU$2O1WvRL>s1 z{I~15V^c#T{u%8(I_$!;riPraau1HLxNMysivOr|Sm?HH=exN-KYKcfom!f{`@a3s z(dpZc2U>@;=U$z}O4Mpi;qY{8rbadQ`4ni{ng@XoW8YXkaZZ=|N=MQs2QC>~LeGfy zs=e&~$MrG!ne`*iCVN)qf1!!9Kkutk{}FSMs^xc`Z{K<7`@7>;K4nLd8%7W5EiEQ` zx19f-OWWPx#NvF`98Cf)|5?lV8=+i%}opQn3pH1o^&pT6T39OOq9UAvm_L0jF9c~5qDHx=w! zb@p=X<)`PSymxP7CThbrwHuFZ8?~V+t!Dqt4M%+1)?3HNzop*NrYY~fx;fq!bIAL3 s{*1o1V^ng9WBZ-sy^D($c&^2(RqEQ>=E^s1KSqAnPDcT?*H+r_A4pF;>Hq)$ diff --git a/src/Assets/Bugsnag/Editor/icon-dark.png.meta b/src/Assets/Bugsnag/Editor/icon-dark.png.meta deleted file mode 100644 index 80d10ac80..000000000 --- a/src/Assets/Bugsnag/Editor/icon-dark.png.meta +++ /dev/null @@ -1,88 +0,0 @@ -fileFormatVersion: 2 -guid: 2785e0366c7a34c068497d1bb94c6cb2 -TextureImporter: - fileIDToRecycleName: {} - externalObjects: {} - serializedVersion: 9 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: -1 - aniso: 1 - mipBias: -100 - wrapU: 1 - wrapV: 1 - wrapW: 1 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 1 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 1 - spriteTessellationDetail: -1 - textureType: 2 - textureShape: 1 - singleChannelComponent: 0 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - platformSettings: - - serializedVersion: 2 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 0 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - androidETC2FallbackOverride: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: ff77212589ad64b1f9e9fb9994712e46 - vertices: [] - indices: - edges: [] - weights: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/Assets/Bugsnag/Editor/icon-light.png b/src/Assets/Bugsnag/Editor/icon-light.png deleted file mode 100644 index 3d3bed7fe74fe1fd2d6c14336a360a4442f4e8ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1568 zcmaJ>c~BEq7>|l5)Tjv6dbBR<)T3pyyUA`y7NV02NlOr7YBR-ym)#eLkZjy6k_780 zib&N~MjfS{UZ`jX5usSoG9DG{Fhf;zyxLA%wS_X)vpPD+U^hUle>m>U?tAZh-|zc= z-?bH4nRDf_lVW8uncR|YvPmlven&=2UwW`{VRcZtP7fHFPDJ0W86fIMh} zfD0~bgQ+svu(fWxLv&a(7?$@aKv+i+@c1OOOqMz)-~(&{6cH!Pb9;5@o$rsKh?~=) z@6%So>NCQ8cX~*G^Fx_-HdMfBIdsl!BsIWD20Ty%NWfF*^)mq-+HaSU_F*xOBK<02 zfesxY<*;TUMqYqOvVz1|f*_D&t%3tiz&f2th>}o}I6>hgg%Jd!(lQi<3_hsjPT*XO z&6GCiOgib%d{Oi6{lQb}Y&?|xf=JijDSTI39E4Y24 zoA)ANi@?bji8@rGIuL`$XSF^v?DY?3O3E1?06v^l5V*$^4y<3>FWTV$G+wCfw+DR? zw?RK&B(PFJT+&G&E^QBT2JSYbNyuJx%LP28}^a86#MW z*DnGu3nRYWlJ7xm@=LLdQGh_?1v}3dM%o}NpBH(5KJP=6Dg}Yev;x-c4NGQ)t27X_ z2@3AzkV_MI57M7z#{B{cPMTsh9MoVc4Gk~~0Du8jqrwP4se#H#I5{Uk2l3o<=^N-% zNg{>ei?Csm38-=rG=;e|Y68I z4Tf}hHd@dt&66MvPGQR7B{JDirNyMT2Y&wN^4WJ2z?9SXsusRVCncm7j?W&E5@>jO zd`)z9VC48lJ?q0OwL`^kO zw^#m6+_ByjrMC8*%x?Lug3c%SweLDN9ctdVbm7BaMr8Dr*w+UyC~meGuDx;T;fw`O z|2CG4-I@E!oqaw$r)zPjEIIH|*K4O)>UuNt?~a9fmDu@(z}ckJiNniyE73 zXS%O+Y;O7LMsxMHTV3(J_WDQXV>5Gt?4^dCjlb93AHH(#3H1*echUa!2USZG?tr*$ z%j`4umF)U;6U&+K("Bugsnag/BugsnagSettingsObject"); - if (settings != null && settings.StartAutomaticallyAtLaunch) - { - if(string.IsNullOrEmpty(settings.ApiKey)) - { - Debug.LogError("Bugsnag not auto started as the API key is not set in the Bugsnag Settings window."); - return; - } - var config = settings.GetConfig(); - config.ScriptingBackend = FindScriptingBackend(); - config.DotnetScriptingRuntime = FindDotnetScriptingRuntime(); - config.DotnetApiCompatibility = FindDotnetApiCompatibility(); - Bugsnag.Start(config); - } - } - - private static string FindScriptingBackend() - { -#if ENABLE_MONO - return "Mono"; -#elif ENABLE_IL2CPP - return "IL2CPP"; -#else - return "Unknown"; -#endif - } - - private static string FindDotnetScriptingRuntime() - { -#if NET_4_6 - return ".NET 4.6 equivalent"; -#else - return ".NET 3.5 equivalent"; -#endif - } - - private static string FindDotnetApiCompatibility() - { -#if NET_2_0_SUBSET - return ".NET 2.0 Subset"; -#else - return ".NET 2.0"; -#endif - } - } - -} \ No newline at end of file diff --git a/src/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs.meta b/src/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs.meta deleted file mode 100644 index ca0d416a2..000000000 --- a/src/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ed73a8b9e01584d74a763fdd2bb3d73e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs b/src/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs deleted file mode 100644 index dbf1f9b91..000000000 --- a/src/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs +++ /dev/null @@ -1,221 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; -using BugsnagUnity.Payload; -using System; - -namespace BugsnagUnity -{ - [Serializable] - public class BugsnagSettingsObject : ScriptableObject - { - - public bool StartAutomaticallyAtLaunch = true; - public bool AutoDetectErrors = true; - public bool AutoTrackSessions = true; - public string ApiKey; - public string AppType; - public ulong AppHangThresholdMillis; - public string AppVersion; - public string BundleVersion; - public EditorLogLevel BreadcrumbLogLevel = EditorLogLevel.Log; - public string Context; - public string[] DiscardClasses; - public string[] EnabledReleaseStages; - public EnabledErrorTypes EnabledErrorTypes = new EnabledErrorTypes(); - public EditorBreadcrumbTypes EnabledBreadcrumbTypes = new EditorBreadcrumbTypes(); - public long LaunchDurationMillis = 5000; - public int MaximumBreadcrumbs = 100; - public int MaxPersistedEvents = 32; - public int MaxPersistedSessions = 128; - public int MaxReportedThreads = 200; - public int MaxStringValueLength = 10000; - public string NotifyEndpoint = "https://notify.bugsnag.com"; - public EditorLogLevel NotifyLogLevel = EditorLogLevel.Exception; - public bool PersistUser = true; - public string SessionEndpoint = "https://sessions.bugsnag.com"; - public ThreadSendPolicy SendThreads = ThreadSendPolicy.UnhandledOnly; - public string[] RedactedKeys = new string[] { ".*password.*" }; - public string ReleaseStage; - public bool ReportExceptionLogsAsHandled = true; - public bool SendLaunchCrashesSynchronously = true; - public double SecondsPerUniqueLog = 5; - public List Telemetry = new List { TelemetryType.InternalErrors, TelemetryType.Usage }; - public int VersionCode = -1; - - public bool GenerateAnonymousId = true; - public SwitchCacheType SwitchCacheType = SwitchCacheType.R; - public string SwitchCacheMountName = "BugsnagCache"; - public int SwitchCacheIndex = 0; - public int SwitchCacheMaxSize = 10485760; - - public static Configuration LoadConfiguration() - { - var settings = Resources.Load("Bugsnag/BugsnagSettingsObject"); - if (settings != null) - { - var config = settings.GetConfig(); - return config; - } - else - { - throw new Exception("No BugsnagSettingsObject found."); - } - } - - public Configuration GetConfig() - { - var config = new Configuration(ApiKey); - config.AutoDetectErrors = AutoDetectErrors; - config.AutoTrackSessions = AutoTrackSessions; - config.AppType = AppType; - if (AppHangThresholdMillis > 0) - { - config.AppHangThresholdMillis = AppHangThresholdMillis; - } - if (!string.IsNullOrEmpty(AppVersion)) - { - config.AppVersion = AppVersion; - } - config.BundleVersion = BundleVersion; - - config.BreadcrumbLogLevel = GetLogTypeFromLogLevel( BreadcrumbLogLevel ); - config.Context = Context; - foreach(string discardedClass in DiscardClasses){ - try - { - config.DiscardClasses.Add(new System.Text.RegularExpressions.Regex(discardedClass)); - } - catch (ArgumentException e) - { - Debug.LogError("Invalid Regex pattern for discard class: " + e.Message); - } - } - if (EnabledReleaseStages != null && EnabledReleaseStages.Length > 0) - { - config.EnabledReleaseStages = EnabledReleaseStages; - } - config.EnabledErrorTypes = EnabledErrorTypes; - config.EnabledBreadcrumbTypes = GetEnabledBreadcrumbTypes(); - config.LaunchDurationMillis = LaunchDurationMillis; - config.MaximumBreadcrumbs = MaximumBreadcrumbs; - config.MaxPersistedEvents = MaxPersistedEvents; - config.MaxPersistedSessions = MaxPersistedSessions; - config.MaxReportedThreads = MaxReportedThreads; - config.MaxStringValueLength = MaxStringValueLength; - config.NotifyLogLevel = GetLogTypeFromLogLevel( NotifyLogLevel ); - config.SendThreads = SendThreads; - if (!string.IsNullOrEmpty(NotifyEndpoint) && !string.IsNullOrEmpty(SessionEndpoint)) - { - config.Endpoints = new EndpointConfiguration(NotifyEndpoint, SessionEndpoint); - } - foreach(string key in RedactedKeys) - { - try - { - config.RedactedKeys.Add(new System.Text.RegularExpressions.Regex(key)); - } - catch (ArgumentException e) - { - Debug.LogError("Invalid Regex pattern for redacted key: " + e.Message); - } - } - if (string.IsNullOrEmpty(ReleaseStage)) - { - config.ReleaseStage = Debug.isDebugBuild ? "development" : "production"; - } - else - { - config.ReleaseStage = ReleaseStage; - } - config.PersistUser = PersistUser; - config.ReportExceptionLogsAsHandled = ReportExceptionLogsAsHandled; - config.SendLaunchCrashesSynchronously = SendLaunchCrashesSynchronously; - config.SecondsPerUniqueLog = TimeSpan.FromSeconds(SecondsPerUniqueLog); - config.Telemetry = Telemetry; - config.VersionCode = VersionCode; - config.GenerateAnonymousId = GenerateAnonymousId; - config.SwitchCacheType = SwitchCacheType; - config.SwitchCacheIndex = SwitchCacheIndex; - config.SwitchCacheMaxSize = SwitchCacheMaxSize; - config.SwitchCacheMountName = SwitchCacheMountName; - - return config; - } - - private BreadcrumbType[] GetEnabledBreadcrumbTypes() - { - var enabledTypes = new List(); - if (EnabledBreadcrumbTypes.Navigation) - { - enabledTypes.Add(BreadcrumbType.Navigation); - } - if (EnabledBreadcrumbTypes.Request) - { - enabledTypes.Add(BreadcrumbType.Request); - } - if (EnabledBreadcrumbTypes.Process) - { - enabledTypes.Add(BreadcrumbType.Process); - } - if (EnabledBreadcrumbTypes.Log) - { - enabledTypes.Add(BreadcrumbType.Log); - } - if (EnabledBreadcrumbTypes.User) - { - enabledTypes.Add(BreadcrumbType.User); - } - if (EnabledBreadcrumbTypes.State) - { - enabledTypes.Add(BreadcrumbType.State); - } - if (EnabledBreadcrumbTypes.Error) - { - enabledTypes.Add(BreadcrumbType.Error); - } - enabledTypes.Add(BreadcrumbType.Manual); - return enabledTypes.ToArray(); - } - - [Serializable] - public class EditorBreadcrumbTypes - { - public bool Error = true; - public bool Log = true; - public bool Navigation = true; - public bool Process = true; - public bool Request = true; - public bool State = true; - public bool User = true; - } - - [Serializable] - public enum EditorLogLevel - { - Exception, - Error, - Assert, - Warning, - Log - } - - - private LogType GetLogTypeFromLogLevel(EditorLogLevel editorLogLevel) - { - switch (editorLogLevel) - { - case EditorLogLevel.Exception: - return LogType.Exception; - case EditorLogLevel.Error: - return LogType.Error; - case EditorLogLevel.Assert: - return LogType.Assert; - case EditorLogLevel.Warning: - return LogType.Warning; - default: - return LogType.Log; - } - } - - } -} diff --git a/src/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs.meta b/src/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs.meta deleted file mode 100644 index cc077c11a..000000000 --- a/src/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3e0efee821abb422baf5bb3728925f09 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/BugsnagUnity/AutomaticDataCollector.cs b/src/BugsnagUnity/AutomaticDataCollector.cs deleted file mode 100644 index 9653a0e3c..000000000 --- a/src/BugsnagUnity/AutomaticDataCollector.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class AutomaticDataCollector - { - - internal static void SetDefaultData(INativeClient nativeClient) - { - //data added to metadata.app - var appMetadata = new Dictionary(); - appMetadata.Add("companyName", Application.companyName); - appMetadata.Add("name", Application.productName); - nativeClient.AddNativeMetadata("app",appMetadata); - - //data added to metadata.device - var deviceMetadata = new Dictionary(); - deviceMetadata.Add("screenDensity", Screen.dpi.ToString()); - var res = Screen.currentResolution; - deviceMetadata.Add("screenResolution", string.Format("{0}x{1}", res.width, res.height)); - deviceMetadata.Add("graphicsDeviceVersion", SystemInfo.graphicsDeviceVersion); - deviceMetadata.Add("graphicsMemorySize", SystemInfo.graphicsMemorySize.ToString()); - deviceMetadata.Add("graphicsShaderLevel", SystemInfo.graphicsShaderLevel.ToString()); - var processorType = SystemInfo.processorType; - if (!string.IsNullOrEmpty(processorType)) - { - deviceMetadata.Add("processorType", processorType); - } - deviceMetadata.Add("osLanguage", Application.systemLanguage.ToString()); - nativeClient.AddNativeMetadata("device", deviceMetadata); - } - - internal static void AddStatefulDeviceData(Metadata metadata) - { - //data added to metadata.device - var deviceMetadata = new Dictionary(); - if (SystemInfo.batteryLevel > -1) - { - deviceMetadata.Add("batteryLevel", SystemInfo.batteryLevel); - } - deviceMetadata.Add("charging", SystemInfo.batteryStatus.Equals(BatteryStatus.Charging)); - metadata.AddMetadata("device", deviceMetadata); - } - - } -} diff --git a/src/BugsnagUnity/BlockingQueue.cs b/src/BugsnagUnity/BlockingQueue.cs deleted file mode 100644 index 11213e697..000000000 --- a/src/BugsnagUnity/BlockingQueue.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Collections.Generic; -using System.Threading; - -namespace BugsnagUnity -{ - class BlockingQueue - { - Queue Queue { get; } - object QueueLock { get; } - - internal BlockingQueue() - { - QueueLock = new object(); - Queue = new Queue(); - } - - internal void Enqueue(T item) - { - lock (QueueLock) - { - Queue.Enqueue(item); - Monitor.Pulse(QueueLock); - } - } - - internal T Dequeue() - { - lock (QueueLock) - { - while (Queue.Count == 0) - { - Monitor.Wait(QueueLock); - } - - return Queue.Dequeue(); - } - } - } -} diff --git a/src/BugsnagUnity/Bugsnag.cs b/src/BugsnagUnity/Bugsnag.cs deleted file mode 100644 index 34622f97a..000000000 --- a/src/BugsnagUnity/Bugsnag.cs +++ /dev/null @@ -1,172 +0,0 @@ -using System; -using System.Collections.Generic; -using BugsnagUnity.Payload; -using UnityEngine.Networking; - -namespace BugsnagUnity -{ - public static class Bugsnag - { - - private const string INIT_WARNING = "Bugsnag is already running and this call to Start() will be ignored. If this was unexpected please check whether Bugsnag is set to start automatically via the settings dialog."; - - static object _clientLock = new object(); - - public static void Start(string apiKey) - { - Start(new Configuration(apiKey)); - } - - public static void Start(Configuration configuration) - { - - lock (_clientLock) - { - if (InternalClient == null) - { - var configClone = configuration.Clone(); - var nativeClient = new NativeClient(configClone); - InternalClient = new Client(nativeClient); - } - else - { - UnityEngine.Debug.LogWarning(INIT_WARNING); - } - } - } - - public static bool IsStarted() - { - return InternalClient != null; - } - - private static Client InternalClient { get; set; } - - private static IClient Client => InternalClient; - - public static void Notify(string name, string message, string stackTrace, Func callback = null) => InternalClient.Notify(name, message, stackTrace, callback); - - public static void Notify(System.Exception exception, string stacktrace, Func callback = null) => InternalClient.Notify(exception, stacktrace, callback); - - public static void Notify(System.Exception exception, Func callback = null) => InternalClient.Notify(exception, callback); - - public static void Notify(System.Exception exception, Severity severity, Func callback = null) => InternalClient.Notify(exception, severity, callback); - - public static List Breadcrumbs => Client.Breadcrumbs.Retrieve(); - - public static void LeaveBreadcrumb(string message, Dictionary metadata = null, BreadcrumbType type = BreadcrumbType.Manual ) => InternalClient.Breadcrumbs.Leave(message, metadata, type); - - public static void LeaveBreadcrumb(UnityWebRequest request, TimeSpan? duration) => InternalClient.LeaveNetworkBreadcrumb(request, duration); - - public static User GetUser() => Client.GetUser(); - - public static void SetUser(string id, string email, string name) => Client.SetUser(id, email, name); - - public static void StartSession() => InternalClient.SessionTracking.StartSession(); - - public static void PauseSession() => InternalClient.SessionTracking.PauseSession(); - - public static bool ResumeSession() => InternalClient.SessionTracking.ResumeSession(); - - ///

- /// Used to signal to the Bugsnag client that the focused state of the - /// application has changed. This is used for session tracking and also - /// the tracking of in foreground time for the application. - /// - /// - public static void SetApplicationState(bool inFocus) - { - if(Client != null) - { - Client.SetApplicationState(inFocus); - } - } - - /// - /// Bugsnag uses the concept of contexts to help display and group your errors. - /// Contexts represent what was happening in your game at the time an error - /// occurs. Unless manually set, this will be automatically set to be your currently active Unity Scene. - /// - public static string Context - { - get - { - return Client.GetContext(); - } - set - { - Client.SetContext(value); - } - } - - /// - /// Setting Configuration.LaunchDurationMillis to 0 will cause Bugsnag to consider the app to be launching until Bugsnag.MarkLaunchCompleted() has been called. - /// - public static void MarkLaunchCompleted() => Client.MarkLaunchCompleted(); - - /// - /// Get information regarding the last application run. This will be null on non mobile platforms. - /// - public static LastRunInfo GetLastRunInfo() => Client.LastRunInfo; - - - /// - /// Add an OnError callback to run when an error occurs - /// - public static void AddOnError(Func bugsnagCallback) => Client.AddOnError(bugsnagCallback); - - /// - /// Remove an OnError callback - /// - public static void RemoveOnError(Func bugsnagCallback) => Client.RemoveOnError(bugsnagCallback); - - /// - /// Add an OnSession callback to run when an session is created - /// - public static void AddOnSession(Func callback) => Client.AddOnSession(callback); - - /// - /// Remove an OnSession callback - /// - public static void RemoveOnSession(Func callback) => Client.RemoveOnSession(callback); - - /// - /// AddMetadata that will appear in every reported event - /// - public static void AddMetadata(string section, string key, object value) => Client.AddMetadata(section, key, value); - - /// - /// AddMetadata that will appear in every reported event - /// - public static void AddMetadata(string section, IDictionary metadata) => Client.AddMetadata(section, metadata); - - /// - /// Clear the metadata stored in the specified section - /// - public static void ClearMetadata(string section) => Client.ClearMetadata(section); - - /// - /// Clear the metadata stored with the specified section and key - /// - public static void ClearMetadata(string section, string key) => Client.ClearMetadata(section, key); - - /// - /// Get the metadata stored in the specified section - /// - public static IDictionary GetMetadata(string section) => Client.GetMetadata(section); - - /// - /// Get the metadata stored with the specified section and key - /// - public static object GetMetadata(string section, string key) => Client.GetMetadata(section, key); - - public static void AddFeatureFlag(string name, string variant = null) => Client.AddFeatureFlag(name,variant); - - public static void AddFeatureFlags(FeatureFlag[] featureFlags) => Client.AddFeatureFlags(featureFlags); - - public static void ClearFeatureFlag(string name) => Client.ClearFeatureFlag(name); - - public static void ClearFeatureFlags() => Client.ClearFeatureFlags(); - - } -} diff --git a/src/BugsnagUnity/BugsnagUnity.Android.csproj b/src/BugsnagUnity/BugsnagUnity.Android.csproj deleted file mode 100644 index 6c23bd57b..000000000 --- a/src/BugsnagUnity/BugsnagUnity.Android.csproj +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/BugsnagUnity/BugsnagUnity.MacOS.csproj b/src/BugsnagUnity/BugsnagUnity.MacOS.csproj deleted file mode 100644 index e5b42f661..000000000 --- a/src/BugsnagUnity/BugsnagUnity.MacOS.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/BugsnagUnity/BugsnagUnity.Windows.csproj b/src/BugsnagUnity/BugsnagUnity.Windows.csproj deleted file mode 100644 index 6bc61eba4..000000000 --- a/src/BugsnagUnity/BugsnagUnity.Windows.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/BugsnagUnity/BugsnagUnity.csproj b/src/BugsnagUnity/BugsnagUnity.csproj deleted file mode 100644 index a673b40e5..000000000 --- a/src/BugsnagUnity/BugsnagUnity.csproj +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/BugsnagUnity/BugsnagUnity.iOS.csproj b/src/BugsnagUnity/BugsnagUnity.iOS.csproj deleted file mode 100644 index 066893974..000000000 --- a/src/BugsnagUnity/BugsnagUnity.iOS.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/BugsnagUnity/BugsnagUnityWebRequest b/src/BugsnagUnity/BugsnagUnityWebRequest deleted file mode 160000 index 7fcd78f89..000000000 --- a/src/BugsnagUnity/BugsnagUnityWebRequest +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7fcd78f89d1f999f10d9245c4e7e3d8f8e224a5a diff --git a/src/BugsnagUnity/Client.cs b/src/BugsnagUnity/Client.cs deleted file mode 100644 index b06e4f33f..000000000 --- a/src/BugsnagUnity/Client.cs +++ /dev/null @@ -1,744 +0,0 @@ -using BugsnagUnity.Payload; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using UnityEngine; -using UnityEngine.SceneManagement; -using System; -using System.Collections; -using System.Reflection; -using BugsnagNetworking; -using UnityEngine.Networking; - -namespace BugsnagUnity -{ - internal class Client : IClient - { - public Configuration Configuration => NativeClient.Configuration; - - public IBreadcrumbs Breadcrumbs => NativeClient.Breadcrumbs; - - public ISessionTracker SessionTracking { get; } - - public LastRunInfo LastRunInfo => NativeClient.GetLastRunInfo(); - - private User _cachedUser; - - private Metadata _storedMetadata; - - private UniqueLogThrottle _uniqueCounter; - - private MaximumLogTypeCounter _logTypeCounter; - - internal CacheManager CacheManager; - - internal PayloadManager PayloadManager; - - private Delivery _delivery; - - object CallbackLock { get; } = new object(); - - internal INativeClient NativeClient { get; } - - private Stopwatch _foregroundStopwatch; - - private Stopwatch _backgroundStopwatch; - - bool InForeground => _foregroundStopwatch.IsRunning; - - private Thread MainThread; - - private static double AutoCaptureSessionThresholdSeconds = 30; - - private static object autoSessionLock = new object(); - - private OrderedDictionary _featureFlags; - - private bool _isUnity2019OrHigher; - - private class BugsnagLogHandler : ILogHandler - { - - private ILogHandler _oldLogHandler; - - private Client _client; - - private Configuration _config => _client.Configuration; - - public BugsnagLogHandler(ILogHandler oldLogHandler, Client client) - { - _oldLogHandler = oldLogHandler; - _client = client; - } - - public void LogException(System.Exception exception, UnityEngine.Object context) - { - if (exception == null) - { - return; - } - if (_config.AutoDetectErrors && LogType.Exception.IsGreaterThanOrEqualTo(_config.NotifyLogLevel)) - { - var unityLogMessage = new UnityLogMessage(exception); - var shouldSend = Error.ShouldSend(exception) - && _client._uniqueCounter.ShouldSend(unityLogMessage) - && _client._logTypeCounter.ShouldSend(unityLogMessage); - if (shouldSend) - { - var handledState = _config.ReportExceptionLogsAsHandled ? HandledState.ForLoggedException() : HandledState.ForUnhandledException(); - _client.Notify(exception, handledState, null); - } - } - if (_oldLogHandler != null) - { - _oldLogHandler.LogException(exception, context); - } - } - - public void LogFormat(LogType logType, UnityEngine.Object context, string format, params object[] args) - { - if (_oldLogHandler != null) - { - _oldLogHandler.LogFormat(logType, context, format, args); - } - } - } - - private void SetupAdvancedExceptionInterceptor() - { - var oldHandler = UnityEngine.Debug.unityLogger.logHandler; - UnityEngine.Debug.unityLogger.logHandler = new BugsnagLogHandler(oldHandler, this); - } - - public Client(INativeClient nativeClient) - { - InitMainthreadDispatcher(); - NativeClient = nativeClient; - CacheManager = new CacheManager(Configuration); - PayloadManager = new PayloadManager(CacheManager); - _delivery = new Delivery(this, Configuration, CacheManager, PayloadManager); - MainThread = Thread.CurrentThread; - SessionTracking = new SessionTracker(this); - _isUnity2019OrHigher = IsUnity2019OrHigher(); - InitStopwatches(); - InitUserObject(); - InitMetadata(); - InitFeatureFlags(); - InitCounters(); - if (_isUnity2019OrHigher) - { - SetupAdvancedExceptionInterceptor(); - } - InitTimingTracker(); - StartInitialSession(); - CheckForMisconfiguredEndpointsWarning(); - AddBugsnagLoadedBreadcrumb(); - _delivery.StartDeliveringCachedPayloads(); - ListenForSceneLoad(); - SetupNetworkListeners(); - InitLogHandlers(); - } - - private void InitMainthreadDispatcher() - { - MainThreadDispatchBehaviour.Instance(); - } - - private bool IsUnity2019OrHigher() - { - var version = Application.unityVersion; - //will be null in unit tests - if (version == null) - { - return false; - } - return !version.Contains("2017") && - !version.Contains("2018"); - } - - private void InitFeatureFlags() - { - if (Configuration.FeatureFlags != null) - { - _featureFlags = Configuration.FeatureFlags; - } - else - { - _featureFlags = new OrderedDictionary(); - } - } - - private void StartInitialSession() - { - if (IsUsingFallback() && Configuration.AutoTrackSessions && SessionTracking.CurrentSession == null) - { - SessionTracking.StartSession(); - } - } - - private void InitTimingTracker() - { - var timingTrackerObject = new GameObject("Bugsnag app lifecycle tracker"); - timingTrackerObject.AddComponent(); - } - - private void InitLogHandlers() - { - Application.logMessageReceivedThreaded += MultiThreadedNotify; - Application.logMessageReceived += NotifyFromUnityLog; - } - - private void InitCounters() - { - _uniqueCounter = new UniqueLogThrottle(Configuration); - _logTypeCounter = new MaximumLogTypeCounter(Configuration); - } - - private void InitMetadata() - { - _storedMetadata = new Metadata(NativeClient); - _storedMetadata.MergeMetadata(Configuration.Metadata.Payload); - AutomaticDataCollector.SetDefaultData(NativeClient); - } - - private void InitStopwatches() - { - _foregroundStopwatch = new Stopwatch(); - _backgroundStopwatch = new Stopwatch(); - // Required in case the focus event is not recieved (if Bugsnag is started after it is sent) - _foregroundStopwatch.Start(); - } - - private void InitUserObject() - { - if (Configuration.GetUser() != null) - { - // if a user is supplied in the config then use that - _cachedUser = Configuration.GetUser(); - } - else - { - // otherwise create one - _cachedUser = new User { Id = CacheManager.GetCachedDeviceId() }; - // see if a native user is avaliable - NativeClient.PopulateUser(_cachedUser); - } - // listen for changes and pass the data to the native layer - _cachedUser.PropertyChanged.AddListener(() => { NativeClient.SetUser(_cachedUser); }); - } - - private void CheckForMisconfiguredEndpointsWarning() - { - var endpoints = Configuration.Endpoints; - if (endpoints.IsValid) - { - return; - } - if (endpoints.NotifyIsCustom && !endpoints.SessionIsCustom) - { - UnityEngine.Debug.LogWarning("Invalid configuration. endpoints.Notify cannot be set without also setting endpoints.Session. Events will not be sent to Bugsnag."); - } - if (!endpoints.NotifyIsCustom && endpoints.SessionIsCustom) - { - UnityEngine.Debug.LogWarning("Invalid configuration. endpoints.Session cannot be set without also setting endpoints.Notify. Sessions will not be sent to Bugsnag."); - } - } - - private void AddBugsnagLoadedBreadcrumb() - { - if (IsUsingFallback() && Configuration.IsBreadcrumbTypeEnabled(BreadcrumbType.State)) - { - Breadcrumbs.Leave("Bugsnag loaded", null, BreadcrumbType.State); - } - } - - public bool IsUsingFallback() - { - return Application.platform != RuntimePlatform.Android && - Application.platform != RuntimePlatform.OSXPlayer && - Application.platform != RuntimePlatform.IPhonePlayer; - } - - private void ListenForSceneLoad() - { - SceneManager.sceneLoaded += (Scene scene, LoadSceneMode loadSceneMode) => - { - if (Configuration.IsBreadcrumbTypeEnabled(BreadcrumbType.Navigation)) - { - Breadcrumbs.Leave("Scene Loaded", new Dictionary { { "sceneName", scene.name } }, BreadcrumbType.Navigation); - } - _storedMetadata.AddMetadata("app", "lastLoadedUnityScene", scene.name); - }; - } - - public void Send(IPayload payload) - { - if (!ShouldSendRequests()) - { - return; - } - _delivery.Deliver(payload); - } - - void MultiThreadedNotify(string condition, string stackTrace, LogType logType) - { - // Discard messages from the main thread as they will be reported separately - if (!ReferenceEquals(Thread.CurrentThread, MainThread)) - { - NotifyFromUnityLog(condition, stackTrace, logType); - } - } - - private void NotifyFromUnityLog(string condition, string stackTrace, LogType logType) - { - if (!Configuration.EnabledErrorTypes.UnityLog) - { - return; - } - if (logType.Equals(LogType.Exception) && _isUnity2019OrHigher) - { - return; - } - if (condition.StartsWith("BUGSNAG_MAZERUNNER_LOG")) - { - return; - } - if (Configuration.AutoDetectErrors && logType.IsGreaterThanOrEqualTo(Configuration.NotifyLogLevel)) - { - var logMessage = new UnityLogMessage(condition, stackTrace, logType); - var shouldSend = Error.ShouldSend(logMessage) - && _uniqueCounter.ShouldSend(logMessage) - && _logTypeCounter.ShouldSend(logMessage); - if (shouldSend) - { - var severity = Configuration.LogTypeSeverityMapping.Map(logType); - var backupStackFrames = new System.Diagnostics.StackTrace(1, true).GetFrames(); - var forceUnhandled = logType == LogType.Exception && !Configuration.ReportExceptionLogsAsHandled; - var exception = Error.FromUnityLogMessage(logMessage, backupStackFrames, severity, forceUnhandled); - Notify(new Error[] { exception }, exception.HandledState, null, logType); - } - } - else if (Configuration.ShouldLeaveLogBreadcrumb(logType)) - { - var metadata = new Dictionary() - { - {"logLevel" , logType.ToString() } - }; - Breadcrumbs.Leave(condition, metadata, BreadcrumbType.Log); - } - } - - public void Notify(string name, string message, string stackTrace, Func callback) - { - var exceptions = new Error[] { Error.FromStringInfo(name, message, stackTrace) }; - Notify(exceptions, HandledState.ForHandledException(), callback, LogType.Exception); - } - - public void Notify(System.Exception exception, string stacktrace, Func callback) - { - var exceptions = new Errors(exception, stacktrace).ToArray(); - Notify(exceptions, HandledState.ForHandledException(), callback, LogType.Exception); - } - - public void Notify(System.Exception exception, Func callback) - { - Notify(exception, HandledState.ForHandledException(), callback); - } - - public void Notify(System.Exception exception, Severity severity, Func callback) - { - Notify(exception, HandledState.ForUserSpecifiedSeverity(severity), callback); - } - - void Notify(System.Exception exception, HandledState handledState, Func callback) - { - // we need to generate a substitute stacktrace here as if we are not able - // to generate one from the exception that we are given then we are not able - // to do this inside of the IEnumerator generator code - var substitute = new System.Diagnostics.StackTrace(true).GetFrames(); - var errors = new Errors(exception, substitute).ToArray(); - foreach (var error in errors) - { - if (error.IsAndroidJavaException) - { - handledState = HandledState.ForUnhandledException(); - } - } - Notify(errors, handledState, callback, null); - } - - private void Notify(Error[] exceptions, HandledState handledState, Func callback, LogType? logType) - { - if (!ShouldSendRequests() || EventContainsDiscardedClass(exceptions) || !Configuration.Endpoints.IsValid) - { - return; - } - - var correlation = PerformanceHelper.GetCurrentPerformanceSpanContext(); - if (!ReferenceEquals(Thread.CurrentThread, MainThread)) - { - try - { - var asyncHandler = MainThreadDispatchBehaviour.Instance(); - asyncHandler.Enqueue(() => { NotifyOnMainThread(exceptions, handledState, callback,logType, correlation); }); - } - catch - { - // Async behavior is not available in a test environment - } - } - else - { - NotifyOnMainThread(exceptions, handledState, callback, logType, correlation); - } - } - - private void NotifyOnMainThread(Error[] exceptions, HandledState handledState, Func callback, LogType? logType, Correlation correlation) - { - if (!ShouldSendRequests() || EventContainsDiscardedClass(exceptions) || !Configuration.Endpoints.IsValid) - { - return; - } - - var user = _cachedUser.Clone(); - - var app = new AppWithState(Configuration) - { - InForeground = InForeground, - DurationInForeground = _foregroundStopwatch.Elapsed, - }; - - NativeClient.PopulateAppWithState(app); - - var device = new DeviceWithState(Configuration, CacheManager.GetCachedDeviceId()); - - NativeClient.PopulateDeviceWithState(device); - - var eventMetadata = new Metadata(); - - eventMetadata.MergeMetadata(NativeClient.GetNativeMetadata()); - - AutomaticDataCollector.AddStatefulDeviceData(eventMetadata); - - var activeScene = SceneManager.GetActiveScene(); - if (activeScene != null) - { - eventMetadata.AddMetadata("app", "activeUnityScene", activeScene.name); - } - - eventMetadata.MergeMetadata(_storedMetadata.Payload); - - var featureFlags = new OrderedDictionary(); - foreach (DictionaryEntry entry in _featureFlags) - { - featureFlags[entry.Key] = entry.Value; - } - - var @event = new Payload.Event( - Configuration.Context, - eventMetadata, - app, - device, - user, - exceptions, - handledState, - Breadcrumbs.Retrieve(), - SessionTracking.CurrentSession, - Configuration.ApiKey, - featureFlags, - correlation); - - //Check for adding project packages to an android java error event - if (ShouldAddProjectPackagesToEvent(@event)) - { - @event.AddAndroidProjectPackagesToEvent(Configuration.ProjectPackages); - } - - lock (CallbackLock) - { - foreach (var onErrorCallback in Configuration.GetOnErrorCallbacks()) - { - try - { - if (!onErrorCallback.Invoke(@event)) - { - return; - } - } - catch - { - // If the callback causes an exception, ignore it and execute the next one - } - } - } - - try - { - if (callback != null) - { - if (!callback.Invoke(@event)) - { - return; - } - } - } - catch - { - // If the callback causes an exception, ignore it and execute the next one - } - - var report = new Report(Configuration, @event); - if (!report.Ignored) - { - //if serialisation fails, then we ignore the event - if (PayloadManager.AddPendingPayload(report)) - { - Send(report); - if (Configuration.IsBreadcrumbTypeEnabled(BreadcrumbType.Error)) - { - Breadcrumbs.Leave(Breadcrumb.FromReport(report)); - } - SessionTracking.AddException(report); - } - } - } - - - private bool ShouldAddProjectPackagesToEvent(Payload.Event theEvent) - { - return Application.platform.Equals(RuntimePlatform.Android) - && Configuration.ProjectPackages != null - && Configuration.ProjectPackages.Length > 0 - && theEvent.IsAndroidJavaError(); - } - - private bool EventContainsDiscardedClass(Error[] exceptions) - { - foreach (var exception in exceptions) - { - if (Configuration.ErrorClassIsDiscarded(exception.ErrorClass)) - { - return true; - } - } - return false; - } - - public void SetApplicationState(bool inFocus) - { - if (inFocus) - { - _foregroundStopwatch.Start(); - lock (autoSessionLock) - { - if (Configuration.AutoTrackSessions - && _backgroundStopwatch.Elapsed.TotalSeconds > AutoCaptureSessionThresholdSeconds) - { - if (IsUsingFallback()) - { - SessionTracking.StartSession(); - } - else - { - // The android sdk is unable to listen to the unity activity lifecycle - if (Application.platform.Equals(RuntimePlatform.Android)) - { - SessionTracking.ResumeSession(); - } - } - } - _backgroundStopwatch.Reset(); - } - _delivery.StartDeliveringCachedPayloads(); - } - else - { - _foregroundStopwatch.Stop(); - _backgroundStopwatch.Start(); - } - } - - /// - /// True if reports and sessions should be sent based on release stage settings - /// - private bool ShouldSendRequests() - { - return Configuration.ReleaseStage == null - || Configuration.EnabledReleaseStages == null - || Configuration.EnabledReleaseStages.Contains(Configuration.ReleaseStage); - } - - public void SetContext(string context) - { - // set the context property on Configuration, as it currently holds the global state - Configuration.Context = context; - - // propagate the change to the native property also - NativeClient.SetContext(context); - } - - public string GetContext() - { - return Configuration.Context; - } - - public void MarkLaunchCompleted() => NativeClient.MarkLaunchCompleted(); - - public void AddOnError(Func bugsnagCallback) => Configuration.AddOnError(bugsnagCallback); - - public void RemoveOnError(Func bugsnagCallback) => Configuration.RemoveOnError(bugsnagCallback); - - public void AddOnSession(Func callback) - { - Configuration.AddOnSession(callback); - NativeClient.RegisterForOnSessionCallbacks(); - } - - public void RemoveOnSession(Func callback) => Configuration.RemoveOnSession(callback); - - public void AddMetadata(string section, string key, object value) => _storedMetadata.AddMetadata(section, key, value); - - public void AddMetadata(string section, IDictionary metadata) => _storedMetadata.AddMetadata(section, metadata); - - public void ClearMetadata(string section) => _storedMetadata.ClearMetadata(section); - - public void ClearMetadata(string section, string key) => _storedMetadata.ClearMetadata(section, key); - - public IDictionary GetMetadata(string section) => _storedMetadata.GetMetadata(section); - - public object GetMetadata(string section, string key) => _storedMetadata.GetMetadata(section, key); - - public User GetUser() - { - return _cachedUser; - } - - public void SetUser(string id, string email, string name) - { - _cachedUser = new User(id, email, name); - NativeClient.SetUser(_cachedUser); - } - - public void AddFeatureFlag(string name, string variant = null) - { - NativeClient.AddFeatureFlag(name, variant); - _featureFlags[name] = variant; - } - - public void AddFeatureFlags(FeatureFlag[] featureFlags) - { - foreach (var flag in featureFlags) - { - AddFeatureFlag(flag.Name, flag.Variant); - } - } - - public void ClearFeatureFlag(string name) - { - _featureFlags.Remove(name); - NativeClient.ClearFeatureFlag(name); - } - - public void ClearFeatureFlags() - { - _featureFlags.Clear(); - NativeClient.ClearFeatureFlags(); - } - - private void SetupNetworkListeners() - { - // Currently network breadcrumb are the only feature using the web events. - // If we add more features that use web request events, we will need to move this check - if (!Configuration.IsBreadcrumbTypeEnabled(BreadcrumbType.Request)) - { - return; - } - BugsnagUnityWebRequest.OnSend.AddListener(OnWebRequestSend); - BugsnagUnityWebRequest.OnComplete.AddListener(OnWebRequestComplete); - BugsnagUnityWebRequest.OnAbort.AddListener(OnWebRequestAbort); - } - - private readonly Dictionary _requestStartTimes = new Dictionary(); - - - private void OnWebRequestComplete(BugsnagUnityWebRequest request) - { - if (_requestStartTimes.TryGetValue(request, out DateTimeOffset startTime)) - { - TimeSpan duration = DateTimeOffset.UtcNow - startTime; - LeaveNetworkBreadcrumb(request.UnityWebRequest, duration); - _requestStartTimes.Remove(request); - } - else - { - LeaveNetworkBreadcrumb(request.UnityWebRequest, null); - } - } - - private void OnWebRequestSend(BugsnagUnityWebRequest request) - { - _requestStartTimes[request] = DateTimeOffset.UtcNow; - } - - private void OnWebRequestAbort(BugsnagUnityWebRequest request) - { - if (_requestStartTimes.ContainsKey(request)) - { - _requestStartTimes.Remove(request); - } - } - - public void LeaveNetworkBreadcrumb(UnityWebRequest request, TimeSpan? duration) - { - string statusMessage = request.result == UnityWebRequest.Result.Success ? "succeeded" : "failed"; - string fullMessage = $"UnityWebRequest {statusMessage}"; - var metadata = new Dictionary(); - metadata["status"] = request.responseCode; - metadata["method"] = request.method; - metadata["url"] = request.url; - var urlParams = ExtractUrlParams(request.uri); - if (urlParams.Count > 0) - { - metadata["urlParams"] = urlParams; - } - metadata["duration"] = duration?.TotalMilliseconds; - if (request.uploadHandler != null && request.uploadHandler.data != null) - { - metadata["requestContentLength"] = request.uploadHandler.data.Length; - } - if (request.downloadHandler != null && request.downloadHandler.data != null) - { - metadata["responseContentLength"] = request.downloadHandler.data.Length; - } - Breadcrumbs.Leave(fullMessage, metadata, BreadcrumbType.Request); - } - - private Dictionary ExtractUrlParams(Uri uri) - { - var queryParams = new Dictionary(); - var querySegments = uri.Query.TrimStart('?').Split('&'); - - foreach (var segment in querySegments) - { - var parts = segment.Split('='); - if (parts.Length == 2) - { - if (Configuration.KeyIsRedacted(parts[0])) - { - queryParams[parts[0]] = "[REDACTED]"; - } - else - { - queryParams[parts[0]] = parts[1]; - } - } - } - - return queryParams; - } - - - } -} diff --git a/src/BugsnagUnity/Configuration.cs b/src/BugsnagUnity/Configuration.cs deleted file mode 100644 index 7fb87127a..000000000 --- a/src/BugsnagUnity/Configuration.cs +++ /dev/null @@ -1,385 +0,0 @@ -using System; -using System.Reflection; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Linq; -using BugsnagUnity.Payload; -using UnityEngine; -using System.Text.RegularExpressions; - -namespace BugsnagUnity -{ - - public enum SwitchCacheType - { - None, - R, - I - } - - public class Configuration : IMetadataEditor, IFeatureFlagStore - { - - // Nintendo switch specifics ---------- - public SwitchCacheType SwitchCacheType = SwitchCacheType.R; - - public string SwitchCacheMountName = "BugsnagCache"; - - public int SwitchCacheIndex = 0; - - public int SwitchCacheMaxSize = 10485760; //10MiB in Bytes - // ---------- - - public string AppType; - - public string BundleVersion; - - - - public int VersionCode = -1; - - public long LaunchDurationMillis = 5000; - - public ThreadSendPolicy SendThreads = ThreadSendPolicy.UnhandledOnly; - - public bool SendLaunchCrashesSynchronously = true; - - public bool GenerateAnonymousId = true; - - public bool PersistUser = true; - - public string HostName; - - private User _user = null; - - internal Metadata Metadata = new Metadata(); - - internal OrderedDictionary FeatureFlags = new OrderedDictionary(); - - - public List RedactedKeys = new List{new Regex(".*password.*",RegexOptions.IgnoreCase)}; - public bool KeyIsRedacted(string key) - { - if (RedactedKeys == null) - { - return false; - } - foreach (var regex in RedactedKeys) - { - if (regex.IsMatch(key)) - { - return true; - } - } - return false; - } - - public List DiscardClasses = new List(); - - internal bool ErrorClassIsDiscarded(string className) - { - if (DiscardClasses == null) - { - return false; - } - foreach (var regex in DiscardClasses) - { - if (regex.IsMatch(className)) - { - return true; - } - } - return false; - } - - public Configuration(string apiKey) - { - ApiKey = apiKey; - } - - public string PersistenceDirectory; - - public bool ReportExceptionLogsAsHandled = true; - - public TimeSpan MaximumLogsTimePeriod = TimeSpan.FromSeconds(1); - - public Dictionary MaximumTypePerTimePeriod = new Dictionary - { - { LogType.Assert, 5 }, - { LogType.Error, 5 }, - { LogType.Exception, 20 }, - { LogType.Log, 5 }, - { LogType.Warning, 5 }, - }; - - public TimeSpan SecondsPerUniqueLog = TimeSpan.FromSeconds(5); - - public LogType BreadcrumbLogLevel = LogType.Log; - - public bool ShouldLeaveLogBreadcrumb(LogType logType) - { - return IsBreadcrumbTypeEnabled(BreadcrumbType.Log) - && logType.IsGreaterThanOrEqualTo(BreadcrumbLogLevel); - } - - public BreadcrumbType[] EnabledBreadcrumbTypes { get; set; } - - public bool IsBreadcrumbTypeEnabled(BreadcrumbType breadcrumbType) - { - return EnabledBreadcrumbTypes == null || - EnabledBreadcrumbTypes.Contains(breadcrumbType); - } - - public string ApiKey { get; set; } - - private int _maximumBreadcrumbs = 100; - - public int MaximumBreadcrumbs - { - get { return _maximumBreadcrumbs; } - set - { - if (value < 0 || value > 500) - { - if (IsRunningInEditor()) - { - Debug.LogError("Invalid configuration value detected. Option maxBreadcrumbs should be an integer between 0-500. Supplied value is " + value); - } - return; - } - else - { - _maximumBreadcrumbs = value; - } - } - } - - public int MaxReportedThreads = 200; - - public string ReleaseStage = "production"; - - public string[] EnabledReleaseStages; - - public string[] ProjectPackages; - - public string AppVersion = Application.version; - - public EndpointConfiguration Endpoints = new EndpointConfiguration(); - - internal string PayloadVersion { get; } = "4.0"; - - internal string SessionPayloadVersion { get; } = "1.0"; - - public string Context; - - public LogType NotifyLogLevel = LogType.Exception; - - public bool AutoDetectErrors = true; - - public bool AutoTrackSessions = true; - - public LogTypeSeverityMapping LogTypeSeverityMapping { get; } = new LogTypeSeverityMapping(); - - public string ScriptingBackend; - - public string DotnetScriptingRuntime; - - public string DotnetApiCompatibility; - - public EnabledErrorTypes EnabledErrorTypes = new EnabledErrorTypes(); - - private ulong _appHangThresholdMillis = 0; - - public ulong AppHangThresholdMillis - { - get { return _appHangThresholdMillis; } - set - { - if (value < 250) - { - if (IsRunningInEditor()) - { - Debug.LogError("Invalid configuration value detected. Option AppHangThresholdMillis should be a ulong higher than 249. Supplied value is " + value); - } - return; - } - else - { - _appHangThresholdMillis = value; - } - } - } - - public int MaxPersistedEvents = 32; - - public int MaxPersistedSessions = 128; - - public int MaxStringValueLength = 10000; - - private bool IsRunningInEditor() - { - return Application.platform == RuntimePlatform.OSXEditor - || Application.platform == RuntimePlatform.WindowsEditor - || Application.platform == RuntimePlatform.LinuxEditor; - } - - // Thread-safe collections with locks - private readonly object _onErrorLock = new object(); - private List> _onErrorCallbacks = new List>(); - - private readonly object _onSendErrorLock = new object(); - private List> _onSendErrorCallbacks = new List>(); - - private readonly object _onSessionLock = new object(); - private List> _onSessionCallbacks = new List>(); - - public void AddOnError(Func callback) - { - lock (_onErrorLock) - { - _onErrorCallbacks.Add(callback); - } - } - - internal List> GetOnErrorCallbacks() - { - lock (_onErrorLock) - { - return _onErrorCallbacks.ToList(); - } - } - - public void RemoveOnError(Func callback) - { - lock (_onErrorLock) - { - _onErrorCallbacks.Remove(callback); - } - } - - public void AddOnSendError(Func callback) - { - lock (_onSendErrorLock) - { - _onSendErrorCallbacks.Add(callback); - } - } - - internal List> GetOnSendErrorCallbacks() - { - lock (_onSendErrorLock) - { - return _onSendErrorCallbacks.ToList(); - } - } - - public void RemoveOnSendError(Func callback) - { - lock (_onSendErrorLock) - { - _onSendErrorCallbacks.Remove(callback); - } - } - - public void AddOnSession(Func callback) - { - lock (_onSessionLock) - { - _onSessionCallbacks.Add(callback); - } - } - - public void RemoveOnSession(Func callback) - { - lock (_onSessionLock) - { - _onSessionCallbacks.Remove(callback); - } - } - - internal List> GetOnSessionCallbacks() - { - lock (_onSessionLock) - { - return _onSessionCallbacks.ToList(); - } - } - - public List Telemetry = new List { TelemetryType.InternalErrors, TelemetryType.Usage }; - - public void AddMetadata(string section, string key, object value) => Metadata.AddMetadata(section, key, value); - - public void AddMetadata(string section, IDictionary metadata) => Metadata.AddMetadata(section, metadata); - - public void ClearMetadata(string section) => Metadata.ClearMetadata(section); - - public void ClearMetadata(string section, string key) => Metadata.ClearMetadata(section, key); - - public IDictionary GetMetadata(string section) => Metadata.GetMetadata(section); - - public object GetMetadata(string section, string key) => Metadata.GetMetadata(section, key); - - public User GetUser() => _user; - - public void SetUser(string id, string email, string name) - { - _user = new User(id, email, name); - } - - internal Configuration Clone() - { - var clone = (Configuration)MemberwiseClone(); - if (_user != null) - { - clone._user = _user.Clone(); - } - if (Endpoints.IsValid) - { - clone.Endpoints = Endpoints.Clone(); - } - return clone; - } - - public void AddFeatureFlag(string name, string variant = null) - { - FeatureFlags[name] = variant; - } - - public void AddFeatureFlags(FeatureFlag[] featureFlags) - { - foreach (var flag in featureFlags) - { - AddFeatureFlag(flag.Name,flag.Variant); - } - } - - public void ClearFeatureFlag(string name) - { - FeatureFlags.Remove(name); - } - - public void ClearFeatureFlags() - { - FeatureFlags.Clear(); - } - - public static AssemblyName GetAssemblyName() { - return typeof(Configuration).Assembly.GetName(); - } - } - - [Serializable] - public class EnabledErrorTypes - { - public bool ANRs = true; - public bool AppHangs = true; - public bool OOMs = true; - public bool Crashes = true; - public bool ThermalKills = true; - public bool UnityLog = true; - - public EnabledErrorTypes() - { } - } -} - diff --git a/src/BugsnagUnity/Delivery.cs b/src/BugsnagUnity/Delivery.cs deleted file mode 100644 index 55b8601fd..000000000 --- a/src/BugsnagUnity/Delivery.cs +++ /dev/null @@ -1,622 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading; -using BugsnagUnity.Payload; -using UnityEngine; -using UnityEngine.Networking; -using System.Security.Cryptography; - -namespace BugsnagUnity -{ - class Delivery - { - - private Client _client; - - private Configuration _configuration; - - private CacheManager _cacheManager; - - private PayloadManager _payloadManager; - - private object _callbackLock { get; } = new object(); - - private static List _finishedCacheDeliveries = new List(); - - private bool _cacheDeliveryInProcess; - - private const int MAX_PAYLOAD_BYTES = 1000000; - - private const string STRING_TRUNCATION_MESSAGE = "***{0} CHARS TRUNCATED***"; - - private const string BREADCRUMB_TRUNCATION_MESSAGE = "Removed, along with {0} older breadcrumbs, to reduce payload size"; - - private const string EVENT_KEY_EVENT = "event"; - - private const string EVENT_KEY_BREADCRUMBS = "breadcrumbs"; - - private const string EVENT_KEY_METADATA = "metaData"; - - private const string EVENT_KEY_BREADCRUMB_TYPE = "type"; - - private const string EVENT_KEY_BREADCRUMB_MESSAGE = "name"; - - private const string EVENT_KEY_BREADCRUMB_METADATA = "metaData"; - - private const string EVENT_KEY_BREADCRUMB_TIMESTAMP = "timestamp"; - - - internal Delivery(Client client, Configuration configuration, CacheManager cacheManager, PayloadManager payloadManager) - { - _client = client; - _configuration = configuration; - _cacheManager = cacheManager; - _payloadManager = payloadManager; - } - - // Run any on send error callbacks if it's an event, serialise the payload and add it to the sending queue - public void Deliver(IPayload payload) - { - if (payload.PayloadType == PayloadType.Event) - { - var report = (Report)payload; - if (_configuration.GetOnSendErrorCallbacks().Count > 0) - { - lock (_callbackLock) - { - foreach (var onSendErrorCallback in _configuration.GetOnSendErrorCallbacks()) - { - try - { - if (!onSendErrorCallback.Invoke(report.Event)) - { - return; - } - } - catch - { - // If the callback causes an exception, ignore it and execute the next one - } - } - } - } - report.Event.RedactMetadata(_configuration); - //pipeline expects and array of events even though we only ever report 1 - report.ApplyEventsArray(); - } - try - { - MainThreadDispatchBehaviour.Instance().Enqueue(PushToServer(payload)); - } - catch - { - // not avaliable in unit tests - } - } - - // Push to the server and handle the result - IEnumerator PushToServer(IPayload payload) - { - var shouldDeliver = false; - if (Application.platform == RuntimePlatform.WebGLPlayer) - { - shouldDeliver = _client.NativeClient.ShouldAttemptDelivery(); - } - else - { - var networkCheckDone = false; - new Thread(() => { - shouldDeliver = _client.NativeClient.ShouldAttemptDelivery(); - networkCheckDone = true; - }).Start(); - - while (!networkCheckDone) - { - yield return null; - } - } - if (!shouldDeliver) - { - _payloadManager.SendPayloadFailed(payload); - _finishedCacheDeliveries.Add(payload.Id); - yield break; - } - - byte[] body = null; - // It's not possible to yield from a try catch block, so we use this flag bool instead - var errorDuringSerialisation = false; - if (payload.PayloadType == PayloadType.Session) - { - try - { - body = SerializeObject(payload); - } - catch - { - errorDuringSerialisation = true; - } - } - else - { - // There is no threading on webgl, so we treat the payload differently - if (Application.platform == RuntimePlatform.WebGLPlayer) - { - try - { - body = PrepareEventBodySimple(payload); - } - catch - { - errorDuringSerialisation = true; - } - } - else - { - var bodyReady = false; - new Thread(() => { - try - { - body = PrepareEventBody(payload); - } - catch - { - errorDuringSerialisation = true; - } - bodyReady = true; - }).Start(); - - while (!bodyReady) - { - yield return null; - } - } - } - - if (errorDuringSerialisation) - { - _payloadManager.RemovePayload(payload); - _finishedCacheDeliveries.Add(payload.Id); - yield break; - } - - using (var req = new UnityWebRequest(payload.Endpoint.ToString())) - { - req.SetRequestHeader("Content-Type", "application/json"); - req.SetRequestHeader("Bugsnag-Sent-At", DateTimeOffset.Now.ToString("o", CultureInfo.InvariantCulture)); - req.SetRequestHeader("Bugsnag-Integrity", "sha1 " + Hash(body)); - - foreach (var header in payload.Headers) - { - req.SetRequestHeader(header.Key, header.Value); - } - req.uploadHandler = new UploadHandlerRaw(body); - req.downloadHandler = new DownloadHandlerBuffer(); - req.method = UnityWebRequest.kHttpVerbPOST; - yield return req.SendWebRequest(); - - while (!req.isDone) - { - yield return new WaitForEndOfFrame(); - } - var code = req.responseCode; - if (code == 200 || code == 202) - { - // success! - _payloadManager.RemovePayload(payload); - StartDeliveringCachedPayloads(); - } - else if ( code == 0 || code == 408 || code == 429 || code >= 500) - { - // sending failed with no network or retryable error, cache payload to disk - _payloadManager.SendPayloadFailed(payload); - } - else - { - // sending failed with an unacceptable status code, remove payload from cache and pending payloads - _payloadManager.RemovePayload(payload); - } - _finishedCacheDeliveries.Add(payload.Id); - } - } - - private Dictionary GetEventFromPayload(Dictionary payloadAsDictionary) - { - return payloadAsDictionary[EVENT_KEY_EVENT] as Dictionary; - } - - private byte[] PrepareEventBody(IPayload payload) - { - var serialisedPayload = SerializeObject(payload); - // If payload is oversized, trim string values in all metadata - if (serialisedPayload.Length > MAX_PAYLOAD_BYTES) - { - var @event = GetEventFromPayload(payload.GetSerialisablePayload()); - if (TruncateMetadata(@event)) - { - serialisedPayload = SerializeObject(payload); - } - - //If still oversized, truncate the breadcrumbs - if (serialisedPayload.Length > MAX_PAYLOAD_BYTES) - { - if (TruncateBreadcrumbs(@event, serialisedPayload.Length - MAX_PAYLOAD_BYTES)) - { - serialisedPayload = SerializeObject(payload); - } - } - } - - return serialisedPayload; - } - - private byte[] PrepareEventBodySimple(IPayload payload) - { - var serialisedPayload = SerializeObject(payload); - - // If payload is oversized, remove all breadcrumbs - if (serialisedPayload.Length > MAX_PAYLOAD_BYTES) - { - var @event = payload.GetSerialisablePayload(); - - if (RemoveAllBreadcrumbs(@event)) - { - serialisedPayload = SerializeObject(payload); - } - - //If still oversized, clear out all metadata - if (serialisedPayload.Length > MAX_PAYLOAD_BYTES) - { - if (RemoveUserMetadata(@event)) - { - serialisedPayload = SerializeObject(payload); - } - } - } - - return serialisedPayload; - } - - private string Hash(byte[] input) - { - using (SHA1Managed sha1 = new SHA1Managed()) - { - var hash = sha1.ComputeHash(input); - var sb = new StringBuilder(hash.Length * 2); - foreach (byte b in hash) - { - sb.Append(b.ToString("x2")); - } - return sb.ToString(); - } - } - - private bool TruncateBreadcrumbs(Dictionary @event, int bytesToRemove) - { - var breadcrumbsList = (@event[EVENT_KEY_BREADCRUMBS] as Dictionary[]).ToList(); - - if (breadcrumbsList.Count == 0) - { - return false; - } - - var numBreadcrumbsRemoved = 0; - var numBytesTruncated = 0; - var lastRemovedCrumbType = string.Empty; - - for (int i = breadcrumbsList.Count - 1; i >= 0; i--) - { - numBytesTruncated += SerializeObject(breadcrumbsList[i]).Length; - lastRemovedCrumbType = breadcrumbsList[i][EVENT_KEY_BREADCRUMB_TYPE] as string; - breadcrumbsList.RemoveAt(i); - numBreadcrumbsRemoved++; - if (numBytesTruncated >= bytesToRemove) - { - break; - } - } - - if (numBreadcrumbsRemoved > 0) - { - var truncationBreadcrumb = new Dictionary - { - { EVENT_KEY_BREADCRUMB_TYPE, lastRemovedCrumbType }, - { EVENT_KEY_BREADCRUMB_MESSAGE, string.Format(BREADCRUMB_TRUNCATION_MESSAGE, numBreadcrumbsRemoved) } - }; - breadcrumbsList.Add(truncationBreadcrumb); - @event[EVENT_KEY_BREADCRUMBS] = breadcrumbsList.ToArray(); - return true; - } - else - { - return false; - } - } - - private bool RemoveAllBreadcrumbs(Dictionary @event) - { - var numExistingCrumbs = (@event[EVENT_KEY_BREADCRUMBS] as Dictionary[]).Length; - - if (numExistingCrumbs == 0) - { - return false; - } - - var truncationBreadcrumb = new Dictionary - { - { EVENT_KEY_BREADCRUMB_TIMESTAMP, DateTime.UtcNow.ToString() }, - { EVENT_KEY_BREADCRUMB_TYPE, "state" }, - { EVENT_KEY_BREADCRUMB_MESSAGE, string.Format(BREADCRUMB_TRUNCATION_MESSAGE, numExistingCrumbs) } - }; - - @event[EVENT_KEY_BREADCRUMBS] = new[] { truncationBreadcrumb }; - - return true; - } - - private bool TruncateMetadata(Dictionary @event) - { - var dataTruncated = false; - var metadata = @event[EVENT_KEY_METADATA] as Dictionary; - foreach (var section in metadata) - { - if (TruncateStringsInDictionary(section.Value as Dictionary)) - { - dataTruncated = true; - } - } - - var breadcrumbs = @event[EVENT_KEY_BREADCRUMBS] as Dictionary[]; - foreach (var crumb in breadcrumbs) - { - var crumbMetadata = crumb[EVENT_KEY_BREADCRUMB_METADATA] as Dictionary; - if (TruncateStringsInDictionary(crumbMetadata)) - { - dataTruncated = true; - } - } - return dataTruncated; - } - - private bool RemoveUserMetadata(Dictionary @event) - { - var dataRemoved = false; - var metadata = @event[EVENT_KEY_METADATA] as Dictionary; - foreach (var key in metadata.Keys.ToList()) - { - if (key != "app" && key != "device") - { - dataRemoved = true; - metadata.Remove(key); - } - } - return dataRemoved; - } - - private bool TruncateStringsInDictionary(Dictionary section) - { - var stringTruncated = false; - foreach (var key in section.Keys.ToList()) - { - var valueType = section[key].GetType(); - if (valueType == typeof(string)) - { - var originalValue = section[key] as string; - if (ShouldTruncateString(originalValue)) - { - section[key] = TruncateString(originalValue); - stringTruncated = true; - } - } - else if (valueType == typeof(string[])) - { - var stringArray = section[key] as string[]; - for (int i = 0; i < stringArray.Length; i++) - { - if (ShouldTruncateString(stringArray[i])) - { - stringArray[i] = TruncateString(stringArray[i]); - stringTruncated = true; - } - } - } - else if (valueType == typeof(List)) - { - var stringList = section[key] as List; - for (int i = 0; i < stringList.Count; i++) - { - if (ShouldTruncateString(stringList[i])) - { - stringList[i] = TruncateString(stringList[i]); - stringTruncated = true; - } - } - } - else if (valueType == typeof(Dictionary)) - { - var stringDict = section[key] as Dictionary; - foreach (var stringKey in stringDict.Keys.ToList()) - { - if (ShouldTruncateString(stringDict[stringKey])) - { - stringTruncated = true; - stringDict[stringKey] = TruncateString(stringDict[stringKey]); - } - } - } - else if (valueType == typeof(Dictionary)) - { - TruncateStringsInDictionary(section[key] as Dictionary); - } - else if (valueType == typeof(JsonArray)) - { - var jsonArray = ((JsonArray)section[key]); - for (int i = 0; i < jsonArray.Count; i++) - { - if (jsonArray[i].GetType() == typeof(string)) - { - var originalValue = jsonArray[i] as string; - if (ShouldTruncateString(originalValue)) - { - jsonArray[i] = TruncateString(originalValue); - stringTruncated = true; - } - } - } - } - } - return stringTruncated; - } - - private bool ShouldTruncateString(string stringValue) - { - return stringValue.Length > _configuration.MaxStringValueLength; - } - - private string TruncateString(string originalValue) - { - var numStringsToTruncate = originalValue.Length - _configuration.MaxStringValueLength; - var truncationMessage = GetTruncationMessage(numStringsToTruncate); - if (numStringsToTruncate >= truncationMessage.Length) - { - return TruncateString(originalValue, truncationMessage); - } - return originalValue; - } - - private string TruncateString(string stringToTruncate, string truncationMessage) - { - return stringToTruncate.Substring(0, _configuration.MaxStringValueLength) + truncationMessage; - } - - private string GetTruncationMessage(int numCharactersToRemove) - { - return string.Format(STRING_TRUNCATION_MESSAGE, numCharactersToRemove); - } - - public void StartDeliveringCachedPayloads() - { - if (_cacheDeliveryInProcess) - { - return; - } - _cacheDeliveryInProcess = true; - try - { - _finishedCacheDeliveries.Clear(); - MainThreadDispatchBehaviour.Instance().Enqueue(DeliverCachedPayloads()); - } - catch - { - // Not possible in unit tests - } - } - - private IEnumerator DeliverCachedPayloads() - { - yield return ProcessCachedItems(typeof(SessionReport)); - yield return ProcessCachedItems(typeof(Report)); - _cacheDeliveryInProcess = false; - } - - private IEnumerator ProcessCachedItems(Type t) - { - bool isSession = t.Equals(typeof(SessionReport)); - var cachedPayloads = isSession ? _cacheManager.GetCachedSessionIds() : _cacheManager.GetCachedEventIds(); - if (cachedPayloads != null) - { - foreach (var id in cachedPayloads) - { - var payloadJson = isSession ? _cacheManager.GetCachedSession(id) : _cacheManager.GetCachedEvent(id); - if (string.IsNullOrEmpty(payloadJson)) - { - continue; - } - - Dictionary payloadDictionary = null; - - try - { - // if something goes wrong at this stage then we silently discard the file as it's most likely that the file wasn't fully serialised to disk - payloadDictionary = ((JsonObject)SimpleJson.DeserializeObject(payloadJson)).GetDictionary(); - } - catch - { - if (isSession) - { - _cacheManager.RemoveCachedSession(id); - } - else - { - _cacheManager.RemoveCachedEvent(id); - } - continue; - } - - if (isSession) - { - SessionReport sessionReport = null; - try - { - sessionReport = new SessionReport(_configuration, payloadDictionary); - } - catch - { - // this will be internally reported in a future update - _cacheManager.RemoveCachedSession(id); - continue; - } - Deliver(sessionReport); - } - else - { - Report report = null; - try - { - report = new Report(_configuration, payloadDictionary); - } - catch - { - // this will be internally reported in a future update - _cacheManager.RemoveCachedEvent(id); - continue; - } - Deliver(report); - } - - yield return new WaitUntil(() => CachedPayloadProcessed(id)); - } - } - } - - private bool CachedPayloadProcessed(string id) - { - foreach (var processedCachedPayloadIds in _finishedCacheDeliveries) - { - if (id == processedCachedPayloadIds) - { - return true; - } - } - return false; - } - - private byte[] SerializeObject(object @object) - { - using (var stream = new MemoryStream()) - using (var reader = new StreamReader(stream)) - using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) - { - SimpleJson.SerializeObject(@object, writer); - writer.Flush(); - stream.Position = 0; - return Encoding.UTF8.GetBytes(reader.ReadToEnd()); - } - } - - } -} diff --git a/src/BugsnagUnity/EndpointConfiguration.cs b/src/BugsnagUnity/EndpointConfiguration.cs deleted file mode 100644 index 3ddad0e6f..000000000 --- a/src/BugsnagUnity/EndpointConfiguration.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -namespace BugsnagUnity -{ - public class EndpointConfiguration - { - - private const string DefaultNotifyEndpoint = "https://notify.bugsnag.com"; - - private const string DefaultSessionEndpoint = "https://sessions.bugsnag.com"; - - internal Uri Notify; - - internal Uri Session; - - internal bool NotifyIsCustom => Notify != null && Notify.ToString() != new Uri( DefaultNotifyEndpoint ).ToString(); - - internal bool SessionIsCustom => Session != null && Session.ToString() != new Uri ( DefaultSessionEndpoint ).ToString(); - - internal bool IsValid - { - get - { - return Notify != null && Session != null && (NotifyIsCustom && SessionIsCustom || !NotifyIsCustom && !SessionIsCustom); - } - } - - internal EndpointConfiguration() - { - Notify = new Uri(DefaultNotifyEndpoint); - Session = new Uri(DefaultSessionEndpoint); - } - - public EndpointConfiguration(string notifyEndpoint, string sessionEndpoint) - { - try - { - Notify = new Uri(notifyEndpoint); - } - catch (Exception e) - { - UnityEngine.Debug.LogWarning( string.Format("Invalid configuration. Endpoints.Notify should be a valid URI. Error message: {0}. Events will not be sent to Bugsnag. " , e.Message)); - } - try - { - Session = new Uri(sessionEndpoint); - } - catch (Exception e) - { - UnityEngine.Debug.LogWarning(string.Format("Invalid configuration. Endpoints.Session should be a valid URI. Error message: {0}. Sessions will not be sent to Bugsnag. ", e.Message)); - - } - } - - internal EndpointConfiguration Clone() - { - return (EndpointConfiguration)MemberwiseClone(); - } - - } -} diff --git a/src/BugsnagUnity/IBreadcrumbs.cs b/src/BugsnagUnity/IBreadcrumbs.cs deleted file mode 100644 index 88a184789..000000000 --- a/src/BugsnagUnity/IBreadcrumbs.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public interface IBreadcrumbs - { - void Leave(string message, Dictionary metadata, BreadcrumbType type); - - void Leave(Breadcrumb breadcrumb); - - List Retrieve(); - } -} diff --git a/src/BugsnagUnity/ICacheManager.cs b/src/BugsnagUnity/ICacheManager.cs deleted file mode 100644 index 6ac0a87b5..000000000 --- a/src/BugsnagUnity/ICacheManager.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public interface ICacheManager - { - string GetCachedDeviceId(); - void SaveDeviceIdToCache(string id); - void SaveSessionToCache(string id, string json); - void SaveEventToCache(string id, string json); - void RemoveCachedEvent(string id); - void RemoveCachedSession(string id); - List GetCachedEventIds(); - List GetCachedSessionIds(); - string GetCachedEvent(string id); - string GetCachedSession(string id); - - } -} diff --git a/src/BugsnagUnity/IClient.cs b/src/BugsnagUnity/IClient.cs deleted file mode 100644 index 1c8522c5d..000000000 --- a/src/BugsnagUnity/IClient.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Collections.Generic; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - - internal interface IClient : IMetadataEditor, IFeatureFlagStore - { - Configuration Configuration { get; } - - IBreadcrumbs Breadcrumbs { get; } - - ISessionTracker SessionTracking { get; } - - LastRunInfo LastRunInfo { get; } - - void Send(IPayload payload); - - void Notify(System.Exception exception, Func callback); - - void Notify(System.Exception exception, Severity severity, Func callback); - - void Notify(System.Exception exception, string stacktrace, Func callback); - - void Notify(string name, string message, string stackTrace, Func callback); - - /// - /// Used to signal to the Bugsnag client that the focused state of the - /// application has changed. This is used for session tracking and also - /// the tracking of in foreground time for the application. - /// - /// - void SetApplicationState(bool inFocus); - - string GetContext(); - - void SetContext(string context); - - bool IsUsingFallback(); - - void MarkLaunchCompleted(); - - void AddOnError(Func callback); - - void RemoveOnError(Func callback); - - void AddOnSession(Func callback); - - void RemoveOnSession(Func callback); - - User GetUser(); - - void SetUser(string id,string email,string name); - - } -} diff --git a/src/BugsnagUnity/IFeatureFlagStore.cs b/src/BugsnagUnity/IFeatureFlagStore.cs deleted file mode 100644 index ba97edd27..000000000 --- a/src/BugsnagUnity/IFeatureFlagStore.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public interface IFeatureFlagStore - { - void AddFeatureFlag(string name, string variant = null); - void AddFeatureFlags(FeatureFlag[] featureFlags); - void ClearFeatureFlag(string name); - void ClearFeatureFlags(); - } -} diff --git a/src/BugsnagUnity/IFilterable.cs b/src/BugsnagUnity/IFilterable.cs deleted file mode 100644 index 5ee61baf6..000000000 --- a/src/BugsnagUnity/IFilterable.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Collections; - -namespace BugsnagUnity -{ - interface IFilterable : IDictionary - { - } -} diff --git a/src/BugsnagUnity/IMetadataEditor.cs b/src/BugsnagUnity/IMetadataEditor.cs deleted file mode 100644 index fbeed1dd0..000000000 --- a/src/BugsnagUnity/IMetadataEditor.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace BugsnagUnity -{ - public interface IMetadataEditor - { - void AddMetadata(string section, string key, object value); - - void AddMetadata(string section, IDictionary metadata); - - void ClearMetadata(string section); - - void ClearMetadata(string section, string key); - - IDictionary GetMetadata(string section); - - object GetMetadata(string section, string key); - } -} diff --git a/src/BugsnagUnity/INativeClient.cs b/src/BugsnagUnity/INativeClient.cs deleted file mode 100644 index c2f7a6f6d..000000000 --- a/src/BugsnagUnity/INativeClient.cs +++ /dev/null @@ -1,113 +0,0 @@ -using BugsnagUnity.Payload; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] - -namespace BugsnagUnity -{ - interface INativeClient : IFeatureFlagStore - { - /// - /// The native configuration - /// - Configuration Configuration { get; } - - /// - /// The native breadcrumbs - /// - IBreadcrumbs Breadcrumbs { get; } - - /// - /// Populates the native app information - /// - /// - void PopulateApp(App app); - - /// - /// Populates the native app information - /// - /// - void PopulateAppWithState(AppWithState app); - - /// - /// Populates the native device information - /// - /// - void PopulateDevice(Device device); - - /// - /// Populates the native device information - /// - /// - void PopulateDeviceWithState(DeviceWithState device); - - /// - /// Send the start session message to a native notifier - /// - void StartSession(); - - /// - /// Send the stop session message to a native notifier - /// - void PauseSession(); - - /// - /// Send the resume session message to a native notifier - /// - bool ResumeSession(); - - /// - /// Update the current native session - /// - void UpdateSession(Session session); - - /// - /// Get the current session info for sending with an error - /// - Session GetCurrentSession(); - - /// - /// Adds user data to native client reports - /// - void SetUser(User user); - - /// - /// Populates the native user information. - /// - /// - void PopulateUser(User user); - - /// - /// Mutates the context. - /// - /// - void SetContext(string context); - - /// - /// Setting Configuration.LaunchDurationMillis to 0 will cause Bugsnag to consider the app to be launching until Bugsnag.MarkLaunchCompleted() has been called. - /// - void MarkLaunchCompleted(); - - /// - /// Get the last run information from Android and cocoa platforms - /// - LastRunInfo GetLastRunInfo(); - - void ClearNativeMetadata(string section); - - void ClearNativeMetadata(string section, string key); - - void AddNativeMetadata(string section, IDictionary data); - - IDictionary GetNativeMetadata(); - - bool ShouldAttemptDelivery(); - - /// - /// Subscribes the Unity layer for session callbacks. Not many users use session callbacks, so we are only subscribing to the native side if necessary as an optimisation. - /// - void RegisterForOnSessionCallbacks(); - - } -} diff --git a/src/BugsnagUnity/IUserEditor.cs b/src/BugsnagUnity/IUserEditor.cs deleted file mode 100644 index 8eda5b500..000000000 --- a/src/BugsnagUnity/IUserEditor.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -namespace BugsnagUnity -{ - public interface IUserEditor - { - IUser GetUser(); - - void SetUser(string id, string email, string name); - } -} diff --git a/src/BugsnagUnity/LastRunInfo.cs b/src/BugsnagUnity/LastRunInfo.cs deleted file mode 100644 index c73a2e4ad..000000000 --- a/src/BugsnagUnity/LastRunInfo.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace BugsnagUnity -{ - public class LastRunInfo - { - - public int ConsecutiveLaunchCrashes; - - public bool Crashed; - - public bool CrashedDuringLaunch; - - } -} diff --git a/src/BugsnagUnity/LogTypeSeverityMapping.cs b/src/BugsnagUnity/LogTypeSeverityMapping.cs deleted file mode 100644 index 782dea66b..000000000 --- a/src/BugsnagUnity/LogTypeSeverityMapping.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace BugsnagUnity -{ - public class LogTypeSeverityMapping - { - Dictionary Mappings { get; } - - internal LogTypeSeverityMapping() - { - Mappings = new Dictionary { - { LogType.Assert, Severity.Warning }, - { LogType.Error, Severity.Warning }, - { LogType.Exception, Severity.Error }, - { LogType.Log, Severity.Info }, - { LogType.Warning, Severity.Warning }, - }; - } - - public void UpdateMapping(LogType logType, Severity severity) - { - Mappings[logType] = severity; - } - - public Severity Map(LogType logType) - { - if (Mappings.ContainsKey(logType)) - { - return Mappings[logType]; - } - - return Severity.Error; - } - } -} diff --git a/src/BugsnagUnity/MainThreadDispatchBehaviour.cs b/src/BugsnagUnity/MainThreadDispatchBehaviour.cs deleted file mode 100644 index 8366f333a..000000000 --- a/src/BugsnagUnity/MainThreadDispatchBehaviour.cs +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright 2015 Pim de Witte All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -using System; -using System.Collections.Generic; -using System.Collections; -using UnityEngine; - -/// Author: Pim de Witte (pimdewitte.com) and contributors -/// -/// A thread-safe class which holds a queue with actions to execute on the next Update() method. It can be used to make calls to the main thread for -/// things such as UI Manipulation in Unity. It was developed for use in combination with the Firebase Unity plugin, which uses separate threads for event handling -/// -namespace BugsnagUnity -{ - public class MainThreadDispatchBehaviour : MonoBehaviour - { - - private static MainThreadDispatchBehaviour _instance; - - private static readonly Queue _executionQueue = new Queue(); - - - public static MainThreadDispatchBehaviour Instance() - { - if (_instance == null) - { - _instance = new GameObject("Bugsnag main thread dispatcher").AddComponent(); - } - return _instance; - } - - public void Update() - { - lock (_executionQueue) - { - while (_executionQueue.Count > 0) - { - _executionQueue.Dequeue().Invoke(); - } - } - } - - /// - /// Locks the queue and adds the IEnumerator to the queue - /// - /// IEnumerator function that will be executed from the main thread. - public void Enqueue(IEnumerator action) - { - lock (_executionQueue) - { - _executionQueue.Enqueue(() => - { - StartCoroutine(action); - }); - } - } - - /// - /// Locks the queue and adds the Action to the queue - /// - /// function that will be executed from the main thread. - public void Enqueue(Action action) - { - Enqueue(ActionWrapper(action)); - } - IEnumerator ActionWrapper(Action a) - { - a(); - yield return null; - } - - public void EnqueueWithDelayCoroutine(Action action, float delay) - { - StartCoroutine(DelayAction(action, delay)); - } - - private IEnumerator DelayAction(Action action, float delay) - { - yield return new WaitForSeconds(delay); - action.Invoke(); - } - - private void Awake() - { - DontDestroyOnLoad(gameObject); - } - - } -} diff --git a/src/BugsnagUnity/MaximumLogTypeCounter.cs b/src/BugsnagUnity/MaximumLogTypeCounter.cs deleted file mode 100644 index 480795662..000000000 --- a/src/BugsnagUnity/MaximumLogTypeCounter.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using UnityEngine; -using System.Collections.Generic; - -namespace BugsnagUnity -{ - public class MaximumLogTypeCounter - { - private Configuration Configuration { get; } - - private Dictionary CurrentCounts { get; } - - private double FlushAt { get; set; } = -1; - - private double MaximumLogsTimePeriod => Configuration.MaximumLogsTimePeriod.TotalSeconds; - - private Dictionary MaximumTypePerTimePeriod => Configuration.MaximumTypePerTimePeriod; - - private readonly object _lock = new object(); - - private void EnsureFlushTimeIsSet() - { - if (FlushAt < 0) - { - FlushAt = Time.ElapsedSeconds + MaximumLogsTimePeriod; - } - } - - public MaximumLogTypeCounter(Configuration configuration) - { - Configuration = configuration; - CurrentCounts = new Dictionary(); - } - - public bool ShouldSend(UnityLogMessage unityLogMessage) - { - var type = unityLogMessage.Type; - - lock (_lock) - { - EnsureFlushTimeIsSet(); - - if (MaximumTypePerTimePeriod.ContainsKey(type)) - { - if (CurrentCounts.ContainsKey(type)) - { - CurrentCounts[type]++; - } - else - { - CurrentCounts[type] = 1; - } - - if (CurrentCounts[type] > MaximumTypePerTimePeriod[type]) - { - if (unityLogMessage.CreatedAt > FlushAt) - { - CurrentCounts.Clear(); - FlushAt = Time.ElapsedSeconds + MaximumLogsTimePeriod; - return true; - } - return false; - } - } - } - - return true; - } - } -} diff --git a/src/BugsnagUnity/Native/Android/Breadcrumbs.cs b/src/BugsnagUnity/Native/Android/Breadcrumbs.cs deleted file mode 100644 index 75a12a392..000000000 --- a/src/BugsnagUnity/Native/Android/Breadcrumbs.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; -using BugsnagUnity.Payload; -using System.Linq; - -namespace BugsnagUnity -{ - class Breadcrumbs : IBreadcrumbs - { - NativeInterface NativeInterface { get; } - - internal Breadcrumbs(NativeInterface nativeInterface) - { - NativeInterface = nativeInterface; - } - - /// - /// Add a breadcrumb to the collection with the specified type and metadata - /// - /// - /// - /// - public void Leave(string message, Dictionary metadata, BreadcrumbType type) - { - Leave(new Breadcrumb(message, metadata, type)); - } - - /// - /// Add a pre assembled breadcrumb to the collection. - /// - /// - public void Leave(Breadcrumb breadcrumb) - { - if (breadcrumb == null || string.IsNullOrEmpty(breadcrumb.Message)) - { - return; - } - // Clone the metadata to prevent thread related exceptions - var metadataClone = breadcrumb.Metadata.ToDictionary(entry => entry.Key, entry => entry.Value); - NativeInterface.LeaveBreadcrumb(breadcrumb.Message, breadcrumb.Type.ToString(), metadataClone); - } - - /// - /// Retrieve the collection of breadcrumbs at this point in time. - /// - /// - public List Retrieve() - { - return NativeInterface.GetBreadcrumbs(); - } - - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeApp.cs b/src/BugsnagUnity/Native/Android/NativeApp.cs deleted file mode 100644 index f2c762144..000000000 --- a/src/BugsnagUnity/Native/Android/NativeApp.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativeApp : NativePayloadClassWrapper, IApp - { - internal NativeApp(AndroidJavaObject nativePointer) : base (nativePointer){} - - public string BinaryArch { get => GetNativeString("getBinaryArch"); set => SetNativeString("setBinaryArch", value); } - public string BuildUuid { get => GetNativeString("getBuildUuid"); set => SetNativeString("setBuildUuid", value); } - public string CodeBundleId { get => GetNativeString("getCodeBundleId"); set => SetNativeString("setCodeBundleId", value); } - public string Id { get => GetNativeString("getId"); set => SetNativeString("setId", value); } - public string ReleaseStage { get => GetNativeString("getReleaseStage"); set => SetNativeString("setReleaseStage", value); } - public string Type { get => GetNativeString("getType"); set => SetNativeString("setType", value); } - public string Version { get => GetNativeString("getVersion"); set => SetNativeString("setVersion", value); } - public int? VersionCode { get => GetNativeInt("getVersionCode"); set => SetNativeInt("setVersionCode", value); } - - public string BundleVersion { get; set; } - public string DsymUuid { get; set; } - - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeAppWithState.cs b/src/BugsnagUnity/Native/Android/NativeAppWithState.cs deleted file mode 100644 index e75a2ad8d..000000000 --- a/src/BugsnagUnity/Native/Android/NativeAppWithState.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativeAppWithState : NativeApp, IAppWithState - { - public NativeAppWithState(AndroidJavaObject androidJavaObject) : base(androidJavaObject){} - - public TimeSpan? Duration { get => GetNativeTimespan("getDuration"); set => SetNativeTimespan("setDuration",value); } - public TimeSpan? DurationInForeground { get => GetNativeTimespan("getDurationInForeground"); set => SetNativeTimespan("setDurationInForeground", value); } - public bool? InForeground { get => GetNativeBool("getInForeground"); set => SetNativeBool("setInForeground",value); } - public bool? IsLaunching { get => GetNativeBool("isLaunching"); set => SetNativeBool("setLaunching", value); } - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeBreadcrumb.cs b/src/BugsnagUnity/Native/Android/NativeBreadcrumb.cs deleted file mode 100644 index c00955af4..000000000 --- a/src/BugsnagUnity/Native/Android/NativeBreadcrumb.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativeBreadcrumb : NativePayloadClassWrapper, IBreadcrumb - { - public NativeBreadcrumb(AndroidJavaObject androidJavaObject) : base(androidJavaObject){} - - public string Message { get => GetNativeString("getMessage"); set => SetNativeString("setMessage",value); } - public IDictionary Metadata { get => GetNativeDictionary("getMetadata"); set => SetNativeDictionary("setMetadata",value); } - - public DateTimeOffset? Timestamp => GetNativeDateTime("getTimestamp"); - - public BreadcrumbType Type { get => GetBreadcrumbType(); set => SetBreadcrumbType(value); } - - private BreadcrumbType GetBreadcrumbType() - { - var native = NativePointer.Call("getType").Call("toString").ToLowerInvariant(); - return Breadcrumb.ParseBreadcrumbType(native); - } - - private void SetBreadcrumbType(BreadcrumbType breadcrumbType) - { - var nativeCrumb = new AndroidJavaClass("com.bugsnag.android.BreadcrumbType").GetStatic(breadcrumbType.ToString().ToUpperInvariant()); - NativePointer.Call("setType",nativeCrumb); - } - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeClient.cs b/src/BugsnagUnity/Native/Android/NativeClient.cs deleted file mode 100644 index 183bdec64..000000000 --- a/src/BugsnagUnity/Native/Android/NativeClient.cs +++ /dev/null @@ -1,166 +0,0 @@ -using System.Collections.Generic; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - class NativeClient : INativeClient - { - public Configuration Configuration { get; } - - public IBreadcrumbs Breadcrumbs { get; } - - private NativeInterface NativeInterface; - - public NativeClient(Configuration configuration) - { - NativeInterface = new NativeInterface(configuration); - Configuration = configuration; - Breadcrumbs = new Breadcrumbs(NativeInterface); - if (configuration.AutoTrackSessions) - { - ResumeSession(); - } - } - - public void PopulateApp(App app) - { - app.Add(NativeInterface.GetApp()); - } - - public void PopulateAppWithState(AppWithState app) - { - PopulateApp(app); - } - - public void PopulateDevice(Device device) - { - Dictionary nativeDeviceData = NativeInterface.GetDevice(); - Dictionary nativeVersions = (Dictionary)nativeDeviceData.Get("runtimeVersions"); - - nativeDeviceData.Remove("runtimeVersions"); // don't overwrite the unity version values - device.Add(nativeDeviceData); - MergeDictionaries(device.RuntimeVersions, nativeVersions); // merge the native version values - } - - public void PopulateDeviceWithState(DeviceWithState device) - { - PopulateDevice(device); - } - - public void PopulateUser(User user) - { - foreach (var entry in NativeInterface.GetUser()) - { - user.Payload.AddToPayload(entry.Key, entry.Value.ToString()); - } - } - - private void MergeDictionaries(IDictionary dest, IDictionary another) - { - foreach (var entry in another) - { - dest.AddToPayload(entry.Key, entry.Value); - } - } - - public void SetUser(User user) - { - NativeInterface.SetUser(user); - } - - public void SetContext(string context) - { - NativeInterface.SetContext(context); - } - - public void StartSession() - { - NativeInterface.StartSession(); - } - - public void PauseSession() - { - NativeInterface.PauseSession(); - } - - public bool ResumeSession() - { - return NativeInterface.ResumeSession(); - } - - public void UpdateSession(Session session) - { - NativeInterface.UpdateSession(session); - } - - public Session GetCurrentSession() - { - return NativeInterface.GetCurrentSession(); - } - - public void MarkLaunchCompleted() - { - NativeInterface.MarkLaunchCompleted(); - } - - public LastRunInfo GetLastRunInfo() - { - return NativeInterface.GetlastRunInfo(); - } - - public void ClearNativeMetadata(string section) - { - NativeInterface.ClearMetadata(section); - } - - public void ClearNativeMetadata(string section, string key) - { - NativeInterface.ClearMetadata(section,key); - } - - public IDictionary GetNativeMetadata() - { - return NativeInterface.GetMetadata(); - } - - public void AddNativeMetadata(string section, IDictionary data) - { - NativeInterface.AddMetadata(section,data); - } - - public void AddFeatureFlag(string name, string variant = null) - { - NativeInterface.AddFeatureFlag(name, variant); - } - - public void AddFeatureFlags(FeatureFlag[] featureFlags) - { - foreach (var flag in featureFlags) - { - AddFeatureFlag(flag.Name, flag.Variant); - } - } - - public void ClearFeatureFlag(string name) - { - NativeInterface.ClearFeatureFlag(name); - } - - public void ClearFeatureFlags() - { - NativeInterface.ClearFeatureFlags(); - } - - public bool ShouldAttemptDelivery() - { - return true; - } - - public void RegisterForOnSessionCallbacks() - { - NativeInterface.RegisterForOnSessionCallbacks(); - } - } - -} diff --git a/src/BugsnagUnity/Native/Android/NativeDevice.cs b/src/BugsnagUnity/Native/Android/NativeDevice.cs deleted file mode 100644 index a37e9f2cf..000000000 --- a/src/BugsnagUnity/Native/Android/NativeDevice.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativeDevice: NativePayloadClassWrapper, IDevice - { - public NativeDevice(AndroidJavaObject nativePointer) : base (nativePointer){} - - public string BrowserName { get; set; } - public string BrowserVersion { get; set; } - public string ModelNumber { get; set; } - public string UserAgent { get; set; } - - public string Id { get => GetNativeString("getId"); set => SetNativeString("setId", value); } - public string Locale { get => GetNativeString("getLocale"); set => SetNativeString("setLocale", value); } - public string Manufacturer { get => GetNativeString("getManufacturer"); set => SetNativeString("setManufacturer", value); } - public string Model { get => GetNativeString("getModel"); set => SetNativeString("setModel", value); } - public string OsName { get => GetNativeString("getOsName"); set => SetNativeString("setOsName", value); } - public string OsVersion { get => GetNativeString("getOsVersion"); set => SetNativeString("setOsVersion", value); } - public long? TotalMemory { get => GetNativeLong("getTotalMemory"); set => SetNativeLong("setTotalMemory", value); } - public bool? Jailbroken { get => GetNativeBool("getJailbroken"); set => SetNativeBool("setJailbroken", value); } - - public string[] CpuAbi { get => GetNativeStringArray("getCpuAbi"); set => SetNativeStringArray("setCpuAbi",value); } - - public IDictionary RuntimeVersions { get => GetNativeDictionary("getRuntimeVersions"); set => SetNativeDictionary("setRuntimeVersions", value); } - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeDeviceWithState.cs b/src/BugsnagUnity/Native/Android/NativeDeviceWithState.cs deleted file mode 100644 index 735ebcc41..000000000 --- a/src/BugsnagUnity/Native/Android/NativeDeviceWithState.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativeDeviceWithState : NativeDevice, IDeviceWithState - { - public NativeDeviceWithState(AndroidJavaObject androidJavaObject) : base (androidJavaObject){} - - public long? FreeDisk { get => GetNativeLong("getFreeDisk"); set => SetNativeLong("setFreeDisk",value); } - public long? FreeMemory { get => GetNativeLong("getFreeMemory"); set => SetNativeLong("setFreeMemory", value); } - public string Orientation { get => GetNativeString("getOrientation"); set => SetNativeString("setOrientation", value); } - public DateTimeOffset? Time { get => GetNativeDateTime("getTime"); set => SetNativeDateTime("setTime",value); } - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeError.cs b/src/BugsnagUnity/Native/Android/NativeError.cs deleted file mode 100644 index 790269d62..000000000 --- a/src/BugsnagUnity/Native/Android/NativeError.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativeError : NativePayloadClassWrapper, IError - { - public NativeError(AndroidJavaObject androidJavaObject) : base(androidJavaObject){} - - public string ErrorClass { get => GetNativeString("getErrorClass"); set => SetNativeString("setErrorClass",value); } - public string ErrorMessage { get => GetNativeString("getErrorMessage"); set => SetNativeString("setErrorMessage", value); } - - public List Stacktrace => GetStacktrace(); - - public string Type => NativePointer.Call("getType").Call("toString"); - - private List GetStacktrace() - { - var nativeList = NativePointer.Call("getStacktrace"); - if (nativeList == null) - { - return null; - } - var theStacktrace = new List(); - var iterator = nativeList.Call("iterator"); - while (iterator.Call("hasNext")) - { - var next = iterator.Call("next"); - theStacktrace.Add(new NativeStackFrame(next)); - } - return theStacktrace; - } - - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeEvent.cs b/src/BugsnagUnity/Native/Android/NativeEvent.cs deleted file mode 100644 index 222270029..000000000 --- a/src/BugsnagUnity/Native/Android/NativeEvent.cs +++ /dev/null @@ -1,193 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativeEvent : NativePayloadClassWrapper, IEvent - { - public NativeEvent(AndroidJavaObject androidJavaObject) : base (androidJavaObject){} - - public string ApiKey { get => GetNativeString("getApiKey"); set => SetNativeString("setApiKey",value); } - - public IAppWithState App => new NativeAppWithState(NativePointer.Call("getApp")); - - public string Context { get => GetNativeString("getContext"); set => SetNativeString("setContext", value); } - - public IDeviceWithState Device => new NativeDeviceWithState(NativePointer.Call("getDevice")); - - public ReadOnlyCollection Breadcrumbs => GetBreadcrumbs(); - - public List Errors => GetErrors(); - - public string GroupingHash { get => GetNativeString("getGroupingHash"); set => SetNativeString("setGroupingHash", value); } - - public Severity Severity { get => GetSeverity(); set => SetSeverity(value); } - - public List Threads => GetThreads(); - - public bool Unhandled { get => NativePointer.Call("isUnhandled"); set => NativePointer.Call("setUnhandled", (bool)value); } - - private Severity GetSeverity() - { - var nativeSeverity = NativePointer.Call("getSeverity").Call("toString").ToLowerInvariant(); - if (nativeSeverity.Contains("error")) - { - return Severity.Error; - } - if (nativeSeverity.Contains("warning")) - { - return Severity.Warning; - } - return Severity.Info; - } - - private void SetSeverity(Severity severity) - { - var nativeSeverity = new AndroidJavaClass("com.bugsnag.android.Severity").GetStatic(severity.ToString().ToUpperInvariant()); - NativePointer.Call("setSeverity",nativeSeverity); - } - - private ReadOnlyCollection GetBreadcrumbs() - { - var nativeList = NativePointer.Call("getBreadcrumbs"); - if (nativeList == null) - { - return null; - } - var theBreadcrumbs = new List(); - var iterator = nativeList.Call("iterator"); - while (iterator.Call("hasNext")) - { - var next = iterator.Call("next"); - theBreadcrumbs.Add(new NativeBreadcrumb(next)); - } - return new ReadOnlyCollection( theBreadcrumbs ); - } - - private List GetErrors() - { - var nativeList = NativePointer.Call("getErrors"); - if (nativeList == null) - { - return null; - } - var theErrors = new List(); - var iterator = nativeList.Call("iterator"); - while (iterator.Call("hasNext")) - { - var next = iterator.Call("next"); - theErrors.Add(new NativeError(next)); - } - return theErrors; - } - - private List GetThreads() - { - var nativeList = NativePointer.Call("getThreads"); - if (nativeList == null) - { - return null; - } - var theThreads = new List(); - var iterator = nativeList.Call("iterator"); - while (iterator.Call("hasNext")) - { - var next = iterator.Call("next"); - theThreads.Add(new NativeThread(next)); - } - return theThreads; - } - - public void AddMetadata(string section, string key, object value) - { - var existingMetadata = GetNativeMetadataSection("getMetadata",section); - if (existingMetadata == null) - { - existingMetadata = new Dictionary(); - } - existingMetadata[key] = value; - AddMetadata(section,existingMetadata); - } - - public void AddMetadata(string section, IDictionary metadata) - { - SetNativeMetadataSection("addMetadata", section, metadata); - } - - public void ClearMetadata(string section) - { - NativePointer.Call("clearMetadata",section); - } - - public void ClearMetadata(string section, string key) - { - NativePointer.Call("clearMetadata", section, key); - } - - public IDictionary GetMetadata(string section) - { - return GetNativeMetadataSection("getMetadata", section); - } - - public object GetMetadata(string section, string key) - { - var metadata = GetMetadata(section); - if (metadata.ContainsKey(key)) - { - return metadata[key]; - } - return null; - } - - public IUser GetUser() => new NativeUser(NativePointer.Call("getUser")); - - public void SetUser(string id, string email, string name) - { - NativePointer.Call("setUser", id, email, name); - } - - public void AddFeatureFlag(string name, string variant = null) - { - NativePointer.Call("addFeatureFlag",name,variant); - } - - public void AddFeatureFlags(FeatureFlag[] featureFlags) - { - foreach (var flag in featureFlags) - { - AddFeatureFlag(flag.Name, flag.Variant); - } - } - - public void ClearFeatureFlag(string name) - { - NativePointer.Call("clearFeatureFlag",name); - } - - public void ClearFeatureFlags() - { - NativePointer.Call("clearFeatureFlags"); - } - - public ReadOnlyCollection FeatureFlags - { - get - { - var objects = new List(); - var list = NativePointer.Call("getFeatureFlags"); - var iterator = list.Call("iterator"); - while (iterator.Call("hasNext")) - { - var javaObject = iterator.Call("next"); - var name = javaObject.Call("getName"); - var variant = javaObject.Call("getVariant"); - objects.Add(new FeatureFlag(name, variant)); - } - return new ReadOnlyCollection(objects); - } - } - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeInterface.cs b/src/BugsnagUnity/Native/Android/NativeInterface.cs deleted file mode 100644 index 007b08602..000000000 --- a/src/BugsnagUnity/Native/Android/NativeInterface.cs +++ /dev/null @@ -1,1291 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using BugsnagUnity.Payload; -using UnityEngine; -using System.Threading; -using System.Text; - -namespace BugsnagUnity -{ - internal class DisposableContainer : IDisposable - { - private List _disposables = new List(); - - public void Add(IDisposable disposable) - { - _disposables.Add(disposable); - } - - public void Dispose() - { - for (int i = _disposables.Count - 1; i >= 0; i--) - { - if (_disposables[i] != null) - { - _disposables[i].Dispose(); - } - } - } - } - - class NativeInterface - { - private IntPtr BugsnagNativeInterface; - private IntPtr BugsnagUnityClass; - // Cache of classes used: - private IntPtr LastRunInfoClass; - private IntPtr BreadcrumbClass; - private IntPtr BreadcrumbTypeClass; - private IntPtr CollectionClass; - private IntPtr IteratorClass; - private IntPtr ListClass; - private IntPtr MapClass; - private IntPtr BooleanClass; - private IntPtr IntClass; - private IntPtr LongClass; - private IntPtr DoubleClass; - private IntPtr FloatClass; - - - private IntPtr DateClass; - private IntPtr DateUtilsClass; - private IntPtr MapEntryClass; - private IntPtr SetClass; - private IntPtr StringClass; - private IntPtr SessionClass; - private IntPtr ClientClass; - - // Cache of methods used: - private IntPtr BreadcrumbGetMessage; - private IntPtr BreadcrumbGetMetadata; - private IntPtr BreadcrumbGetTimestamp; - private IntPtr BreadcrumbGetType; - private IntPtr ClassIsArray; - private IntPtr CollectionIterator; - private IntPtr IteratorHasNext; - private IntPtr IteratorNext; - private IntPtr MapEntryGetKey; - private IntPtr MapEntryGetValue; - private IntPtr MapEntrySet; - private IntPtr ObjectGetClass; - private IntPtr ObjectToString; - private IntPtr BooleanValueMethod; - private IntPtr IntValueMethod; - private IntPtr LongValueMethod; - private IntPtr DoubleValueMethod; - private IntPtr FloatValueMethod; - - private IntPtr ToIso8601; - private IntPtr AddFeatureFlagMethod; - private IntPtr ClearFeatureFlagMethod; - private IntPtr ClearFeatureFlagsMethod; - - - - - private Configuration _configuration; - - private bool CanRunOnBackgroundThread; - - private static bool Unity2019OrNewer; - private Thread MainThread; - - private bool _registeredForSessionCallbacks; - - private class OnSessionCallback : AndroidJavaProxy - { - - private Configuration _config; - - public OnSessionCallback(Configuration config) : base("com.bugsnag.android.OnSessionCallback") - { - _config = config; - } - public bool onSession(AndroidJavaObject session) - { - - var wrapper = new NativeSession(session); - foreach (var callback in _config.GetOnSessionCallbacks()) - { - try - { - if (!callback.Invoke(wrapper)) - { - return false; - } - } - catch - { - // If the callback causes an exception, ignore it and execute the next one - } - - } - - return true; - } - } - - private class OnSendErrorCallback : AndroidJavaProxy - { - private Configuration _config; - - public OnSendErrorCallback(Configuration config) : base("com.bugsnag.android.OnSendCallback") - { - _config = config; - } - public bool onSend(AndroidJavaObject @event) - { - var wrapper = new NativeEvent(@event); - foreach (var callback in _config.GetOnSendErrorCallbacks()) - { - try - { - if (!callback.Invoke(wrapper)) - { - return false; - } - } - catch - { - // If the callback causes an exception, ignore it and execute the next one - } - } - return true; - } - } - - public NativeInterface(Configuration cfg) - { - _configuration = cfg; - AndroidJavaObject config = CreateNativeConfig(cfg); - ConfigureNotifierInfo(config); - Unity2019OrNewer = IsUnity2019OrNewer(); - MainThread = Thread.CurrentThread; - using (AndroidJavaClass system = new AndroidJavaClass("java.lang.System")) - { - string arch = system.CallStatic("getProperty", "os.arch"); - CanRunOnBackgroundThread = (arch != "x86" && arch != "i686" && arch != "x86_64"); - } - using (AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) - using (AndroidJavaObject activity = unityPlayerClass.GetStatic("currentActivity")) - using (AndroidJavaObject context = activity.Call("getApplicationContext")) - using (AndroidJavaObject client = new AndroidJavaObject("com.bugsnag.android.Client", context, config)) - { - // lookup the NativeInterface class and set the client to the local object. - // all subsequent communication should go through the NativeInterface. - IntPtr nativeInterfaceRef = AndroidJNI.FindClass("com/bugsnag/android/NativeInterface"); - BugsnagNativeInterface = AndroidJNI.NewGlobalRef(nativeInterfaceRef); - AndroidJNI.DeleteLocalRef(nativeInterfaceRef); - - IntPtr setClient = AndroidJNI.GetStaticMethodID(BugsnagNativeInterface, "setClient", "(Lcom/bugsnag/android/Client;)V"); - - object[] args = new object[] { client }; - jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(args); - AndroidJNI.CallStaticVoidMethod(BugsnagNativeInterface, setClient, jargs); - AndroidJNIHelper.DeleteJNIArgArray(args, jargs); - - // Cache JNI refs which will be used to load report data later in the - // app lifecycle to avoid repeated lookups - IntPtr unityRef = AndroidJNI.FindClass("com/bugsnag/android/unity/BugsnagUnity"); - BugsnagUnityClass = AndroidJNI.NewGlobalRef(unityRef); - AndroidJNI.DeleteLocalRef(unityRef); - - IntPtr crumbRef = AndroidJNI.FindClass("com/bugsnag/android/Breadcrumb"); - BreadcrumbClass = AndroidJNI.NewGlobalRef(crumbRef); - AndroidJNI.DeleteLocalRef(crumbRef); - - IntPtr lastRunInfoRef = AndroidJNI.FindClass("com/bugsnag/android/LastRunInfo"); - LastRunInfoClass = AndroidJNI.NewGlobalRef(lastRunInfoRef); - AndroidJNI.DeleteLocalRef(lastRunInfoRef); - - IntPtr crumbTypeRef = AndroidJNI.FindClass("com/bugsnag/android/BreadcrumbType"); - BreadcrumbTypeClass = AndroidJNI.NewGlobalRef(crumbTypeRef); - AndroidJNI.DeleteLocalRef(crumbTypeRef); - - IntPtr collectionRef = AndroidJNI.FindClass("java/util/Collection"); - CollectionClass = AndroidJNI.NewGlobalRef(collectionRef); - AndroidJNI.DeleteLocalRef(collectionRef); - - IntPtr iterRef = AndroidJNI.FindClass("java/util/Iterator"); - IteratorClass = AndroidJNI.NewGlobalRef(iterRef); - AndroidJNI.DeleteLocalRef(iterRef); - - IntPtr listRef = AndroidJNI.FindClass("java/util/List"); - ListClass = AndroidJNI.NewGlobalRef(listRef); - AndroidJNI.DeleteLocalRef(listRef); - - IntPtr mapRef = AndroidJNI.FindClass("java/util/Map"); - MapClass = AndroidJNI.NewGlobalRef(mapRef); - AndroidJNI.DeleteLocalRef(mapRef); - - IntPtr booleanRef = AndroidJNI.FindClass("java/lang/Boolean"); - BooleanClass = AndroidJNI.NewGlobalRef(booleanRef); - BooleanValueMethod = AndroidJNI.GetMethodID(booleanRef, "booleanValue", "()Z"); - AndroidJNI.DeleteLocalRef(booleanRef); - - IntPtr intRef = AndroidJNI.FindClass("java/lang/Integer"); - IntClass = AndroidJNI.NewGlobalRef(intRef); - IntValueMethod = AndroidJNI.GetMethodID(intRef, "intValue", "()I"); - AndroidJNI.DeleteLocalRef(intRef); - - IntPtr longRef = AndroidJNI.FindClass("java/lang/Long"); - LongClass = AndroidJNI.NewGlobalRef(longRef); - LongValueMethod = AndroidJNI.GetMethodID(longRef, "longValue", "()J"); - AndroidJNI.DeleteLocalRef(longRef); - - IntPtr floatRef = AndroidJNI.FindClass("java/lang/Float"); - FloatClass = AndroidJNI.NewGlobalRef(floatRef); - FloatValueMethod = AndroidJNI.GetMethodID(floatRef, "floatValue", "()F"); - AndroidJNI.DeleteLocalRef(floatRef); - - IntPtr doubleRef = AndroidJNI.FindClass("java/lang/Double"); - DoubleClass = AndroidJNI.NewGlobalRef(doubleRef); - DoubleValueMethod = AndroidJNI.GetMethodID(doubleRef, "doubleValue", "()D"); - AndroidJNI.DeleteLocalRef(doubleRef); - - IntPtr dateRef = AndroidJNI.FindClass("java/util/Date"); - DateClass = AndroidJNI.NewGlobalRef(dateRef); - AndroidJNI.DeleteLocalRef(dateRef); - - IntPtr dateUtilsRef = AndroidJNI.FindClass("com/bugsnag/android/internal/DateUtils"); - DateUtilsClass = AndroidJNI.NewGlobalRef(dateUtilsRef); - - IntPtr entryRef = AndroidJNI.FindClass("java/util/Map$Entry"); - MapEntryClass = AndroidJNI.NewGlobalRef(entryRef); - AndroidJNI.DeleteLocalRef(entryRef); - - IntPtr setRef = AndroidJNI.FindClass("java/util/Set"); - SetClass = AndroidJNI.NewGlobalRef(setRef); - AndroidJNI.DeleteLocalRef(setRef); - - IntPtr stringRef = AndroidJNI.FindClass("java/lang/String"); - StringClass = AndroidJNI.NewGlobalRef(stringRef); - AndroidJNI.DeleteLocalRef(stringRef); - - IntPtr sessionRef = AndroidJNI.FindClass("com/bugsnag/android/Session"); - SessionClass = AndroidJNI.NewGlobalRef(sessionRef); - AndroidJNI.DeleteLocalRef(sessionRef); - - IntPtr clientRef = AndroidJNI.FindClass("com/bugsnag/android/Client"); - ClientClass = AndroidJNI.NewGlobalRef(clientRef); - AndroidJNI.DeleteLocalRef(clientRef); - - BreadcrumbGetMetadata = AndroidJNI.GetMethodID(BreadcrumbClass, "getMetadata", "()Ljava/util/Map;"); - BreadcrumbGetType = AndroidJNI.GetMethodID(BreadcrumbClass, "getType", "()Lcom/bugsnag/android/BreadcrumbType;"); - BreadcrumbGetTimestamp = AndroidJNI.GetMethodID(BreadcrumbClass, "getStringTimestamp", "()Ljava/lang/String;"); - BreadcrumbGetMessage = AndroidJNI.GetMethodID(BreadcrumbClass, "getMessage", "()Ljava/lang/String;"); - CollectionIterator = AndroidJNI.GetMethodID(CollectionClass, "iterator", "()Ljava/util/Iterator;"); - IteratorHasNext = AndroidJNI.GetMethodID(IteratorClass, "hasNext", "()Z"); - IteratorNext = AndroidJNI.GetMethodID(IteratorClass, "next", "()Ljava/lang/Object;"); - MapEntryGetKey = AndroidJNI.GetMethodID(MapEntryClass, "getKey", "()Ljava/lang/Object;"); - MapEntryGetValue = AndroidJNI.GetMethodID(MapEntryClass, "getValue", "()Ljava/lang/Object;"); - MapEntrySet = AndroidJNI.GetMethodID(MapClass, "entrySet", "()Ljava/util/Set;"); - AddFeatureFlagMethod = AndroidJNI.GetMethodID(ClientClass, "addFeatureFlag", "(Ljava/lang/String;Ljava/lang/String;)V"); - ClearFeatureFlagMethod = AndroidJNI.GetMethodID(ClientClass, "clearFeatureFlag", "(Ljava/lang/String;)V"); - ClearFeatureFlagsMethod = AndroidJNI.GetMethodID(ClientClass, "clearFeatureFlags", "()V"); - - IntPtr objectRef = AndroidJNI.FindClass("java/lang/Object"); - ObjectToString = AndroidJNI.GetMethodID(objectRef, "toString", "()Ljava/lang/String;"); - ObjectGetClass = AndroidJNI.GetMethodID(objectRef, "getClass", "()Ljava/lang/Class;"); - AndroidJNI.DeleteLocalRef(objectRef); - - IntPtr classRef = AndroidJNI.FindClass("java/lang/Class"); - ClassIsArray = AndroidJNI.GetMethodID(classRef, "isArray", "()Z"); - AndroidJNI.DeleteLocalRef(classRef); - - ToIso8601 = AndroidJNI.GetStaticMethodID(DateUtilsClass, "toIso8601", "(Ljava/util/Date;)Ljava/lang/String;"); - AndroidJNI.DeleteLocalRef(dateUtilsRef); - - // the bugsnag-android notifier uses Activity lifecycle tracking to - // determine if the application is in the foreground. As the unity - // activity has already started at this point we need to tell the - // notifier about the activity and the fact that it has started. - using (AndroidJavaObject sessionTracker = client.Get("sessionTracker")) - using (AndroidJavaObject activityClass = activity.Call("getClass")) - { - string activityName = null; - using (AndroidJavaObject activityNameObject = activityClass.Call("getSimpleName")) - { - if (activityNameObject != null) - { - activityName = AndroidJNI.GetStringUTFChars(activityNameObject.GetRawObject()); - } - } - sessionTracker.Call("updateContext", activityName, true); - } - - } - } - - /** - * Transforms an IConfiguration C# object into a Java Configuration object. - */ - AndroidJavaObject CreateNativeConfig(Configuration config) - { - var obj = new AndroidJavaObject("com.bugsnag.android.Configuration", config.ApiKey); - // configure automatic tracking of errors/sessions - using (AndroidJavaObject errorTypes = new AndroidJavaObject("com.bugsnag.android.ErrorTypes")) - { - errorTypes.Call("setAnrs", config.EnabledErrorTypes.ANRs); - errorTypes.Call("setNdkCrashes", config.EnabledErrorTypes.Crashes); - errorTypes.Call("setUnhandledExceptions", config.EnabledErrorTypes.Crashes); - obj.Call("setEnabledErrorTypes", errorTypes); - } - - obj.Call("setAutoTrackSessions", config.AutoTrackSessions); - obj.Call("setAutoDetectErrors", config.AutoDetectErrors); - obj.Call("setAppVersion", config.AppVersion); - obj.Call("setContext", config.Context); - obj.Call("setMaxBreadcrumbs", config.MaximumBreadcrumbs); - obj.Call("setMaxPersistedEvents", config.MaxPersistedEvents); - obj.Call("setMaxPersistedSessions", config.MaxPersistedSessions); - obj.Call("setPersistUser", config.PersistUser); - obj.Call("setLaunchDurationMillis", config.LaunchDurationMillis); - obj.Call("setSendLaunchCrashesSynchronously", config.SendLaunchCrashesSynchronously); - obj.Call("setMaxReportedThreads", config.MaxReportedThreads); - obj.Call("setMaxStringValueLength", config.MaxStringValueLength); - obj.Call("setGenerateAnonymousId", config.GenerateAnonymousId); - - if (config.GetUser() != null) - { - var user = config.GetUser(); - obj.Call("setUser", user.Id, user.Email, user.Name); - } - - //Register for callbacks - if (config.GetOnSessionCallbacks() != null && config.GetOnSessionCallbacks().Count > 0) - { - obj.Call("addOnSession", new OnSessionCallback(config)); - _registeredForSessionCallbacks = true; - } - if (config.GetOnSendErrorCallbacks() != null && config.GetOnSendErrorCallbacks().Count > 0) - { - obj.Call("addOnSend", new OnSendErrorCallback(config)); - } - - // set endpoints - var notify = config.Endpoints.Notify.ToString(); - var sessions = config.Endpoints.Session.ToString(); - using (AndroidJavaObject endpointConfig = new AndroidJavaObject("com.bugsnag.android.EndpointConfiguration", notify, sessions)) - { - obj.Call("setEndpoints", endpointConfig); - } - - //android layer expects a nonnull java Integer not just an int, so we check if it has actually been set to a valid value - if (config.VersionCode > -1) - { - var javaInteger = new AndroidJavaObject("java.lang.Integer", config.VersionCode); - obj.Call("setVersionCode", javaInteger); - } - - //Null or empty check necessary because android will set the app.type to empty if that or null is passed as default - if (!string.IsNullOrEmpty(config.AppType)) - { - obj.Call("setAppType", config.AppType); - } - - // set EnabledBreadcrumbTypes - if (config.EnabledBreadcrumbTypes != null) - { - - using (AndroidJavaObject enabledBreadcrumbs = new AndroidJavaObject("java.util.HashSet")) - { - AndroidJavaClass androidBreadcrumbEnumClass = new AndroidJavaClass("com.bugsnag.android.BreadcrumbType"); - for (int i = 0; i < config.EnabledBreadcrumbTypes.Length; i++) - { - var stringValue = Enum.GetName(typeof(BreadcrumbType), config.EnabledBreadcrumbTypes[i]).ToUpperInvariant(); - using (AndroidJavaObject crumbType = androidBreadcrumbEnumClass.CallStatic("valueOf", stringValue)) - { - enabledBreadcrumbs.Call("add", crumbType); - } - } - obj.Call("setEnabledBreadcrumbTypes", enabledBreadcrumbs); - } - } - - // set enabled telemetry types - if (config.Telemetry != null) - { - using AndroidJavaObject enabledTelemetry = new AndroidJavaObject("java.util.HashSet"); - AndroidJavaClass androidTelemetryEnumClass = new AndroidJavaClass("com.bugsnag.android.Telemetry"); - foreach (var telemtryType in config.Telemetry) - { - var javaName = ""; - switch (telemtryType) - { - case TelemetryType.InternalErrors: - javaName = "INTERNAL_ERRORS"; - break; - case TelemetryType.Usage: - javaName = "USAGE"; - break; - } - using AndroidJavaObject telemetryType = androidTelemetryEnumClass.CallStatic("valueOf", javaName); - enabledTelemetry.Call("add", telemetryType); - } - obj.Call("setTelemetry", enabledTelemetry); - } - - - // set feature flags - if (config.FeatureFlags != null && config.FeatureFlags.Count > 0) - { - foreach (DictionaryEntry entry in config.FeatureFlags) - { - obj.Call("addFeatureFlag", (string)entry.Key, (string)entry.Value); - } - } - - // set sendThreads - AndroidJavaClass androidThreadSendPolicyClass = new AndroidJavaClass("com.bugsnag.android.ThreadSendPolicy"); - using (AndroidJavaObject policy = androidThreadSendPolicyClass.CallStatic("valueOf", GetAndroidFormatThreadSendName(config.SendThreads))) - { - obj.Call("setSendThreads", policy); - } - - // set release stages - obj.Call("setReleaseStage", config.ReleaseStage); - - if (config.EnabledReleaseStages != null && config.EnabledReleaseStages.Length > 0) - { - obj.Call("setEnabledReleaseStages", GetAndroidStringSetFromArray(config.EnabledReleaseStages)); - } - - // set DiscardedClasses - if (config.DiscardClasses != null && config.DiscardClasses.Count > 0) - { - var patternsAsStrings = new string[config.DiscardClasses.Count]; - foreach (var pattern in config.DiscardClasses) - { - patternsAsStrings[config.DiscardClasses.IndexOf(pattern)] = pattern.ToString(); - } - - obj.Call("setDiscardClasses", GetAndroidRegexPatternSetFromArray(patternsAsStrings)); - } - - // set ProjectPackages - if (config.ProjectPackages != null && config.ProjectPackages.Length > 0) - { - obj.Call("setProjectPackages", GetAndroidStringSetFromArray(config.ProjectPackages)); - } - - // set redacted keys - if (config.RedactedKeys != null && config.RedactedKeys.Count > 0) - { - var patternsAsStrings = new string[config.RedactedKeys.Count]; - foreach (var key in config.RedactedKeys) - { - patternsAsStrings[config.RedactedKeys.IndexOf(key)] = key.ToString(); - } - obj.Call("setRedactedKeys", GetAndroidRegexPatternSetFromArray(patternsAsStrings)); - } - - // add unity event callback - var BugsnagUnity = new AndroidJavaClass("com.bugsnag.android.unity.BugsnagUnity"); - obj.Call("addOnError", BugsnagUnity.CallStatic("getNativeCallback", new object[] { })); - - // set persistence directory - if (!string.IsNullOrEmpty(config.PersistenceDirectory)) - { - AndroidJavaObject androidFile = new AndroidJavaObject("java.io.File", config.PersistenceDirectory); - obj.Call("setPersistenceDirectory", androidFile); - } - - return obj; - } - - private string GetAndroidFormatThreadSendName(ThreadSendPolicy threadSendPolicy) - { - switch (threadSendPolicy) - { - case ThreadSendPolicy.Always: - return "ALWAYS"; - case ThreadSendPolicy.UnhandledOnly: - return "UNHANDLED_ONLY"; - default: - return "NEVER"; - } - } - - private AndroidJavaObject GetAndroidStringSetFromArray(string[] array) - { - AndroidJavaObject set = new AndroidJavaObject("java.util.HashSet"); - foreach (var item in array) - { - set.Call("add", item); - } - return set; - } - - private AndroidJavaObject GetAndroidRegexPatternSetFromArray(string[] array) - { - AndroidJavaObject set = new AndroidJavaObject("java.util.HashSet"); - AndroidJavaClass patternClass = new AndroidJavaClass("java.util.regex.Pattern"); - - foreach (var item in array) - { - try - { - AndroidJavaObject pattern = patternClass.CallStatic("compile", item); - set.Call("add", pattern); - } - catch (AndroidJavaException e) - { - Debug.LogWarning("Failed to compile regex pattern: " + item + " " + e.Message); - } - } - - return set; - } - - private void ConfigureNotifierInfo(AndroidJavaObject config) - { - using (AndroidJavaObject notifier = config.Call("getNotifier")) - { - AndroidJavaObject androidNotifier = new AndroidJavaObject("com.bugsnag.android.Notifier"); - androidNotifier.Call("setUrl", androidNotifier.Get("url")); - androidNotifier.Call("setName", androidNotifier.Get("name")); - androidNotifier.Call("setVersion", androidNotifier.Get("version")); - AndroidJavaObject list = new AndroidJavaObject("java.util.ArrayList"); - list.Call("add", androidNotifier); - notifier.Call("setDependencies", list); - - notifier.Call("setUrl", NotifierInfo.NotifierUrl); - notifier.Call("setName", "Unity Bugsnag Notifier"); - notifier.Call("setVersion", NotifierInfo.NotifierVersion); - } - } - - /** - * Pushes a local JNI frame with 128 capacity. This avoids the reference table - * being exceeded, which can happen on some lower-end Android devices in extreme conditions - * (e.g. Nexus 7 running Android 6). This is likely due to AndroidJavaObject - * not deleting local references immediately. - * - * If this call is unsuccessful it indicates the device is low on memory so the caller should no-op. - * https://docs.unity3d.com/ScriptReference/AndroidJNI.PopLocalFrame.html - */ - private bool PushLocalFrame() - { - if (AndroidJNI.PushLocalFrame(128) != 0) - { - AndroidJNI.ExceptionClear(); // clear pending OutOfMemoryError. - return false; - } - return true; - } - - /** - * Pops the local JNI frame, freeing any references in the table. - * https://docs.unity3d.com/ScriptReference/AndroidJNI.PopLocalFrame.html - */ - private void PopLocalFrame() - { - AndroidJNI.PopLocalFrame(System.IntPtr.Zero); - } - - public void SetAutoDetectErrors(bool newValue) - { - CallNativeVoidMethod("setAutoNotify", "(Z)V", new object[] { newValue }); - } - - public void SetContext(string newValue) - { - CallNativeVoidMethod("setContext", "(Ljava/lang/String;)V", new object[] { newValue }); - } - - public void SetUser(User user) - { - var method = "setUser"; - var description = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"; - if (user == null) - { - CallNativeVoidMethod(method, description, new object[] { null, null, null }); - } - else - { - CallNativeVoidMethod(method, description, - new object[] { user.Id, user.Email, user.Name }); - } - } - - public void StartSession() - { - CallNativeVoidMethod("startSession", "()V", new object[] { }); - } - - public bool ResumeSession() - { - return CallNativeBoolMethod("resumeSession", "()Z", new object[] { }); - } - - public void PauseSession() - { - CallNativeVoidMethod("pauseSession", "()V", new object[] { }); - } - - public void UpdateSession(Session session) - { - if (session != null) - { - // The ancient version of the runtime used doesn't have an equivalent to GetUnixTime() - var startedAt = (long)(session.StartedAt - new DateTime(1970, 1, 1, 0, 0, 0, 0))?.TotalMilliseconds; - CallNativeVoidMethod("registerSession", "(JLjava/lang/String;II)V", new object[]{ - startedAt, session.Id.ToString(), session.UnhandledCount(), - session.HandledCount() - }); - } - } - - public Session GetCurrentSession() - { - var javaSession = CallNativeObjectMethodRef("getCurrentSession", "()Lcom/bugsnag/android/Session;", new object[] { }); - - var id = AndroidJNI.CallStringMethod(javaSession, AndroidJNIHelper.GetMethodID(SessionClass, "getId"), new jvalue[] { }); - - if (id == null) - { - return null; - } - - var javaStartedAt = AndroidJNI.CallObjectMethod(javaSession, AndroidJNIHelper.GetMethodID(SessionClass, "getStartedAt"), new jvalue[] { }); - var unhandledCount = AndroidJNI.CallIntMethod(javaSession, AndroidJNIHelper.GetMethodID(SessionClass, "getUnhandledCount"), new jvalue[] { }); - var handledCount = AndroidJNI.CallIntMethod(javaSession, AndroidJNIHelper.GetMethodID(SessionClass, "getHandledCount"), new jvalue[] { }); - var timeLong = AndroidJNI.CallLongMethod(javaStartedAt, AndroidJNIHelper.GetMethodID(DateClass, "getTime"), new jvalue[] { }); - var unityDateTime = new DateTime(1970, 1, 1).AddMilliseconds(timeLong); - - return new Session(id, unityDateTime, handledCount, unhandledCount ); - - } - - public void MarkLaunchCompleted() - { - CallNativeVoidMethod("markLaunchCompleted", "()V", new object[] { }); - } - - public Dictionary GetApp() - { - return GetJavaMapData("getApp"); - } - - public Dictionary GetDevice() - { - return GetJavaMapData("getDevice"); - } - - public Dictionary GetMetadata() - { - var metadata = GetJavaMapData("getMetadata"); - return metadata; - } - - public Dictionary GetUser() - { - return GetJavaMapData("getUser"); - } - - public void ClearMetadata(string tab) - { - if (tab == null) - { - return; - } - CallNativeVoidMethod("clearMetadata", "(Ljava/lang/String;Ljava/lang/String;)V", new object[] { tab, null }); - } - - public void ClearMetadata(string tab, string key) - { - if (tab == null) - { - return; - } - CallNativeVoidMethod("clearMetadata", "(Ljava/lang/String;Ljava/lang/String;)V", new object[] { tab, key }); - } - - public void AddMetadata(string section, IDictionary metadata) - { - if (section == null || metadata == null) - { - return; - } - using (var disposableContainer = new DisposableContainer()) - { - CallNativeVoidMethod("addMetadata", "(Ljava/lang/String;Ljava/util/Map;)V", - new object[] { section, DictionaryToJavaMap(metadata, disposableContainer) }); - } - } - - - - internal static AndroidJavaObject DictionaryToJavaMap(IDictionary inputDict, DisposableContainer disposables) - { - AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap"); - disposables.Add(map); - if (inputDict != null) - { - foreach (var entry in inputDict) - { - - var key = new AndroidJavaObject("java.lang.String", entry.Key); - disposables.Add(key); - if (entry.Value == null) - { - map.Call("put", key, null); - } - else if (entry.Value is IDictionary) - { - if (entry.Value is IDictionary dictionary) - { - map.Call("put", key, DictionaryToJavaMap(dictionary, disposables)); - } - else - { - var convertedDictionary = ConvertIfPoss(entry.Value); - if (convertedDictionary != null) - { - map.Call("put", key, DictionaryToJavaMap(convertedDictionary, disposables)); - } - } - } - else if (IsListOrArray(entry.Value)) - { - map.Call("put", key, GetJavaArrayListFromCollection(entry.Value, disposables)); - } - else - { - map.Call("put", key, GetAndroidObjectFromBasicObject(entry.Value, disposables)); - } - } - } - return map; - } - - private static IDictionary ConvertIfPoss(object o) - { - var stringDict = o as IDictionary; - if (stringDict != null) - { - return stringDict; - } - - var dict = o as IDictionary; - - if (dict != null) - { - stringDict = new Dictionary(); - foreach (var key in dict.Keys) - { - stringDict[key?.ToString() ?? ""] = dict[key]; - } - return stringDict; - } - return null; - } - - private static bool IsListOrArray(object theObject) - { - var oType = theObject.GetType(); - return (oType.IsGenericType && oType.GetGenericTypeDefinition() == typeof(List<>)) || oType.IsArray; - } - - private static AndroidJavaObject GetJavaArrayListFromCollection(object theObject, DisposableContainer disposableContainer) - { - var collection = (IEnumerable)theObject; - var arrayList = new AndroidJavaObject("java.util.ArrayList"); - disposableContainer.Add(arrayList); - foreach (var item in collection) - { - arrayList.Call("add", GetAndroidObjectFromBasicObject(item, disposableContainer)); - } - return arrayList; - } - - private static AndroidJavaObject GetAndroidObjectFromBasicObject(object theObject, DisposableContainer disposableContainer) - { - if (theObject == null) - { - return null; - } - string nativeClass; - if (theObject.GetType() == typeof(string)) - { - nativeClass = "java.lang.String"; - } - else if (theObject.GetType() == typeof(bool)) - { - nativeClass = "java.lang.Boolean"; - } - else if (theObject.GetType() == typeof(int)) - { - nativeClass = "java.lang.Integer"; - } - else if (theObject.GetType() == typeof(double)) - { - nativeClass = "java.lang.Double"; - } - else if (theObject.GetType() == typeof(float)) - { - nativeClass = "java.lang.Float"; - } - else if (theObject.GetType() == typeof(long)) - { - nativeClass = "java.lang.Long"; - } - else - { - var stringObj = new AndroidJavaObject("java.lang.String", theObject.ToString()); - disposableContainer.Add(stringObj); - return stringObj; - } - var androidObj = new AndroidJavaObject(nativeClass, theObject); - disposableContainer.Add(androidObj); - return androidObj; - } - - public void LeaveBreadcrumb(string name, string type, IDictionary metadata) - { - if (!CanRunJNI()) - { - return; - } - bool isAttached = bsg_unity_isJNIAttached(); - if (!isAttached) - { - AndroidJNI.AttachCurrentThread(); - } - if (PushLocalFrame()) - { - using (var disposableContainer = new DisposableContainer()) - { - var map = DictionaryToJavaMap(metadata, disposableContainer); - CallNativeVoidMethod("leaveBreadcrumb", "(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V", - new object[] { name, type, map }); - } - PopLocalFrame(); - } - if (!isAttached) - { - AndroidJNI.DetachCurrentThread(); - } - } - - public List GetBreadcrumbs() - { - List breadcrumbs = new List(); - if (!CanRunJNI()) - { - return breadcrumbs; - } - bool isAttached = bsg_unity_isJNIAttached(); - if (!isAttached) - { - AndroidJNI.AttachCurrentThread(); - } - - IntPtr javaBreadcrumbs = CallNativeObjectMethodRef("getBreadcrumbs", "()Ljava/util/List;", new object[] { }); - IntPtr iterator = AndroidJNI.CallObjectMethod(javaBreadcrumbs, CollectionIterator, new jvalue[] { }); - AndroidJNI.DeleteLocalRef(javaBreadcrumbs); - - while (AndroidJNI.CallBooleanMethod(iterator, IteratorHasNext, new jvalue[] { })) - { - IntPtr crumb = AndroidJNI.CallObjectMethod(iterator, IteratorNext, new jvalue[] { }); - breadcrumbs.Add(ConvertToBreadcrumb(crumb)); - AndroidJNI.DeleteLocalRef(crumb); - } - AndroidJNI.DeleteLocalRef(iterator); - - if (!isAttached) - { - AndroidJNI.DetachCurrentThread(); - } - - return breadcrumbs; - } - - private Dictionary GetJavaMapData(string methodName) - { - if (!CanRunJNI()) - { - return new Dictionary(); - } - bool isAttached = bsg_unity_isJNIAttached(); - if (!isAttached) - { - AndroidJNI.AttachCurrentThread(); - } - - IntPtr map = CallNativeObjectMethodRef(methodName, "()Ljava/util/Map;", new object[] { }); - Dictionary value = DictionaryFromJavaMap(map); - AndroidJNI.DeleteLocalRef(map); - - if (!isAttached) - { - AndroidJNI.DetachCurrentThread(); - } - - return value; - } - - // Manually converts any C# strings in the arguments, replacing invalid chars with the replacement char.. - // If we don't do this, C# will coerce them using NewStringUTF, which crashes on invalid UTF-8. - // Arg lists processed this way must be released using ReleaseConvertedStringArgs. - private object[] ConvertStringArgsToNative(object[] args) - { - object[] itemsAsJavaObjects = new object[args.Length]; - for (int i = 0; i < args.Length; i++) - { - var obj = args[i]; - - if (obj is string) - { - itemsAsJavaObjects[i] = new AndroidJavaObject("java.lang.String", obj as string); - } - else - { - itemsAsJavaObjects[i] = obj; - } - } - return itemsAsJavaObjects; - } - - // Release any strings in a processed argument list. - // @param originalArgs: The original C# args. - // @param convertedArgs: The args list returned by ConvertStringArgsToNative. - private void ReleaseConvertedStringArgs(object[] originalArgs, object[] convertedArgs) - { - for (int i = 0; i < originalArgs.Length; i++) - { - if (originalArgs[i] is string) - { - (convertedArgs[i] as AndroidJavaObject).Dispose(); - } - } - } - - private void CallNativeVoidMethod(string methodName, string methodSig, object[] args) - { - if (!CanRunJNI()) - { - return; - } - bool isAttached = bsg_unity_isJNIAttached(); - if (!isAttached) - { - AndroidJNI.AttachCurrentThread(); - } - - object[] convertedArgs = ConvertStringArgsToNative(args); - jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(convertedArgs); - IntPtr methodID = AndroidJNI.GetStaticMethodID(BugsnagNativeInterface, methodName, methodSig); - AndroidJNI.CallStaticVoidMethod(BugsnagNativeInterface, methodID, jargs); - AndroidJNIHelper.DeleteJNIArgArray(convertedArgs, jargs); - ReleaseConvertedStringArgs(args, convertedArgs); - - if (!isAttached) - { - AndroidJNI.DetachCurrentThread(); - } - } - - private IntPtr CallNativeObjectMethodRef(string methodName, string methodSig, object[] args) - { - if (!CanRunJNI()) - { - return IntPtr.Zero; - } - bool isAttached = bsg_unity_isJNIAttached(); - if (!isAttached) - { - AndroidJNI.AttachCurrentThread(); - } - - object[] convertedArgs = ConvertStringArgsToNative(args); - jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(convertedArgs); - IntPtr methodID = AndroidJNI.GetStaticMethodID(BugsnagNativeInterface, methodName, methodSig); - IntPtr nativeValue = AndroidJNI.CallStaticObjectMethod(BugsnagNativeInterface, methodID, jargs); - AndroidJNIHelper.DeleteJNIArgArray(args, jargs); - ReleaseConvertedStringArgs(args, convertedArgs); - - if (!isAttached) - { - AndroidJNI.DetachCurrentThread(); - } - return nativeValue; - } - - private IntPtr ConvertToStringJNIArrayRef(string[] items) - { - if (items == null || items.Length == 0) - { - return IntPtr.Zero; - } - - AndroidJavaObject[] itemsAsJavaObjects = new AndroidJavaObject[items.Length]; - for (int i = 0; i < items.Length; i++) - { - itemsAsJavaObjects[i] = new AndroidJavaObject("java.lang.String", items[i]); - } - - AndroidJavaObject first = itemsAsJavaObjects[0]; - IntPtr rawArray = AndroidJNI.NewObjectArray(items.Length, StringClass, first.GetRawObject()); - first.Dispose(); - - for (int i = 1; i < items.Length; i++) - { - AndroidJNI.SetObjectArrayElement(rawArray, i, itemsAsJavaObjects[i].GetRawObject()); - itemsAsJavaObjects[i].Dispose(); - } - - return rawArray; - } - - private string CallNativeStringMethod(string methodName, string methodSig, object[] args) - { - if (!CanRunJNI()) - { - return ""; - } - bool isAttached = bsg_unity_isJNIAttached(); - if (!isAttached) - { - AndroidJNI.AttachCurrentThread(); - } - - object[] convertedArgs = ConvertStringArgsToNative(args); - jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(convertedArgs); - IntPtr methodID = AndroidJNI.GetStaticMethodID(BugsnagNativeInterface, methodName, methodSig); - IntPtr nativeValue = AndroidJNI.CallStaticObjectMethod(BugsnagNativeInterface, methodID, jargs); - AndroidJNIHelper.DeleteJNIArgArray(args, jargs); - ReleaseConvertedStringArgs(args, convertedArgs); - - string value = null; - if (nativeValue != null && nativeValue != IntPtr.Zero) - { - value = AndroidJNI.GetStringUTFChars(nativeValue); - } - AndroidJNI.DeleteLocalRef(nativeValue); - - if (!isAttached) - { - AndroidJNI.DetachCurrentThread(); - } - return value; - } - - private bool CallNativeBoolMethod(string methodName, string methodSig, object[] args) - { - if (!CanRunJNI()) - { - return false; - } - bool isAttached = bsg_unity_isJNIAttached(); - if (!isAttached) - { - AndroidJNI.AttachCurrentThread(); - } - - object[] convertedArgs = ConvertStringArgsToNative(args); - jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(convertedArgs); - IntPtr methodID = AndroidJNI.GetStaticMethodID(BugsnagNativeInterface, methodName, methodSig); - bool nativeValue = AndroidJNI.CallStaticBooleanMethod(BugsnagNativeInterface, methodID, jargs); - AndroidJNIHelper.DeleteJNIArgArray(args, jargs); - ReleaseConvertedStringArgs(args, convertedArgs); - if (!isAttached) - { - AndroidJNI.DetachCurrentThread(); - } - return nativeValue; - } - - [DllImport("bugsnag-unity")] - private static extern bool bsg_unity_isJNIAttached(); - - private Breadcrumb ConvertToBreadcrumb(IntPtr javaBreadcrumb) - { - - IntPtr javaMetadata = AndroidJNI.CallObjectMethod(javaBreadcrumb, BreadcrumbGetMetadata, new jvalue[] { }); - var metadata = DictionaryFromJavaMap(javaMetadata); - AndroidJNI.DeleteLocalRef(javaMetadata); - - - IntPtr type = AndroidJNI.CallObjectMethod(javaBreadcrumb, BreadcrumbGetType, new jvalue[] { }); - string typeName = AndroidJNI.CallStringMethod(type, ObjectToString, new jvalue[] { }); - AndroidJNI.DeleteLocalRef(type); - - string message = ""; - IntPtr messageObj = AndroidJNI.CallObjectMethod(javaBreadcrumb, BreadcrumbGetMessage, new jvalue[] { }); - if (messageObj != IntPtr.Zero) - { - message = AndroidJNI.GetStringUTFChars(messageObj); - } - AndroidJNI.DeleteLocalRef(messageObj); - - string timestamp = AndroidJNI.CallStringMethod(javaBreadcrumb, BreadcrumbGetTimestamp, new jvalue[] { }); - return new Breadcrumb(message, timestamp, typeName, metadata); - } - - internal static bool IsUnity2019OrNewer() - { - using (AndroidJavaClass CharsetClass = new AndroidJavaClass("java.nio.charset.Charset")) - using (AndroidJavaObject Charset = CharsetClass.CallStatic("defaultCharset")) - { - try - { // should succeed on Unity 2019.1 and above - using (AndroidJavaObject obj = new AndroidJavaObject("java.lang.String", new sbyte[0], Charset)) - { - return true; - } - } - catch (System.Exception _) - { // use legacy API on older versions - return false; - } - } - } - - private bool CanRunJNI() - { - return CanRunOnBackgroundThread || object.ReferenceEquals(Thread.CurrentThread, MainThread); - } - - private Dictionary DictionaryFromJavaMap(IntPtr source) - { - var dict = new Dictionary(); - - IntPtr entries = AndroidJNI.CallObjectMethod(source, MapEntrySet, new jvalue[] { }); - IntPtr iterator = AndroidJNI.CallObjectMethod(entries, CollectionIterator, new jvalue[] { }); - AndroidJNI.DeleteLocalRef(entries); - - while (AndroidJNI.CallBooleanMethod(iterator, IteratorHasNext, new jvalue[] { })) - { - IntPtr entry = AndroidJNI.CallObjectMethod(iterator, IteratorNext, new jvalue[] { }); - string key = AndroidJNI.CallStringMethod(entry, MapEntryGetKey, new jvalue[] { }); - IntPtr value = AndroidJNI.CallObjectMethod(entry, MapEntryGetValue, new jvalue[] { }); - AndroidJNI.DeleteLocalRef(entry); - - if (value != null && value != IntPtr.Zero) - { - IntPtr valueClass = AndroidJNI.CallObjectMethod(value, ObjectGetClass, new jvalue[] { }); - if (AndroidJNI.CallBooleanMethod(valueClass, ClassIsArray, new jvalue[] { })) - { - string[] values = AndroidJNIHelper.ConvertFromJNIArray(value); - dict.AddToPayload(key, values); - } - else if (AndroidJNI.IsInstanceOf(value, MapClass)) - { - dict.AddToPayload(key, DictionaryFromJavaMap(value)); - } - else if (AndroidJNI.IsInstanceOf(value, DateClass)) - { - jvalue[] args = new jvalue[1]; - args[0].l = value; - var time = AndroidJNI.CallStaticStringMethod(DateUtilsClass, ToIso8601, args); - dict.AddToPayload(key, time); - } - else // parse for basic data types - { - if (AndroidJNI.IsInstanceOf(value, BooleanClass)) - { - var boolValue = AndroidJNI.CallBooleanMethod(value, BooleanValueMethod, new jvalue[] { }); - dict.AddToPayload(key, boolValue); - } - else if (AndroidJNI.IsInstanceOf(value, IntClass)) - { - var intValue = AndroidJNI.CallIntMethod(value, IntValueMethod, new jvalue[] { }); - dict.AddToPayload(key, intValue); - } - else if (AndroidJNI.IsInstanceOf(value, LongClass)) - { - var longValue = AndroidJNI.CallLongMethod(value, LongValueMethod, new jvalue[] { }); - dict.AddToPayload(key, longValue); - } - else if (AndroidJNI.IsInstanceOf(value, FloatClass)) - { - var floatValue = AndroidJNI.CallFloatMethod(value, FloatValueMethod, new jvalue[] { }); - dict.AddToPayload(key, floatValue); - } - else if (AndroidJNI.IsInstanceOf(value, DoubleClass)) - { - var doubleValue = AndroidJNI.CallDoubleMethod(value, DoubleValueMethod, new jvalue[] { }); - dict.AddToPayload(key, doubleValue); - } - else // last case, cast to string - { - var stringValue = AndroidJNI.CallStringMethod(value, ObjectToString, new jvalue[] { }); - if (!string.IsNullOrEmpty(stringValue) && stringValue == "null") - { - dict.AddToPayload(key, null); - } - else - { - dict.AddToPayload(key, stringValue); - } - } - } - AndroidJNI.DeleteLocalRef(valueClass); - } - AndroidJNI.DeleteLocalRef(value); - } - AndroidJNI.DeleteLocalRef(iterator); - - return dict; - } - - public LastRunInfo GetlastRunInfo() - { - var javaLastRunInfo = CallNativeObjectMethodRef("getLastRunInfo", "()Lcom/bugsnag/android/LastRunInfo;", new object[] { }); - var crashed = AndroidJNI.GetBooleanField(javaLastRunInfo, AndroidJNIHelper.GetFieldID(LastRunInfoClass, "crashed")); - var consecutiveLaunchCrashes = AndroidJNI.GetIntField(javaLastRunInfo, AndroidJNIHelper.GetFieldID(LastRunInfoClass, "consecutiveLaunchCrashes")); - var crashedDuringLaunch = AndroidJNI.GetBooleanField(javaLastRunInfo, AndroidJNIHelper.GetFieldID(LastRunInfoClass, "crashedDuringLaunch")); - var lastRunInfo = new LastRunInfo - { - ConsecutiveLaunchCrashes = consecutiveLaunchCrashes, - Crashed = crashed, - CrashedDuringLaunch = crashedDuringLaunch - }; - return lastRunInfo; - } - - private IntPtr GetClientRef() - { - return CallNativeObjectMethodRef("getClient", "()Lcom/bugsnag/android/Client;", new object[] { }); - } - - public void AddFeatureFlag(string name, string variant) - { - object[] args = new object[] { name, variant }; - jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(args); - AndroidJNI.CallVoidMethod(GetClientRef(), AddFeatureFlagMethod, jargs); - } - - public void ClearFeatureFlag(string name) - { - object[] args = new object[] { name }; - jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(args); - AndroidJNI.CallVoidMethod(GetClientRef(), ClearFeatureFlagMethod, jargs); - } - - public void ClearFeatureFlags() - { - AndroidJNI.CallVoidMethod(GetClientRef(), ClearFeatureFlagsMethod, null); - } - - public void RegisterForOnSessionCallbacks() - { - if (_registeredForSessionCallbacks || _configuration == null) - { - return; - } - - var addOnSessionmethodId = AndroidJNI.GetMethodID(ClientClass, "addOnSession", "(Lcom/bugsnag/android/OnSessionCallback;)V"); - var callback = new OnSessionCallback(_configuration); - object[] args = new object[] { callback }; - jvalue[] jargs = AndroidJNIHelper.CreateJNIArgArray(args); - AndroidJNI.CallVoidMethod(GetClientRef(), addOnSessionmethodId, jargs); - _registeredForSessionCallbacks = true; - } - - } -} diff --git a/src/BugsnagUnity/Native/Android/NativePayloadClassWrapper.cs b/src/BugsnagUnity/Native/Android/NativePayloadClassWrapper.cs deleted file mode 100644 index 1664cd0bd..000000000 --- a/src/BugsnagUnity/Native/Android/NativePayloadClassWrapper.cs +++ /dev/null @@ -1,287 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativePayloadClassWrapper - { - - public AndroidJavaObject NativePointer; - - public NativePayloadClassWrapper(AndroidJavaObject nativePointer) - { - NativePointer = nativePointer; - } - - public string GetNativeString(string key) - { - return NativePointer.Call(key); - } - - public void SetNativeString(string key, string value) - { - NativePointer.Call(key, value); - } - - public int? GetNativeInt(string key) - { - var number = NativePointer.Call(key); - if (number == null) - { - return null; - } - return number.Call("intValue"); - } - - public void SetNativeInt(string key, int? value) - { - if (value == null) - { - NativePointer.Call(key, null); - } - else - { - var javaInteger = new AndroidJavaObject("java.lang.Integer", (int)value); - NativePointer.Call(key, javaInteger); - } - } - - public long? GetNativeLong(string key) - { - var number = NativePointer.Call(key); - if (number == null) - { - return null; - } - return number.Call("longValue"); - } - - public void SetNativeLong(string key, long? value) - { - if (value == null) - { - NativePointer.Call(key, null); - } - else - { - var javaInteger = new AndroidJavaObject("java.lang.Long", (long)value); - NativePointer.Call(key, javaInteger); - } - } - - public double? GetNativeDouble(string key) - { - var number = NativePointer.Call(key); - if (number == null) - { - return null; - } - return number.Call("doubleValue"); - } - - public void SetNativeDouble(string key, double? value) - { - if (value == null) - { - NativePointer.Call(key, null); - } - else - { - var javaInteger = new AndroidJavaObject("java.lang.Double", (double)value); - NativePointer.Call(key, javaInteger); - } - } - - public TimeSpan? GetNativeTimespan(string key) - { - var millis = GetNativeDouble(key); - if (millis == null) - { - return null; - } - return TimeSpan.FromMilliseconds((double)millis); - } - - public void SetNativeTimespan(string key, TimeSpan? value) - { - if (value == null) - { - NativePointer.Call(key, null); - } - else - { - SetNativeDouble(key,value.Value.TotalMilliseconds); - } - } - - public bool? GetNativeBool(string key) - { - var value = NativePointer.Call(key); - if (value == null) - { - return null; - } - else - { - return value.Call("booleanValue"); - } - } - - public void SetNativeBool(string key, bool? value) - { - if (value == null) - { - NativePointer.Call(key, null); - } - else - { - var javaBoolean = new AndroidJavaObject("java.lang.Boolean", (bool)value); - NativePointer.Call(key, javaBoolean); - } - } - - public string[] GetNativeStringArray(string key) - { - var array = NativePointer.Call(key); - if (array == null) - { - return null; - } - var arraysClass = new AndroidJavaClass("java.util.Arrays"); - - var list = arraysClass.CallStatic("asList",array); - - var iterator = list.Call("iterator"); - - var returnList = new List(); - - while (iterator.Call("hasNext")) - { - var next = iterator.Call("next"); - returnList.Add(next); - } - - return returnList.ToArray(); - - } - - public void SetNativeStringArray(string key, string[] value) - { - - if (value == null) - { - NativePointer.Call(key, null); - return; - } - - AndroidJavaClass arrayClass = new AndroidJavaClass("java.lang.reflect.Array"); - - AndroidJavaObject arrayObject = arrayClass.CallStatic("newInstance", new AndroidJavaClass("java.lang.String"), value.Length); - - for (int i = 0; i < value.Length; ++i) - { - arrayClass.CallStatic("set", arrayObject, i, new AndroidJavaObject("java.lang.String", value[i])); - } - NativePointer.Call(key, arrayObject); - - } - - private Dictionary GetDictFromNativeMap(AndroidJavaObject map) - { - var size = map.Call("size"); - if (size > 0) - { - var keys = map.Call("keySet"); - var iterator = keys.Call("iterator"); - var dict = new Dictionary(); - while (iterator.Call("hasNext")) - { - var next = iterator.Call("next"); - var theKey = next.Call("toString"); - var theValue = map.Call("get", theKey); - if (theValue != null) - { - var theValueString = theValue.Call("toString"); - dict.Add(theKey, theValueString); - } - else - { - dict.Add(theKey, null); - } - } - return dict; - } - return null; - } - - public Dictionary GetNativeDictionary(string key) - { - var map = NativePointer.Call(key); - if (map != null) - { - return GetDictFromNativeMap(map); - } - return null; - } - - public Dictionary GetNativeMetadataSection(string key, string section) - { - var map = NativePointer.Call(key,section); - if (map != null) - { - return GetDictFromNativeMap(map); - } - return null; - } - - public void SetNativeDictionary(string key,IDictionary dict) - { - using (var disposeableContainer = new DisposableContainer()) - { - var map = NativeInterface.DictionaryToJavaMap(dict, disposeableContainer); - NativePointer.Call(key, map); - } - } - - public void SetNativeMetadataSection(string key, string section, IDictionary dict) - { - using (var disposeableContainer = new DisposableContainer()) - { - var map = NativeInterface.DictionaryToJavaMap(dict, disposeableContainer); - NativePointer.Call(key, section, map); - } - } - - public DateTimeOffset? GetNativeDateTime(string key) - { - var nativeDate = NativePointer.Call(key); - - if (nativeDate == null) - { - return null; - } - - var timeStamp = nativeDate.Call("getTime"); - - var date = new DateTimeOffset(1970, 1, 1,0,0,0, TimeSpan.Zero).AddMilliseconds(timeStamp); - - return date; - } - - public void SetNativeDateTime(string key, DateTimeOffset? dateTime) - { - if (dateTime == null) - { - NativePointer.Call(key, null); - } - else - { - var mill = (dateTime - new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero)).Value.TotalMilliseconds; - var javaDate = new AndroidJavaObject("java.util.Date", (long)mill); - NativePointer.Call(key,javaDate); - } - } - - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeSession.cs b/src/BugsnagUnity/Native/Android/NativeSession.cs deleted file mode 100644 index e37166e5e..000000000 --- a/src/BugsnagUnity/Native/Android/NativeSession.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativeSession : NativePayloadClassWrapper, ISession - { - public NativeSession(AndroidJavaObject androidJavaObject) : base(androidJavaObject){} - - public string Id { get => GetNativeString("getId"); set => SetNativeString("setId",value); } - - public IDevice Device { get => new NativeDevice(NativePointer.Call("getDevice")); set { } } - - public IApp App { get => new NativeApp(NativePointer.Call("getApp")); set { } } - - public DateTimeOffset? StartedAt { get => GetNativeDateTime("getStartedAt"); set => SetNativeDateTime("setStartedAt",value); } - - public IUser GetUser() => new NativeUser(NativePointer.Call("getUser")); - - public void SetUser(string id, string email, string name) - { - NativePointer.Call("setUser",id,email,name); - } - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeStackFrame.cs b/src/BugsnagUnity/Native/Android/NativeStackFrame.cs deleted file mode 100644 index a5694eea2..000000000 --- a/src/BugsnagUnity/Native/Android/NativeStackFrame.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativeStackFrame : NativePayloadClassWrapper, IStackframe - { - public NativeStackFrame(AndroidJavaObject androidJavaObject) : base (androidJavaObject){} - - public string FrameAddress { get; set; } - public bool? IsLr { get; set; } - public bool? IsPc { get; set; } - public string MachoFile { get; set; } - public string MachoLoadAddress { get; set; } - public string MachoUuid { get; set; } - public string MachoVmAddress { get; set; } - public string Method { get => GetNativeString("getMethod"); set => SetNativeString("setMethod",value); } - public string SymbolAddress { get; set; } - public string File { get => GetNativeString("getFile"); set => SetNativeString("setFile", value); } - public bool? InProject { get => GetNativeBool("getInProject"); set => SetNativeBool("setInProject",value); } - public int? LineNumber { get => GetNativeInt("getLineNumber"); set => SetNativeInt("setLineNumber",value); } - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeThread.cs b/src/BugsnagUnity/Native/Android/NativeThread.cs deleted file mode 100644 index 4b79b01aa..000000000 --- a/src/BugsnagUnity/Native/Android/NativeThread.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativeThread : NativePayloadClassWrapper, IThread - { - public NativeThread(AndroidJavaObject androidJavaObject) : base(androidJavaObject){} - - public string Id { get => GetNativeString("getId"); set => SetNativeString("setId",value); } - - public bool? ErrorReportingThread => GetNativeBool("getErrorReportingThread"); - - public string Name { get => GetNativeString("getName"); set => SetNativeString("setName",value); } - - public List Stacktrace => GetStacktrace(); - - public string Type => NativePointer.Call("getType").Call("toString"); - - private List GetStacktrace() - { - var nativeList = NativePointer.Call("getStacktrace"); - if (nativeList == null) - { - return null; - } - var theStacktrace = new List(); - var iterator = nativeList.Call("iterator"); - while (iterator.Call("hasNext")) - { - var next = iterator.Call("next"); - theStacktrace.Add(new NativeStackFrame(next)); - } - return theStacktrace; - } - } -} diff --git a/src/BugsnagUnity/Native/Android/NativeUser.cs b/src/BugsnagUnity/Native/Android/NativeUser.cs deleted file mode 100644 index 8da59b172..000000000 --- a/src/BugsnagUnity/Native/Android/NativeUser.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class NativeUser : NativePayloadClassWrapper, IUser - { - public NativeUser(AndroidJavaObject androidJavaObject) : base (androidJavaObject){} - - public string Id => GetNativeString("getId"); - public string Name => GetNativeString("getName"); - public string Email => GetNativeString("getEmail"); - - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/Breadcrumbs.cs b/src/BugsnagUnity/Native/Cocoa/Breadcrumbs.cs deleted file mode 100644 index 864e39bb0..000000000 --- a/src/BugsnagUnity/Native/Cocoa/Breadcrumbs.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using AOT; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - class Breadcrumbs : IBreadcrumbs - { - internal Breadcrumbs() - { - } - - /// - /// Add a breadcrumb to the collection with the specified type and metadata - /// - /// - /// - /// - public void Leave(string message, Dictionary metadata, BreadcrumbType type) - { - Leave(new Breadcrumb(message, metadata, type)); - } - - public void Leave(Breadcrumb breadcrumb) - { - if (breadcrumb == null || string.IsNullOrEmpty(breadcrumb.Message)) - { - return; - } - - string metadataJson = null; - if (breadcrumb.Metadata != null) - { - using (var stream = new MemoryStream()) - using (var reader = new StreamReader(stream)) - using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) - { - SimpleJson.SerializeObject(breadcrumb.Metadata, writer); - writer.Flush(); - stream.Position = 0; - metadataJson = reader.ReadToEnd(); - } - } - NativeCode.bugsnag_addBreadcrumb(breadcrumb.Message, breadcrumb.Type.ToString().ToLowerInvariant(), metadataJson); - } - - public List Retrieve() - { - var breadcrumbs = new List(); - - var handle = GCHandle.Alloc(breadcrumbs); - - try - { - NativeCode.bugsnag_retrieveBreadcrumbs(GCHandle.ToIntPtr(handle), PopulateBreadcrumb); - } - finally - { - handle.Free(); - } - - return breadcrumbs; - } - - [MonoPInvokeCallback(typeof(NativeCode.BreadcrumbInformation))] - static void PopulateBreadcrumb(IntPtr instance, string message, string timestamp, string type, string metadataJson) - { - var handle = GCHandle.FromIntPtr(instance); - if (handle.Target is List breadcrumbs) - { - if (!string.IsNullOrEmpty(metadataJson)) - { - var metadata = ((JsonObject)SimpleJson.DeserializeObject(metadataJson)).GetDictionary(); - breadcrumbs.Add(new Breadcrumb(message, timestamp, type, metadata)); - } - else - { - breadcrumbs.Add(new Breadcrumb(message, timestamp, type, null)); - } - - - } - } - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeApp.cs b/src/BugsnagUnity/Native/Cocoa/NativeApp.cs deleted file mode 100644 index c10d2ac54..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeApp.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public class NativeApp : IApp - { - - private const string BINARY_ARCH_KEY = "binaryArch"; - private const string BUNDLE_VERSION_KEY = "bundleVersion"; - private const string CODE_BUNDLE_ID_KEY = "codeBundleId"; - private const string DSYM_UUID_KEY = "dsymUuid"; - private const string ID_KEY = "id"; - private const string RELEASE_STAGE_KEY = "releaseStage"; - private const string TYPE_KEY = "type"; - private const string VERSION_KEY = "version"; - - internal NativePayloadClassWrapper NativeWrapper; - - internal NativeApp(IntPtr nativeApp) - { - NativeWrapper = new NativePayloadClassWrapper(nativeApp); - } - - public string BuildUuid { get; set; } - public int? VersionCode { get; set; } - - public string BinaryArch { get => NativeWrapper.GetNativeString(BINARY_ARCH_KEY); set => NativeWrapper.SetNativeString(BINARY_ARCH_KEY, value); } - - public string BundleVersion { get => NativeWrapper.GetNativeString(BUNDLE_VERSION_KEY); set => NativeWrapper.SetNativeString(BUNDLE_VERSION_KEY,value); } - - public string CodeBundleId { get => NativeWrapper.GetNativeString(CODE_BUNDLE_ID_KEY); set => NativeWrapper.SetNativeString(CODE_BUNDLE_ID_KEY, value); } - - public string DsymUuid { get => NativeWrapper.GetNativeString(DSYM_UUID_KEY); set => NativeWrapper.SetNativeString(DSYM_UUID_KEY, value); } - - public string Id { get => NativeWrapper.GetNativeString(ID_KEY); set => NativeWrapper.SetNativeString(ID_KEY, value); } - - public string ReleaseStage { get => NativeWrapper.GetNativeString(RELEASE_STAGE_KEY); set => NativeWrapper.SetNativeString(RELEASE_STAGE_KEY, value); } - - public string Type { get => NativeWrapper.GetNativeString(TYPE_KEY); set => NativeWrapper.SetNativeString(TYPE_KEY, value); } - - public string Version { get => NativeWrapper.GetNativeString(VERSION_KEY); set => NativeWrapper.SetNativeString(VERSION_KEY, value); } - - - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeAppWithState.cs b/src/BugsnagUnity/Native/Cocoa/NativeAppWithState.cs deleted file mode 100644 index 51d6f8d17..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeAppWithState.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public class NativeAppWithState : NativeApp, IAppWithState - { - - private const string DURATION_KEY = "duration"; - private const string DURATION_IN_FOREGROUND_KEY = "durationInForeground"; - private const string IN_FOREGROUND_KEY = "inForeground"; - private const string IS_LAUNCHING_KEY = "isLaunching"; - - - public NativeAppWithState(IntPtr nativeAppWithState) : base(nativeAppWithState) - { - } - - public TimeSpan? Duration - { - get - { - var timestamp = NativeWrapper.GetNativeDouble(DURATION_KEY); - if (timestamp == null) - { - return null; - } - else - { - return TimeSpan.FromMilliseconds((double)timestamp); - } - } - set - { - if (value == null) - { - NativeWrapper.SetNativeDouble(DURATION_KEY, null); - } - else - { - NativeWrapper.SetNativeDouble(DURATION_KEY,(double)value?.TotalMilliseconds); - } - } - } - - public TimeSpan? DurationInForeground - { - get - { - var timestamp = NativeWrapper.GetNativeDouble(DURATION_IN_FOREGROUND_KEY); - if (timestamp == null) - { - return null; - } - else - { - return TimeSpan.FromMilliseconds((double)timestamp); - } - } - set - { - if (value == null) - { - NativeWrapper.SetNativeDouble(DURATION_IN_FOREGROUND_KEY, null); - } - else - { - NativeWrapper.SetNativeDouble(DURATION_IN_FOREGROUND_KEY, (double)value?.Milliseconds); - } - } - } - - public bool? InForeground { - get => NativeWrapper.GetNativeBool(IN_FOREGROUND_KEY); - set => NativeWrapper.SetNativeBool(IN_FOREGROUND_KEY,value); - } - - public bool? IsLaunching { - get => NativeWrapper.GetNativeBool(IS_LAUNCHING_KEY); - set => NativeWrapper.SetNativeBool(IS_LAUNCHING_KEY, value); - } - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeBreadcrumb.cs b/src/BugsnagUnity/Native/Cocoa/NativeBreadcrumb.cs deleted file mode 100644 index 77ba053bb..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeBreadcrumb.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using AOT; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public class NativeBreadcrumb : NativePayloadClassWrapper, IBreadcrumb - { - - private const string MESSAGE_KEY = "message"; - private const string TIMESTAMP_KEY = "timestamp"; - - public NativeBreadcrumb(IntPtr nativeBreadcrumb) : base(nativeBreadcrumb) - { - } - - public string Message { get => GetNativeString(MESSAGE_KEY); set => SetNativeString(MESSAGE_KEY, value); } - - public IDictionary Metadata { get => GetMetadata(); set => SetMetadata(value); } - - private IDictionary GetMetadata() - { - var result = NativeCode.bugsnag_getBreadcrumbMetadata(NativePointer); - var dictionary = ((JsonObject)SimpleJson.DeserializeObject(result)).GetDictionary(); - return dictionary; - } - - private void SetMetadata(IDictionary metadata) - { - using (var stream = new MemoryStream()) - using (var reader = new StreamReader(stream)) - using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) - { - SimpleJson.SerializeObject(metadata, writer); - writer.Flush(); - stream.Position = 0; - var jsonString = reader.ReadToEnd(); - NativeCode.bugsnag_setBreadcrumbMetadata(NativePointer, jsonString); - } - } - - public DateTimeOffset? Timestamp => GetNativeDate(TIMESTAMP_KEY); - - public BreadcrumbType Type { - get => Breadcrumb.ParseBreadcrumbType( NativeCode.bugsnag_getBreadcrumbType(NativePointer) ); - set => NativeCode.bugsnag_setBreadcrumbType(NativePointer, value.ToString().ToLowerInvariant()); - } - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeClient.cs b/src/BugsnagUnity/Native/Cocoa/NativeClient.cs deleted file mode 100644 index 7651db39c..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeClient.cs +++ /dev/null @@ -1,487 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using AOT; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - class NativeClient : INativeClient - { - public Configuration Configuration { get; } - public IBreadcrumbs Breadcrumbs { get; } - private static Session _nativeSession; - IntPtr NativeConfiguration { get; } - private static NativeClient _instance; - private bool _registeredForSessionCallbacks; - - public NativeClient(Configuration configuration) - { - _instance = this; - Configuration = configuration; - NativeConfiguration = CreateNativeConfig(configuration); - NativeCode.bugsnag_startBugsnagWithConfiguration(NativeConfiguration, NotifierInfo.NotifierVersion); - Breadcrumbs = new Breadcrumbs(); - } - - /** - * Transforms an IConfiguration C# object into a Cocoa Configuration object. - */ - IntPtr CreateNativeConfig(Configuration config) - { - IntPtr obj = NativeCode.bugsnag_createConfiguration(config.ApiKey); - NativeCode.bugsnag_setAutoNotifyConfig(obj, config.AutoDetectErrors); - NativeCode.bugsnag_setReleaseStage(obj, config.ReleaseStage); - NativeCode.bugsnag_setAppVersion(obj, config.AppVersion); - NativeCode.bugsnag_setEndpoints(obj, config.Endpoints.Notify.ToString(), config.Endpoints.Session.ToString()); - NativeCode.bugsnag_setMaxBreadcrumbs(obj, config.MaximumBreadcrumbs); - if (!string.IsNullOrEmpty(config.BundleVersion)) - { - NativeCode.bugsnag_setBundleVersion(obj, config.BundleVersion); - } - NativeCode.bugsnag_setAppType(obj, GetAppType(config)); - NativeCode.bugsnag_setPersistUser(obj,config.PersistUser); - NativeCode.bugsnag_setMaxPersistedEvents(obj, config.MaxPersistedEvents); - NativeCode.bugsnag_setMaxPersistedSessions(obj, config.MaxPersistedSessions); - NativeCode.bugsnag_setThreadSendPolicy(obj, Enum.GetName(typeof(ThreadSendPolicy), config.SendThreads)); - NativeCode.bugsnag_setAutoTrackSessions(obj, config.AutoTrackSessions); - NativeCode.bugsnag_setLaunchDurationMillis(obj, (ulong)config.LaunchDurationMillis); - NativeCode.bugsnag_setSendLaunchCrashesSynchronously(obj,config.SendLaunchCrashesSynchronously); - - if (config.GetOnSendErrorCallbacks() != null && config.GetOnSendErrorCallbacks().Count > 0) - { - NativeCode.bugsnag_registerForOnSendCallbacks(obj, HandleOnSendCallbacks); - } - - if (config.GetOnSessionCallbacks() != null && config.GetOnSessionCallbacks().Count > 0) - { - _registeredForSessionCallbacks = true; - NativeCode.bugsnag_registerForSessionCallbacks(obj, HandleSessionCallbacks); - } - - - - - NativeCode.bugsnag_setAppHangThresholdMillis(obj, config.AppHangThresholdMillis); - NativeCode.bugsnag_setMaxStringValueLength(obj, config.MaxStringValueLength); - AddFeatureFlagsToConfig(obj,config); - if (config.GetUser() != null) - { - var user = config.GetUser(); - NativeCode.bugsnag_setUserInConfig(obj, user.Id, user.Email, user.Name); - } - if (config.DiscardClasses != null && config.DiscardClasses.Count > 0) - { - var patternsAsStrings = new string[config.DiscardClasses.Count]; - foreach (var key in config.DiscardClasses) - { - patternsAsStrings[config.DiscardClasses.IndexOf(key)] = key.ToString(); - } - NativeCode.bugsnag_setDiscardClasses(obj, patternsAsStrings, patternsAsStrings.Length); - } - if (config.RedactedKeys != null && config.RedactedKeys.Count > 0) - { - var patternsAsStrings = new string[config.RedactedKeys.Count]; - foreach (var key in config.RedactedKeys) - { - patternsAsStrings[config.RedactedKeys.IndexOf(key)] = key.ToString(); - } - NativeCode.bugsnag_setRedactedKeys(obj, patternsAsStrings, patternsAsStrings.Length); - } - - SetEnabledTelemetryTypes(obj,config); - SetEnabledBreadcrumbTypes(obj,config); - SetEnabledErrorTypes(obj, config); - if (config.Context != null) - { - NativeCode.bugsnag_setContextConfig(obj, config.Context); - } - var releaseStages = config.EnabledReleaseStages; - if (releaseStages != null && releaseStages.Length > 0) - { - NativeCode.bugsnag_setNotifyReleaseStages(obj, releaseStages, releaseStages.Length); - } - return obj; - } - - private void AddFeatureFlagsToConfig(IntPtr obj, Configuration config) - { - if (config.FeatureFlags == null || config.FeatureFlags.Count == 0) - { - return; - } - foreach (DictionaryEntry entry in config.FeatureFlags) - { - NativeCode.bugsnag_addFeatureFlagOnConfig(obj, (string)entry.Key, (string)entry.Value); - } - } - - [MonoPInvokeCallback(typeof(Func))] - static bool HandleOnSendCallbacks(IntPtr nativeEvent) - { - var callbacks = _instance.Configuration.GetOnSendErrorCallbacks(); - if (callbacks.Count > 0) - { - var nativeEventWrapper = new NativeEvent(nativeEvent); - - foreach (var callback in callbacks) - { - try - { - if (!callback.Invoke(nativeEventWrapper)) - { - return false; - } - } - catch { - // If the callback causes an exception, ignore it and execute the next one - } - } - } - return true; - } - - [MonoPInvokeCallback(typeof(Func))] - static bool HandleSessionCallbacks(IntPtr nativeSession) - { - var callbacks = _instance.Configuration.GetOnSessionCallbacks(); - if (callbacks.Count > 0) - { - var nativeSessionWrapper = new NativeSession(nativeSession); - - foreach (var callback in callbacks) - { - try - { - if (!callback.Invoke(nativeSessionWrapper)) - { - return false; - } - } - catch { - // If the callback causes an exception, ignore it and execute the next one - } - } - } - return true; - } - - private string GetAppType(Configuration config) - { - if (!string.IsNullOrEmpty(config.AppType)) - { - return config.AppType; - } - switch (UnityEngine.Application.platform) - { - case UnityEngine.RuntimePlatform.OSXPlayer: - return "MacOS"; - case UnityEngine.RuntimePlatform.IPhonePlayer: - return "iOS"; - case UnityEngine.RuntimePlatform.tvOS: - return "tvOS"; - } - return string.Empty; - } - - private void SetEnabledBreadcrumbTypes(IntPtr obj, Configuration config) - { - if (config.EnabledBreadcrumbTypes == null) - { - NativeCode.bugsnag_setEnabledBreadcrumbTypes(obj, null, 0); - return; - } - var enabledTypes = new List(); - foreach (var enabledType in config.EnabledBreadcrumbTypes) - { - var typeName = Enum.GetName(typeof(BreadcrumbType), enabledType); - enabledTypes.Add(typeName); - } - NativeCode.bugsnag_setEnabledBreadcrumbTypes(obj, enabledTypes.ToArray(),enabledTypes.Count); - } - - private void SetEnabledTelemetryTypes(IntPtr obj, Configuration config) - { - if (config.Telemetry == null) - { - NativeCode.bugsnag_setEnabledTelemetryTypes(obj, null, 0); - return; - } - var enabledTypes = new List(); - foreach (var enabledType in config.Telemetry) - { - var typeName = Enum.GetName(typeof(TelemetryType), enabledType); - enabledTypes.Add(typeName); - } - NativeCode.bugsnag_setEnabledTelemetryTypes(obj, enabledTypes.ToArray(), enabledTypes.Count); - } - - private void SetEnabledErrorTypes(IntPtr obj, Configuration config) - { - var enabledTypes = new List(); - - if (config.EnabledErrorTypes.AppHangs) - { - enabledTypes.Add("AppHangs"); - } - if (config.EnabledErrorTypes.ThermalKills) - { - enabledTypes.Add("ThermalKills"); - } - if (config.EnabledErrorTypes.Crashes) - { - enabledTypes.Add("UnhandledExceptions"); - enabledTypes.Add("Signals"); - enabledTypes.Add("CppExceptions"); - enabledTypes.Add("MachExceptions"); - } - if (config.EnabledErrorTypes.OOMs) - { - enabledTypes.Add("OOMs"); - } - - NativeCode.bugsnag_setEnabledErrorTypes(obj, enabledTypes.ToArray(), enabledTypes.Count); - } - - public void PopulateApp(App app) - { - var result = NativeCode.bugsnag_retrieveAppData(); - var dictionary = ((JsonObject)SimpleJson.DeserializeObject(result)).GetDictionary(); - foreach (var pair in dictionary) - { - if (pair.Key == "isLaunching") - { - if (pair.Value != null) - { - var stringValue = (pair.Value as string).ToLower(); - app.Add(pair.Key, stringValue == "true"); - } - } - else - { - app.Add(pair.Key, pair.Value); - } - } - } - - public void PopulateAppWithState(AppWithState app) - { - PopulateApp(app); - } - - public void PopulateDevice(Device device) - { - var result = NativeCode.bugsnag_retrieveDeviceData(); - var dictionary = ((JsonObject)SimpleJson.DeserializeObject(result)).GetDictionary(); - foreach (var pair in dictionary) - { - if (pair.Key == "jailbroken") - { - if (pair.Value != null) - { - var stringValue = (pair.Value as string).ToLower(); - device.Add(pair.Key, stringValue == "true"); - } - } - else if (pair.Key == "osBuild") - { - device.RuntimeVersions.AddToPayload(pair.Key, pair.Value); - } - else - { - device.Add(pair.Key, pair.Value); - } - } - } - - public void PopulateDeviceWithState(DeviceWithState device) - { - PopulateDevice(device); - } - - public void PopulateUser(User user) - { - var nativeUser = new NativeUserVisitor(); - - NativeCode.bugsnag_populateUser(ref nativeUser); - - user.Id = Marshal.PtrToStringAuto(nativeUser.Id); - } - - public void SetUser(User user) - { - NativeCode.bugsnag_setUser(user.Id, user.Email, user.Name); - } - - public void SetContext(string context) - { - NativeCode.bugsnag_setContext(NativeConfiguration, context); - } - - public void MarkLaunchCompleted() - { - NativeCode.bugsnag_markLaunchCompleted(); - } - - public void StartSession() - { - NativeCode.bugsnag_startSession(); - } - - public void PauseSession() - { - NativeCode.bugsnag_pauseSession(); - } - - public bool ResumeSession() - { - return NativeCode.bugsnag_resumeSession(); - } - - public void UpdateSession(Session session) - { - if (session != null) - { - var startedAt = Convert.ToInt64((session.StartedAt?.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc))?.TotalSeconds); - NativeCode.bugsnag_registerSession(session.Id.ToString(), startedAt, session.UnhandledCount(), session.HandledCount()); - } - } - - public Session GetCurrentSession() - { - var session = new Session(); - var handle = GCHandle.Alloc(session); - try - { - NativeCode.bugsnag_retrieveCurrentSession(GCHandle.ToIntPtr(handle), PopulateSession); - } - finally - { - handle.Free(); - } - return _nativeSession; - } - - [MonoPInvokeCallback(typeof(NativeCode.SessionInformation))] - static void PopulateSession(IntPtr instance, string sessionId, string startedAt, int handled, int unhandled) - { - var handle = GCHandle.FromIntPtr(instance); - if (handle.Target is Session) - { - if (string.IsNullOrEmpty(sessionId) || sessionId == Guid.Empty.ToString()) - { - _nativeSession = null; - return; - } - var startTime = DateTimeOffset.Parse(startedAt); - _nativeSession = new Session(sessionId, startTime, handled, unhandled); - } - } - - public LastRunInfo GetLastRunInfo() - { - var lastRunInfo = new LastRunInfo(); - var handle = GCHandle.Alloc(lastRunInfo); - try - { - NativeCode.bugsnag_retrieveLastRunInfo(GCHandle.ToIntPtr(handle), PopulateLastRunInfo); - } - finally - { - handle.Free(); - } - return lastRunInfo; - } - - [MonoPInvokeCallback(typeof(Action))] - static void PopulateLastRunInfo(IntPtr instance, bool crashed, bool crashedDuringLaunch, int consecutiveLaunchCrashes) - { - var handle = GCHandle.FromIntPtr(instance); - if (handle.Target is LastRunInfo info) - { - info.Crashed = crashed; - info.CrashedDuringLaunch = crashedDuringLaunch; - info.ConsecutiveLaunchCrashes = consecutiveLaunchCrashes; - } - } - - public void ClearNativeMetadata(string section) - { - NativeCode.bugsnag_clearMetadata(section); - } - - public void ClearNativeMetadata(string section, string key) - { - NativeCode.bugsnag_clearMetadataWithKey(section,key); - } - - public void AddNativeMetadata(string section, IDictionary data) - { - if (data != null) - { - using (var stream = new MemoryStream()) - using (var reader = new StreamReader(stream)) - using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) - { - SimpleJson.SerializeObject(data, writer); - writer.Flush(); - stream.Position = 0; - var jsonString = reader.ReadToEnd(); - NativeCode.bugsnag_setMetadata(section, jsonString); - } - } - else - { - NativeCode.bugsnag_removeMetadata(NativeConfiguration, section); - } - } - - public IDictionary GetNativeMetadata() - { - var result = NativeCode.bugsnag_retrieveMetaData(); - var dictionary = ((JsonObject)SimpleJson.DeserializeObject(result)).GetDictionary(); - return dictionary; - } - - public void AddFeatureFlag(string name, string variant = null) - { - NativeCode.bugsnag_addFeatureFlag(name, variant); - } - - public void AddFeatureFlags(FeatureFlag[] featureFlags) - { - foreach (var flag in featureFlags) - { - AddFeatureFlag(flag.Name, flag.Variant); - } - } - - public void ClearFeatureFlag(string name) - { - NativeCode.bugsnag_clearFeatureFlag(name); - } - - public void ClearFeatureFlags() - { - NativeCode.bugsnag_clearFeatureFlags(); - } - - public bool ShouldAttemptDelivery() - { - return true; - } - - public void RegisterForOnSessionCallbacks() - { - if (_registeredForSessionCallbacks) - { - return; - } - _registeredForSessionCallbacks = true; - NativeCode.bugsnag_registerForSessionCallbacksAfterStart(HandleSessionCallbacks); - } - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeCode.cs b/src/BugsnagUnity/Native/Cocoa/NativeCode.cs deleted file mode 100644 index 6d61d39a5..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeCode.cs +++ /dev/null @@ -1,337 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace BugsnagUnity -{ - [StructLayout(LayoutKind.Sequential)] - struct NativeUserVisitor - { - public IntPtr Id; - public IntPtr Name; - public IntPtr Email; - } - - /// - /// A binary image that has been loaded into the process memory, - /// usually in the form of a dynamic library. - /// - /// - /// This MUST be declared as a struct, not a class. It's supposed to be possible - /// to declare it as a class, but you get all sorts of weird marshalling exceptions - /// if you do. - /// - /// Strings and byte arrays should in theory be directly marshallable, but my experience - /// has taught me that this feature is flaky at best. Better to just declare them as IntPtr - /// and marshal them manually in a wrapper class. - /// - [StructLayout(LayoutKind.Sequential)] - struct NativeLoadedImage - { - public UInt64 LoadAddress; - public UInt64 Size; - public IntPtr FileName; - public IntPtr UuidBytes; - } - - partial class NativeCode - { - /// - /// Get the number of native binary images (dynamic libraries) that are in memory right now. - /// - /// The number of loaded images - [DllImport(Import)] - internal static extern UInt64 bugsnag_getLoadedImageCount(); - - /// - /// Get the current list of native loaded binary images (dynamic libraries). - /// - /// An array of NativeLoadedImage structs that will be updated to contain the image data. - /// The number of entries in images. - /// The number of entries that were filled. - /// - /// Note: Array types MUST be declared as [In, Out] or else you'll get all sorts of weird issues, - /// like arrays being truncated to zero length, or a single entry being duplicated across the - /// entire array. The compiler won't complain, either. - /// - [DllImport(Import)] - internal static extern UInt64 bugsnag_getLoadedImages([In, Out] NativeLoadedImage[] images, UInt64 capacity); - - [DllImport(Import)] - internal static extern void bugsnag_startBugsnagWithConfiguration(IntPtr configuration, string notifierVersion); - - [DllImport(Import)] - internal static extern void bugsnag_setMetadata(string section, string jsonString); - - [DllImport(Import)] - internal static extern void bugsnag_removeMetadata(IntPtr configuration, string tab); - - [DllImport(Import)] - internal static extern string bugsnag_retrieveAppData(); - - [DllImport(Import)] - internal static extern void bugsnag_retrieveLastRunInfo(IntPtr instance, Action populate); - - [DllImport(Import)] - internal static extern string bugsnag_retrieveDeviceData(); - - [DllImport(Import)] - internal static extern void bugsnag_registerForOnSendCallbacks(IntPtr configuration, Func callback); - - [DllImport(Import)] - internal static extern void bugsnag_registerForSessionCallbacks(IntPtr configuration, Func callback); - - [DllImport(Import)] - internal static extern void bugsnag_registerForSessionCallbacksAfterStart(Func callback); - - internal delegate void SessionInformation(IntPtr instance, string sessionId, string startedAt, int handled, int unhandled); - [DllImport(Import)] - internal static extern void bugsnag_retrieveCurrentSession(IntPtr instance, SessionInformation callback); - - [DllImport(Import)] - internal static extern string bugsnag_retrieveMetaData(); - - [DllImport(Import)] - internal static extern void bugsnag_populateUser(ref NativeUserVisitor user); - - [DllImport(Import)] - internal static extern IntPtr bugsnag_createConfiguration(string apiKey); - - [DllImport(Import)] - internal static extern void bugsnag_setReleaseStage(IntPtr configuration, string releaseStage); - - [DllImport(Import)] - internal static extern void bugsnag_addFeatureFlagOnConfig(IntPtr configuration, string name, string variant); - - [DllImport(Import)] - internal static extern void bugsnag_addFeatureFlag(string name, string variant); - - [DllImport(Import)] - internal static extern void bugsnag_clearFeatureFlag(string name); - - [DllImport(Import)] - internal static extern void bugsnag_clearFeatureFlags(); - - [DllImport(Import)] - internal static extern void bugsnag_setAutoNotifyConfig(IntPtr configuration, bool autoNotify); - - [DllImport(Import)] - internal static extern void bugsnag_setAutoTrackSessions(IntPtr configuration, bool autoTrackSessions); - - [DllImport(Import)] - internal static extern void bugsnag_setPersistUser(IntPtr configuration, bool persistUser); - - [DllImport(Import)] - internal static extern void bugsnag_setSendLaunchCrashesSynchronously(IntPtr configuration, bool sendLaunchCrashesSynchronously); - - [DllImport(Import)] - internal static extern void bugsnag_setContext(IntPtr configuration, string context); - - [DllImport(Import)] - internal static extern void bugsnag_setMaxBreadcrumbs(IntPtr configuration, int maxBreadcrumbs); - - [DllImport(Import)] - internal static extern void bugsnag_setMaxStringValueLength(IntPtr configuration, int maxStringValueLength); - - [DllImport(Import)] - internal static extern void bugsnag_setLaunchDurationMillis(IntPtr configuration, ulong launchDurationMillis); - - [DllImport(Import)] - internal static extern void bugsnag_markLaunchCompleted(); - - [DllImport(Import)] - internal static extern void bugsnag_setMaxPersistedEvents(IntPtr configuration, int maxPersistedEvents); - - [DllImport(Import)] - internal static extern void bugsnag_setMaxPersistedSessions(IntPtr configuration, int maxPersistedSessions); - - [DllImport(Import)] - internal static extern void bugsnag_setAppHangThresholdMillis(IntPtr configuration, ulong appHangThresholdMillis); - - [DllImport(Import)] - internal static extern void bugsnag_setEnabledBreadcrumbTypes(IntPtr configuration, string[] types, int count); - - [DllImport(Import)] - internal static extern void bugsnag_setEnabledTelemetryTypes(IntPtr configuration, string[] types, int count); - - [DllImport(Import)] - internal static extern void bugsnag_setEnabledErrorTypes(IntPtr configuration, string[] types, int count); - - [DllImport(Import)] - internal static extern void bugsnag_setDiscardClasses(IntPtr configuration, string[] classNames, int count); - - [DllImport(Import)] - internal static extern void bugsnag_setUserInConfig(IntPtr configuration, string id, string email, string name); - - [DllImport(Import)] - internal static extern void bugsnag_setRedactedKeys(IntPtr configuration, string[] redactedKeys, int count); - - [DllImport(Import)] - internal static extern void bugsnag_setContextConfig(IntPtr configuration, string context); - - [DllImport(Import)] - internal static extern void bugsnag_setAppVersion(IntPtr configuration, string appVersion); - - [DllImport(Import)] - internal static extern void bugsnag_setBundleVersion(IntPtr configuration, string bundleVersion); - - [DllImport(Import)] - internal static extern void bugsnag_setThreadSendPolicy(IntPtr configuration, string threadSendPolicy); - - [DllImport(Import)] - internal static extern void bugsnag_setAppType(IntPtr configuration, string appType); - - [DllImport(Import)] - internal static extern void bugsnag_setEndpoints(IntPtr configuration, string notifyURL, string sessionsURL); - - internal delegate void NotifyReleaseStageCallback(IntPtr instance, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] string[] releaseStages, long count); - - [DllImport(Import)] - internal static extern void bugsnag_setNotifyReleaseStages(IntPtr configuration, string[] releaseStages, int count); - - [DllImport(Import)] - internal static extern void bugsnag_addBreadcrumb(string name, string type, string metadataJson); - - internal delegate void BreadcrumbInformation(IntPtr instance, string name, string timestamp, string type, string metadataJson); - - [DllImport(Import)] - internal static extern void bugsnag_retrieveBreadcrumbs(IntPtr instance, BreadcrumbInformation visitor); - - [DllImport(Import)] - internal static extern void bugsnag_setUser(string id, string email, string name); - - [DllImport(Import)] - internal static extern void bugsnag_startSession(); - - [DllImport(Import)] - internal static extern void bugsnag_pauseSession(); - - [DllImport(Import)] - internal static extern bool bugsnag_resumeSession(); - - [DllImport(Import)] - internal static extern void bugsnag_registerSession(string id, long startedAt, int unhandledCount, int handledCount); - - //Callback Getters and setters - - [DllImport(Import)] - internal static extern IntPtr bugsnag_getAppFromSession(IntPtr session); - - [DllImport(Import)] - internal static extern IntPtr bugsnag_getAppFromEvent(IntPtr @event); - - [DllImport(Import)] - internal static extern IntPtr bugsnag_getDeviceFromSession(IntPtr session); - - [DllImport(Import)] - internal static extern IntPtr bugsnag_getDeviceFromEvent(IntPtr @event); - - [DllImport(Import)] - internal static extern void bugsnag_setStringValue(IntPtr @object, string key, string value); - - [DllImport(Import)] - internal static extern string bugsnag_getValueAsString(IntPtr @object, string key); - - [DllImport(Import)] - internal static extern void bugsnag_setNumberValue(IntPtr @object, string key, string value); - - [DllImport(Import)] - internal static extern void bugsnag_setBoolValue(IntPtr @object, string key, string value); - - [DllImport(Import)] - internal static extern string bugsnag_getRuntimeVersionsFromDevice(IntPtr nativeDevice); - - [DllImport(Import)] - internal static extern string bugsnag_getErrorTypeFromError(IntPtr nativeError); - - [DllImport(Import)] - internal static extern string bugsnag_getThreadTypeFromThread(IntPtr nativeThread); - - [DllImport(Import)] - internal static extern void bugsnag_setRuntimeVersionsFromDevice(IntPtr nativeDevice, string[] versions, int count); - - [DllImport(Import)] - internal static extern double bugsnag_getTimestampFromDateInObject(IntPtr @object, string key); - - [DllImport(Import)] - internal static extern void bugsnag_setTimestampFromDateInObject(IntPtr @object, string key, double timeStamp); - - [DllImport(Import)] - internal static extern string bugsnag_getBreadcrumbType(IntPtr nativeBreadcrumb); - - [DllImport(Import)] - internal static extern void bugsnag_setBreadcrumbType(IntPtr nativeBreadcrumb, string type); - - [DllImport(Import)] - internal static extern void bugsnag_setBreadcrumbMetadata(IntPtr nativeBreadcrumb, string jsonString); - - [DllImport(Import)] - internal static extern string bugsnag_getBreadcrumbMetadata(IntPtr nativeBreadcrumb); - - internal delegate void EventBreadcrumbs(IntPtr breadcrumbList,[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] breadcrumbs, int breadcrumbsSize); - [DllImport(Import)] - internal static extern void bugsnag_getBreadcrumbsFromEvent(IntPtr @event, IntPtr breadcrumbList, EventBreadcrumbs visitor); - - internal delegate void EventErrors(IntPtr errorList, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] errors, int errorsSize); - [DllImport(Import)] - internal static extern void bugsnag_getErrorsFromEvent(IntPtr @event, IntPtr errorList, EventErrors visitor); - - internal delegate void ErrorStackframes(IntPtr stackframeList, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] stackframes, int stackframesSize); - [DllImport(Import)] - internal static extern void bugsnag_getStackframesFromError(IntPtr error, IntPtr stackframeList, ErrorStackframes visitor); - - [DllImport(Import)] - internal static extern void bugsnag_getStackframesFromThread(IntPtr error, IntPtr stackframeList, ErrorStackframes visitor); - - [DllImport(Import)] - internal static extern string bugsnag_getSeverityFromEvent(IntPtr nativeEvent); - - [DllImport(Import)] - internal static extern void bugsnag_setEventSeverity(IntPtr nativeEvent, string severity); - - internal delegate void EventThreads(IntPtr threadsList, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] nativeThreads, int nativeThreadsSize); - [DllImport(Import)] - internal static extern void bugsnag_getThreadsFromEvent(IntPtr @event, IntPtr threadsList, EventThreads visitor); - - [DllImport(Import)] - internal static extern IntPtr bugsnag_getUserFromEvent(IntPtr @event); - - [DllImport(Import)] - internal static extern IntPtr bugsnag_setUserFromEvent(IntPtr @event, string userId, string userEmail, string userName); - - [DllImport(Import)] - internal static extern IntPtr bugsnag_getUserFromSession(IntPtr session); - - [DllImport(Import)] - internal static extern IntPtr bugsnag_setUserFromSession(IntPtr session, string userId, string userEmail, string userName); - - [DllImport(Import)] - internal static extern void bugsnag_setEventMetadata(IntPtr @event, string tab, string metadataJson); - - [DllImport(Import)] - internal static extern void bugsnag_clearEventMetadataSection(IntPtr @event, string section); - - [DllImport(Import)] - internal static extern void bugsnag_clearEventMetadataWithKey(IntPtr @event, string section, string key); - - [DllImport(Import)] - internal static extern string bugsnag_getEventMetaData(IntPtr @event, string section); - - [DllImport(Import)] - internal static extern void bugsnag_clearMetadata(string section); - - [DllImport(Import)] - internal static extern void bugsnag_clearMetadataWithKey(string section, string key); - - [DllImport(Import)] - internal static extern void bugsnag_addFeatureFlagOnEvent(IntPtr @event, string name, string variant); - - [DllImport(Import)] - internal static extern void bugsnag_clearFeatureFlagOnEvent(IntPtr @event, string name); - - [DllImport(Import)] - internal static extern void bugsnag_clearFeatureFlagsOnEvent(IntPtr @event); - - [DllImport(Import)] - internal static extern string bugsnag_getFeatureFlagsFromEvent(IntPtr @event); - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeDevice.cs b/src/BugsnagUnity/Native/Cocoa/NativeDevice.cs deleted file mode 100644 index aac369c67..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeDevice.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace BugsnagUnity -{ - public class NativeDevice : IDevice - { - - private const string ID_KEY = "id"; - private const string JAIL_BROKEN_KEY = "jailbroken"; - private const string LOCALE_KEY = "locale"; - private const string MANUFACTURER_KEY = "manufacturer"; - private const string MODEL_KEY = "model"; - private const string OS_NAME_KEY = "osName"; - private const string OS_VERSION_KEY = "osVersion"; - private const string MODEL_NUMBER_KEY = "modelNumber"; - private const string TOTAL_MEMORY_KEY = "totalMemory"; - - internal NativePayloadClassWrapper NativeWrapper; - - public NativeDevice(IntPtr nativeDevice) - { - NativeWrapper = new NativePayloadClassWrapper(nativeDevice); - } - - public string BrowserName { get; set; } - public string BrowserVersion { get; set; } - public string[] CpuAbi { get; set; } - public long? TotalMemory {get => NativeWrapper.GetNativeLong(TOTAL_MEMORY_KEY); set => NativeWrapper.SetNativeLong(TOTAL_MEMORY_KEY, value); } - public string UserAgent { get; set; } - public string ModelNumber { get => NativeWrapper.GetNativeString(MODEL_NUMBER_KEY); set => NativeWrapper.SetNativeString(MODEL_NUMBER_KEY,value); } - public string Id { get => NativeWrapper.GetNativeString(ID_KEY); set => NativeWrapper.SetNativeString(ID_KEY,value); } - - public bool? Jailbroken { get => NativeWrapper.GetNativeBool(JAIL_BROKEN_KEY); set => NativeWrapper.SetNativeBool(JAIL_BROKEN_KEY, value); } - - public string Locale { get => NativeWrapper.GetNativeString(LOCALE_KEY); set => NativeWrapper.SetNativeString(LOCALE_KEY, value); } - - public string Manufacturer { get => NativeWrapper.GetNativeString(MANUFACTURER_KEY); set => NativeWrapper.SetNativeString(MANUFACTURER_KEY, value); } - - public string Model { get => NativeWrapper.GetNativeString(MODEL_KEY); set => NativeWrapper.SetNativeString(MODEL_KEY, value); } - - public string OsName { get => NativeWrapper.GetNativeString(OS_NAME_KEY); set => NativeWrapper.SetNativeString(OS_NAME_KEY, value); } - - public string OsVersion { get => NativeWrapper.GetNativeString(OS_VERSION_KEY); set => NativeWrapper.SetNativeString(OS_VERSION_KEY, value); } - - public IDictionary RuntimeVersions { get => GetRuntimeVersions(); set => SetRuntimeVersions(value); } - - - private IDictionary GetRuntimeVersions() - { - var versionsString = NativeCode.bugsnag_getRuntimeVersionsFromDevice(NativeWrapper.NativePointer); - var split = versionsString.Split('|').ToList(); - split.RemoveAt(split.Count - 1); - foreach (var str in split) - { - str.Replace("|",string.Empty); - } - var returnDict = new Dictionary(); - for (int i = 0; i < split.Count; i+=2) - { - returnDict.Add(split[i], split[i + 1]); - } - return returnDict; - } - - private void SetRuntimeVersions(IDictionary versions) - { - var stringVersions = new List(); - foreach (var item in versions) - { - stringVersions.Add(item.Key); - stringVersions.Add(item.Value.ToString()); - } - NativeCode.bugsnag_setRuntimeVersionsFromDevice(NativeWrapper.NativePointer, stringVersions.ToArray(), stringVersions.Count); - } - - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeDeviceWithState.cs b/src/BugsnagUnity/Native/Cocoa/NativeDeviceWithState.cs deleted file mode 100644 index 6d2863ff6..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeDeviceWithState.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public class NativeDeviceWithState : NativeDevice, IDeviceWithState - { - - private const string FREE_DISK_KEY = "freeDisk"; - private const string FREE_MEMORY_KEY = "freeMemory"; - private const string ORIENTATION_KEY = "orientation"; - private const string TIME_KEY = "time"; - - - public NativeDeviceWithState(IntPtr nativeDevice) : base(nativeDevice) - { - } - - public long? FreeDisk { get => NativeWrapper.GetNativeLong(FREE_DISK_KEY); set => NativeWrapper.SetNativeLong(FREE_DISK_KEY, value); } - - public long? FreeMemory { get => NativeWrapper.GetNativeLong(FREE_MEMORY_KEY); set => NativeWrapper.SetNativeLong(FREE_MEMORY_KEY, value); } - - public string Orientation { get => NativeWrapper.GetNativeString(ORIENTATION_KEY); set => NativeWrapper.SetNativeString(ORIENTATION_KEY,value); } - - public DateTimeOffset? Time { get => DateTimeOffset.Parse(NativeWrapper.GetNativeString(TIME_KEY)); set => NativeWrapper.SetNativeString(TIME_KEY, value?.ToString("o")); } - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeError.cs b/src/BugsnagUnity/Native/Cocoa/NativeError.cs deleted file mode 100644 index f69cad4ce..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeError.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using AOT; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public class NativeError : NativePayloadClassWrapper, IError - { - private const string ERROR_CLASS_KEY = "errorClass"; - private const string ERROR_MESSAGE_KEY = "errorMessage"; - - public NativeError(IntPtr nativeError) : base (nativeError) - { - var stacktraceHandle = GCHandle.Alloc(_stacktrace); - NativeCode.bugsnag_getStackframesFromError(nativeError, GCHandle.ToIntPtr(stacktraceHandle), GetStacktrace); - } - - public string ErrorClass { get => GetNativeString(ERROR_CLASS_KEY); set => SetNativeString(ERROR_CLASS_KEY,value); } - public string ErrorMessage { get => GetNativeString(ERROR_MESSAGE_KEY); set => SetNativeString(ERROR_MESSAGE_KEY, value); } - - public string Type { get => NativeCode.bugsnag_getErrorTypeFromError(NativePointer); } - - private List _stacktrace = new List(); - - public List Stacktrace => _stacktrace; - - [MonoPInvokeCallback(typeof(NativeCode.ErrorStackframes))] - private static void GetStacktrace(IntPtr instance, IntPtr[] stackframePointers, int count) - { - var handle = GCHandle.FromIntPtr(instance); - if (handle.Target is List stacktrace) - { - foreach (var pointer in stackframePointers) - { - stacktrace.Add(new NativeStackFrame(pointer)); - } - } - } - - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeEvent.cs b/src/BugsnagUnity/Native/Cocoa/NativeEvent.cs deleted file mode 100644 index dc4c12f17..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeEvent.cs +++ /dev/null @@ -1,225 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using AOT; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public class NativeEvent : NativePayloadClassWrapper, IEvent - { - - private const string CONTEXT_KEY = "context"; - private const string API_KEY_KEY = "apiKey"; - private const string GROUPING_HASH_KEY = "groupingHash"; - private const string UNHANDLED_KEY = "unhandled"; - - public string Context { get => GetNativeString(CONTEXT_KEY); set => SetNativeString(CONTEXT_KEY, value); } - - public IAppWithState App { get; set; } - - public IDeviceWithState Device { get; set; } - - public string ApiKey { get => GetNativeString(API_KEY_KEY); set => SetNativeString(API_KEY_KEY, value); } - - public string GroupingHash { get => GetNativeString(GROUPING_HASH_KEY); set => SetNativeString(GROUPING_HASH_KEY, value); } - - public bool Unhandled { - get { - var nativeBool = GetNativeBool(UNHANDLED_KEY); - return nativeBool.HasValue ? nativeBool.Value : false; - } - set => SetNativeBool(UNHANDLED_KEY, value); - } - - private List _breadcrumbs = new List(); - - public ReadOnlyCollection Breadcrumbs => new ReadOnlyCollection(_breadcrumbs); - - private List _errors = new List(); - - public List Errors => _errors; - - public Severity Severity { get => GetSeverityFromEvent(); set => NativeCode.bugsnag_setEventSeverity(NativePointer, value.ToString().ToLowerInvariant()); } - - private List _threads = new List(); - - public List Threads => _threads; - - private IUser _user; - - public NativeEvent(IntPtr nativeEvent) : base(nativeEvent) - { - App = new NativeAppWithState(NativeCode.bugsnag_getAppFromEvent(nativeEvent)); - Device = new NativeDeviceWithState(NativeCode.bugsnag_getDeviceFromEvent(nativeEvent)); - - var breadcrumbHandle = GCHandle.Alloc(_breadcrumbs); - NativeCode.bugsnag_getBreadcrumbsFromEvent(nativeEvent, GCHandle.ToIntPtr(breadcrumbHandle), GetBreadcrumbs); - - var errorsHandle = GCHandle.Alloc(_errors); - NativeCode.bugsnag_getErrorsFromEvent(nativeEvent, GCHandle.ToIntPtr(errorsHandle), GetErrors); - - var threadsHandle = GCHandle.Alloc(_threads); - NativeCode.bugsnag_getThreadsFromEvent(nativeEvent, GCHandle.ToIntPtr(threadsHandle), GetThreads); - - _user = new NativeUser(NativeCode.bugsnag_getUserFromEvent(nativeEvent)); - } - - private Severity GetSeverityFromEvent() - { - var stringValue = NativeCode.bugsnag_getSeverityFromEvent(NativePointer); - if (stringValue == "error") - { - return Severity.Error; - } - if (stringValue == "warning") - { - return Severity.Warning; - } - return Severity.Info; - } - - [MonoPInvokeCallback(typeof(NativeCode.EventBreadcrumbs))] - private static void GetBreadcrumbs(IntPtr instance, IntPtr[] breadcrumbPointers, int count) - { - var handle = GCHandle.FromIntPtr(instance); - if (handle.Target is List breadcrumbs) - { - foreach (var pointer in breadcrumbPointers) - { - breadcrumbs.Add(new NativeBreadcrumb(pointer)); - } - } - } - - [MonoPInvokeCallback(typeof(NativeCode.EventErrors))] - private static void GetErrors(IntPtr instance, IntPtr[] errorPointers, int count) - { - var handle = GCHandle.FromIntPtr(instance); - if (handle.Target is List errors) - { - foreach (var pointer in errorPointers) - { - errors.Add(new NativeError(pointer)); - } - } - - } - - [MonoPInvokeCallback(typeof(NativeCode.EventThreads))] - private static void GetThreads(IntPtr instance, IntPtr[] threadPointers, int count) - { - var handle = GCHandle.FromIntPtr(instance); - if (handle.Target is List threads) - { - foreach (var pointer in threadPointers) - { - threads.Add(new NativeThread(pointer)); - } - } - } - - public IUser GetUser() - { - return _user; - } - - public void SetUser(string id, string email, string name) - { - NativeCode.bugsnag_setUserFromEvent(NativePointer, id, email, name); - } - - public void AddMetadata(string section, string key, object value) - { - var metadataSection = new Dictionary() { - { key, value } - }; - AddMetadata(section, metadataSection); - } - - public void AddMetadata(string section, IDictionary metadata) - { - - if (metadata != null) - { - using (var stream = new MemoryStream()) - using (var reader = new StreamReader(stream)) - using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) - { - SimpleJson.SerializeObject(metadata, writer); - writer.Flush(); - stream.Position = 0; - var jsonString = reader.ReadToEnd(); - NativeCode.bugsnag_setEventMetadata(NativePointer, section, jsonString); - } - } - else - { - NativeCode.bugsnag_clearEventMetadataSection(NativePointer, section); - } - } - - public void ClearMetadata(string section) => NativeCode.bugsnag_clearEventMetadataSection(NativePointer, section); - - public void ClearMetadata(string section, string key) => NativeCode.bugsnag_clearEventMetadataWithKey(NativePointer, section, key); - - public object GetMetadata(string section, string key) - { - var metadata = GetMetadata(section); - foreach (var item in metadata) - { - if (item.Key == key) - { - return item.Value; - } - } - return null; - } - - public IDictionary GetMetadata(string section) - { - var result = NativeCode.bugsnag_getEventMetaData(NativePointer, section); - var dictionary = ((JsonObject)SimpleJson.DeserializeObject(result)).GetDictionary(); - return dictionary; - } - - public void AddFeatureFlag(string name, string variant = null) - { - NativeCode.bugsnag_addFeatureFlagOnEvent(NativePointer, name, variant); - } - - public void AddFeatureFlags(FeatureFlag[] featureFlags) - { - foreach (var flag in featureFlags) - { - AddFeatureFlag(flag.Name, flag.Variant); - } - } - - public void ClearFeatureFlag(string name) - { - NativeCode.bugsnag_clearFeatureFlagOnEvent(NativePointer, name); - } - - public void ClearFeatureFlags() - { - NativeCode.bugsnag_clearFeatureFlagsOnEvent(NativePointer); - } - - public ReadOnlyCollection FeatureFlags - { - get - { - var jsonString = NativeCode.bugsnag_getFeatureFlagsFromEvent(NativePointer); - var jsonArray = (JsonArray)SimpleJson.DeserializeObject(jsonString); - var objects = jsonArray.Select((item) - => new FeatureFlag(((JsonObject)item).GetDictionary())); - return new ReadOnlyCollection(objects.ToList()); - } - } - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeImage.cs b/src/BugsnagUnity/Native/Cocoa/NativeImage.cs deleted file mode 100644 index 4dac8894d..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeImage.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Collections; -using System.Runtime.InteropServices; - -namespace BugsnagUnity -{ - /// - /// Wraps a NativeLoadedImage to provide automatic and lazy marshaling from the native side. - /// - /// - /// We generally don't need the name and UUID except in specific cases, so we unmarshal - /// them lazily. - /// - class LoadedImage - { - public UInt64 LoadAddress - { - get => Image.LoadAddress; - } - public UInt64 Size - { - get => Image.Size; - } - public string FileName - { - get - { - if (CachedFileName == null) - { - CachedFileName = Marshal.PtrToStringAnsi(Image.FileName); - } - return CachedFileName; - } - } - public string Uuid - { - get - { - if (CachedUuid == null) - { - var uuid = new byte[16]; - Marshal.Copy(Image.UuidBytes, uuid, 0, 16); - CachedUuid = new Guid(uuid).ToString(); - } - return CachedUuid; - } - } - - public LoadedImage(NativeLoadedImage image) - { - Image = image; - } - - private NativeLoadedImage Image; - private string CachedFileName; - private string CachedUuid; - } - - class LoadedImages - { - /// - /// Refresh the list of loaded images to match what the native side currently says. - /// - /// - /// Note: You MUST call this at least once before using an instance of this class! - /// - public void Refresh() - { - // Ask for the current count * 2 in case new images get added between calls - var nativeImages = new NativeLoadedImage[NativeCode.bugsnag_getLoadedImageCount() * 2]; - var count = NativeCode.bugsnag_getLoadedImages(nativeImages, (UInt64)nativeImages.LongLength); - var images = new LoadedImage[count]; - for (UInt64 i = 0; i < count; i++) - { - images[i] = new LoadedImage(nativeImages[i]); - } - Images = images; - } - - /// - /// Find the native loaded image that corresponds to a native instruction address - /// supplied by il2cpp_native_stack_trace(). - /// - /// The address to find the corresponding image of - /// The corresponding image, or null - public LoadedImage FindImageAtAddress(UInt64 address) - { - int idx = Array.BinarySearch(Images, address, new AddressToImageComparator()); - if (idx < 0) - { - return null; - } - return Images[idx]; - } - - /// - /// The currently loaded images, as of the last call to Refresh(). - /// - public LoadedImage[] Images; - - private class AddressToImageComparator : IComparer - { - int IComparer.Compare(Object x, Object y) - { - LoadedImage image = (LoadedImage)x; - UInt64 address = (UInt64)y; - if (address < image.LoadAddress) - { - return 1; - } - if (address > image.LoadAddress + image.Size) - { - return -1; - } - return 0; - } - } - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativePayloadClassWrapper.cs b/src/BugsnagUnity/Native/Cocoa/NativePayloadClassWrapper.cs deleted file mode 100644 index 4bb2ab9bd..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativePayloadClassWrapper.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -namespace BugsnagUnity -{ - public class NativePayloadClassWrapper - { - internal IntPtr NativePointer; - - public NativePayloadClassWrapper(IntPtr nativePointer) - { - NativePointer = nativePointer; - } - - internal string GetNativeString(string key) - { - return NativeCode.bugsnag_getValueAsString(NativePointer, key); - } - - internal void SetNativeString(string key, string value) - { - if (value == null) - { - value = string.Empty; - } - NativeCode.bugsnag_setStringValue(NativePointer, key, value); - } - - internal bool? GetNativeBool(string key) - { - var result = NativeCode.bugsnag_getValueAsString(NativePointer, key).ToLower(); - if (result == null) - { - return null; - } - return result == "1" || result == "true"; - } - - internal void SetNativeBool(string name, bool? value) - { - var stringValue = value == null ? "null" : value.ToString(); - NativeCode.bugsnag_setBoolValue(NativePointer, name, stringValue); - } - - internal double? GetNativeDouble(string key) - { - var value = NativeCode.bugsnag_getValueAsString(NativePointer, key); - - if (value == null) - { - return null; - } - else - { - return double.Parse(value); - } - } - - internal void SetNativeDouble(string key, double? value) - { - NativeCode.bugsnag_setNumberValue(NativePointer,key,value == null ? "null" : value.ToString()); - } - - internal long? GetNativeLong(string key) - { - var value = NativeCode.bugsnag_getValueAsString(NativePointer, key); - - if (value == null) - { - return null; - } - else - { - return long.Parse(value); - } - } - - internal void SetNativeLong(string key, long? value) - { - NativeCode.bugsnag_setNumberValue(NativePointer, key, value == null ? "null" : value.ToString()); - } - - internal DateTimeOffset? GetNativeDate(string key) - { - var timeStamp = NativeCode.bugsnag_getTimestampFromDateInObject(NativePointer, key); - if (timeStamp < 0) - { - return null; - } - else - { - DateTimeOffset dateTime = new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero); - dateTime = dateTime.AddSeconds(timeStamp); - return dateTime; - } - } - - internal void SetNativeDate(DateTimeOffset? startedAt,string key) - { - if (startedAt == null) - { - NativeCode.bugsnag_setTimestampFromDateInObject(NativePointer, key, -1); - } - else - { - var dateTime = startedAt.Value - new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero); - NativeCode.bugsnag_setTimestampFromDateInObject(NativePointer, key, dateTime.TotalSeconds); - } - } - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeSession.cs b/src/BugsnagUnity/Native/Cocoa/NativeSession.cs deleted file mode 100644 index a52294ea1..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeSession.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - internal class NativeSession : NativePayloadClassWrapper, ISession - { - - private const string ID_KEY = "id"; - private const string STARTED_AT_KEY = "startedAt"; - - public NativeSession(IntPtr nativeSession) : base(nativeSession) - { - App = new NativeApp(NativeCode.bugsnag_getAppFromSession(nativeSession)); - Device = new NativeDevice(NativeCode.bugsnag_getDeviceFromSession(nativeSession)); - _nativeUser = new NativeUser(NativeCode.bugsnag_getUserFromSession(nativeSession)); - } - - public string Id { - get => GetNativeString(ID_KEY); - set => SetNativeString(ID_KEY, value); - } - - public IApp App { get; set; } - - public IDevice Device { get; set; } - - public DateTimeOffset? StartedAt { get => GetNativeDate(STARTED_AT_KEY); set => SetNativeDate(value, STARTED_AT_KEY); } - - private NativeUser _nativeUser; - - public IUser GetUser() => _nativeUser; - - public void SetUser(string id, string email, string name) - { - NativeCode.bugsnag_setUserFromSession(NativePointer, id, email, name); - } - } -} \ No newline at end of file diff --git a/src/BugsnagUnity/Native/Cocoa/NativeStackFrame.cs b/src/BugsnagUnity/Native/Cocoa/NativeStackFrame.cs deleted file mode 100644 index fb1767cf4..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeStackFrame.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public class NativeStackFrame : NativePayloadClassWrapper, IStackframe - { - - private const string FRAME_ADDRESS_KEY = "frameAddress"; - private const string IS_LR_KEY = "isLr"; - private const string IS_PC_KEY = "isPc"; - private const string MACHO_FILE_KEY = "machoFile"; - private const string MACHO_LOAD_ADDRESS = "machoLoadAddress"; - private const string MACHO_UUID_KEY = "machoUuid"; - private const string MACHO_VM_ADDRESS = "machoVmAddress"; - private const string METHOD_KEY = "method"; - private const string SYMBOL_ADDRESS_KEY = "symbolAddress"; - - public NativeStackFrame(IntPtr nativeFrame) : base (nativeFrame) - { - } - - public string FrameAddress { get => GetNativeString(FRAME_ADDRESS_KEY); set => SetNativeString(FRAME_ADDRESS_KEY,value); } - - public bool? IsLr { get => GetNativeBool(IS_LR_KEY); set => SetNativeBool(IS_LR_KEY, value); } - - public bool? IsPc { get => GetNativeBool(IS_PC_KEY); set => SetNativeBool(IS_PC_KEY, value); } - - public string MachoFile { get => GetNativeString(MACHO_FILE_KEY); set => SetNativeString(MACHO_FILE_KEY, value); } - - public string MachoLoadAddress { get => GetNativeString(MACHO_LOAD_ADDRESS); set => SetNativeString(MACHO_LOAD_ADDRESS, value); } - - public string MachoUuid { get => GetNativeString(MACHO_UUID_KEY); set => SetNativeString(MACHO_UUID_KEY, value); } - - public string MachoVmAddress { get => GetNativeString(MACHO_VM_ADDRESS); set => SetNativeString(MACHO_VM_ADDRESS, value); } - - public string Method { get => GetNativeString(METHOD_KEY); set => SetNativeString(METHOD_KEY, value); } - - public string SymbolAddress { get => GetNativeString(SYMBOL_ADDRESS_KEY); set => SetNativeString(SYMBOL_ADDRESS_KEY, value); } - - public string File { get; set; } - - public bool? InProject { get; set; } - - public int? LineNumber { get; set; } - - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeThread.cs b/src/BugsnagUnity/Native/Cocoa/NativeThread.cs deleted file mode 100644 index fdfa4577d..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeThread.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using AOT; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public class NativeThread : NativePayloadClassWrapper , IThread - { - - private const string ID_KEY = "id"; - private const string ERROR_REPORTING_THREAD_KEY = "errorReportingThread"; - private const string NAME_KEY = "name"; - - public NativeThread(IntPtr nativePointer) : base(nativePointer) - { - var stacktraceHandle = GCHandle.Alloc(_stacktrace); - NativeCode.bugsnag_getStackframesFromThread(nativePointer, GCHandle.ToIntPtr(stacktraceHandle), GetStacktrace); - } - - public string Type { get => NativeCode.bugsnag_getThreadTypeFromThread(NativePointer); } - - public string Id { get => GetNativeString(ID_KEY); set => SetNativeString(ID_KEY, value); } - - public bool? ErrorReportingThread => GetNativeBool(ERROR_REPORTING_THREAD_KEY); - - public string Name { get => GetNativeString(NAME_KEY); set => SetNativeString(NAME_KEY, value); } - - private List _stacktrace = new List(); - - public List Stacktrace => _stacktrace; - - [MonoPInvokeCallback(typeof(NativeCode.ErrorStackframes))] - private static void GetStacktrace(IntPtr instance, IntPtr[] stackframePointers, int count) - { - var handle = GCHandle.FromIntPtr(instance); - if (handle.Target is List stacktrace) - { - foreach (var pointer in stackframePointers) - { - stacktrace.Add(new NativeStackFrame(pointer)); - } - } - } - } -} diff --git a/src/BugsnagUnity/Native/Cocoa/NativeUser.cs b/src/BugsnagUnity/Native/Cocoa/NativeUser.cs deleted file mode 100644 index d65902e00..000000000 --- a/src/BugsnagUnity/Native/Cocoa/NativeUser.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -namespace BugsnagUnity -{ - public class NativeUser : NativePayloadClassWrapper, IUser - { - - private const string ID_KEY = "id"; - private const string NAME_KEY = "name"; - private const string EMAIL_KEY = "name"; - - - public NativeUser(IntPtr nativeUser) : base (nativeUser) - { - } - - public string Id => GetNativeString(ID_KEY); - public string Name => GetNativeString(NAME_KEY); - public string Email => GetNativeString(EMAIL_KEY); - } -} diff --git a/src/BugsnagUnity/Native/Fallback/Breadcrumbs.cs b/src/BugsnagUnity/Native/Fallback/Breadcrumbs.cs deleted file mode 100644 index 018199a62..000000000 --- a/src/BugsnagUnity/Native/Fallback/Breadcrumbs.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - class Breadcrumbs : IBreadcrumbs - { - readonly object _lock = new object(); - Configuration Configuration { get; } - LinkedList _breadcrumbs; - - /// - /// Constructs a collection of breadcrumbs - /// - /// - internal Breadcrumbs(Configuration configuration) - { - Configuration = configuration; - _breadcrumbs = new LinkedList(); - } - - /// - /// Add a breadcrumb to the collection with the specified type and metadata - /// - public void Leave(string message, Dictionary metadata,BreadcrumbType type ) - { - Leave(new Breadcrumb(message, metadata, type)); - } - - public void Leave(Breadcrumb breadcrumb) - { - if (Configuration.MaximumBreadcrumbs == 0 || breadcrumb == null || string.IsNullOrEmpty(breadcrumb.Message)) - { - return; - } - // Clone the metadata to prevent thread related exceptions - breadcrumb.Metadata = breadcrumb.Metadata.ToDictionary(entry => entry.Key, entry => entry.Value); - lock (_lock) - { - - if (_breadcrumbs.Count >= Configuration.MaximumBreadcrumbs) - { - _breadcrumbs.RemoveFirst(); - } - - _breadcrumbs.AddLast(breadcrumb); - } - } - - /// - /// Retrieve the collection of breadcrumbs at this point in time. - /// - /// - public List Retrieve() - { - lock (_lock) - { - return _breadcrumbs.ToList(); - } - } - - - } -} diff --git a/src/BugsnagUnity/Native/Fallback/CacheManager.cs b/src/BugsnagUnity/Native/Fallback/CacheManager.cs deleted file mode 100644 index ee44eb663..000000000 --- a/src/BugsnagUnity/Native/Fallback/CacheManager.cs +++ /dev/null @@ -1,298 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class CacheManager : ICacheManager - { - - private static Configuration _configuration; - - private static string _cacheDirectory - { - get { return Application.persistentDataPath + "/Bugsnag"; } - } - - private static string _sessionsDirectory - { - get { return _cacheDirectory + "/Sessions"; } - } - - private static string _eventsDirectory - { - get { return _cacheDirectory + "/Events"; } - } - - private static string _deviceIdFile = _cacheDirectory + "/deviceId.txt"; - - private const string SESSION_FILE_SUFFIX = ".session"; - - private const string EVENT_FILE_SUFFIX = ".event"; - - private const int MAX_CACHED_DAYS = 60; - - - - public CacheManager(Configuration configuration) - { - _configuration = configuration; - CheckForDirectoryCreation(); - RemoveExpiredPayloads(); - } - - private string[] GetCachedEventFiles() - { - return GetFilesBySuffix(_eventsDirectory, EVENT_FILE_SUFFIX); - } - - private string[] GetCachedSessionFiles() - { - - return GetFilesBySuffix(_sessionsDirectory,SESSION_FILE_SUFFIX); - } - - private string[] GetFilesBySuffix(string path, string suffix) - { - try - { - var files = Directory.GetFiles(path, "*" + suffix); - return files; - } - catch - { - return new string[] { }; - } - } - - public string GetCachedDeviceId() - { - - if (!_configuration.GenerateAnonymousId) - { - return string.Empty; - } - try - { - if (File.Exists(_deviceIdFile)) - { - // return existing cached device id - return File.ReadAllText(_deviceIdFile); - } - - // create and cache new random device id - var newDeviceId = Guid.NewGuid().ToString(); - SaveDeviceIdToCache(newDeviceId); - return newDeviceId; - } - catch - { - // not possible in unit tests - return string.Empty; - } - - } - - public void SaveDeviceIdToCache(string deviceId) - { - WriteFile(_deviceIdFile, deviceId); - } - - private void RemoveExpiredPayloads() - { - var files = GetCachedEventFiles().ToList(); - files.AddRange(GetCachedSessionFiles()); - foreach (var file in files) - { - try - { - var creationTime = File.GetCreationTimeUtc(file); - if ((DateTime.UtcNow - creationTime).TotalDays > MAX_CACHED_DAYS) - { - Debug.LogWarning("Bugsnag Warning: Discarding historical event from " + creationTime.ToLongDateString() + " after failed delivery"); - File.Delete(file); - } - } - catch { } - } - } - - public void SaveSessionToCache(string id,string json) - { - var path = _sessionsDirectory + "/" + id + SESSION_FILE_SUFFIX; - WritePayloadToDisk(json, path); - CheckForMaxCachedPayloads(GetCachedSessionFiles(), _configuration.MaxPersistedSessions); - } - - public void SaveEventToCache(string id, string json) - { - var path = _eventsDirectory + "/" + id + EVENT_FILE_SUFFIX; - WritePayloadToDisk(json, path); - CheckForMaxCachedPayloads(GetCachedEventFiles(), _configuration.MaxPersistedEvents); - } - - private void WritePayloadToDisk(string jsonData, string path) - { - WriteFile(path, jsonData); - } - - private void CheckForMaxCachedPayloads(string[] payloads, int maxPayloads) - { - if (payloads.Length > maxPayloads) - { - RemoveOldestFiles(payloads, payloads.Length - maxPayloads); - } - } - - private void RemoveOldestFiles(string[] filePaths, int numToRemove) - { - var ordered = filePaths.OrderBy(file => File.GetCreationTimeUtc(file)).ToArray(); - foreach (var file in ordered.Take(numToRemove)) - { - DeleteFile(file); - } - } - - public void RemoveCachedEvent(string id) - { - RemovePayloadWithID(GetCachedEventFiles(), id); - } - - public void RemoveCachedSession(string id) - { - RemovePayloadWithID(GetCachedSessionFiles(), id); - } - - private void RemovePayloadWithID(string[] files, string id) - { - foreach (var path in files) - { - if (path.Contains(id)) - { - DeleteFile(path); - return; - } - } - } - - private void DeleteFile(string path) - { - try - { - File.Delete(path); - }catch{} - } - - private void WriteFile(string path, string data) - { - // not using File.WriteAllText to avoid under the hood buffering. We want the file to be written immediately to avoid truncation in case of a crash - try - { - var file = File.Create(path); - file.Write(System.Text.Encoding.UTF8.GetBytes(data), 0, data.Length); - file.Flush(); - file.Close(); - }catch { } - } - - private string GetJsonFromCachePath(string path) - { - try { - if (File.Exists(path)) - { - return File.ReadAllText(path); - } - } catch { } - return null; - } - - private static void CheckForDirectoryCreation() - { - try - { - if (!Directory.Exists(_cacheDirectory)) - { - Directory.CreateDirectory(_cacheDirectory); - } - if (!Directory.Exists(_sessionsDirectory)) - { - Directory.CreateDirectory(_sessionsDirectory); - } - if (!Directory.Exists(_eventsDirectory)) - { - Directory.CreateDirectory(_eventsDirectory); - } - } - catch - { - //not possible in unit tests - } - - } - - public List GetCachedEventIds() - { - return GetPayloadIDsFromDirectory(GetCachedEventFiles()); - } - - public List GetCachedSessionIds() - { - return GetPayloadIDsFromDirectory(GetCachedSessionFiles()); - } - - private List GetPayloadIDsFromDirectory(string[] files) - { - var names = new List(); - var ordered = GetCreationOrderedFiles(files); - foreach (var path in ordered) - { - try - { - names.Add(Path.GetFileNameWithoutExtension(path)); - } - catch { } - } - return names; - } - - private string[] GetCreationOrderedFiles(string[] files) - { - try - { - var orderedFiles = files.OrderBy(file => File.GetCreationTimeUtc(file)).ToArray(); - return orderedFiles; - } - catch - { - return new string[] { }; - } - } - - public string GetCachedEvent(string id) - { - foreach (var path in GetCachedEventFiles()) - { - if (path.Contains(id)) - { - return GetJsonFromCachePath(path); - } - } - return null; - } - - public string GetCachedSession(string id) - { - foreach (var path in GetCachedSessionFiles()) - { - if (path.Contains(id)) - { - return GetJsonFromCachePath(path); - } - } - return null; - } - } -} diff --git a/src/BugsnagUnity/Native/Fallback/NativeClient.cs b/src/BugsnagUnity/Native/Fallback/NativeClient.cs deleted file mode 100644 index fad9b85e7..000000000 --- a/src/BugsnagUnity/Native/Fallback/NativeClient.cs +++ /dev/null @@ -1,173 +0,0 @@ -using BugsnagUnity.Payload; -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using UnityEngine; - -namespace BugsnagUnity -{ - class NativeClient : INativeClient, IFeatureFlagStore - { - public Configuration Configuration { get; } - - public IBreadcrumbs Breadcrumbs { get; } - - private bool _launchMarkedAsCompleted = false; - - private bool _hasReceivedLowMemoryWarning = false; - - private Metadata _fallbackMetadata = new Metadata(); - - private OrderedDictionary _featureFlags = new OrderedDictionary(); - - public NativeClient(Configuration configuration) - { - Configuration = configuration; - Breadcrumbs = new Breadcrumbs(configuration); - Application.lowMemory += () => { _hasReceivedLowMemoryWarning = true; }; - if (configuration.FeatureFlags != null) - { - _featureFlags = configuration.FeatureFlags; - } - } - - public void PopulateApp(App app) - { - } - - public void PopulateAppWithState(AppWithState app) - { - AddIsLaunching(app); - app.Add("lowMemory", _hasReceivedLowMemoryWarning); - } - - private void AddIsLaunching(AppWithState app) - { - bool isLaunching; - if (Configuration.LaunchDurationMillis == 0) - { - isLaunching = !_launchMarkedAsCompleted; - } - else - { - isLaunching = app.Duration?.TotalMilliseconds < Configuration.LaunchDurationMillis; - } - app.IsLaunching = isLaunching; - } - - public void PopulateDevice(Device device) - { - } - - public void PopulateDeviceWithState(DeviceWithState device) - { - } - - public void PopulateUser(User user) - { - } - - public void SetSession(Session session) - { - } - - public void SetUser(User user) - { - } - public void SetContext(string context) - { - } - public void SetAutoDetectErrors(bool autoDetectErrors) - { - } - - public void SetAutoDetectAnrs(bool autoDetectAnrs) - { - } - - public void StartSession() - { - } - - public void PauseSession() - { - } - - public bool ResumeSession() - { - return false; - } - - public void UpdateSession(Session session) - { - } - - public Session GetCurrentSession() - { - return null; - } - - public void MarkLaunchCompleted() - { - _launchMarkedAsCompleted = true; - } - - public LastRunInfo GetLastRunInfo() - { - return null; - } - - public void ClearNativeMetadata(string section) - { - _fallbackMetadata.ClearMetadata(section); - } - - public void ClearNativeMetadata(string section, string key) - { - _fallbackMetadata.ClearMetadata(section, key); - } - - public void AddNativeMetadata(string section, IDictionary data) - { - _fallbackMetadata.AddMetadata(section, data); - } - - public IDictionary GetNativeMetadata() - { - return _fallbackMetadata.Payload; - } - - public void AddFeatureFlag(string name, string variant = null) - { - _featureFlags[name] = variant; - } - - public void AddFeatureFlags(FeatureFlag[] featureFlags) - { - foreach (var flag in featureFlags) - { - _featureFlags[flag.Name] = flag.Variant; - } - } - - public void ClearFeatureFlag(string name) - { - _featureFlags.Remove(name); - } - - public void ClearFeatureFlags() - { - _featureFlags.Clear(); - } - - public bool ShouldAttemptDelivery() - { - return true; - } - - public void RegisterForOnSessionCallbacks() - { - // Not Used on this platform - } - } -} diff --git a/src/BugsnagUnity/Native/MacOS/NativeCode.cs b/src/BugsnagUnity/Native/MacOS/NativeCode.cs deleted file mode 100644 index c59fa0f39..000000000 --- a/src/BugsnagUnity/Native/MacOS/NativeCode.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace BugsnagUnity -{ - partial class NativeCode - { - const string Import = "bugsnag-osx"; - } -} diff --git a/src/BugsnagUnity/Native/Windows/NativeClient.cs b/src/BugsnagUnity/Native/Windows/NativeClient.cs deleted file mode 100644 index 4a62868e7..000000000 --- a/src/BugsnagUnity/Native/Windows/NativeClient.cs +++ /dev/null @@ -1,220 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - class NativeClient : INativeClient - { - public Configuration Configuration { get; } - - public IBreadcrumbs Breadcrumbs { get; } - - private bool _launchMarkedAsCompleted = false; - - private bool _hasReceivedLowMemoryWarning = false; - - private Metadata _fallbackMetadata = new Metadata(); - - public NativeClient(Configuration configuration) - { - Configuration = configuration; - Breadcrumbs = new Breadcrumbs(configuration); - Application.lowMemory += () => { _hasReceivedLowMemoryWarning = true; }; - } - - public void PopulateApp(App app) - { - } - - public void PopulateAppWithState(AppWithState app) - { - AddIsLaunching(app); - app.Add("lowMemory", _hasReceivedLowMemoryWarning); - } - - private void AddIsLaunching(AppWithState app) - { - bool isLaunching; - if (Configuration.LaunchDurationMillis == 0) - { - isLaunching = !_launchMarkedAsCompleted; - } - else - { - isLaunching = app.Duration?.TotalMilliseconds < Configuration.LaunchDurationMillis; - } - app.IsLaunching = isLaunching; - } - - public void PopulateDevice(Device device) - { - device.Manufacturer = "PC"; - device.Model = SystemInfo.deviceModel; - } - - public void PopulateDeviceWithState(DeviceWithState device) - { - PopulateDevice(device); - if (Application.platform != RuntimePlatform.WindowsPlayer) - { - return; - } - MEMORYSTATUSEX memStatus = new MEMORYSTATUSEX(); - if (GlobalMemoryStatusEx(memStatus)) - { - device.FreeMemory = (long)memStatus.ullAvailPhys; - } - - // This is generally the main drive on a Windows machine - // A future enhancement would be to determine which drive the application - // is running on and use that drive letter instead of defaulting to C - if (GetDiskFreeSpaceEx(@"C:\", - out ulong freeBytesAvailable, - out ulong totalNumberOfBytes, - out ulong totalNumberOfFreeBytes)) - { - device.FreeDisk = (long)freeBytesAvailable; - } - } - - public void PopulateMetadata(Metadata metadata) - { - } - - public void PopulateUser(User user) - { - } - - public void SetMetadata(string section, Dictionary metadata) - { - } - - public void SetSession(Session session) - { - } - - public void SetUser(User user) - { - } - public void SetContext(string context) - { - } - public void SetAutoDetectErrors(bool autoDetectErrors) - { - } - - public void SetAutoDetectAnrs(bool autoDetectAnrs) - { - } - - [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, - out ulong lpFreeBytesAvailable, - out ulong lpTotalNumberOfBytes, - out ulong lpTotalNumberOfFreeBytes); - - [return: MarshalAs(UnmanagedType.Bool)] - [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] - static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer); - - public void StartSession() - { - } - - public void PauseSession() - { - } - - public bool ResumeSession() - { - return false; - } - - public void UpdateSession(Session session) - { - } - - public Session GetCurrentSession() - { - return null; - } - - public void MarkLaunchCompleted() - { - _launchMarkedAsCompleted = true; - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - private class MEMORYSTATUSEX - { - public uint dwLength; - public uint dwMemoryLoad; - public ulong ullTotalPhys; - public ulong ullAvailPhys; - public ulong ullTotalPageFile; - public ulong ullAvailPageFile; - public ulong ullTotalVirtual; - public ulong ullAvailVirtual; - public ulong ullAvailExtendedVirtual; - public MEMORYSTATUSEX() - { - dwLength = (uint)Marshal.SizeOf(this); - } - } - - public LastRunInfo GetLastRunInfo() - { - return null; - } - - public void ClearNativeMetadata(string section) - { - _fallbackMetadata.ClearMetadata(section); - } - - public void ClearNativeMetadata(string section, string key) - { - _fallbackMetadata.ClearMetadata(section, key); - } - - public void AddNativeMetadata(string section, IDictionary data) - { - _fallbackMetadata.AddMetadata(section, data); - } - - public IDictionary GetNativeMetadata() - { - return _fallbackMetadata.Payload; - } - - public void AddFeatureFlag(string name, string variant = null) - { - } - - public void AddFeatureFlags(FeatureFlag[] featureFlags) - { - } - - public void ClearFeatureFlag(string name) - { - } - - public void ClearFeatureFlags() - { - } - - public bool ShouldAttemptDelivery() - { - return true; - } - - public void RegisterForOnSessionCallbacks() - { - // Not Used on this platform - } - } -} diff --git a/src/BugsnagUnity/Native/iOS/NativeCode.cs b/src/BugsnagUnity/Native/iOS/NativeCode.cs deleted file mode 100644 index 305f8e50b..000000000 --- a/src/BugsnagUnity/Native/iOS/NativeCode.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace BugsnagUnity -{ - partial class NativeCode - { - const string Import = "__Internal"; - } -} diff --git a/src/BugsnagUnity/Payload/App.cs b/src/BugsnagUnity/Payload/App.cs deleted file mode 100644 index 8be172765..000000000 --- a/src/BugsnagUnity/Payload/App.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; -#nullable enable - -namespace BugsnagUnity.Payload -{ - /// - /// Represents the "app" key in the error report payload. - /// - public class App : PayloadContainer, IApp - { - - private const string BINARY_ARCH_KEY = "binaryArch"; - private const string BUILD_UUID_KEY = "buildUuid"; - private const string BUNDLE_VERSION_KEY = "bundleVersion"; - private const string CODE_BUNDLE_ID = "codeBundleId"; - private const string DSYM_UUID_KEY = "dsymUuid"; - private const string ID_KEY = "id"; - private const string RELEASESTAGE_KEY = "releaseStage"; - private const string TYPE_KEY = "type"; - private const string VERSION_KEY = "version"; - private const string VERSION_CODE_KEY = "versionCode"; - - - public string? BinaryArch - { - get => (string?)Get(BINARY_ARCH_KEY); - set => Add(BINARY_ARCH_KEY, value); - } - - public string? BuildUuid - { - get => (string?)Get(BUILD_UUID_KEY); - set => Add(BUILD_UUID_KEY, value); - } - - public string? BundleVersion - { - get => (string?)Get(BUNDLE_VERSION_KEY); - set => Add(BUNDLE_VERSION_KEY, value); - } - - public string? CodeBundleId - { - get => (string?)Get(CODE_BUNDLE_ID); - set => Add(CODE_BUNDLE_ID, value); - } - - public string? DsymUuid - { - get => (string?)Get(DSYM_UUID_KEY); - set => Add(DSYM_UUID_KEY, value); - } - - public string? Id - { - get => (string?)Get(ID_KEY); - set => Add(ID_KEY, value); - } - - public string? ReleaseStage - { - get => (string?)Get(RELEASESTAGE_KEY); - set => Add(RELEASESTAGE_KEY, value); - } - - public string? Type - { - get => (string?)Get(TYPE_KEY); - set => Add(TYPE_KEY, value); - } - - public string? Version - { - get => (string?)Get(VERSION_KEY); - set => Add(VERSION_KEY, value); - } - - public int? VersionCode - { - get => (int?)Get(VERSION_CODE_KEY); - set => Add(VERSION_CODE_KEY, value); - } - - internal App(Dictionary cachedData) - { - Add(cachedData); - } - - internal App(Configuration configuration) - { - Id = Application.identifier; - ReleaseStage = configuration.ReleaseStage; - Type = GetAppType(configuration); - Version = configuration.AppVersion; - } - - private string GetAppType(Configuration configuration) - { - if (!string.IsNullOrEmpty(configuration.AppType)) - { - return configuration.AppType; - } - switch (Application.platform) - { - case RuntimePlatform.OSXEditor: - case RuntimePlatform.OSXPlayer: - return "MacOS"; - case RuntimePlatform.WindowsPlayer: - case RuntimePlatform.WindowsEditor: - case RuntimePlatform.WSAPlayerARM: - case RuntimePlatform.WSAPlayerX64: - case RuntimePlatform.WSAPlayerX86: - return "Windows"; - case RuntimePlatform.LinuxPlayer: - case RuntimePlatform.LinuxEditor: - return "Linux"; - case RuntimePlatform.WebGLPlayer: - return "WebGL"; - default: - return string.Empty; - } - } - - } -} diff --git a/src/BugsnagUnity/Payload/AppWithState.cs b/src/BugsnagUnity/Payload/AppWithState.cs deleted file mode 100644 index cd2929c07..000000000 --- a/src/BugsnagUnity/Payload/AppWithState.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; -#nullable enable - -namespace BugsnagUnity.Payload -{ - public class AppWithState : App, IAppWithState - { - private const string DURATION_KEY = "duration"; - private const string DURATION_IN_FOREGROUND_KEY = "durationInForeground"; - private const string IN_FOREGROUND_KEY = "inForeground"; - private const string IS_LAUNCHING_KEY = "isLaunching"; - - public TimeSpan? Duration - { - get - { - var millis = (double?)Get(DURATION_KEY); - if (millis != null) - { - return TimeSpan.FromMilliseconds((double)millis); - } - return null; - } - set => Add(DURATION_KEY, value?.TotalMilliseconds); - } - - public TimeSpan? DurationInForeground - { - get - { - var millis = (double?)Get(DURATION_IN_FOREGROUND_KEY); - if (millis != null) - { - return TimeSpan.FromMilliseconds((double)millis); - } - return null; - } - set => Add(DURATION_IN_FOREGROUND_KEY, value?.TotalMilliseconds); - } - - public bool? InForeground - { - get => (bool?)Get(IN_FOREGROUND_KEY); - set => Add(IN_FOREGROUND_KEY, value); - } - - public bool? IsLaunching - { - get => (bool?)Get(IS_LAUNCHING_KEY); - set => Add(IS_LAUNCHING_KEY, value); - } - - internal AppWithState(Dictionary cachedData) : base(cachedData){} - - internal AppWithState(Configuration configuration) : base(configuration) - { - Duration = TimeSpan.FromSeconds(UnityEngine.Time.realtimeSinceStartup); - } - - } -} diff --git a/src/BugsnagUnity/Payload/Breadcrumb.cs b/src/BugsnagUnity/Payload/Breadcrumb.cs deleted file mode 100644 index ce1da2ab7..000000000 --- a/src/BugsnagUnity/Payload/Breadcrumb.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace BugsnagUnity.Payload -{ - /// - /// Represents an individual breadcrumb in the error report payload. - /// - public class Breadcrumb : PayloadContainer, IBreadcrumb - { - // Notifier spec specifies Message, but the pipeline is still expecting the legacy field name - private const string MESSAGE_KEY = "name"; - private const string TIMESTAMP_KEY = "timestamp"; - private const string METADATA_KEY = "metaData"; - private const string TYPE_KEY = "type"; - - internal static Breadcrumb FromReport(Report report) - { - var message = "Error"; - var metadata = new Dictionary { }; - if (report.Context != null) - { - metadata["context"] = report.Context; - } - if (report.Exceptions != null && report.Exceptions.Any()) - { - var exception = report.Exceptions.First(); - metadata["message"] = exception.ErrorMessage; - metadata["errorClass"] = exception.ErrorClass; - metadata["unhandled"] = !report.IsHandled; - metadata["severity"] = report.OriginalSeverity; - message = exception.ErrorClass; - } - return new Breadcrumb(message, metadata, BreadcrumbType.Error); - } - - internal Breadcrumb(Dictionary data) - { - Add(data); - } - - /// - /// Used to construct a breadcrumb from the native data obtained from a - /// native notifier if present. - /// - internal Breadcrumb(string message, string timestamp, string type, IDictionary metadata) - { - Timestamp = DateTimeOffset.Parse( timestamp ); - Metadata = metadata; - if (string.IsNullOrEmpty(type)) - { - Type = BreadcrumbType.Manual; - } - else - { - Type = ParseBreadcrumbType(type); - } - Message = message; - } - - internal Breadcrumb(string message,IDictionary metadata, BreadcrumbType type) - { - Timestamp = DateTime.UtcNow; - Metadata = metadata; - Type = type; - Message = message; - } - - public IDictionary Metadata - { - get - { - if (Get(METADATA_KEY) == null) - { - Metadata = new Dictionary(); - } - return Get(METADATA_KEY) as IDictionary; - } - set - { - Add(METADATA_KEY, value); - } - } - - public string Message - { - get { return Get(MESSAGE_KEY) as string; } - set { Add(MESSAGE_KEY, value); } - } - - public BreadcrumbType Type { - get { - var stringValue = (string)Get(TYPE_KEY); - return ParseBreadcrumbType(stringValue); - } - set { Add(TYPE_KEY, value.ToString().ToLowerInvariant()); } - } - - public DateTimeOffset? Timestamp { - get { return (DateTimeOffset)Get(TIMESTAMP_KEY); } - set { Add(TIMESTAMP_KEY,value); } - } - - internal static BreadcrumbType ParseBreadcrumbType(string name) - { - if (name.Contains("error")) - { - return BreadcrumbType.Error; - } - if (name.Contains("log")) - { - return BreadcrumbType.Log; - } - if (name.Contains("navigation")) - { - return BreadcrumbType.Navigation; - } - if (name.Contains("process")) - { - return BreadcrumbType.Process; - } - if (name.Contains("request")) - { - return BreadcrumbType.Request; - } - if (name.Contains("state")) - { - return BreadcrumbType.State; - } - if (name.Contains("user")) - { - return BreadcrumbType.User; - } - if (name.Contains("manual")) - { - return BreadcrumbType.Manual; - } - return BreadcrumbType.Manual; - } - - } -} diff --git a/src/BugsnagUnity/Payload/BreadcrumbType.cs b/src/BugsnagUnity/Payload/BreadcrumbType.cs deleted file mode 100644 index 58e339308..000000000 --- a/src/BugsnagUnity/Payload/BreadcrumbType.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -namespace BugsnagUnity.Payload -{ - /// - /// Represents all of the possible breadcrumb types that the Bugsnag API supports. - /// - [Serializable] - [Flags] - public enum BreadcrumbType - { - /// - /// A breadcrumb with navigation information. - /// - Navigation = 0, - - /// - /// A breadcrumb with request information. - /// - Request = 1, - - /// - /// A breadcrumb with process information. - /// - Process = 2, - - /// - /// A breadcrumb with log information. - /// - Log = 3, - - /// - /// A breadcrumb with user information. - /// - User = 4, - - /// - /// A breadcrumb with state information. - /// - State = 5, - - /// - /// A breadcrumb with error information. - /// - Error = 6, - - /// - /// A manually logged breadcrumb. - /// - Manual = 7, - } -} diff --git a/src/BugsnagUnity/Payload/Correlation.cs b/src/BugsnagUnity/Payload/Correlation.cs deleted file mode 100644 index fcc22becc..000000000 --- a/src/BugsnagUnity/Payload/Correlation.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel; -using UnityEngine.Events; -#nullable enable - -namespace BugsnagUnity.Payload -{ - public class Correlation : PayloadContainer - { - - private const string TRACE_ID_KEY = "traceId"; - private const string SPAN_ID_KEY = "spanId"; - - internal Correlation(string traceId, string spanId) - { - TraceId = traceId; - SpanId = spanId; - } - - public string TraceId - { - get { - var @object = Get(TRACE_ID_KEY); - if (@object == null) - { - return string.Empty; - } - return (string)@object; - } - set - { - Add(TRACE_ID_KEY, value); - } - } - - public string SpanId - { - get - { - var @object = Get(SPAN_ID_KEY); - if (@object == null) - { - return string.Empty; - } - return (string)@object; - } - set - { - Add(SPAN_ID_KEY, value); - } - } - } -} diff --git a/src/BugsnagUnity/Payload/Device.cs b/src/BugsnagUnity/Payload/Device.cs deleted file mode 100644 index 9c6259415..000000000 --- a/src/BugsnagUnity/Payload/Device.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text.RegularExpressions; -using UnityEngine; -#nullable enable - - -namespace BugsnagUnity.Payload -{ - - public class Device : PayloadContainer, IDevice - { - - private const string BROWSER_NAME_KEY = "browserName"; - private const string BROWSER_VERSION_KEY = "browserVersion"; - private const string CPU_ABI_KEY = "cpuAbi"; - private const string ID_KEY = "id"; - private const string JAILBROKEN_KEY = "jailbroken"; - private const string LOCALE_KEY = "locale"; - private const string MANUFACTURER_KEY = "manufacturer"; - private const string MODEL_KEY = "model"; - private const string MODEL_NUMBER_KEY = "modelNumber"; - private const string OS_NAME_KEY = "osName"; - private const string OS_VERSION_KEY = "osVersion"; - private const string RUNTIME_VERSIONS_KEY = "runtimeVersions"; - private const string TOTAL_MEMORY_KEY = "totalMemory"; - private const string USER_AGENT_KEY = "userAgent"; - - - public string? BrowserName - { - get => (string?)Get(BROWSER_NAME_KEY); - set => Add(BROWSER_NAME_KEY, value); - } - - public string? BrowserVersion - { - get => (string?)Get(BROWSER_VERSION_KEY); - set => Add(BROWSER_VERSION_KEY, value); - } - - public string[]? CpuAbi - { - get => (string[]?)Get(CPU_ABI_KEY); - set => Add(CPU_ABI_KEY, value); - } - - public string? Id - { - get => (string?)Get(ID_KEY); - set => Add(ID_KEY, value); - } - - public bool? Jailbroken - { - get => (bool?)Get(JAILBROKEN_KEY); - set => Add(JAILBROKEN_KEY, value); - } - - public string? Locale - { - get => (string?)Get(LOCALE_KEY); - set => Add(LOCALE_KEY, value); - } - - public string? Manufacturer - { - get => (string?)Get(MANUFACTURER_KEY); - set => Add(MANUFACTURER_KEY, value); - } - - public string? Model - { - get => (string?)Get(MODEL_KEY); - set => Add(MODEL_KEY, value); - } - - public string? ModelNumber - { - get => (string?)Get(MODEL_NUMBER_KEY); - set => Add(MODEL_NUMBER_KEY, value); - } - - public string? OsName - { - get => (string?)Get(OS_NAME_KEY); - set => Add(OS_NAME_KEY, value); - } - - public string? OsVersion - { - get => (string?)Get(OS_VERSION_KEY); - set => Add(OS_VERSION_KEY, value); - } - - public IDictionary? RuntimeVersions - { - get => (IDictionary?)Get(RUNTIME_VERSIONS_KEY); - set => Add(RUNTIME_VERSIONS_KEY, value); - } - - public long? TotalMemory - { - get => (long?)Get(TOTAL_MEMORY_KEY); - set => Add(TOTAL_MEMORY_KEY, value); - } - - public string? UserAgent - { - get => (string?)Get(USER_AGENT_KEY); - set => Add(USER_AGENT_KEY, value); - } - - internal Device(Dictionary cachedData) - { - Add(cachedData); - } - - internal Device(Configuration configuration, string deviceId) - { - TotalMemory = SystemInfo.systemMemorySize; - Locale = CultureInfo.CurrentCulture.ToString(); - AddOsInfo(); - AddRuntimeVersions(configuration); - Id = deviceId; - Model = SystemInfo.deviceModel; - } - - - - private void AddOsInfo() - { - - // we expect that windows version strings look like: - // "Microsoft Windows NT 10.0.17134.0" - // if it does then we can parse out the version number into a separate field - var matches = Regex.Match(Environment.OSVersion.VersionString, "\\A(?[a-zA-Z ]*) (?[\\d\\.]*)\\z"); - if (matches.Success) - { - OsName = matches.Groups["osName"].Value; - OsVersion = matches.Groups["osVersion"].Value; - } - else - { - OsName = Environment.OSVersion.Platform.ToString(); - OsVersion = Environment.OSVersion.VersionString; - } - - } - - private void AddRuntimeVersions(Configuration configuration) - { - RuntimeVersions = new Dictionary(); - RuntimeVersions.AddToPayload("unityScriptingBackend", configuration.ScriptingBackend); - RuntimeVersions.AddToPayload("dotnetScriptingRuntime", configuration.DotnetScriptingRuntime); - RuntimeVersions.AddToPayload("dotnetApiCompatibility", configuration.DotnetApiCompatibility); - RuntimeVersions.AddToPayload("unity", Application.unityVersion); - } - - } -} diff --git a/src/BugsnagUnity/Payload/DeviceWithState.cs b/src/BugsnagUnity/Payload/DeviceWithState.cs deleted file mode 100644 index d5e83f172..000000000 --- a/src/BugsnagUnity/Payload/DeviceWithState.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; -#nullable enable - -namespace BugsnagUnity.Payload -{ - public class DeviceWithState : Device, IDeviceWithState - { - - private const string FREE_DISK_KEY = "freeDisk"; - private const string FREE_MEMORY_KEY = "freeMemory"; - private const string ORIENTATION_KEY = "orientation"; - private const string TIME_KEY = "time"; - - public long? FreeDisk - { - get => (long?)Get(FREE_DISK_KEY); - set => Add(FREE_DISK_KEY, value); - } - - public long? FreeMemory - { - get => (long?)Get(FREE_MEMORY_KEY); - set => Add(FREE_MEMORY_KEY, value); - } - - public string? Orientation - { - get => (string?)Get(ORIENTATION_KEY); - set => Add(ORIENTATION_KEY, value); - } - - public DateTimeOffset? Time - { - get => (DateTimeOffset?)Get(TIME_KEY); - set => Add(TIME_KEY, value); - } - - internal DeviceWithState(Dictionary cachedData) : base(cachedData) { } - - internal DeviceWithState(Configuration configuration, string deviceId) : base(configuration, deviceId) - { - Orientation = Input.deviceOrientation.ToString(); - Time = DateTimeOffset.Now; - Id = deviceId; - } - - - } -} diff --git a/src/BugsnagUnity/Payload/Error.cs b/src/BugsnagUnity/Payload/Error.cs deleted file mode 100644 index e5711a405..000000000 --- a/src/BugsnagUnity/Payload/Error.cs +++ /dev/null @@ -1,294 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; - -namespace BugsnagUnity.Payload -{ - /// - /// Represents a set of Bugsnag payload exceptions that are generated from a single exception by resolving - /// the inner exceptions present. - /// - class Errors : IEnumerable - { - private IEnumerable UnwoundExceptions { get; } - - internal Errors(System.Exception exception, System.Diagnostics.StackFrame[] alternativeStackTrace) - { - UnwoundExceptions = FlattenAndReverseExceptionTree(exception).Select(e => Error.FromSystemException(e, alternativeStackTrace)); - } - - internal Errors(System.Exception exception, string providedStackTrace) - { - UnwoundExceptions = FlattenAndReverseExceptionTree(exception).Select(e => Error.FromSystemException(e, providedStackTrace)); - } - - public IEnumerator GetEnumerator() - { - return UnwoundExceptions.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - private static IEnumerable FlattenAndReverseExceptionTree(System.Exception ex) - { - if (ex == null) yield break; - - yield return ex; - - switch (ex) - { - case ReflectionTypeLoadException typeLoadException: - foreach (var exception in typeLoadException.LoaderExceptions) - { - foreach (var item in FlattenAndReverseExceptionTree(exception)) - { - yield return item; - } - } - break; - default: - foreach (var item in FlattenAndReverseExceptionTree(ex.InnerException)) - { - yield return item; - } - break; - } - } - } - - /// - /// Represents an individual error in the Bugsnag payload. - /// - public class Error : Dictionary, IError - { - internal HandledState HandledState { get; } - - internal bool IsAndroidJavaException; - - private const string ANDROID_JAVA_EXCEPTION_CLASS = "AndroidJavaException"; - private const string ERROR_CLASS_MESSAGE_PATTERN = @"^(?\S+):\s+(?.*)"; - private const string NATIVE_ANDROID_ERROR_CLASS = "java.lang.Error"; - private const string NATIVE_ANDROID_MESSAGE_PATTERN = @"signal \d+ \(SIG\w+\)"; - - private const string ERROR_CLASS_KEY = "errorClass"; - private const string MESSAGE_KEY = "message"; - private const string STACKTRACE_KEY = "stacktrace"; - - internal Error(Dictionary data) - { - foreach (var item in data) - { - if (item.Key == STACKTRACE_KEY) - { - var stackArray = (JsonArray)data[STACKTRACE_KEY]; - var stackList = new List(); - foreach (JsonObject jsonFrame in stackArray) - { - var newFrame = new StackTraceLine(jsonFrame.GetDictionary()); - stackList.Add(newFrame); - } - _stacktrace = stackList; - } - else - { - this.AddToPayload(item.Key, item.Value); - } - } - } - - internal Error(string errorClass, string message, StackTraceLine[] stackTrace) - : this(errorClass, message, stackTrace, HandledState.ForHandledException(),false) { } - - internal Error(string errorClass, string message, IStackframe[] stackTrace, HandledState handledState,bool isAndroidJavaException) - { - ErrorClass = errorClass; - ErrorMessage = message; - _stacktrace = stackTrace.ToList(); - HandledState = handledState; - IsAndroidJavaException = isAndroidJavaException; - } - - - private List _stacktrace { get => this.Get(STACKTRACE_KEY) as List; set => this.AddToPayload(STACKTRACE_KEY, value); } - - public List Stacktrace => _stacktrace; - - public string ErrorClass - { - get => this.Get(ERROR_CLASS_KEY) as string; - set => this.AddToPayload(ERROR_CLASS_KEY, value); - } - - public string ErrorMessage - { - get => this.Get(MESSAGE_KEY) as string; - set => this.AddToPayload(MESSAGE_KEY, value); - } - - public string Type { get => "Unity"; } - - - internal static Error FromSystemException(System.Exception exception, System.Diagnostics.StackFrame[] alternativeStackTrace) - { - var errorClass = exception.GetType().Name; - - // JVM exceptions in the main thread are handled by unity and require extra formatting - if (errorClass == ANDROID_JAVA_EXCEPTION_CLASS) - { - var androidErrorData = ProcessAndroidError(exception.Message); - var androidErrorClass = androidErrorData[0]; - var androidErrorMessage = androidErrorData[1]; - var lines = new StackTrace(exception.StackTrace, StackTraceFormat.AndroidJava).StackTraceLines; - return new Error(androidErrorClass, androidErrorMessage, lines, HandledState.ForUnhandledException(), true); - } - else - { - StackTraceLine[] lines; - if (!string.IsNullOrEmpty(exception.StackTrace)) - { - lines = new StackTrace(exception.StackTrace).StackTraceLines; - } - else - { - lines = new StackTrace(alternativeStackTrace).StackTraceLines; - } - return new Error(errorClass, exception.Message, lines); - } - - } - - internal static Error FromStringInfo(string name, string message, string stacktrace) - { - var stackFrames = new StackTrace(stacktrace).StackTraceLines; - return new Error(name, message, stackFrames); - } - - internal static Error FromSystemException(System.Exception exception, string stackTrace) - { - var errorClass = exception.GetType().Name; - var lines = new StackTrace(stackTrace).StackTraceLines; - - return new Error(errorClass, exception.Message, lines); - } - - public static Error FromUnityLogMessage(UnityLogMessage logMessage, System.Diagnostics.StackFrame[] stackFrames, Severity severity) - { - return FromUnityLogMessage(logMessage, stackFrames, severity, false); - } - - private static string[] ProcessAndroidError(string originalMessage) - { - string message; - string errorClass; - var match = Regex.Match(originalMessage, ERROR_CLASS_MESSAGE_PATTERN, RegexOptions.Singleline); - // If the message matches the "class: message" pattern, then the Java class is followed - // by a description of the Java exception. These two values will be used as the error - // class and message. - if (match.Success) - { - errorClass = match.Groups["errorClass"].Value; - message = match.Groups["message"].Value.Trim(); - } - else - { - // There was no Java exception description, so the Java class is the only content in - // the message. - errorClass = originalMessage; - message = string.Empty; - } - return new[] { errorClass, message }; - } - - public static Error FromUnityLogMessage(UnityLogMessage logMessage, System.Diagnostics.StackFrame[] fallbackStackFrames, Severity severity, bool forceUnhandled) - { - var match = Regex.Match(logMessage.Condition, ERROR_CLASS_MESSAGE_PATTERN, RegexOptions.Singleline); - - var lines = new StackTrace(logMessage.StackTrace).StackTraceLines; - if (lines.Length == 0) - { - lines = new StackTrace(fallbackStackFrames).StackTraceLines; - } - - var handledState = forceUnhandled - ? HandledState.ForUnhandledException() - : HandledState.ForUnityLogMessage(severity); - - if (match.Success) - { - var errorClass = match.Groups["errorClass"].Value; - var message = match.Groups["message"].Value.Trim(); - var isAndroidJavaException = false; - // JVM exceptions in the main thread are handled by unity and require extra formatting - if (errorClass == ANDROID_JAVA_EXCEPTION_CLASS) - { - isAndroidJavaException = true; - var androidErrorData = ProcessAndroidError(message); - errorClass = androidErrorData[0]; - message = androidErrorData[1]; - lines = new StackTrace(logMessage.StackTrace, StackTraceFormat.AndroidJava).StackTraceLines; - handledState = HandledState.ForUnhandledException(); - } - return new Error(errorClass, message, lines, handledState, isAndroidJavaException); - } - else - { - // include the type somehow in there - return new Error($"UnityLog{logMessage.Type}", logMessage.Condition, lines, handledState, false); - } - } - - public static bool ShouldSend(System.Exception exception) - { - var errorClass = exception.GetType().Name; - if (errorClass != ANDROID_JAVA_EXCEPTION_CLASS && errorClass != NATIVE_ANDROID_ERROR_CLASS) - { - return true; - } - - var match = Regex.Match(exception.StackTrace, NATIVE_ANDROID_MESSAGE_PATTERN, RegexOptions.Singleline); - return !match.Success; - } - - /// - /// Validates the logMessage excluding previously delivered reports - /// - public static bool ShouldSend(UnityLogMessage logMessage) - { - if (logMessage.StackTrace == null) - { - return true; - } - // Discard any messages matching native Android events as they are captured (and more - // accurate) via bugsnag-android. Any Java `Error` generated from a POSIX signal is - // discarded. For Unity 2017/2018: - var match = Regex.Match(logMessage.Condition, ERROR_CLASS_MESSAGE_PATTERN, RegexOptions.Singleline); - if (!match.Success) - { - return true; - } - - var errorClass = match.Groups["errorClass"].Value; - if (errorClass != ANDROID_JAVA_EXCEPTION_CLASS) - { - return true; - } - - var message = match.Groups["message"].Value; - match = Regex.Match(message, ERROR_CLASS_MESSAGE_PATTERN, RegexOptions.Singleline); - errorClass = match.Success ? match.Groups["errorClass"].Value : message; - if (errorClass != NATIVE_ANDROID_ERROR_CLASS) - { - return true; - } - - match = Regex.Match(logMessage.StackTrace, NATIVE_ANDROID_MESSAGE_PATTERN, RegexOptions.Singleline); - return !match.Success; - } - } -} diff --git a/src/BugsnagUnity/Payload/Event.cs b/src/BugsnagUnity/Payload/Event.cs deleted file mode 100644 index ccad20d28..000000000 --- a/src/BugsnagUnity/Payload/Event.cs +++ /dev/null @@ -1,388 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.Linq; -using UnityEngine; - -namespace BugsnagUnity.Payload -{ - public class Event : PayloadContainer, IEvent - { - - internal Event(string context, Metadata metadata, AppWithState app, DeviceWithState device, User user, Error[] errors, HandledState handledState, List breadcrumbs, Session session, string apiKey, OrderedDictionary featureFlags, Correlation correlation, LogType? logType = null) - { - ApiKey = apiKey; - OriginalSeverity = handledState; - _metadata = metadata; - HandledState = handledState; - LogType = logType; - _appWithState = app; - _deviceWithState = device; - Context = context; - _user = user; - _errors = errors.ToList(); - Errors = new List(); - Correlation = correlation; - foreach (var error in _errors) - { - Errors.Add(error); - } - - _breadcrumbs = breadcrumbs; - var breadcrumbsList = new List(); - foreach (var crumb in _breadcrumbs) - { - breadcrumbsList.Add(crumb); - } - Breadcrumbs = new ReadOnlyCollection(breadcrumbsList); - - if (session != null) - { - if (handledState.Handled) - { - session.Events.IncrementHandledCount(); - } - else - { - session.Events.IncrementUnhandledCount(); - } - Session = session; - } - _featureFlags = featureFlags; - } - - internal Event(Dictionary serialisedPayload) - { - ApiKey = serialisedPayload["apiKey"].ToString(); - - var eventObject = (Dictionary)serialisedPayload["event"]; - - if (eventObject["unhandled"] != null) - { - Add("unhandled", eventObject["unhandled"]); - } - else - { - Add("unhandled", false); - } - - if (eventObject["severity"] != null) - { - Add("severity", eventObject["severity"]); - } - if (eventObject["severityReason"] != null) - { - Add("severityReason", eventObject["severityReason"]); - } - _metadata = new Metadata(); - _metadata.MergeMetadata((Dictionary)eventObject["metaData"]); - - _appWithState = new AppWithState((Dictionary)eventObject["app"]); - - _deviceWithState = new DeviceWithState((Dictionary)eventObject["device"]); - - _featureFlags = new OrderedDictionary(); - if (eventObject.ContainsKey("featureFlags")) - { - var flagsArray = (JsonArray)eventObject["featureFlags"]; - foreach (JsonObject flag in flagsArray) - { - var featureFlag = new FeatureFlag(flag.GetDictionary()); - _featureFlags[featureFlag.Name] = featureFlag.Variant; - } - } - - if (eventObject.ContainsKey("context")) - { - Context = eventObject["context"].ToString(); - } - - _user = new User(); - if (eventObject.ContainsKey("user")) - { - _user.Add((Dictionary)eventObject["user"]); - } - - if (eventObject.ContainsKey("breadcrumbs")) - { - _breadcrumbs = new List(); - var crumbsArray = (JsonArray)eventObject["breadcrumbs"]; - foreach (JsonObject crumb in crumbsArray) - { - _breadcrumbs.Add(new Breadcrumb(crumb.GetDictionary())); - } - var breadcrumbsList = new List(); - foreach (var crumb in _breadcrumbs) - { - breadcrumbsList.Add(crumb); - } - Breadcrumbs = new ReadOnlyCollection(breadcrumbsList); - } - - if (eventObject.ContainsKey("groupingHash")) - { - GroupingHash = eventObject["groupingHash"].ToString(); - } - - _errors = new List(); - var errorsArray = (JsonArray)eventObject["exceptions"]; - foreach (JsonObject error in errorsArray) - { - var newError = new Error(error.GetDictionary()); - _errors.Add(newError); - - } - Errors = new List(); - foreach (var error in _errors) - { - Errors.Add(error); - } - - if (eventObject.ContainsKey("session")) - { - Session = new Session(); - Session.Add((Dictionary)eventObject["session"]); - } - - if (eventObject.ContainsKey("projectPackages")) - { - var packagesList = new List(); - var packagesArray = (JsonArray)eventObject["projectPackages"]; - foreach (var item in packagesArray) - { - packagesList.Add(item.ToString()); - } - _androidProjectPackages = packagesList.ToArray(); - } - } - - internal void AddAndroidProjectPackagesToEvent(string[] packages) - { - _androidProjectPackages = packages; - } - - private OrderedDictionary _featureFlags; - - HandledState _handledState; - - internal HandledState OriginalSeverity { get; } - - private string[] _androidProjectPackages; - - private Metadata _metadata { get; } - - public void AddMetadata(string section, string key, object value) => _metadata.AddMetadata(section,key,value); - - public void AddMetadata(string section, IDictionary metadata) => _metadata.AddMetadata(section, metadata); - - public IDictionary GetMetadata(string section) => _metadata.GetMetadata(section); - - public object GetMetadata(string section, string key) => _metadata.GetMetadata(section,key); - - public void ClearMetadata(string section) => _metadata.ClearMetadata(section); - - public void ClearMetadata(string section, string key) => _metadata.ClearMetadata(section, key); - - internal int PayloadVersion = 4; - - public string ApiKey { get; set; } - - public Correlation Correlation; - - private List _breadcrumbs; - - public ReadOnlyCollection Breadcrumbs { get; } - - internal Session Session { get; } - - internal LogType? LogType { get; } - - public bool Unhandled { - get { - var currentValue = Get("unhandled"); - if (currentValue == null) - { - return false; - } - return (bool)currentValue; - } - set => Add("unhandled",value); - } - - internal bool IsHandled - { - get - { - if (Get("unhandled") is bool unhandled) - { - return !unhandled; - } - - return false; - } - } - - public string Context { get; set; } - - private AppWithState _appWithState; - - public IAppWithState App => _appWithState; - - private DeviceWithState _deviceWithState; - - public IDeviceWithState Device => _deviceWithState; - - private List _errors; - - public List Errors { get; } - - public string GroupingHash { get; set; } - - public Severity Severity - { - set => HandledState = HandledState.ForCallbackSpecifiedSeverity(value, _handledState); - get => _handledState.Severity; - } - - - - private User _user; - - public IUser GetUser() => _user; - - public void SetUser(string id, string email, string name) - { - _user = new User(id, email, name ); - } - - internal bool IsAndroidJavaError() - { - foreach (var error in _errors) - { - if (error.IsAndroidJavaException) - { - return true; - } - } - return false; - } - - HandledState HandledState - { - set - { - _handledState = value; - foreach (var item in value) - { - Payload[item.Key] = item.Value; - } - } - } - - internal void RedactMetadata(Configuration config) - { - foreach (var section in _metadata.Payload) - { - var theSection = (IDictionary)section.Value; - foreach (var key in theSection.Keys.ToList()) - { - if (config.KeyIsRedacted(key)) - { - theSection[key] = "[REDACTED]"; - } - } - } - foreach (var crumb in _breadcrumbs) - { - foreach (var key in crumb.Metadata.Keys.ToList()) - { - if (config.KeyIsRedacted(key)) - { - crumb.Metadata[key] = "[REDACTED]"; - } - } - } - } - - public List Threads => null; - - internal Dictionary GetEventPayload() - { - Add("app", _appWithState.Payload); - Add("device", _deviceWithState.Payload); - Add("metaData", _metadata.Payload); - Add("user", _user.Payload); - Add("context", Context); - Add("groupingHash", GroupingHash); - Add("payloadVersion", PayloadVersion); - Add("exceptions", _errors); - if(Correlation != null) - { - Add("correlation", Correlation.Payload); - } - if (_androidProjectPackages != null) - { - Add("projectPackages", _androidProjectPackages); - } - var breadcrumbPayloads = new List>(); - foreach (var crumb in _breadcrumbs) - { - breadcrumbPayloads.Add(crumb.Payload); - } - Add("breadcrumbs", breadcrumbPayloads.ToArray()); - if (_featureFlags.Count > 0) - { - var featureFlagPayloads = new List>(); - foreach (DictionaryEntry entry in _featureFlags) - { - var flag = new FeatureFlag((string)entry.Key, (string)entry.Value); - featureFlagPayloads.Add(flag.Payload); - } - Add("featureFlags", featureFlagPayloads.ToArray()); - } - if (Session != null) - { - Add("session", Session.Payload); - } - - return Payload; - } - - public void AddFeatureFlag(string name, string variant = null) - { - _featureFlags[name] = variant; - } - - public void AddFeatureFlags(FeatureFlag[] featureFlags) - { - foreach (var flag in featureFlags) - { - AddFeatureFlag(flag.Name, flag.Variant); - } - } - - public void ClearFeatureFlag(string name) - { - _featureFlags.Remove(name); - } - - public void ClearFeatureFlags() - { - _featureFlags.Clear(); - } - - public ReadOnlyCollection FeatureFlags - { - get - { - List list = new List(); - foreach (DictionaryEntry entry in _featureFlags) - { - list.Add(new FeatureFlag((string)entry.Key, (string)entry.Value)); - } - return new ReadOnlyCollection(list); - } - } - } -} diff --git a/src/BugsnagUnity/Payload/FeatureFlag.cs b/src/BugsnagUnity/Payload/FeatureFlag.cs deleted file mode 100644 index e5d2073fd..000000000 --- a/src/BugsnagUnity/Payload/FeatureFlag.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace BugsnagUnity.Payload -{ - public class FeatureFlag : PayloadContainer - { - - internal FeatureFlag(Dictionary data) - { - Add(data); - } - - public FeatureFlag(string name) - { - Name = name; - } - - public FeatureFlag(string name, string variant) - { - Name = name; - Variant = variant; - } - - public string Name - { - get => (string)Get("featureFlag"); - set => Add("featureFlag", value); - } - - public string Variant - { - get => (string)Get("variant"); - set => Add("variant", value); - } - } -} diff --git a/src/BugsnagUnity/Payload/HandledState.cs b/src/BugsnagUnity/Payload/HandledState.cs deleted file mode 100644 index 818ac2ee9..000000000 --- a/src/BugsnagUnity/Payload/HandledState.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -namespace BugsnagUnity.Payload -{ - /// - /// Represents the various fields that can be set in the "event" payload for - /// showing the exceptions handled/unhandled state and severity. - /// - class HandledState : Dictionary - { - /// - /// Creates a HandledState object for an error report payload where the exception was not handled by the application - /// and caught by a global error handler. - /// - /// - internal static HandledState ForUnhandledException() - { - return new HandledState(false, Severity.Error, SeverityReason.ForUnhandledException()); - } - - /// - /// Creates a HandledState object for an error report payload where the exception was logged and Config.ReportExceptionLogsAsHandled is true - /// - /// - internal static HandledState ForLoggedException() - { - return new HandledState(true, Severity.Error, SeverityReason.ForHandledException()); - } - - /// - /// Creates a HandledState object for an error report payload where the exception was handled by the application - /// and notified manually. - /// - /// - internal static HandledState ForHandledException() - { - return new HandledState(true, Severity.Warning, SeverityReason.ForHandledException()); - } - - /// - /// Creates a HandledState object for an error report payload where the exception was handled by the application - /// and notified manually and the error severity was also passed in to override the default severity. - /// - /// - /// - internal static HandledState ForUserSpecifiedSeverity(Severity severity) - { - return new HandledState(true, severity, SeverityReason.ForUserSpecifiedSeverity()); - } - - /// - /// Creates a HandledState object for an error report payload where the severity for the exception was modified - /// while running the middleware/callback. - /// - /// - /// - /// - internal static HandledState ForCallbackSpecifiedSeverity(Severity severity, HandledState previousSeverity) - { - return new HandledState(previousSeverity.Handled, severity, SeverityReason.ForCallbackSpecifiedSeverity()); - } - - /// - /// Creates a HandledState object for an error report payload that is being generated from a Unity log message. - /// These are always attributed as a handled exception due to the fact that they do not crash the application. - /// - /// The unity log message. - /// Severity. - internal static HandledState ForUnityLogMessage(Severity severity) - { - return new HandledState(true, severity, SeverityReason.ForHandledException()); - } - - internal Severity Severity { get; } - - HandledState(bool handled, Severity severity, SeverityReason reason) - { - Severity = severity; - this.AddToPayload("unhandled", !handled); - this.AddToPayload("severityReason", reason); - - string severityValue; - - switch (severity) - { - case Severity.Info: - severityValue = "info"; - break; - case Severity.Warning: - severityValue = "warning"; - break; - default: - severityValue = "error"; - break; - } - - this.AddToPayload("severity", severityValue); - } - - internal bool Handled - { - get - { - switch (this.Get("unhandled")) - { - case bool unhandled: - return !unhandled; - default: - return true; - } - } - set - { - this.AddToPayload("unhandled", !value); - } - } - - /// - /// Represents the "severityReason" key in the error report payload. - /// - class SeverityReason : Dictionary - { - internal static SeverityReason ForUnhandledException() - { - return new SeverityReason("unhandledException", null); - } - - internal static SeverityReason ForHandledException() - { - return new SeverityReason("handledException", null); - } - - internal static SeverityReason ForUserSpecifiedSeverity() - { - return new SeverityReason("userSpecifiedSeverity", null); - } - - internal static SeverityReason ForCallbackSpecifiedSeverity() - { - return new SeverityReason("userCallbackSetSeverity", null); - } - - SeverityReason(string type, IDictionary attributes) - { - this.AddToPayload("type", type); - this.AddToPayload("attributes", attributes); - } - } - } -} diff --git a/src/BugsnagUnity/Payload/IApp.cs b/src/BugsnagUnity/Payload/IApp.cs deleted file mode 100644 index be74c4682..000000000 --- a/src/BugsnagUnity/Payload/IApp.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace BugsnagUnity.Payload -{ - public interface IApp - { - string BinaryArch { get; set; } - string BuildUuid { get; set; } - string BundleVersion { get; set; } - string CodeBundleId { get; set; } - string DsymUuid { get; set; } - string Id { get; set; } - string ReleaseStage { get; set; } - string Type { get; set; } - string Version { get; set; } - int? VersionCode { get; set; } - } -} \ No newline at end of file diff --git a/src/BugsnagUnity/Payload/IAppWithState.cs b/src/BugsnagUnity/Payload/IAppWithState.cs deleted file mode 100644 index 411163cca..000000000 --- a/src/BugsnagUnity/Payload/IAppWithState.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace BugsnagUnity.Payload -{ - public interface IAppWithState : IApp - { - TimeSpan? Duration { get; set; } - TimeSpan? DurationInForeground { get; set; } - bool? InForeground { get; set; } - bool? IsLaunching { get; set; } - } -} \ No newline at end of file diff --git a/src/BugsnagUnity/Payload/IBreadcrumb.cs b/src/BugsnagUnity/Payload/IBreadcrumb.cs deleted file mode 100644 index b1f3ecef9..000000000 --- a/src/BugsnagUnity/Payload/IBreadcrumb.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace BugsnagUnity.Payload -{ - public interface IBreadcrumb - { - string Message { get; set; } - - IDictionary Metadata { get; set; } - - DateTimeOffset? Timestamp { get; } - - BreadcrumbType Type { get; set; } - } -} diff --git a/src/BugsnagUnity/Payload/IDevice.cs b/src/BugsnagUnity/Payload/IDevice.cs deleted file mode 100644 index 7d14c75d8..000000000 --- a/src/BugsnagUnity/Payload/IDevice.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Collections.Generic; - -namespace BugsnagUnity -{ - public interface IDevice - { - string BrowserName { get; set; } - string BrowserVersion { get; set; } - string[] CpuAbi { get; set; } - string Id { get; set; } - bool? Jailbroken { get; set; } - string Locale { get; set; } - string Manufacturer { get; set; } - string Model { get; set; } - string ModelNumber { get; set; } - string OsName { get; set; } - string OsVersion { get; set; } - IDictionary RuntimeVersions { get; set; } - long? TotalMemory { get; set; } - string UserAgent { get; set; } - } -} \ No newline at end of file diff --git a/src/BugsnagUnity/Payload/IDeviceWithState.cs b/src/BugsnagUnity/Payload/IDeviceWithState.cs deleted file mode 100644 index 83b916553..000000000 --- a/src/BugsnagUnity/Payload/IDeviceWithState.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace BugsnagUnity.Payload -{ - public interface IDeviceWithState : IDevice - { - long? FreeDisk { get; set; } - long? FreeMemory { get; set; } - string Orientation { get; set; } - DateTimeOffset? Time { get; set; } - } -} \ No newline at end of file diff --git a/src/BugsnagUnity/Payload/IError.cs b/src/BugsnagUnity/Payload/IError.cs deleted file mode 100644 index 9a31a81ec..000000000 --- a/src/BugsnagUnity/Payload/IError.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace BugsnagUnity.Payload -{ - public interface IError - { - string ErrorClass { get; set; } - - string ErrorMessage { get; set; } - - List Stacktrace { get; } - - string Type { get; } - } -} diff --git a/src/BugsnagUnity/Payload/IEvent.cs b/src/BugsnagUnity/Payload/IEvent.cs deleted file mode 100644 index 95b9c33e6..000000000 --- a/src/BugsnagUnity/Payload/IEvent.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public interface IEvent: IMetadataEditor, IUserEditor, IFeatureFlagStore - { - string ApiKey { get; set; } - - IAppWithState App { get; } - - string Context { get; set; } - - IDeviceWithState Device { get; } - - ReadOnlyCollection Breadcrumbs { get; } - - List Errors { get; } - - ReadOnlyCollection FeatureFlags { get; } - - string GroupingHash { get; set; } - - Severity Severity { get; set; } - - List Threads { get; } - - bool Unhandled { get; set; } - } -} diff --git a/src/BugsnagUnity/Payload/IPayload.cs b/src/BugsnagUnity/Payload/IPayload.cs deleted file mode 100644 index 6d500f8db..000000000 --- a/src/BugsnagUnity/Payload/IPayload.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BugsnagUnity.Payload -{ - public interface IPayload - { - Uri Endpoint { get; set; } - - KeyValuePair[] Headers { get; set; } - - string Id { get; set; } - - PayloadType PayloadType { get; } - - Dictionary GetSerialisablePayload(); - } - - public enum PayloadType - { - Session, - Event - } -} diff --git a/src/BugsnagUnity/Payload/ISession.cs b/src/BugsnagUnity/Payload/ISession.cs deleted file mode 100644 index e5117aaad..000000000 --- a/src/BugsnagUnity/Payload/ISession.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using BugsnagUnity.Payload; - -namespace BugsnagUnity -{ - public interface ISession - { - string Id { get; set; } - IDevice Device { get; set; } - IApp App { get; set; } - DateTimeOffset? StartedAt { get; set; } - IUser GetUser(); - void SetUser(string id, string email, string name); - } -} diff --git a/src/BugsnagUnity/Payload/IStackframe.cs b/src/BugsnagUnity/Payload/IStackframe.cs deleted file mode 100644 index 25255ad49..000000000 --- a/src/BugsnagUnity/Payload/IStackframe.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -namespace BugsnagUnity.Payload -{ - public interface IStackframe - { - string FrameAddress { get; set; } - - bool? IsLr { get; set; } - - bool? IsPc { get; set; } - - string MachoFile { get; set; } - - string MachoLoadAddress { get; set; } - - string MachoUuid { get; set; } - - string MachoVmAddress { get; set; } - - string Method { get; set; } - - string SymbolAddress { get; set; } - - string File { get; set; } - - bool? InProject { get; set; } - - int? LineNumber { get; set; } - } -} diff --git a/src/BugsnagUnity/Payload/IThread.cs b/src/BugsnagUnity/Payload/IThread.cs deleted file mode 100644 index c394f9bd8..000000000 --- a/src/BugsnagUnity/Payload/IThread.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace BugsnagUnity.Payload -{ - public interface IThread - { - string Id { get; set; } - bool? ErrorReportingThread { get; } - string Name { get; set; } - List Stacktrace { get; } - string Type { get; } - } -} diff --git a/src/BugsnagUnity/Payload/IUser.cs b/src/BugsnagUnity/Payload/IUser.cs deleted file mode 100644 index a43dd1a95..000000000 --- a/src/BugsnagUnity/Payload/IUser.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -namespace BugsnagUnity -{ - public interface IUser - { - string Id { get; } - - string Name { get; } - - string Email { get; } - } -} diff --git a/src/BugsnagUnity/Payload/Metadata.cs b/src/BugsnagUnity/Payload/Metadata.cs deleted file mode 100644 index 706657294..000000000 --- a/src/BugsnagUnity/Payload/Metadata.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using BugsnagUnity; -using UnityEngine; - -namespace BugsnagUnity.Payload -{ - public class Metadata : PayloadContainer - { - private INativeClient _nativeClient = null; - - public Metadata() - { - } - - internal Metadata(INativeClient nativeClient) - { - _nativeClient = nativeClient; - } - - - public void AddMetadata(string section, string key, object value) - { - AddMetadata(section, new Dictionary{{ key, value }}); - } - - public void AddMetadata(string section, IDictionary metadataSection) - { - if (metadataSection == null) - { - ClearMetadata(section); - return; - } - if (SectionExists(section)) - { - var existingSection = (IDictionary)Get(section); - - foreach (var key in metadataSection.Keys.ToList()) - { - var value = metadataSection[key]; - if (value == null) - { - ClearMetadata(section, key); - } - else - { - existingSection[key] = value; - } - } - } - else - { - Add(section,metadataSection); - } - if (_nativeClient != null) - { - _nativeClient.AddNativeMetadata(section,metadataSection); - } - } - - - - public void ClearMetadata(string section) - { - if (SectionExists(section)) - { - Payload.Remove(section); - } - if (_nativeClient != null) - { - _nativeClient.ClearNativeMetadata(section); - } - } - - public void ClearMetadata(string section, string key) - { - if (SectionExists(section)) - { - var existingSection = (IDictionary)Payload[section]; - if (existingSection.ContainsKey(key)) - { - existingSection.Remove(key); - } - } - if (_nativeClient != null) - { - _nativeClient.ClearNativeMetadata(section,key); - } - } - - private bool SectionExists(string section) - { - return Payload.ContainsKey(section); - } - - public IDictionary GetMetadata(string section) - { - return SectionExists(section) ? (IDictionary)Payload[section] : null; - } - - public object GetMetadata(string section, string key) - { - if (SectionExists(section)) - { - var existingSection = (IDictionary)Payload[section]; - return existingSection[key]; - } - return null; - } - - internal void MergeMetadata(IDictionary newMetadata) - { - if (newMetadata == null) - { - return; - } - foreach (var section in newMetadata) - { - var sectionkey = section.Key; - var sectionToMergeIn = (IDictionary)section.Value; - AddMetadata(sectionkey, sectionToMergeIn); - } - } - - } -} diff --git a/src/BugsnagUnity/Payload/Method.cs b/src/BugsnagUnity/Payload/Method.cs deleted file mode 100644 index 4e3e1495b..000000000 --- a/src/BugsnagUnity/Payload/Method.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Linq; -using System.Reflection; -using System.Text; - -namespace BugsnagUnity.Payload -{ - class Method - { - private readonly MethodBase _methodBase; - - internal Method(MethodBase methodBase) - { - _methodBase = methodBase; - } - - internal string DisplayName() - { - if (_methodBase == null) - { - return null; - } - - var builder = new StringBuilder(); - - var type = _methodBase.DeclaringType; - - if (type != null) - { - var declaringTypeName = TypeNameHelper.GetTypeDisplayName(type, includeGenericParameterNames: true); - if (!string.IsNullOrEmpty(declaringTypeName)) - { - builder.Append(declaringTypeName).Append("."); - } - } - - builder.Append(_methodBase.Name); - - if (_methodBase.IsGenericMethod) - { - var genericArguments = string.Join(", ", _methodBase.GetGenericArguments() - .Select(arg => TypeNameHelper.GetTypeDisplayName(arg, fullName: false, includeGenericParameterNames: true)).ToArray()); - builder.Append("<").Append(genericArguments).Append(">"); - } - - var parameters = _methodBase.GetParameters().Select(p => new MethodParameter(p).DisplayName()).ToArray(); - builder.Append("("); - builder.Append(string.Join(", ", parameters)); - builder.Append(")"); - - return builder.ToString(); - } - } -} diff --git a/src/BugsnagUnity/Payload/MethodParameter.cs b/src/BugsnagUnity/Payload/MethodParameter.cs deleted file mode 100644 index 1329c7940..000000000 --- a/src/BugsnagUnity/Payload/MethodParameter.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Reflection; -using System.Text; - -namespace BugsnagUnity.Payload -{ - class MethodParameter - { - private readonly ParameterInfo _originalParameterInfo; - - internal MethodParameter(ParameterInfo parameterInfo) - { - _originalParameterInfo = parameterInfo; - } - - internal string DisplayName() - { - var builder = new StringBuilder(); - var type = _originalParameterInfo.ParameterType; - - if (_originalParameterInfo.IsOut) - { - builder.Append("out "); - } - else if (type != null && type.IsByRef) - { - builder.Append("ref "); - } - - var parameterTypeString = "?"; - - if (type != null) - { - if (type.IsByRef) - { - type = type.GetElementType(); - } - - parameterTypeString = TypeNameHelper.GetTypeDisplayName(type, fullName: false, includeGenericParameterNames: true); - } - - builder.Append(parameterTypeString).Append(" ").Append(_originalParameterInfo.Name); - - return builder.ToString(); - } - } -} diff --git a/src/BugsnagUnity/Payload/NotifierInfo.cs b/src/BugsnagUnity/Payload/NotifierInfo.cs deleted file mode 100644 index ff80889d8..000000000 --- a/src/BugsnagUnity/Payload/NotifierInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; - -namespace BugsnagUnity.Payload -{ - class NotifierInfo : Dictionary - { - internal const string NotifierName = "Unity Bugsnag Notifier"; - internal static string NotifierVersion = typeof(Client).Assembly.GetName().Version.ToString(3); - internal const string NotifierUrl = "https://github.com/bugsnag/bugsnag-unity"; - - internal static NotifierInfo Instance { get; } = new NotifierInfo { - { "name", NotifierName }, - { "version", NotifierVersion }, - { "url", NotifierUrl } - }; - } -} diff --git a/src/BugsnagUnity/Payload/PayloadContainer.cs b/src/BugsnagUnity/Payload/PayloadContainer.cs deleted file mode 100644 index b92cb3ba5..000000000 --- a/src/BugsnagUnity/Payload/PayloadContainer.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -#nullable enable - -namespace BugsnagUnity.Payload -{ - - public class PayloadContainer - { - internal PayloadDictionary Payload = new PayloadDictionary(); - - internal PayloadContainer() - { - } - - internal void Add(string key, object? value) - { - Payload.AddToPayload(key, value); - } - - internal void Add(Dictionary newValues) - { - foreach (var entry in newValues) - { - Add(entry.Key, entry.Value); - } - } - - internal object? Get(string key) - { - if (Payload.ContainsKey(key)) - { - return Payload[key]; - } - else - { - return null; - } - } - - } - - internal class PayloadDictionary : Dictionary, IFilterable - { - - } -} diff --git a/src/BugsnagUnity/Payload/PayloadExtensions.cs b/src/BugsnagUnity/Payload/PayloadExtensions.cs deleted file mode 100644 index 46770f481..000000000 --- a/src/BugsnagUnity/Payload/PayloadExtensions.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Collections.Generic; - -namespace BugsnagUnity.Payload -{ - static class PayloadExtensions - { - /// - /// Adds a key to the Bugsnag payload. If provided a null or empty string - /// value will remove the key from the dictionary. - /// - /// - /// - /// - /// - internal static void AddToPayload(this IDictionary dictionary, string key, T value) - { - if (value == null) - { - dictionary.Remove(key); - return; - } - - switch (value) - { - case System.String s: - if (!Polyfills.String.IsNullOrWhiteSpace(s)) - { - dictionary[key] = value; - } - else if (dictionary.ContainsKey(key)) - { - dictionary.Remove(key); - } - break; - default: - dictionary[key] = value; - break; - } - } - - internal static U Get(this Dictionary dictionary, T key) - { - dictionary.TryGetValue(key, out U value); - return value; - } - } -} diff --git a/src/BugsnagUnity/Payload/Report.cs b/src/BugsnagUnity/Payload/Report.cs deleted file mode 100644 index afe638783..000000000 --- a/src/BugsnagUnity/Payload/Report.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using UnityEngine; - -namespace BugsnagUnity.Payload -{ - public class Report : Dictionary, IPayload - { - - public Uri Endpoint { get; set; } - - public KeyValuePair[] Headers { get; set; } - - internal bool Ignored { get; private set; } - - public string Id { get; set; } - - internal Report(Configuration configuration, Event @event) - { - Id = Guid.NewGuid().ToString(); - Ignored = false; - Endpoint = configuration.Endpoints.Notify; - Headers = new[] { - new KeyValuePair("Bugsnag-Api-Key", @event.ApiKey), - new KeyValuePair("Bugsnag-Payload-Version", configuration.PayloadVersion), - }; - Event = @event; - this.AddToPayload("apiKey", @event.ApiKey); - this.AddToPayload("notifier", NotifierInfo.Instance); - } - - internal Report(Configuration configuration, Dictionary serialisedPayload) - { - Id = serialisedPayload["id"].ToString(); - Endpoint = configuration.Endpoints.Notify; - var apiKey = serialisedPayload["apiKey"].ToString(); - Headers = new[] { - new KeyValuePair("Bugsnag-Api-Key", apiKey), - new KeyValuePair("Bugsnag-Payload-Version", configuration.PayloadVersion), - }; - this.AddToPayload("apiKey", apiKey); - this.AddToPayload("notifier", serialisedPayload["notifier"]); - Event = new Event(serialisedPayload); - } - - public Dictionary GetSerialisablePayload() - { - var serialisableReport = new Dictionary(); - serialisableReport["id"] = Id; - serialisableReport["apiKey"] = Event.ApiKey; - serialisableReport["notifier"] = NotifierInfo.Instance; - serialisableReport["event"] = Event.GetEventPayload(); - return serialisableReport; - } - - internal void ApplyEventsArray() - { - this.AddToPayload("events", new[] { Event.GetEventPayload() }); - } - - internal Event Event; - - internal Session Session => Event.Session; - - internal bool IsHandled => Event.IsHandled; - - internal string Context => Event.Context; - - internal List Exceptions => Event.Errors; - - internal HandledState OriginalSeverity => Event.OriginalSeverity; - - public PayloadType PayloadType => PayloadType.Event; - - public void Ignore() - { - Ignored = true; - } - - } -} diff --git a/src/BugsnagUnity/Payload/Session.cs b/src/BugsnagUnity/Payload/Session.cs deleted file mode 100644 index ab2823edd..000000000 --- a/src/BugsnagUnity/Payload/Session.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.Collections.Generic; -#nullable enable - -namespace BugsnagUnity.Payload -{ - public class Session : PayloadContainer, ISession - { - - private const string ID_KEY = "id"; - private const string STARTED_AT_KEY = "startedAt"; - private const string EVENTS_KEY = "events"; - - public string? Id - { - get => (string?)Get(ID_KEY); - set => Add(ID_KEY, value); - } - - public DateTimeOffset? StartedAt - { - get => (DateTimeOffset?)Get(STARTED_AT_KEY); - set => Add(STARTED_AT_KEY, value); - } - - public IApp? App { get; set; } - - public IDevice? Device { get; set; } - - internal User? User { get; set; } - - public IUser GetUser() => User; - - public void SetUser(string id, string email, string name) - { - User = new User(id, email, name); - } - - internal int HandledCount() - { - return this.Events.Handled; - } - - internal int UnhandledCount() - { - return this.Events.Unhandled; - } - - internal SessionEvents Events - { - get => (SessionEvents)Get(EVENTS_KEY); - set => Add(EVENTS_KEY, value); - } - - internal bool Stopped { get; set; } - - internal Session() : this(DateTimeOffset.Now, 0, 0) - { - } - - internal Session(DateTimeOffset? startedAt, int handled, int unhandled) - { - Id = Guid.NewGuid().ToString(); - StartedAt = startedAt; - Events = new SessionEvents(handled, unhandled); - } - - internal Session(string providedGuid, DateTimeOffset startedAt, int handled, int unhandled) - { - Id = providedGuid; - StartedAt = startedAt; - Events = new SessionEvents(handled, unhandled); - } - - internal void AddException(Report report) - { - if (report.IsHandled) - { - Events.IncrementHandledCount(); - } - else - { - Events.IncrementUnhandledCount(); - } - } - - internal Session Copy() - { - var copy = new Session(StartedAt, Events.Handled, Events.Unhandled) - { - Id = Id - }; - return copy; - } - } - - internal class SessionEvents : Dictionary - { - private readonly object _handledLock = new object(); - private readonly object _unhandledLock = new object(); - - internal SessionEvents(int handled, int unhandled) - { - this.AddToPayload("handled", handled); - this.AddToPayload("unhandled", unhandled); - } - - internal int Handled => this["handled"]; - internal int Unhandled => this["unhandled"]; - - internal void IncrementHandledCount() - { - lock (_handledLock) - { - this["handled"]++; - } - } - - internal void IncrementUnhandledCount() - { - lock (_unhandledLock) - { - this["unhandled"]++; - } - } - } -} diff --git a/src/BugsnagUnity/Payload/SessionReport.cs b/src/BugsnagUnity/Payload/SessionReport.cs deleted file mode 100644 index e1bb08a44..000000000 --- a/src/BugsnagUnity/Payload/SessionReport.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace BugsnagUnity.Payload -{ - class SessionReport : Dictionary, IPayload - { - - public Uri Endpoint { get; set; } - - public KeyValuePair[] Headers { get; set; } - - public string Id { get; set; } - - public PayloadType PayloadType { get => PayloadType.Session; } - - private void SetRequestInfo(Configuration configuration) - { - Endpoint = configuration.Endpoints.Session; - Headers = new KeyValuePair[] { - new KeyValuePair("Bugsnag-Api-Key", configuration.ApiKey), - new KeyValuePair("Bugsnag-Payload-Version", configuration.SessionPayloadVersion), - }; - } - - public SessionReport(Configuration configuration, Session session) - { - SetRequestInfo(configuration); - this.AddToPayload("notifier", NotifierInfo.Instance); - this.AddToPayload("app", ((App)session.App).Payload); - this.AddToPayload("device", ((Device)session.Device).Payload); - var sessionObject = new Dictionary(); - sessionObject.AddToPayload("id", session.Id); - sessionObject.AddToPayload("startedAt", session.StartedAt); - sessionObject.AddToPayload("user", session.User.Payload); - this.AddToPayload("sessions", new [] { sessionObject }); - Id = session.Id; - } - - public SessionReport(Configuration configuration, Dictionary cachedReport) - { - SetRequestInfo(configuration); - this.AddToPayload("notifier", cachedReport.Get("notifier")); - this.AddToPayload("app", cachedReport.Get("app")); - this.AddToPayload("device", cachedReport.Get("device")); - this.AddToPayload("sessions", cachedReport.Get("sessions")); - Id = cachedReport["id"].ToString(); - } - - public Dictionary GetSerialisablePayload() - { - var serialisableSessionReport = new Dictionary - { - { "id", Id }, - { "app", this["app"] }, - { "device", this["device"] }, - { "notifier", this["notifier"] }, - { "sessions", this["sessions"]} - }; - return serialisableSessionReport; - } - - } -} diff --git a/src/BugsnagUnity/Payload/StackTraceLine.cs b/src/BugsnagUnity/Payload/StackTraceLine.cs deleted file mode 100644 index d98bd02f4..000000000 --- a/src/BugsnagUnity/Payload/StackTraceLine.cs +++ /dev/null @@ -1,189 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Text.RegularExpressions; - -namespace BugsnagUnity.Payload -{ - /// - /// The supported stacktrace parsing formats for Unity log messages - /// - internal enum StackTraceFormat { Standard, AndroidJava }; - - /// - /// Represents a set of Bugsnag payload stacktrace lines that are generated from a single StackTrace provided - /// by the runtime. - /// - class StackTrace : IEnumerable - { - public StackTraceLine[] StackTraceLines { get; private set; } - - internal StackTrace(StackFrame[] stackFrames) - { - StackTraceLines = new StackTraceLine[stackFrames.Length]; - for (int i = 0; i < stackFrames.Length; i++) - { - StackTraceLines[i] = StackTraceLine.FromStackFrame(stackFrames[i]); - } - } - - internal StackTrace(string stackTrace) : this(stackTrace, StackTraceFormat.Standard) { } - - internal StackTrace(string stackTrace, StackTraceFormat format) - { - string[] lines = stackTrace.Split(new[] {"\r\n","\r","\n", System.Environment.NewLine }, - System.StringSplitOptions.RemoveEmptyEntries); - var frames = new List(); - for (int i = 0; i < lines.Length; i++) - { - if (format == StackTraceFormat.AndroidJava && i == 0) - { // Skip the first line as it isn't a stack frame - continue; - } - var frame = format == StackTraceFormat.AndroidJava - ? StackTraceLine.FromAndroidJavaMessage(lines[i]) - : StackTraceLine.FromLogMessage(lines[i]); - - if (frame != null) - { - frames.Add(frame); - } - } - StackTraceLines = frames.ToArray(); - } - - public IEnumerator GetEnumerator() - { - foreach (var frame in StackTraceLines) - { - yield return frame; - } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } - - /// - /// Represents an individual stack trace line in the Bugsnag payload. - /// - public class StackTraceLine : Dictionary, IStackframe - { - private static Regex StackTraceLineRegex { get; } = new Regex(@"(?:\s*at\s)?(?(?:\(.*\)\s)?[^()]+)(?\([^()]*?\))(?:\s(?:\[.*\]\s*in\s|\(at\s*\s*)(?.*):(?\d+))?"); - private static Regex StackTraceAndroidJavaLineRegex { get; } = new Regex(@"^\s*(?:at\s)?(?[a-z][^()]+)\((?[^:]*)?(?::(?\d+))?\)"); - - - public static StackTraceLine FromLogMessage(string message) - { - Match match = StackTraceLineRegex.Match(message); - if (match.Success) - { - int? lineNumber = null; - int parsedValue; - if (System.Int32.TryParse(match.Groups["linenumber"].Value, out parsedValue)) - { - lineNumber = parsedValue; - } - string method = string.Join("", new string[]{match.Groups["method"].Value.Trim(), - match.Groups["methodargs"].Value}); - return new StackTraceLine(match.Groups["file"].Value, - lineNumber, method); - } - return new StackTraceLine("", null, message); - } - - public static StackTraceLine FromAndroidJavaMessage(string message) - { - Match match = StackTraceAndroidJavaLineRegex.Match(message); - if (match.Success) - { - int? lineNumber = null; - int parsedValue; - if (System.Int32.TryParse(match.Groups["linenumber"].Value, out parsedValue)) - { - lineNumber = parsedValue; - } - string method = string.Join("", new string[] { match.Groups["method"].Value.Trim(), "()" }); - return new StackTraceLine(match.Groups["file"].Value, - lineNumber, method); - } - // Likely a C# line in the Android stacktrace - return FromLogMessage(message); - } - - internal static StackTraceLine FromStackFrame(StackFrame stackFrame) - { - var method = stackFrame.GetMethod(); - var file = stackFrame.GetFileName(); - var lineNumber = stackFrame.GetFileLineNumber(); - var methodName = new Method(method).DisplayName(); - - return new StackTraceLine(file, lineNumber, methodName); - } - - internal StackTraceLine(string file, int? lineNumber, string methodName) - { - this.AddToPayload("file", file); - if (lineNumber.HasValue) - { - this.AddToPayload("lineNumber", lineNumber.Value); - } - this.AddToPayload("method", methodName); - } - internal StackTraceLine(Dictionary data) - { - foreach (var item in data) - { - this.AddToPayload(item.Key, item.Value); - } - } - - public string File - { - get - { - return this.Get("file") as string; - } - set - { - this.AddToPayload("file", value); - } - } - - public int? LineNumber - { - get - { - return this.Get("lineNumber") as int?; - } - set - { - this.AddToPayload("lineNumber", value); - } - } - - public string Method - { - get - { - return this.Get("method") as string; - } - set - { - this.AddToPayload("method", value); - } - } - - public string FrameAddress { get; set; } - public bool? IsLr { get; set; } - public bool? IsPc { get; set; } - public string MachoFile { get; set; } - public string MachoLoadAddress { get; set; } - public string MachoUuid { get; set; } - public string MachoVmAddress { get; set; } - public string SymbolAddress { get; set; } - public bool? InProject { get; set; } - } -} diff --git a/src/BugsnagUnity/Payload/User.cs b/src/BugsnagUnity/Payload/User.cs deleted file mode 100644 index f8b7cca77..000000000 --- a/src/BugsnagUnity/Payload/User.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel; -using UnityEngine.Events; -#nullable enable - -namespace BugsnagUnity.Payload -{ - public class User : PayloadContainer, IUser - { - internal UnityEvent PropertyChanged = new UnityEvent(); - - private const string ID_KEY = "id"; - private const string NAME_KEY = "name"; - private const string EMAIL_KEY = "email"; - - - internal User() - { - - } - - public User(string id, string email, string name) - { - Id = id; - Name = name; - Email = email; - } - - public string Id - { - get { - var @object = Get(ID_KEY); - if (@object == null) - { - return string.Empty; - } - return (string)@object; - } - set - { - Add(ID_KEY, value); - PropertyChanged.Invoke(); - } - } - - public string Name - { - get - { - var @object = Get(NAME_KEY); - if (@object == null) - { - return string.Empty; - } - return (string)@object; - } - set - { - Add(NAME_KEY, value); - PropertyChanged.Invoke(); - } - } - - public string Email - { - get - { - var @object = Get(EMAIL_KEY); - if (@object == null) - { - return string.Empty; - } - return (string)@object; - } - set - { - Add(EMAIL_KEY, value); - PropertyChanged.Invoke(); - } - } - - internal User Clone() - { - return (User)MemberwiseClone(); - } - } -} diff --git a/src/BugsnagUnity/PayloadManager.cs b/src/BugsnagUnity/PayloadManager.cs deleted file mode 100644 index 178d04c56..000000000 --- a/src/BugsnagUnity/PayloadManager.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using BugsnagUnity.Payload; -using UnityEngine; -namespace BugsnagUnity -{ - public class PayloadManager - { - - private static List _pendingPayloads = new List(); - - private CacheManager _cacheManager; - - private class PendingPayload - { - public string Json; - public string PayloadId; - - public PendingPayload(string json, string payloadId) - { - Json = json; - PayloadId = payloadId; - } - } - - internal PayloadManager(CacheManager cacheManager) - { - _cacheManager = cacheManager; - } - - internal bool AddPendingPayload(IPayload payload) - { - try - { - using (var stream = new MemoryStream()) - using (var reader = new StreamReader(stream)) - using (var writer = new StreamWriter(stream, new UTF8Encoding(false)) { AutoFlush = false }) - { - SimpleJson.SerializeObject(payload.GetSerialisablePayload(), writer); - writer.Flush(); - stream.Position = 0; - var jsonString = reader.ReadToEnd(); - _pendingPayloads.Add(new PendingPayload(jsonString, payload.Id)); - } - return true; - } - catch - { - // If payload serialisation fails ignore the payload - return false; - } - } - - private PendingPayload GetPendingPayload(string id) - { - foreach (var payload in _pendingPayloads) - { - if (payload.PayloadId == id) - { - return payload; - } - } - return null; - } - - internal void SendPayloadFailed(IPayload payload) - { - switch (payload.PayloadType) - { - case PayloadType.Session: - CacheSession(payload.Id); - break; - case PayloadType.Event: - CacheEvent(payload.Id); - break; - } - } - - internal void CacheSession(string reportId) - { - var pendingSession = GetPendingPayload(reportId); - if (pendingSession == null) - { - return; - } - _cacheManager.SaveSessionToCache(pendingSession.PayloadId, pendingSession.Json); - RemovePendingPayload(reportId); - } - - internal void CacheEvent(string reportId) - { - var pendingEvent = GetPendingPayload(reportId); - if (pendingEvent == null) - { - return; - } - _cacheManager.SaveEventToCache(pendingEvent.PayloadId, pendingEvent.Json); - RemovePendingPayload(reportId); - } - - internal void RemovePayload(IPayload payload) - { - RemovePendingPayload(payload.Id); - if (payload.PayloadType == PayloadType.Session) - { - RemoveCachedSession(payload.Id); - } - else - { - RemoveCachedEvent(payload.Id); - } - } - - private void RemovePendingPayload(string id) - { - _pendingPayloads.RemoveAll(item => item.PayloadId == id); - } - - internal void RemoveCachedEvent(string id) - { - _cacheManager.RemoveCachedEvent(id); - } - - internal void RemoveCachedSession(string id) - { - _cacheManager.RemoveCachedSession(id); - } - - } -} diff --git a/src/BugsnagUnity/PerformanceHelper.cs b/src/BugsnagUnity/PerformanceHelper.cs deleted file mode 100644 index 2e899f3c2..000000000 --- a/src/BugsnagUnity/PerformanceHelper.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Linq; -using System.Reflection; -using BugsnagUnity.Payload; -using UnityEngine; - -namespace BugsnagUnity -{ - internal class PerformanceHelper - { - const string BUGSNAG_PERFORMANCE_ASSEMBLY_NAME = "BugsnagUnityPerformance.BugsnagPerformance"; - const string GET_PERFORMANCE_STATE_METHOD_NAME = "GetPerformanceState"; - - static MethodInfo _getPerformanceStateMethodInfo; - private static bool _isPerformanceLibraryAvailable = true; - - [Serializable] - private class PerformanceState - { - public string currentContextSpanId; - public string currentContextTraceId; - public PerformanceState(string currentContextSpanId, string currentContextTraceId) - { - this.currentContextSpanId = currentContextSpanId; - this.currentContextTraceId = currentContextTraceId; - } - } - - internal static Correlation GetCurrentPerformanceSpanContext() - { - if (!_isPerformanceLibraryAvailable) - { - return null; - } - - try - { - InitializeGetCurrentContextInternalMethodIfNeeded(); - - string result = (string)_getPerformanceStateMethodInfo?.Invoke(null, null); - - if (string.IsNullOrEmpty(result)) - { - return null; - } - - var performanceState = JsonUtility.FromJson(result); - - if (performanceState == null) - { - return null; - } - - var correlation = new Correlation(performanceState.currentContextTraceId, performanceState.currentContextSpanId); - - return correlation; - } - catch (Exception ex) - { - // Silently handle case where performance library is not available or out of date - _isPerformanceLibraryAvailable = false; - return null; - } - } - - private static void InitializeGetCurrentContextInternalMethodIfNeeded() - { - if (_getPerformanceStateMethodInfo != null) return; - - var bugsnagPerformanceType = AppDomain.CurrentDomain.GetAssemblies() - .Select(assembly => assembly.GetType(BUGSNAG_PERFORMANCE_ASSEMBLY_NAME)) - .FirstOrDefault(type => type != null); - - _getPerformanceStateMethodInfo = bugsnagPerformanceType?.GetMethod( - GET_PERFORMANCE_STATE_METHOD_NAME, - BindingFlags.NonPublic | BindingFlags.Static - ); - } - - } -} diff --git a/src/BugsnagUnity/Polyfills.cs b/src/BugsnagUnity/Polyfills.cs deleted file mode 100644 index e877fc832..000000000 --- a/src/BugsnagUnity/Polyfills.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace BugsnagUnity.Polyfills -{ - static class String - { - internal static bool IsNullOrWhiteSpace(string s) - { - if (s == null) return true; - - for (int i = 0; i < s.Length; i++) - { - if (!Char.IsWhiteSpace(s[i])) return false; - } - - return true; - } - } -} diff --git a/src/BugsnagUnity/PostProcessBuild.cs b/src/BugsnagUnity/PostProcessBuild.cs deleted file mode 100644 index 2f58d0bf5..000000000 --- a/src/BugsnagUnity/PostProcessBuild.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; -namespace BugsnagUnity -{ - public static class PostProcessBuild - { - - class XcodeProjectInformation - { - public LinkedList Lines { get; } - - public LinkedListNode CurrentLine { get; private set; } - - public XcodeProjectInformation(LinkedList lines) - { - Lines = lines; - CurrentLine = lines.First; - } - - public void AdvanceCurrentLine() - { - CurrentLine = CurrentLine.Next; - } - - } - - public static void Apply(LinkedList lines) - { - Apply(lines, Guid.NewGuid().ToString("N").Substring(0, 24).ToUpperInvariant()); - } - - /// - /// Apply the required changes to the lines of the xcode project. - /// - /// Lines. - /// Symbol script upload UUID. - public static void Apply(LinkedList lines, string symbolScriptUploadUuid) - { - - var info = new XcodeProjectInformation(lines); - - while (info.CurrentLine != null) - { - ProcessBuildConfigurationSection(info); - info.AdvanceCurrentLine(); - } - } - - /// - /// Processes the build configuration section. Here we need to enable two - /// build flags relating to certain exception types. - /// - /// Data. - static void ProcessBuildConfigurationSection(XcodeProjectInformation info) - { - if (info.CurrentLine.Value.Equals("/* Begin XCBuildConfiguration section */")) - { - while (info.CurrentLine != null) - { - if (info.CurrentLine.Value.Equals("/* End XCBuildConfiguration section */")) - { - break; - } - - // if these flags are not set at all should we add them? This is all - // that we used to do and we did not handle them not being set at all - if (info.CurrentLine.Value.Contains("GCC_ENABLE_OBJC_EXCEPTIONS") || - info.CurrentLine.Value.Contains("GCC_ENABLE_CPP_EXCEPTIONS")) - { - info.CurrentLine.Value = info.CurrentLine.Value.Replace("NO", "YES"); - } - - info.AdvanceCurrentLine(); - } - } - } - } -} diff --git a/src/BugsnagUnity/SessionTracker.cs b/src/BugsnagUnity/SessionTracker.cs deleted file mode 100644 index 5ee9832b7..000000000 --- a/src/BugsnagUnity/SessionTracker.cs +++ /dev/null @@ -1,188 +0,0 @@ -using BugsnagUnity.Payload; -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("BugsnagUnity.Tests")] - -namespace BugsnagUnity -{ - public interface ISessionTracker - { - void StartSession(); - - void PauseSession(); - - bool ResumeSession(); - - Session CurrentSession { get; } - - void AddException(Report report); - - void StartManagedSession(); - } - - class SessionTracker : ISessionTracker - { - Client Client { get; } - - Session _currentSession; - - public Session CurrentSession - { - get - { - return GetCurrentSession(); - } - private set => _currentSession = value; - } - - private Session GetCurrentSession() - { - if (ShouldManageSessions()) - { - var session = _currentSession; - - if (session != null && !session.Stopped) - { - return session?.Copy(); - } - return null; - } - else - { - return Client.NativeClient.GetCurrentSession(); - } - - } - - internal SessionTracker(Client client) - { - Client = client; - } - - - public void StartSession() - { - if (ShouldManageSessions()) - { - StartManagedSession(); - } - else - { - Client.NativeClient.StartSession(); - } - } - - public void StartManagedSession() - { - var session = new Session(); - - var app = new App(Client.Configuration); - Client.NativeClient.PopulateApp(app); - session.App = app; - - var device = new Device(Client.Configuration, Client.CacheManager.GetCachedDeviceId()); - Client.NativeClient.PopulateDevice(device); - session.Device = device; - - session.User = Client.GetUser().Clone(); - - foreach (var sessionCallback in Client.Configuration.GetOnSessionCallbacks()) - { - try { - if (!sessionCallback.Invoke(session)) - { - return; - } - } catch { - // If the callback causes an exception, ignore it and execute the next one - } - } - - if (Client.Configuration.Endpoints.IsValid) - { - var payload = new SessionReport(Client.Configuration, session); - if (Client.PayloadManager.AddPendingPayload(payload)) - { - Client.Send(payload); - } - } - else - { - UnityEngine.Debug.LogWarning("Invalid configuration. Configuration.Endpoints is not correctly configured, no sessions will be sent."); - } - - CurrentSession = session; - } - - public void PauseSession() - { - if (ShouldManageSessions()) - { - PauseManagedSession(); - } - else - { - Client.NativeClient.PauseSession(); - } - } - - private void PauseManagedSession() - { - var session = _currentSession; - if (session != null) - { - session.Stopped = true; - } - } - - public bool ResumeSession() - { - if (ShouldManageSessions()) - { - return ResumeManagedSession(); - } - else - { - return Client.NativeClient.ResumeSession(); - } - - } - - private bool ResumeManagedSession() - { - var session = _currentSession; - bool resumed; - if (session == null) - { - StartSession(); - resumed = false; - } - else - { - resumed = session.Stopped; - session.Stopped = false; - } - return resumed; - } - - public void AddException(Report report) - { - if (ShouldManageSessions()) - { - if (_currentSession != null && !_currentSession.Stopped) - { - _currentSession.AddException(report); - } - } - else - { - Client.NativeClient.UpdateSession(report.Session); - } - } - - private bool ShouldManageSessions() - { - return Client.IsUsingFallback(); - } - } -} diff --git a/src/BugsnagUnity/Severity.cs b/src/BugsnagUnity/Severity.cs deleted file mode 100644 index 455d706ff..000000000 --- a/src/BugsnagUnity/Severity.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -namespace BugsnagUnity -{ - /// - /// The Bugsnag API defines these three severities - /// - public enum Severity - { - Info = 0, - - Warning = 1, - - Error = 2 - } - - static class LogTypeExtensions - { - /// - /// Used to stop the dictionary boxing the value types - /// - class LogTypeComparer : IEqualityComparer - { - public bool Equals(LogType x, LogType y) - { - return x == y; - } - - public int GetHashCode(LogType obj) - { - return (int)obj; - } - } - - /// - /// The LogType enum from Unity doesn't have its enum values in an expected - /// numerical order. This allows us to map them to something that we would - /// expect. - /// - private static Dictionary LogTypeMapping { get; } = new Dictionary(5, new LogTypeComparer()) - { - { LogType.Log, 0 }, - { LogType.Warning, 1 }, - { LogType.Assert, 2 }, - { LogType.Error, 3 }, - { LogType.Exception, 4 }, - }; - - internal static bool IsGreaterThanOrEqualTo(this LogType logType, LogType log) - { - return LogTypeMapping[logType] >= LogTypeMapping[log]; - } - } -} diff --git a/src/BugsnagUnity/SimpleJson.cs b/src/BugsnagUnity/SimpleJson.cs deleted file mode 100644 index 438a8db3a..000000000 --- a/src/BugsnagUnity/SimpleJson.cs +++ /dev/null @@ -1,2190 +0,0 @@ -//----------------------------------------------------------------------- -// -// Copyright (c) 2011, The Outercurve Foundation. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.opensource.org/licenses/mit-license.php -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Nathan Totten (ntotten.com), Jim Zimmerman (jimzimmerman.com) and Prabir Shrestha (prabir.me) -// https://github.com/facebook-csharp-sdk/simple-json -//----------------------------------------------------------------------- - -// VERSION: - -// NOTE: uncomment the following line to make SimpleJson class internal. -#define SIMPLE_JSON_INTERNAL - -// NOTE: uncomment the following line to make JsonArray and JsonObject class internal. -#define SIMPLE_JSON_OBJARRAYINTERNAL - -// NOTE: uncomment the following line to enable dynamic support. -//#define SIMPLE_JSON_DYNAMIC - -// NOTE: uncomment the following line to enable DataContract support. -//#define SIMPLE_JSON_DATACONTRACT - -// NOTE: uncomment the following line to enable IReadOnlyCollection and IReadOnlyList support. -//#define SIMPLE_JSON_READONLY_COLLECTIONS - -// NOTE: uncomment the following line to disable linq expressions/compiled lambda (better performance) instead of method.invoke(). -// define if you are using .net framework <= 3.0 or < WP7.5 -//#define SIMPLE_JSON_NO_LINQ_EXPRESSION - -// NOTE: uncomment the following line if you are compiling under Window Metro style application/library. -// usually already defined in properties -//#define NETFX_CORE; - -// If you are targetting WinStore, WP8 and NET4.5+ PCL make sure to #define SIMPLE_JSON_TYPEINFO; - -// original json parsing code from http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html - -#if NETFX_CORE || NETSTANDARD1_3 || NETSTANDARD2_0 -#define SIMPLE_JSON_TYPEINFO -#endif - -using System; -using System.IO; -using System.CodeDom.Compiler; -using System.Collections; -using System.Collections.Generic; -#if !SIMPLE_JSON_NO_LINQ_EXPRESSION -using System.Linq.Expressions; -#endif -using System.ComponentModel; -using System.Diagnostics.CodeAnalysis; -#if SIMPLE_JSON_DYNAMIC -using System.Dynamic; -#endif -using System.Globalization; -using System.Reflection; -using System.Runtime.Serialization; -using System.Text; -using BugsnagUnity.Reflection; - -// ReSharper disable LoopCanBeConvertedToQuery -// ReSharper disable RedundantExplicitArrayCreation -// ReSharper disable SuggestUseVarKeywordEvident -namespace BugsnagUnity -{ - /// - /// Represents the json array. - /// - [GeneratedCode("simple-json", "1.0.0")] - [EditorBrowsable(EditorBrowsableState.Never)] - [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] -#if SIMPLE_JSON_OBJARRAYINTERNAL - internal -#else - public -#endif - class JsonArray : List - { - /// - /// Initializes a new instance of the class. - /// - public JsonArray() { } - - /// - /// Initializes a new instance of the class. - /// - /// The capacity of the json array. - public JsonArray(int capacity) : base(capacity) { } - } - - /// - /// Represents the json object. - /// - [GeneratedCode("simple-json", "1.0.0")] - [EditorBrowsable(EditorBrowsableState.Never)] - [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] -#if SIMPLE_JSON_OBJARRAYINTERNAL - internal -#else - public -#endif - class JsonObject : -#if SIMPLE_JSON_DYNAMIC - DynamicObject, -#endif - IDictionary - { - /// - /// The internal member dictionary. - /// - private readonly Dictionary _members; - - /// - /// Initializes a new instance of . - /// - public JsonObject() - { - _members = new Dictionary(); - } - - public Dictionary GetDictionary() - { - var dictionary = new Dictionary(); - - foreach (var item in _members) - { - if (item.Value is JsonObject json) - { - dictionary.Add(item.Key, json.GetDictionary()); - } - else - { - dictionary.Add(item.Key, item.Value); - } - } - - return dictionary; - - } - - /// - /// Initializes a new instance of . - /// - /// The implementation to use when comparing keys, or null to use the default for the type of the key. - public JsonObject(IEqualityComparer comparer) - { - _members = new Dictionary(comparer); - } - - /// - /// Gets the at the specified index. - /// - /// - public object this[int index] - { - get { return GetAtIndex(_members, index); } - } - - internal static object GetAtIndex(IDictionary obj, int index) - { - if (obj == null) - throw new ArgumentNullException("obj"); - if (index >= obj.Count) - throw new ArgumentOutOfRangeException("index"); - int i = 0; - foreach (KeyValuePair o in obj) - if (i++ == index) return o.Value; - return null; - } - - /// - /// Adds the specified key. - /// - /// The key. - /// The value. - public void Add(string key, object value) - { - _members.Add(key, value); - } - - /// - /// Determines whether the specified key contains key. - /// - /// The key. - /// - /// true if the specified key contains key; otherwise, false. - /// - public bool ContainsKey(string key) - { - return _members.ContainsKey(key); - } - - /// - /// Gets the keys. - /// - /// The keys. - public ICollection Keys - { - get { return _members.Keys; } - } - - /// - /// Removes the specified key. - /// - /// The key. - /// - public bool Remove(string key) - { - return _members.Remove(key); - } - - /// - /// Tries the get value. - /// - /// The key. - /// The value. - /// - public bool TryGetValue(string key, out object value) - { - return _members.TryGetValue(key, out value); - } - - /// - /// Gets the values. - /// - /// The values. - public ICollection Values - { - get { return _members.Values; } - } - - /// - /// Gets or sets the with the specified key. - /// - /// - public object this[string key] - { - get { return _members[key]; } - set { _members[key] = value; } - } - - /// - /// Adds the specified item. - /// - /// The item. - public void Add(KeyValuePair item) - { - _members.Add(item.Key, item.Value); - } - - /// - /// Clears this instance. - /// - public void Clear() - { - _members.Clear(); - } - - /// - /// Determines whether [contains] [the specified item]. - /// - /// The item. - /// - /// true if [contains] [the specified item]; otherwise, false. - /// - public bool Contains(KeyValuePair item) - { - return _members.ContainsKey(item.Key) && _members[item.Key] == item.Value; - } - - /// - /// Copies to. - /// - /// The array. - /// Index of the array. - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - if (array == null) throw new ArgumentNullException("array"); - int num = Count; - foreach (KeyValuePair kvp in this) - { - array[arrayIndex++] = kvp; - if (--num <= 0) - return; - } - } - - /// - /// Gets the count. - /// - /// The count. - public int Count - { - get { return _members.Count; } - } - - /// - /// Gets a value indicating whether this instance is read only. - /// - /// - /// true if this instance is read only; otherwise, false. - /// - public bool IsReadOnly - { - get { return false; } - } - - /// - /// Removes the specified item. - /// - /// The item. - /// - public bool Remove(KeyValuePair item) - { - return _members.Remove(item.Key); - } - - /// - /// Gets the enumerator. - /// - /// - public IEnumerator> GetEnumerator() - { - return _members.GetEnumerator(); - } - - /// - /// Returns an enumerator that iterates through a collection. - /// - /// - /// An object that can be used to iterate through the collection. - /// - IEnumerator IEnumerable.GetEnumerator() - { - return _members.GetEnumerator(); - } - -#if SIMPLE_JSON_DYNAMIC - /// - /// Provides implementation for type conversion operations. Classes derived from the class can override this method to specify dynamic behavior for operations that convert an object from one type to another. - /// - /// Provides information about the conversion operation. The binder.Type property provides the type to which the object must be converted. For example, for the statement (String)sampleObject in C# (CType(sampleObject, Type) in Visual Basic), where sampleObject is an instance of the class derived from the class, binder.Type returns the type. The binder.Explicit property provides information about the kind of conversion that occurs. It returns true for explicit conversion and false for implicit conversion. - /// The result of the type conversion operation. - /// - /// Alwasy returns true. - /// - public override bool TryConvert(ConvertBinder binder, out object result) - { - // - if (binder == null) - throw new ArgumentNullException("binder"); - // - Type targetType = binder.Type; - - if ((targetType == typeof(IEnumerable)) || - (targetType == typeof(IEnumerable>)) || - (targetType == typeof(IDictionary)) || - (targetType == typeof(IDictionary))) - { - result = this; - return true; - } - - return base.TryConvert(binder, out result); - } - - /// - /// Provides the implementation for operations that delete an object member. This method is not intended for use in C# or Visual Basic. - /// - /// Provides information about the deletion. - /// - /// Alwasy returns true. - /// - public override bool TryDeleteMember(DeleteMemberBinder binder) - { - // - if (binder == null) - throw new ArgumentNullException("binder"); - // - return _members.Remove(binder.Name); - } - - /// - /// Provides the implementation for operations that get a value by index. Classes derived from the class can override this method to specify dynamic behavior for indexing operations. - /// - /// Provides information about the operation. - /// The indexes that are used in the operation. For example, for the sampleObject[3] operation in C# (sampleObject(3) in Visual Basic), where sampleObject is derived from the DynamicObject class, is equal to 3. - /// The result of the index operation. - /// - /// Alwasy returns true. - /// - public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) - { - if (indexes == null) throw new ArgumentNullException("indexes"); - if (indexes.Length == 1) - { - result = ((IDictionary)this)[(string)indexes[0]]; - return true; - } - result = null; - return true; - } - - /// - /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. - /// - /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. - /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . - /// - /// Alwasy returns true. - /// - public override bool TryGetMember(GetMemberBinder binder, out object result) - { - object value; - if (_members.TryGetValue(binder.Name, out value)) - { - result = value; - return true; - } - result = null; - return true; - } - - /// - /// Provides the implementation for operations that set a value by index. Classes derived from the class can override this method to specify dynamic behavior for operations that access objects by a specified index. - /// - /// Provides information about the operation. - /// The indexes that are used in the operation. For example, for the sampleObject[3] = 10 operation in C# (sampleObject(3) = 10 in Visual Basic), where sampleObject is derived from the class, is equal to 3. - /// The value to set to the object that has the specified index. For example, for the sampleObject[3] = 10 operation in C# (sampleObject(3) = 10 in Visual Basic), where sampleObject is derived from the class, is equal to 10. - /// - /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown. - /// - public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value) - { - if (indexes == null) throw new ArgumentNullException("indexes"); - if (indexes.Length == 1) - { - ((IDictionary)this)[(string)indexes[0]] = value; - return true; - } - return base.TrySetIndex(binder, indexes, value); - } - - /// - /// Provides the implementation for operations that set member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as setting a value for a property. - /// - /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member to which the value is being assigned. For example, for the statement sampleObject.SampleProperty = "Test", where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. - /// The value to set to the member. For example, for sampleObject.SampleProperty = "Test", where sampleObject is an instance of the class derived from the class, the is "Test". - /// - /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown.) - /// - public override bool TrySetMember(SetMemberBinder binder, object value) - { - // - if (binder == null) - throw new ArgumentNullException("binder"); - // - _members[binder.Name] = value; - return true; - } - - /// - /// Returns the enumeration of all dynamic member names. - /// - /// - /// A sequence that contains dynamic member names. - /// - public override IEnumerable GetDynamicMemberNames() - { - foreach (var key in Keys) - yield return key; - } -#endif - } -} - -namespace BugsnagUnity -{ - /// - /// This class encodes and decodes JSON strings. - /// Spec. details, see http://www.json.org/ - /// - /// JSON uses Arrays and Objects. These correspond here to the datatypes JsonArray(IList<object>) and JsonObject(IDictionary<string,object>). - /// All numbers are parsed to doubles. - /// - [GeneratedCode("simple-json", "1.0.0")] -#if SIMPLE_JSON_INTERNAL - internal -#else - public -#endif - static class SimpleJson - { - private const int TOKEN_NONE = 0; - private const int TOKEN_CURLY_OPEN = 1; - private const int TOKEN_CURLY_CLOSE = 2; - private const int TOKEN_SQUARED_OPEN = 3; - private const int TOKEN_SQUARED_CLOSE = 4; - private const int TOKEN_COLON = 5; - private const int TOKEN_COMMA = 6; - private const int TOKEN_STRING = 7; - private const int TOKEN_NUMBER = 8; - private const int TOKEN_TRUE = 9; - private const int TOKEN_FALSE = 10; - private const int TOKEN_NULL = 11; - private const int BUILDER_CAPACITY = 2000; - - private static readonly char[] EscapeTable; - private static readonly char[] EscapeCharacters; - private static readonly string EscapeCharactersString = new string(EscapeCharacters); - - static SimpleJson() - { - var escapeCharacters = new List() { '"', '\\', '\b', '\f', '\n', '\r', '\t' }; - - EscapeTable = new char[159]; - foreach (char item in System.Linq.Enumerable.Range(0, 32)) - { - escapeCharacters.Add(item); - EscapeTable[item] = '!'; - } - - foreach (char item in System.Linq.Enumerable.Range(127, 32)) - { - escapeCharacters.Add(item); - EscapeTable[item] = '!'; - } - - EscapeCharacters = escapeCharacters.ToArray(); - - EscapeTable['"'] = '"'; - EscapeTable['\\'] = '\\'; - EscapeTable['\b'] = 'b'; - EscapeTable['\f'] = 'f'; - EscapeTable['\n'] = 'n'; - EscapeTable['\r'] = 'r'; - EscapeTable['\t'] = 't'; - } - - /// - /// Parses the string json into a value - /// - /// A JSON string. - /// An IList<object>, a IDictionary<string,object>, a double, a string, null, true, or false - public static object DeserializeObject(string json) - { - object obj; - if (TryDeserializeObject(json, out obj)) - return obj; - throw new SerializationException("Invalid JSON string"); - } - - /// - /// Try parsing the json string into a value. - /// - /// - /// A JSON string. - /// - /// - /// The object. - /// - /// - /// Returns true if successfull otherwise false. - /// - [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] - public static bool TryDeserializeObject(string json, out object obj) - { - bool success = true; - if (json != null) - { - char[] charArray = json.ToCharArray(); - int index = 0; - obj = ParseValue(charArray, ref index, ref success); - } - else - obj = null; - - return success; - } - - public static object DeserializeObject(string json, Type type, IJsonSerializerStrategy jsonSerializerStrategy) - { - object jsonObject = DeserializeObject(json); - return type == null || jsonObject != null && ReflectionUtils.IsAssignableFrom(jsonObject.GetType(), type) - ? jsonObject - : (jsonSerializerStrategy ?? CurrentJsonSerializerStrategy).DeserializeObject(jsonObject, type); - } - - public static object DeserializeObject(string json, Type type) - { - return DeserializeObject(json, type, null); - } - - public static T DeserializeObject(string json, IJsonSerializerStrategy jsonSerializerStrategy) - { - return (T)DeserializeObject(json, typeof(T), jsonSerializerStrategy); - } - - public static T DeserializeObject(string json) - { - return (T)DeserializeObject(json, typeof(T), null); - } - - /// - /// Converts a IDictionary<string,object> / IList<object> object into a JSON string - /// - /// A IDictionary<string,object> / IList<object> - /// Serializer strategy to use - /// - /// A JSON encoded string, or null if object 'json' is not serializable - public static void SerializeObject(object json, StreamWriter writer, IJsonSerializerStrategy jsonSerializerStrategy, IDictionary seen) - { - SerializeObject(json, writer, jsonSerializerStrategy, seen, new Dictionary()); - } - - public static void SerializeObject(object json, StreamWriter writer, IJsonSerializerStrategy jsonSerializerStrategy, IDictionary seen, IDictionary filters) - { - SerializeValue(jsonSerializerStrategy, json, writer, seen, filters, false); - } - - public static void SerializeObject(object json, StreamWriter writer) - { - SerializeObject(json, writer, new Dictionary()); - } - - public static void SerializeObject(object json, StreamWriter writer, IDictionary filters) - { - SerializeObject(json, writer, CurrentJsonSerializerStrategy, new Dictionary(), filters); - } - - public static string EscapeToJavascriptString(string jsonString) - { - if (string.IsNullOrEmpty(jsonString)) - return jsonString; - - StringBuilder sb = new StringBuilder(); - char c; - - for (int i = 0; i < jsonString.Length;) - { - c = jsonString[i++]; - - if (c == '\\') - { - int remainingLength = jsonString.Length - i; - if (remainingLength >= 2) - { - char lookahead = jsonString[i]; - if (lookahead == '\\') - { - sb.Append('\\'); - ++i; - } - else if (lookahead == '"') - { - sb.Append("\""); - ++i; - } - else if (lookahead == 't') - { - sb.Append('\t'); - ++i; - } - else if (lookahead == 'b') - { - sb.Append('\b'); - ++i; - } - else if (lookahead == 'n') - { - sb.Append('\n'); - ++i; - } - else if (lookahead == 'r') - { - sb.Append('\r'); - ++i; - } - } - } - else - { - sb.Append(c); - } - } - return sb.ToString(); - } - - static IDictionary ParseObject(char[] json, ref int index, ref bool success) - { - IDictionary table = new JsonObject(); - int token; - - // { - NextToken(json, ref index); - - bool done = false; - while (!done) - { - token = LookAhead(json, index); - if (token == TOKEN_NONE) - { - success = false; - return null; - } - else if (token == TOKEN_COMMA) - NextToken(json, ref index); - else if (token == TOKEN_CURLY_CLOSE) - { - NextToken(json, ref index); - return table; - } - else - { - // name - string name = ParseString(json, ref index, ref success); - if (!success) - { - success = false; - return null; - } - // : - token = NextToken(json, ref index); - if (token != TOKEN_COLON) - { - success = false; - return null; - } - // value - object value = ParseValue(json, ref index, ref success); - if (!success) - { - success = false; - return null; - } - table[name] = value; - } - } - return table; - } - - static JsonArray ParseArray(char[] json, ref int index, ref bool success) - { - JsonArray array = new JsonArray(); - - // [ - NextToken(json, ref index); - - bool done = false; - while (!done) - { - int token = LookAhead(json, index); - if (token == TOKEN_NONE) - { - success = false; - return null; - } - else if (token == TOKEN_COMMA) - NextToken(json, ref index); - else if (token == TOKEN_SQUARED_CLOSE) - { - NextToken(json, ref index); - break; - } - else - { - object value = ParseValue(json, ref index, ref success); - if (!success) - return null; - array.Add(value); - } - } - return array; - } - - static object ParseValue(char[] json, ref int index, ref bool success) - { - switch (LookAhead(json, index)) - { - case TOKEN_STRING: - return ParseString(json, ref index, ref success); - case TOKEN_NUMBER: - return ParseNumber(json, ref index, ref success); - case TOKEN_CURLY_OPEN: - return ParseObject(json, ref index, ref success); - case TOKEN_SQUARED_OPEN: - return ParseArray(json, ref index, ref success); - case TOKEN_TRUE: - NextToken(json, ref index); - return true; - case TOKEN_FALSE: - NextToken(json, ref index); - return false; - case TOKEN_NULL: - NextToken(json, ref index); - return null; - case TOKEN_NONE: - break; - } - success = false; - return null; - } - - static string ParseString(char[] json, ref int index, ref bool success) - { - StringBuilder s = new StringBuilder(BUILDER_CAPACITY); - char c; - - EatWhitespace(json, ref index); - - // " - c = json[index++]; - bool complete = false; - while (!complete) - { - if (index == json.Length) - break; - - c = json[index++]; - if (c == '"') - { - complete = true; - break; - } - else if (c == '\\') - { - if (index == json.Length) - break; - c = json[index++]; - if (c == '"') - s.Append('"'); - else if (c == '\\') - s.Append('\\'); - else if (c == '/') - s.Append('/'); - else if (c == 'b') - s.Append('\b'); - else if (c == 'f') - s.Append('\f'); - else if (c == 'n') - s.Append('\n'); - else if (c == 'r') - s.Append('\r'); - else if (c == 't') - s.Append('\t'); - else if (c == 'u') - { - int remainingLength = json.Length - index; - if (remainingLength >= 4) - { - // parse the 32 bit hex into an integer codepoint - uint codePoint; - if (!(success = UInt32.TryParse(new string(json, index, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out codePoint))) - return ""; - - // convert the integer codepoint to a unicode char and add to string - if (0xD800 <= codePoint && codePoint <= 0xDBFF) // if high surrogate - { - index += 4; // skip 4 chars - remainingLength = json.Length - index; - if (remainingLength >= 6) - { - uint lowCodePoint; - if (new string(json, index, 2) == "\\u" && UInt32.TryParse(new string(json, index + 2, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out lowCodePoint)) - { - if (0xDC00 <= lowCodePoint && lowCodePoint <= 0xDFFF) // if low surrogate - { - s.Append((char)codePoint); - s.Append((char)lowCodePoint); - index += 6; // skip 6 chars - continue; - } - } - } - success = false; // invalid surrogate pair - return ""; - } - s.Append(ConvertFromUtf32((int)codePoint)); - // skip 4 chars - index += 4; - } - else - break; - } - } - else - s.Append(c); - } - if (!complete) - { - success = false; - return null; - } - return s.ToString(); - } - - private static string ConvertFromUtf32(int utf32) - { - // http://www.java2s.com/Open-Source/CSharp/2.6.4-mono-.net-core/System/System/Char.cs.htm - if (utf32 < 0 || utf32 > 0x10FFFF) - throw new ArgumentOutOfRangeException("utf32", "The argument must be from 0 to 0x10FFFF."); - if (0xD800 <= utf32 && utf32 <= 0xDFFF) - throw new ArgumentOutOfRangeException("utf32", "The argument must not be in surrogate pair range."); - if (utf32 < 0x10000) - return new string((char)utf32, 1); - utf32 -= 0x10000; - return new string(new char[] { (char)((utf32 >> 10) + 0xD800), (char)(utf32 % 0x0400 + 0xDC00) }); - } - - static object ParseNumber(char[] json, ref int index, ref bool success) - { - EatWhitespace(json, ref index); - int lastIndex = GetLastIndexOfNumber(json, index); - int charLength = (lastIndex - index) + 1; - object returnNumber; - string str = new string(json, index, charLength); - if (str.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 || str.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1) - { - double number; - success = double.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); - returnNumber = number; - } - else - { - long number; - success = long.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); - returnNumber = number; - } - index = lastIndex + 1; - return returnNumber; - } - - static int GetLastIndexOfNumber(char[] json, int index) - { - int lastIndex; - for (lastIndex = index; lastIndex < json.Length; lastIndex++) - if ("0123456789+-.eE".IndexOf(json[lastIndex]) == -1) break; - return lastIndex - 1; - } - - static void EatWhitespace(char[] json, ref int index) - { - for (; index < json.Length; index++) - if (" \t\n\r\b\f".IndexOf(json[index]) == -1) break; - } - - static int LookAhead(char[] json, int index) - { - int saveIndex = index; - return NextToken(json, ref saveIndex); - } - - [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] - static int NextToken(char[] json, ref int index) - { - EatWhitespace(json, ref index); - if (index == json.Length) - return TOKEN_NONE; - char c = json[index]; - index++; - switch (c) - { - case '{': - return TOKEN_CURLY_OPEN; - case '}': - return TOKEN_CURLY_CLOSE; - case '[': - return TOKEN_SQUARED_OPEN; - case ']': - return TOKEN_SQUARED_CLOSE; - case ',': - return TOKEN_COMMA; - case '"': - return TOKEN_STRING; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '-': - return TOKEN_NUMBER; - case ':': - return TOKEN_COLON; - } - index--; - int remainingLength = json.Length - index; - // false - if (remainingLength >= 5) - { - if (json[index] == 'f' && json[index + 1] == 'a' && json[index + 2] == 'l' && json[index + 3] == 's' && json[index + 4] == 'e') - { - index += 5; - return TOKEN_FALSE; - } - } - // true - if (remainingLength >= 4) - { - if (json[index] == 't' && json[index + 1] == 'r' && json[index + 2] == 'u' && json[index + 3] == 'e') - { - index += 4; - return TOKEN_TRUE; - } - } - // null - if (remainingLength >= 4) - { - if (json[index] == 'n' && json[index + 1] == 'u' && json[index + 2] == 'l' && json[index + 3] == 'l') - { - index += 4; - return TOKEN_NULL; - } - } - return TOKEN_NONE; - } - - static bool SerializeValue(IJsonSerializerStrategy jsonSerializerStrategy, object value, StreamWriter writer, IDictionary seen, IDictionary filters, bool applyFilters) - { - bool success; - switch (value) - { - case String s: - success = SerializeString(s, writer); - break; - case BugsnagUnity.IFilterable filterable: - if (seen.Contains(filterable)) return SerializeString("[Circular]", writer); - seen.Add(filterable, true); - success = SerializeObject(jsonSerializerStrategy, filterable.Keys, filterable.Values, writer, seen, filters, true); - seen.Remove(filterable); - break; - case IDictionary dict: - if (seen.Contains(dict)) return SerializeString("[Circular]", writer); - seen.Add(dict, true); - success = SerializeObject(jsonSerializerStrategy, dict.Keys, dict.Values, writer, seen, filters, applyFilters); - seen.Remove(dict); - break; - case IDictionary dict: - if (seen.Contains(dict)) return SerializeString("[Circular]", writer); - seen.Add(dict, true); - success = SerializeObject(jsonSerializerStrategy, dict.Keys, dict.Values, writer, seen, filters, applyFilters); - seen.Remove(dict); - break; - case IDictionary dict: - if (seen.Contains(dict)) return SerializeString("[Circular]", writer); - seen.Add(dict, true); - success = SerializeObject(jsonSerializerStrategy, dict.Keys, dict.Values, writer, seen, filters, applyFilters); - seen.Remove(dict); - break; - case IEnumerable enumerable: - if (seen.Contains(enumerable)) return SerializeString("[Circular]", writer); - seen.Add(enumerable, true); - success = SerializeArray(jsonSerializerStrategy, enumerable, writer, seen, filters, applyFilters); - seen.Remove(enumerable); - break; - case sbyte _: - case byte _: - case short _: - case ushort _: - case int _: - case uint _: - case long _: - case ulong _: - case float _: - case double _: - case decimal _: - success = SerializeNumber(value, writer); - break; - case bool @bool: - writer.Write(@bool ? "true" : "false"); - success = true; - break; - case null: - writer.Write("null"); - success = true; - break; - default: - if (seen.Contains(value)) return SerializeString("[Circular]", writer); - seen.Add(value, true); - object serializedObject; - success = jsonSerializerStrategy.TrySerializeNonPrimitiveObject(value, out serializedObject); - if (success) - { - SerializeValue(jsonSerializerStrategy, serializedObject, writer, seen, filters, applyFilters); - } - seen.Remove(value); - break; - } - return success; - } - - static bool SerializeObject(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable keys, IEnumerable values, StreamWriter writer, IDictionary seen, IDictionary filters, bool applyFilters) - { - writer.Write("{"); - IEnumerator ke = keys.GetEnumerator(); - IEnumerator ve = values.GetEnumerator(); - bool first = true; - while (ke.MoveNext() && ve.MoveNext()) - { - object key = ke.Current; - object value = ve.Current; - if (!first) - writer.Write(","); - string stringKey = key as string; - if (stringKey != null) - SerializeString(stringKey, writer); - else - if (!SerializeValue(jsonSerializerStrategy, value, writer, seen, filters, applyFilters)) return false; - writer.Write(":"); - if (applyFilters && filters.Contains(key)) - SerializeString("[Filtered]", writer); - else if (!SerializeValue(jsonSerializerStrategy, value, writer, seen, filters, applyFilters)) - return false; - first = false; - } - writer.Write("}"); - return true; - } - - static bool SerializeArray(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable anArray, StreamWriter writer, IDictionary seen, IDictionary filters, bool applyFilters) - { - writer.Write("["); - bool first = true; - foreach (object value in anArray) - { - if (!first) - writer.Write(","); - if (!SerializeValue(jsonSerializerStrategy, value, writer, seen, filters, applyFilters)) - return false; - first = false; - } - writer.Write("]"); - return true; - } - - static bool SerializeString(string aString, StreamWriter writer) - { - // Happy path if there's nothing to be escaped. IndexOfAny is highly optimized (and unmanaged) - if (aString.IndexOfAny(EscapeCharacters) == -1) - { - writer.Write("\"{0}\"", aString); - return true; - } - - writer.Write('"'); - var hexSeqBuffer = new char[4]; - int safeCharacterCount = 0; - char[] charArray = aString.ToCharArray(); - - for (int i = 0; i < charArray.Length; i++) - { - char c = charArray[i]; - - // Non ascii characters are fine, buffer them up and send them to the builder - // in larger chunks if possible. The escape table is a 1:1 translation table - // with \0 [default(char)] denoting a safe character. - if (c >= EscapeTable.Length || EscapeTable[c] == default(char)) - { - safeCharacterCount++; - } - else - { - if (safeCharacterCount > 0) - { - writer.Write(charArray, i - safeCharacterCount, safeCharacterCount); - safeCharacterCount = 0; - } - - writer.Write('\\'); - - if (EscapeTable[c] == '!') - { - IntToHex(c, hexSeqBuffer); - writer.Write('u'); - writer.Write(hexSeqBuffer); - } - else - { - writer.Write(EscapeTable[c]); - } - } - } - - if (safeCharacterCount > 0) - { - writer.Write(charArray, charArray.Length - safeCharacterCount, safeCharacterCount); - } - - writer.Write('"'); - return true; - } - - static void IntToHex(int value, char[] hex) - { - for (var i = 0; i < 4; i++) - { - var num = value % 16; - if (num < 10) - { - hex[3 - i] = (char)('0' + num); - } - else - { - hex[3 - i] = (char)('A' + (num - 10)); - } - value >>= 4; - } - } - - static bool SerializeNumber(object number, StreamWriter writer) - { - if (number is long) - writer.Write(((long)number).ToString(CultureInfo.InvariantCulture)); - else if (number is ulong) - writer.Write(((ulong)number).ToString(CultureInfo.InvariantCulture)); - else if (number is int) - writer.Write(((int)number).ToString(CultureInfo.InvariantCulture)); - else if (number is uint) - writer.Write(((uint)number).ToString(CultureInfo.InvariantCulture)); - else if (number is decimal) - writer.Write(((decimal)number).ToString(CultureInfo.InvariantCulture)); - else if (number is float) - writer.Write(((float)number).ToString(CultureInfo.InvariantCulture)); - else - writer.Write(Convert.ToDouble(number, CultureInfo.InvariantCulture).ToString("r", CultureInfo.InvariantCulture)); - return true; - } - - private static IJsonSerializerStrategy _currentJsonSerializerStrategy; - public static IJsonSerializerStrategy CurrentJsonSerializerStrategy - { - get - { - return _currentJsonSerializerStrategy ?? - (_currentJsonSerializerStrategy = -#if SIMPLE_JSON_DATACONTRACT - DataContractJsonSerializerStrategy -#else - PocoJsonSerializerStrategy -#endif -); - } - set - { - _currentJsonSerializerStrategy = value; - } - } - - private static PocoJsonSerializerStrategy _pocoJsonSerializerStrategy; - [EditorBrowsable(EditorBrowsableState.Advanced)] - public static PocoJsonSerializerStrategy PocoJsonSerializerStrategy - { - get - { - return _pocoJsonSerializerStrategy ?? (_pocoJsonSerializerStrategy = new PocoJsonSerializerStrategy()); - } - } - -#if SIMPLE_JSON_DATACONTRACT - - private static DataContractJsonSerializerStrategy _dataContractJsonSerializerStrategy; - [System.ComponentModel.EditorBrowsable(EditorBrowsableState.Advanced)] - public static DataContractJsonSerializerStrategy DataContractJsonSerializerStrategy - { - get - { - return _dataContractJsonSerializerStrategy ?? (_dataContractJsonSerializerStrategy = new DataContractJsonSerializerStrategy()); - } - } - -#endif - } - - [GeneratedCode("simple-json", "1.0.0")] -#if SIMPLE_JSON_INTERNAL - internal -#else - public -#endif - interface IJsonSerializerStrategy - { - [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] - bool TrySerializeNonPrimitiveObject(object input, out object output); - object DeserializeObject(object value, Type type); - } - - [GeneratedCode("simple-json", "1.0.0")] -#if SIMPLE_JSON_INTERNAL - internal -#else - public -#endif - class PocoJsonSerializerStrategy : IJsonSerializerStrategy - { - internal IDictionary ConstructorCache; - internal IDictionary> GetCache; - internal IDictionary>> SetCache; - - internal static readonly Type[] EmptyTypes = new Type[0]; - internal static readonly Type[] ArrayConstructorParameterTypes = new Type[] { typeof(int) }; - - private static readonly string[] Iso8601Format = new string[] - { - @"yyyy-MM-dd\THH:mm:ss.FFFFFFF\Z", - @"yyyy-MM-dd\THH:mm:ss\Z", - @"yyyy-MM-dd\THH:mm:ssK" - }; - - public PocoJsonSerializerStrategy() - { - ConstructorCache = new ReflectionUtils.ThreadSafeDictionary(ContructorDelegateFactory); - GetCache = new ReflectionUtils.ThreadSafeDictionary>(GetterValueFactory); - SetCache = new ReflectionUtils.ThreadSafeDictionary>>(SetterValueFactory); - } - - protected virtual string MapClrMemberNameToJsonFieldName(string clrPropertyName) - { - return clrPropertyName; - } - - internal virtual ReflectionUtils.ConstructorDelegate ContructorDelegateFactory(Type key) - { - return ReflectionUtils.GetContructor(key, key.IsArray ? ArrayConstructorParameterTypes : EmptyTypes); - } - - internal virtual IDictionary GetterValueFactory(Type type) - { - IDictionary result = new Dictionary(); - foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) - { - if (propertyInfo.CanRead) - { - MethodInfo getMethod = ReflectionUtils.GetGetterMethodInfo(propertyInfo); - if (getMethod.IsStatic || !getMethod.IsPublic) - continue; - result[MapClrMemberNameToJsonFieldName(propertyInfo.Name)] = ReflectionUtils.GetGetMethod(propertyInfo); - } - } - foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) - { - if (fieldInfo.IsStatic || !fieldInfo.IsPublic) - continue; - result[MapClrMemberNameToJsonFieldName(fieldInfo.Name)] = ReflectionUtils.GetGetMethod(fieldInfo); - } - return result; - } - - internal virtual IDictionary> SetterValueFactory(Type type) - { - IDictionary> result = new Dictionary>(); - foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) - { - if (propertyInfo.CanWrite) - { - MethodInfo setMethod = ReflectionUtils.GetSetterMethodInfo(propertyInfo); - if (setMethod.IsStatic || !setMethod.IsPublic) - continue; - result[MapClrMemberNameToJsonFieldName(propertyInfo.Name)] = new KeyValuePair(propertyInfo.PropertyType, ReflectionUtils.GetSetMethod(propertyInfo)); - } - } - foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) - { - if (fieldInfo.IsInitOnly || fieldInfo.IsStatic || !fieldInfo.IsPublic) - continue; - result[MapClrMemberNameToJsonFieldName(fieldInfo.Name)] = new KeyValuePair(fieldInfo.FieldType, ReflectionUtils.GetSetMethod(fieldInfo)); - } - return result; - } - - public virtual bool TrySerializeNonPrimitiveObject(object input, out object output) - { - return TrySerializeKnownTypes(input, out output) || TrySerializeUnknownTypes(input, out output); - } - - [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] - public virtual object DeserializeObject(object value, Type type) - { - if (type == null) throw new ArgumentNullException("type"); - string str = value as string; - - if (type == typeof(Guid) && string.IsNullOrEmpty(str)) - return default(Guid); - - if (value == null) - return null; - - object obj = null; - - if (str != null) - { - if (str.Length != 0) // We know it can't be null now. - { - if (type == typeof(DateTime) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTime))) - return DateTime.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); - if (type == typeof(DateTimeOffset) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTimeOffset))) - return DateTimeOffset.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); - if (type == typeof(Guid) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid))) - return new Guid(str); - if (type == typeof(Uri)) - { - bool isValid = Uri.IsWellFormedUriString(str, UriKind.RelativeOrAbsolute); - - Uri result; - if (isValid && Uri.TryCreate(str, UriKind.RelativeOrAbsolute, out result)) - return result; - - return null; - } - - if (type == typeof(string)) - return str; - - return Convert.ChangeType(str, type, CultureInfo.InvariantCulture); - } - else - { - if (type == typeof(Guid)) - obj = default(Guid); - else if (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) - obj = null; - else - obj = str; - } - // Empty string case - if (!ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) - return str; - } - else if (value is bool) - return value; - - bool valueIsLong = value is long; - bool valueIsDouble = value is double; - if ((valueIsLong && type == typeof(long)) || (valueIsDouble && type == typeof(double))) - return value; - if ((valueIsDouble && type != typeof(double)) || (valueIsLong && type != typeof(long))) - { - obj = type == typeof(int) || type == typeof(long) || type == typeof(double) || type == typeof(float) || type == typeof(bool) || type == typeof(decimal) || type == typeof(byte) || type == typeof(short) - ? Convert.ChangeType(value, type, CultureInfo.InvariantCulture) - : value; - } - else - { - IDictionary objects = value as IDictionary; - if (objects != null) - { - IDictionary jsonObject = objects; - - if (ReflectionUtils.IsTypeDictionary(type)) - { - // if dictionary then - Type[] types = ReflectionUtils.GetGenericTypeArguments(type); - Type keyType = types[0]; - Type valueType = types[1]; - - Type genericType = typeof(Dictionary<,>).MakeGenericType(keyType, valueType); - - IDictionary dict = (IDictionary)ConstructorCache[genericType](); - - foreach (KeyValuePair kvp in jsonObject) - dict.Add(kvp.Key, DeserializeObject(kvp.Value, valueType)); - - obj = dict; - } - else - { - if (type == typeof(object)) - obj = value; - else - { - obj = ConstructorCache[type](); - foreach (KeyValuePair> setter in SetCache[type]) - { - object jsonValue; - if (jsonObject.TryGetValue(setter.Key, out jsonValue)) - { - jsonValue = DeserializeObject(jsonValue, setter.Value.Key); - setter.Value.Value(obj, jsonValue); - } - } - } - } - } - else - { - IList valueAsList = value as IList; - if (valueAsList != null) - { - IList jsonObject = valueAsList; - IList list = null; - - if (type.IsArray) - { - list = (IList)ConstructorCache[type](jsonObject.Count); - int i = 0; - foreach (object o in jsonObject) - list[i++] = DeserializeObject(o, type.GetElementType()); - } - else if (ReflectionUtils.IsTypeGenericeCollectionInterface(type) || ReflectionUtils.IsAssignableFrom(typeof(IList), type)) - { - Type innerType = ReflectionUtils.GetGenericListElementType(type); - list = (IList)(ConstructorCache[type] ?? ConstructorCache[typeof(List<>).MakeGenericType(innerType)])(jsonObject.Count); - foreach (object o in jsonObject) - list.Add(DeserializeObject(o, innerType)); - } - obj = list; - } - } - return obj; - } - if (ReflectionUtils.IsNullableType(type)) - return ReflectionUtils.ToNullableType(obj, type); - return obj; - } - - protected virtual object SerializeEnum(Enum p) - { - return Convert.ToDouble(p, CultureInfo.InvariantCulture); - } - - [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] - protected virtual bool TrySerializeKnownTypes(object input, out object output) - { - bool returnValue = true; - if (input is DateTime) - output = ((DateTime)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); - else if (input is DateTimeOffset) - output = ((DateTimeOffset)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); - else if (input is Guid) - output = ((Guid)input).ToString("D"); - else if (input is Uri) - output = input.ToString(); - else - { - Enum inputEnum = input as Enum; - if (inputEnum != null) - output = SerializeEnum(inputEnum); - else - { - returnValue = false; - output = null; - } - } - return returnValue; - } - [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] - protected virtual bool TrySerializeUnknownTypes(object input, out object output) - { - if (input == null) throw new ArgumentNullException("input"); - output = null; - Type type = input.GetType(); - if (type.FullName == null) - return false; - IDictionary obj = new JsonObject(); - IDictionary getters = GetCache[type]; - foreach (KeyValuePair getter in getters) - { - if (getter.Value != null) - obj.Add(MapClrMemberNameToJsonFieldName(getter.Key), getter.Value(input)); - } - output = obj; - return true; - } - } - -#if SIMPLE_JSON_DATACONTRACT - [GeneratedCode("simple-json", "1.0.0")] -#if SIMPLE_JSON_INTERNAL - internal -#else - public -#endif - class DataContractJsonSerializerStrategy : PocoJsonSerializerStrategy - { - public DataContractJsonSerializerStrategy() - { - GetCache = new ReflectionUtils.ThreadSafeDictionary>(GetterValueFactory); - SetCache = new ReflectionUtils.ThreadSafeDictionary>>(SetterValueFactory); - } - - internal override IDictionary GetterValueFactory(Type type) - { - bool hasDataContract = ReflectionUtils.GetAttribute(type, typeof(DataContractAttribute)) != null; - if (!hasDataContract) - return base.GetterValueFactory(type); - string jsonKey; - IDictionary result = new Dictionary(); - foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) - { - if (propertyInfo.CanRead) - { - MethodInfo getMethod = ReflectionUtils.GetGetterMethodInfo(propertyInfo); - if (!getMethod.IsStatic && CanAdd(propertyInfo, out jsonKey)) - result[jsonKey] = ReflectionUtils.GetGetMethod(propertyInfo); - } - } - foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) - { - if (!fieldInfo.IsStatic && CanAdd(fieldInfo, out jsonKey)) - result[jsonKey] = ReflectionUtils.GetGetMethod(fieldInfo); - } - return result; - } - - internal override IDictionary> SetterValueFactory(Type type) - { - bool hasDataContract = ReflectionUtils.GetAttribute(type, typeof(DataContractAttribute)) != null; - if (!hasDataContract) - return base.SetterValueFactory(type); - string jsonKey; - IDictionary> result = new Dictionary>(); - foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) - { - if (propertyInfo.CanWrite) - { - MethodInfo setMethod = ReflectionUtils.GetSetterMethodInfo(propertyInfo); - if (!setMethod.IsStatic && CanAdd(propertyInfo, out jsonKey)) - result[jsonKey] = new KeyValuePair(propertyInfo.PropertyType, ReflectionUtils.GetSetMethod(propertyInfo)); - } - } - foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) - { - if (!fieldInfo.IsInitOnly && !fieldInfo.IsStatic && CanAdd(fieldInfo, out jsonKey)) - result[jsonKey] = new KeyValuePair(fieldInfo.FieldType, ReflectionUtils.GetSetMethod(fieldInfo)); - } - // todo implement sorting for DATACONTRACT. - return result; - } - - private static bool CanAdd(MemberInfo info, out string jsonKey) - { - jsonKey = null; - if (ReflectionUtils.GetAttribute(info, typeof(IgnoreDataMemberAttribute)) != null) - return false; - DataMemberAttribute dataMemberAttribute = (DataMemberAttribute)ReflectionUtils.GetAttribute(info, typeof(DataMemberAttribute)); - if (dataMemberAttribute == null) - return false; - jsonKey = string.IsNullOrEmpty(dataMemberAttribute.Name) ? info.Name : dataMemberAttribute.Name; - return true; - } - } - -#endif - - namespace Reflection - { - // This class is meant to be copied into other libraries. So we want to exclude it from Code Analysis rules - // that might be in place in the target project. - [GeneratedCode("reflection-utils", "1.0.0")] -#if SIMPLE_JSON_REFLECTION_UTILS_PUBLIC - public -#else - internal -#endif - class ReflectionUtils - { - private static readonly object[] EmptyObjects = new object[] { }; - - public delegate object GetDelegate(object source); - public delegate void SetDelegate(object source, object value); - public delegate object ConstructorDelegate(params object[] args); - - public delegate TValue ThreadSafeDictionaryValueFactory(TKey key); - -#if SIMPLE_JSON_TYPEINFO - public static TypeInfo GetTypeInfo(Type type) - { - return type.GetTypeInfo(); - } -#else - public static Type GetTypeInfo(Type type) - { - return type; - } -#endif - - public static Attribute GetAttribute(MemberInfo info, Type type) - { -#if SIMPLE_JSON_TYPEINFO - if (info == null || type == null || !info.IsDefined(type)) - return null; - return info.GetCustomAttribute(type); -#else - if (info == null || type == null || !Attribute.IsDefined(info, type)) - return null; - return Attribute.GetCustomAttribute(info, type); -#endif - } - - public static Type GetGenericListElementType(Type type) - { - IEnumerable interfaces; -#if SIMPLE_JSON_TYPEINFO - interfaces = type.GetTypeInfo().ImplementedInterfaces; -#else - interfaces = type.GetInterfaces(); -#endif - foreach (Type implementedInterface in interfaces) - { - if (IsTypeGeneric(implementedInterface) && - implementedInterface.GetGenericTypeDefinition() == typeof(IList<>)) - { - return GetGenericTypeArguments(implementedInterface)[0]; - } - } - return GetGenericTypeArguments(type)[0]; - } - - public static Attribute GetAttribute(Type objectType, Type attributeType) - { - -#if SIMPLE_JSON_TYPEINFO - if (objectType == null || attributeType == null || !objectType.GetTypeInfo().IsDefined(attributeType)) - return null; - return objectType.GetTypeInfo().GetCustomAttribute(attributeType); -#else - if (objectType == null || attributeType == null || !Attribute.IsDefined(objectType, attributeType)) - return null; - return Attribute.GetCustomAttribute(objectType, attributeType); -#endif - } - - public static Type[] GetGenericTypeArguments(Type type) - { -#if SIMPLE_JSON_TYPEINFO - return type.GetTypeInfo().GenericTypeArguments; -#else - return type.GetGenericArguments(); -#endif - } - - public static bool IsTypeGeneric(Type type) - { - return GetTypeInfo(type).IsGenericType; - } - - public static bool IsTypeGenericeCollectionInterface(Type type) - { - if (!IsTypeGeneric(type)) - return false; - - Type genericDefinition = type.GetGenericTypeDefinition(); - - return (genericDefinition == typeof(IList<>) - || genericDefinition == typeof(ICollection<>) - || genericDefinition == typeof(IEnumerable<>) -#if SIMPLE_JSON_READONLY_COLLECTIONS - || genericDefinition == typeof(IReadOnlyCollection<>) - || genericDefinition == typeof(IReadOnlyList<>) -#endif - ); - } - - public static bool IsAssignableFrom(Type type1, Type type2) - { - return GetTypeInfo(type1).IsAssignableFrom(GetTypeInfo(type2)); - } - - public static bool IsTypeDictionary(Type type) - { -#if SIMPLE_JSON_TYPEINFO - if (typeof(IDictionary<,>).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo())) - return true; -#else - if (typeof(System.Collections.IDictionary).IsAssignableFrom(type)) - return true; -#endif - if (!GetTypeInfo(type).IsGenericType) - return false; - - Type genericDefinition = type.GetGenericTypeDefinition(); - return genericDefinition == typeof(IDictionary<,>); - } - - public static bool IsNullableType(Type type) - { - return GetTypeInfo(type).IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); - } - - public static object ToNullableType(object obj, Type nullableType) - { - return obj == null ? null : Convert.ChangeType(obj, Nullable.GetUnderlyingType(nullableType), CultureInfo.InvariantCulture); - } - - public static bool IsValueType(Type type) - { - return GetTypeInfo(type).IsValueType; - } - - public static IEnumerable GetConstructors(Type type) - { -#if SIMPLE_JSON_TYPEINFO - return type.GetTypeInfo().DeclaredConstructors; -#else - return type.GetConstructors(); -#endif - } - - public static ConstructorInfo GetConstructorInfo(Type type, params Type[] argsType) - { - IEnumerable constructorInfos = GetConstructors(type); - int i; - bool matches; - foreach (ConstructorInfo constructorInfo in constructorInfos) - { - ParameterInfo[] parameters = constructorInfo.GetParameters(); - if (argsType.Length != parameters.Length) - continue; - - i = 0; - matches = true; - foreach (ParameterInfo parameterInfo in constructorInfo.GetParameters()) - { - if (parameterInfo.ParameterType != argsType[i]) - { - matches = false; - break; - } - } - - if (matches) - return constructorInfo; - } - - return null; - } - - public static IEnumerable GetProperties(Type type) - { -#if SIMPLE_JSON_TYPEINFO - return type.GetRuntimeProperties(); -#else - return type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); -#endif - } - - public static IEnumerable GetFields(Type type) - { -#if SIMPLE_JSON_TYPEINFO - return type.GetRuntimeFields(); -#else - return type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); -#endif - } - - public static MethodInfo GetGetterMethodInfo(PropertyInfo propertyInfo) - { -#if SIMPLE_JSON_TYPEINFO - return propertyInfo.GetMethod; -#else - return propertyInfo.GetGetMethod(true); -#endif - } - - public static MethodInfo GetSetterMethodInfo(PropertyInfo propertyInfo) - { -#if SIMPLE_JSON_TYPEINFO - return propertyInfo.SetMethod; -#else - return propertyInfo.GetSetMethod(true); -#endif - } - - public static ConstructorDelegate GetContructor(ConstructorInfo constructorInfo) - { -#if SIMPLE_JSON_NO_LINQ_EXPRESSION - return GetConstructorByReflection(constructorInfo); -#else - return GetConstructorByExpression(constructorInfo); -#endif - } - - public static ConstructorDelegate GetContructor(Type type, params Type[] argsType) - { -#if SIMPLE_JSON_NO_LINQ_EXPRESSION - return GetConstructorByReflection(type, argsType); -#else - return GetConstructorByExpression(type, argsType); -#endif - } - - public static ConstructorDelegate GetConstructorByReflection(ConstructorInfo constructorInfo) - { - return delegate (object[] args) { return constructorInfo.Invoke(args); }; - } - - public static ConstructorDelegate GetConstructorByReflection(Type type, params Type[] argsType) - { - ConstructorInfo constructorInfo = GetConstructorInfo(type, argsType); - return constructorInfo == null ? null : GetConstructorByReflection(constructorInfo); - } - -#if !SIMPLE_JSON_NO_LINQ_EXPRESSION - - public static ConstructorDelegate GetConstructorByExpression(ConstructorInfo constructorInfo) - { - ParameterInfo[] paramsInfo = constructorInfo.GetParameters(); - ParameterExpression param = Expression.Parameter(typeof(object[]), "args"); - Expression[] argsExp = new Expression[paramsInfo.Length]; - for (int i = 0; i < paramsInfo.Length; i++) - { - Expression index = Expression.Constant(i); - Type paramType = paramsInfo[i].ParameterType; - Expression paramAccessorExp = Expression.ArrayIndex(param, index); - Expression paramCastExp = Expression.Convert(paramAccessorExp, paramType); - argsExp[i] = paramCastExp; - } - NewExpression newExp = Expression.New(constructorInfo, argsExp); - Expression> lambda = Expression.Lambda>(newExp, param); - Func compiledLambda = lambda.Compile(); - return delegate (object[] args) { return compiledLambda(args); }; - } - - public static ConstructorDelegate GetConstructorByExpression(Type type, params Type[] argsType) - { - ConstructorInfo constructorInfo = GetConstructorInfo(type, argsType); - return constructorInfo == null ? null : GetConstructorByExpression(constructorInfo); - } - -#endif - - public static GetDelegate GetGetMethod(PropertyInfo propertyInfo) - { -#if SIMPLE_JSON_NO_LINQ_EXPRESSION - return GetGetMethodByReflection(propertyInfo); -#else - return GetGetMethodByExpression(propertyInfo); -#endif - } - - public static GetDelegate GetGetMethod(FieldInfo fieldInfo) - { -#if SIMPLE_JSON_NO_LINQ_EXPRESSION - return GetGetMethodByReflection(fieldInfo); -#else - return GetGetMethodByExpression(fieldInfo); -#endif - } - - public static GetDelegate GetGetMethodByReflection(PropertyInfo propertyInfo) - { - MethodInfo methodInfo = GetGetterMethodInfo(propertyInfo); - return delegate (object source) { return methodInfo.Invoke(source, EmptyObjects); }; - } - - public static GetDelegate GetGetMethodByReflection(FieldInfo fieldInfo) - { - return delegate (object source) { return fieldInfo.GetValue(source); }; - } - -#if !SIMPLE_JSON_NO_LINQ_EXPRESSION - - public static GetDelegate GetGetMethodByExpression(PropertyInfo propertyInfo) - { - MethodInfo getMethodInfo = GetGetterMethodInfo(propertyInfo); - ParameterExpression instance = Expression.Parameter(typeof(object), "instance"); - UnaryExpression instanceCast = (!IsValueType(propertyInfo.DeclaringType)) ? Expression.TypeAs(instance, propertyInfo.DeclaringType) : Expression.Convert(instance, propertyInfo.DeclaringType); - Func compiled = Expression.Lambda>(Expression.TypeAs(Expression.Call(instanceCast, getMethodInfo), typeof(object)), instance).Compile(); - return delegate (object source) { return compiled(source); }; - } - - public static GetDelegate GetGetMethodByExpression(FieldInfo fieldInfo) - { - ParameterExpression instance = Expression.Parameter(typeof(object), "instance"); - MemberExpression member = Expression.Field(Expression.Convert(instance, fieldInfo.DeclaringType), fieldInfo); - GetDelegate compiled = Expression.Lambda(Expression.Convert(member, typeof(object)), instance).Compile(); - return delegate (object source) { return compiled(source); }; - } - -#endif - - public static SetDelegate GetSetMethod(PropertyInfo propertyInfo) - { -#if SIMPLE_JSON_NO_LINQ_EXPRESSION - return GetSetMethodByReflection(propertyInfo); -#else - return GetSetMethodByExpression(propertyInfo); -#endif - } - - public static SetDelegate GetSetMethod(FieldInfo fieldInfo) - { -#if SIMPLE_JSON_NO_LINQ_EXPRESSION - return GetSetMethodByReflection(fieldInfo); -#else - return GetSetMethodByExpression(fieldInfo); -#endif - } - - public static SetDelegate GetSetMethodByReflection(PropertyInfo propertyInfo) - { - MethodInfo methodInfo = GetSetterMethodInfo(propertyInfo); - return delegate (object source, object value) { methodInfo.Invoke(source, new object[] { value }); }; - } - - public static SetDelegate GetSetMethodByReflection(FieldInfo fieldInfo) - { - return delegate (object source, object value) { fieldInfo.SetValue(source, value); }; - } - -#if !SIMPLE_JSON_NO_LINQ_EXPRESSION - - public static SetDelegate GetSetMethodByExpression(PropertyInfo propertyInfo) - { - MethodInfo setMethodInfo = GetSetterMethodInfo(propertyInfo); - ParameterExpression instance = Expression.Parameter(typeof(object), "instance"); - ParameterExpression value = Expression.Parameter(typeof(object), "value"); - UnaryExpression instanceCast = (!IsValueType(propertyInfo.DeclaringType)) ? Expression.TypeAs(instance, propertyInfo.DeclaringType) : Expression.Convert(instance, propertyInfo.DeclaringType); - UnaryExpression valueCast = (!IsValueType(propertyInfo.PropertyType)) ? Expression.TypeAs(value, propertyInfo.PropertyType) : Expression.Convert(value, propertyInfo.PropertyType); - Action compiled = Expression.Lambda>(Expression.Call(instanceCast, setMethodInfo, valueCast), new ParameterExpression[] { instance, value }).Compile(); - return delegate (object source, object val) { compiled(source, val); }; - } - - public static SetDelegate GetSetMethodByExpression(FieldInfo fieldInfo) - { - ParameterExpression instance = Expression.Parameter(typeof(object), "instance"); - ParameterExpression value = Expression.Parameter(typeof(object), "value"); - Action compiled = Expression.Lambda>( - Assign(Expression.Field(Expression.Convert(instance, fieldInfo.DeclaringType), fieldInfo), Expression.Convert(value, fieldInfo.FieldType)), instance, value).Compile(); - return delegate (object source, object val) { compiled(source, val); }; - } - - public static BinaryExpression Assign(Expression left, Expression right) - { -#if SIMPLE_JSON_TYPEINFO - return Expression.Assign(left, right); -#else - MethodInfo assign = typeof(Assigner<>).MakeGenericType(left.Type).GetMethod("Assign"); - BinaryExpression assignExpr = Expression.Add(left, right, assign); - return assignExpr; -#endif - } - - private static class Assigner - { - public static T Assign(ref T left, T right) - { - return (left = right); - } - } - -#endif - - public sealed class ThreadSafeDictionary : IDictionary - { - private readonly object _lock = new object(); - private readonly ThreadSafeDictionaryValueFactory _valueFactory; - private Dictionary _dictionary; - - public ThreadSafeDictionary(ThreadSafeDictionaryValueFactory valueFactory) - { - _valueFactory = valueFactory; - } - - private TValue Get(TKey key) - { - if (_dictionary == null) - return AddValue(key); - TValue value; - if (!_dictionary.TryGetValue(key, out value)) - return AddValue(key); - return value; - } - - private TValue AddValue(TKey key) - { - TValue value = _valueFactory(key); - lock (_lock) - { - if (_dictionary == null) - { - _dictionary = new Dictionary(); - _dictionary[key] = value; - } - else - { - TValue val; - if (_dictionary.TryGetValue(key, out val)) - return val; - Dictionary dict = new Dictionary(_dictionary); - dict[key] = value; - _dictionary = dict; - } - } - return value; - } - - public void Add(TKey key, TValue value) - { - throw new NotImplementedException(); - } - - public bool ContainsKey(TKey key) - { - return _dictionary.ContainsKey(key); - } - - public ICollection Keys - { - get { return _dictionary.Keys; } - } - - public bool Remove(TKey key) - { - throw new NotImplementedException(); - } - - public bool TryGetValue(TKey key, out TValue value) - { - value = this[key]; - return true; - } - - public ICollection Values - { - get { return _dictionary.Values; } - } - - public TValue this[TKey key] - { - get { return Get(key); } - set { throw new NotImplementedException(); } - } - - public void Add(KeyValuePair item) - { - throw new NotImplementedException(); - } - - public void Clear() - { - throw new NotImplementedException(); - } - - public bool Contains(KeyValuePair item) - { - throw new NotImplementedException(); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - throw new NotImplementedException(); - } - - public int Count - { - get { return _dictionary.Count; } - } - - public bool IsReadOnly - { - get { throw new NotImplementedException(); } - } - - public bool Remove(KeyValuePair item) - { - throw new NotImplementedException(); - } - - public IEnumerator> GetEnumerator() - { - return _dictionary.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return _dictionary.GetEnumerator(); - } - } - - } - } -} -// ReSharper restore LoopCanBeConvertedToQuery -// ReSharper restore RedundantExplicitArrayCreation -// ReSharper restore SuggestUseVarKeywordEvident diff --git a/src/BugsnagUnity/TelemetryType.cs b/src/BugsnagUnity/TelemetryType.cs deleted file mode 100644 index 737055c18..000000000 --- a/src/BugsnagUnity/TelemetryType.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; -namespace BugsnagUnity -{ - public enum TelemetryType - { - InternalErrors, - Usage - } -} diff --git a/src/BugsnagUnity/ThreadSendPolicy.cs b/src/BugsnagUnity/ThreadSendPolicy.cs deleted file mode 100644 index 3289b824a..000000000 --- a/src/BugsnagUnity/ThreadSendPolicy.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -namespace BugsnagUnity -{ - public enum ThreadSendPolicy - { - Always = 0, - UnhandledOnly = 1, - Never = 2 - } -} diff --git a/src/BugsnagUnity/Time.cs b/src/BugsnagUnity/Time.cs deleted file mode 100644 index 1cd66d703..000000000 --- a/src/BugsnagUnity/Time.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Diagnostics; - -namespace BugsnagUnity -{ - // A simple timer used internally to avoid thread complications when using the unity Time API - internal class Time - { - - private static object _swLock = new object(); - - private static Stopwatch _sw; - - internal static Stopwatch Timer - { - get - { - if (_sw == null) - { - lock (_swLock) - { - if (_sw == null) - { - _sw = Stopwatch.StartNew(); - } - } - } - return _sw; - } - } - - internal static double ElapsedSeconds => Timer.Elapsed.TotalSeconds; - - } -} - diff --git a/src/BugsnagUnity/TimingTrackerBehaviour.cs b/src/BugsnagUnity/TimingTrackerBehaviour.cs deleted file mode 100644 index 026b35f50..000000000 --- a/src/BugsnagUnity/TimingTrackerBehaviour.cs +++ /dev/null @@ -1,38 +0,0 @@ -using UnityEngine; -using System.Collections; - -namespace BugsnagUnity -{ - /// - /// Manages events related to application state such as whether the app - /// is in the foreground or background to improve report metadata. - class TimingTrackerBehaviour : MonoBehaviour - { - - private void Awake() - { - // Make sure that the tracker persists accross scenes. - DontDestroyOnLoad(gameObject); - } - - /// - /// OnApplicationFocus is called when the application loses or gains focus. - /// Alt-tabbing or Cmd-tabbing can take focus away from the Unity - /// application to another desktop application. This causes the GameObjects - /// to receive an OnApplicationFocus call with the argument set to false. - /// When the user switches back to the Unity application, the GameObjects - /// receive an OnApplicationFocus call with the argument set to true. - /// - /// - void OnApplicationFocus(bool hasFocus) - { - Bugsnag.SetApplicationState(hasFocus); - } - - void OnApplicationPause(bool paused) - { - var hasFocus = !paused; - Bugsnag.SetApplicationState(hasFocus); - } - } -} diff --git a/src/BugsnagUnity/TypeNameHelper.cs b/src/BugsnagUnity/TypeNameHelper.cs deleted file mode 100644 index 7d373a48d..000000000 --- a/src/BugsnagUnity/TypeNameHelper.cs +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Text; - -namespace BugsnagUnity -{ - class TypeNameHelper - { - private static readonly Dictionary _builtInTypeNames = new Dictionary - { - { typeof(void), "void" }, - { typeof(bool), "bool" }, - { typeof(byte), "byte" }, - { typeof(char), "char" }, - { typeof(decimal), "decimal" }, - { typeof(double), "double" }, - { typeof(float), "float" }, - { typeof(int), "int" }, - { typeof(long), "long" }, - { typeof(object), "object" }, - { typeof(sbyte), "sbyte" }, - { typeof(short), "short" }, - { typeof(string), "string" }, - { typeof(uint), "uint" }, - { typeof(ulong), "ulong" }, - { typeof(ushort), "ushort" } - }; - - public static string GetTypeDisplayName(object item, bool fullName = true) - { - return item == null ? null : GetTypeDisplayName(item.GetType(), fullName); - } - - /// - /// Pretty print a type name. - /// - /// The . - /// true to print a fully qualified name. - /// true to include generic parameter names. - /// The pretty printed type name. - public static string GetTypeDisplayName(Type type, bool fullName = true, bool includeGenericParameterNames = false) - { - var builder = new StringBuilder(); - ProcessType(builder, type, new DisplayNameOptions(fullName, includeGenericParameterNames)); - return builder.ToString(); - } - - private static void ProcessType(StringBuilder builder, Type type, DisplayNameOptions options) - { - if (type.IsGenericType) - { - var genericArguments = type.GetGenericTypeDefinition().GetGenericArguments(); - ProcessGenericType(builder, type, genericArguments, genericArguments.Length, options); - } - else if (type.IsArray) - { - ProcessArrayType(builder, type, options); - } - else if (_builtInTypeNames.TryGetValue(type, out var builtInName)) - { - builder.Append(builtInName); - } - else if (type.IsGenericParameter) - { - if (options.IncludeGenericParameterNames) - { - builder.Append(type.Name); - } - } - else - { - builder.Append(options.FullName ? type.FullName : type.Name); - } - } - - private static void ProcessArrayType(StringBuilder builder, Type type, DisplayNameOptions options) - { - var innerType = type; - while (innerType.IsArray) - { - innerType = innerType.GetElementType(); - } - - ProcessType(builder, innerType, options); - - while (type.IsArray) - { - builder.Append('['); - builder.Append(',', type.GetArrayRank() - 1); - builder.Append(']'); - type = type.GetElementType(); - } - } - - private static void ProcessGenericType(StringBuilder builder, Type type, Type[] genericArguments, int length, DisplayNameOptions options) - { - var offset = 0; - if (type.IsNested) - { - offset = type.DeclaringType.GetGenericArguments().Length; - } - - if (options.FullName) - { - if (type.IsNested) - { - ProcessGenericType(builder, type.DeclaringType, genericArguments, offset, options); - builder.Append('+'); - } - else if (!string.IsNullOrEmpty(type.Namespace)) - { - builder.Append(type.Namespace); - builder.Append('.'); - } - } - - var genericPartIndex = type.Name.IndexOf('`'); - if (genericPartIndex <= 0) - { - builder.Append(type.Name); - return; - } - - builder.Append(type.Name, 0, genericPartIndex); - - builder.Append('<'); - for (var i = offset; i < length; i++) - { - ProcessType(builder, genericArguments[i], options); - if (i + 1 == length) - { - continue; - } - - builder.Append(','); - if (options.IncludeGenericParameterNames || !genericArguments[i + 1].IsGenericParameter) - { - builder.Append(' '); - } - } - builder.Append('>'); - } - - private struct DisplayNameOptions - { - public DisplayNameOptions(bool fullName, bool includeGenericParameterNames) - { - FullName = fullName; - IncludeGenericParameterNames = includeGenericParameterNames; - } - - public bool FullName { get; } - - public bool IncludeGenericParameterNames { get; } - } - - } -} diff --git a/src/BugsnagUnity/UniqueLogThrottle.cs b/src/BugsnagUnity/UniqueLogThrottle.cs deleted file mode 100644 index 102ff73d4..000000000 --- a/src/BugsnagUnity/UniqueLogThrottle.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace BugsnagUnity -{ - public class UniqueLogThrottle - { - private readonly object _lock = new object(); - private Dictionary Counter { get; } - private double FlushAt { get; set; } = -1; - private Configuration Configuration { get; } - - private double UniqueLogsTimePeriod => Configuration.SecondsPerUniqueLog.TotalSeconds; - - private void EnsureFlushTimeIsSet() - { - if (FlushAt < 0) - { - FlushAt = Time.ElapsedSeconds + UniqueLogsTimePeriod; - } - } - - public UniqueLogThrottle(Configuration configuration) - { - Configuration = configuration; - Counter = new Dictionary(new UnityLogMessageEqualityComparer()); - } - - public bool ShouldSend(UnityLogMessage unityLogMessage) - { - bool shouldSend; - lock (_lock) - { - EnsureFlushTimeIsSet(); - shouldSend = !Counter.ContainsKey(unityLogMessage); - if (shouldSend) - { - Counter.Add(unityLogMessage, 0); - } - else - { - if (unityLogMessage.CreatedAt > FlushAt) - { - Counter.Clear(); - FlushAt = Time.ElapsedSeconds + UniqueLogsTimePeriod; - shouldSend = true; - } - } - } - return shouldSend; - } - - class UnityLogMessageEqualityComparer : EqualityComparer - { - public override bool Equals(UnityLogMessage x, UnityLogMessage y) - { - return x.Condition == y.Condition && x.StackTrace == y.StackTrace && x.Type == y.Type; - } - - public override int GetHashCode(UnityLogMessage obj) - { - unchecked - { - int hash = 17; - hash = hash * 23 + obj.Condition.GetHashCode(); - hash = hash * 23 + obj.StackTrace.GetHashCode(); - hash = hash * 23 + obj.Type.GetHashCode(); - return hash; - } - } - } - } -} diff --git a/src/BugsnagUnity/UnityLogMessage.cs b/src/BugsnagUnity/UnityLogMessage.cs deleted file mode 100644 index 832f8712d..000000000 --- a/src/BugsnagUnity/UnityLogMessage.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using UnityEngine; - -namespace BugsnagUnity -{ - /// - /// Represents a log message received from Unity - /// - public class UnityLogMessage - { - public UnityLogMessage(string condition, string stackTrace, LogType type) - { - CreatedAt = Time.ElapsedSeconds; - Condition = condition; - StackTrace = stackTrace; - Type = type; - } - - public UnityLogMessage(Exception exception) - { - CreatedAt = Time.ElapsedSeconds; - Condition = exception.Message == null ? string.Empty : exception.Message; - StackTrace = exception.StackTrace == null ? string.Empty : exception.StackTrace; - Type = LogType.Exception; - } - - public string Condition { get; } - - public string StackTrace { get; } - - public LogType Type { get; } - - public double CreatedAt { get; } - - - } -} diff --git a/src/Directory.build.props b/src/Directory.build.props deleted file mode 100644 index d7da6dba5..000000000 --- a/src/Directory.build.props +++ /dev/null @@ -1,35 +0,0 @@ - - - netstandard2.0 - 8.0 - 1.0.0 - - - - - true - true - - - - - /Applications/Unity/Hub/Editor/$(UNITY_VERSION)/Unity.app/Contents/Managed/UnityEngine.dll - false - - - /Applications/Unity/Hub/Editor/$(UNITY_VERSION)/Unity.app/Contents/Managed/UnityEditor.dll - false - - - - - - C:\Program Files\Unity\Hub\Editor\$(UNITY_VERSION)\Editor\Data\Managed\UnityEngine.dll - false - - - C:\Program Files\Unity\Hub\Editor\$(UNITY_VERSION)\Editor\Data\Managed\UnityEditor.dll - false - - - diff --git a/unity/PackageProject/.gitignore b/unity/PackageProject/.gitignore deleted file mode 100644 index afea41805..000000000 --- a/unity/PackageProject/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -*.aar -*.aar.meta -*.jar -*.jar.meta -*.a -CodeResources -*.h -bugsnag-osx -*.jspre -*.jslib -*.dll -*.cs -Library/ -UnityPackageManager/ diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins.meta b/unity/PackageProject/Assets/Bugsnag/Plugins.meta deleted file mode 100644 index 13a4f6b8d..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c2133bde5df284cb286e886053296ffa -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/Android/BugsnagUnity.Android.dll.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/Android/BugsnagUnity.Android.dll.meta deleted file mode 100644 index de2d209ad..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/Android/BugsnagUnity.Android.dll.meta +++ /dev/null @@ -1,120 +0,0 @@ -fileFormatVersion: 2 -guid: 3fd5fac7a2f44416b96d254e4383456c -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - '': Any - second: - enabled: 0 - settings: - Exclude Android: 0 - Exclude Editor: 1 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXUniversal: 1 - Exclude WebGL: 1 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 1 - Exclude tvOS: 1 - - first: - Android: Android - second: - enabled: 1 - settings: - CPU: ARMv7 - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: x86_64 - - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - iPhone: iOS - second: - enabled: 0 - settings: - AddToEmbeddedBinaries: false - CompileFlags: - FrameworkDependencies: - - first: - tvOS: tvOS - second: - enabled: 0 - settings: - CompileFlags: - FrameworkDependencies: - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/BugsnagUnity.dll.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/BugsnagUnity.dll.meta deleted file mode 100644 index 9116eba74..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/BugsnagUnity.dll.meta +++ /dev/null @@ -1,125 +0,0 @@ -fileFormatVersion: 2 -guid: 3dbda165f19cc4f68bb72d68e81f89d1 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - '': Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 0 - Exclude Linux: 0 - Exclude Linux64: 0 - Exclude LinuxUniversal: 0 - Exclude OSXUniversal: 1 - Exclude WebGL: 0 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 1 - Exclude tvOS: 1 - - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 1 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: None - - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: Linux - second: - enabled: 1 - settings: - CPU: x86 - - first: - Standalone: Linux64 - second: - enabled: 1 - settings: - CPU: x86_64 - - first: - Standalone: LinuxUniversal - second: - enabled: 1 - settings: - CPU: AnyCPU - - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: None - - first: - WebGL: WebGL - second: - enabled: 1 - settings: {} - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - iPhone: iOS - second: - enabled: 0 - settings: - AddToEmbeddedBinaries: false - CompileFlags: - FrameworkDependencies: - - first: - tvOS: tvOS - second: - enabled: 0 - settings: - CompileFlags: - FrameworkDependencies: - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX.meta deleted file mode 100644 index c338383b6..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f7ace0c8d1a68422799c1b4323bf4951 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/BugsnagUnity.MacOS.dll.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/BugsnagUnity.MacOS.dll.meta deleted file mode 100644 index 0d5b9a649..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/BugsnagUnity.MacOS.dll.meta +++ /dev/null @@ -1,123 +0,0 @@ -fileFormatVersion: 2 -guid: b917a7705dd6f4b129fd8a352bc92f32 -timeCreated: 1536884317 -licenseType: Free -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - - first: - '': Any - second: - enabled: 0 - settings: - Exclude Editor: 1 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXIntel: 0 - Exclude OSXIntel64: 0 - Exclude OSXUniversal: 0 - Exclude Win: 1 - Exclude Win64: 1 - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: None - - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: x86_64 - - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: OSXIntel - second: - enabled: 1 - settings: - CPU: AnyCPU - - first: - Standalone: OSXIntel64 - second: - enabled: 1 - settings: - CPU: AnyCPU - - first: - Standalone: OSXUniversal - second: - enabled: 1 - settings: - CPU: AnyCPU - - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: None - - first: - Windows: Windows - second: - enabled: 0 - settings: {} - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - iPhone: iOS - second: - enabled: 0 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 0 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle.meta deleted file mode 100644 index 5ddc62c9e..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle.meta +++ /dev/null @@ -1,124 +0,0 @@ -fileFormatVersion: 2 -guid: bb5f436bc6f4a462cb5beb09c5b2d9d0 -folderAsset: yes -timeCreated: 1531183623 -licenseType: Free -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - - first: - '': Any - second: - enabled: 0 - settings: - Exclude Editor: 1 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXIntel: 0 - Exclude OSXIntel64: 0 - Exclude OSXUniversal: 0 - Exclude Win: 1 - Exclude Win64: 1 - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: None - - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: x86_64 - - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: OSXIntel - second: - enabled: 1 - settings: - CPU: AnyCPU - - first: - Standalone: OSXIntel64 - second: - enabled: 1 - settings: - CPU: AnyCPU - - first: - Standalone: OSXUniversal - second: - enabled: 1 - settings: - CPU: AnyCPU - - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: None - - first: - Windows: Windows - second: - enabled: 0 - settings: {} - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - iPhone: iOS - second: - enabled: 0 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 0 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents.meta deleted file mode 100644 index 0e834e5fd..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1de6c0742e4764d22930d104a71547a2 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers.meta deleted file mode 100644 index 60c4c6944..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cf389a5a88a6f472b9e15c2919fbb683 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BSG_KSCrashReportWriter.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BSG_KSCrashReportWriter.h.meta deleted file mode 100644 index 597451625..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BSG_KSCrashReportWriter.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 1cdf54203a3dc497ea1bd1c6d60fdc31 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/Bugsnag.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/Bugsnag.h.meta deleted file mode 100644 index a54014de4..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/Bugsnag.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: fd82fc22dfef54846abab4745e5995fc -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagApp.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagApp.h.meta deleted file mode 100644 index 92280da18..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagApp.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: dbff8d630c56c4f738b160ca8309adcf -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagAppWithState.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagAppWithState.h.meta deleted file mode 100644 index 459334638..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagAppWithState.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 051f08a5c3f1e44a18a7a34c168dd134 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagBreadcrumb.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagBreadcrumb.h.meta deleted file mode 100644 index 7ae3e2fc2..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagBreadcrumb.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 87cad67052a8c4a0e830ad0122aacec2 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagClient.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagClient.h.meta deleted file mode 100644 index 6e2de97f9..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagClient.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c4cc761dcf66641cd88f2886790bcd5c -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagConfiguration.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagConfiguration.h.meta deleted file mode 100644 index 0cf39a23a..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagConfiguration.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: f03c6a1dfd38b412fbee65f36cb09195 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagDevice.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagDevice.h.meta deleted file mode 100644 index 7f7b74d4f..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagDevice.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: d68d34aec8c234113a7ff576ee96c2ac -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagDeviceWithState.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagDeviceWithState.h.meta deleted file mode 100644 index 597f89ff0..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagDeviceWithState.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: d94e0c4ad7bf3491abc1455505a20b25 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagEndpointConfiguration.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagEndpointConfiguration.h.meta deleted file mode 100644 index a7fc5645f..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagEndpointConfiguration.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 68fd4b4eb25774a3c97ed4c3fa949417 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagError.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagError.h.meta deleted file mode 100644 index f0898b9cb..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagError.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 444d3b4c2c6c3407680e61a01fdbdd73 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagErrorTypes.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagErrorTypes.h.meta deleted file mode 100644 index 79762cbfe..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagErrorTypes.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 75828343cabd548dcbe1733d190d1505 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagEvent.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagEvent.h.meta deleted file mode 100644 index c60fe05d0..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagEvent.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 4fee5a36555084c74963f06ed63ab80c -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagLastRunInfo.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagLastRunInfo.h.meta deleted file mode 100644 index 583698233..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagLastRunInfo.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: bfe1fae0a4bb54714b4e53cfb5f4eb9c -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagMetadata.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagMetadata.h.meta deleted file mode 100644 index 049089518..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagMetadata.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 774a54ef921584907b9760302799d523 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagMetadataStore.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagMetadataStore.h.meta deleted file mode 100644 index 089280424..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagMetadataStore.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 20a02b448030d4eb0a8fc5d9a954a4ae -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagPlugin.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagPlugin.h.meta deleted file mode 100644 index ec3ddc603..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagPlugin.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: a0c5c84e6ca714931893d8824d1680d2 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagSession.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagSession.h.meta deleted file mode 100644 index a6e2b4291..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagSession.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 823ef505f4fd54a068c5402597bd13bb -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagStackframe.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagStackframe.h.meta deleted file mode 100644 index 460c88ecd..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagStackframe.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c1161c066c024488099684d49561528d -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagThread.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagThread.h.meta deleted file mode 100644 index 5d7a4286e..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagThread.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 1b233d78eac964678a6baee9bf21dbf8 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagUser.h.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagUser.h.meta deleted file mode 100644 index b0ad0f583..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/Headers/BugsnagUser.h.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 22691bb9a27664dd9b82db1e686c536c -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/MacOS/bugsnag-osx.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/MacOS/bugsnag-osx.meta deleted file mode 100644 index 065893af2..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/OSX/bugsnag-osx.bundle/Contents/MacOS/bugsnag-osx.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 81f08e8490a67498db41703d26bec229 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/Windows.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/Windows.meta deleted file mode 100644 index d905bfd93..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/Windows.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: eb33f08d2df47470cbd072f9bcec2db1 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/Windows/BugsnagUnity.Windows.dll.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/Windows/BugsnagUnity.Windows.dll.meta deleted file mode 100644 index 978b1c9a6..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/Windows/BugsnagUnity.Windows.dll.meta +++ /dev/null @@ -1,123 +0,0 @@ -fileFormatVersion: 2 -guid: 985672bb978624e548cfe578ccf27093 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - '': Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 1 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXUniversal: 1 - Exclude WebGL: 1 - Exclude Win: 0 - Exclude Win64: 0 - Exclude WindowsStoreApps: 0 - - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: None - - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: Win - second: - enabled: 1 - settings: - CPU: None - - first: - Standalone: Win64 - second: - enabled: 1 - settings: - CPU: None - - first: - Windows: Windows - second: - enabled: 1 - settings: {} - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 1 - settings: - CPU: AnyCPU - DontProcess: false - PlaceholderPath: - SDK: AnySDK - ScriptingBackend: AnyScriptingBackend - - first: - iPhone: iOS - second: - enabled: 0 - settings: {} - - first: - tvOS: tvOS - second: - enabled: 0 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/iOS/BugsnagUnity.iOS.dll.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/iOS/BugsnagUnity.iOS.dll.meta deleted file mode 100644 index d47d665c3..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/iOS/BugsnagUnity.iOS.dll.meta +++ /dev/null @@ -1,120 +0,0 @@ -fileFormatVersion: 2 -guid: d39840dd049ac42948d73361a95a1a32 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - '': Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 1 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXUniversal: 1 - Exclude WebGL: 1 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 0 - Exclude tvOS: 1 - - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: x86_64 - - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - iPhone: iOS - second: - enabled: 1 - settings: - AddToEmbeddedBinaries: false - CompileFlags: - FrameworkDependencies: - - first: - tvOS: tvOS - second: - enabled: 0 - settings: - CompileFlags: - FrameworkDependencies: - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/tvOS.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/tvOS.meta deleted file mode 100644 index a6300e9ad..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/tvOS.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: dce9e1d7fca9542a9afbe5572133950e -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/tvOS/BugsnagUnity.iOS.dll.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/tvOS/BugsnagUnity.iOS.dll.meta deleted file mode 100644 index b399392f4..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/tvOS/BugsnagUnity.iOS.dll.meta +++ /dev/null @@ -1,120 +0,0 @@ -fileFormatVersion: 2 -guid: 480b1f139af8c411f877ac86886fd547 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - '': Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 1 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXUniversal: 1 - Exclude WebGL: 1 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 1 - Exclude tvOS: 0 - - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: x86_64 - - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - iPhone: iOS - second: - enabled: 0 - settings: - AddToEmbeddedBinaries: false - CompileFlags: - FrameworkDependencies: - - first: - tvOS: tvOS - second: - enabled: 1 - settings: - CompileFlags: - FrameworkDependencies: - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Assets/Bugsnag/Plugins/tvOS/libbugsnag-tvos.a.meta b/unity/PackageProject/Assets/Bugsnag/Plugins/tvOS/libbugsnag-tvos.a.meta deleted file mode 100644 index a1ce29105..000000000 --- a/unity/PackageProject/Assets/Bugsnag/Plugins/tvOS/libbugsnag-tvos.a.meta +++ /dev/null @@ -1,114 +0,0 @@ -fileFormatVersion: 2 -guid: a5b5ec5450db94916ab3839c4c9ce61a -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - '': Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 1 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXUniversal: 1 - Exclude WebGL: 1 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 1 - Exclude tvOS: 0 - - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: x86_64 - - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: None - - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - iPhone: iOS - second: - enabled: 0 - settings: - AddToEmbeddedBinaries: false - CompileFlags: - FrameworkDependencies: - - first: - tvOS: tvOS - second: - enabled: 1 - settings: - CompileFlags: - FrameworkDependencies: - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity/PackageProject/Logs/Packages-Update.log b/unity/PackageProject/Logs/Packages-Update.log deleted file mode 100644 index b3e23bca8..000000000 --- a/unity/PackageProject/Logs/Packages-Update.log +++ /dev/null @@ -1,52 +0,0 @@ - -=== Wed Jun 2 10:48:05 2021 - -Packages were changed. -Update Mode: updateDependencies - -The following packages were added: - com.unity.2d.sprite@1.0.0 - com.unity.2d.tilemap@1.0.0 - com.unity.ads@3.6.1 - com.unity.analytics@3.3.5 - com.unity.collab-proxy@1.2.16 - com.unity.ide.rider@1.1.4 - com.unity.ide.vscode@1.2.3 - com.unity.modules.ai@1.0.0 - com.unity.modules.androidjni@1.0.0 - com.unity.modules.animation@1.0.0 - com.unity.modules.assetbundle@1.0.0 - com.unity.modules.audio@1.0.0 - com.unity.modules.cloth@1.0.0 - com.unity.modules.director@1.0.0 - com.unity.modules.imageconversion@1.0.0 - com.unity.modules.imgui@1.0.0 - com.unity.modules.jsonserialize@1.0.0 - com.unity.modules.particlesystem@1.0.0 - com.unity.modules.physics@1.0.0 - com.unity.modules.physics2d@1.0.0 - com.unity.modules.screencapture@1.0.0 - com.unity.modules.terrain@1.0.0 - com.unity.modules.terrainphysics@1.0.0 - com.unity.modules.tilemap@1.0.0 - com.unity.modules.ui@1.0.0 - com.unity.modules.uielements@1.0.0 - com.unity.modules.umbra@1.0.0 - com.unity.modules.unityanalytics@1.0.0 - com.unity.modules.unitywebrequest@1.0.0 - com.unity.modules.unitywebrequestassetbundle@1.0.0 - com.unity.modules.unitywebrequestaudio@1.0.0 - com.unity.modules.unitywebrequesttexture@1.0.0 - com.unity.modules.unitywebrequestwww@1.0.0 - com.unity.modules.vehicles@1.0.0 - com.unity.modules.video@1.0.0 - com.unity.modules.vr@1.0.0 - com.unity.modules.wind@1.0.0 - com.unity.modules.xr@1.0.0 - com.unity.multiplayer-hlapi@1.0.8 - com.unity.purchasing@2.2.2 - com.unity.test-framework@1.1.22 - com.unity.textmeshpro@2.0.1 - com.unity.timeline@1.2.18 - com.unity.ugui@1.0.0 - com.unity.xr.legacyinputhelpers@2.1.7 diff --git a/unity/PackageProject/Packages/manifest.json b/unity/PackageProject/Packages/manifest.json deleted file mode 100644 index 953b0c6fe..000000000 --- a/unity/PackageProject/Packages/manifest.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "dependencies": { - "com.unity.2d.sprite": "1.0.0", - "com.unity.2d.tilemap": "1.0.0", - "com.unity.ads": "4.4.2", - "com.unity.analytics": "3.6.12", - "com.unity.collab-proxy": "2.2.0", - "com.unity.ide.rider": "3.0.27", - "com.unity.ide.visualstudio": "2.0.22", - "com.unity.ide.vscode": "1.2.5", - "com.unity.purchasing": "4.9.3", - "com.unity.test-framework": "1.1.33", - "com.unity.textmeshpro": "3.0.6", - "com.unity.timeline": "1.6.5", - "com.unity.ugui": "1.0.0", - "com.unity.xr.legacyinputhelpers": "2.1.10", - "com.unity.modules.ai": "1.0.0", - "com.unity.modules.androidjni": "1.0.0", - "com.unity.modules.animation": "1.0.0", - "com.unity.modules.assetbundle": "1.0.0", - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.cloth": "1.0.0", - "com.unity.modules.director": "1.0.0", - "com.unity.modules.imageconversion": "1.0.0", - "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.particlesystem": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.physics2d": "1.0.0", - "com.unity.modules.screencapture": "1.0.0", - "com.unity.modules.terrain": "1.0.0", - "com.unity.modules.terrainphysics": "1.0.0", - "com.unity.modules.tilemap": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.uielements": "1.0.0", - "com.unity.modules.umbra": "1.0.0", - "com.unity.modules.unityanalytics": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.modules.unitywebrequestassetbundle": "1.0.0", - "com.unity.modules.unitywebrequestaudio": "1.0.0", - "com.unity.modules.unitywebrequesttexture": "1.0.0", - "com.unity.modules.unitywebrequestwww": "1.0.0", - "com.unity.modules.vehicles": "1.0.0", - "com.unity.modules.video": "1.0.0", - "com.unity.modules.vr": "1.0.0", - "com.unity.modules.wind": "1.0.0", - "com.unity.modules.xr": "1.0.0" - } -} diff --git a/unity/PackageProject/ProjectSettings/AudioManager.asset b/unity/PackageProject/ProjectSettings/AudioManager.asset deleted file mode 100644 index da6112576..000000000 --- a/unity/PackageProject/ProjectSettings/AudioManager.asset +++ /dev/null @@ -1,17 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!11 &1 -AudioManager: - m_ObjectHideFlags: 0 - m_Volume: 1 - Rolloff Scale: 1 - Doppler Factor: 1 - Default Speaker Mode: 2 - m_SampleRate: 0 - m_DSPBufferSize: 0 - m_VirtualVoiceCount: 512 - m_RealVoiceCount: 32 - m_SpatializerPlugin: - m_AmbisonicDecoderPlugin: - m_DisableAudio: 0 - m_VirtualizeEffects: 1 diff --git a/unity/PackageProject/ProjectSettings/ClusterInputManager.asset b/unity/PackageProject/ProjectSettings/ClusterInputManager.asset deleted file mode 100644 index e7886b266..000000000 --- a/unity/PackageProject/ProjectSettings/ClusterInputManager.asset +++ /dev/null @@ -1,6 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!236 &1 -ClusterInputManager: - m_ObjectHideFlags: 0 - m_Inputs: [] diff --git a/unity/PackageProject/ProjectSettings/DynamicsManager.asset b/unity/PackageProject/ProjectSettings/DynamicsManager.asset deleted file mode 100644 index 78992f08c..000000000 --- a/unity/PackageProject/ProjectSettings/DynamicsManager.asset +++ /dev/null @@ -1,29 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!55 &1 -PhysicsManager: - m_ObjectHideFlags: 0 - serializedVersion: 7 - m_Gravity: {x: 0, y: -9.81, z: 0} - m_DefaultMaterial: {fileID: 0} - m_BounceThreshold: 2 - m_SleepThreshold: 0.005 - m_DefaultContactOffset: 0.01 - m_DefaultSolverIterations: 6 - m_DefaultSolverVelocityIterations: 1 - m_QueriesHitBackfaces: 0 - m_QueriesHitTriggers: 1 - m_EnableAdaptiveForce: 0 - m_ClothInterCollisionDistance: 0 - m_ClothInterCollisionStiffness: 0 - m_ContactsGeneration: 1 - m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - m_AutoSimulation: 1 - m_AutoSyncTransforms: 1 - m_ClothInterCollisionSettingsToggle: 0 - m_ContactPairsMode: 0 - m_BroadphaseType: 0 - m_WorldBounds: - m_Center: {x: 0, y: 0, z: 0} - m_Extent: {x: 250, y: 250, z: 250} - m_WorldSubdivisions: 8 diff --git a/unity/PackageProject/ProjectSettings/EditorBuildSettings.asset b/unity/PackageProject/ProjectSettings/EditorBuildSettings.asset deleted file mode 100644 index 6dc24f7df..000000000 --- a/unity/PackageProject/ProjectSettings/EditorBuildSettings.asset +++ /dev/null @@ -1,7 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1045 &1 -EditorBuildSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Scenes: [] diff --git a/unity/PackageProject/ProjectSettings/EditorSettings.asset b/unity/PackageProject/ProjectSettings/EditorSettings.asset deleted file mode 100644 index d0c3d4a79..000000000 --- a/unity/PackageProject/ProjectSettings/EditorSettings.asset +++ /dev/null @@ -1,21 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!159 &1 -EditorSettings: - m_ObjectHideFlags: 0 - serializedVersion: 7 - m_ExternalVersionControlSupport: Hidden Meta Files - m_SerializationMode: 2 - m_LineEndingsForNewScripts: 1 - m_DefaultBehaviorMode: 0 - m_SpritePackerMode: 0 - m_SpritePackerPaddingPower: 1 - m_EtcTextureCompressorBehavior: 1 - m_EtcTextureFastCompressor: 1 - m_EtcTextureNormalCompressor: 2 - m_EtcTextureBestCompressor: 4 - m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp - m_ProjectGenerationRootNamespace: - m_UserGeneratedProjectSuffix: - m_CollabEditorSettings: - inProgressEnabled: 1 diff --git a/unity/PackageProject/ProjectSettings/GraphicsSettings.asset b/unity/PackageProject/ProjectSettings/GraphicsSettings.asset deleted file mode 100644 index 74d7b532b..000000000 --- a/unity/PackageProject/ProjectSettings/GraphicsSettings.asset +++ /dev/null @@ -1,61 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!30 &1 -GraphicsSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_Deferred: - m_Mode: 1 - m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} - m_DeferredReflections: - m_Mode: 1 - m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} - m_ScreenSpaceShadows: - m_Mode: 1 - m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} - m_LegacyDeferred: - m_Mode: 1 - m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} - m_DepthNormals: - m_Mode: 1 - m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} - m_MotionVectors: - m_Mode: 1 - m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} - m_LightHalo: - m_Mode: 1 - m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} - m_LensFlare: - m_Mode: 1 - m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} - m_AlwaysIncludedShaders: - - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} - m_PreloadedShaders: [] - m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, - type: 0} - m_CustomRenderPipeline: {fileID: 0} - m_TransparencySortMode: 0 - m_TransparencySortAxis: {x: 0, y: 0, z: 1} - m_DefaultRenderingPath: 1 - m_DefaultMobileRenderingPath: 1 - m_TierSettings: [] - m_LightmapStripping: 0 - m_FogStripping: 0 - m_InstancingStripping: 0 - m_LightmapKeepPlain: 1 - m_LightmapKeepDirCombined: 1 - m_LightmapKeepDynamicPlain: 1 - m_LightmapKeepDynamicDirCombined: 1 - m_LightmapKeepShadowMask: 1 - m_LightmapKeepSubtractive: 1 - m_FogKeepLinear: 1 - m_FogKeepExp: 1 - m_FogKeepExp2: 1 - m_AlbedoSwatchInfos: [] - m_LightsUseLinearIntensity: 0 - m_LightsUseColorTemperature: 0 diff --git a/unity/PackageProject/ProjectSettings/InputManager.asset b/unity/PackageProject/ProjectSettings/InputManager.asset deleted file mode 100644 index 17c8f538e..000000000 --- a/unity/PackageProject/ProjectSettings/InputManager.asset +++ /dev/null @@ -1,295 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!13 &1 -InputManager: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Axes: - - serializedVersion: 3 - m_Name: Horizontal - descriptiveName: - descriptiveNegativeName: - negativeButton: left - positiveButton: right - altNegativeButton: a - altPositiveButton: d - gravity: 3 - dead: 0.001 - sensitivity: 3 - snap: 1 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Vertical - descriptiveName: - descriptiveNegativeName: - negativeButton: down - positiveButton: up - altNegativeButton: s - altPositiveButton: w - gravity: 3 - dead: 0.001 - sensitivity: 3 - snap: 1 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire1 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left ctrl - altNegativeButton: - altPositiveButton: mouse 0 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire2 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left alt - altNegativeButton: - altPositiveButton: mouse 1 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire3 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left shift - altNegativeButton: - altPositiveButton: mouse 2 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Jump - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: space - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Mouse X - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0 - sensitivity: 0.1 - snap: 0 - invert: 0 - type: 1 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Mouse Y - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0 - sensitivity: 0.1 - snap: 0 - invert: 0 - type: 1 - axis: 1 - joyNum: 0 - - serializedVersion: 3 - m_Name: Mouse ScrollWheel - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0 - sensitivity: 0.1 - snap: 0 - invert: 0 - type: 1 - axis: 2 - joyNum: 0 - - serializedVersion: 3 - m_Name: Horizontal - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0.19 - sensitivity: 1 - snap: 0 - invert: 0 - type: 2 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Vertical - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0.19 - sensitivity: 1 - snap: 0 - invert: 1 - type: 2 - axis: 1 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire1 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 0 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire2 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 1 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire3 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 2 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Jump - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 3 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Submit - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: return - altNegativeButton: - altPositiveButton: joystick button 0 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Submit - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: enter - altNegativeButton: - altPositiveButton: space - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Cancel - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: escape - altNegativeButton: - altPositiveButton: joystick button 1 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 diff --git a/unity/PackageProject/ProjectSettings/NavMeshAreas.asset b/unity/PackageProject/ProjectSettings/NavMeshAreas.asset deleted file mode 100644 index 3b0b7c3d1..000000000 --- a/unity/PackageProject/ProjectSettings/NavMeshAreas.asset +++ /dev/null @@ -1,91 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!126 &1 -NavMeshProjectSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - areas: - - name: Walkable - cost: 1 - - name: Not Walkable - cost: 1 - - name: Jump - cost: 2 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - m_LastAgentTypeID: -887442657 - m_Settings: - - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.75 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - debug: - m_Flags: 0 - m_SettingNames: - - Humanoid diff --git a/unity/PackageProject/ProjectSettings/NetworkManager.asset b/unity/PackageProject/ProjectSettings/NetworkManager.asset deleted file mode 100644 index 5dc6a831d..000000000 --- a/unity/PackageProject/ProjectSettings/NetworkManager.asset +++ /dev/null @@ -1,8 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!149 &1 -NetworkManager: - m_ObjectHideFlags: 0 - m_DebugLevel: 0 - m_Sendrate: 15 - m_AssetToPrefab: {} diff --git a/unity/PackageProject/ProjectSettings/Physics2DSettings.asset b/unity/PackageProject/ProjectSettings/Physics2DSettings.asset deleted file mode 100644 index 132ee6bc8..000000000 --- a/unity/PackageProject/ProjectSettings/Physics2DSettings.asset +++ /dev/null @@ -1,37 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!19 &1 -Physics2DSettings: - m_ObjectHideFlags: 0 - serializedVersion: 3 - m_Gravity: {x: 0, y: -9.81} - m_DefaultMaterial: {fileID: 0} - m_VelocityIterations: 8 - m_PositionIterations: 3 - m_VelocityThreshold: 1 - m_MaxLinearCorrection: 0.2 - m_MaxAngularCorrection: 8 - m_MaxTranslationSpeed: 100 - m_MaxRotationSpeed: 360 - m_BaumgarteScale: 0.2 - m_BaumgarteTimeOfImpactScale: 0.75 - m_TimeToSleep: 0.5 - m_LinearSleepTolerance: 0.01 - m_AngularSleepTolerance: 2 - m_DefaultContactOffset: 0.01 - m_AutoSimulation: 1 - m_QueriesHitTriggers: 1 - m_QueriesStartInColliders: 1 - m_ChangeStopsCallbacks: 0 - m_CallbacksOnDisable: 1 - m_AutoSyncTransforms: 1 - m_AlwaysShowColliders: 0 - m_ShowColliderSleep: 1 - m_ShowColliderContacts: 0 - m_ShowColliderAABB: 0 - m_ContactArrowScale: 0.2 - m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} - m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} - m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} - m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} - m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/unity/PackageProject/ProjectSettings/PresetManager.asset b/unity/PackageProject/ProjectSettings/PresetManager.asset deleted file mode 100644 index 67a94daef..000000000 --- a/unity/PackageProject/ProjectSettings/PresetManager.asset +++ /dev/null @@ -1,7 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1386491679 &1 -PresetManager: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_DefaultPresets: {} diff --git a/unity/PackageProject/ProjectSettings/ProjectSettings.asset b/unity/PackageProject/ProjectSettings/ProjectSettings.asset deleted file mode 100644 index a1b5b4735..000000000 --- a/unity/PackageProject/ProjectSettings/ProjectSettings.asset +++ /dev/null @@ -1,641 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!129 &1 -PlayerSettings: - m_ObjectHideFlags: 0 - serializedVersion: 14 - productGUID: df7c15bd9d1f240d3a414152102aed53 - AndroidProfiler: 0 - AndroidFilterTouchesWhenObscured: 0 - defaultScreenOrientation: 4 - targetDevice: 2 - useOnDemandResources: 0 - accelerometerFrequency: 60 - companyName: DefaultCompany - productName: PackageProject - defaultCursor: {fileID: 0} - cursorHotspot: {x: 0, y: 0} - m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} - m_ShowUnitySplashScreen: 1 - m_ShowUnitySplashLogo: 1 - m_SplashScreenOverlayOpacity: 1 - m_SplashScreenAnimation: 1 - m_SplashScreenLogoStyle: 1 - m_SplashScreenDrawMode: 0 - m_SplashScreenBackgroundAnimationZoom: 1 - m_SplashScreenLogoAnimationZoom: 1 - m_SplashScreenBackgroundLandscapeAspect: 1 - m_SplashScreenBackgroundPortraitAspect: 1 - m_SplashScreenBackgroundLandscapeUvs: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - m_SplashScreenBackgroundPortraitUvs: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - m_SplashScreenLogos: [] - m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} - defaultScreenWidth: 1024 - defaultScreenHeight: 768 - defaultScreenWidthWeb: 960 - defaultScreenHeightWeb: 600 - m_StereoRenderingPath: 0 - m_ActiveColorSpace: 0 - m_MTRendering: 1 - m_StackTraceTypes: 010000000100000001000000010000000100000001000000 - iosShowActivityIndicatorOnLoading: -1 - androidShowActivityIndicatorOnLoading: -1 - tizenShowActivityIndicatorOnLoading: -1 - iosAppInBackgroundBehavior: 0 - displayResolutionDialog: 1 - iosAllowHTTPDownload: 1 - allowedAutorotateToPortrait: 1 - allowedAutorotateToPortraitUpsideDown: 1 - allowedAutorotateToLandscapeRight: 1 - allowedAutorotateToLandscapeLeft: 1 - useOSAutorotation: 1 - use32BitDisplayBuffer: 1 - preserveFramebufferAlpha: 0 - disableDepthAndStencilBuffers: 0 - androidBlitType: 0 - defaultIsFullScreen: 1 - defaultIsNativeResolution: 1 - macRetinaSupport: 1 - runInBackground: 0 - captureSingleScreen: 0 - muteOtherAudioSources: 0 - Prepare IOS For Recording: 0 - Force IOS Speakers When Recording: 0 - deferSystemGesturesMode: 0 - hideHomeButton: 0 - submitAnalytics: 1 - usePlayerLog: 1 - bakeCollisionMeshes: 0 - forceSingleInstance: 0 - resizableWindow: 0 - useMacAppStoreValidation: 0 - macAppStoreCategory: public.app-category.games - gpuSkinning: 0 - graphicsJobs: 0 - xboxPIXTextureCapture: 0 - xboxEnableAvatar: 0 - xboxEnableKinect: 0 - xboxEnableKinectAutoTracking: 0 - xboxEnableFitness: 0 - visibleInBackground: 1 - allowFullscreenSwitch: 1 - graphicsJobMode: 0 - macFullscreenMode: 2 - d3d11FullscreenMode: 1 - xboxSpeechDB: 0 - xboxEnableHeadOrientation: 0 - xboxEnableGuest: 0 - xboxEnablePIXSampling: 0 - metalFramebufferOnly: 0 - n3dsDisableStereoscopicView: 0 - n3dsEnableSharedListOpt: 1 - n3dsEnableVSync: 0 - xboxOneResolution: 0 - xboxOneSResolution: 0 - xboxOneXResolution: 3 - xboxOneMonoLoggingLevel: 0 - xboxOneLoggingLevel: 1 - xboxOneDisableEsram: 0 - xboxOnePresentImmediateThreshold: 0 - videoMemoryForVertexBuffers: 0 - psp2PowerMode: 0 - psp2AcquireBGM: 1 - wiiUTVResolution: 0 - wiiUGamePadMSAA: 1 - wiiUSupportsNunchuk: 0 - wiiUSupportsClassicController: 0 - wiiUSupportsBalanceBoard: 0 - wiiUSupportsMotionPlus: 0 - wiiUSupportsProController: 0 - wiiUAllowScreenCapture: 1 - wiiUControllerCount: 0 - m_SupportedAspectRatios: - 4:3: 1 - 5:4: 1 - 16:10: 1 - 16:9: 1 - Others: 1 - bundleVersion: 1.0 - preloadedAssets: [] - metroInputSource: 0 - wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 - xboxOneDisableKinectGpuReservation: 0 - xboxOneEnable7thCore: 0 - vrSettings: - cardboard: - depthFormat: 0 - enableTransitionView: 0 - daydream: - depthFormat: 0 - useSustainedPerformanceMode: 0 - enableVideoLayer: 0 - useProtectedVideoMemory: 0 - minimumSupportedHeadTracking: 0 - maximumSupportedHeadTracking: 1 - hololens: - depthFormat: 1 - depthBufferSharingEnabled: 0 - oculus: - sharedDepthBuffer: 0 - dashSupport: 0 - protectGraphicsMemory: 0 - useHDRDisplay: 0 - m_ColorGamuts: 00000000 - targetPixelDensity: 30 - resolutionScalingMode: 0 - androidSupportedAspectRatio: 1 - androidMaxAspectRatio: 2.1 - applicationIdentifier: {} - buildNumber: {} - AndroidBundleVersionCode: 1 - AndroidMinSdkVersion: 16 - AndroidTargetSdkVersion: 0 - AndroidPreferredInstallLocation: 1 - aotOptions: - stripEngineCode: 1 - iPhoneStrippingLevel: 0 - iPhoneScriptCallOptimization: 0 - ForceInternetPermission: 0 - ForceSDCardPermission: 0 - CreateWallpaper: 0 - APKExpansionFiles: 0 - keepLoadedShadersAlive: 0 - StripUnusedMeshComponents: 0 - VertexChannelCompressionMask: - serializedVersion: 2 - m_Bits: 238 - iPhoneSdkVersion: 988 - iOSTargetOSVersionString: 7.0 - tvOSSdkVersion: 0 - tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: 9.0 - uIPrerenderedIcon: 0 - uIRequiresPersistentWiFi: 0 - uIRequiresFullScreen: 1 - uIStatusBarHidden: 1 - uIExitOnSuspend: 0 - uIStatusBarStyle: 0 - iPhoneSplashScreen: {fileID: 0} - iPhoneHighResSplashScreen: {fileID: 0} - iPhoneTallHighResSplashScreen: {fileID: 0} - iPhone47inSplashScreen: {fileID: 0} - iPhone55inPortraitSplashScreen: {fileID: 0} - iPhone55inLandscapeSplashScreen: {fileID: 0} - iPhone58inPortraitSplashScreen: {fileID: 0} - iPhone58inLandscapeSplashScreen: {fileID: 0} - iPadPortraitSplashScreen: {fileID: 0} - iPadHighResPortraitSplashScreen: {fileID: 0} - iPadLandscapeSplashScreen: {fileID: 0} - iPadHighResLandscapeSplashScreen: {fileID: 0} - appleTVSplashScreen: {fileID: 0} - appleTVSplashScreen2x: {fileID: 0} - tvOSSmallIconLayers: [] - tvOSSmallIconLayers2x: [] - tvOSLargeIconLayers: [] - tvOSTopShelfImageLayers: [] - tvOSTopShelfImageLayers2x: [] - tvOSTopShelfImageWideLayers: [] - tvOSTopShelfImageWideLayers2x: [] - iOSLaunchScreenType: 0 - iOSLaunchScreenPortrait: {fileID: 0} - iOSLaunchScreenLandscape: {fileID: 0} - iOSLaunchScreenBackgroundColor: - serializedVersion: 2 - rgba: 0 - iOSLaunchScreenFillPct: 100 - iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: - iOSLaunchScreeniPadType: 0 - iOSLaunchScreeniPadImage: {fileID: 0} - iOSLaunchScreeniPadBackgroundColor: - serializedVersion: 2 - rgba: 0 - iOSLaunchScreeniPadFillPct: 100 - iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: - iOSUseLaunchScreenStoryboard: 0 - iOSLaunchScreenCustomStoryboardPath: - iOSDeviceRequirements: [] - iOSURLSchemes: [] - iOSBackgroundModes: 0 - iOSMetalForceHardShadows: 0 - metalEditorSupport: 0 - metalAPIValidation: 1 - iOSRenderExtraFrameOnPause: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - appleEnableAutomaticSigning: 0 - clonedFromGUID: 00000000000000000000000000000000 - AndroidTargetDevice: 0 - AndroidSplashScreenScale: 0 - androidSplashScreen: {fileID: 0} - AndroidKeystoreName: - AndroidKeyaliasName: - AndroidTVCompatibility: 1 - AndroidIsGame: 1 - AndroidEnableTango: 0 - androidEnableBanner: 1 - androidUseLowAccuracyLocation: 0 - m_AndroidBanners: - - width: 320 - height: 180 - banner: {fileID: 0} - androidGamepadSupportLevel: 0 - resolutionDialogBanner: {fileID: 0} - m_BuildTargetIcons: [] - m_BuildTargetBatching: [] - m_BuildTargetGraphicsAPIs: [] - m_BuildTargetVRSettings: [] - m_BuildTargetEnableVuforiaSettings: [] - openGLRequireES31: 0 - openGLRequireES31AEP: 0 - m_TemplateCustomTags: {} - mobileMTRendering: - Android: 1 - iPhone: 1 - tvOS: 1 - m_BuildTargetGroupLightmapEncodingQuality: [] - wiiUTitleID: 0005000011000000 - wiiUGroupID: 00010000 - wiiUCommonSaveSize: 4096 - wiiUAccountSaveSize: 2048 - wiiUOlvAccessKey: 0 - wiiUTinCode: 0 - wiiUJoinGameId: 0 - wiiUJoinGameModeMask: 0000000000000000 - wiiUCommonBossSize: 0 - wiiUAccountBossSize: 0 - wiiUAddOnUniqueIDs: [] - wiiUMainThreadStackSize: 3072 - wiiULoaderThreadStackSize: 1024 - wiiUSystemHeapSize: 128 - wiiUTVStartupScreen: {fileID: 0} - wiiUGamePadStartupScreen: {fileID: 0} - wiiUDrcBufferDisabled: 0 - wiiUProfilerLibPath: - playModeTestRunnerEnabled: 0 - actionOnDotNetUnhandledException: 1 - enableInternalProfiler: 0 - logObjCUncaughtExceptions: 1 - enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - switchNetLibKey: - switchSocketMemoryPoolSize: 6144 - switchSocketAllocatorPoolSize: 128 - switchSocketConcurrencyLimit: 14 - switchScreenResolutionBehavior: 2 - switchUseCPUProfiler: 0 - switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchIcons_0: {fileID: 0} - switchIcons_1: {fileID: 0} - switchIcons_2: {fileID: 0} - switchIcons_3: {fileID: 0} - switchIcons_4: {fileID: 0} - switchIcons_5: {fileID: 0} - switchIcons_6: {fileID: 0} - switchIcons_7: {fileID: 0} - switchIcons_8: {fileID: 0} - switchIcons_9: {fileID: 0} - switchIcons_10: {fileID: 0} - switchIcons_11: {fileID: 0} - switchIcons_12: {fileID: 0} - switchIcons_13: {fileID: 0} - switchIcons_14: {fileID: 0} - switchSmallIcons_0: {fileID: 0} - switchSmallIcons_1: {fileID: 0} - switchSmallIcons_2: {fileID: 0} - switchSmallIcons_3: {fileID: 0} - switchSmallIcons_4: {fileID: 0} - switchSmallIcons_5: {fileID: 0} - switchSmallIcons_6: {fileID: 0} - switchSmallIcons_7: {fileID: 0} - switchSmallIcons_8: {fileID: 0} - switchSmallIcons_9: {fileID: 0} - switchSmallIcons_10: {fileID: 0} - switchSmallIcons_11: {fileID: 0} - switchSmallIcons_12: {fileID: 0} - switchSmallIcons_13: {fileID: 0} - switchSmallIcons_14: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: - switchMainThreadStackSize: 1048576 - switchPresenceGroupId: - switchLogoHandling: 0 - switchReleaseVersion: 0 - switchDisplayVersion: 1.0.0 - switchStartupUserAccount: 0 - switchTouchScreenUsage: 0 - switchSupportedLanguagesMask: 0 - switchLogoType: 0 - switchApplicationErrorCodeCategory: - switchUserAccountSaveDataSize: 0 - switchUserAccountSaveDataJournalSize: 0 - switchApplicationAttribute: 0 - switchCardSpecSize: -1 - switchCardSpecClock: -1 - switchRatingsMask: 0 - switchRatingsInt_0: 0 - switchRatingsInt_1: 0 - switchRatingsInt_2: 0 - switchRatingsInt_3: 0 - switchRatingsInt_4: 0 - switchRatingsInt_5: 0 - switchRatingsInt_6: 0 - switchRatingsInt_7: 0 - switchRatingsInt_8: 0 - switchRatingsInt_9: 0 - switchRatingsInt_10: 0 - switchRatingsInt_11: 0 - switchLocalCommunicationIds_0: - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: - switchParentalControl: 0 - switchAllowsScreenshot: 1 - switchAllowsVideoCapturing: 1 - switchAllowsRuntimeAddOnContentInstall: 0 - switchDataLossConfirmation: 0 - switchSupportedNpadStyles: 3 - switchSocketConfigEnabled: 0 - switchTcpInitialSendBufferSize: 32 - switchTcpInitialReceiveBufferSize: 64 - switchTcpAutoSendBufferSizeMax: 256 - switchTcpAutoReceiveBufferSizeMax: 256 - switchUdpSendBufferSize: 9 - switchUdpReceiveBufferSize: 42 - switchSocketBufferEfficiency: 4 - switchSocketInitializeEnabled: 1 - switchNetworkInterfaceManagerInitializeEnabled: 1 - switchPlayerConnectionEnabled: 1 - ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: - ps4ParentalLevel: 11 - ps4ContentID: ED1633-NPXX51362_00-0000000000000000 - ps4Category: 0 - ps4MasterVersion: 01.00 - ps4AppVersion: 01.00 - ps4AppType: 0 - ps4ParamSfxPath: - ps4VideoOutPixelFormat: 0 - ps4VideoOutInitialWidth: 1920 - ps4VideoOutBaseModeInitialWidth: 1920 - ps4VideoOutReprojectionRate: 60 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4NPtitleDatPath: - ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: - ps4PlayTogetherPlayerCount: 0 - ps4EnterButtonAssignment: 1 - ps4ApplicationParam1: 0 - ps4ApplicationParam2: 0 - ps4ApplicationParam3: 0 - ps4ApplicationParam4: 0 - ps4DownloadDataSize: 0 - ps4GarlicHeapSize: 2048 - ps4ProGarlicHeapSize: 2560 - ps4Passcode: 5PN2qmWqBlQ9wQj99nsQzldVI5ZuGXbE - ps4pnSessions: 1 - ps4pnPresence: 1 - ps4pnFriends: 1 - ps4pnGameCustomData: 1 - playerPrefsSupport: 0 - restrictedAudioUsageRights: 0 - ps4UseResolutionFallback: 0 - ps4ReprojectionSupport: 0 - ps4UseAudio3dBackend: 0 - ps4SocialScreenEnabled: 0 - ps4ScriptOptimizationLevel: 0 - ps4Audio3dVirtualSpeakerCount: 14 - ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: - ps4PatchDayOne: 0 - ps4attribUserManagement: 0 - ps4attribMoveSupport: 0 - ps4attrib3DSupport: 0 - ps4attribShareSupport: 0 - ps4attribExclusiveVR: 0 - ps4disableAutoHideSplash: 0 - ps4videoRecordingFeaturesUsed: 0 - ps4contentSearchFeaturesUsed: 0 - ps4attribEyeToEyeDistanceSettingVR: 0 - ps4IncludedModules: [] - monoEnv: - psp2Splashimage: {fileID: 0} - psp2NPTrophyPackPath: - psp2NPSupportGBMorGJP: 0 - psp2NPAgeRating: 12 - psp2NPTitleDatPath: - psp2NPCommsID: - psp2NPCommunicationsID: - psp2NPCommsPassphrase: - psp2NPCommsSig: - psp2ParamSfxPath: - psp2ManualPath: - psp2LiveAreaGatePath: - psp2LiveAreaBackroundPath: - psp2LiveAreaPath: - psp2LiveAreaTrialPath: - psp2PatchChangeInfoPath: - psp2PatchOriginalPackage: - psp2PackagePassword: WRK5RhRXdCdG5nG5azdNMK66MuCV6GXi - psp2KeystoneFile: - psp2MemoryExpansionMode: 0 - psp2DRMType: 0 - psp2StorageType: 0 - psp2MediaCapacity: 0 - psp2DLCConfigPath: - psp2ThumbnailPath: - psp2BackgroundPath: - psp2SoundPath: - psp2TrophyCommId: - psp2TrophyPackagePath: - psp2PackagedResourcesPath: - psp2SaveDataQuota: 10240 - psp2ParentalLevel: 1 - psp2ShortTitle: Not Set - psp2ContentID: IV0000-ABCD12345_00-0123456789ABCDEF - psp2Category: 0 - psp2MasterVersion: 01.00 - psp2AppVersion: 01.00 - psp2TVBootMode: 0 - psp2EnterButtonAssignment: 2 - psp2TVDisableEmu: 0 - psp2AllowTwitterDialog: 1 - psp2Upgradable: 0 - psp2HealthWarning: 0 - psp2UseLibLocation: 0 - psp2InfoBarOnStartup: 0 - psp2InfoBarColor: 0 - psp2ScriptOptimizationLevel: 0 - psmSplashimage: {fileID: 0} - splashScreenBackgroundSourceLandscape: {fileID: 0} - splashScreenBackgroundSourcePortrait: {fileID: 0} - spritePackerPolicy: - webGLMemorySize: 256 - webGLExceptionSupport: 1 - webGLNameFilesAsHashes: 0 - webGLDataCaching: 0 - webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: - webGLTemplate: APPLICATION:Default - webGLAnalyzeBuildSize: 0 - webGLUseEmbeddedResources: 0 - webGLUseWasm: 0 - webGLCompressionFormat: 1 - scriptingDefineSymbols: {} - platformArchitecture: {} - scriptingBackend: {} - incrementalIl2cppBuild: {} - additionalIl2CppArgs: - scriptingRuntimeVersion: 0 - apiCompatibilityLevelPerPlatform: {} - m_RenderingPath: 1 - m_MobileRenderingPath: 1 - metroPackageName: PackageProject - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: - metroCertificateNotAfter: 0000000000000000 - metroApplicationDescription: PackageProject - wsaImages: {} - metroTileShortName: - metroCommandLineArgsFile: - metroTileShowName: 0 - metroMediumTileShowName: 0 - metroLargeTileShowName: 0 - metroWideTileShowName: 0 - metroDefaultTileSize: 1 - metroTileForegroundText: 2 - metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} - metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, - a: 1} - metroSplashScreenUseBackgroundColor: 0 - platformCapabilities: {} - metroFTAName: - metroFTAFileTypes: [] - metroProtocolName: - metroCompilationOverrides: 1 - tizenProductDescription: - tizenProductURL: - tizenSigningProfileName: - tizenGPSPermissions: 0 - tizenMicrophonePermissions: 0 - tizenDeploymentTarget: - tizenDeploymentTargetType: -1 - tizenMinOSVersion: 1 - n3dsUseExtSaveData: 0 - n3dsCompressStaticMem: 1 - n3dsExtSaveDataNumber: 0x12345 - n3dsStackSize: 131072 - n3dsTargetPlatform: 2 - n3dsRegion: 7 - n3dsMediaSize: 0 - n3dsLogoStyle: 3 - n3dsTitle: GameName - n3dsProductCode: - n3dsApplicationId: 0xFF3FF - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: - XboxOnePackageEncryption: 0 - XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: - XboxOneLanguage: - - enus - XboxOneCapability: [] - XboxOneGameRating: {} - XboxOneIsContentPackage: 0 - XboxOneEnableGPUVariability: 0 - XboxOneSockets: {} - XboxOneSplashScreen: {fileID: 0} - XboxOneAllowedProductIds: [] - XboxOnePersistentLocalStorageSize: 0 - XboxOneXTitleMemory: 8 - xboxOneScriptCompiler: 0 - vrEditorSettings: - daydream: - daydreamIconForeground: {fileID: 0} - daydreamIconBackground: {fileID: 0} - cloudServicesEnabled: {} - facebookSdkVersion: 7.9.4 - apiCompatibilityLevel: 2 - cloudProjectId: - projectName: - organizationId: - cloudEnabled: 0 - enableNativePlatformBackendsForNewInputSystem: 0 - disableOldInputManagerSupport: 0 diff --git a/unity/PackageProject/ProjectSettings/ProjectVersion.txt b/unity/PackageProject/ProjectSettings/ProjectVersion.txt deleted file mode 100644 index 95dcc9f42..000000000 --- a/unity/PackageProject/ProjectSettings/ProjectVersion.txt +++ /dev/null @@ -1 +0,0 @@ -m_EditorVersion: 2018.4.34f1 diff --git a/unity/PackageProject/ProjectSettings/QualitySettings.asset b/unity/PackageProject/ProjectSettings/QualitySettings.asset deleted file mode 100644 index 05daac3c4..000000000 --- a/unity/PackageProject/ProjectSettings/QualitySettings.asset +++ /dev/null @@ -1,191 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!47 &1 -QualitySettings: - m_ObjectHideFlags: 0 - serializedVersion: 5 - m_CurrentQuality: 5 - m_QualitySettings: - - serializedVersion: 2 - name: Very Low - pixelLightCount: 0 - shadows: 0 - shadowResolution: 0 - shadowProjection: 1 - shadowCascades: 1 - shadowDistance: 15 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 0 - blendWeights: 1 - textureQuality: 1 - anisotropicTextures: 0 - antiAliasing: 0 - softParticles: 0 - softVegetation: 0 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 0 - vSyncCount: 0 - lodBias: 0.3 - maximumLODLevel: 0 - particleRaycastBudget: 4 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Low - pixelLightCount: 0 - shadows: 0 - shadowResolution: 0 - shadowProjection: 1 - shadowCascades: 1 - shadowDistance: 20 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 0 - blendWeights: 2 - textureQuality: 0 - anisotropicTextures: 0 - antiAliasing: 0 - softParticles: 0 - softVegetation: 0 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 0 - vSyncCount: 0 - lodBias: 0.4 - maximumLODLevel: 0 - particleRaycastBudget: 16 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Medium - pixelLightCount: 1 - shadows: 1 - shadowResolution: 0 - shadowProjection: 1 - shadowCascades: 1 - shadowDistance: 20 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 0 - blendWeights: 2 - textureQuality: 0 - anisotropicTextures: 1 - antiAliasing: 0 - softParticles: 0 - softVegetation: 0 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 0 - vSyncCount: 1 - lodBias: 0.7 - maximumLODLevel: 0 - particleRaycastBudget: 64 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: High - pixelLightCount: 2 - shadows: 2 - shadowResolution: 1 - shadowProjection: 1 - shadowCascades: 2 - shadowDistance: 40 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 1 - blendWeights: 2 - textureQuality: 0 - anisotropicTextures: 1 - antiAliasing: 0 - softParticles: 0 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 - vSyncCount: 1 - lodBias: 1 - maximumLODLevel: 0 - particleRaycastBudget: 256 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Very High - pixelLightCount: 3 - shadows: 2 - shadowResolution: 2 - shadowProjection: 1 - shadowCascades: 2 - shadowDistance: 70 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 1 - blendWeights: 4 - textureQuality: 0 - anisotropicTextures: 2 - antiAliasing: 2 - softParticles: 1 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 - vSyncCount: 1 - lodBias: 1.5 - maximumLODLevel: 0 - particleRaycastBudget: 1024 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Ultra - pixelLightCount: 4 - shadows: 2 - shadowResolution: 2 - shadowProjection: 1 - shadowCascades: 4 - shadowDistance: 150 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 1 - blendWeights: 4 - textureQuality: 0 - anisotropicTextures: 2 - antiAliasing: 2 - softParticles: 1 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 - vSyncCount: 1 - lodBias: 2 - maximumLODLevel: 0 - particleRaycastBudget: 4096 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - m_PerPlatformDefaultQuality: - Android: 2 - Nintendo 3DS: 5 - Nintendo Switch: 5 - PS4: 5 - PSM: 5 - PSP2: 2 - Standalone: 5 - Tizen: 2 - WebGL: 3 - WiiU: 5 - Windows Store Apps: 5 - XboxOne: 5 - iPhone: 2 - tvOS: 2 diff --git a/unity/PackageProject/ProjectSettings/TagManager.asset b/unity/PackageProject/ProjectSettings/TagManager.asset deleted file mode 100644 index 1c92a7840..000000000 --- a/unity/PackageProject/ProjectSettings/TagManager.asset +++ /dev/null @@ -1,43 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!78 &1 -TagManager: - serializedVersion: 2 - tags: [] - layers: - - Default - - TransparentFX - - Ignore Raycast - - - - Water - - UI - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - m_SortingLayers: - - name: Default - uniqueID: 0 - locked: 0 diff --git a/unity/PackageProject/ProjectSettings/TimeManager.asset b/unity/PackageProject/ProjectSettings/TimeManager.asset deleted file mode 100644 index 558a017e1..000000000 --- a/unity/PackageProject/ProjectSettings/TimeManager.asset +++ /dev/null @@ -1,9 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!5 &1 -TimeManager: - m_ObjectHideFlags: 0 - Fixed Timestep: 0.02 - Maximum Allowed Timestep: 0.33333334 - m_TimeScale: 1 - Maximum Particle Timestep: 0.03 diff --git a/unity/PackageProject/ProjectSettings/UnityConnectSettings.asset b/unity/PackageProject/ProjectSettings/UnityConnectSettings.asset deleted file mode 100644 index 3da14d5ba..000000000 --- a/unity/PackageProject/ProjectSettings/UnityConnectSettings.asset +++ /dev/null @@ -1,34 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!310 &1 -UnityConnectSettings: - m_ObjectHideFlags: 0 - m_Enabled: 0 - m_TestMode: 0 - m_TestEventUrl: - m_TestConfigUrl: - m_TestInitMode: 0 - CrashReportingSettings: - m_EventUrl: https://perf-events.cloud.unity3d.com/api/events/crashes - m_NativeEventUrl: https://perf-events.cloud.unity3d.com/symbolicate - m_Enabled: 0 - m_CaptureEditorExceptions: 1 - UnityPurchasingSettings: - m_Enabled: 0 - m_TestMode: 0 - UnityAnalyticsSettings: - m_Enabled: 0 - m_InitializeOnStartup: 1 - m_TestMode: 0 - m_TestEventUrl: - m_TestConfigUrl: - UnityAdsSettings: - m_Enabled: 0 - m_InitializeOnStartup: 1 - m_TestMode: 0 - m_IosGameId: - m_AndroidGameId: - m_GameIds: {} - m_GameId: - PerformanceReportingSettings: - m_Enabled: 0 diff --git a/unity/PackageProject/ProjectSettings/VFXManager.asset b/unity/PackageProject/ProjectSettings/VFXManager.asset deleted file mode 100644 index 3a95c98be..000000000 --- a/unity/PackageProject/ProjectSettings/VFXManager.asset +++ /dev/null @@ -1,12 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!937362698 &1 -VFXManager: - m_ObjectHideFlags: 0 - m_IndirectShader: {fileID: 0} - m_CopyBufferShader: {fileID: 0} - m_SortShader: {fileID: 0} - m_StripUpdateShader: {fileID: 0} - m_RenderPipeSettingsPath: - m_FixedTimeStep: 0.016666668 - m_MaxDeltaTime: 0.05 diff --git a/unity/PackageProject/ProjectSettings/XRSettings.asset b/unity/PackageProject/ProjectSettings/XRSettings.asset deleted file mode 100644 index 482590c19..000000000 --- a/unity/PackageProject/ProjectSettings/XRSettings.asset +++ /dev/null @@ -1,10 +0,0 @@ -{ - "m_SettingKeys": [ - "VR Device Disabled", - "VR Device User Alert" - ], - "m_SettingValues": [ - "False", - "False" - ] -} \ No newline at end of file From 6a27f14bc4f89d5477b8535cad659c9adad8da5c Mon Sep 17 00:00:00 2001 From: richard elms Date: Mon, 4 Nov 2024 16:05:12 +0100 Subject: [PATCH 03/46] clean --- Rakefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index d9150ba6e..fc2153a89 100644 --- a/Rakefile +++ b/Rakefile @@ -255,6 +255,9 @@ namespace :plugin do desc "Delete all build artifacts" task :clean do + + sh "git", "clean", "-dfx", "Bugsnag/Assets/Bugsnag/Plugins" + FileUtils.rm_rf cocoa_build_dir unless is_windows? # remove android build area @@ -348,7 +351,7 @@ namespace :plugin do end end - osx_dir = File.join(plugins_dir, "OSX") + osx_dir = File.join(plugins_dir, "MacOS") ios_dir = File.join(plugins_dir, "iOS") @@ -443,6 +446,7 @@ namespace :test do end end end +end namespace :edm do task :build do From c4a5ab600de490c2b078b16d80bd2c81b20e2e6a Mon Sep 17 00:00:00 2001 From: richard elms Date: Mon, 4 Nov 2024 16:54:46 +0100 Subject: [PATCH 04/46] create dirs --- Bugsnag/Assets/Bugsnag/Plugins/Android.meta | 8 -------- Bugsnag/Assets/Bugsnag/Plugins/MacOS.meta | 8 -------- Bugsnag/Assets/Bugsnag/Plugins/iOS.meta | 8 -------- Rakefile | 5 +++++ 4 files changed, 5 insertions(+), 24 deletions(-) delete mode 100644 Bugsnag/Assets/Bugsnag/Plugins/Android.meta delete mode 100644 Bugsnag/Assets/Bugsnag/Plugins/MacOS.meta delete mode 100644 Bugsnag/Assets/Bugsnag/Plugins/iOS.meta diff --git a/Bugsnag/Assets/Bugsnag/Plugins/Android.meta b/Bugsnag/Assets/Bugsnag/Plugins/Android.meta deleted file mode 100644 index 0ccdfab5e..000000000 --- a/Bugsnag/Assets/Bugsnag/Plugins/Android.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 845a01717472f4e05aceda5d86607b56 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Bugsnag/Assets/Bugsnag/Plugins/MacOS.meta b/Bugsnag/Assets/Bugsnag/Plugins/MacOS.meta deleted file mode 100644 index 8120c49ba..000000000 --- a/Bugsnag/Assets/Bugsnag/Plugins/MacOS.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0d00fb107c1fb40529957e5d9f7185c0 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Bugsnag/Assets/Bugsnag/Plugins/iOS.meta b/Bugsnag/Assets/Bugsnag/Plugins/iOS.meta deleted file mode 100644 index fefb07ef2..000000000 --- a/Bugsnag/Assets/Bugsnag/Plugins/iOS.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a2e4a69a7add44f08b88bd690401223a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Rakefile b/Rakefile index fc2153a89..559dedb07 100644 --- a/Rakefile +++ b/Rakefile @@ -357,6 +357,11 @@ namespace :plugin do tvos_dir = File.join(plugins_dir, "tvOS") + # Ensure these directories exist + [osx_dir, ios_dir, tvos_dir].each do |dir| + FileUtils.mkdir_p(dir) unless File.directory?(dir) + end + #copy framework usage api file FileUtils.cp_r(File.join(current_directory,"bugsnag-cocoa", "Bugsnag", "resources", "PrivacyInfo.xcprivacy"), ios_dir) From cd96d0a905d1192580a2b3374f7264bfaf85b472 Mon Sep 17 00:00:00 2001 From: richard elms Date: Mon, 4 Nov 2024 17:38:14 +0100 Subject: [PATCH 05/46] force import --- Bugsnag/Assets/Editor.meta | 8 +++ Bugsnag/Assets/Editor/ForceImportSettings.cs | 58 +++++++++++++++++++ .../Assets/Editor/ForceImportSettings.cs.meta | 11 ++++ Rakefile | 2 +- 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 Bugsnag/Assets/Editor.meta create mode 100644 Bugsnag/Assets/Editor/ForceImportSettings.cs create mode 100644 Bugsnag/Assets/Editor/ForceImportSettings.cs.meta diff --git a/Bugsnag/Assets/Editor.meta b/Bugsnag/Assets/Editor.meta new file mode 100644 index 000000000..f07dbbac5 --- /dev/null +++ b/Bugsnag/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c8f0cacaa0aee42a5a1d85978f3808e3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Bugsnag/Assets/Editor/ForceImportSettings.cs b/Bugsnag/Assets/Editor/ForceImportSettings.cs new file mode 100644 index 000000000..cd9ed75c5 --- /dev/null +++ b/Bugsnag/Assets/Editor/ForceImportSettings.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; + +[InitializeOnLoad] +public class ForceImportSettings : MonoBehaviour +{ + // Static constructor is called automatically when the project is opened + static ForceImportSettings() + { + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/iOS", new List { BuildTarget.iOS }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/MacOS", new List { BuildTarget.StandaloneOSX }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/tvOS", new List { BuildTarget.tvOS }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Android", new List { BuildTarget.Android }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Cocoa", new List { BuildTarget.iOS, BuildTarget.tvOS, BuildTarget.StandaloneOSX }); + } + + private static List RelevantBuildTargets = new List { + BuildTarget.iOS, + BuildTarget.tvOS, + BuildTarget.Android, + BuildTarget.StandaloneOSX, + BuildTarget.StandaloneWindows, + BuildTarget.StandaloneWindows64, + BuildTarget.WebGL, + BuildTarget.Switch + }; + + private static void ApplyPluginImportSettings(string dir, List targets) + { + string[] files = System.IO.Directory.GetFiles(dir, "*", System.IO.SearchOption.AllDirectories); + + foreach (string file in files) + { + // Get the asset importer for each file + string assetPath = file.Replace("\\", "/"); // Ensure compatibility on Windows + AssetImporter importer = AssetImporter.GetAtPath(assetPath); + + if (importer != null && !assetPath.EndsWith(".meta")) + { + if (importer is PluginImporter pluginImporter) + { + foreach (var target in RelevantBuildTargets) + { + pluginImporter.SetCompatibleWithPlatform(target, targets.Contains(target)); + } + pluginImporter.SaveAndReimport(); + } + + Debug.Log($"Set import settings for {assetPath}"); + } + } + + Debug.Log("import settings applied."); + } +} \ No newline at end of file diff --git a/Bugsnag/Assets/Editor/ForceImportSettings.cs.meta b/Bugsnag/Assets/Editor/ForceImportSettings.cs.meta new file mode 100644 index 000000000..094054513 --- /dev/null +++ b/Bugsnag/Assets/Editor/ForceImportSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7244b0dde43f14fc1ad6a3bd9777267d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Rakefile b/Rakefile index 559dedb07..20823d263 100644 --- a/Rakefile +++ b/Rakefile @@ -101,7 +101,7 @@ end def assemble_android filter_abis=true abi_filters = filter_abis ? "-PABI_FILTERS=armeabi-v7a,x86" : "-Pnoop_filters=true" android_dir = File.join(plugins_dir, "Android") - + FileUtils.mkdir_p(android_dir) Dir.chdir"bugsnag-android" do sh "./gradlew", "assembleRelease", abi_filters end From b6d4a00d03ad5f2e450b014b95103c8b310bc6b2 Mon Sep 17 00:00:00 2001 From: richard elms Date: Mon, 4 Nov 2024 18:49:02 +0100 Subject: [PATCH 06/46] asset plugin importer --- Bugsnag/Assets/Editor/ForceImportSettings.cs | 47 +++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/Bugsnag/Assets/Editor/ForceImportSettings.cs b/Bugsnag/Assets/Editor/ForceImportSettings.cs index cd9ed75c5..7c28694e7 100644 --- a/Bugsnag/Assets/Editor/ForceImportSettings.cs +++ b/Bugsnag/Assets/Editor/ForceImportSettings.cs @@ -1,20 +1,20 @@ -using System; using System.Collections.Generic; -using System.Linq; using UnityEditor; using UnityEngine; [InitializeOnLoad] public class ForceImportSettings : MonoBehaviour { - // Static constructor is called automatically when the project is opened static ForceImportSettings() { - ApplyPluginImportSettings("Assets/Bugsnag/Plugins/iOS", new List { BuildTarget.iOS }); - ApplyPluginImportSettings("Assets/Bugsnag/Plugins/MacOS", new List { BuildTarget.StandaloneOSX }); - ApplyPluginImportSettings("Assets/Bugsnag/Plugins/tvOS", new List { BuildTarget.tvOS }); - ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Android", new List { BuildTarget.Android }); - ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Cocoa", new List { BuildTarget.iOS, BuildTarget.tvOS, BuildTarget.StandaloneOSX }); + EditorApplication.delayCall += () => + { + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/iOS", new List { BuildTarget.iOS }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/MacOS", new List { BuildTarget.StandaloneOSX }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/tvOS", new List { BuildTarget.tvOS }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Android", new List { BuildTarget.Android }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Cocoa", new List { BuildTarget.iOS, BuildTarget.tvOS, BuildTarget.StandaloneOSX }); + }; } private static List RelevantBuildTargets = new List { @@ -30,29 +30,34 @@ static ForceImportSettings() private static void ApplyPluginImportSettings(string dir, List targets) { - string[] files = System.IO.Directory.GetFiles(dir, "*", System.IO.SearchOption.AllDirectories); + string[] guids = AssetDatabase.FindAssets("", new[] { dir }); - foreach (string file in files) + foreach (string guid in guids) { - // Get the asset importer for each file - string assetPath = file.Replace("\\", "/"); // Ensure compatibility on Windows - AssetImporter importer = AssetImporter.GetAtPath(assetPath); + string assetPath = AssetDatabase.GUIDToAssetPath(guid); - if (importer != null && !assetPath.EndsWith(".meta")) + if (!string.IsNullOrEmpty(assetPath) && !assetPath.EndsWith(".meta")) { - if (importer is PluginImporter pluginImporter) + AssetImporter importer = AssetImporter.GetAtPath(assetPath); + + if (importer != null) { - foreach (var target in RelevantBuildTargets) + if (importer is PluginImporter pluginImporter) { - pluginImporter.SetCompatibleWithPlatform(target, targets.Contains(target)); + pluginImporter.SetCompatibleWithAnyPlatform(false); + foreach (var target in RelevantBuildTargets) + { + pluginImporter.SetCompatibleWithPlatform(target, targets.Contains(target)); + } + pluginImporter.SaveAndReimport(); + + Debug.Log($"Set import settings for {assetPath}"); } - pluginImporter.SaveAndReimport(); } - - Debug.Log($"Set import settings for {assetPath}"); } } - Debug.Log("import settings applied."); + AssetDatabase.Refresh(); + Debug.Log("Import settings applied and Asset Database refreshed."); } } \ No newline at end of file From d3ce898daea70acac99b800a284e8539f738b126 Mon Sep 17 00:00:00 2001 From: richard elms Date: Mon, 4 Nov 2024 19:47:23 +0100 Subject: [PATCH 07/46] rake clarification --- Rakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index 20823d263..7ca710bfd 100644 --- a/Rakefile +++ b/Rakefile @@ -251,7 +251,7 @@ namespace :plugin do namespace :build do cocoa_build_dir = "bugsnag-cocoa-build" - task all: [:cocoa, :android] + task native_plugins: [:cocoa, :android] desc "Delete all build artifacts" task :clean do @@ -407,7 +407,7 @@ namespace :plugin do task export: ["plugin:build:clean"] do if is_windows? else - Rake::Task["plugin:build:all"].invoke + Rake::Task["plugin:build:native_plugins"].invoke end export_package("Bugsnag.unitypackage") end From e0ef31f87f3ff1463074f203b848b2dd7defb375 Mon Sep 17 00:00:00 2001 From: richard elms Date: Tue, 5 Nov 2024 10:28:40 +0100 Subject: [PATCH 08/46] convert and run unit tests on build --- .../Bugsnag/Scripts/BugsnagUnity.asmdef | 3 + .../Bugsnag/Scripts/BugsnagUnity.asmdef.meta | 7 + .../Assets/Bugsnag/Scripts/Configuration.cs | 1 + .../Bugsnag/Scripts/EndpointConfiguration.cs | 2 + Bugsnag/Assets/Tests.meta | 8 + Bugsnag/Assets/Tests/BugsnagUnityTests.asmdef | 24 ++ .../Tests/BugsnagUnityTests.asmdef.meta | 7 + Bugsnag/Assets/Tests/ConfigurationTests.cs | 207 ++++++++++++++++++ .../Assets/Tests/ConfigurationTests.cs.meta | 11 + Bugsnag/Assets/Tests/ExceptionTests.cs | 168 ++++++++++++++ Bugsnag/Assets/Tests/ExceptionTests.cs.meta | 11 + .../Tests/MaximumLogTypeCounterTests.cs | 123 +++++++++++ .../Tests/MaximumLogTypeCounterTests.cs.meta | 11 + Bugsnag/Assets/Tests/OverloadCheck.cs | 33 +++ Bugsnag/Assets/Tests/OverloadCheck.cs.meta | 11 + Bugsnag/Assets/Tests/SessionTrackerTests.cs | 104 +++++++++ .../Assets/Tests/SessionTrackerTests.cs.meta | 11 + .../Assets/Tests/StackFrameParsingTests.cs | 126 +++++++++++ .../Tests/StackFrameParsingTests.cs.meta | 11 + Bugsnag/Assets/Tests/UniqueLogCounterTests.cs | 51 +++++ .../Tests/UniqueLogCounterTests.cs.meta | 11 + Rakefile | 10 +- 22 files changed, 947 insertions(+), 4 deletions(-) create mode 100644 Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef create mode 100644 Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef.meta create mode 100644 Bugsnag/Assets/Tests.meta create mode 100644 Bugsnag/Assets/Tests/BugsnagUnityTests.asmdef create mode 100644 Bugsnag/Assets/Tests/BugsnagUnityTests.asmdef.meta create mode 100644 Bugsnag/Assets/Tests/ConfigurationTests.cs create mode 100644 Bugsnag/Assets/Tests/ConfigurationTests.cs.meta create mode 100644 Bugsnag/Assets/Tests/ExceptionTests.cs create mode 100644 Bugsnag/Assets/Tests/ExceptionTests.cs.meta create mode 100644 Bugsnag/Assets/Tests/MaximumLogTypeCounterTests.cs create mode 100644 Bugsnag/Assets/Tests/MaximumLogTypeCounterTests.cs.meta create mode 100644 Bugsnag/Assets/Tests/OverloadCheck.cs create mode 100644 Bugsnag/Assets/Tests/OverloadCheck.cs.meta create mode 100644 Bugsnag/Assets/Tests/SessionTrackerTests.cs create mode 100644 Bugsnag/Assets/Tests/SessionTrackerTests.cs.meta create mode 100644 Bugsnag/Assets/Tests/StackFrameParsingTests.cs create mode 100644 Bugsnag/Assets/Tests/StackFrameParsingTests.cs.meta create mode 100644 Bugsnag/Assets/Tests/UniqueLogCounterTests.cs create mode 100644 Bugsnag/Assets/Tests/UniqueLogCounterTests.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef new file mode 100644 index 000000000..7682486ca --- /dev/null +++ b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef @@ -0,0 +1,3 @@ +{ + "name": "BugsnagUnity" +} diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef.meta b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef.meta new file mode 100644 index 000000000..f09048f5a --- /dev/null +++ b/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8d198819d450d4d6292709bec5a655cc +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs b/Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs index 7fb87127a..31eb262ef 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs @@ -6,6 +6,7 @@ using BugsnagUnity.Payload; using UnityEngine; using System.Text.RegularExpressions; +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("BugsnagUnityTests")] namespace BugsnagUnity { diff --git a/Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs b/Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs index 3ddad0e6f..8b2a2c8df 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs @@ -1,4 +1,6 @@ using System; +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("BugsnagUnityTests")] + namespace BugsnagUnity { public class EndpointConfiguration diff --git a/Bugsnag/Assets/Tests.meta b/Bugsnag/Assets/Tests.meta new file mode 100644 index 000000000..19a5261b7 --- /dev/null +++ b/Bugsnag/Assets/Tests.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 47b3a327f9bd44574a631ec965070776 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Bugsnag/Assets/Tests/BugsnagUnityTests.asmdef b/Bugsnag/Assets/Tests/BugsnagUnityTests.asmdef new file mode 100644 index 000000000..0f65fef99 --- /dev/null +++ b/Bugsnag/Assets/Tests/BugsnagUnityTests.asmdef @@ -0,0 +1,24 @@ +{ + "name": "BugsnagUnityTests", + "rootNamespace": "", + "references": [ + "UnityEngine.TestRunner", + "UnityEditor.TestRunner", + "BugsnagUnity" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll" + ], + "autoReferenced": false, + "defineConstraints": [ + "UNITY_INCLUDE_TESTS" + ], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Bugsnag/Assets/Tests/BugsnagUnityTests.asmdef.meta b/Bugsnag/Assets/Tests/BugsnagUnityTests.asmdef.meta new file mode 100644 index 000000000..c695716f7 --- /dev/null +++ b/Bugsnag/Assets/Tests/BugsnagUnityTests.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8a849b30210094bb4ac6f2adbf535353 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Bugsnag/Assets/Tests/ConfigurationTests.cs b/Bugsnag/Assets/Tests/ConfigurationTests.cs new file mode 100644 index 000000000..6f2b94dd5 --- /dev/null +++ b/Bugsnag/Assets/Tests/ConfigurationTests.cs @@ -0,0 +1,207 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Threading; +using NUnit.Framework; +using UnityEngine.TestTools; +using BugsnagUnity; +using UnityEngine; + +namespace BugsnagUnityTests +{ + [TestFixture] + public class ConfigurationTests + { + [Test] + public void DefaultConfigurationValues() + { + var config = new Configuration("foo"); + Assert.IsTrue(config.ReportExceptionLogsAsHandled); + Assert.IsTrue(config.AutoDetectErrors); + Assert.IsTrue(config.AutoTrackSessions); + Assert.AreEqual("production", config.ReleaseStage); + Assert.AreEqual("https://notify.bugsnag.com/", config.Endpoints.Notify.ToString()); + Assert.AreEqual("https://sessions.bugsnag.com/", config.Endpoints.Session.ToString()); + Assert.AreEqual("foo", config.ApiKey); + } + + [Test] + public void MaxBreadcrumbsLimit() + { + var config = new Configuration("foo"); + LogAssert.Expect(LogType.Error, "Invalid configuration value detected. Option maxBreadcrumbs should be an integer between 0-500. Supplied value is 501"); + config.MaximumBreadcrumbs = 501; + Assert.AreEqual(100, config.MaximumBreadcrumbs); + LogAssert.Expect(LogType.Error, "Invalid configuration value detected. Option maxBreadcrumbs should be an integer between 0-500. Supplied value is -1"); + config.MaximumBreadcrumbs = -1; + Assert.AreEqual(100, config.MaximumBreadcrumbs); + config.MaximumBreadcrumbs = 20; + Assert.AreEqual(20, config.MaximumBreadcrumbs); + } + + [Test] + public void CloneTest() + { + var original = new Configuration("foo"); + + original.MaximumBreadcrumbs = 1; + original.ReleaseStage = "1"; + original.SetUser("1", "1", "1"); + + var clone = original.Clone(); + + // int check + Assert.AreEqual(original.MaximumBreadcrumbs, clone.MaximumBreadcrumbs); + clone.MaximumBreadcrumbs = 2; + Assert.AreEqual(1, original.MaximumBreadcrumbs); + Assert.AreEqual(2, clone.MaximumBreadcrumbs); + + // string check + clone.ReleaseStage = "2"; + Assert.AreNotEqual(original.ReleaseStage, clone.ReleaseStage); + + // user check + clone.SetUser("2", "2", "2"); + Assert.AreEqual("1", original.GetUser().Name); + Assert.AreEqual("2", clone.GetUser().Name); + } + + [Test] + public void EndpointValidation() + { + var config = new Configuration("foo"); + + Assert.IsTrue(config.Endpoints.IsValid); + + config.Endpoints.Notify = new Uri("https://www.richIsCool.com/"); + + Assert.IsFalse(config.Endpoints.IsValid); + + config.Endpoints.Session = new Uri("https://www.richIsSuperCool.com/"); + + Assert.IsTrue(config.Endpoints.IsValid); + + config.Endpoints.Notify = null; + + Assert.IsFalse(config.Endpoints.IsValid); + } + + [Test] + public void RedactedKeysTest() + { + var config = new Configuration("foo"); + + // Default redacted keys + Assert.IsTrue(config.KeyIsRedacted("user-password")); + Assert.IsFalse(config.KeyIsRedacted("username")); + + var config2 = new Configuration("foo"); + + // Custom redacted keys + config2.RedactedKeys.Add(new Regex(".*secret.*", RegexOptions.IgnoreCase)); + config2.RedactedKeys.Add(new Regex(".*token.*", RegexOptions.IgnoreCase)); + Assert.IsTrue(config2.KeyIsRedacted("secret")); + Assert.IsTrue(config2.KeyIsRedacted("token")); + Assert.IsTrue(config2.KeyIsRedacted("password")); + Assert.IsFalse(config2.KeyIsRedacted("app_id")); + } + + [Test] + public void DiscardedClassesTest() + { + var config = new Configuration("foo"); + + // No discard classes by default + Assert.IsFalse(config.ErrorClassIsDiscarded("System.Exception")); + + var config2 = new Configuration("foo"); + + // Adding discard classes + config2.DiscardClasses.Add(new Regex("^System\\.Exception$", RegexOptions.IgnoreCase)); + config2.DiscardClasses.Add(new Regex("^System\\.NullReferenceException$", RegexOptions.IgnoreCase)); + Assert.IsTrue(config2.ErrorClassIsDiscarded("System.Exception")); + Assert.IsTrue(config2.ErrorClassIsDiscarded("System.NullReferenceException")); + Assert.IsFalse(config2.ErrorClassIsDiscarded("System.ArgumentException")); + } + + [Test] + public void ThreadSafeCallbacksTest() + { + var config = new Configuration("foo"); + + // Define simple callback functions + Func callback1 = (e) => true; + Func callback2 = (e) => false; + Func sessionCallback = (s) => true; + + // Lists to store results from multiple threads + List onErrorResults = new List(); + List onSendErrorResults = new List(); + List onSessionResults = new List(); + + // Adding callbacks in multiple threads + Thread addThread1 = new Thread(() => + { + for (int i = 0; i < 50; i++) + { + config.AddOnError(callback1); + config.AddOnSendError(callback2); + config.AddOnSession(sessionCallback); + } + }); + + Thread addThread2 = new Thread(() => + { + for (int i = 0; i < 50; i++) + { + config.AddOnError(callback2); + config.AddOnSendError(callback1); + config.AddOnSession(sessionCallback); + } + }); + + // Removing callbacks in multiple threads + Thread removeThread1 = new Thread(() => + { + for (int i = 0; i < 25; i++) + { + config.RemoveOnError(callback1); + config.RemoveOnSendError(callback2); + config.RemoveOnSession(sessionCallback); + } + }); + + Thread removeThread2 = new Thread(() => + { + for (int i = 0; i < 25; i++) + { + config.RemoveOnError(callback2); + config.RemoveOnSendError(callback1); + config.RemoveOnSession(sessionCallback); + } + }); + + // Start all threads + addThread1.Start(); + addThread2.Start(); + removeThread1.Start(); + removeThread2.Start(); + + // Wait for all threads to complete + addThread1.Join(); + addThread2.Join(); + removeThread1.Join(); + removeThread2.Join(); + + // Verify the state of the callback lists + Assert.IsTrue(config.GetOnErrorCallbacks().Count > 0, "OnErrorCallbacks should have entries."); + Assert.IsTrue(config.GetOnSendErrorCallbacks().Count > 0, "OnSendErrorCallbacks should have entries."); + Assert.IsTrue(config.GetOnSessionCallbacks().Count > 0, "OnSessionCallbacks should have entries."); + + // Check if the remaining callbacks are as expected + Assert.IsTrue(config.GetOnErrorCallbacks().Contains(callback1) || config.GetOnErrorCallbacks().Contains(callback2), "Callback1 or Callback2 should be in OnErrorCallbacks."); + Assert.IsTrue(config.GetOnSendErrorCallbacks().Contains(callback1) || config.GetOnSendErrorCallbacks().Contains(callback2), "Callback1 or Callback2 should be in OnSendErrorCallbacks."); + Assert.IsTrue(config.GetOnSessionCallbacks().Contains(sessionCallback), "SessionCallback should be in OnSessionCallbacks."); + } + } +} \ No newline at end of file diff --git a/Bugsnag/Assets/Tests/ConfigurationTests.cs.meta b/Bugsnag/Assets/Tests/ConfigurationTests.cs.meta new file mode 100644 index 000000000..d061b6bd5 --- /dev/null +++ b/Bugsnag/Assets/Tests/ConfigurationTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6810844c84b884430a65c989d936cbc3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Bugsnag/Assets/Tests/ExceptionTests.cs b/Bugsnag/Assets/Tests/ExceptionTests.cs new file mode 100644 index 000000000..fb275cedf --- /dev/null +++ b/Bugsnag/Assets/Tests/ExceptionTests.cs @@ -0,0 +1,168 @@ +using System.Linq; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.TestTools; +using BugsnagUnity; +using BugsnagUnity.Payload; + +namespace BugsnagUnityTests +{ + [TestFixture] + public class ExceptionTests + { + [Test] + public void ParseExceptionFromLogMessage() + { + string condition = "IndexOutOfRangeException: Array index is out of range."; + string stacktrace = @"ReporterBehavior.AssertionFailure () [0x00000] in :0 + UnityEngine.Events.InvokableCall.Invoke () [0x00000] in :0 + UnityEngine.Events.UnityEvent.Invoke () [0x00000] in :0 + UnityEngine.UI.Button.Press () [0x00000] in :0 + UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) [0x00000] in :0 + UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) [0x00000] in :0 + UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) [0x00000] in :0"; + var logType = UnityEngine.LogType.Error; + var log = new UnityLogMessage(condition, stacktrace, logType); + + Assert.IsTrue(Error.ShouldSend(log)); + + var exception = Error.FromUnityLogMessage(log, new System.Diagnostics.StackFrame[] { }, Severity.Info); + var stack = exception.Stacktrace.ToList(); + + Assert.AreEqual(7, stack.Count); + Assert.AreEqual("IndexOutOfRangeException", exception.ErrorClass); + Assert.AreEqual("Array index is out of range.", exception.ErrorMessage); + Assert.AreEqual("ReporterBehavior.AssertionFailure()", stack[0].Method); + Assert.AreEqual("", stack[0].File); + Assert.AreEqual(0, stack[0].LineNumber); + Assert.AreEqual("UnityEngine.Events.InvokableCall.Invoke()", stack[1].Method); + Assert.AreEqual("", stack[1].File); + Assert.AreEqual(0, stack[1].LineNumber); + Assert.AreEqual("UnityEngine.Events.UnityEvent.Invoke()", stack[2].Method); + Assert.AreEqual("", stack[2].File); + Assert.AreEqual(0, stack[2].LineNumber); + Assert.AreEqual("UnityEngine.UI.Button.Press()", stack[3].Method); + Assert.AreEqual("", stack[3].File); + Assert.AreEqual(0, stack[3].LineNumber); + Assert.AreEqual("UnityEngine.UI.Button.OnPointerClick(UnityEngine.EventSystems.PointerEventData eventData)", stack[4].Method); + Assert.AreEqual("", stack[4].File); + Assert.AreEqual(0, stack[4].LineNumber); + Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData)", stack[5].Method); + Assert.AreEqual("", stack[5].File); + Assert.AreEqual(0, stack[5].LineNumber); + Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler](UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor)", stack[6].Method); + Assert.AreEqual("", stack[6].File); + Assert.AreEqual(0, stack[6].LineNumber); + } + + [Test] + public void ParseDuplicateAndroidExceptionFromLogMessage() + { + string condition = "AndroidJavaException: java.lang.Error"; + string stacktrace = @"java.lang.Error: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0102192a9accb1876a +libunity.0033c25b(Unknown:-2) +libunity.003606e3(Unknown:-2) +app_process64.000d1b11(Unknown:-2)"; + var logType = UnityEngine.LogType.Error; + var log = new UnityLogMessage(condition, stacktrace, logType); + + Assert.IsFalse(Error.ShouldSend(log)); + } + + [Test] + public void ParseAndroidExceptionFromLogMessage() + { + string condition = "AndroidJavaException: java.lang.IllegalArgumentException"; + string stacktrace = @"java.lang.IllegalArgumentException +com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash(CrashHelper.java:11) +com.unity3d.player.UnityPlayer.nativeRender(Native Method)"; + var logType = UnityEngine.LogType.Error; + var log = new UnityLogMessage(condition, stacktrace, logType); + + Assert.IsTrue(Error.ShouldSend(log)); + + var exception = Error.FromUnityLogMessage(log, new System.Diagnostics.StackFrame[] { }, Severity.Warning); + var stack = exception.Stacktrace.ToList(); + + Assert.AreEqual("java.lang.IllegalArgumentException", exception.ErrorClass); + Assert.IsTrue(string.IsNullOrEmpty(exception.ErrorMessage)); + Assert.AreEqual(2, stack.Count); + Assert.AreEqual("com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash()", stack[0].Method); + Assert.AreEqual("CrashHelper.java", stack[0].File); + Assert.AreEqual(11, stack[0].LineNumber); + Assert.AreEqual("com.unity3d.player.UnityPlayer.nativeRender()", stack[1].Method); + Assert.AreEqual("Native Method", stack[1].File); + Assert.AreEqual(null, stack[1].LineNumber); + } + + [Test] + public void ParseAndroidExceptionAndMessageFromLogMessage() + { + string condition = "AndroidJavaException: java.lang.ArrayIndexOutOfBoundsException: length=2; index=2"; + string stacktrace = @"java.lang.ArrayIndexOutOfBoundsException: length=2; index=2 +com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash(CrashHelper.java:11) +com.unity3d.player.UnityPlayer.nativeRender(Native Method) +com.unity3d.player.UnityPlayer.c(Unknown Source:0) +com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source:72) +android.os.MessageQueue.next(MessageQueue.java:395) +android.os.Looper.loop(Looper.java:160) +com.unity3d.player.UnityPlayer$e.run(Unknown Source:32) +UnityEngine.AndroidJNISafe.CheckException() +UnityEngine.AndroidJNISafe.CallStaticVoidMethod(IntPtr clazz, IntPtr methodID, UnityEngine.jvalue[] args) +UnityEngine.AndroidJavaObject._CallStatic(System.String methodName, System.Object[] args) +UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) +UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functorUnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler]() +UnityEngine.EventSystems.EventSystem:Update()"; + var logType = UnityEngine.LogType.Error; + var log = new UnityLogMessage(condition, stacktrace, logType); + + Assert.IsTrue(Error.ShouldSend(log)); + + var exception = Error.FromUnityLogMessage(log, new System.Diagnostics.StackFrame[] { }, Severity.Warning); + var stack = exception.Stacktrace.ToList(); + + Assert.AreEqual(13, stack.Count); + Assert.AreEqual("java.lang.ArrayIndexOutOfBoundsException", exception.ErrorClass); + Assert.AreEqual("length=2; index=2", exception.ErrorMessage); + Assert.AreEqual("com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash()", stack[0].Method); + Assert.AreEqual("CrashHelper.java", stack[0].File); + Assert.AreEqual(11, stack[0].LineNumber); + Assert.AreEqual("com.unity3d.player.UnityPlayer.nativeRender()", stack[1].Method); + Assert.AreEqual("Native Method", stack[1].File); + Assert.AreEqual(null, stack[1].LineNumber); + Assert.AreEqual("com.unity3d.player.UnityPlayer.c()", stack[2].Method); + Assert.AreEqual("Unknown Source", stack[2].File); + Assert.AreEqual(0, stack[2].LineNumber); + Assert.AreEqual("com.unity3d.player.UnityPlayer$e$2.queueIdle()", stack[3].Method); + Assert.AreEqual("Unknown Source", stack[3].File); + Assert.AreEqual(72, stack[3].LineNumber); + Assert.AreEqual("android.os.MessageQueue.next()", stack[4].Method); + Assert.AreEqual("MessageQueue.java", stack[4].File); + Assert.AreEqual(395, stack[4].LineNumber); + Assert.AreEqual("android.os.Looper.loop()", stack[5].Method); + Assert.AreEqual("Looper.java", stack[5].File); + Assert.AreEqual(160, stack[5].LineNumber); + Assert.AreEqual("com.unity3d.player.UnityPlayer$e.run()", stack[6].Method); + Assert.AreEqual("Unknown Source", stack[6].File); + Assert.AreEqual(32, stack[6].LineNumber); + Assert.AreEqual("UnityEngine.AndroidJNISafe.CheckException()", stack[7].Method); + Assert.AreEqual(null, stack[7].File); + Assert.AreEqual(null, stack[7].LineNumber); + Assert.AreEqual("UnityEngine.AndroidJNISafe.CallStaticVoidMethod(IntPtr clazz, IntPtr methodID, UnityEngine.jvalue[] args)", stack[8].Method); + Assert.AreEqual(null, stack[8].File); + Assert.AreEqual(null, stack[8].LineNumber); + Assert.AreEqual("UnityEngine.AndroidJavaObject._CallStatic(System.String methodName, System.Object[] args)", stack[9].Method); + Assert.AreEqual(null, stack[9].File); + Assert.AreEqual(null, stack[9].LineNumber); + Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData)", stack[10].Method); + Assert.AreEqual(null, stack[10].File); + Assert.AreEqual(null, stack[10].LineNumber); + Assert.AreEqual("UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functorUnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler]()", stack[11].Method); + Assert.AreEqual(null, stack[11].File); + Assert.AreEqual(null, stack[11].LineNumber); + Assert.AreEqual("UnityEngine.EventSystems.EventSystem:Update()", stack[12].Method); + Assert.AreEqual(null, stack[12].File); + Assert.AreEqual(null, stack[12].LineNumber); + } + } +} \ No newline at end of file diff --git a/Bugsnag/Assets/Tests/ExceptionTests.cs.meta b/Bugsnag/Assets/Tests/ExceptionTests.cs.meta new file mode 100644 index 000000000..a3a19631a --- /dev/null +++ b/Bugsnag/Assets/Tests/ExceptionTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7867c57de17ce440bb50b9023266ffb6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Bugsnag/Assets/Tests/MaximumLogTypeCounterTests.cs b/Bugsnag/Assets/Tests/MaximumLogTypeCounterTests.cs new file mode 100644 index 000000000..80da78c5b --- /dev/null +++ b/Bugsnag/Assets/Tests/MaximumLogTypeCounterTests.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using NUnit.Framework; +using UnityEngine.TestTools; +using BugsnagUnity; +using System.Threading; + +namespace BugsnagUnityTests +{ + [TestFixture] + public class MaximumLogTypeCounterTests + { + [Test] + public void SendsSingleMessage() + { + Dictionary maximumTypePerTimePeriod = + new Dictionary { { LogType.Error, 5 } }; + + var configuration = new Configuration("foo") + { + MaximumTypePerTimePeriod = maximumTypePerTimePeriod + }; + + var counter = new MaximumLogTypeCounter(configuration); + + var message = new UnityLogMessage("", "", UnityEngine.LogType.Error); + + Assert.IsTrue(counter.ShouldSend(message)); + } + + [Test] + public void ShouldNotSendOverLimitMessages() + { + Dictionary maximumTypePerTimePeriod = + new Dictionary { { LogType.Error, 1 } }; + + var configuration = new Configuration("foo") + { + MaximumTypePerTimePeriod = maximumTypePerTimePeriod + }; + + var counter = new MaximumLogTypeCounter(configuration); + + var message1 = new UnityLogMessage("", "", LogType.Error); + var message2 = new UnityLogMessage("", "", LogType.Error); + + counter.ShouldSend(message1); + Assert.IsFalse(counter.ShouldSend(message2)); + } + + [Test] + public void ShouldSendUnderTheLimit() + { + Dictionary maximumTypePerTimePeriod = + new Dictionary { { LogType.Error, 5 } }; + + var configuration = new Configuration("foo") + { + MaximumTypePerTimePeriod = maximumTypePerTimePeriod + }; + + var counter = new MaximumLogTypeCounter(configuration); + + var message1 = new UnityLogMessage("", "", LogType.Error); + var message2 = new UnityLogMessage("", "", LogType.Error); + var message3 = new UnityLogMessage("", "", LogType.Error); + var message4 = new UnityLogMessage("", "", LogType.Error); + var message5 = new UnityLogMessage("", "", LogType.Error); + + Assert.IsTrue(counter.ShouldSend(message1)); + Assert.IsTrue(counter.ShouldSend(message2)); + Assert.IsTrue(counter.ShouldSend(message3)); + Assert.IsTrue(counter.ShouldSend(message4)); + Assert.IsTrue(counter.ShouldSend(message5)); + } + + [Test] + public void DontTrackCertainLogType() + { + Dictionary maximumTypePerTimePeriod = + new Dictionary(); + + var configuration = new Configuration("foo") + { + MaximumTypePerTimePeriod = maximumTypePerTimePeriod + }; + + var counter = new MaximumLogTypeCounter(configuration); + + var message = new UnityLogMessage("", "", LogType.Error); + + Assert.IsTrue(counter.ShouldSend(message)); + } + + [Test] + public void FlushesCorrectly() + { + Dictionary maximumTypePerTimePeriod = + new Dictionary { { LogType.Error, 1 } }; + + var configuration = new Configuration("foo") + { + MaximumTypePerTimePeriod = maximumTypePerTimePeriod, + MaximumLogsTimePeriod = TimeSpan.FromSeconds(2), + }; + + var counter = new MaximumLogTypeCounter(configuration); + + var message = new UnityLogMessage("", "", LogType.Error); + + counter.ShouldSend(message); + + // Convert TimeSpan to seconds for WaitForSeconds + Thread.Sleep(configuration.MaximumLogsTimePeriod); + + message = new UnityLogMessage("", "", LogType.Error); + + Assert.IsTrue(counter.ShouldSend(message)); + } + } +} \ No newline at end of file diff --git a/Bugsnag/Assets/Tests/MaximumLogTypeCounterTests.cs.meta b/Bugsnag/Assets/Tests/MaximumLogTypeCounterTests.cs.meta new file mode 100644 index 000000000..d4ac462a4 --- /dev/null +++ b/Bugsnag/Assets/Tests/MaximumLogTypeCounterTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b1b441b27d6f4fff85916e3a233fcc7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Bugsnag/Assets/Tests/OverloadCheck.cs b/Bugsnag/Assets/Tests/OverloadCheck.cs new file mode 100644 index 000000000..79ac13c25 --- /dev/null +++ b/Bugsnag/Assets/Tests/OverloadCheck.cs @@ -0,0 +1,33 @@ +using System; +namespace BugsnagUnity.Tests +{ + public class OverloadCheck + { + + // this method never runs and is just used to check that no notify overides are accidentally broken during refactoring + // if one is broken then the notifier will not compile + private void Check() + { + Bugsnag.Notify("name", "message", "stacktrace"); + + Bugsnag.Notify("name", "message", "stacktrace", CallBack); + + Bugsnag.Notify(new Exception()); + + Bugsnag.Notify(new Exception(), "stacktrace"); + + Bugsnag.Notify(new Exception(), "stacktrace", CallBack); + + Bugsnag.Notify(new Exception(), CallBack); + + Bugsnag.Notify(new Exception(), Severity.Error); + + Bugsnag.Notify(new Exception(), Severity.Error, CallBack); + } + + private bool CallBack(IEvent e) + { + return true; + } + } +} diff --git a/Bugsnag/Assets/Tests/OverloadCheck.cs.meta b/Bugsnag/Assets/Tests/OverloadCheck.cs.meta new file mode 100644 index 000000000..108bc337e --- /dev/null +++ b/Bugsnag/Assets/Tests/OverloadCheck.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a694d7fafd3e141d297d6103fbc50315 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Bugsnag/Assets/Tests/SessionTrackerTests.cs b/Bugsnag/Assets/Tests/SessionTrackerTests.cs new file mode 100644 index 000000000..6f95b6645 --- /dev/null +++ b/Bugsnag/Assets/Tests/SessionTrackerTests.cs @@ -0,0 +1,104 @@ +using System; +using System.Linq; +using NUnit.Framework; +using BugsnagUnity; +using BugsnagUnity.Payload; + +namespace BugsnagUnityTests +{ + [TestFixture] + public class SessionTrackerTests + { + private SessionTracker Tracker { get; set; } + + [SetUp] + public void SetUp() + { + Client client = new Client(new NativeClient(new Configuration("api-key"))); + Tracker = new SessionTracker(client); + Assert.IsNotNull(Tracker); + } + + /// + /// Verifies that a session can be resumed after it is stopped. + /// + [Test] + public void ResumeFromStoppedSession() + { + Tracker.StartSession(); + var originalSession = Tracker.CurrentSession; + Assert.IsNotNull(originalSession); + + Tracker.PauseSession(); + Assert.IsNull(Tracker.CurrentSession); + + Assert.IsTrue(Tracker.ResumeSession()); + Assert.IsTrue(SessionsAreTheSame(originalSession, Tracker.CurrentSession)); + } + + /// + /// Verifies that the previous session is resumed when calling SessionTracker.ResumeSession. + /// + [Test] + public void ResumeWithNoStoppedSession() + { + Tracker.StartSession(); + Tracker.PauseSession(); + Assert.IsTrue(Tracker.ResumeSession()); + Assert.IsFalse(Tracker.ResumeSession()); + } + + /// + /// Verifies that a new session can be created after the previous one is stopped. + /// + [Test] + public void StartNewAfterStoppedSession() + { + Tracker.StartSession(); + var originalSession = Tracker.CurrentSession; + + Tracker.PauseSession(); + Tracker.StartSession(); + Assert.AreNotEqual(originalSession, Tracker.CurrentSession); + } + + /// + /// Verifies that calling SessionTracker.ResumeSession multiple times only starts one session. + /// + [Test] + public void MultipleResumesHaveNoEffect() + { + Tracker.StartSession(); + var original = Tracker.CurrentSession; + Tracker.PauseSession(); + + Assert.IsTrue(Tracker.ResumeSession()); + Assert.IsTrue(SessionsAreTheSame(original, Tracker.CurrentSession)); + + Assert.IsFalse(Tracker.ResumeSession()); + Assert.IsTrue(SessionsAreTheSame(original, Tracker.CurrentSession)); + } + + /// + /// Verifies that calling SessionTracker.PauseSession multiple times only stops one session. + /// + [Test] + public void MultipleStopsHaveNoEffect() + { + Tracker.StartSession(); + Assert.IsNotNull(Tracker.CurrentSession); + + Tracker.PauseSession(); + Assert.IsNull(Tracker.CurrentSession); + + Tracker.PauseSession(); + Assert.IsNull(Tracker.CurrentSession); + } + + private bool SessionsAreTheSame(Session original, Session other) + { + return original.Id == other.Id + && original.StartedAt == other.StartedAt; + } + } +} \ No newline at end of file diff --git a/Bugsnag/Assets/Tests/SessionTrackerTests.cs.meta b/Bugsnag/Assets/Tests/SessionTrackerTests.cs.meta new file mode 100644 index 000000000..fe4998e4f --- /dev/null +++ b/Bugsnag/Assets/Tests/SessionTrackerTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 49ef54ac727b849e4b485178e18dcd74 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Bugsnag/Assets/Tests/StackFrameParsingTests.cs b/Bugsnag/Assets/Tests/StackFrameParsingTests.cs new file mode 100644 index 000000000..db39d14c6 --- /dev/null +++ b/Bugsnag/Assets/Tests/StackFrameParsingTests.cs @@ -0,0 +1,126 @@ +using NUnit.Framework; +using BugsnagUnity; +using BugsnagUnity.Payload; + +namespace BugsnagUnityTests +{ + [TestFixture] + public class StackFrameParsingTests + { + [Test] + public void ParseMethodWithAt() + { + var stackframe = StackTraceLine.FromLogMessage( + "at UnityEngine.Events.InvokableCall.Invoke () [0x00010] in /Users/bokken/build/output/unity/unity/Runtime/Export/UnityEvent/UnityEvent.cs:178" + ); + Assert.AreEqual("UnityEngine.Events.InvokableCall.Invoke()", stackframe.Method); + } + + [Test] + public void ParseMethodNameWithColon() + { + var stackframe = StackTraceLine.FromLogMessage( + "ReporterBehavior:LogCaughtException() (at /Users/gameserver/parky/Assets/ReporterBehavior.cs:58)" + ); + Assert.AreEqual("ReporterBehavior:LogCaughtException()", stackframe.Method); + Assert.AreEqual(58, stackframe.LineNumber); + Assert.AreEqual("/Users/gameserver/parky/Assets/ReporterBehavior.cs", stackframe.File); + } + + [Test] + public void ParseMethodNameWithColonWithoutFileInfo() + { + var stackframe = StackTraceLine.FromLogMessage( + "UnityEngine.EventSystems.EventSystem:Update()" + ); + Assert.AreEqual("UnityEngine.EventSystems.EventSystem:Update()", stackframe.Method); + Assert.IsNull(stackframe.LineNumber); + Assert.IsNull(stackframe.File); + } + + [Test] + public void ParseMethodNameWithSpace() + { + var stackframe = StackTraceLine.FromLogMessage( + "ReporterBehavior.AssertionFailure () (at /Users/gameserver/parky/Assets/ReporterBehavior.cs:46)" + ); + Assert.AreEqual("ReporterBehavior.AssertionFailure()", stackframe.Method); + Assert.AreEqual(46, stackframe.LineNumber); + Assert.AreEqual("/Users/gameserver/parky/Assets/ReporterBehavior.cs", stackframe.File); + } + + [Test] + public void ParseFilePathWithSpace() + { + var stackframe = StackTraceLine.FromLogMessage( + "ReporterBehavior.AssertionFailure () (at /Users/game server/parky/Assets/ReporterBehavior.cs:46)" + ); + Assert.AreEqual("ReporterBehavior.AssertionFailure()", stackframe.Method); + Assert.AreEqual(46, stackframe.LineNumber); + Assert.AreEqual("/Users/game server/parky/Assets/ReporterBehavior.cs", stackframe.File); + } + + [Test] + public void ParseMethodArgument() + { + var stackframe = StackTraceLine.FromLogMessage( + "UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:45)" + ); + Assert.AreEqual("UnityEngine.UI.Button.OnPointerClick(UnityEngine.EventSystems.PointerEventData eventData)", stackframe.Method); + Assert.AreEqual(45, stackframe.LineNumber); + Assert.AreEqual("/Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs", stackframe.File); + } + + [Test] + public void ParseMultipleMethodArguments() + { + var stackframe = StackTraceLine.FromLogMessage( + "UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50)" + ); + Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData)", stackframe.Method); + Assert.AreEqual(50, stackframe.LineNumber); + Assert.AreEqual("/Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs", stackframe.File); + } + + [Test] + public void ParseInterfaceMethod() + { + var stackframe = StackTraceLine.FromLogMessage( + "UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261)" + ); + Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler](UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor)", stackframe.Method); + Assert.AreEqual(261, stackframe.LineNumber); + Assert.AreEqual("/Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs", stackframe.File); + } + + [Test] + public void ParseGenericMethod() + { + var stackframe = StackTraceLine.FromLogMessage( + "UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1].Invoke (.T1 handler, UnityEngine.EventSystems.BaseEventData eventData)" + ); + Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1].Invoke(.T1 handler, UnityEngine.EventSystems.BaseEventData eventData)", stackframe.Method); + Assert.IsNull(stackframe.LineNumber); + Assert.IsNull(stackframe.File); + } + + [Test] + public void ParseUnknownManagedToNative() + { + var stackframe = StackTraceLine.FromLogMessage("at (wrapper managed-to-native) Program.NativeMethod(Program/StructToMarshal)"); + Assert.AreEqual("(wrapper managed-to-native) Program.NativeMethod(Program/StructToMarshal)", stackframe.Method); + + stackframe = StackTraceLine.FromLogMessage("at (wrapper scoop-de-woop) SomeClass.SomeMethod(Program / Something else)"); + Assert.AreEqual("(wrapper scoop-de-woop) SomeClass.SomeMethod(Program / Something else)", stackframe.Method); + } + + [Test] + public void ParseAndroidMethod() + { + var stackframe = StackTraceLine.FromAndroidJavaMessage("at com.example.lib.BugsnagCrash.throwJvmException(BugsnagCrash.java:14)"); + Assert.AreEqual("com.example.lib.BugsnagCrash.throwJvmException()", stackframe.Method); + Assert.AreEqual("BugsnagCrash.java", stackframe.File); + Assert.AreEqual(14, stackframe.LineNumber); + } + } +} \ No newline at end of file diff --git a/Bugsnag/Assets/Tests/StackFrameParsingTests.cs.meta b/Bugsnag/Assets/Tests/StackFrameParsingTests.cs.meta new file mode 100644 index 000000000..8d3c34fa2 --- /dev/null +++ b/Bugsnag/Assets/Tests/StackFrameParsingTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d617703387656434eb2e4af304def4b5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Bugsnag/Assets/Tests/UniqueLogCounterTests.cs b/Bugsnag/Assets/Tests/UniqueLogCounterTests.cs new file mode 100644 index 000000000..a187b4e1f --- /dev/null +++ b/Bugsnag/Assets/Tests/UniqueLogCounterTests.cs @@ -0,0 +1,51 @@ +using NUnit.Framework; +using System.Threading; +using UnityEngine; +using BugsnagUnity; + +namespace BugsnagUnityTests +{ + [TestFixture] + public class UniqueLogCounterTests + { + [Test] + public void ShouldNotSendDuplicateMessages() + { + var counter = new UniqueLogThrottle(new Configuration("foo")); + + var message1 = new UnityLogMessage("", "", LogType.Error); + var message2 = new UnityLogMessage("", "", LogType.Error); + + counter.ShouldSend(message1); + Assert.IsFalse(counter.ShouldSend(message2)); + } + + [Test] + public void SendsSingleMessage() + { + var counter = new UniqueLogThrottle(new Configuration("foo")); + + var message = new UnityLogMessage("", "", LogType.Error); + + Assert.IsTrue(counter.ShouldSend(message)); + } + + [Test] + public void FlushesCorrectly() + { + var configuration = new Configuration("foo"); + var counter = new UniqueLogThrottle(configuration); + + var message = new UnityLogMessage("", "", LogType.Error); + + counter.ShouldSend(message); + + // Sleep for the duration specified in the configuration (convert seconds to milliseconds) + Thread.Sleep(configuration.SecondsPerUniqueLog); + + message = new UnityLogMessage("", "", LogType.Error); + + Assert.IsTrue(counter.ShouldSend(message)); + } + } +} \ No newline at end of file diff --git a/Bugsnag/Assets/Tests/UniqueLogCounterTests.cs.meta b/Bugsnag/Assets/Tests/UniqueLogCounterTests.cs.meta new file mode 100644 index 000000000..50fe294fe --- /dev/null +++ b/Bugsnag/Assets/Tests/UniqueLogCounterTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e7ff4bd04f1df407c8afd81b1a38d746 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Rakefile b/Rakefile index 7ca710bfd..7f44e48e3 100644 --- a/Rakefile +++ b/Rakefile @@ -92,6 +92,10 @@ def plugins_dir File.join(project_path, "Assets", "Bugsnag/Plugins") end +def run_unit_tests + unity "-runTests", "-batchmode", "-projectPath", project_path, "-testPlatform", "EditMode", "-testResults", File.join(current_directory, "testResults.xml") , force_free: false +end + def export_package name="Bugsnag.unitypackage" package_output = File.join(current_directory, name) FileUtils.rm_rf package_output @@ -405,10 +409,8 @@ namespace :plugin do desc "Generate release artifacts" task export: ["plugin:build:clean"] do - if is_windows? - else - Rake::Task["plugin:build:native_plugins"].invoke - end + Rake::Task["plugin:build:native_plugins"].invoke unless is_windows? + run_unit_tests export_package("Bugsnag.unitypackage") end From 6f486fd7f9ef060a75550275fa9441082056a1c0 Mon Sep 17 00:00:00 2001 From: richard elms Date: Tue, 5 Nov 2024 10:54:00 +0100 Subject: [PATCH 09/46] end --- Rakefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index 7f44e48e3..0c395d7ae 100644 --- a/Rakefile +++ b/Rakefile @@ -413,7 +413,7 @@ namespace :plugin do run_unit_tests export_package("Bugsnag.unitypackage") end - +end namespace :test do namespace :android do @@ -533,4 +533,3 @@ end task build: %w[test:ios:generate_xcode test:ios:build_xcode] do end end -end From 86fbad399557f9b74e099a44de8440fa329a6151 Mon Sep 17 00:00:00 2001 From: richard elms Date: Tue, 5 Nov 2024 11:20:33 +0100 Subject: [PATCH 10/46] force import settings --- Bugsnag/Assets/Editor/ForceImportSettings.cs | 16 ++++++---------- Rakefile | 10 +++++++++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Bugsnag/Assets/Editor/ForceImportSettings.cs b/Bugsnag/Assets/Editor/ForceImportSettings.cs index 7c28694e7..04dda3a56 100644 --- a/Bugsnag/Assets/Editor/ForceImportSettings.cs +++ b/Bugsnag/Assets/Editor/ForceImportSettings.cs @@ -2,19 +2,15 @@ using UnityEditor; using UnityEngine; -[InitializeOnLoad] public class ForceImportSettings : MonoBehaviour { - static ForceImportSettings() + public static void ApplyImportSettings() { - EditorApplication.delayCall += () => - { - ApplyPluginImportSettings("Assets/Bugsnag/Plugins/iOS", new List { BuildTarget.iOS }); - ApplyPluginImportSettings("Assets/Bugsnag/Plugins/MacOS", new List { BuildTarget.StandaloneOSX }); - ApplyPluginImportSettings("Assets/Bugsnag/Plugins/tvOS", new List { BuildTarget.tvOS }); - ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Android", new List { BuildTarget.Android }); - ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Cocoa", new List { BuildTarget.iOS, BuildTarget.tvOS, BuildTarget.StandaloneOSX }); - }; + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/iOS", new List { BuildTarget.iOS }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/MacOS", new List { BuildTarget.StandaloneOSX }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/tvOS", new List { BuildTarget.tvOS }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Android", new List { BuildTarget.Android }); + ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Cocoa", new List { BuildTarget.iOS, BuildTarget.tvOS, BuildTarget.StandaloneOSX }); } private static List RelevantBuildTargets = new List { diff --git a/Rakefile b/Rakefile index 0c395d7ae..eb2332d85 100644 --- a/Rakefile +++ b/Rakefile @@ -96,6 +96,10 @@ def run_unit_tests unity "-runTests", "-batchmode", "-projectPath", project_path, "-testPlatform", "EditMode", "-testResults", File.join(current_directory, "testResults.xml") , force_free: false end +def apply_plugin_import_settings + unity "-quit", "-batchmode", "-projectPath", project_path, "-executeMethod", "ForceImportSettings.ApplyImportSettings" +end + def export_package name="Bugsnag.unitypackage" package_output = File.join(current_directory, name) FileUtils.rm_rf package_output @@ -255,7 +259,7 @@ namespace :plugin do namespace :build do cocoa_build_dir = "bugsnag-cocoa-build" - task native_plugins: [:cocoa, :android] + task native_plugins: [:cocoa, :android, :apply_plugin_settings] desc "Delete all build artifacts" task :clean do @@ -405,6 +409,10 @@ namespace :plugin do task :android do assemble_android(false) end + + task :apply_plugin_settings do + apply_plugin_import_settings + end end desc "Generate release artifacts" From ca2191efb4d62531bd64b20d9f1bb7ec6271488e Mon Sep 17 00:00:00 2001 From: richard elms Date: Tue, 5 Nov 2024 11:33:37 +0100 Subject: [PATCH 11/46] end again --- Rakefile | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/Rakefile b/Rakefile index eb2332d85..ce9513fa9 100644 --- a/Rakefile +++ b/Rakefile @@ -461,21 +461,7 @@ namespace :test do end end end -end - - namespace :edm do - task :build do - # Check that a Unity version has been selected and the path exists before calling the build script - unity_path, unity = get_required_unity_paths - - # Build the Android APK - env = { "UNITY_PATH" => File.dirname(unity) } - script = File.join("features", "scripts", "build_edm.sh") - unless system env, script - raise 'EDM APK build failed' - end - end - end + namespace :ios do task :generate_xcode do @@ -541,3 +527,4 @@ end task build: %w[test:ios:generate_xcode test:ios:build_xcode] do end end +end From 9fa7fa09f987d10554cae9bc3b850c58b0dcb126 Mon Sep 17 00:00:00 2001 From: richard elms Date: Tue, 5 Nov 2024 13:33:57 +0100 Subject: [PATCH 12/46] ios fix --- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs | 2 +- .../Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs | 2 +- .../Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs | 2 +- .../Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs index fcffbf8bf..b630b914d 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using System.Collections.Generic; using System.IO; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs index efe9f0945..6d81149ec 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs index 8e66db510..203090eee 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs index 6a283ea9c..14347efd0 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs index bc63ecb99..6b1de8bcf 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using System.Collections; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs index 53b0fcf89..4c9fcbb80 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using System.Runtime.InteropServices; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs index bc103f01a..8918ddecc 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs index 8f5e5e18a..8c958ef50 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs index 002c07f60..c2dd3f43a 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs index d944ab447..30f467ff0 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs index bbe66af31..6e652b2a1 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using System.Collections; using System.Runtime.InteropServices; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs index 68498f61e..e32f3b9d1 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; namespace BugsnagUnity { diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs index 0df946b4d..8c72fc7ae 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using System.Runtime.InteropServices; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs index 85fc6f35a..1b914fdb0 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs index ff17fb5d5..97164bb1d 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs index 8648b7abd..c61e8960e 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS || UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR using System; namespace BugsnagUnity diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs index 6441546d1..a306b6142 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs @@ -1,4 +1,4 @@ -#if UNITY_STANDALONE_OSX && !UNITY_EDITOR +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR namespace BugsnagUnity { partial class NativeCode diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs index 1ceb74c72..e06673d28 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS +#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR namespace BugsnagUnity { partial class NativeCode From a885aa60bc7b6141762652a83251ed31d5495f4b Mon Sep 17 00:00:00 2001 From: richard elms Date: Tue, 5 Nov 2024 14:37:57 +0100 Subject: [PATCH 13/46] native code --- Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs index a306b6142..9f1e5201d 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if (UNITY_STANDALONE_OSX) && !UNITY_EDITOR namespace BugsnagUnity { partial class NativeCode diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs index e06673d28..6df227962 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if (UNITY_IOS) && !UNITY_EDITOR namespace BugsnagUnity { partial class NativeCode From 875a2e650a9e41cadff3e89f350db30dff4d51e3 Mon Sep 17 00:00:00 2001 From: richard elms Date: Tue, 5 Nov 2024 15:27:14 +0100 Subject: [PATCH 14/46] compile native code with cocoa sdk --- .../Plugins/Cocoa/BugsnagUnity.mm.meta | 86 ------------------- Bugsnag/Assets/BugsnagUnity.meta | 8 -- Bugsnag/Assets/Editor/ForceImportSettings.cs | 1 - .../Cocoa/BugsnagUnity.mm | 0 Rakefile | 2 + 5 files changed, 2 insertions(+), 95 deletions(-) delete mode 100644 Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm.meta delete mode 100644 Bugsnag/Assets/BugsnagUnity.meta rename Bugsnag/{Assets/Bugsnag/Plugins => NativeSrc}/Cocoa/BugsnagUnity.mm (100%) diff --git a/Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm.meta b/Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm.meta deleted file mode 100644 index 5ad4b2bf2..000000000 --- a/Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm.meta +++ /dev/null @@ -1,86 +0,0 @@ -fileFormatVersion: 2 -guid: d85fba5776d0246faa0af00f533787b2 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - : Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 1 - Exclude Linux64: 1 - Exclude OSXUniversal: 0 - Exclude WebGL: 1 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 0 - - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: OSXUniversal - second: - enabled: 1 - settings: - CPU: AnyCPU - - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - - first: - iPhone: iOS - second: - enabled: 1 - settings: - AddToEmbeddedBinaries: false - CPU: AnyCPU - CompileFlags: - FrameworkDependencies: - - first: - tvOS: tvOS - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Bugsnag/Assets/BugsnagUnity.meta b/Bugsnag/Assets/BugsnagUnity.meta deleted file mode 100644 index 378189945..000000000 --- a/Bugsnag/Assets/BugsnagUnity.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: fd1ffc4415b604e3c8c51571578023b4 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Bugsnag/Assets/Editor/ForceImportSettings.cs b/Bugsnag/Assets/Editor/ForceImportSettings.cs index 04dda3a56..567113411 100644 --- a/Bugsnag/Assets/Editor/ForceImportSettings.cs +++ b/Bugsnag/Assets/Editor/ForceImportSettings.cs @@ -10,7 +10,6 @@ public static void ApplyImportSettings() ApplyPluginImportSettings("Assets/Bugsnag/Plugins/MacOS", new List { BuildTarget.StandaloneOSX }); ApplyPluginImportSettings("Assets/Bugsnag/Plugins/tvOS", new List { BuildTarget.tvOS }); ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Android", new List { BuildTarget.Android }); - ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Cocoa", new List { BuildTarget.iOS, BuildTarget.tvOS, BuildTarget.StandaloneOSX }); } private static List RelevantBuildTargets = new List { diff --git a/Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm b/Bugsnag/NativeSrc/Cocoa/BugsnagUnity.mm similarity index 100% rename from Bugsnag/Assets/Bugsnag/Plugins/Cocoa/BugsnagUnity.mm rename to Bugsnag/NativeSrc/Cocoa/BugsnagUnity.mm diff --git a/Rakefile b/Rakefile index ce9513fa9..025f26518 100644 --- a/Rakefile +++ b/Rakefile @@ -284,6 +284,7 @@ namespace :plugin do build_type = "Release" # "Debug" or "Release" FileUtils.mkdir_p cocoa_build_dir FileUtils.cp_r "bugsnag-cocoa/Bugsnag", cocoa_build_dir + bugsnag_unity_native_cocoa_file = File.realpath("BugsnagUnity.mm", "Bugsnag/NativeSrc/Cocoa") public_headers = Dir.entries(File.join(cocoa_build_dir, "Bugsnag", "include", "Bugsnag")) Dir.chdir cocoa_build_dir do @@ -323,6 +324,7 @@ namespace :plugin do source_files = Dir.glob(File.join("Bugsnag", "**", "*.{c,h,mm,cpp,m}")) .map(&File.method(:realpath)) + .tap { |files| files << bugsnag_unity_native_cocoa_file } .map { |f| group.new_file(f) } target.add_file_references(source_files) do |build_file| From 9d49a74849f3b028b915fda50ead7be4c82fc1e5 Mon Sep 17 00:00:00 2001 From: richard elms Date: Tue, 5 Nov 2024 16:57:58 +0100 Subject: [PATCH 15/46] webgl fix --- Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs index dc95ecead..37426224c 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs @@ -1,4 +1,4 @@ -#if UNITY_EDITOR || UNITY_STANDALONE_WIN +#if UNITY_EDITOR || UNITY_STANDALONE_WIN || UNITY_WEBGL using System.Collections.Generic; using System.Linq; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs index c90957861..fb02f3a97 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs @@ -1,4 +1,4 @@ -#if UNITY_EDITOR +#if UNITY_EDITOR || UNITY_WEBGL using BugsnagUnity.Payload; using System; using System.Collections.Generic; From 1c29a9888a594a3e6d1d3f32b908d7db53c8d0fb Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 08:17:33 +0100 Subject: [PATCH 16/46] skip macos while it's fixed in next --- .buildkite/unity.2021.full.yml | 80 +++++++++---------- .buildkite/unity.2022.yml | 36 ++++----- .buildkite/unity.2023.yml | 40 +++++----- .../Scripts/Native/MacOS/NativeCode.cs | 2 +- .../Bugsnag/Scripts/Native/iOS/NativeCode.cs | 2 +- 5 files changed, 80 insertions(+), 80 deletions(-) diff --git a/.buildkite/unity.2021.full.yml b/.buildkite/unity.2021.full.yml index 454327f6a..035b6fa68 100644 --- a/.buildkite/unity.2021.full.yml +++ b/.buildkite/unity.2021.full.yml @@ -268,47 +268,47 @@ steps: concurrency_group: "bitbar" concurrency_method: eager - - label: Run MacOS e2e tests for Unity 2021 - timeout_in_minutes: 60 - depends_on: 'macos-2021-fixture' - agents: - queue: macos-12-arm-unity - env: - UNITY_VERSION: *2021 - plugins: - artifacts#v1.9.0: - download: - - features/fixtures/maze_runner/build/MacOS-release-2021.zip - upload: - - maze_output/**/* - - Mazerunner.log - test-collector#v1.10.2: - files: "reports/TEST-*.xml" - format: "junit" - branch: "^master|next$$" - commands: - - scripts/ci-run-macos-tests.sh release + # - label: Run MacOS e2e tests for Unity 2021 + # timeout_in_minutes: 60 + # depends_on: 'macos-2021-fixture' + # agents: + # queue: macos-12-arm-unity + # env: + # UNITY_VERSION: *2021 + # plugins: + # artifacts#v1.9.0: + # download: + # - features/fixtures/maze_runner/build/MacOS-release-2021.zip + # upload: + # - maze_output/**/* + # - Mazerunner.log + # test-collector#v1.10.2: + # files: "reports/TEST-*.xml" + # format: "junit" + # branch: "^master|next$$" + # commands: + # - scripts/ci-run-macos-tests.sh release - - label: Run MacOS e2e DEV tests for Unity 2021 - timeout_in_minutes: 60 - depends_on: 'macos-2021-dev-fixture' - agents: - queue: macos-12-arm-unity - env: - UNITY_VERSION: *2021 - plugins: - artifacts#v1.9.0: - download: - - features/fixtures/maze_runner/build/MacOS-dev-2021.zip - upload: - - maze_output/**/* - - Mazerunner.log - test-collector#v1.10.2: - files: "reports/TEST-*.xml" - format: "junit" - branch: "^master|next$$" - commands: - - scripts/ci-run-macos-tests.sh dev + # - label: Run MacOS e2e DEV tests for Unity 2021 + # timeout_in_minutes: 60 + # depends_on: 'macos-2021-dev-fixture' + # agents: + # queue: macos-12-arm-unity + # env: + # UNITY_VERSION: *2021 + # plugins: + # artifacts#v1.9.0: + # download: + # - features/fixtures/maze_runner/build/MacOS-dev-2021.zip + # upload: + # - maze_output/**/* + # - Mazerunner.log + # test-collector#v1.10.2: + # files: "reports/TEST-*.xml" + # format: "junit" + # branch: "^master|next$$" + # commands: + # - scripts/ci-run-macos-tests.sh dev - label: Run WebGL e2e tests for Unity 2021 timeout_in_minutes: 30 diff --git a/.buildkite/unity.2022.yml b/.buildkite/unity.2022.yml index 9306af91b..42de6b04f 100644 --- a/.buildkite/unity.2022.yml +++ b/.buildkite/unity.2022.yml @@ -206,24 +206,24 @@ steps: concurrency_group: "bitbar" concurrency_method: eager - - label: Run MacOS e2e tests for Unity 2022 - timeout_in_minutes: 60 - depends_on: 'macos-2022-fixture' - env: - UNITY_VERSION: *2022 - plugins: - artifacts#v1.9.0: - download: - - features/fixtures/maze_runner/build/MacOS-release-2022.zip - upload: - - maze_output/**/* - - '*-mazerunner.log' - test-collector#v1.10.2: - files: "reports/TEST-*.xml" - format: "junit" - branch: "^master|next$$" - commands: - - scripts/ci-run-macos-tests.sh release + # - label: Run MacOS e2e tests for Unity 2022 + # timeout_in_minutes: 60 + # depends_on: 'macos-2022-fixture' + # env: + # UNITY_VERSION: *2022 + # plugins: + # artifacts#v1.9.0: + # download: + # - features/fixtures/maze_runner/build/MacOS-release-2022.zip + # upload: + # - maze_output/**/* + # - '*-mazerunner.log' + # test-collector#v1.10.2: + # files: "reports/TEST-*.xml" + # format: "junit" + # branch: "^master|next$$" + # commands: + # - scripts/ci-run-macos-tests.sh release - label: Run WebGL e2e tests for Unity 2022 timeout_in_minutes: 30 diff --git a/.buildkite/unity.2023.yml b/.buildkite/unity.2023.yml index 14d13c23a..7b2c760d2 100644 --- a/.buildkite/unity.2023.yml +++ b/.buildkite/unity.2023.yml @@ -207,26 +207,26 @@ steps: concurrency_group: "bitbar" concurrency_method: eager - - label: Run MacOS e2e tests for Unity 2023 - timeout_in_minutes: 60 - depends_on: 'macos-2023-fixture' - agents: - queue: macos-12-arm - env: - UNITY_VERSION: *2023 - plugins: - artifacts#v1.9.0: - download: - - features/fixtures/maze_runner/build/MacOS-release-2023.zip - upload: - - maze_output/**/* - - '*-mazerunner.log' - test-collector#v1.10.2: - files: "reports/TEST-*.xml" - format: "junit" - branch: "^master|next$$" - commands: - - scripts/ci-run-macos-tests.sh release + # - label: Run MacOS e2e tests for Unity 2023 + # timeout_in_minutes: 60 + # depends_on: 'macos-2023-fixture' + # agents: + # queue: macos-12-arm + # env: + # UNITY_VERSION: *2023 + # plugins: + # artifacts#v1.9.0: + # download: + # - features/fixtures/maze_runner/build/MacOS-release-2023.zip + # upload: + # - maze_output/**/* + # - '*-mazerunner.log' + # test-collector#v1.10.2: + # files: "reports/TEST-*.xml" + # format: "junit" + # branch: "^master|next$$" + # commands: + # - scripts/ci-run-macos-tests.sh release - label: Run WebGL e2e tests for Unity 2023 timeout_in_minutes: 30 diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs index 9f1e5201d..6441546d1 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs @@ -1,4 +1,4 @@ -#if (UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if UNITY_STANDALONE_OSX && !UNITY_EDITOR namespace BugsnagUnity { partial class NativeCode diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs index 6df227962..954f70ede 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS) && !UNITY_EDITOR +#if UNITY_IOS && !UNITY_EDITOR namespace BugsnagUnity { partial class NativeCode From 5980a5f0870b509f84d5ad2036b3fcd50fef961e Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 09:00:57 +0100 Subject: [PATCH 17/46] allow in editor editing --- Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs | 2 +- .../Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs | 2 +- .../Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs | 2 +- .../Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs | 2 +- .../Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs | 2 +- .../Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs | 2 +- .../Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs | 2 +- .../Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs | 2 +- .../Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs | 2 +- .../Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs | 2 +- Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs | 2 +- 35 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs index a1f26b250..21e9fdc4e 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs index 1ea0fb80a..caaaf3a32 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs index 5366d9bd3..aaf01d31e 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs index 315132989..82b0dd209 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System; using System.Collections.Generic; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs index 53768a0f0..6d5304a0c 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System.Collections.Generic; using BugsnagUnity.Payload; using UnityEngine; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs index d4bb9c072..42cd33cf3 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System; using System.Collections.Generic; using UnityEngine; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs index 204c7e509..e58553d9a 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System; using BugsnagUnity.Payload; using UnityEngine; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs index bd82ffefd..6084d7cd0 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System; using System.Collections.Generic; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs index 692aaa9c4..36f4a7744 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System; using System.Collections.Generic; using System.Collections.ObjectModel; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs index d351aaf88..62f9b1070 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System; using System.Collections; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs index 834166860..a0e8c2077 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs index 5c73101c5..a85be7b7e 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs index 9529bf027..bc65b2051 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using BugsnagUnity.Payload; using UnityEngine; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs index 13fc4f1df..8414605ba 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using System.Collections.Generic; using BugsnagUnity.Payload; using UnityEngine; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs index cab59290d..6d59ff7c9 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs @@ -1,4 +1,4 @@ -#if UNITY_ANDROID && !UNITY_EDITOR +#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV using UnityEngine; namespace BugsnagUnity diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs index b630b914d..aee7bcdb5 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using System.Collections.Generic; using System.IO; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs index 6d81149ec..79e565977 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs index 203090eee..927bf8d47 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs index 14347efd0..8da99e306 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs index 6b1de8bcf..db17374e4 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using System.Collections; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs index 4c9fcbb80..783667a75 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using System.Runtime.InteropServices; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs index 8918ddecc..a4d8cb230 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs index 8c958ef50..b1d10e9a5 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs index c2dd3f43a..66811dd75 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs index 30f467ff0..ddaee4933 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs index 6e652b2a1..833536cf5 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using System.Collections; using System.Runtime.InteropServices; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs index e32f3b9d1..5e15e1adb 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; namespace BugsnagUnity { diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs index 8c72fc7ae..f20769178 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using System.Runtime.InteropServices; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs index 1b914fdb0..29c938014 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs index 97164bb1d..896e0a1b6 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs index c61e8960e..da0741d55 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV using System; namespace BugsnagUnity diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs index 37426224c..a71cd9ae0 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs @@ -1,4 +1,4 @@ -#if UNITY_EDITOR || UNITY_STANDALONE_WIN || UNITY_WEBGL +#if (UNITY_EDITOR || UNITY_STANDALONE_WIN || UNITY_WEBGL) && !(BGS_COCOA_DEV || BGS_ANDROID_DEV || BGS_WIN_DEV) using System.Collections.Generic; using System.Linq; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs index fb02f3a97..887d85184 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs @@ -1,4 +1,4 @@ -#if UNITY_EDITOR || UNITY_WEBGL +#if (UNITY_EDITOR || UNITY_WEBGL) && !(BGS_COCOA_DEV || BGS_ANDROID_DEV || BGS_WIN_DEV) using BugsnagUnity.Payload; using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs index 013a342e2..80976d26a 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs @@ -1,4 +1,4 @@ -#if UNITY_STANDALONE_WIN && !UNITY_EDITOR +#if (UNITY_STANDALONE_WIN && !UNITY_EDITOR) || BGS_WIN_DEV using System; using System.Collections.Generic; using System.Runtime.InteropServices; diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs index 954f70ede..6d06929fe 100644 --- a/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs +++ b/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs @@ -1,4 +1,4 @@ -#if UNITY_IOS && !UNITY_EDITOR +#if (UNITY_IOS && !UNITY_EDITOR) || BGS_COCOA_DEV namespace BugsnagUnity { partial class NativeCode From 94bd21a5223c2680c1a5bb8079ddbce9f935f429 Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 10:13:54 +0100 Subject: [PATCH 18/46] prep for upm --- .gitignore | 13 + .../Bugsnag/Editor}/BugsnagEditor.asmdef | 12 +- .../Bugsnag/Editor}/BugsnagEditor.asmdef.meta | 2 +- Bugsnag/Assets/Bugsnag/Plugins/Cocoa.meta | 8 - .../Bugsnag/{Scripts.meta => Runtime.meta} | 0 .../AutomaticDataCollector.cs | 0 .../AutomaticDataCollector.cs.meta | 0 .../{Scripts => Runtime}/BlockingQueue.cs | 0 .../BlockingQueue.cs.meta | 0 .../Bugsnag/{Scripts => Runtime}/Bugsnag.cs | 0 .../{Scripts => Runtime}/Bugsnag.cs.meta | 0 .../{Scripts => Runtime}/BugsnagAutoInit.cs | 0 .../BugsnagAutoInit.cs.meta | 0 .../BugsnagSettingsObject.cs | 0 .../BugsnagSettingsObject.cs.meta | 0 .../{Scripts => Runtime}/BugsnagUnity.asmdef | 0 .../BugsnagUnity.asmdef.meta | 0 .../BugsnagUnityWebRequest.meta | 0 .../BugsnagUnityWebRequest.cs | 0 .../BugsnagUnityWebRequest.cs.meta | 0 .../BugsnagUnityWebRequest/README.md | 0 .../BugsnagUnityWebRequest/README.md.meta | 0 .../Bugsnag/{Scripts => Runtime}/Client.cs | 0 .../{Scripts => Runtime}/Client.cs.meta | 0 .../{Scripts => Runtime}/Configuration.cs | 0 .../Configuration.cs.meta | 0 .../Bugsnag/{Scripts => Runtime}/Delivery.cs | 0 .../{Scripts => Runtime}/Delivery.cs.meta | 0 .../EndpointConfiguration.cs | 0 .../EndpointConfiguration.cs.meta | 0 .../{Scripts => Runtime}/IBreadcrumbs.cs | 0 .../{Scripts => Runtime}/IBreadcrumbs.cs.meta | 0 .../{Scripts => Runtime}/ICacheManager.cs | 0 .../ICacheManager.cs.meta | 0 .../Bugsnag/{Scripts => Runtime}/IClient.cs | 0 .../{Scripts => Runtime}/IClient.cs.meta | 0 .../{Scripts => Runtime}/IFeatureFlagStore.cs | 0 .../IFeatureFlagStore.cs.meta | 0 .../{Scripts => Runtime}/IFilterable.cs | 0 .../{Scripts => Runtime}/IFilterable.cs.meta | 0 .../{Scripts => Runtime}/IMetadataEditor.cs | 0 .../IMetadataEditor.cs.meta | 0 .../{Scripts => Runtime}/INativeClient.cs | 0 .../INativeClient.cs.meta | 0 .../{Scripts => Runtime}/IUserEditor.cs | 0 .../{Scripts => Runtime}/IUserEditor.cs.meta | 0 .../{Scripts => Runtime}/LastRunInfo.cs | 0 .../{Scripts => Runtime}/LastRunInfo.cs.meta | 0 .../LogTypeSeverityMapping.cs | 0 .../LogTypeSeverityMapping.cs.meta | 0 .../MainThreadDispatchBehaviour.cs | 0 .../MainThreadDispatchBehaviour.cs.meta | 0 .../MaximumLogTypeCounter.cs | 0 .../MaximumLogTypeCounter.cs.meta | 0 .../Bugsnag/{Scripts => Runtime}/Native.meta | 0 .../{Scripts => Runtime}/Native/Android.meta | 0 .../Native/Android/Breadcrumbs.cs | 0 .../Native/Android/Breadcrumbs.cs.meta | 0 .../Native/Android/NativeApp.cs | 0 .../Native/Android/NativeApp.cs.meta | 0 .../Native/Android/NativeAppWithState.cs | 0 .../Native/Android/NativeAppWithState.cs.meta | 0 .../Native/Android/NativeBreadcrumb.cs | 0 .../Native/Android/NativeBreadcrumb.cs.meta | 0 .../Native/Android/NativeClient.cs | 0 .../Native/Android/NativeClient.cs.meta | 0 .../Native/Android/NativeDevice.cs | 0 .../Native/Android/NativeDevice.cs.meta | 0 .../Native/Android/NativeDeviceWithState.cs | 0 .../Android/NativeDeviceWithState.cs.meta | 0 .../Native/Android/NativeError.cs | 0 .../Native/Android/NativeError.cs.meta | 0 .../Native/Android/NativeEvent.cs | 0 .../Native/Android/NativeEvent.cs.meta | 0 .../Native/Android/NativeInterface.cs | 0 .../Native/Android/NativeInterface.cs.meta | 0 .../Android/NativePayloadClassWrapper.cs | 0 .../Android/NativePayloadClassWrapper.cs.meta | 0 .../Native/Android/NativeSession.cs | 0 .../Native/Android/NativeSession.cs.meta | 0 .../Native/Android/NativeStackFrame.cs | 0 .../Native/Android/NativeStackFrame.cs.meta | 0 .../Native/Android/NativeThread.cs | 0 .../Native/Android/NativeThread.cs.meta | 0 .../Native/Android/NativeUser.cs | 0 .../Native/Android/NativeUser.cs.meta | 0 .../{Scripts => Runtime}/Native/Cocoa.meta | 0 .../Native/Cocoa/Breadcrumbs.cs | 0 .../Native/Cocoa/Breadcrumbs.cs.meta | 0 .../Native/Cocoa/NativeApp.cs | 0 .../Native/Cocoa/NativeApp.cs.meta | 0 .../Native/Cocoa/NativeAppWithState.cs | 0 .../Native/Cocoa/NativeAppWithState.cs.meta | 0 .../Native/Cocoa/NativeBreadcrumb.cs | 0 .../Native/Cocoa/NativeBreadcrumb.cs.meta | 0 .../Native/Cocoa/NativeClient.cs | 0 .../Native/Cocoa/NativeClient.cs.meta | 0 .../Native/Cocoa/NativeCode.cs | 0 .../Native/Cocoa/NativeCode.cs.meta | 0 .../Native/Cocoa/NativeDevice.cs | 0 .../Native/Cocoa/NativeDevice.cs.meta | 0 .../Native/Cocoa/NativeDeviceWithState.cs | 0 .../Cocoa/NativeDeviceWithState.cs.meta | 0 .../Native/Cocoa/NativeError.cs | 0 .../Native/Cocoa/NativeError.cs.meta | 0 .../Native/Cocoa/NativeEvent.cs | 0 .../Native/Cocoa/NativeEvent.cs.meta | 0 .../Native/Cocoa/NativeImage.cs | 0 .../Native/Cocoa/NativeImage.cs.meta | 0 .../Native/Cocoa/NativePayloadClassWrapper.cs | 0 .../Cocoa/NativePayloadClassWrapper.cs.meta | 0 .../Native/Cocoa/NativeSession.cs | 0 .../Native/Cocoa/NativeSession.cs.meta | 0 .../Native/Cocoa/NativeStackFrame.cs | 0 .../Native/Cocoa/NativeStackFrame.cs.meta | 0 .../Native/Cocoa/NativeThread.cs | 0 .../Native/Cocoa/NativeThread.cs.meta | 0 .../Native/Cocoa/NativeUser.cs | 0 .../Native/Cocoa/NativeUser.cs.meta | 0 .../{Scripts => Runtime}/Native/Fallback.meta | 0 .../Native/Fallback/Breadcrumbs.cs | 0 .../Native/Fallback/Breadcrumbs.cs.meta | 0 .../Native/Fallback/CacheManager.cs | 0 .../Native/Fallback/CacheManager.cs.meta | 0 .../Native/Fallback/NativeClient.cs | 0 .../Native/Fallback/NativeClient.cs.meta | 0 .../{Scripts => Runtime}/Native/MacOS.meta | 0 .../Native/MacOS/NativeCode.cs | 0 .../Native/MacOS/NativeCode.cs.meta | 0 .../{Scripts => Runtime}/Native/Windows.meta | 0 .../Native/Windows/NativeClient.cs | 0 .../Native/Windows/NativeClient.cs.meta | 0 .../{Scripts => Runtime}/Native/iOS.meta | 0 .../Native/iOS/NativeCode.cs | 0 .../Native/iOS/NativeCode.cs.meta | 0 .../Bugsnag/{Scripts => Runtime}/Payload.meta | 0 .../{Scripts => Runtime}/Payload/App.cs | 0 .../{Scripts => Runtime}/Payload/App.cs.meta | 0 .../Payload/AppWithState.cs | 0 .../Payload/AppWithState.cs.meta | 0 .../Payload/Breadcrumb.cs | 0 .../Payload/Breadcrumb.cs.meta | 0 .../Payload/BreadcrumbType.cs | 0 .../Payload/BreadcrumbType.cs.meta | 0 .../Payload/Correlation.cs | 0 .../Payload/Correlation.cs.meta | 0 .../{Scripts => Runtime}/Payload/Device.cs | 0 .../Payload/Device.cs.meta | 0 .../Payload/DeviceWithState.cs | 0 .../Payload/DeviceWithState.cs.meta | 0 .../{Scripts => Runtime}/Payload/Error.cs | 0 .../Payload/Error.cs.meta | 0 .../{Scripts => Runtime}/Payload/Event.cs | 0 .../Payload/Event.cs.meta | 0 .../Payload/FeatureFlag.cs | 0 .../Payload/FeatureFlag.cs.meta | 0 .../Payload/HandledState.cs | 0 .../Payload/HandledState.cs.meta | 0 .../{Scripts => Runtime}/Payload/IApp.cs | 0 .../{Scripts => Runtime}/Payload/IApp.cs.meta | 0 .../Payload/IAppWithState.cs | 0 .../Payload/IAppWithState.cs.meta | 0 .../Payload/IBreadcrumb.cs | 0 .../Payload/IBreadcrumb.cs.meta | 0 .../{Scripts => Runtime}/Payload/IDevice.cs | 0 .../Payload/IDevice.cs.meta | 0 .../Payload/IDeviceWithState.cs | 0 .../Payload/IDeviceWithState.cs.meta | 0 .../{Scripts => Runtime}/Payload/IError.cs | 0 .../Payload/IError.cs.meta | 0 .../{Scripts => Runtime}/Payload/IEvent.cs | 0 .../Payload/IEvent.cs.meta | 0 .../{Scripts => Runtime}/Payload/IPayload.cs | 0 .../Payload/IPayload.cs.meta | 0 .../{Scripts => Runtime}/Payload/ISession.cs | 0 .../Payload/ISession.cs.meta | 0 .../Payload/IStackframe.cs | 0 .../Payload/IStackframe.cs.meta | 0 .../{Scripts => Runtime}/Payload/IThread.cs | 0 .../Payload/IThread.cs.meta | 0 .../{Scripts => Runtime}/Payload/IUser.cs | 0 .../Payload/IUser.cs.meta | 0 .../{Scripts => Runtime}/Payload/Metadata.cs | 0 .../Payload/Metadata.cs.meta | 0 .../{Scripts => Runtime}/Payload/Method.cs | 0 .../Payload/Method.cs.meta | 0 .../Payload/MethodParameter.cs | 0 .../Payload/MethodParameter.cs.meta | 0 .../Payload/NotifierInfo.cs | 0 .../Payload/NotifierInfo.cs.meta | 0 .../Payload/PayloadContainer.cs | 0 .../Payload/PayloadContainer.cs.meta | 0 .../Payload/PayloadExtensions.cs | 0 .../Payload/PayloadExtensions.cs.meta | 0 .../{Scripts => Runtime}/Payload/Report.cs | 0 .../Payload/Report.cs.meta | 0 .../{Scripts => Runtime}/Payload/Session.cs | 0 .../Payload/Session.cs.meta | 0 .../Payload/SessionReport.cs | 0 .../Payload/SessionReport.cs.meta | 0 .../Payload/StackTraceLine.cs | 0 .../Payload/StackTraceLine.cs.meta | 0 .../{Scripts => Runtime}/Payload/User.cs | 0 .../{Scripts => Runtime}/Payload/User.cs.meta | 0 .../{Scripts => Runtime}/PayloadManager.cs | 0 .../PayloadManager.cs.meta | 0 .../{Scripts => Runtime}/PerformanceHelper.cs | 0 .../PerformanceHelper.cs.meta | 0 .../Bugsnag/{Scripts => Runtime}/Polyfills.cs | 0 .../{Scripts => Runtime}/Polyfills.cs.meta | 0 .../{Scripts => Runtime}/PostProcessBuild.cs | 0 .../PostProcessBuild.cs.meta | 0 .../{Scripts => Runtime}/SessionTracker.cs | 0 .../SessionTracker.cs.meta | 0 .../Bugsnag/{Scripts => Runtime}/Severity.cs | 0 .../{Scripts => Runtime}/Severity.cs.meta | 0 .../{Scripts => Runtime}/SimpleJson.cs | 0 .../{Scripts => Runtime}/SimpleJson.cs.meta | 0 .../{Scripts => Runtime}/TelemetryType.cs | 0 .../TelemetryType.cs.meta | 0 .../{Scripts => Runtime}/ThreadSendPolicy.cs | 0 .../ThreadSendPolicy.cs.meta | 0 .../Bugsnag/{Scripts => Runtime}/Time.cs | 0 .../Bugsnag/{Scripts => Runtime}/Time.cs.meta | 0 .../TimingTrackerBehaviour.cs | 0 .../TimingTrackerBehaviour.cs.meta | 0 .../{Scripts => Runtime}/TypeNameHelper.cs | 0 .../TypeNameHelper.cs.meta | 0 .../{Scripts => Runtime}/UniqueLogThrottle.cs | 0 .../UniqueLogThrottle.cs.meta | 0 .../{Scripts => Runtime}/UnityLogMessage.cs | 0 .../UnityLogMessage.cs.meta | 0 .../BugsnagUnity.Tests.csproj | 19 - .../BugsnagUnity.Tests/ConfigurationTests.cs | 205 --- tests/BugsnagUnity.Tests/ExceptionTests.cs | 158 -- .../MaximumLogTypeCounterTests.cs | 120 -- tests/BugsnagUnity.Tests/OverloadCheck.cs | 33 - .../PostProcessBuildTests.cs | 28 - .../ProjectFixtures/test_one_input.pbxproj | 1411 ----------------- .../ProjectFixtures/test_one_output.pbxproj | 1411 ----------------- .../ProjectFixtures/test_three_input.pbxproj | 1411 ----------------- .../ProjectFixtures/test_three_output.pbxproj | 1411 ----------------- .../ProjectFixtures/test_two_input.pbxproj | 1411 ----------------- .../ProjectFixtures/test_two_output.pbxproj | 1411 ----------------- .../BugsnagUnity.Tests/SessionTrackerTests.cs | 103 -- .../StackFrameParsingTests.cs | 126 -- .../UniqueLogCounterTests.cs | 49 - tests/SceneManager.cs | 12 - tests/UnityEngine/AndroidJavaClass.cs | 15 - tests/UnityEngine/AndroidJavaObject.cs | 15 - tests/UnityEngine/Application.cs | 63 - tests/UnityEngine/AsyncOperation.cs | 17 - tests/UnityEngine/BatteryStatus.cs | 7 - tests/UnityEngine/Debug.cs | 15 - tests/UnityEngine/DownloadHandler.cs | 16 - tests/UnityEngine/GameObject.cs | 14 - tests/UnityEngine/JsonUtility.cs | 19 - tests/UnityEngine/LoadSceneMode.cs | 17 - tests/UnityEngine/LogType.cs | 30 - tests/UnityEngine/MonoBehaviour.cs | 11 - tests/UnityEngine/Object.cs | 15 - tests/UnityEngine/PlayerPrefs.cs | 20 - tests/UnityEngine/Resolution.cs | 24 - tests/UnityEngine/RuntimePlatform.cs | 6 - tests/UnityEngine/Scene.cs | 12 - tests/UnityEngine/SceneManager.cs | 15 - tests/UnityEngine/Screen.cs | 13 - tests/UnityEngine/SystemInfo.cs | 21 - tests/UnityEngine/SystemLanguage.cs | 11 - tests/UnityEngine/Time.cs | 9 - tests/UnityEngine/UnityAction.cs | 20 - tests/UnityEngine/UnityEngine.csproj | 8 - tests/UnityEngine/UnityWebRequest.cs | 53 - tests/UnityEngine/UploadHandler.cs | 22 - tests/UnityEngine/WaitForSeconds.cs | 10 - upm-tools/AssemblyDefinitions/Bugsnag.asmdef | 3 - .../AssemblyDefinitions/Bugsnag.asmdef.meta | 7 - .../EDM/BugsnagAndroidDependencies.xml | 0 .../EDM/BugsnagAndroidDependencies.xml.meta | 0 {upm-tools => upm}/README.md | 0 {upm-tools => upm}/README.md.meta | 0 .../UPMImportProject/Assets/Scenes.meta | 0 .../Assets/Scenes/SampleScene.unity | 0 .../Assets/Scenes/SampleScene.unity.meta | 0 .../UPMImportProject/Packages/manifest.json | 0 .../ProjectSettings/AudioManager.asset | 0 .../ProjectSettings/ClusterInputManager.asset | 0 .../ProjectSettings/DynamicsManager.asset | 0 .../ProjectSettings/EditorBuildSettings.asset | 0 .../ProjectSettings/EditorSettings.asset | 0 .../ProjectSettings/GraphicsSettings.asset | 0 .../ProjectSettings/InputManager.asset | 0 .../ProjectSettings/NavMeshAreas.asset | 0 .../ProjectSettings/NetworkManager.asset | 0 .../ProjectSettings/Physics2DSettings.asset | 0 .../ProjectSettings/PresetManager.asset | 0 .../ProjectSettings/ProjectSettings.asset | 0 .../ProjectSettings/ProjectVersion.txt | 0 .../ProjectSettings/QualitySettings.asset | 0 .../ProjectSettings/TagManager.asset | 0 .../ProjectSettings/TimeManager.asset | 0 .../UnityConnectSettings.asset | 0 .../ProjectSettings/VFXManager.asset | 0 {upm-tools => upm}/build-edm-package.sh | 0 {upm-tools => upm}/build-upm-package.sh | 7 +- {upm-tools => upm}/package.json | 0 {upm-tools => upm}/package.json.meta | 0 307 files changed, 21 insertions(+), 9848 deletions(-) rename {upm-tools/AssemblyDefinitions => Bugsnag/Assets/Bugsnag/Editor}/BugsnagEditor.asmdef (52%) rename {upm-tools/AssemblyDefinitions => Bugsnag/Assets/Bugsnag/Editor}/BugsnagEditor.asmdef.meta (76%) delete mode 100644 Bugsnag/Assets/Bugsnag/Plugins/Cocoa.meta rename Bugsnag/Assets/Bugsnag/{Scripts.meta => Runtime.meta} (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/AutomaticDataCollector.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/AutomaticDataCollector.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BlockingQueue.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BlockingQueue.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Bugsnag.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Bugsnag.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BugsnagAutoInit.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BugsnagAutoInit.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BugsnagSettingsObject.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BugsnagSettingsObject.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BugsnagUnity.asmdef (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BugsnagUnity.asmdef.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BugsnagUnityWebRequest.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BugsnagUnityWebRequest/README.md (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/BugsnagUnityWebRequest/README.md.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Client.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Client.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Configuration.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Configuration.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Delivery.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Delivery.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/EndpointConfiguration.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/EndpointConfiguration.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IBreadcrumbs.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IBreadcrumbs.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/ICacheManager.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/ICacheManager.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IClient.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IClient.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IFeatureFlagStore.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IFeatureFlagStore.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IFilterable.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IFilterable.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IMetadataEditor.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IMetadataEditor.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/INativeClient.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/INativeClient.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IUserEditor.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/IUserEditor.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/LastRunInfo.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/LastRunInfo.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/LogTypeSeverityMapping.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/LogTypeSeverityMapping.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/MainThreadDispatchBehaviour.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/MainThreadDispatchBehaviour.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/MaximumLogTypeCounter.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/MaximumLogTypeCounter.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/Breadcrumbs.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/Breadcrumbs.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeApp.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeApp.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeAppWithState.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeAppWithState.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeBreadcrumb.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeBreadcrumb.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeClient.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeClient.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeDevice.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeDevice.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeDeviceWithState.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeDeviceWithState.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeError.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeError.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeEvent.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeEvent.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeInterface.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeInterface.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativePayloadClassWrapper.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativePayloadClassWrapper.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeSession.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeSession.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeStackFrame.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeStackFrame.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeThread.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeThread.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeUser.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Android/NativeUser.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/Breadcrumbs.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/Breadcrumbs.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeApp.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeApp.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeAppWithState.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeAppWithState.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeBreadcrumb.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeBreadcrumb.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeClient.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeClient.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeCode.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeCode.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeDevice.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeDevice.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeDeviceWithState.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeDeviceWithState.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeError.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeError.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeEvent.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeEvent.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeImage.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeImage.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativePayloadClassWrapper.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativePayloadClassWrapper.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeSession.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeSession.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeStackFrame.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeStackFrame.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeThread.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeThread.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeUser.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Cocoa/NativeUser.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Fallback.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Fallback/Breadcrumbs.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Fallback/Breadcrumbs.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Fallback/CacheManager.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Fallback/CacheManager.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Fallback/NativeClient.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Fallback/NativeClient.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/MacOS.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/MacOS/NativeCode.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/MacOS/NativeCode.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Windows.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Windows/NativeClient.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/Windows/NativeClient.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/iOS.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/iOS/NativeCode.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Native/iOS/NativeCode.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/App.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/App.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/AppWithState.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/AppWithState.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Breadcrumb.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Breadcrumb.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/BreadcrumbType.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/BreadcrumbType.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Correlation.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Correlation.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Device.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Device.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/DeviceWithState.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/DeviceWithState.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Error.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Error.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Event.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Event.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/FeatureFlag.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/FeatureFlag.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/HandledState.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/HandledState.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IApp.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IApp.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IAppWithState.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IAppWithState.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IBreadcrumb.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IBreadcrumb.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IDevice.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IDevice.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IDeviceWithState.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IDeviceWithState.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IError.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IError.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IEvent.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IEvent.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IPayload.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IPayload.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/ISession.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/ISession.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IStackframe.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IStackframe.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IThread.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IThread.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IUser.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/IUser.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Metadata.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Metadata.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Method.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Method.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/MethodParameter.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/MethodParameter.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/NotifierInfo.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/NotifierInfo.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/PayloadContainer.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/PayloadContainer.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/PayloadExtensions.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/PayloadExtensions.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Report.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Report.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Session.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/Session.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/SessionReport.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/SessionReport.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/StackTraceLine.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/StackTraceLine.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/User.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Payload/User.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/PayloadManager.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/PayloadManager.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/PerformanceHelper.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/PerformanceHelper.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Polyfills.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Polyfills.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/PostProcessBuild.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/PostProcessBuild.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/SessionTracker.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/SessionTracker.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Severity.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Severity.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/SimpleJson.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/SimpleJson.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/TelemetryType.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/TelemetryType.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/ThreadSendPolicy.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/ThreadSendPolicy.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Time.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/Time.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/TimingTrackerBehaviour.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/TimingTrackerBehaviour.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/TypeNameHelper.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/TypeNameHelper.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/UniqueLogThrottle.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/UniqueLogThrottle.cs.meta (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/UnityLogMessage.cs (100%) rename Bugsnag/Assets/Bugsnag/{Scripts => Runtime}/UnityLogMessage.cs.meta (100%) delete mode 100644 tests/BugsnagUnity.Tests/BugsnagUnity.Tests.csproj delete mode 100644 tests/BugsnagUnity.Tests/ConfigurationTests.cs delete mode 100644 tests/BugsnagUnity.Tests/ExceptionTests.cs delete mode 100644 tests/BugsnagUnity.Tests/MaximumLogTypeCounterTests.cs delete mode 100644 tests/BugsnagUnity.Tests/OverloadCheck.cs delete mode 100644 tests/BugsnagUnity.Tests/PostProcessBuildTests.cs delete mode 100644 tests/BugsnagUnity.Tests/ProjectFixtures/test_one_input.pbxproj delete mode 100644 tests/BugsnagUnity.Tests/ProjectFixtures/test_one_output.pbxproj delete mode 100644 tests/BugsnagUnity.Tests/ProjectFixtures/test_three_input.pbxproj delete mode 100644 tests/BugsnagUnity.Tests/ProjectFixtures/test_three_output.pbxproj delete mode 100644 tests/BugsnagUnity.Tests/ProjectFixtures/test_two_input.pbxproj delete mode 100644 tests/BugsnagUnity.Tests/ProjectFixtures/test_two_output.pbxproj delete mode 100644 tests/BugsnagUnity.Tests/SessionTrackerTests.cs delete mode 100644 tests/BugsnagUnity.Tests/StackFrameParsingTests.cs delete mode 100644 tests/BugsnagUnity.Tests/UniqueLogCounterTests.cs delete mode 100644 tests/SceneManager.cs delete mode 100644 tests/UnityEngine/AndroidJavaClass.cs delete mode 100644 tests/UnityEngine/AndroidJavaObject.cs delete mode 100644 tests/UnityEngine/Application.cs delete mode 100644 tests/UnityEngine/AsyncOperation.cs delete mode 100644 tests/UnityEngine/BatteryStatus.cs delete mode 100644 tests/UnityEngine/Debug.cs delete mode 100644 tests/UnityEngine/DownloadHandler.cs delete mode 100644 tests/UnityEngine/GameObject.cs delete mode 100644 tests/UnityEngine/JsonUtility.cs delete mode 100644 tests/UnityEngine/LoadSceneMode.cs delete mode 100644 tests/UnityEngine/LogType.cs delete mode 100644 tests/UnityEngine/MonoBehaviour.cs delete mode 100644 tests/UnityEngine/Object.cs delete mode 100644 tests/UnityEngine/PlayerPrefs.cs delete mode 100644 tests/UnityEngine/Resolution.cs delete mode 100644 tests/UnityEngine/RuntimePlatform.cs delete mode 100644 tests/UnityEngine/Scene.cs delete mode 100644 tests/UnityEngine/SceneManager.cs delete mode 100644 tests/UnityEngine/Screen.cs delete mode 100644 tests/UnityEngine/SystemInfo.cs delete mode 100644 tests/UnityEngine/SystemLanguage.cs delete mode 100644 tests/UnityEngine/Time.cs delete mode 100644 tests/UnityEngine/UnityAction.cs delete mode 100644 tests/UnityEngine/UnityEngine.csproj delete mode 100644 tests/UnityEngine/UnityWebRequest.cs delete mode 100644 tests/UnityEngine/UploadHandler.cs delete mode 100644 tests/UnityEngine/WaitForSeconds.cs delete mode 100644 upm-tools/AssemblyDefinitions/Bugsnag.asmdef delete mode 100644 upm-tools/AssemblyDefinitions/Bugsnag.asmdef.meta rename {upm-tools => upm}/EDM/BugsnagAndroidDependencies.xml (100%) rename {upm-tools => upm}/EDM/BugsnagAndroidDependencies.xml.meta (100%) rename {upm-tools => upm}/README.md (100%) rename {upm-tools => upm}/README.md.meta (100%) rename {upm-tools => upm}/UPMImportProject/Assets/Scenes.meta (100%) rename {upm-tools => upm}/UPMImportProject/Assets/Scenes/SampleScene.unity (100%) rename {upm-tools => upm}/UPMImportProject/Assets/Scenes/SampleScene.unity.meta (100%) rename {upm-tools => upm}/UPMImportProject/Packages/manifest.json (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/AudioManager.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/ClusterInputManager.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/DynamicsManager.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/EditorBuildSettings.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/EditorSettings.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/GraphicsSettings.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/InputManager.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/NavMeshAreas.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/NetworkManager.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/Physics2DSettings.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/PresetManager.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/ProjectSettings.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/ProjectVersion.txt (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/QualitySettings.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/TagManager.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/TimeManager.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/UnityConnectSettings.asset (100%) rename {upm-tools => upm}/UPMImportProject/ProjectSettings/VFXManager.asset (100%) rename {upm-tools => upm}/build-edm-package.sh (100%) rename {upm-tools => upm}/build-upm-package.sh (87%) rename {upm-tools => upm}/package.json (100%) rename {upm-tools => upm}/package.json.meta (100%) diff --git a/.gitignore b/.gitignore index 409eee111..7593da23c 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,16 @@ features/fixtures/minimalapp/minimal_with_xcode features/fixtures/minimalapp/minimal_without_xcode features/fixtures/minimalapp/Packages Gemfile.lock +Assembly-CSharp-Editor.csproj +Assembly-CSharp.csproj +Bugsnag.sln +BugsnagEditor.csproj +BugsnagUnity.csproj +BugsnagUnityTests.csproj +Bugsnag/.vscode +Bugsnag/Library +features/fixtures/maze_runner/.vscode +Bugsnag/Temp +Bugsnag/UserSettings +Bugsnag/Assets/Bugsnag/Plugins +Bugsnag/Packages diff --git a/upm-tools/AssemblyDefinitions/BugsnagEditor.asmdef b/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.asmdef similarity index 52% rename from upm-tools/AssemblyDefinitions/BugsnagEditor.asmdef rename to Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.asmdef index 921042cbf..04d19fe3c 100644 --- a/upm-tools/AssemblyDefinitions/BugsnagEditor.asmdef +++ b/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.asmdef @@ -1,16 +1,16 @@ { "name": "BugsnagEditor", + "rootNamespace": "", "references": [ - "Bugsnag" - ], - "optionalUnityReferences": [], - "includePlatforms": [ - "Editor" + "GUID:8d198819d450d4d6292709bec5a655cc" ], + "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, "overrideReferences": false, "precompiledReferences": [], "autoReferenced": true, - "defineConstraints": [] + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file diff --git a/upm-tools/AssemblyDefinitions/BugsnagEditor.asmdef.meta b/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.asmdef.meta similarity index 76% rename from upm-tools/AssemblyDefinitions/BugsnagEditor.asmdef.meta rename to Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.asmdef.meta index 01098da9c..ec9b6618a 100644 --- a/upm-tools/AssemblyDefinitions/BugsnagEditor.asmdef.meta +++ b/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e11af18a6899e42ef842a1ccea160eb7 +guid: 3a2c9cab568284191a8489eb3a950f0d AssemblyDefinitionImporter: externalObjects: {} userData: diff --git a/Bugsnag/Assets/Bugsnag/Plugins/Cocoa.meta b/Bugsnag/Assets/Bugsnag/Plugins/Cocoa.meta deleted file mode 100644 index e1d649acc..000000000 --- a/Bugsnag/Assets/Bugsnag/Plugins/Cocoa.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 418820f8c5ead4eaca55db49dc440f7a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Bugsnag/Assets/Bugsnag/Scripts.meta b/Bugsnag/Assets/Bugsnag/Runtime.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts.meta rename to Bugsnag/Assets/Bugsnag/Runtime.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/AutomaticDataCollector.cs b/Bugsnag/Assets/Bugsnag/Runtime/AutomaticDataCollector.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/AutomaticDataCollector.cs rename to Bugsnag/Assets/Bugsnag/Runtime/AutomaticDataCollector.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/AutomaticDataCollector.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/AutomaticDataCollector.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/AutomaticDataCollector.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/AutomaticDataCollector.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BlockingQueue.cs b/Bugsnag/Assets/Bugsnag/Runtime/BlockingQueue.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BlockingQueue.cs rename to Bugsnag/Assets/Bugsnag/Runtime/BlockingQueue.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BlockingQueue.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/BlockingQueue.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BlockingQueue.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/BlockingQueue.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Bugsnag.cs b/Bugsnag/Assets/Bugsnag/Runtime/Bugsnag.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Bugsnag.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Bugsnag.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Bugsnag.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Bugsnag.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Bugsnag.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Bugsnag.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagAutoInit.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagAutoInit.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagAutoInit.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BugsnagAutoInit.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagAutoInit.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagSettingsObject.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagSettingsObject.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagSettingsObject.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BugsnagSettingsObject.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagSettingsObject.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnity.asmdef similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnity.asmdef diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef.meta b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnity.asmdef.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnity.asmdef.meta rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnity.asmdef.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest.meta b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest.meta rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/README.md b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/README.md rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md diff --git a/Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/README.md.meta b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/BugsnagUnityWebRequest/README.md.meta rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Client.cs b/Bugsnag/Assets/Bugsnag/Runtime/Client.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Client.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Client.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Client.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Client.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Client.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Client.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs b/Bugsnag/Assets/Bugsnag/Runtime/Configuration.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Configuration.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Configuration.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Configuration.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Configuration.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Delivery.cs b/Bugsnag/Assets/Bugsnag/Runtime/Delivery.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Delivery.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Delivery.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Delivery.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Delivery.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Delivery.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Delivery.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs b/Bugsnag/Assets/Bugsnag/Runtime/EndpointConfiguration.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs rename to Bugsnag/Assets/Bugsnag/Runtime/EndpointConfiguration.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/EndpointConfiguration.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/EndpointConfiguration.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/EndpointConfiguration.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IBreadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Runtime/IBreadcrumbs.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IBreadcrumbs.cs rename to Bugsnag/Assets/Bugsnag/Runtime/IBreadcrumbs.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IBreadcrumbs.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/IBreadcrumbs.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IBreadcrumbs.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/IBreadcrumbs.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/ICacheManager.cs b/Bugsnag/Assets/Bugsnag/Runtime/ICacheManager.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/ICacheManager.cs rename to Bugsnag/Assets/Bugsnag/Runtime/ICacheManager.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/ICacheManager.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/ICacheManager.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/ICacheManager.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/ICacheManager.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IClient.cs b/Bugsnag/Assets/Bugsnag/Runtime/IClient.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IClient.cs rename to Bugsnag/Assets/Bugsnag/Runtime/IClient.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IClient.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/IClient.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/IClient.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IFeatureFlagStore.cs b/Bugsnag/Assets/Bugsnag/Runtime/IFeatureFlagStore.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IFeatureFlagStore.cs rename to Bugsnag/Assets/Bugsnag/Runtime/IFeatureFlagStore.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IFeatureFlagStore.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/IFeatureFlagStore.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IFeatureFlagStore.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/IFeatureFlagStore.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IFilterable.cs b/Bugsnag/Assets/Bugsnag/Runtime/IFilterable.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IFilterable.cs rename to Bugsnag/Assets/Bugsnag/Runtime/IFilterable.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IFilterable.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/IFilterable.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IFilterable.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/IFilterable.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IMetadataEditor.cs b/Bugsnag/Assets/Bugsnag/Runtime/IMetadataEditor.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IMetadataEditor.cs rename to Bugsnag/Assets/Bugsnag/Runtime/IMetadataEditor.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IMetadataEditor.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/IMetadataEditor.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IMetadataEditor.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/IMetadataEditor.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/INativeClient.cs b/Bugsnag/Assets/Bugsnag/Runtime/INativeClient.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/INativeClient.cs rename to Bugsnag/Assets/Bugsnag/Runtime/INativeClient.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/INativeClient.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/INativeClient.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/INativeClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/INativeClient.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IUserEditor.cs b/Bugsnag/Assets/Bugsnag/Runtime/IUserEditor.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IUserEditor.cs rename to Bugsnag/Assets/Bugsnag/Runtime/IUserEditor.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/IUserEditor.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/IUserEditor.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/IUserEditor.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/IUserEditor.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/LastRunInfo.cs b/Bugsnag/Assets/Bugsnag/Runtime/LastRunInfo.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/LastRunInfo.cs rename to Bugsnag/Assets/Bugsnag/Runtime/LastRunInfo.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/LastRunInfo.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/LastRunInfo.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/LastRunInfo.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/LastRunInfo.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/LogTypeSeverityMapping.cs b/Bugsnag/Assets/Bugsnag/Runtime/LogTypeSeverityMapping.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/LogTypeSeverityMapping.cs rename to Bugsnag/Assets/Bugsnag/Runtime/LogTypeSeverityMapping.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/LogTypeSeverityMapping.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/LogTypeSeverityMapping.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/LogTypeSeverityMapping.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/LogTypeSeverityMapping.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/MainThreadDispatchBehaviour.cs b/Bugsnag/Assets/Bugsnag/Runtime/MainThreadDispatchBehaviour.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/MainThreadDispatchBehaviour.cs rename to Bugsnag/Assets/Bugsnag/Runtime/MainThreadDispatchBehaviour.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/MainThreadDispatchBehaviour.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/MainThreadDispatchBehaviour.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/MainThreadDispatchBehaviour.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/MainThreadDispatchBehaviour.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/MaximumLogTypeCounter.cs b/Bugsnag/Assets/Bugsnag/Runtime/MaximumLogTypeCounter.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/MaximumLogTypeCounter.cs rename to Bugsnag/Assets/Bugsnag/Runtime/MaximumLogTypeCounter.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/MaximumLogTypeCounter.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/MaximumLogTypeCounter.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/MaximumLogTypeCounter.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/MaximumLogTypeCounter.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/Breadcrumbs.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/Breadcrumbs.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/Breadcrumbs.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/Breadcrumbs.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/Breadcrumbs.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeApp.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeApp.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeApp.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeApp.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeApp.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeAppWithState.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeAppWithState.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeAppWithState.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeAppWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeAppWithState.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeBreadcrumb.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeBreadcrumb.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeBreadcrumb.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeBreadcrumb.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeBreadcrumb.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeClient.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeClient.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeClient.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeClient.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDevice.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDevice.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDevice.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDevice.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDevice.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDeviceWithState.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDeviceWithState.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDeviceWithState.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeDeviceWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDeviceWithState.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeError.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeError.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeError.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeError.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeError.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeEvent.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeEvent.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeEvent.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeEvent.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeEvent.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeInterface.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeInterface.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeInterface.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeInterface.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeInterface.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativePayloadClassWrapper.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativePayloadClassWrapper.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativePayloadClassWrapper.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativePayloadClassWrapper.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativePayloadClassWrapper.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeSession.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeSession.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeSession.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeSession.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeSession.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeStackFrame.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeStackFrame.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeStackFrame.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeStackFrame.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeStackFrame.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeThread.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeThread.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeThread.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeThread.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeThread.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeUser.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeUser.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeUser.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Android/NativeUser.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeUser.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/Breadcrumbs.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/Breadcrumbs.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/Breadcrumbs.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/Breadcrumbs.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/Breadcrumbs.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeApp.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeApp.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeApp.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeApp.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeApp.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeAppWithState.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeAppWithState.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeAppWithState.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeAppWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeAppWithState.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeBreadcrumb.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeBreadcrumb.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeBreadcrumb.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeBreadcrumb.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeBreadcrumb.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeClient.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeClient.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeClient.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeClient.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeCode.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeCode.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeCode.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeCode.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeCode.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDevice.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDevice.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDevice.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDevice.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDevice.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDeviceWithState.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDeviceWithState.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDeviceWithState.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeDeviceWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDeviceWithState.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeError.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeError.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeError.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeError.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeError.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeEvent.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeEvent.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeEvent.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeEvent.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeEvent.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeImage.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeImage.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeImage.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeImage.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeImage.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativePayloadClassWrapper.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativePayloadClassWrapper.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativePayloadClassWrapper.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativePayloadClassWrapper.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativePayloadClassWrapper.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeSession.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeSession.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeSession.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeSession.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeSession.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeStackFrame.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeStackFrame.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeStackFrame.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeStackFrame.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeStackFrame.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeThread.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeThread.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeThread.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeThread.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeThread.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeUser.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeUser.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeUser.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Cocoa/NativeUser.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeUser.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/Breadcrumbs.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/Breadcrumbs.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/Breadcrumbs.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/Breadcrumbs.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/Breadcrumbs.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/CacheManager.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/CacheManager.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/CacheManager.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/CacheManager.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/CacheManager.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/CacheManager.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/CacheManager.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/CacheManager.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/NativeClient.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/NativeClient.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/NativeClient.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Fallback/NativeClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/NativeClient.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/MacOS.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/MacOS.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/MacOS/NativeCode.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/MacOS/NativeCode.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/MacOS/NativeCode.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/MacOS/NativeCode.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/MacOS/NativeCode.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Windows.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Windows.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Windows.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Windows.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Windows/NativeClient.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Windows/NativeClient.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/Windows/NativeClient.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/Windows/NativeClient.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/Windows/NativeClient.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/iOS.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/iOS.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/iOS.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/iOS/NativeCode.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Native/iOS/NativeCode.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Native/iOS/NativeCode.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Native/iOS/NativeCode.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Native/iOS/NativeCode.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/App.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/App.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/App.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/App.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/App.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/App.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/App.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/App.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/AppWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/AppWithState.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/AppWithState.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/AppWithState.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/AppWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/AppWithState.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/AppWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/AppWithState.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Breadcrumb.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Breadcrumb.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Breadcrumb.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Breadcrumb.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Breadcrumb.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Breadcrumb.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Breadcrumb.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Breadcrumb.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/BreadcrumbType.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/BreadcrumbType.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/BreadcrumbType.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/BreadcrumbType.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/BreadcrumbType.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/BreadcrumbType.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/BreadcrumbType.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/BreadcrumbType.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Correlation.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Correlation.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Correlation.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Correlation.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Correlation.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Correlation.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Correlation.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Correlation.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Device.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Device.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Device.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Device.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Device.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Device.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Device.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Device.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/DeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/DeviceWithState.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/DeviceWithState.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/DeviceWithState.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/DeviceWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/DeviceWithState.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/DeviceWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/DeviceWithState.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Error.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Error.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Error.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Error.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Error.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Error.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Error.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Error.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Event.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Event.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Event.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Event.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Event.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Event.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Event.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Event.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/FeatureFlag.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/FeatureFlag.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/FeatureFlag.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/FeatureFlag.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/FeatureFlag.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/FeatureFlag.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/FeatureFlag.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/FeatureFlag.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/HandledState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/HandledState.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/HandledState.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/HandledState.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/HandledState.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/HandledState.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/HandledState.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/HandledState.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IApp.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IApp.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IApp.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IApp.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IApp.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IApp.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IApp.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IApp.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IAppWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IAppWithState.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IAppWithState.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IAppWithState.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IAppWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IAppWithState.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IAppWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IAppWithState.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IBreadcrumb.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IBreadcrumb.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IBreadcrumb.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IBreadcrumb.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IBreadcrumb.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IBreadcrumb.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IBreadcrumb.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IBreadcrumb.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IDevice.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IDevice.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IDevice.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IDevice.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IDevice.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IDevice.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IDevice.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IDevice.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IDeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IDeviceWithState.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IDeviceWithState.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IDeviceWithState.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IDeviceWithState.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IDeviceWithState.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IDeviceWithState.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IDeviceWithState.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IError.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IError.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IError.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IError.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IError.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IError.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IError.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IError.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IEvent.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IEvent.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IEvent.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IEvent.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IEvent.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IEvent.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IEvent.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IEvent.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IPayload.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IPayload.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IPayload.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IPayload.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IPayload.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IPayload.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IPayload.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IPayload.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/ISession.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/ISession.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/ISession.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/ISession.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/ISession.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/ISession.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/ISession.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/ISession.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IStackframe.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IStackframe.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IStackframe.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IStackframe.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IStackframe.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IStackframe.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IStackframe.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IStackframe.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IThread.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IThread.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IThread.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IThread.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IThread.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IThread.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IThread.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IThread.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IUser.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IUser.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IUser.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IUser.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/IUser.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/IUser.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/IUser.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/IUser.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Metadata.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Metadata.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Metadata.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Metadata.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Metadata.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Metadata.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Metadata.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Metadata.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Method.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Method.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Method.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Method.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Method.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Method.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Method.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Method.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/MethodParameter.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/MethodParameter.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/MethodParameter.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/MethodParameter.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/MethodParameter.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/MethodParameter.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/MethodParameter.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/MethodParameter.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/NotifierInfo.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/NotifierInfo.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/NotifierInfo.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/NotifierInfo.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/NotifierInfo.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/NotifierInfo.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/NotifierInfo.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/NotifierInfo.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadContainer.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/PayloadContainer.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadContainer.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/PayloadContainer.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadContainer.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/PayloadContainer.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadContainer.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/PayloadContainer.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadExtensions.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/PayloadExtensions.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadExtensions.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/PayloadExtensions.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadExtensions.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/PayloadExtensions.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/PayloadExtensions.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/PayloadExtensions.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Report.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Report.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Report.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Report.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Report.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Report.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Report.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Report.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Session.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Session.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Session.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Session.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/Session.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Session.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/Session.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/Session.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/SessionReport.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/SessionReport.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/SessionReport.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/SessionReport.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/SessionReport.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/SessionReport.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/SessionReport.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/SessionReport.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/StackTraceLine.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/StackTraceLine.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/StackTraceLine.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/StackTraceLine.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/StackTraceLine.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/StackTraceLine.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/StackTraceLine.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/StackTraceLine.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/User.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/User.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/User.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/User.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Payload/User.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Payload/User.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Payload/User.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Payload/User.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/PayloadManager.cs b/Bugsnag/Assets/Bugsnag/Runtime/PayloadManager.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/PayloadManager.cs rename to Bugsnag/Assets/Bugsnag/Runtime/PayloadManager.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/PayloadManager.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/PayloadManager.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/PayloadManager.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/PayloadManager.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/PerformanceHelper.cs b/Bugsnag/Assets/Bugsnag/Runtime/PerformanceHelper.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/PerformanceHelper.cs rename to Bugsnag/Assets/Bugsnag/Runtime/PerformanceHelper.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/PerformanceHelper.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/PerformanceHelper.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/PerformanceHelper.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/PerformanceHelper.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Polyfills.cs b/Bugsnag/Assets/Bugsnag/Runtime/Polyfills.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Polyfills.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Polyfills.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Polyfills.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Polyfills.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Polyfills.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Polyfills.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/PostProcessBuild.cs b/Bugsnag/Assets/Bugsnag/Runtime/PostProcessBuild.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/PostProcessBuild.cs rename to Bugsnag/Assets/Bugsnag/Runtime/PostProcessBuild.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/PostProcessBuild.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/PostProcessBuild.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/PostProcessBuild.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/PostProcessBuild.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/SessionTracker.cs b/Bugsnag/Assets/Bugsnag/Runtime/SessionTracker.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/SessionTracker.cs rename to Bugsnag/Assets/Bugsnag/Runtime/SessionTracker.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/SessionTracker.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/SessionTracker.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/SessionTracker.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/SessionTracker.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Severity.cs b/Bugsnag/Assets/Bugsnag/Runtime/Severity.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Severity.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Severity.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Severity.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Severity.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Severity.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Severity.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/SimpleJson.cs b/Bugsnag/Assets/Bugsnag/Runtime/SimpleJson.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/SimpleJson.cs rename to Bugsnag/Assets/Bugsnag/Runtime/SimpleJson.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/SimpleJson.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/SimpleJson.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/SimpleJson.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/SimpleJson.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/TelemetryType.cs b/Bugsnag/Assets/Bugsnag/Runtime/TelemetryType.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/TelemetryType.cs rename to Bugsnag/Assets/Bugsnag/Runtime/TelemetryType.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/TelemetryType.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/TelemetryType.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/TelemetryType.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/TelemetryType.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/ThreadSendPolicy.cs b/Bugsnag/Assets/Bugsnag/Runtime/ThreadSendPolicy.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/ThreadSendPolicy.cs rename to Bugsnag/Assets/Bugsnag/Runtime/ThreadSendPolicy.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/ThreadSendPolicy.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/ThreadSendPolicy.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/ThreadSendPolicy.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/ThreadSendPolicy.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Time.cs b/Bugsnag/Assets/Bugsnag/Runtime/Time.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Time.cs rename to Bugsnag/Assets/Bugsnag/Runtime/Time.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/Time.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/Time.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/Time.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/Time.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/TimingTrackerBehaviour.cs b/Bugsnag/Assets/Bugsnag/Runtime/TimingTrackerBehaviour.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/TimingTrackerBehaviour.cs rename to Bugsnag/Assets/Bugsnag/Runtime/TimingTrackerBehaviour.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/TimingTrackerBehaviour.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/TimingTrackerBehaviour.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/TimingTrackerBehaviour.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/TimingTrackerBehaviour.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/TypeNameHelper.cs b/Bugsnag/Assets/Bugsnag/Runtime/TypeNameHelper.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/TypeNameHelper.cs rename to Bugsnag/Assets/Bugsnag/Runtime/TypeNameHelper.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/TypeNameHelper.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/TypeNameHelper.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/TypeNameHelper.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/TypeNameHelper.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/UniqueLogThrottle.cs b/Bugsnag/Assets/Bugsnag/Runtime/UniqueLogThrottle.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/UniqueLogThrottle.cs rename to Bugsnag/Assets/Bugsnag/Runtime/UniqueLogThrottle.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/UniqueLogThrottle.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/UniqueLogThrottle.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/UniqueLogThrottle.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/UniqueLogThrottle.cs.meta diff --git a/Bugsnag/Assets/Bugsnag/Scripts/UnityLogMessage.cs b/Bugsnag/Assets/Bugsnag/Runtime/UnityLogMessage.cs similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/UnityLogMessage.cs rename to Bugsnag/Assets/Bugsnag/Runtime/UnityLogMessage.cs diff --git a/Bugsnag/Assets/Bugsnag/Scripts/UnityLogMessage.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/UnityLogMessage.cs.meta similarity index 100% rename from Bugsnag/Assets/Bugsnag/Scripts/UnityLogMessage.cs.meta rename to Bugsnag/Assets/Bugsnag/Runtime/UnityLogMessage.cs.meta diff --git a/tests/BugsnagUnity.Tests/BugsnagUnity.Tests.csproj b/tests/BugsnagUnity.Tests/BugsnagUnity.Tests.csproj deleted file mode 100644 index ca2ff1f7f..000000000 --- a/tests/BugsnagUnity.Tests/BugsnagUnity.Tests.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - net8.0 - - - - - - - - Always - - - - - - - - diff --git a/tests/BugsnagUnity.Tests/ConfigurationTests.cs b/tests/BugsnagUnity.Tests/ConfigurationTests.cs deleted file mode 100644 index 2d02978fc..000000000 --- a/tests/BugsnagUnity.Tests/ConfigurationTests.cs +++ /dev/null @@ -1,205 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using System.Threading; - -namespace BugsnagUnity.Payload.Tests -{ - [TestClass] - public class ConfigurationTests - { - [TestMethod] - public void DefaultConfigurationValues() - { - var config = new Configuration("foo"); - Assert.IsTrue(config.ReportExceptionLogsAsHandled); - Assert.IsTrue(config.AutoDetectErrors); - Assert.IsTrue(config.AutoTrackSessions); - Assert.AreEqual("production", config.ReleaseStage); - Assert.AreEqual("https://notify.bugsnag.com/", config.Endpoints.Notify.ToString()); - Assert.AreEqual("https://sessions.bugsnag.com/", config.Endpoints.Session.ToString()); - Assert.AreEqual("foo", config.ApiKey); - } - - [TestMethod] - public void MaxBreadcrumbsLimit() - { - var config = new Configuration("foo"); - config.MaximumBreadcrumbs = 501; - Assert.AreEqual(100, config.MaximumBreadcrumbs); - config.MaximumBreadcrumbs = -1; - Assert.AreEqual(100, config.MaximumBreadcrumbs); - config.MaximumBreadcrumbs = 20; - Assert.AreEqual(20, config.MaximumBreadcrumbs); - } - - [TestMethod] - public void CloneTest() - { - var original = new Configuration("foo"); - - original.MaximumBreadcrumbs = 1; - original.ReleaseStage = "1"; - original.SetUser("1", "1", "1"); - - var clone = original.Clone(); - - // int check - Assert.AreEqual(original.MaximumBreadcrumbs, clone.MaximumBreadcrumbs); - clone.MaximumBreadcrumbs = 2; - Assert.AreEqual(1, original.MaximumBreadcrumbs); - Assert.AreEqual(2, clone.MaximumBreadcrumbs); - - // string check - clone.ReleaseStage = "2"; - Assert.AreNotEqual(original.ReleaseStage, clone.ReleaseStage); - - // user check - clone.SetUser("2", "2", "2"); - Assert.AreEqual("1", original.GetUser().Name); - Assert.AreEqual("2", clone.GetUser().Name); - } - - [TestMethod] - public void EndpointValidation() - { - var config = new Configuration("foo"); - - Assert.IsTrue(config.Endpoints.IsValid); - - config.Endpoints.Notify = new Uri("https://www.richIsCool.com/"); - - Assert.IsFalse(config.Endpoints.IsValid); - - config.Endpoints.Session = new Uri("https://www.richIsSuperCool.com/"); - - Assert.IsTrue(config.Endpoints.IsValid); - - config.Endpoints.Notify = null; - - Assert.IsFalse(config.Endpoints.IsValid); - } - - [TestMethod] - public void RedactedKeysTest() - { - var config = new Configuration("foo"); - - // Default redacted keys - Assert.IsTrue(config.KeyIsRedacted("user-password")); - Assert.IsFalse(config.KeyIsRedacted("username")); - - var config2 = new Configuration("foo"); - - // Custom redacted keys - config2.RedactedKeys.Add(new Regex(".*secret.*", RegexOptions.IgnoreCase)); - config2.RedactedKeys.Add(new Regex(".*token.*", RegexOptions.IgnoreCase)); - Assert.IsTrue(config2.KeyIsRedacted("secret")); - Assert.IsTrue(config2.KeyIsRedacted("token")); - Assert.IsTrue(config2.KeyIsRedacted("password")); - Assert.IsFalse(config2.KeyIsRedacted("app_id")); - } - - [TestMethod] - public void DiscardedClassesTest() - { - var config = new Configuration("foo"); - - // No discard classes by default - Assert.IsFalse(config.ErrorClassIsDiscarded("System.Exception")); - - var config2 = new Configuration("foo"); - - // Adding discard classes - config2.DiscardClasses.Add(new Regex("^System\\.Exception$", RegexOptions.IgnoreCase)); - config2.DiscardClasses.Add(new Regex("^System\\.NullReferenceException$", RegexOptions.IgnoreCase)); - Assert.IsTrue(config2.ErrorClassIsDiscarded("System.Exception")); - Assert.IsTrue(config2.ErrorClassIsDiscarded("System.NullReferenceException")); - Assert.IsFalse(config2.ErrorClassIsDiscarded("System.ArgumentException")); - } - - [TestMethod] - public void ThreadSafeCallbacksTest() - { - var config = new Configuration("foo"); - - // Define a simple callback function - Func callback1 = (e) => true; - Func callback2 = (e) => false; - Func sessionCallback = (s) => true; - - // We will use these lists to store the results from multiple threads - List onErrorResults = new List(); - List onSendErrorResults = new List(); - List onSessionResults = new List(); - - // Adding callbacks in multiple threads - Thread addThread1 = new Thread(() => - { - for (int i = 0; i < 50; i++) - { - config.AddOnError(callback1); - config.AddOnSendError(callback2); - config.AddOnSession(sessionCallback); - } - }); - - Thread addThread2 = new Thread(() => - { - for (int i = 0; i < 50; i++) - { - config.AddOnError(callback2); - config.AddOnSendError(callback1); - config.AddOnSession(sessionCallback); - } - }); - - // Removing callbacks in multiple threads - Thread removeThread1 = new Thread(() => - { - for (int i = 0; i < 25; i++) - { - config.RemoveOnError(callback1); - config.RemoveOnSendError(callback2); - config.RemoveOnSession(sessionCallback); - } - }); - - Thread removeThread2 = new Thread(() => - { - for (int i = 0; i < 25; i++) - { - config.RemoveOnError(callback2); - config.RemoveOnSendError(callback1); - config.RemoveOnSession(sessionCallback); - } - }); - - // Start all threads - addThread1.Start(); - addThread2.Start(); - removeThread1.Start(); - removeThread2.Start(); - - // Wait for all threads to complete - addThread1.Join(); - addThread2.Join(); - removeThread1.Join(); - removeThread2.Join(); - - // Verify the state of the callback lists - // The exact number might vary depending on the execution order, - // but there should be no exceptions thrown and the list should not be empty - Assert.IsTrue(config.GetOnErrorCallbacks().Count > 0, "OnErrorCallbacks should have entries."); - Assert.IsTrue(config.GetOnSendErrorCallbacks().Count > 0, "OnSendErrorCallbacks should have entries."); - Assert.IsTrue(config.GetOnSessionCallbacks().Count > 0, "OnSessionCallbacks should have entries."); - - // Check if the remaining callbacks are as expected - Assert.IsTrue(config.GetOnErrorCallbacks().Contains(callback1) || config.GetOnErrorCallbacks().Contains(callback2), "Callback1 or Callback2 should be in OnErrorCallbacks."); - Assert.IsTrue(config.GetOnSendErrorCallbacks().Contains(callback1) || config.GetOnSendErrorCallbacks().Contains(callback2), "Callback1 or Callback2 should be in OnSendErrorCallbacks."); - Assert.IsTrue(config.GetOnSessionCallbacks().Contains(sessionCallback), "SessionCallback should be in OnSessionCallbacks."); - } - } -} diff --git a/tests/BugsnagUnity.Tests/ExceptionTests.cs b/tests/BugsnagUnity.Tests/ExceptionTests.cs deleted file mode 100644 index 10a61fe09..000000000 --- a/tests/BugsnagUnity.Tests/ExceptionTests.cs +++ /dev/null @@ -1,158 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Linq; -using System.Threading; -using UnityEngine; - -namespace BugsnagUnity.Payload.Tests -{ - [TestClass] - public class ExceptionTests - { - [TestMethod] - public void ParseExceptionFromLogMessage() - { - string condition = "IndexOutOfRangeException: Array index is out of range."; - string stacktrace = @"ReporterBehavior.AssertionFailure () [0x00000] in :0 - UnityEngine.Events.InvokableCall.Invoke () [0x00000] in :0 - UnityEngine.Events.UnityEvent.Invoke () [0x00000] in :0 - UnityEngine.UI.Button.Press () [0x00000] in :0 - UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) [0x00000] in :0 - UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) [0x00000] in :0 - UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) [0x00000] in :0"; - var logType = UnityEngine.LogType.Error; - var log = new UnityLogMessage(condition, stacktrace, logType); - Assert.IsTrue(Error.ShouldSend(log)); - - var exception = Error.FromUnityLogMessage(log, new System.Diagnostics.StackFrame[] { }, Severity.Info); - var stack = exception.Stacktrace.ToList(); - Assert.AreEqual(7, stack.Count); - Assert.AreEqual("IndexOutOfRangeException", exception.ErrorClass); - Assert.AreEqual("Array index is out of range.", exception.ErrorMessage); - Assert.AreEqual("ReporterBehavior.AssertionFailure()", stack[0].Method); - Assert.AreEqual("", stack[0].File); - Assert.AreEqual(0, stack[0].LineNumber); - Assert.AreEqual("UnityEngine.Events.InvokableCall.Invoke()", stack[1].Method); - Assert.AreEqual("", stack[1].File); - Assert.AreEqual(0, stack[1].LineNumber); - Assert.AreEqual("UnityEngine.Events.UnityEvent.Invoke()", stack[2].Method); - Assert.AreEqual("", stack[2].File); - Assert.AreEqual(0, stack[2].LineNumber); - Assert.AreEqual("UnityEngine.UI.Button.Press()", stack[3].Method); - Assert.AreEqual("", stack[3].File); - Assert.AreEqual(0, stack[3].LineNumber); - Assert.AreEqual("UnityEngine.UI.Button.OnPointerClick(UnityEngine.EventSystems.PointerEventData eventData)", stack[4].Method); - Assert.AreEqual("", stack[4].File); - Assert.AreEqual(0, stack[4].LineNumber); - Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData)", stack[5].Method); - Assert.AreEqual("", stack[5].File); - Assert.AreEqual(0, stack[5].LineNumber); - Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler](UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor)", stack[6].Method); - Assert.AreEqual("", stack[6].File); - Assert.AreEqual(0, stack[6].LineNumber); - } - - [TestMethod] - public void ParseDuplicateAndroidExceptionFromLogMessage() - { - string condition = "AndroidJavaException: java.lang.Error"; - string stacktrace = @"java.lang.Error: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0102192a9accb1876a -libunity.0033c25b(Unknown:-2) -libunity.003606e3(Unknown:-2) -app_process64.000d1b11(Unknown:-2)"; - var logType = UnityEngine.LogType.Error; - var log = new UnityLogMessage(condition, stacktrace, logType); - Assert.IsFalse(Error.ShouldSend(log)); - } - - [TestMethod] - public void ParseAndroidExceptionFromLogMessage() - { - string condition = "AndroidJavaException: java.lang.IllegalArgumentException"; - string stacktrace = @"java.lang.IllegalArgumentException -com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash(CrashHelper.java:11) -com.unity3d.player.UnityPlayer.nativeRender(Native Method)"; - var logType = UnityEngine.LogType.Error; - var log = new UnityLogMessage(condition, stacktrace, logType); - Assert.IsTrue(Error.ShouldSend(log)); - var exception = Error.FromUnityLogMessage(log, new System.Diagnostics.StackFrame[] { }, Severity.Warning); - var stack = exception.Stacktrace.ToList(); - Assert.AreEqual("java.lang.IllegalArgumentException", exception.ErrorClass); - Assert.IsTrue(System.String.IsNullOrEmpty(exception.ErrorMessage)); - Assert.AreEqual(2, stack.Count); - Assert.AreEqual("com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash()", stack[0].Method); - Assert.AreEqual("CrashHelper.java", stack[0].File); - Assert.AreEqual(11, stack[0].LineNumber); - Assert.AreEqual("com.unity3d.player.UnityPlayer.nativeRender()", stack[1].Method); - Assert.AreEqual("Native Method", stack[1].File); - Assert.AreEqual(null, stack[1].LineNumber); - } - - [TestMethod] - public void ParseAndroidExceptionAndMessageFromLogMessage() - { - string condition = "AndroidJavaException: java.lang.ArrayIndexOutOfBoundsException: length=2; index=2"; - string stacktrace = @"java.lang.ArrayIndexOutOfBoundsException: length=2; index=2 -com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash(CrashHelper.java:11) -com.unity3d.player.UnityPlayer.nativeRender(Native Method) -com.unity3d.player.UnityPlayer.c(Unknown Source:0) -com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source:72) -android.os.MessageQueue.next(MessageQueue.java:395) -android.os.Looper.loop(Looper.java:160) -com.unity3d.player.UnityPlayer$e.run(Unknown Source:32) -UnityEngine.AndroidJNISafe.CheckException() -UnityEngine.AndroidJNISafe.CallStaticVoidMethod(IntPtr clazz, IntPtr methodID, UnityEngine.jvalue[] args) -UnityEngine.AndroidJavaObject._CallStatic(System.String methodName, System.Object[] args) -UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) -UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functorUnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler]() -UnityEngine.EventSystems.EventSystem:Update()"; - var logType = UnityEngine.LogType.Error; - var log = new UnityLogMessage(condition, stacktrace, logType); - Assert.IsTrue(Error.ShouldSend(log)); - - var exception = Error.FromUnityLogMessage(log, new System.Diagnostics.StackFrame[] { }, Severity.Warning); - var stack = exception.Stacktrace.ToList(); - Assert.AreEqual(13, stack.Count); - Assert.AreEqual("java.lang.ArrayIndexOutOfBoundsException", exception.ErrorClass); - Assert.AreEqual("length=2; index=2", exception.ErrorMessage); - Assert.AreEqual("com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash()", stack[0].Method); - Assert.AreEqual("CrashHelper.java", stack[0].File); - Assert.AreEqual(11, stack[0].LineNumber); - Assert.AreEqual("com.unity3d.player.UnityPlayer.nativeRender()", stack[1].Method); - Assert.AreEqual("Native Method", stack[1].File); - Assert.AreEqual(null, stack[1].LineNumber); - Assert.AreEqual("com.unity3d.player.UnityPlayer.c()", stack[2].Method); - Assert.AreEqual("Unknown Source", stack[2].File); - Assert.AreEqual(0, stack[2].LineNumber); - Assert.AreEqual("com.unity3d.player.UnityPlayer$e$2.queueIdle()", stack[3].Method); - Assert.AreEqual("Unknown Source", stack[3].File); - Assert.AreEqual(72, stack[3].LineNumber); - Assert.AreEqual("android.os.MessageQueue.next()", stack[4].Method); - Assert.AreEqual("MessageQueue.java", stack[4].File); - Assert.AreEqual(395, stack[4].LineNumber); - Assert.AreEqual("android.os.Looper.loop()", stack[5].Method); - Assert.AreEqual("Looper.java", stack[5].File); - Assert.AreEqual(160, stack[5].LineNumber); - Assert.AreEqual("com.unity3d.player.UnityPlayer$e.run()", stack[6].Method); - Assert.AreEqual("Unknown Source", stack[6].File); - Assert.AreEqual(32, stack[6].LineNumber); - Assert.AreEqual("UnityEngine.AndroidJNISafe.CheckException()", stack[7].Method); - Assert.AreEqual(null, stack[7].File); - Assert.AreEqual(null, stack[7].LineNumber); - Assert.AreEqual("UnityEngine.AndroidJNISafe.CallStaticVoidMethod(IntPtr clazz, IntPtr methodID, UnityEngine.jvalue[] args)", stack[8].Method); - Assert.AreEqual(null, stack[8].File); - Assert.AreEqual(null, stack[8].LineNumber); - Assert.AreEqual("UnityEngine.AndroidJavaObject._CallStatic(System.String methodName, System.Object[] args)", stack[9].Method); - Assert.AreEqual(null, stack[9].File); - Assert.AreEqual(null, stack[9].LineNumber); - Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData)", stack[10].Method); - Assert.AreEqual(null, stack[10].File); - Assert.AreEqual(null, stack[10].LineNumber); - Assert.AreEqual("UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functorUnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler]()", stack[11].Method); - Assert.AreEqual(null, stack[11].File); - Assert.AreEqual(null, stack[11].LineNumber); - Assert.AreEqual("UnityEngine.EventSystems.EventSystem:Update()", stack[12].Method); - Assert.AreEqual(null, stack[12].File); - Assert.AreEqual(null, stack[12].LineNumber); - } - } -} diff --git a/tests/BugsnagUnity.Tests/MaximumLogTypeCounterTests.cs b/tests/BugsnagUnity.Tests/MaximumLogTypeCounterTests.cs deleted file mode 100644 index 3609a1e30..000000000 --- a/tests/BugsnagUnity.Tests/MaximumLogTypeCounterTests.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using UnityEngine; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace BugsnagUnity.Tests -{ - [TestClass] - public class MaximumLogTypeCounterTests - { - [TestMethod] - public void SendsSingleMessage() - { - Dictionary maximumTypePerTimePeriod = - new Dictionary { { LogType.Error, 5 } }; - - var configuration = new Configuration("foo") - { - MaximumTypePerTimePeriod = maximumTypePerTimePeriod - }; - - var counter = new MaximumLogTypeCounter(configuration); - - var message = new UnityLogMessage("", "", UnityEngine.LogType.Error); - - Assert.IsTrue(counter.ShouldSend(message)); - } - - [TestMethod] - public void ShouldNotSendOverLimitMessages() - { - Dictionary maximumTypePerTimePeriod = - new Dictionary { { LogType.Error, 1 } }; - - var configuration = new Configuration("foo") - { - MaximumTypePerTimePeriod = maximumTypePerTimePeriod - }; - - var counter = new MaximumLogTypeCounter(configuration); - - var message1 = new UnityLogMessage("", "", LogType.Error); - var message2 = new UnityLogMessage("", "", LogType.Error); - - counter.ShouldSend(message1); - Assert.IsFalse(counter.ShouldSend(message2)); - } - - [TestMethod] - public void ShouldSendUnderTheLimit() - { - Dictionary maximumTypePerTimePeriod = - new Dictionary { { LogType.Error, 5 } }; - - var configuration = new Configuration("foo") - { - MaximumTypePerTimePeriod = maximumTypePerTimePeriod - }; - - var counter = new MaximumLogTypeCounter(configuration); - - var message1 = new UnityLogMessage("", "", LogType.Error); - var message2 = new UnityLogMessage("", "", LogType.Error); - var message3 = new UnityLogMessage("", "", LogType.Error); - var message4 = new UnityLogMessage("", "", LogType.Error); - var message5 = new UnityLogMessage("", "", LogType.Error); - - Assert.IsTrue(counter.ShouldSend(message1)); - Assert.IsTrue(counter.ShouldSend(message2)); - Assert.IsTrue(counter.ShouldSend(message3)); - Assert.IsTrue(counter.ShouldSend(message4)); - Assert.IsTrue(counter.ShouldSend(message5)); - } - - [TestMethod] - public void DontTrackCertainLogType() - { - Dictionary maximumTypePerTimePeriod = - new Dictionary(); - - var configuration = new Configuration("foo") - { - MaximumTypePerTimePeriod = maximumTypePerTimePeriod - }; - - var counter = new MaximumLogTypeCounter(configuration); - - - var message = new UnityLogMessage("", "", LogType.Error); - - Assert.IsTrue(counter.ShouldSend(message)); - } - - [TestMethod] - public void FlushesCorrectly() - { - Dictionary maximumTypePerTimePeriod = - new Dictionary { { LogType.Error, 1 } }; - - var configuration = new Configuration("foo") - { - MaximumTypePerTimePeriod = maximumTypePerTimePeriod, - MaximumLogsTimePeriod = TimeSpan.FromSeconds(2), - }; - - var counter = new MaximumLogTypeCounter(configuration); - - var message = new UnityLogMessage("", "", LogType.Error); - - counter.ShouldSend(message); - - Thread.Sleep(configuration.MaximumLogsTimePeriod); - - message = new UnityLogMessage("", "", LogType.Error); - - Assert.IsTrue(counter.ShouldSend(message)); - } - } -} diff --git a/tests/BugsnagUnity.Tests/OverloadCheck.cs b/tests/BugsnagUnity.Tests/OverloadCheck.cs deleted file mode 100644 index 79ac13c25..000000000 --- a/tests/BugsnagUnity.Tests/OverloadCheck.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -namespace BugsnagUnity.Tests -{ - public class OverloadCheck - { - - // this method never runs and is just used to check that no notify overides are accidentally broken during refactoring - // if one is broken then the notifier will not compile - private void Check() - { - Bugsnag.Notify("name", "message", "stacktrace"); - - Bugsnag.Notify("name", "message", "stacktrace", CallBack); - - Bugsnag.Notify(new Exception()); - - Bugsnag.Notify(new Exception(), "stacktrace"); - - Bugsnag.Notify(new Exception(), "stacktrace", CallBack); - - Bugsnag.Notify(new Exception(), CallBack); - - Bugsnag.Notify(new Exception(), Severity.Error); - - Bugsnag.Notify(new Exception(), Severity.Error, CallBack); - } - - private bool CallBack(IEvent e) - { - return true; - } - } -} diff --git a/tests/BugsnagUnity.Tests/PostProcessBuildTests.cs b/tests/BugsnagUnity.Tests/PostProcessBuildTests.cs deleted file mode 100644 index 2bae8dd07..000000000 --- a/tests/BugsnagUnity.Tests/PostProcessBuildTests.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace BugsnagUnity.Tests -{ - [TestClass] - public class PostProcessBuildTests - { - [DataTestMethod] - [DataRow("one")] - [DataRow("two")] - [DataRow("three")] - public void Test(string fileIdentifier) - { - string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - directory = Path.Combine(directory, "ProjectFixtures"); - var input = new LinkedList(File.ReadAllLines(Path.Combine(directory, $"test_{fileIdentifier}_input.pbxproj"))); - var output = new LinkedList(File.ReadAllLines(Path.Combine(directory, $"test_{fileIdentifier}_output.pbxproj"))); - - PostProcessBuild.Apply(input, "186208CC13E64B42A13CCD74"); - - CollectionAssert.AreEqual(new List(output), new List(input)); - } - } -} diff --git a/tests/BugsnagUnity.Tests/ProjectFixtures/test_one_input.pbxproj b/tests/BugsnagUnity.Tests/ProjectFixtures/test_one_input.pbxproj deleted file mode 100644 index f7c8535e6..000000000 --- a/tests/BugsnagUnity.Tests/ProjectFixtures/test_one_input.pbxproj +++ /dev/null @@ -1,1411 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 51; - objects = { - -/* Begin PBXBuildFile section */ - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */; }; - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */; }; - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */ = {isa = PBXBuildFile; fileRef = F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */; }; - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; }; - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E090A331F27884B0077B28D /* StoreReview.m */; }; - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5623C57B17FDCB0900090B9E /* InfoPlist.strings */; }; - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */; }; - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */; }; - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */; }; - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */; }; - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B795C11442E1100026B3DD /* CoreMotion.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */; }; - 56C56C9817D6015200616839 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 56C56C9717D6015100616839 /* Images.xcassets */; }; - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */ = {isa = PBXBuildFile; fileRef = 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */; }; - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56FD43950ED4745200FE3770 /* CFNetwork.framework */; }; - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA14828996CB3D3322CD1DA /* TodayViewController.m */; }; - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BAD78601F2B5A59006103DE /* Security.framework */; }; - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */; }; - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */; }; - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */; }; - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */; }; - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B256E10E62FEA000468741 /* OpenGLES.framework */; }; - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2570A0E62FF8A00468741 /* QuartzCore.framework */; }; - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574B0E63022200468741 /* OpenAL.framework */; }; - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574E0E63025400468741 /* libiconv.2.dylib */; }; - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */ = {isa = PBXBuildFile; fileRef = 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */; }; - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */; }; - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */ = {isa = PBXBuildFile; fileRef = E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */; }; - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A0FED481649699200E9727D /* EAGLContextHelper.mm */; }; - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A142DC51636943E00DD87CA /* Keyboard.mm */; }; - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */; }; - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */; }; - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A25E6D118D767E20006A227 /* Filesystem.mm */; }; - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */; }; - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */; }; - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */; }; - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */; }; - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */; }; - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */; }; - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */; }; - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */; }; - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */; }; - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */; }; - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */; }; - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */; }; - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA616FB2F6D00E911DB /* UnityView.mm */; }; - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA916FB3AD000E911DB /* UnityAppController.mm */; }; - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */; }; - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */; }; - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA568AD1827DD79004969C7 /* WWWConnection.mm */; }; - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */; }; - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */; }; - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */; }; - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC74A9419B47FEF00019D38 /* AVCapture.mm */; }; - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ACB801B177081D4005D0019 /* DeviceSettings.mm */; }; - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */; }; - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */; }; - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AF7755F17997D1300341121 /* AppDelegateListener.mm */; }; - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */; }; - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960391211D6CE46E003BF157 /* MediaToolbox.framework */; }; - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */; }; - AA31BF971B55660D0013FB1B /* Data in Resources */ = {isa = PBXBuildFile; fileRef = AA31BF961B55660D0013FB1B /* Data */; }; - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA5D99861AFAD3C800B27605 /* CoreText.framework */; }; - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */; }; - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */; }; - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C054391970787E9FCEBEA11 /* Metal.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */; }; - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D82DCFBB0E8000A5005D6AD8 /* main.mm */; }; - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */; }; - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */; }; - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */; }; - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1D6058900D05DD3D006BFB54; - remoteInfo = "Unity-iPhone"; - }; - FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 00C64C33A163F6BBBC3998DE; - remoteInfo = appext; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 5D0844359B6763E1774306B4 /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Il2CppOptions.cpp; sourceTree = ""; }; - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityInterface.h; path = Classes/Unity/IUnityInterface.h; sourceTree = SOURCE_ROOT; }; - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalHelper.mm; sourceTree = ""; }; - 1C054391970787E9FCEBEA11 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = "Unity-Target-New.app"; path = ProductName.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPad.png"; sourceTree = SOURCE_ROOT; }; - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphics.h; path = Classes/Unity/IUnityGraphics.h; sourceTree = SOURCE_ROOT; }; - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; - 4E090A331F27884B0077B28D /* StoreReview.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StoreReview.m; sourceTree = ""; }; - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPad.xib"; sourceTree = SOURCE_ROOT; }; - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "Unity-iPhone Tests.xctest"; path = ProductName.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Unity-iPhone Tests-Info.plist"; sourceTree = ""; }; - 5623C57C17FDCB0900090B9E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Unity_iPhone_Tests.m; sourceTree = ""; }; - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Unity-iPhone Tests-Prefix.pch"; sourceTree = ""; }; - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 56B795C11442E1100026B3DD /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 56C56C9717D6015100616839 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "Unity-iPhone/Images.xcassets"; sourceTree = ""; }; - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iPhone_Sensors.mm; sourceTree = ""; }; - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhone_Sensors.h; sourceTree = ""; }; - 56FD43950ED4745200FE3770 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; - 5BAD78601F2B5A59006103DE /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libbugsnag-ios.a"; path = "Libraries/Plugins/iOS/Bugsnag/libbugsnag-ios.a"; sourceTree = SOURCE_ROOT; }; - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPhone.xib"; sourceTree = SOURCE_ROOT; }; - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 830B5C100E5ED4C100C7819F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 83B256E10E62FEA000468741 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 83B2574B0E63022200468741 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; - 83B2574E0E63025400468741 /* libiconv.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.2.dylib; path = usr/lib/libiconv.2.dylib; sourceTree = SDKROOT; }; - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit_Scripting.mm; sourceTree = ""; }; - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit.mm; sourceTree = ""; }; - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityReplayKit.h; sourceTree = ""; }; - 8A0FED471649699200E9727D /* EAGLContextHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAGLContextHelper.h; sourceTree = ""; }; - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EAGLContextHelper.mm; sourceTree = ""; }; - 8A142DC41636943E00DD87CA /* Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = ""; }; - 8A142DC51636943E00DD87CA /* Keyboard.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Keyboard.mm; sourceTree = ""; }; - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FullScreenVideoPlayer.mm; sourceTree = ""; }; - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlesHelper.h; sourceTree = ""; }; - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GlesHelper.mm; sourceTree = ""; }; - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerBase.h; sourceTree = ""; }; - 8A25E6D118D767E20006A227 /* Filesystem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Filesystem.mm; sourceTree = ""; }; - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LifeCycleListener.h; sourceTree = ""; }; - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = LifeCycleListener.mm; sourceTree = ""; }; - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMVideoSampling.h; sourceTree = ""; }; - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CMVideoSampling.mm; sourceTree = ""; }; - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CVTextureCache.h; sourceTree = ""; }; - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CVTextureCache.mm; sourceTree = ""; }; - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SplashScreen.h; sourceTree = ""; }; - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SplashScreen.mm; sourceTree = ""; }; - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+ViewHandling.h"; sourceTree = ""; }; - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+ViewHandling.mm"; sourceTree = ""; }; - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderPluginDelegate.h; sourceTree = ""; }; - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RenderPluginDelegate.mm; sourceTree = ""; }; - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayManager.h; sourceTree = ""; }; - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DisplayManager.mm; sourceTree = ""; }; - 8A6137121A10B57700059EDF /* ObjCRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjCRuntime.h; sourceTree = ""; }; - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InternalProfiler.cpp; sourceTree = ""; }; - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InternalProfiler.h; sourceTree = ""; }; - 8A6720A619EFAF25006C92E0 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerBase.mm; sourceTree = ""; }; - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+iOS.h"; sourceTree = ""; }; - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+iOS.mm"; sourceTree = ""; }; - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+tvOS.h"; sourceTree = ""; }; - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+tvOS.mm"; sourceTree = ""; }; - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+iOS.h"; sourceTree = ""; }; - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+iOS.mm"; sourceTree = ""; }; - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+tvOS.h"; sourceTree = ""; }; - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+tvOS.mm"; sourceTree = ""; }; - 8A851BA516FB2F6D00E911DB /* UnityView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityView.h; sourceTree = ""; }; - 8A851BA616FB2F6D00E911DB /* UnityView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityView.mm; sourceTree = ""; }; - 8A851BA816FB3AD000E911DB /* UnityAppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityAppController.h; sourceTree = ""; }; - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityAppController.mm; sourceTree = ""; }; - 8A851BAB16FC875E00E911DB /* UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityInterface.h; sourceTree = ""; }; - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+UnityInterface.h"; sourceTree = ""; }; - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+UnityInterface.mm"; sourceTree = ""; }; - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityForwardDecls.h; sourceTree = ""; }; - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActivityIndicator.h; sourceTree = ""; }; - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ActivityIndicator.mm; sourceTree = ""; }; - 8AA108C01948732900D0538B /* UnityRendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityRendering.h; sourceTree = ""; }; - 8AA568AC1827DD79004969C7 /* WWWConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WWWConnection.h; sourceTree = ""; }; - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WWWConnection.mm; sourceTree = ""; }; - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+Rendering.h"; sourceTree = ""; }; - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+Rendering.mm"; sourceTree = ""; }; - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UnityTrampolineConfigure.h; sourceTree = ""; }; - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoPlayer.h; sourceTree = ""; }; - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = VideoPlayer.mm; sourceTree = ""; }; - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVCapture.h; sourceTree = ""; }; - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OrientationSupport.h; sourceTree = ""; }; - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OrientationSupport.mm; sourceTree = ""; }; - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AVCapture.mm; sourceTree = ""; }; - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DeviceSettings.mm; sourceTree = ""; }; - 8ACB801D177081F7005D0019 /* Preprocessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Preprocessor.h; sourceTree = ""; }; - 8ADCE38919C87177006F04F6 /* CameraCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CameraCapture.h; sourceTree = ""; }; - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CameraCapture.mm; sourceTree = ""; }; - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityMetalSupport.h; sourceTree = ""; }; - 8AF7755E17997D1300341121 /* AppDelegateListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegateListener.h; sourceTree = ""; }; - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegateListener.mm; sourceTree = ""; }; - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; path = appext.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 960391211D6CE46E003BF157 /* MediaToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaToolbox.framework; path = System/Library/Frameworks/MediaToolbox.framework; sourceTree = SDKROOT; }; - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = UnityAdsUnityWrapper.mm; path = UnityAds/UnityAdsUnityWrapper.mm; sourceTree = ""; }; - 999475381A80DBC300178130 /* UnityAdsConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UnityAdsConfig.h; path = UnityAds/UnityAdsConfig.h; sourceTree = ""; }; - AA31BF961B55660D0013FB1B /* Data */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Data; sourceTree = ""; }; - AA5D99861AFAD3C800B27605 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterFeatures.cpp; sourceTree = ""; }; - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterFeatures.h; sourceTree = ""; }; - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerListener.h; sourceTree = ""; }; - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerListener.mm; sourceTree = ""; }; - BBA14828996CB3D3322CD1DA /* TodayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TodayViewController.m; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.m"; sourceTree = SOURCE_ROOT; }; - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphicsMetal.h; path = Classes/Unity/IUnityGraphicsMetal.h; sourceTree = SOURCE_ROOT; }; - D82DCFBB0E8000A5005D6AD8 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = main.mm; path = Classes/main.mm; sourceTree = SOURCE_ROOT; }; - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterMonoModules.cpp; path = Libraries/RegisterMonoModules.cpp; sourceTree = SOURCE_ROOT; }; - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterMonoModules.h; path = Libraries/RegisterMonoModules.h; sourceTree = SOURCE_ROOT; }; - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libiPhone-lib.a"; path = "Libraries/libiPhone-lib.a"; sourceTree = SOURCE_ROOT; }; - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TodayViewController.h; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.h"; sourceTree = SOURCE_ROOT; }; - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhonePortrait.png"; sourceTree = SOURCE_ROOT; }; - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhoneLandscape.png"; sourceTree = SOURCE_ROOT; }; - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OnDemandResources.mm; sourceTree = ""; }; - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrashReporter.h; sourceTree = ""; }; - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CrashReporter.mm; sourceTree = ""; }; - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReporter.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 120943439F2C11A4A2EF8C58 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */, - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */, - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */, - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */, - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */, - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */, - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */, - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */, - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */, - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */, - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */, - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */, - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */, - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */, - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */, - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */, - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */, - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */, - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */, - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */, - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57017FDCB0800090B9E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */, - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */, - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */, - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */, - ); - name = Products; - sourceTree = ""; - }; - 28CC40F5AF3FB5752DB99021 /* Bugsnag */ = { - isa = PBXGroup; - children = ( - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */, - ); - path = Bugsnag; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - AA31BF961B55660D0013FB1B /* Data */, - 56C56C9717D6015100616839 /* Images.xcassets */, - D82DCFB50E8000A5005D6AD8 /* Classes */, - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - D8A1C7220E80637F000160D3 /* Libraries */, - 19C28FACFE9D520D11CA2CBB /* Products */, - 8D1107310486CEB800E47090 /* Info.plist */, - 83B2574E0E63025400468741 /* libiconv.2.dylib */, - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */, - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */, - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */, - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */, - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */, - 4C914EC99BFBF8DDC3DF16E6 /* appext */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 5BAD78601F2B5A59006103DE /* Security.framework */, - 960391211D6CE46E003BF157 /* MediaToolbox.framework */, - AA5D99861AFAD3C800B27605 /* CoreText.framework */, - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */, - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */, - 56FD43950ED4745200FE3770 /* CFNetwork.framework */, - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */, - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */, - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */, - 56B795C11442E1100026B3DD /* CoreMotion.framework */, - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */, - 83B2574B0E63022200468741 /* OpenAL.framework */, - 83B256E10E62FEA000468741 /* OpenGLES.framework */, - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */, - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */, - 830B5C100E5ED4C100C7819F /* UIKit.framework */, - 1C054391970787E9FCEBEA11 /* Metal.framework */, - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4C914EC99BFBF8DDC3DF16E6 /* appext */ = { - isa = PBXGroup; - children = ( - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */, - BBA14828996CB3D3322CD1DA /* TodayViewController.m */, - ); - path = appext; - sourceTree = ""; - }; - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXGroup; - children = ( - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */, - 5623C57917FDCB0800090B9E /* Supporting Files */, - ); - path = "Unity-iPhone Tests"; - sourceTree = ""; - }; - 5623C57917FDCB0800090B9E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */, - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */, - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 8A3EDDC51615B7C1001839E9 /* UI */ = { - isa = PBXGroup; - children = ( - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */, - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */, - 8A142DC41636943E00DD87CA /* Keyboard.h */, - 8A142DC51636943E00DD87CA /* Keyboard.mm */, - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */, - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */, - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */, - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */, - 4E090A331F27884B0077B28D /* StoreReview.m */, - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */, - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */, - 8A851BA516FB2F6D00E911DB /* UnityView.h */, - 8A851BA616FB2F6D00E911DB /* UnityView.mm */, - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */, - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */, - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */, - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */, - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */, - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */, - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */, - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */, - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */, - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */, - ); - path = UI; - sourceTree = ""; - }; - 8A5C148F174E662D0006EB36 /* PluginBase */ = { - isa = PBXGroup; - children = ( - 8AF7755E17997D1300341121 /* AppDelegateListener.h */, - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */, - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */, - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */, - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */, - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */, - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */, - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */, - ); - path = PluginBase; - sourceTree = ""; - }; - 8AF18FE316490981007B4420 /* Unity */ = { - isa = PBXGroup; - children = ( - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */, - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */, - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */, - 8ADCE38919C87177006F04F6 /* CameraCapture.h */, - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */, - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */, - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */, - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */, - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */, - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */, - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */, - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */, - 8A0FED471649699200E9727D /* EAGLContextHelper.h */, - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */, - 8A25E6D118D767E20006A227 /* Filesystem.mm */, - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */, - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */, - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */, - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */, - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */, - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */, - 8A6137121A10B57700059EDF /* ObjCRuntime.h */, - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */, - 8A851BAB16FC875E00E911DB /* UnityInterface.h */, - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */, - 8AA108C01948732900D0538B /* UnityRendering.h */, - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */, - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */, - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */, - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */, - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */, - 8AA568AC1827DD79004969C7 /* WWWConnection.h */, - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */, - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */, - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */, - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */, - ); - path = Unity; - sourceTree = ""; - }; - 91154904B5F8F49DA8EE103B /* iOS */ = { - isa = PBXGroup; - children = ( - 28CC40F5AF3FB5752DB99021 /* Bugsnag */, - ); - path = iOS; - sourceTree = ""; - }; - 999475211A7BC3B100178130 /* UnityAds */ = { - isa = PBXGroup; - children = ( - 999475381A80DBC300178130 /* UnityAdsConfig.h */, - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */, - ); - name = UnityAds; - sourceTree = ""; - }; - D82DCFB50E8000A5005D6AD8 /* Classes */ = { - isa = PBXGroup; - children = ( - 999475211A7BC3B100178130 /* UnityAds */, - 8A5C148F174E662D0006EB36 /* PluginBase */, - 8A3EDDC51615B7C1001839E9 /* UI */, - 8AF18FE316490981007B4420 /* Unity */, - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */, - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */, - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */, - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */, - D82DCFBB0E8000A5005D6AD8 /* main.mm */, - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */, - 8A6720A619EFAF25006C92E0 /* Prefix.pch */, - 8ACB801D177081F7005D0019 /* Preprocessor.h */, - 8A851BA816FB3AD000E911DB /* UnityAppController.h */, - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */, - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */, - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */, - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */, - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */, - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */, - ); - path = Classes; - sourceTree = SOURCE_ROOT; - }; - D8A1C7220E80637F000160D3 /* Libraries */ = { - isa = PBXGroup; - children = ( - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */, - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */, - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */, - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */, - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */, - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */, - E27B4946AEA62AAE76F8EAB0 /* Plugins */, - ); - path = Libraries; - sourceTree = SOURCE_ROOT; - }; - E27B4946AEA62AAE76F8EAB0 /* Plugins */ = { - isa = PBXGroup; - children = ( - 91154904B5F8F49DA8EE103B /* iOS */, - ); - path = Plugins; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00C64C33A163F6BBBC3998DE /* appext */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */; - buildPhases = ( - 1984447697B50992FF7B71F3 /* Sources */, - 7B84486ABE0D25523243AE77 /* Resources */, - 120943439F2C11A4A2EF8C58 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = appext; - productName = appext; - productReference = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - 5D0844359B6763E1774306B4 /* Embed App Extensions */, - ); - buildRules = ( - ); - dependencies = ( - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */, - ); - name = "Unity-iPhone"; - productName = "iPhone-target"; - productReference = 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */; - productType = "com.apple.product-type.application"; - }; - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */; - buildPhases = ( - 5623C56F17FDCB0800090B9E /* Sources */, - 5623C57017FDCB0800090B9E /* Frameworks */, - 5623C57117FDCB0800090B9E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5623C58217FDCB0900090B9E /* PBXTargetDependency */, - ); - name = "Unity-iPhone Tests"; - productName = "Unity-iPhone Tests"; - productReference = 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - TargetAttributes = { - 1D6058900D05DD3D006BFB54 = { - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.GameControllers.appletvos = { - enabled = 1; - }; - }; - }; - 5623C57217FDCB0800090B9E = { - ProvisioningStyle = Automatic; - TestTargetID = 1D6058900D05DD3D006BFB54; - }; - }; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */; - compatibilityVersion = "Xcode 10.0"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */, - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */, - 00C64C33A163F6BBBC3998DE /* appext */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - AA31BF971B55660D0013FB1B /* Data in Resources */, - 56C56C9817D6015200616839 /* Images.xcassets in Resources */, - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */, - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */, - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */, - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */, - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57117FDCB0800090B9E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7B84486ABE0D25523243AE77 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1984447697B50992FF7B71F3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */, - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */, - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */, - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */, - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */, - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */, - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */, - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */, - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */, - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */, - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */, - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */, - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */, - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */, - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */, - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */, - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */, - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */, - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */, - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */, - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */, - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */, - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */, - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */, - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */, - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */, - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */, - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */, - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */, - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */, - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */, - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */, - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */, - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */, - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */, - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */, - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */, - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */, - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */, - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */, - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */, - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */, - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C56F17FDCB0800090B9E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 5623C58217FDCB0900090B9E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1D6058900D05DD3D006BFB54 /* Unity-iPhone */; - targetProxy = 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */; - }; - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 00C64C33A163F6BBBC3998DE /* appext */; - targetProxy = FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 5623C57C17FDCB0900090B9E /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 11A74F8AB335D5F126F703F3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Release; - }; - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForProfiling; - }; - 5623C58317FDCB0900090B9E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = Release; - }; - 5623C58417FDCB0900090B9E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - WRAPPER_EXTENSION = xctest; - }; - name = Debug; - }; - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForRunning; - }; - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForRunning; - }; - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForRunning; - }; - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForProfiling; - }; - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForProfiling; - }; - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForProfiling; - }; - 6A04449D84D369E35D722281 /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForRunning; - }; - A48A4D2186B6EBC59CF4A94E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058950D05DD3E006BFB54 /* Release */, - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */, - 1D6058940D05DD3E006BFB54 /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 11A74F8AB335D5F126F703F3 /* Release */, - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */, - 6A04449D84D369E35D722281 /* ReleaseForRunning */, - A48A4D2186B6EBC59CF4A94E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5623C58317FDCB0900090B9E /* Release */, - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */, - 5623C58417FDCB0900090B9E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF5008A954540054247B /* Release */, - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */, - C01FCF4F08A954540054247B /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/tests/BugsnagUnity.Tests/ProjectFixtures/test_one_output.pbxproj b/tests/BugsnagUnity.Tests/ProjectFixtures/test_one_output.pbxproj deleted file mode 100644 index be0e82dc7..000000000 --- a/tests/BugsnagUnity.Tests/ProjectFixtures/test_one_output.pbxproj +++ /dev/null @@ -1,1411 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 51; - objects = { - -/* Begin PBXBuildFile section */ - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */; }; - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */; }; - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */ = {isa = PBXBuildFile; fileRef = F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */; }; - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; }; - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E090A331F27884B0077B28D /* StoreReview.m */; }; - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5623C57B17FDCB0900090B9E /* InfoPlist.strings */; }; - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */; }; - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */; }; - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */; }; - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */; }; - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B795C11442E1100026B3DD /* CoreMotion.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */; }; - 56C56C9817D6015200616839 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 56C56C9717D6015100616839 /* Images.xcassets */; }; - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */ = {isa = PBXBuildFile; fileRef = 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */; }; - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56FD43950ED4745200FE3770 /* CFNetwork.framework */; }; - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA14828996CB3D3322CD1DA /* TodayViewController.m */; }; - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BAD78601F2B5A59006103DE /* Security.framework */; }; - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */; }; - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */; }; - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */; }; - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */; }; - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B256E10E62FEA000468741 /* OpenGLES.framework */; }; - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2570A0E62FF8A00468741 /* QuartzCore.framework */; }; - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574B0E63022200468741 /* OpenAL.framework */; }; - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574E0E63025400468741 /* libiconv.2.dylib */; }; - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */ = {isa = PBXBuildFile; fileRef = 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */; }; - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */; }; - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */ = {isa = PBXBuildFile; fileRef = E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */; }; - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A0FED481649699200E9727D /* EAGLContextHelper.mm */; }; - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A142DC51636943E00DD87CA /* Keyboard.mm */; }; - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */; }; - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */; }; - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A25E6D118D767E20006A227 /* Filesystem.mm */; }; - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */; }; - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */; }; - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */; }; - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */; }; - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */; }; - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */; }; - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */; }; - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */; }; - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */; }; - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */; }; - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */; }; - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */; }; - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA616FB2F6D00E911DB /* UnityView.mm */; }; - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA916FB3AD000E911DB /* UnityAppController.mm */; }; - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */; }; - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */; }; - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA568AD1827DD79004969C7 /* WWWConnection.mm */; }; - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */; }; - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */; }; - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */; }; - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC74A9419B47FEF00019D38 /* AVCapture.mm */; }; - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ACB801B177081D4005D0019 /* DeviceSettings.mm */; }; - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */; }; - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */; }; - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AF7755F17997D1300341121 /* AppDelegateListener.mm */; }; - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */; }; - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960391211D6CE46E003BF157 /* MediaToolbox.framework */; }; - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */; }; - AA31BF971B55660D0013FB1B /* Data in Resources */ = {isa = PBXBuildFile; fileRef = AA31BF961B55660D0013FB1B /* Data */; }; - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA5D99861AFAD3C800B27605 /* CoreText.framework */; }; - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */; }; - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */; }; - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C054391970787E9FCEBEA11 /* Metal.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */; }; - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D82DCFBB0E8000A5005D6AD8 /* main.mm */; }; - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */; }; - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */; }; - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */; }; - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1D6058900D05DD3D006BFB54; - remoteInfo = "Unity-iPhone"; - }; - FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 00C64C33A163F6BBBC3998DE; - remoteInfo = appext; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 5D0844359B6763E1774306B4 /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Il2CppOptions.cpp; sourceTree = ""; }; - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityInterface.h; path = Classes/Unity/IUnityInterface.h; sourceTree = SOURCE_ROOT; }; - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalHelper.mm; sourceTree = ""; }; - 1C054391970787E9FCEBEA11 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = "Unity-Target-New.app"; path = ProductName.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPad.png"; sourceTree = SOURCE_ROOT; }; - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphics.h; path = Classes/Unity/IUnityGraphics.h; sourceTree = SOURCE_ROOT; }; - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; - 4E090A331F27884B0077B28D /* StoreReview.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StoreReview.m; sourceTree = ""; }; - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPad.xib"; sourceTree = SOURCE_ROOT; }; - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "Unity-iPhone Tests.xctest"; path = ProductName.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Unity-iPhone Tests-Info.plist"; sourceTree = ""; }; - 5623C57C17FDCB0900090B9E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Unity_iPhone_Tests.m; sourceTree = ""; }; - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Unity-iPhone Tests-Prefix.pch"; sourceTree = ""; }; - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 56B795C11442E1100026B3DD /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 56C56C9717D6015100616839 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "Unity-iPhone/Images.xcassets"; sourceTree = ""; }; - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iPhone_Sensors.mm; sourceTree = ""; }; - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhone_Sensors.h; sourceTree = ""; }; - 56FD43950ED4745200FE3770 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; - 5BAD78601F2B5A59006103DE /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libbugsnag-ios.a"; path = "Libraries/Plugins/iOS/Bugsnag/libbugsnag-ios.a"; sourceTree = SOURCE_ROOT; }; - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPhone.xib"; sourceTree = SOURCE_ROOT; }; - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 830B5C100E5ED4C100C7819F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 83B256E10E62FEA000468741 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 83B2574B0E63022200468741 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; - 83B2574E0E63025400468741 /* libiconv.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.2.dylib; path = usr/lib/libiconv.2.dylib; sourceTree = SDKROOT; }; - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit_Scripting.mm; sourceTree = ""; }; - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit.mm; sourceTree = ""; }; - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityReplayKit.h; sourceTree = ""; }; - 8A0FED471649699200E9727D /* EAGLContextHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAGLContextHelper.h; sourceTree = ""; }; - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EAGLContextHelper.mm; sourceTree = ""; }; - 8A142DC41636943E00DD87CA /* Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = ""; }; - 8A142DC51636943E00DD87CA /* Keyboard.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Keyboard.mm; sourceTree = ""; }; - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FullScreenVideoPlayer.mm; sourceTree = ""; }; - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlesHelper.h; sourceTree = ""; }; - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GlesHelper.mm; sourceTree = ""; }; - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerBase.h; sourceTree = ""; }; - 8A25E6D118D767E20006A227 /* Filesystem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Filesystem.mm; sourceTree = ""; }; - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LifeCycleListener.h; sourceTree = ""; }; - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = LifeCycleListener.mm; sourceTree = ""; }; - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMVideoSampling.h; sourceTree = ""; }; - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CMVideoSampling.mm; sourceTree = ""; }; - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CVTextureCache.h; sourceTree = ""; }; - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CVTextureCache.mm; sourceTree = ""; }; - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SplashScreen.h; sourceTree = ""; }; - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SplashScreen.mm; sourceTree = ""; }; - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+ViewHandling.h"; sourceTree = ""; }; - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+ViewHandling.mm"; sourceTree = ""; }; - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderPluginDelegate.h; sourceTree = ""; }; - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RenderPluginDelegate.mm; sourceTree = ""; }; - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayManager.h; sourceTree = ""; }; - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DisplayManager.mm; sourceTree = ""; }; - 8A6137121A10B57700059EDF /* ObjCRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjCRuntime.h; sourceTree = ""; }; - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InternalProfiler.cpp; sourceTree = ""; }; - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InternalProfiler.h; sourceTree = ""; }; - 8A6720A619EFAF25006C92E0 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerBase.mm; sourceTree = ""; }; - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+iOS.h"; sourceTree = ""; }; - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+iOS.mm"; sourceTree = ""; }; - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+tvOS.h"; sourceTree = ""; }; - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+tvOS.mm"; sourceTree = ""; }; - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+iOS.h"; sourceTree = ""; }; - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+iOS.mm"; sourceTree = ""; }; - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+tvOS.h"; sourceTree = ""; }; - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+tvOS.mm"; sourceTree = ""; }; - 8A851BA516FB2F6D00E911DB /* UnityView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityView.h; sourceTree = ""; }; - 8A851BA616FB2F6D00E911DB /* UnityView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityView.mm; sourceTree = ""; }; - 8A851BA816FB3AD000E911DB /* UnityAppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityAppController.h; sourceTree = ""; }; - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityAppController.mm; sourceTree = ""; }; - 8A851BAB16FC875E00E911DB /* UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityInterface.h; sourceTree = ""; }; - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+UnityInterface.h"; sourceTree = ""; }; - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+UnityInterface.mm"; sourceTree = ""; }; - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityForwardDecls.h; sourceTree = ""; }; - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActivityIndicator.h; sourceTree = ""; }; - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ActivityIndicator.mm; sourceTree = ""; }; - 8AA108C01948732900D0538B /* UnityRendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityRendering.h; sourceTree = ""; }; - 8AA568AC1827DD79004969C7 /* WWWConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WWWConnection.h; sourceTree = ""; }; - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WWWConnection.mm; sourceTree = ""; }; - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+Rendering.h"; sourceTree = ""; }; - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+Rendering.mm"; sourceTree = ""; }; - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UnityTrampolineConfigure.h; sourceTree = ""; }; - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoPlayer.h; sourceTree = ""; }; - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = VideoPlayer.mm; sourceTree = ""; }; - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVCapture.h; sourceTree = ""; }; - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OrientationSupport.h; sourceTree = ""; }; - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OrientationSupport.mm; sourceTree = ""; }; - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AVCapture.mm; sourceTree = ""; }; - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DeviceSettings.mm; sourceTree = ""; }; - 8ACB801D177081F7005D0019 /* Preprocessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Preprocessor.h; sourceTree = ""; }; - 8ADCE38919C87177006F04F6 /* CameraCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CameraCapture.h; sourceTree = ""; }; - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CameraCapture.mm; sourceTree = ""; }; - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityMetalSupport.h; sourceTree = ""; }; - 8AF7755E17997D1300341121 /* AppDelegateListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegateListener.h; sourceTree = ""; }; - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegateListener.mm; sourceTree = ""; }; - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; path = appext.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 960391211D6CE46E003BF157 /* MediaToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaToolbox.framework; path = System/Library/Frameworks/MediaToolbox.framework; sourceTree = SDKROOT; }; - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = UnityAdsUnityWrapper.mm; path = UnityAds/UnityAdsUnityWrapper.mm; sourceTree = ""; }; - 999475381A80DBC300178130 /* UnityAdsConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UnityAdsConfig.h; path = UnityAds/UnityAdsConfig.h; sourceTree = ""; }; - AA31BF961B55660D0013FB1B /* Data */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Data; sourceTree = ""; }; - AA5D99861AFAD3C800B27605 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterFeatures.cpp; sourceTree = ""; }; - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterFeatures.h; sourceTree = ""; }; - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerListener.h; sourceTree = ""; }; - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerListener.mm; sourceTree = ""; }; - BBA14828996CB3D3322CD1DA /* TodayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TodayViewController.m; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.m"; sourceTree = SOURCE_ROOT; }; - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphicsMetal.h; path = Classes/Unity/IUnityGraphicsMetal.h; sourceTree = SOURCE_ROOT; }; - D82DCFBB0E8000A5005D6AD8 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = main.mm; path = Classes/main.mm; sourceTree = SOURCE_ROOT; }; - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterMonoModules.cpp; path = Libraries/RegisterMonoModules.cpp; sourceTree = SOURCE_ROOT; }; - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterMonoModules.h; path = Libraries/RegisterMonoModules.h; sourceTree = SOURCE_ROOT; }; - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libiPhone-lib.a"; path = "Libraries/libiPhone-lib.a"; sourceTree = SOURCE_ROOT; }; - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TodayViewController.h; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.h"; sourceTree = SOURCE_ROOT; }; - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhonePortrait.png"; sourceTree = SOURCE_ROOT; }; - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhoneLandscape.png"; sourceTree = SOURCE_ROOT; }; - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OnDemandResources.mm; sourceTree = ""; }; - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrashReporter.h; sourceTree = ""; }; - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CrashReporter.mm; sourceTree = ""; }; - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReporter.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 120943439F2C11A4A2EF8C58 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */, - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */, - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */, - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */, - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */, - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */, - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */, - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */, - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */, - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */, - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */, - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */, - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */, - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */, - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */, - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */, - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */, - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */, - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */, - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */, - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57017FDCB0800090B9E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */, - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */, - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */, - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */, - ); - name = Products; - sourceTree = ""; - }; - 28CC40F5AF3FB5752DB99021 /* Bugsnag */ = { - isa = PBXGroup; - children = ( - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */, - ); - path = Bugsnag; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - AA31BF961B55660D0013FB1B /* Data */, - 56C56C9717D6015100616839 /* Images.xcassets */, - D82DCFB50E8000A5005D6AD8 /* Classes */, - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - D8A1C7220E80637F000160D3 /* Libraries */, - 19C28FACFE9D520D11CA2CBB /* Products */, - 8D1107310486CEB800E47090 /* Info.plist */, - 83B2574E0E63025400468741 /* libiconv.2.dylib */, - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */, - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */, - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */, - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */, - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */, - 4C914EC99BFBF8DDC3DF16E6 /* appext */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 5BAD78601F2B5A59006103DE /* Security.framework */, - 960391211D6CE46E003BF157 /* MediaToolbox.framework */, - AA5D99861AFAD3C800B27605 /* CoreText.framework */, - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */, - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */, - 56FD43950ED4745200FE3770 /* CFNetwork.framework */, - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */, - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */, - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */, - 56B795C11442E1100026B3DD /* CoreMotion.framework */, - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */, - 83B2574B0E63022200468741 /* OpenAL.framework */, - 83B256E10E62FEA000468741 /* OpenGLES.framework */, - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */, - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */, - 830B5C100E5ED4C100C7819F /* UIKit.framework */, - 1C054391970787E9FCEBEA11 /* Metal.framework */, - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4C914EC99BFBF8DDC3DF16E6 /* appext */ = { - isa = PBXGroup; - children = ( - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */, - BBA14828996CB3D3322CD1DA /* TodayViewController.m */, - ); - path = appext; - sourceTree = ""; - }; - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXGroup; - children = ( - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */, - 5623C57917FDCB0800090B9E /* Supporting Files */, - ); - path = "Unity-iPhone Tests"; - sourceTree = ""; - }; - 5623C57917FDCB0800090B9E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */, - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */, - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 8A3EDDC51615B7C1001839E9 /* UI */ = { - isa = PBXGroup; - children = ( - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */, - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */, - 8A142DC41636943E00DD87CA /* Keyboard.h */, - 8A142DC51636943E00DD87CA /* Keyboard.mm */, - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */, - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */, - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */, - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */, - 4E090A331F27884B0077B28D /* StoreReview.m */, - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */, - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */, - 8A851BA516FB2F6D00E911DB /* UnityView.h */, - 8A851BA616FB2F6D00E911DB /* UnityView.mm */, - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */, - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */, - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */, - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */, - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */, - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */, - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */, - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */, - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */, - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */, - ); - path = UI; - sourceTree = ""; - }; - 8A5C148F174E662D0006EB36 /* PluginBase */ = { - isa = PBXGroup; - children = ( - 8AF7755E17997D1300341121 /* AppDelegateListener.h */, - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */, - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */, - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */, - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */, - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */, - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */, - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */, - ); - path = PluginBase; - sourceTree = ""; - }; - 8AF18FE316490981007B4420 /* Unity */ = { - isa = PBXGroup; - children = ( - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */, - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */, - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */, - 8ADCE38919C87177006F04F6 /* CameraCapture.h */, - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */, - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */, - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */, - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */, - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */, - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */, - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */, - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */, - 8A0FED471649699200E9727D /* EAGLContextHelper.h */, - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */, - 8A25E6D118D767E20006A227 /* Filesystem.mm */, - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */, - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */, - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */, - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */, - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */, - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */, - 8A6137121A10B57700059EDF /* ObjCRuntime.h */, - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */, - 8A851BAB16FC875E00E911DB /* UnityInterface.h */, - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */, - 8AA108C01948732900D0538B /* UnityRendering.h */, - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */, - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */, - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */, - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */, - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */, - 8AA568AC1827DD79004969C7 /* WWWConnection.h */, - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */, - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */, - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */, - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */, - ); - path = Unity; - sourceTree = ""; - }; - 91154904B5F8F49DA8EE103B /* iOS */ = { - isa = PBXGroup; - children = ( - 28CC40F5AF3FB5752DB99021 /* Bugsnag */, - ); - path = iOS; - sourceTree = ""; - }; - 999475211A7BC3B100178130 /* UnityAds */ = { - isa = PBXGroup; - children = ( - 999475381A80DBC300178130 /* UnityAdsConfig.h */, - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */, - ); - name = UnityAds; - sourceTree = ""; - }; - D82DCFB50E8000A5005D6AD8 /* Classes */ = { - isa = PBXGroup; - children = ( - 999475211A7BC3B100178130 /* UnityAds */, - 8A5C148F174E662D0006EB36 /* PluginBase */, - 8A3EDDC51615B7C1001839E9 /* UI */, - 8AF18FE316490981007B4420 /* Unity */, - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */, - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */, - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */, - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */, - D82DCFBB0E8000A5005D6AD8 /* main.mm */, - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */, - 8A6720A619EFAF25006C92E0 /* Prefix.pch */, - 8ACB801D177081F7005D0019 /* Preprocessor.h */, - 8A851BA816FB3AD000E911DB /* UnityAppController.h */, - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */, - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */, - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */, - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */, - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */, - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */, - ); - path = Classes; - sourceTree = SOURCE_ROOT; - }; - D8A1C7220E80637F000160D3 /* Libraries */ = { - isa = PBXGroup; - children = ( - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */, - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */, - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */, - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */, - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */, - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */, - E27B4946AEA62AAE76F8EAB0 /* Plugins */, - ); - path = Libraries; - sourceTree = SOURCE_ROOT; - }; - E27B4946AEA62AAE76F8EAB0 /* Plugins */ = { - isa = PBXGroup; - children = ( - 91154904B5F8F49DA8EE103B /* iOS */, - ); - path = Plugins; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00C64C33A163F6BBBC3998DE /* appext */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */; - buildPhases = ( - 1984447697B50992FF7B71F3 /* Sources */, - 7B84486ABE0D25523243AE77 /* Resources */, - 120943439F2C11A4A2EF8C58 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = appext; - productName = appext; - productReference = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - 5D0844359B6763E1774306B4 /* Embed App Extensions */, - ); - buildRules = ( - ); - dependencies = ( - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */, - ); - name = "Unity-iPhone"; - productName = "iPhone-target"; - productReference = 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */; - productType = "com.apple.product-type.application"; - }; - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */; - buildPhases = ( - 5623C56F17FDCB0800090B9E /* Sources */, - 5623C57017FDCB0800090B9E /* Frameworks */, - 5623C57117FDCB0800090B9E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5623C58217FDCB0900090B9E /* PBXTargetDependency */, - ); - name = "Unity-iPhone Tests"; - productName = "Unity-iPhone Tests"; - productReference = 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - TargetAttributes = { - 1D6058900D05DD3D006BFB54 = { - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.GameControllers.appletvos = { - enabled = 1; - }; - }; - }; - 5623C57217FDCB0800090B9E = { - ProvisioningStyle = Automatic; - TestTargetID = 1D6058900D05DD3D006BFB54; - }; - }; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */; - compatibilityVersion = "Xcode 10.0"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */, - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */, - 00C64C33A163F6BBBC3998DE /* appext */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - AA31BF971B55660D0013FB1B /* Data in Resources */, - 56C56C9817D6015200616839 /* Images.xcassets in Resources */, - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */, - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */, - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */, - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */, - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57117FDCB0800090B9E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7B84486ABE0D25523243AE77 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1984447697B50992FF7B71F3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */, - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */, - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */, - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */, - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */, - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */, - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */, - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */, - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */, - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */, - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */, - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */, - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */, - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */, - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */, - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */, - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */, - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */, - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */, - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */, - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */, - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */, - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */, - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */, - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */, - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */, - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */, - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */, - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */, - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */, - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */, - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */, - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */, - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */, - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */, - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */, - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */, - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */, - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */, - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */, - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */, - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */, - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C56F17FDCB0800090B9E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 5623C58217FDCB0900090B9E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1D6058900D05DD3D006BFB54 /* Unity-iPhone */; - targetProxy = 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */; - }; - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 00C64C33A163F6BBBC3998DE /* appext */; - targetProxy = FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 5623C57C17FDCB0900090B9E /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 11A74F8AB335D5F126F703F3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Release; - }; - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForProfiling; - }; - 5623C58317FDCB0900090B9E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = Release; - }; - 5623C58417FDCB0900090B9E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - WRAPPER_EXTENSION = xctest; - }; - name = Debug; - }; - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForRunning; - }; - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForRunning; - }; - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForRunning; - }; - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForProfiling; - }; - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForProfiling; - }; - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForProfiling; - }; - 6A04449D84D369E35D722281 /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForRunning; - }; - A48A4D2186B6EBC59CF4A94E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058950D05DD3E006BFB54 /* Release */, - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */, - 1D6058940D05DD3E006BFB54 /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 11A74F8AB335D5F126F703F3 /* Release */, - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */, - 6A04449D84D369E35D722281 /* ReleaseForRunning */, - A48A4D2186B6EBC59CF4A94E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5623C58317FDCB0900090B9E /* Release */, - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */, - 5623C58417FDCB0900090B9E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF5008A954540054247B /* Release */, - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */, - C01FCF4F08A954540054247B /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/tests/BugsnagUnity.Tests/ProjectFixtures/test_three_input.pbxproj b/tests/BugsnagUnity.Tests/ProjectFixtures/test_three_input.pbxproj deleted file mode 100644 index f7c8535e6..000000000 --- a/tests/BugsnagUnity.Tests/ProjectFixtures/test_three_input.pbxproj +++ /dev/null @@ -1,1411 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 51; - objects = { - -/* Begin PBXBuildFile section */ - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */; }; - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */; }; - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */ = {isa = PBXBuildFile; fileRef = F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */; }; - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; }; - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E090A331F27884B0077B28D /* StoreReview.m */; }; - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5623C57B17FDCB0900090B9E /* InfoPlist.strings */; }; - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */; }; - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */; }; - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */; }; - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */; }; - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B795C11442E1100026B3DD /* CoreMotion.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */; }; - 56C56C9817D6015200616839 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 56C56C9717D6015100616839 /* Images.xcassets */; }; - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */ = {isa = PBXBuildFile; fileRef = 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */; }; - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56FD43950ED4745200FE3770 /* CFNetwork.framework */; }; - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA14828996CB3D3322CD1DA /* TodayViewController.m */; }; - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BAD78601F2B5A59006103DE /* Security.framework */; }; - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */; }; - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */; }; - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */; }; - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */; }; - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B256E10E62FEA000468741 /* OpenGLES.framework */; }; - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2570A0E62FF8A00468741 /* QuartzCore.framework */; }; - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574B0E63022200468741 /* OpenAL.framework */; }; - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574E0E63025400468741 /* libiconv.2.dylib */; }; - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */ = {isa = PBXBuildFile; fileRef = 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */; }; - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */; }; - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */ = {isa = PBXBuildFile; fileRef = E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */; }; - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A0FED481649699200E9727D /* EAGLContextHelper.mm */; }; - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A142DC51636943E00DD87CA /* Keyboard.mm */; }; - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */; }; - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */; }; - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A25E6D118D767E20006A227 /* Filesystem.mm */; }; - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */; }; - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */; }; - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */; }; - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */; }; - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */; }; - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */; }; - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */; }; - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */; }; - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */; }; - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */; }; - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */; }; - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */; }; - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA616FB2F6D00E911DB /* UnityView.mm */; }; - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA916FB3AD000E911DB /* UnityAppController.mm */; }; - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */; }; - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */; }; - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA568AD1827DD79004969C7 /* WWWConnection.mm */; }; - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */; }; - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */; }; - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */; }; - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC74A9419B47FEF00019D38 /* AVCapture.mm */; }; - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ACB801B177081D4005D0019 /* DeviceSettings.mm */; }; - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */; }; - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */; }; - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AF7755F17997D1300341121 /* AppDelegateListener.mm */; }; - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */; }; - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960391211D6CE46E003BF157 /* MediaToolbox.framework */; }; - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */; }; - AA31BF971B55660D0013FB1B /* Data in Resources */ = {isa = PBXBuildFile; fileRef = AA31BF961B55660D0013FB1B /* Data */; }; - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA5D99861AFAD3C800B27605 /* CoreText.framework */; }; - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */; }; - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */; }; - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C054391970787E9FCEBEA11 /* Metal.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */; }; - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D82DCFBB0E8000A5005D6AD8 /* main.mm */; }; - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */; }; - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */; }; - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */; }; - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1D6058900D05DD3D006BFB54; - remoteInfo = "Unity-iPhone"; - }; - FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 00C64C33A163F6BBBC3998DE; - remoteInfo = appext; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 5D0844359B6763E1774306B4 /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Il2CppOptions.cpp; sourceTree = ""; }; - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityInterface.h; path = Classes/Unity/IUnityInterface.h; sourceTree = SOURCE_ROOT; }; - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalHelper.mm; sourceTree = ""; }; - 1C054391970787E9FCEBEA11 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = "Unity-Target-New.app"; path = ProductName.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPad.png"; sourceTree = SOURCE_ROOT; }; - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphics.h; path = Classes/Unity/IUnityGraphics.h; sourceTree = SOURCE_ROOT; }; - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; - 4E090A331F27884B0077B28D /* StoreReview.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StoreReview.m; sourceTree = ""; }; - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPad.xib"; sourceTree = SOURCE_ROOT; }; - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "Unity-iPhone Tests.xctest"; path = ProductName.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Unity-iPhone Tests-Info.plist"; sourceTree = ""; }; - 5623C57C17FDCB0900090B9E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Unity_iPhone_Tests.m; sourceTree = ""; }; - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Unity-iPhone Tests-Prefix.pch"; sourceTree = ""; }; - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 56B795C11442E1100026B3DD /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 56C56C9717D6015100616839 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "Unity-iPhone/Images.xcassets"; sourceTree = ""; }; - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iPhone_Sensors.mm; sourceTree = ""; }; - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhone_Sensors.h; sourceTree = ""; }; - 56FD43950ED4745200FE3770 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; - 5BAD78601F2B5A59006103DE /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libbugsnag-ios.a"; path = "Libraries/Plugins/iOS/Bugsnag/libbugsnag-ios.a"; sourceTree = SOURCE_ROOT; }; - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPhone.xib"; sourceTree = SOURCE_ROOT; }; - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 830B5C100E5ED4C100C7819F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 83B256E10E62FEA000468741 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 83B2574B0E63022200468741 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; - 83B2574E0E63025400468741 /* libiconv.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.2.dylib; path = usr/lib/libiconv.2.dylib; sourceTree = SDKROOT; }; - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit_Scripting.mm; sourceTree = ""; }; - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit.mm; sourceTree = ""; }; - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityReplayKit.h; sourceTree = ""; }; - 8A0FED471649699200E9727D /* EAGLContextHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAGLContextHelper.h; sourceTree = ""; }; - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EAGLContextHelper.mm; sourceTree = ""; }; - 8A142DC41636943E00DD87CA /* Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = ""; }; - 8A142DC51636943E00DD87CA /* Keyboard.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Keyboard.mm; sourceTree = ""; }; - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FullScreenVideoPlayer.mm; sourceTree = ""; }; - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlesHelper.h; sourceTree = ""; }; - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GlesHelper.mm; sourceTree = ""; }; - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerBase.h; sourceTree = ""; }; - 8A25E6D118D767E20006A227 /* Filesystem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Filesystem.mm; sourceTree = ""; }; - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LifeCycleListener.h; sourceTree = ""; }; - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = LifeCycleListener.mm; sourceTree = ""; }; - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMVideoSampling.h; sourceTree = ""; }; - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CMVideoSampling.mm; sourceTree = ""; }; - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CVTextureCache.h; sourceTree = ""; }; - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CVTextureCache.mm; sourceTree = ""; }; - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SplashScreen.h; sourceTree = ""; }; - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SplashScreen.mm; sourceTree = ""; }; - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+ViewHandling.h"; sourceTree = ""; }; - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+ViewHandling.mm"; sourceTree = ""; }; - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderPluginDelegate.h; sourceTree = ""; }; - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RenderPluginDelegate.mm; sourceTree = ""; }; - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayManager.h; sourceTree = ""; }; - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DisplayManager.mm; sourceTree = ""; }; - 8A6137121A10B57700059EDF /* ObjCRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjCRuntime.h; sourceTree = ""; }; - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InternalProfiler.cpp; sourceTree = ""; }; - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InternalProfiler.h; sourceTree = ""; }; - 8A6720A619EFAF25006C92E0 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerBase.mm; sourceTree = ""; }; - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+iOS.h"; sourceTree = ""; }; - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+iOS.mm"; sourceTree = ""; }; - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+tvOS.h"; sourceTree = ""; }; - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+tvOS.mm"; sourceTree = ""; }; - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+iOS.h"; sourceTree = ""; }; - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+iOS.mm"; sourceTree = ""; }; - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+tvOS.h"; sourceTree = ""; }; - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+tvOS.mm"; sourceTree = ""; }; - 8A851BA516FB2F6D00E911DB /* UnityView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityView.h; sourceTree = ""; }; - 8A851BA616FB2F6D00E911DB /* UnityView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityView.mm; sourceTree = ""; }; - 8A851BA816FB3AD000E911DB /* UnityAppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityAppController.h; sourceTree = ""; }; - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityAppController.mm; sourceTree = ""; }; - 8A851BAB16FC875E00E911DB /* UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityInterface.h; sourceTree = ""; }; - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+UnityInterface.h"; sourceTree = ""; }; - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+UnityInterface.mm"; sourceTree = ""; }; - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityForwardDecls.h; sourceTree = ""; }; - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActivityIndicator.h; sourceTree = ""; }; - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ActivityIndicator.mm; sourceTree = ""; }; - 8AA108C01948732900D0538B /* UnityRendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityRendering.h; sourceTree = ""; }; - 8AA568AC1827DD79004969C7 /* WWWConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WWWConnection.h; sourceTree = ""; }; - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WWWConnection.mm; sourceTree = ""; }; - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+Rendering.h"; sourceTree = ""; }; - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+Rendering.mm"; sourceTree = ""; }; - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UnityTrampolineConfigure.h; sourceTree = ""; }; - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoPlayer.h; sourceTree = ""; }; - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = VideoPlayer.mm; sourceTree = ""; }; - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVCapture.h; sourceTree = ""; }; - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OrientationSupport.h; sourceTree = ""; }; - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OrientationSupport.mm; sourceTree = ""; }; - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AVCapture.mm; sourceTree = ""; }; - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DeviceSettings.mm; sourceTree = ""; }; - 8ACB801D177081F7005D0019 /* Preprocessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Preprocessor.h; sourceTree = ""; }; - 8ADCE38919C87177006F04F6 /* CameraCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CameraCapture.h; sourceTree = ""; }; - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CameraCapture.mm; sourceTree = ""; }; - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityMetalSupport.h; sourceTree = ""; }; - 8AF7755E17997D1300341121 /* AppDelegateListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegateListener.h; sourceTree = ""; }; - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegateListener.mm; sourceTree = ""; }; - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; path = appext.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 960391211D6CE46E003BF157 /* MediaToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaToolbox.framework; path = System/Library/Frameworks/MediaToolbox.framework; sourceTree = SDKROOT; }; - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = UnityAdsUnityWrapper.mm; path = UnityAds/UnityAdsUnityWrapper.mm; sourceTree = ""; }; - 999475381A80DBC300178130 /* UnityAdsConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UnityAdsConfig.h; path = UnityAds/UnityAdsConfig.h; sourceTree = ""; }; - AA31BF961B55660D0013FB1B /* Data */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Data; sourceTree = ""; }; - AA5D99861AFAD3C800B27605 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterFeatures.cpp; sourceTree = ""; }; - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterFeatures.h; sourceTree = ""; }; - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerListener.h; sourceTree = ""; }; - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerListener.mm; sourceTree = ""; }; - BBA14828996CB3D3322CD1DA /* TodayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TodayViewController.m; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.m"; sourceTree = SOURCE_ROOT; }; - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphicsMetal.h; path = Classes/Unity/IUnityGraphicsMetal.h; sourceTree = SOURCE_ROOT; }; - D82DCFBB0E8000A5005D6AD8 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = main.mm; path = Classes/main.mm; sourceTree = SOURCE_ROOT; }; - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterMonoModules.cpp; path = Libraries/RegisterMonoModules.cpp; sourceTree = SOURCE_ROOT; }; - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterMonoModules.h; path = Libraries/RegisterMonoModules.h; sourceTree = SOURCE_ROOT; }; - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libiPhone-lib.a"; path = "Libraries/libiPhone-lib.a"; sourceTree = SOURCE_ROOT; }; - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TodayViewController.h; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.h"; sourceTree = SOURCE_ROOT; }; - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhonePortrait.png"; sourceTree = SOURCE_ROOT; }; - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhoneLandscape.png"; sourceTree = SOURCE_ROOT; }; - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OnDemandResources.mm; sourceTree = ""; }; - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrashReporter.h; sourceTree = ""; }; - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CrashReporter.mm; sourceTree = ""; }; - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReporter.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 120943439F2C11A4A2EF8C58 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */, - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */, - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */, - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */, - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */, - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */, - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */, - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */, - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */, - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */, - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */, - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */, - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */, - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */, - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */, - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */, - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */, - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */, - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */, - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */, - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57017FDCB0800090B9E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */, - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */, - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */, - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */, - ); - name = Products; - sourceTree = ""; - }; - 28CC40F5AF3FB5752DB99021 /* Bugsnag */ = { - isa = PBXGroup; - children = ( - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */, - ); - path = Bugsnag; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - AA31BF961B55660D0013FB1B /* Data */, - 56C56C9717D6015100616839 /* Images.xcassets */, - D82DCFB50E8000A5005D6AD8 /* Classes */, - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - D8A1C7220E80637F000160D3 /* Libraries */, - 19C28FACFE9D520D11CA2CBB /* Products */, - 8D1107310486CEB800E47090 /* Info.plist */, - 83B2574E0E63025400468741 /* libiconv.2.dylib */, - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */, - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */, - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */, - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */, - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */, - 4C914EC99BFBF8DDC3DF16E6 /* appext */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 5BAD78601F2B5A59006103DE /* Security.framework */, - 960391211D6CE46E003BF157 /* MediaToolbox.framework */, - AA5D99861AFAD3C800B27605 /* CoreText.framework */, - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */, - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */, - 56FD43950ED4745200FE3770 /* CFNetwork.framework */, - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */, - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */, - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */, - 56B795C11442E1100026B3DD /* CoreMotion.framework */, - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */, - 83B2574B0E63022200468741 /* OpenAL.framework */, - 83B256E10E62FEA000468741 /* OpenGLES.framework */, - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */, - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */, - 830B5C100E5ED4C100C7819F /* UIKit.framework */, - 1C054391970787E9FCEBEA11 /* Metal.framework */, - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4C914EC99BFBF8DDC3DF16E6 /* appext */ = { - isa = PBXGroup; - children = ( - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */, - BBA14828996CB3D3322CD1DA /* TodayViewController.m */, - ); - path = appext; - sourceTree = ""; - }; - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXGroup; - children = ( - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */, - 5623C57917FDCB0800090B9E /* Supporting Files */, - ); - path = "Unity-iPhone Tests"; - sourceTree = ""; - }; - 5623C57917FDCB0800090B9E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */, - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */, - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 8A3EDDC51615B7C1001839E9 /* UI */ = { - isa = PBXGroup; - children = ( - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */, - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */, - 8A142DC41636943E00DD87CA /* Keyboard.h */, - 8A142DC51636943E00DD87CA /* Keyboard.mm */, - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */, - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */, - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */, - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */, - 4E090A331F27884B0077B28D /* StoreReview.m */, - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */, - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */, - 8A851BA516FB2F6D00E911DB /* UnityView.h */, - 8A851BA616FB2F6D00E911DB /* UnityView.mm */, - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */, - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */, - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */, - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */, - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */, - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */, - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */, - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */, - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */, - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */, - ); - path = UI; - sourceTree = ""; - }; - 8A5C148F174E662D0006EB36 /* PluginBase */ = { - isa = PBXGroup; - children = ( - 8AF7755E17997D1300341121 /* AppDelegateListener.h */, - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */, - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */, - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */, - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */, - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */, - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */, - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */, - ); - path = PluginBase; - sourceTree = ""; - }; - 8AF18FE316490981007B4420 /* Unity */ = { - isa = PBXGroup; - children = ( - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */, - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */, - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */, - 8ADCE38919C87177006F04F6 /* CameraCapture.h */, - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */, - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */, - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */, - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */, - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */, - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */, - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */, - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */, - 8A0FED471649699200E9727D /* EAGLContextHelper.h */, - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */, - 8A25E6D118D767E20006A227 /* Filesystem.mm */, - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */, - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */, - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */, - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */, - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */, - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */, - 8A6137121A10B57700059EDF /* ObjCRuntime.h */, - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */, - 8A851BAB16FC875E00E911DB /* UnityInterface.h */, - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */, - 8AA108C01948732900D0538B /* UnityRendering.h */, - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */, - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */, - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */, - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */, - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */, - 8AA568AC1827DD79004969C7 /* WWWConnection.h */, - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */, - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */, - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */, - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */, - ); - path = Unity; - sourceTree = ""; - }; - 91154904B5F8F49DA8EE103B /* iOS */ = { - isa = PBXGroup; - children = ( - 28CC40F5AF3FB5752DB99021 /* Bugsnag */, - ); - path = iOS; - sourceTree = ""; - }; - 999475211A7BC3B100178130 /* UnityAds */ = { - isa = PBXGroup; - children = ( - 999475381A80DBC300178130 /* UnityAdsConfig.h */, - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */, - ); - name = UnityAds; - sourceTree = ""; - }; - D82DCFB50E8000A5005D6AD8 /* Classes */ = { - isa = PBXGroup; - children = ( - 999475211A7BC3B100178130 /* UnityAds */, - 8A5C148F174E662D0006EB36 /* PluginBase */, - 8A3EDDC51615B7C1001839E9 /* UI */, - 8AF18FE316490981007B4420 /* Unity */, - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */, - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */, - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */, - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */, - D82DCFBB0E8000A5005D6AD8 /* main.mm */, - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */, - 8A6720A619EFAF25006C92E0 /* Prefix.pch */, - 8ACB801D177081F7005D0019 /* Preprocessor.h */, - 8A851BA816FB3AD000E911DB /* UnityAppController.h */, - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */, - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */, - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */, - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */, - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */, - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */, - ); - path = Classes; - sourceTree = SOURCE_ROOT; - }; - D8A1C7220E80637F000160D3 /* Libraries */ = { - isa = PBXGroup; - children = ( - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */, - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */, - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */, - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */, - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */, - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */, - E27B4946AEA62AAE76F8EAB0 /* Plugins */, - ); - path = Libraries; - sourceTree = SOURCE_ROOT; - }; - E27B4946AEA62AAE76F8EAB0 /* Plugins */ = { - isa = PBXGroup; - children = ( - 91154904B5F8F49DA8EE103B /* iOS */, - ); - path = Plugins; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00C64C33A163F6BBBC3998DE /* appext */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */; - buildPhases = ( - 1984447697B50992FF7B71F3 /* Sources */, - 7B84486ABE0D25523243AE77 /* Resources */, - 120943439F2C11A4A2EF8C58 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = appext; - productName = appext; - productReference = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - 5D0844359B6763E1774306B4 /* Embed App Extensions */, - ); - buildRules = ( - ); - dependencies = ( - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */, - ); - name = "Unity-iPhone"; - productName = "iPhone-target"; - productReference = 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */; - productType = "com.apple.product-type.application"; - }; - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */; - buildPhases = ( - 5623C56F17FDCB0800090B9E /* Sources */, - 5623C57017FDCB0800090B9E /* Frameworks */, - 5623C57117FDCB0800090B9E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5623C58217FDCB0900090B9E /* PBXTargetDependency */, - ); - name = "Unity-iPhone Tests"; - productName = "Unity-iPhone Tests"; - productReference = 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - TargetAttributes = { - 1D6058900D05DD3D006BFB54 = { - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.GameControllers.appletvos = { - enabled = 1; - }; - }; - }; - 5623C57217FDCB0800090B9E = { - ProvisioningStyle = Automatic; - TestTargetID = 1D6058900D05DD3D006BFB54; - }; - }; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */; - compatibilityVersion = "Xcode 10.0"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */, - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */, - 00C64C33A163F6BBBC3998DE /* appext */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - AA31BF971B55660D0013FB1B /* Data in Resources */, - 56C56C9817D6015200616839 /* Images.xcassets in Resources */, - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */, - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */, - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */, - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */, - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57117FDCB0800090B9E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7B84486ABE0D25523243AE77 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1984447697B50992FF7B71F3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */, - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */, - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */, - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */, - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */, - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */, - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */, - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */, - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */, - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */, - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */, - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */, - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */, - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */, - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */, - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */, - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */, - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */, - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */, - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */, - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */, - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */, - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */, - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */, - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */, - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */, - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */, - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */, - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */, - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */, - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */, - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */, - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */, - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */, - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */, - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */, - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */, - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */, - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */, - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */, - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */, - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */, - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C56F17FDCB0800090B9E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 5623C58217FDCB0900090B9E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1D6058900D05DD3D006BFB54 /* Unity-iPhone */; - targetProxy = 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */; - }; - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 00C64C33A163F6BBBC3998DE /* appext */; - targetProxy = FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 5623C57C17FDCB0900090B9E /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 11A74F8AB335D5F126F703F3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Release; - }; - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForProfiling; - }; - 5623C58317FDCB0900090B9E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = Release; - }; - 5623C58417FDCB0900090B9E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - WRAPPER_EXTENSION = xctest; - }; - name = Debug; - }; - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForRunning; - }; - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForRunning; - }; - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForRunning; - }; - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForProfiling; - }; - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForProfiling; - }; - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForProfiling; - }; - 6A04449D84D369E35D722281 /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForRunning; - }; - A48A4D2186B6EBC59CF4A94E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058950D05DD3E006BFB54 /* Release */, - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */, - 1D6058940D05DD3E006BFB54 /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 11A74F8AB335D5F126F703F3 /* Release */, - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */, - 6A04449D84D369E35D722281 /* ReleaseForRunning */, - A48A4D2186B6EBC59CF4A94E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5623C58317FDCB0900090B9E /* Release */, - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */, - 5623C58417FDCB0900090B9E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF5008A954540054247B /* Release */, - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */, - C01FCF4F08A954540054247B /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/tests/BugsnagUnity.Tests/ProjectFixtures/test_three_output.pbxproj b/tests/BugsnagUnity.Tests/ProjectFixtures/test_three_output.pbxproj deleted file mode 100644 index be0e82dc7..000000000 --- a/tests/BugsnagUnity.Tests/ProjectFixtures/test_three_output.pbxproj +++ /dev/null @@ -1,1411 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 51; - objects = { - -/* Begin PBXBuildFile section */ - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */; }; - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */; }; - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */ = {isa = PBXBuildFile; fileRef = F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */; }; - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; }; - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E090A331F27884B0077B28D /* StoreReview.m */; }; - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5623C57B17FDCB0900090B9E /* InfoPlist.strings */; }; - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */; }; - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */; }; - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */; }; - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */; }; - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B795C11442E1100026B3DD /* CoreMotion.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */; }; - 56C56C9817D6015200616839 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 56C56C9717D6015100616839 /* Images.xcassets */; }; - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */ = {isa = PBXBuildFile; fileRef = 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */; }; - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56FD43950ED4745200FE3770 /* CFNetwork.framework */; }; - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA14828996CB3D3322CD1DA /* TodayViewController.m */; }; - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BAD78601F2B5A59006103DE /* Security.framework */; }; - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */; }; - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */; }; - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */; }; - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */; }; - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B256E10E62FEA000468741 /* OpenGLES.framework */; }; - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2570A0E62FF8A00468741 /* QuartzCore.framework */; }; - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574B0E63022200468741 /* OpenAL.framework */; }; - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574E0E63025400468741 /* libiconv.2.dylib */; }; - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */ = {isa = PBXBuildFile; fileRef = 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */; }; - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */; }; - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */ = {isa = PBXBuildFile; fileRef = E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */; }; - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A0FED481649699200E9727D /* EAGLContextHelper.mm */; }; - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A142DC51636943E00DD87CA /* Keyboard.mm */; }; - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */; }; - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */; }; - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A25E6D118D767E20006A227 /* Filesystem.mm */; }; - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */; }; - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */; }; - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */; }; - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */; }; - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */; }; - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */; }; - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */; }; - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */; }; - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */; }; - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */; }; - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */; }; - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */; }; - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA616FB2F6D00E911DB /* UnityView.mm */; }; - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA916FB3AD000E911DB /* UnityAppController.mm */; }; - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */; }; - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */; }; - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA568AD1827DD79004969C7 /* WWWConnection.mm */; }; - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */; }; - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */; }; - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */; }; - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC74A9419B47FEF00019D38 /* AVCapture.mm */; }; - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ACB801B177081D4005D0019 /* DeviceSettings.mm */; }; - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */; }; - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */; }; - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AF7755F17997D1300341121 /* AppDelegateListener.mm */; }; - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */; }; - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960391211D6CE46E003BF157 /* MediaToolbox.framework */; }; - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */; }; - AA31BF971B55660D0013FB1B /* Data in Resources */ = {isa = PBXBuildFile; fileRef = AA31BF961B55660D0013FB1B /* Data */; }; - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA5D99861AFAD3C800B27605 /* CoreText.framework */; }; - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */; }; - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */; }; - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C054391970787E9FCEBEA11 /* Metal.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */; }; - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D82DCFBB0E8000A5005D6AD8 /* main.mm */; }; - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */; }; - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */; }; - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */; }; - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1D6058900D05DD3D006BFB54; - remoteInfo = "Unity-iPhone"; - }; - FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 00C64C33A163F6BBBC3998DE; - remoteInfo = appext; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 5D0844359B6763E1774306B4 /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Il2CppOptions.cpp; sourceTree = ""; }; - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityInterface.h; path = Classes/Unity/IUnityInterface.h; sourceTree = SOURCE_ROOT; }; - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalHelper.mm; sourceTree = ""; }; - 1C054391970787E9FCEBEA11 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = "Unity-Target-New.app"; path = ProductName.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPad.png"; sourceTree = SOURCE_ROOT; }; - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphics.h; path = Classes/Unity/IUnityGraphics.h; sourceTree = SOURCE_ROOT; }; - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; - 4E090A331F27884B0077B28D /* StoreReview.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StoreReview.m; sourceTree = ""; }; - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPad.xib"; sourceTree = SOURCE_ROOT; }; - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "Unity-iPhone Tests.xctest"; path = ProductName.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Unity-iPhone Tests-Info.plist"; sourceTree = ""; }; - 5623C57C17FDCB0900090B9E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Unity_iPhone_Tests.m; sourceTree = ""; }; - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Unity-iPhone Tests-Prefix.pch"; sourceTree = ""; }; - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 56B795C11442E1100026B3DD /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 56C56C9717D6015100616839 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "Unity-iPhone/Images.xcassets"; sourceTree = ""; }; - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iPhone_Sensors.mm; sourceTree = ""; }; - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhone_Sensors.h; sourceTree = ""; }; - 56FD43950ED4745200FE3770 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; - 5BAD78601F2B5A59006103DE /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libbugsnag-ios.a"; path = "Libraries/Plugins/iOS/Bugsnag/libbugsnag-ios.a"; sourceTree = SOURCE_ROOT; }; - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPhone.xib"; sourceTree = SOURCE_ROOT; }; - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 830B5C100E5ED4C100C7819F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 83B256E10E62FEA000468741 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 83B2574B0E63022200468741 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; - 83B2574E0E63025400468741 /* libiconv.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.2.dylib; path = usr/lib/libiconv.2.dylib; sourceTree = SDKROOT; }; - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit_Scripting.mm; sourceTree = ""; }; - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit.mm; sourceTree = ""; }; - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityReplayKit.h; sourceTree = ""; }; - 8A0FED471649699200E9727D /* EAGLContextHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAGLContextHelper.h; sourceTree = ""; }; - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EAGLContextHelper.mm; sourceTree = ""; }; - 8A142DC41636943E00DD87CA /* Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = ""; }; - 8A142DC51636943E00DD87CA /* Keyboard.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Keyboard.mm; sourceTree = ""; }; - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FullScreenVideoPlayer.mm; sourceTree = ""; }; - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlesHelper.h; sourceTree = ""; }; - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GlesHelper.mm; sourceTree = ""; }; - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerBase.h; sourceTree = ""; }; - 8A25E6D118D767E20006A227 /* Filesystem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Filesystem.mm; sourceTree = ""; }; - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LifeCycleListener.h; sourceTree = ""; }; - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = LifeCycleListener.mm; sourceTree = ""; }; - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMVideoSampling.h; sourceTree = ""; }; - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CMVideoSampling.mm; sourceTree = ""; }; - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CVTextureCache.h; sourceTree = ""; }; - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CVTextureCache.mm; sourceTree = ""; }; - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SplashScreen.h; sourceTree = ""; }; - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SplashScreen.mm; sourceTree = ""; }; - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+ViewHandling.h"; sourceTree = ""; }; - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+ViewHandling.mm"; sourceTree = ""; }; - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderPluginDelegate.h; sourceTree = ""; }; - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RenderPluginDelegate.mm; sourceTree = ""; }; - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayManager.h; sourceTree = ""; }; - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DisplayManager.mm; sourceTree = ""; }; - 8A6137121A10B57700059EDF /* ObjCRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjCRuntime.h; sourceTree = ""; }; - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InternalProfiler.cpp; sourceTree = ""; }; - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InternalProfiler.h; sourceTree = ""; }; - 8A6720A619EFAF25006C92E0 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerBase.mm; sourceTree = ""; }; - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+iOS.h"; sourceTree = ""; }; - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+iOS.mm"; sourceTree = ""; }; - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+tvOS.h"; sourceTree = ""; }; - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+tvOS.mm"; sourceTree = ""; }; - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+iOS.h"; sourceTree = ""; }; - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+iOS.mm"; sourceTree = ""; }; - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+tvOS.h"; sourceTree = ""; }; - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+tvOS.mm"; sourceTree = ""; }; - 8A851BA516FB2F6D00E911DB /* UnityView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityView.h; sourceTree = ""; }; - 8A851BA616FB2F6D00E911DB /* UnityView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityView.mm; sourceTree = ""; }; - 8A851BA816FB3AD000E911DB /* UnityAppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityAppController.h; sourceTree = ""; }; - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityAppController.mm; sourceTree = ""; }; - 8A851BAB16FC875E00E911DB /* UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityInterface.h; sourceTree = ""; }; - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+UnityInterface.h"; sourceTree = ""; }; - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+UnityInterface.mm"; sourceTree = ""; }; - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityForwardDecls.h; sourceTree = ""; }; - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActivityIndicator.h; sourceTree = ""; }; - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ActivityIndicator.mm; sourceTree = ""; }; - 8AA108C01948732900D0538B /* UnityRendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityRendering.h; sourceTree = ""; }; - 8AA568AC1827DD79004969C7 /* WWWConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WWWConnection.h; sourceTree = ""; }; - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WWWConnection.mm; sourceTree = ""; }; - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+Rendering.h"; sourceTree = ""; }; - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+Rendering.mm"; sourceTree = ""; }; - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UnityTrampolineConfigure.h; sourceTree = ""; }; - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoPlayer.h; sourceTree = ""; }; - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = VideoPlayer.mm; sourceTree = ""; }; - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVCapture.h; sourceTree = ""; }; - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OrientationSupport.h; sourceTree = ""; }; - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OrientationSupport.mm; sourceTree = ""; }; - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AVCapture.mm; sourceTree = ""; }; - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DeviceSettings.mm; sourceTree = ""; }; - 8ACB801D177081F7005D0019 /* Preprocessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Preprocessor.h; sourceTree = ""; }; - 8ADCE38919C87177006F04F6 /* CameraCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CameraCapture.h; sourceTree = ""; }; - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CameraCapture.mm; sourceTree = ""; }; - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityMetalSupport.h; sourceTree = ""; }; - 8AF7755E17997D1300341121 /* AppDelegateListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegateListener.h; sourceTree = ""; }; - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegateListener.mm; sourceTree = ""; }; - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; path = appext.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 960391211D6CE46E003BF157 /* MediaToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaToolbox.framework; path = System/Library/Frameworks/MediaToolbox.framework; sourceTree = SDKROOT; }; - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = UnityAdsUnityWrapper.mm; path = UnityAds/UnityAdsUnityWrapper.mm; sourceTree = ""; }; - 999475381A80DBC300178130 /* UnityAdsConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UnityAdsConfig.h; path = UnityAds/UnityAdsConfig.h; sourceTree = ""; }; - AA31BF961B55660D0013FB1B /* Data */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Data; sourceTree = ""; }; - AA5D99861AFAD3C800B27605 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterFeatures.cpp; sourceTree = ""; }; - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterFeatures.h; sourceTree = ""; }; - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerListener.h; sourceTree = ""; }; - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerListener.mm; sourceTree = ""; }; - BBA14828996CB3D3322CD1DA /* TodayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TodayViewController.m; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.m"; sourceTree = SOURCE_ROOT; }; - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphicsMetal.h; path = Classes/Unity/IUnityGraphicsMetal.h; sourceTree = SOURCE_ROOT; }; - D82DCFBB0E8000A5005D6AD8 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = main.mm; path = Classes/main.mm; sourceTree = SOURCE_ROOT; }; - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterMonoModules.cpp; path = Libraries/RegisterMonoModules.cpp; sourceTree = SOURCE_ROOT; }; - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterMonoModules.h; path = Libraries/RegisterMonoModules.h; sourceTree = SOURCE_ROOT; }; - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libiPhone-lib.a"; path = "Libraries/libiPhone-lib.a"; sourceTree = SOURCE_ROOT; }; - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TodayViewController.h; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.h"; sourceTree = SOURCE_ROOT; }; - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhonePortrait.png"; sourceTree = SOURCE_ROOT; }; - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhoneLandscape.png"; sourceTree = SOURCE_ROOT; }; - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OnDemandResources.mm; sourceTree = ""; }; - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrashReporter.h; sourceTree = ""; }; - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CrashReporter.mm; sourceTree = ""; }; - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReporter.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 120943439F2C11A4A2EF8C58 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */, - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */, - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */, - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */, - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */, - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */, - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */, - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */, - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */, - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */, - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */, - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */, - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */, - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */, - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */, - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */, - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */, - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */, - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */, - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */, - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57017FDCB0800090B9E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */, - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */, - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */, - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */, - ); - name = Products; - sourceTree = ""; - }; - 28CC40F5AF3FB5752DB99021 /* Bugsnag */ = { - isa = PBXGroup; - children = ( - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */, - ); - path = Bugsnag; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - AA31BF961B55660D0013FB1B /* Data */, - 56C56C9717D6015100616839 /* Images.xcassets */, - D82DCFB50E8000A5005D6AD8 /* Classes */, - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - D8A1C7220E80637F000160D3 /* Libraries */, - 19C28FACFE9D520D11CA2CBB /* Products */, - 8D1107310486CEB800E47090 /* Info.plist */, - 83B2574E0E63025400468741 /* libiconv.2.dylib */, - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */, - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */, - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */, - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */, - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */, - 4C914EC99BFBF8DDC3DF16E6 /* appext */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 5BAD78601F2B5A59006103DE /* Security.framework */, - 960391211D6CE46E003BF157 /* MediaToolbox.framework */, - AA5D99861AFAD3C800B27605 /* CoreText.framework */, - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */, - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */, - 56FD43950ED4745200FE3770 /* CFNetwork.framework */, - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */, - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */, - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */, - 56B795C11442E1100026B3DD /* CoreMotion.framework */, - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */, - 83B2574B0E63022200468741 /* OpenAL.framework */, - 83B256E10E62FEA000468741 /* OpenGLES.framework */, - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */, - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */, - 830B5C100E5ED4C100C7819F /* UIKit.framework */, - 1C054391970787E9FCEBEA11 /* Metal.framework */, - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4C914EC99BFBF8DDC3DF16E6 /* appext */ = { - isa = PBXGroup; - children = ( - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */, - BBA14828996CB3D3322CD1DA /* TodayViewController.m */, - ); - path = appext; - sourceTree = ""; - }; - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXGroup; - children = ( - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */, - 5623C57917FDCB0800090B9E /* Supporting Files */, - ); - path = "Unity-iPhone Tests"; - sourceTree = ""; - }; - 5623C57917FDCB0800090B9E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */, - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */, - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 8A3EDDC51615B7C1001839E9 /* UI */ = { - isa = PBXGroup; - children = ( - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */, - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */, - 8A142DC41636943E00DD87CA /* Keyboard.h */, - 8A142DC51636943E00DD87CA /* Keyboard.mm */, - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */, - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */, - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */, - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */, - 4E090A331F27884B0077B28D /* StoreReview.m */, - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */, - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */, - 8A851BA516FB2F6D00E911DB /* UnityView.h */, - 8A851BA616FB2F6D00E911DB /* UnityView.mm */, - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */, - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */, - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */, - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */, - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */, - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */, - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */, - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */, - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */, - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */, - ); - path = UI; - sourceTree = ""; - }; - 8A5C148F174E662D0006EB36 /* PluginBase */ = { - isa = PBXGroup; - children = ( - 8AF7755E17997D1300341121 /* AppDelegateListener.h */, - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */, - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */, - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */, - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */, - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */, - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */, - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */, - ); - path = PluginBase; - sourceTree = ""; - }; - 8AF18FE316490981007B4420 /* Unity */ = { - isa = PBXGroup; - children = ( - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */, - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */, - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */, - 8ADCE38919C87177006F04F6 /* CameraCapture.h */, - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */, - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */, - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */, - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */, - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */, - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */, - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */, - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */, - 8A0FED471649699200E9727D /* EAGLContextHelper.h */, - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */, - 8A25E6D118D767E20006A227 /* Filesystem.mm */, - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */, - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */, - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */, - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */, - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */, - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */, - 8A6137121A10B57700059EDF /* ObjCRuntime.h */, - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */, - 8A851BAB16FC875E00E911DB /* UnityInterface.h */, - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */, - 8AA108C01948732900D0538B /* UnityRendering.h */, - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */, - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */, - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */, - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */, - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */, - 8AA568AC1827DD79004969C7 /* WWWConnection.h */, - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */, - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */, - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */, - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */, - ); - path = Unity; - sourceTree = ""; - }; - 91154904B5F8F49DA8EE103B /* iOS */ = { - isa = PBXGroup; - children = ( - 28CC40F5AF3FB5752DB99021 /* Bugsnag */, - ); - path = iOS; - sourceTree = ""; - }; - 999475211A7BC3B100178130 /* UnityAds */ = { - isa = PBXGroup; - children = ( - 999475381A80DBC300178130 /* UnityAdsConfig.h */, - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */, - ); - name = UnityAds; - sourceTree = ""; - }; - D82DCFB50E8000A5005D6AD8 /* Classes */ = { - isa = PBXGroup; - children = ( - 999475211A7BC3B100178130 /* UnityAds */, - 8A5C148F174E662D0006EB36 /* PluginBase */, - 8A3EDDC51615B7C1001839E9 /* UI */, - 8AF18FE316490981007B4420 /* Unity */, - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */, - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */, - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */, - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */, - D82DCFBB0E8000A5005D6AD8 /* main.mm */, - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */, - 8A6720A619EFAF25006C92E0 /* Prefix.pch */, - 8ACB801D177081F7005D0019 /* Preprocessor.h */, - 8A851BA816FB3AD000E911DB /* UnityAppController.h */, - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */, - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */, - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */, - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */, - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */, - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */, - ); - path = Classes; - sourceTree = SOURCE_ROOT; - }; - D8A1C7220E80637F000160D3 /* Libraries */ = { - isa = PBXGroup; - children = ( - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */, - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */, - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */, - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */, - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */, - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */, - E27B4946AEA62AAE76F8EAB0 /* Plugins */, - ); - path = Libraries; - sourceTree = SOURCE_ROOT; - }; - E27B4946AEA62AAE76F8EAB0 /* Plugins */ = { - isa = PBXGroup; - children = ( - 91154904B5F8F49DA8EE103B /* iOS */, - ); - path = Plugins; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00C64C33A163F6BBBC3998DE /* appext */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */; - buildPhases = ( - 1984447697B50992FF7B71F3 /* Sources */, - 7B84486ABE0D25523243AE77 /* Resources */, - 120943439F2C11A4A2EF8C58 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = appext; - productName = appext; - productReference = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - 5D0844359B6763E1774306B4 /* Embed App Extensions */, - ); - buildRules = ( - ); - dependencies = ( - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */, - ); - name = "Unity-iPhone"; - productName = "iPhone-target"; - productReference = 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */; - productType = "com.apple.product-type.application"; - }; - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */; - buildPhases = ( - 5623C56F17FDCB0800090B9E /* Sources */, - 5623C57017FDCB0800090B9E /* Frameworks */, - 5623C57117FDCB0800090B9E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5623C58217FDCB0900090B9E /* PBXTargetDependency */, - ); - name = "Unity-iPhone Tests"; - productName = "Unity-iPhone Tests"; - productReference = 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - TargetAttributes = { - 1D6058900D05DD3D006BFB54 = { - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.GameControllers.appletvos = { - enabled = 1; - }; - }; - }; - 5623C57217FDCB0800090B9E = { - ProvisioningStyle = Automatic; - TestTargetID = 1D6058900D05DD3D006BFB54; - }; - }; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */; - compatibilityVersion = "Xcode 10.0"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */, - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */, - 00C64C33A163F6BBBC3998DE /* appext */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - AA31BF971B55660D0013FB1B /* Data in Resources */, - 56C56C9817D6015200616839 /* Images.xcassets in Resources */, - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */, - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */, - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */, - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */, - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57117FDCB0800090B9E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7B84486ABE0D25523243AE77 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1984447697B50992FF7B71F3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */, - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */, - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */, - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */, - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */, - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */, - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */, - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */, - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */, - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */, - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */, - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */, - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */, - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */, - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */, - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */, - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */, - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */, - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */, - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */, - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */, - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */, - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */, - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */, - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */, - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */, - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */, - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */, - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */, - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */, - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */, - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */, - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */, - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */, - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */, - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */, - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */, - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */, - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */, - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */, - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */, - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */, - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C56F17FDCB0800090B9E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 5623C58217FDCB0900090B9E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1D6058900D05DD3D006BFB54 /* Unity-iPhone */; - targetProxy = 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */; - }; - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 00C64C33A163F6BBBC3998DE /* appext */; - targetProxy = FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 5623C57C17FDCB0900090B9E /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 11A74F8AB335D5F126F703F3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Release; - }; - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForProfiling; - }; - 5623C58317FDCB0900090B9E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = Release; - }; - 5623C58417FDCB0900090B9E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - WRAPPER_EXTENSION = xctest; - }; - name = Debug; - }; - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForRunning; - }; - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForRunning; - }; - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForRunning; - }; - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForProfiling; - }; - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForProfiling; - }; - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForProfiling; - }; - 6A04449D84D369E35D722281 /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForRunning; - }; - A48A4D2186B6EBC59CF4A94E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058950D05DD3E006BFB54 /* Release */, - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */, - 1D6058940D05DD3E006BFB54 /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 11A74F8AB335D5F126F703F3 /* Release */, - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */, - 6A04449D84D369E35D722281 /* ReleaseForRunning */, - A48A4D2186B6EBC59CF4A94E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5623C58317FDCB0900090B9E /* Release */, - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */, - 5623C58417FDCB0900090B9E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF5008A954540054247B /* Release */, - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */, - C01FCF4F08A954540054247B /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/tests/BugsnagUnity.Tests/ProjectFixtures/test_two_input.pbxproj b/tests/BugsnagUnity.Tests/ProjectFixtures/test_two_input.pbxproj deleted file mode 100644 index f7c8535e6..000000000 --- a/tests/BugsnagUnity.Tests/ProjectFixtures/test_two_input.pbxproj +++ /dev/null @@ -1,1411 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 51; - objects = { - -/* Begin PBXBuildFile section */ - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */; }; - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */; }; - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */ = {isa = PBXBuildFile; fileRef = F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */; }; - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; }; - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E090A331F27884B0077B28D /* StoreReview.m */; }; - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5623C57B17FDCB0900090B9E /* InfoPlist.strings */; }; - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */; }; - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */; }; - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */; }; - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */; }; - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B795C11442E1100026B3DD /* CoreMotion.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */; }; - 56C56C9817D6015200616839 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 56C56C9717D6015100616839 /* Images.xcassets */; }; - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */ = {isa = PBXBuildFile; fileRef = 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */; }; - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56FD43950ED4745200FE3770 /* CFNetwork.framework */; }; - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA14828996CB3D3322CD1DA /* TodayViewController.m */; }; - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BAD78601F2B5A59006103DE /* Security.framework */; }; - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */; }; - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */; }; - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */; }; - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */; }; - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B256E10E62FEA000468741 /* OpenGLES.framework */; }; - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2570A0E62FF8A00468741 /* QuartzCore.framework */; }; - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574B0E63022200468741 /* OpenAL.framework */; }; - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574E0E63025400468741 /* libiconv.2.dylib */; }; - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */ = {isa = PBXBuildFile; fileRef = 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */; }; - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */; }; - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */ = {isa = PBXBuildFile; fileRef = E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */; }; - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A0FED481649699200E9727D /* EAGLContextHelper.mm */; }; - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A142DC51636943E00DD87CA /* Keyboard.mm */; }; - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */; }; - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */; }; - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A25E6D118D767E20006A227 /* Filesystem.mm */; }; - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */; }; - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */; }; - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */; }; - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */; }; - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */; }; - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */; }; - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */; }; - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */; }; - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */; }; - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */; }; - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */; }; - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */; }; - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA616FB2F6D00E911DB /* UnityView.mm */; }; - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA916FB3AD000E911DB /* UnityAppController.mm */; }; - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */; }; - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */; }; - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA568AD1827DD79004969C7 /* WWWConnection.mm */; }; - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */; }; - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */; }; - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */; }; - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC74A9419B47FEF00019D38 /* AVCapture.mm */; }; - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ACB801B177081D4005D0019 /* DeviceSettings.mm */; }; - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */; }; - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */; }; - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AF7755F17997D1300341121 /* AppDelegateListener.mm */; }; - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */; }; - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960391211D6CE46E003BF157 /* MediaToolbox.framework */; }; - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */; }; - AA31BF971B55660D0013FB1B /* Data in Resources */ = {isa = PBXBuildFile; fileRef = AA31BF961B55660D0013FB1B /* Data */; }; - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA5D99861AFAD3C800B27605 /* CoreText.framework */; }; - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */; }; - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */; }; - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C054391970787E9FCEBEA11 /* Metal.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */; }; - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D82DCFBB0E8000A5005D6AD8 /* main.mm */; }; - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */; }; - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */; }; - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */; }; - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1D6058900D05DD3D006BFB54; - remoteInfo = "Unity-iPhone"; - }; - FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 00C64C33A163F6BBBC3998DE; - remoteInfo = appext; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 5D0844359B6763E1774306B4 /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Il2CppOptions.cpp; sourceTree = ""; }; - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityInterface.h; path = Classes/Unity/IUnityInterface.h; sourceTree = SOURCE_ROOT; }; - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalHelper.mm; sourceTree = ""; }; - 1C054391970787E9FCEBEA11 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = "Unity-Target-New.app"; path = ProductName.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPad.png"; sourceTree = SOURCE_ROOT; }; - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphics.h; path = Classes/Unity/IUnityGraphics.h; sourceTree = SOURCE_ROOT; }; - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; - 4E090A331F27884B0077B28D /* StoreReview.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StoreReview.m; sourceTree = ""; }; - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPad.xib"; sourceTree = SOURCE_ROOT; }; - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "Unity-iPhone Tests.xctest"; path = ProductName.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Unity-iPhone Tests-Info.plist"; sourceTree = ""; }; - 5623C57C17FDCB0900090B9E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Unity_iPhone_Tests.m; sourceTree = ""; }; - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Unity-iPhone Tests-Prefix.pch"; sourceTree = ""; }; - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 56B795C11442E1100026B3DD /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 56C56C9717D6015100616839 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "Unity-iPhone/Images.xcassets"; sourceTree = ""; }; - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iPhone_Sensors.mm; sourceTree = ""; }; - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhone_Sensors.h; sourceTree = ""; }; - 56FD43950ED4745200FE3770 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; - 5BAD78601F2B5A59006103DE /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libbugsnag-ios.a"; path = "Libraries/Plugins/iOS/Bugsnag/libbugsnag-ios.a"; sourceTree = SOURCE_ROOT; }; - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPhone.xib"; sourceTree = SOURCE_ROOT; }; - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 830B5C100E5ED4C100C7819F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 83B256E10E62FEA000468741 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 83B2574B0E63022200468741 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; - 83B2574E0E63025400468741 /* libiconv.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.2.dylib; path = usr/lib/libiconv.2.dylib; sourceTree = SDKROOT; }; - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit_Scripting.mm; sourceTree = ""; }; - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit.mm; sourceTree = ""; }; - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityReplayKit.h; sourceTree = ""; }; - 8A0FED471649699200E9727D /* EAGLContextHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAGLContextHelper.h; sourceTree = ""; }; - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EAGLContextHelper.mm; sourceTree = ""; }; - 8A142DC41636943E00DD87CA /* Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = ""; }; - 8A142DC51636943E00DD87CA /* Keyboard.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Keyboard.mm; sourceTree = ""; }; - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FullScreenVideoPlayer.mm; sourceTree = ""; }; - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlesHelper.h; sourceTree = ""; }; - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GlesHelper.mm; sourceTree = ""; }; - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerBase.h; sourceTree = ""; }; - 8A25E6D118D767E20006A227 /* Filesystem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Filesystem.mm; sourceTree = ""; }; - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LifeCycleListener.h; sourceTree = ""; }; - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = LifeCycleListener.mm; sourceTree = ""; }; - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMVideoSampling.h; sourceTree = ""; }; - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CMVideoSampling.mm; sourceTree = ""; }; - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CVTextureCache.h; sourceTree = ""; }; - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CVTextureCache.mm; sourceTree = ""; }; - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SplashScreen.h; sourceTree = ""; }; - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SplashScreen.mm; sourceTree = ""; }; - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+ViewHandling.h"; sourceTree = ""; }; - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+ViewHandling.mm"; sourceTree = ""; }; - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderPluginDelegate.h; sourceTree = ""; }; - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RenderPluginDelegate.mm; sourceTree = ""; }; - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayManager.h; sourceTree = ""; }; - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DisplayManager.mm; sourceTree = ""; }; - 8A6137121A10B57700059EDF /* ObjCRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjCRuntime.h; sourceTree = ""; }; - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InternalProfiler.cpp; sourceTree = ""; }; - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InternalProfiler.h; sourceTree = ""; }; - 8A6720A619EFAF25006C92E0 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerBase.mm; sourceTree = ""; }; - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+iOS.h"; sourceTree = ""; }; - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+iOS.mm"; sourceTree = ""; }; - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+tvOS.h"; sourceTree = ""; }; - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+tvOS.mm"; sourceTree = ""; }; - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+iOS.h"; sourceTree = ""; }; - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+iOS.mm"; sourceTree = ""; }; - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+tvOS.h"; sourceTree = ""; }; - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+tvOS.mm"; sourceTree = ""; }; - 8A851BA516FB2F6D00E911DB /* UnityView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityView.h; sourceTree = ""; }; - 8A851BA616FB2F6D00E911DB /* UnityView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityView.mm; sourceTree = ""; }; - 8A851BA816FB3AD000E911DB /* UnityAppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityAppController.h; sourceTree = ""; }; - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityAppController.mm; sourceTree = ""; }; - 8A851BAB16FC875E00E911DB /* UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityInterface.h; sourceTree = ""; }; - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+UnityInterface.h"; sourceTree = ""; }; - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+UnityInterface.mm"; sourceTree = ""; }; - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityForwardDecls.h; sourceTree = ""; }; - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActivityIndicator.h; sourceTree = ""; }; - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ActivityIndicator.mm; sourceTree = ""; }; - 8AA108C01948732900D0538B /* UnityRendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityRendering.h; sourceTree = ""; }; - 8AA568AC1827DD79004969C7 /* WWWConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WWWConnection.h; sourceTree = ""; }; - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WWWConnection.mm; sourceTree = ""; }; - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+Rendering.h"; sourceTree = ""; }; - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+Rendering.mm"; sourceTree = ""; }; - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UnityTrampolineConfigure.h; sourceTree = ""; }; - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoPlayer.h; sourceTree = ""; }; - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = VideoPlayer.mm; sourceTree = ""; }; - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVCapture.h; sourceTree = ""; }; - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OrientationSupport.h; sourceTree = ""; }; - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OrientationSupport.mm; sourceTree = ""; }; - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AVCapture.mm; sourceTree = ""; }; - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DeviceSettings.mm; sourceTree = ""; }; - 8ACB801D177081F7005D0019 /* Preprocessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Preprocessor.h; sourceTree = ""; }; - 8ADCE38919C87177006F04F6 /* CameraCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CameraCapture.h; sourceTree = ""; }; - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CameraCapture.mm; sourceTree = ""; }; - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityMetalSupport.h; sourceTree = ""; }; - 8AF7755E17997D1300341121 /* AppDelegateListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegateListener.h; sourceTree = ""; }; - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegateListener.mm; sourceTree = ""; }; - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; path = appext.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 960391211D6CE46E003BF157 /* MediaToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaToolbox.framework; path = System/Library/Frameworks/MediaToolbox.framework; sourceTree = SDKROOT; }; - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = UnityAdsUnityWrapper.mm; path = UnityAds/UnityAdsUnityWrapper.mm; sourceTree = ""; }; - 999475381A80DBC300178130 /* UnityAdsConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UnityAdsConfig.h; path = UnityAds/UnityAdsConfig.h; sourceTree = ""; }; - AA31BF961B55660D0013FB1B /* Data */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Data; sourceTree = ""; }; - AA5D99861AFAD3C800B27605 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterFeatures.cpp; sourceTree = ""; }; - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterFeatures.h; sourceTree = ""; }; - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerListener.h; sourceTree = ""; }; - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerListener.mm; sourceTree = ""; }; - BBA14828996CB3D3322CD1DA /* TodayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TodayViewController.m; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.m"; sourceTree = SOURCE_ROOT; }; - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphicsMetal.h; path = Classes/Unity/IUnityGraphicsMetal.h; sourceTree = SOURCE_ROOT; }; - D82DCFBB0E8000A5005D6AD8 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = main.mm; path = Classes/main.mm; sourceTree = SOURCE_ROOT; }; - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterMonoModules.cpp; path = Libraries/RegisterMonoModules.cpp; sourceTree = SOURCE_ROOT; }; - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterMonoModules.h; path = Libraries/RegisterMonoModules.h; sourceTree = SOURCE_ROOT; }; - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libiPhone-lib.a"; path = "Libraries/libiPhone-lib.a"; sourceTree = SOURCE_ROOT; }; - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TodayViewController.h; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.h"; sourceTree = SOURCE_ROOT; }; - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhonePortrait.png"; sourceTree = SOURCE_ROOT; }; - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhoneLandscape.png"; sourceTree = SOURCE_ROOT; }; - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OnDemandResources.mm; sourceTree = ""; }; - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrashReporter.h; sourceTree = ""; }; - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CrashReporter.mm; sourceTree = ""; }; - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReporter.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 120943439F2C11A4A2EF8C58 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */, - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */, - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */, - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */, - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */, - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */, - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */, - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */, - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */, - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */, - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */, - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */, - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */, - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */, - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */, - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */, - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */, - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */, - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */, - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */, - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57017FDCB0800090B9E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */, - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */, - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */, - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */, - ); - name = Products; - sourceTree = ""; - }; - 28CC40F5AF3FB5752DB99021 /* Bugsnag */ = { - isa = PBXGroup; - children = ( - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */, - ); - path = Bugsnag; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - AA31BF961B55660D0013FB1B /* Data */, - 56C56C9717D6015100616839 /* Images.xcassets */, - D82DCFB50E8000A5005D6AD8 /* Classes */, - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - D8A1C7220E80637F000160D3 /* Libraries */, - 19C28FACFE9D520D11CA2CBB /* Products */, - 8D1107310486CEB800E47090 /* Info.plist */, - 83B2574E0E63025400468741 /* libiconv.2.dylib */, - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */, - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */, - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */, - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */, - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */, - 4C914EC99BFBF8DDC3DF16E6 /* appext */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 5BAD78601F2B5A59006103DE /* Security.framework */, - 960391211D6CE46E003BF157 /* MediaToolbox.framework */, - AA5D99861AFAD3C800B27605 /* CoreText.framework */, - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */, - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */, - 56FD43950ED4745200FE3770 /* CFNetwork.framework */, - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */, - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */, - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */, - 56B795C11442E1100026B3DD /* CoreMotion.framework */, - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */, - 83B2574B0E63022200468741 /* OpenAL.framework */, - 83B256E10E62FEA000468741 /* OpenGLES.framework */, - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */, - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */, - 830B5C100E5ED4C100C7819F /* UIKit.framework */, - 1C054391970787E9FCEBEA11 /* Metal.framework */, - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4C914EC99BFBF8DDC3DF16E6 /* appext */ = { - isa = PBXGroup; - children = ( - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */, - BBA14828996CB3D3322CD1DA /* TodayViewController.m */, - ); - path = appext; - sourceTree = ""; - }; - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXGroup; - children = ( - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */, - 5623C57917FDCB0800090B9E /* Supporting Files */, - ); - path = "Unity-iPhone Tests"; - sourceTree = ""; - }; - 5623C57917FDCB0800090B9E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */, - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */, - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 8A3EDDC51615B7C1001839E9 /* UI */ = { - isa = PBXGroup; - children = ( - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */, - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */, - 8A142DC41636943E00DD87CA /* Keyboard.h */, - 8A142DC51636943E00DD87CA /* Keyboard.mm */, - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */, - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */, - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */, - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */, - 4E090A331F27884B0077B28D /* StoreReview.m */, - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */, - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */, - 8A851BA516FB2F6D00E911DB /* UnityView.h */, - 8A851BA616FB2F6D00E911DB /* UnityView.mm */, - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */, - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */, - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */, - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */, - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */, - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */, - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */, - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */, - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */, - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */, - ); - path = UI; - sourceTree = ""; - }; - 8A5C148F174E662D0006EB36 /* PluginBase */ = { - isa = PBXGroup; - children = ( - 8AF7755E17997D1300341121 /* AppDelegateListener.h */, - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */, - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */, - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */, - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */, - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */, - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */, - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */, - ); - path = PluginBase; - sourceTree = ""; - }; - 8AF18FE316490981007B4420 /* Unity */ = { - isa = PBXGroup; - children = ( - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */, - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */, - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */, - 8ADCE38919C87177006F04F6 /* CameraCapture.h */, - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */, - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */, - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */, - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */, - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */, - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */, - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */, - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */, - 8A0FED471649699200E9727D /* EAGLContextHelper.h */, - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */, - 8A25E6D118D767E20006A227 /* Filesystem.mm */, - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */, - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */, - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */, - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */, - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */, - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */, - 8A6137121A10B57700059EDF /* ObjCRuntime.h */, - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */, - 8A851BAB16FC875E00E911DB /* UnityInterface.h */, - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */, - 8AA108C01948732900D0538B /* UnityRendering.h */, - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */, - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */, - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */, - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */, - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */, - 8AA568AC1827DD79004969C7 /* WWWConnection.h */, - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */, - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */, - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */, - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */, - ); - path = Unity; - sourceTree = ""; - }; - 91154904B5F8F49DA8EE103B /* iOS */ = { - isa = PBXGroup; - children = ( - 28CC40F5AF3FB5752DB99021 /* Bugsnag */, - ); - path = iOS; - sourceTree = ""; - }; - 999475211A7BC3B100178130 /* UnityAds */ = { - isa = PBXGroup; - children = ( - 999475381A80DBC300178130 /* UnityAdsConfig.h */, - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */, - ); - name = UnityAds; - sourceTree = ""; - }; - D82DCFB50E8000A5005D6AD8 /* Classes */ = { - isa = PBXGroup; - children = ( - 999475211A7BC3B100178130 /* UnityAds */, - 8A5C148F174E662D0006EB36 /* PluginBase */, - 8A3EDDC51615B7C1001839E9 /* UI */, - 8AF18FE316490981007B4420 /* Unity */, - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */, - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */, - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */, - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */, - D82DCFBB0E8000A5005D6AD8 /* main.mm */, - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */, - 8A6720A619EFAF25006C92E0 /* Prefix.pch */, - 8ACB801D177081F7005D0019 /* Preprocessor.h */, - 8A851BA816FB3AD000E911DB /* UnityAppController.h */, - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */, - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */, - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */, - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */, - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */, - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */, - ); - path = Classes; - sourceTree = SOURCE_ROOT; - }; - D8A1C7220E80637F000160D3 /* Libraries */ = { - isa = PBXGroup; - children = ( - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */, - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */, - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */, - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */, - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */, - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */, - E27B4946AEA62AAE76F8EAB0 /* Plugins */, - ); - path = Libraries; - sourceTree = SOURCE_ROOT; - }; - E27B4946AEA62AAE76F8EAB0 /* Plugins */ = { - isa = PBXGroup; - children = ( - 91154904B5F8F49DA8EE103B /* iOS */, - ); - path = Plugins; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00C64C33A163F6BBBC3998DE /* appext */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */; - buildPhases = ( - 1984447697B50992FF7B71F3 /* Sources */, - 7B84486ABE0D25523243AE77 /* Resources */, - 120943439F2C11A4A2EF8C58 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = appext; - productName = appext; - productReference = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - 5D0844359B6763E1774306B4 /* Embed App Extensions */, - ); - buildRules = ( - ); - dependencies = ( - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */, - ); - name = "Unity-iPhone"; - productName = "iPhone-target"; - productReference = 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */; - productType = "com.apple.product-type.application"; - }; - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */; - buildPhases = ( - 5623C56F17FDCB0800090B9E /* Sources */, - 5623C57017FDCB0800090B9E /* Frameworks */, - 5623C57117FDCB0800090B9E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5623C58217FDCB0900090B9E /* PBXTargetDependency */, - ); - name = "Unity-iPhone Tests"; - productName = "Unity-iPhone Tests"; - productReference = 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - TargetAttributes = { - 1D6058900D05DD3D006BFB54 = { - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.GameControllers.appletvos = { - enabled = 1; - }; - }; - }; - 5623C57217FDCB0800090B9E = { - ProvisioningStyle = Automatic; - TestTargetID = 1D6058900D05DD3D006BFB54; - }; - }; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */; - compatibilityVersion = "Xcode 10.0"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */, - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */, - 00C64C33A163F6BBBC3998DE /* appext */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - AA31BF971B55660D0013FB1B /* Data in Resources */, - 56C56C9817D6015200616839 /* Images.xcassets in Resources */, - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */, - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */, - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */, - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */, - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57117FDCB0800090B9E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7B84486ABE0D25523243AE77 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1984447697B50992FF7B71F3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */, - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */, - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */, - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */, - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */, - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */, - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */, - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */, - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */, - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */, - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */, - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */, - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */, - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */, - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */, - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */, - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */, - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */, - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */, - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */, - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */, - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */, - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */, - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */, - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */, - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */, - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */, - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */, - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */, - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */, - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */, - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */, - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */, - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */, - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */, - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */, - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */, - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */, - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */, - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */, - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */, - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */, - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C56F17FDCB0800090B9E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 5623C58217FDCB0900090B9E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1D6058900D05DD3D006BFB54 /* Unity-iPhone */; - targetProxy = 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */; - }; - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 00C64C33A163F6BBBC3998DE /* appext */; - targetProxy = FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 5623C57C17FDCB0900090B9E /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 11A74F8AB335D5F126F703F3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Release; - }; - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForProfiling; - }; - 5623C58317FDCB0900090B9E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = Release; - }; - 5623C58417FDCB0900090B9E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - WRAPPER_EXTENSION = xctest; - }; - name = Debug; - }; - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForRunning; - }; - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForRunning; - }; - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForRunning; - }; - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForProfiling; - }; - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForProfiling; - }; - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForProfiling; - }; - 6A04449D84D369E35D722281 /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForRunning; - }; - A48A4D2186B6EBC59CF4A94E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = NO; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = NO; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058950D05DD3E006BFB54 /* Release */, - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */, - 1D6058940D05DD3E006BFB54 /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 11A74F8AB335D5F126F703F3 /* Release */, - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */, - 6A04449D84D369E35D722281 /* ReleaseForRunning */, - A48A4D2186B6EBC59CF4A94E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5623C58317FDCB0900090B9E /* Release */, - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */, - 5623C58417FDCB0900090B9E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF5008A954540054247B /* Release */, - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */, - C01FCF4F08A954540054247B /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/tests/BugsnagUnity.Tests/ProjectFixtures/test_two_output.pbxproj b/tests/BugsnagUnity.Tests/ProjectFixtures/test_two_output.pbxproj deleted file mode 100644 index be0e82dc7..000000000 --- a/tests/BugsnagUnity.Tests/ProjectFixtures/test_two_output.pbxproj +++ /dev/null @@ -1,1411 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 51; - objects = { - -/* Begin PBXBuildFile section */ - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */; }; - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */; }; - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */ = {isa = PBXBuildFile; fileRef = F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */; }; - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; }; - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E090A331F27884B0077B28D /* StoreReview.m */; }; - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5623C57B17FDCB0900090B9E /* InfoPlist.strings */; }; - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */; }; - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */; }; - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */; }; - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */; }; - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56B795C11442E1100026B3DD /* CoreMotion.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */; }; - 56C56C9817D6015200616839 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 56C56C9717D6015100616839 /* Images.xcassets */; }; - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */ = {isa = PBXBuildFile; fileRef = 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */; }; - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56FD43950ED4745200FE3770 /* CFNetwork.framework */; }; - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA14828996CB3D3322CD1DA /* TodayViewController.m */; }; - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BAD78601F2B5A59006103DE /* Security.framework */; }; - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */; }; - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */; }; - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */; }; - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830B5C100E5ED4C100C7819F /* UIKit.framework */; }; - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */; }; - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B256E10E62FEA000468741 /* OpenGLES.framework */; }; - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2570A0E62FF8A00468741 /* QuartzCore.framework */; }; - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574B0E63022200468741 /* OpenAL.framework */; }; - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B2574E0E63025400468741 /* libiconv.2.dylib */; }; - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */ = {isa = PBXBuildFile; fileRef = 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */; }; - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */; }; - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */ = {isa = PBXBuildFile; fileRef = E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */; }; - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A0FED481649699200E9727D /* EAGLContextHelper.mm */; }; - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A142DC51636943E00DD87CA /* Keyboard.mm */; }; - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */; }; - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */; }; - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A25E6D118D767E20006A227 /* Filesystem.mm */; }; - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */; }; - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */; }; - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */; }; - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */; }; - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */; }; - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */; }; - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */; }; - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */; }; - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */; }; - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */; }; - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */; }; - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */; }; - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA616FB2F6D00E911DB /* UnityView.mm */; }; - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A851BA916FB3AD000E911DB /* UnityAppController.mm */; }; - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */; }; - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */; }; - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA568AD1827DD79004969C7 /* WWWConnection.mm */; }; - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */; }; - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */; }; - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */; }; - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AC74A9419B47FEF00019D38 /* AVCapture.mm */; }; - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ACB801B177081D4005D0019 /* DeviceSettings.mm */; }; - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */; }; - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */; }; - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8AF7755F17997D1300341121 /* AppDelegateListener.mm */; }; - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */; }; - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960391211D6CE46E003BF157 /* MediaToolbox.framework */; }; - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */; }; - AA31BF971B55660D0013FB1B /* Data in Resources */ = {isa = PBXBuildFile; fileRef = AA31BF961B55660D0013FB1B /* Data */; }; - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA5D99861AFAD3C800B27605 /* CoreText.framework */; }; - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */; }; - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */; }; - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C054391970787E9FCEBEA11 /* Metal.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */; }; - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D82DCFBB0E8000A5005D6AD8 /* main.mm */; }; - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */; }; - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */; }; - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */; }; - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1D6058900D05DD3D006BFB54; - remoteInfo = "Unity-iPhone"; - }; - FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 00C64C33A163F6BBBC3998DE; - remoteInfo = appext; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 5D0844359B6763E1774306B4 /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 35D84C6590294950E862B3F0 /* appext.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Il2CppOptions.cpp; sourceTree = ""; }; - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityInterface.h; path = Classes/Unity/IUnityInterface.h; sourceTree = SOURCE_ROOT; }; - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalHelper.mm; sourceTree = ""; }; - 1C054391970787E9FCEBEA11 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = "Unity-Target-New.app"; path = ProductName.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPad.png"; sourceTree = SOURCE_ROOT; }; - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphics.h; path = Classes/Unity/IUnityGraphics.h; sourceTree = SOURCE_ROOT; }; - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; - 4E090A331F27884B0077B28D /* StoreReview.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StoreReview.m; sourceTree = ""; }; - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPad.xib"; sourceTree = SOURCE_ROOT; }; - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "Unity-iPhone Tests.xctest"; path = ProductName.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Unity-iPhone Tests-Info.plist"; sourceTree = ""; }; - 5623C57C17FDCB0900090B9E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Unity_iPhone_Tests.m; sourceTree = ""; }; - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Unity-iPhone Tests-Prefix.pch"; sourceTree = ""; }; - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 56B795C11442E1100026B3DD /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 56C56C9717D6015100616839 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "Unity-iPhone/Images.xcassets"; sourceTree = ""; }; - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iPhone_Sensors.mm; sourceTree = ""; }; - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhone_Sensors.h; sourceTree = ""; }; - 56FD43950ED4745200FE3770 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; - 5BAD78601F2B5A59006103DE /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libbugsnag-ios.a"; path = "Libraries/Plugins/iOS/Bugsnag/libbugsnag-ios.a"; sourceTree = SOURCE_ROOT; }; - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "LaunchScreen-iPhone.xib"; sourceTree = SOURCE_ROOT; }; - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 830B5C100E5ED4C100C7819F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 83B256E10E62FEA000468741 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 83B2574B0E63022200468741 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; - 83B2574E0E63025400468741 /* libiconv.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.2.dylib; path = usr/lib/libiconv.2.dylib; sourceTree = SDKROOT; }; - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit_Scripting.mm; sourceTree = ""; }; - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityReplayKit.mm; sourceTree = ""; }; - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityReplayKit.h; sourceTree = ""; }; - 8A0FED471649699200E9727D /* EAGLContextHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAGLContextHelper.h; sourceTree = ""; }; - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EAGLContextHelper.mm; sourceTree = ""; }; - 8A142DC41636943E00DD87CA /* Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = ""; }; - 8A142DC51636943E00DD87CA /* Keyboard.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Keyboard.mm; sourceTree = ""; }; - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FullScreenVideoPlayer.mm; sourceTree = ""; }; - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlesHelper.h; sourceTree = ""; }; - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GlesHelper.mm; sourceTree = ""; }; - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerBase.h; sourceTree = ""; }; - 8A25E6D118D767E20006A227 /* Filesystem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Filesystem.mm; sourceTree = ""; }; - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LifeCycleListener.h; sourceTree = ""; }; - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = LifeCycleListener.mm; sourceTree = ""; }; - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMVideoSampling.h; sourceTree = ""; }; - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CMVideoSampling.mm; sourceTree = ""; }; - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CVTextureCache.h; sourceTree = ""; }; - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CVTextureCache.mm; sourceTree = ""; }; - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SplashScreen.h; sourceTree = ""; }; - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SplashScreen.mm; sourceTree = ""; }; - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+ViewHandling.h"; sourceTree = ""; }; - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+ViewHandling.mm"; sourceTree = ""; }; - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderPluginDelegate.h; sourceTree = ""; }; - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RenderPluginDelegate.mm; sourceTree = ""; }; - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisplayManager.h; sourceTree = ""; }; - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DisplayManager.mm; sourceTree = ""; }; - 8A6137121A10B57700059EDF /* ObjCRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjCRuntime.h; sourceTree = ""; }; - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InternalProfiler.cpp; sourceTree = ""; }; - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InternalProfiler.h; sourceTree = ""; }; - 8A6720A619EFAF25006C92E0 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerBase.mm; sourceTree = ""; }; - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+iOS.h"; sourceTree = ""; }; - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+iOS.mm"; sourceTree = ""; }; - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityView+tvOS.h"; sourceTree = ""; }; - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityView+tvOS.mm"; sourceTree = ""; }; - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+iOS.h"; sourceTree = ""; }; - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+iOS.mm"; sourceTree = ""; }; - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityViewControllerBase+tvOS.h"; sourceTree = ""; }; - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityViewControllerBase+tvOS.mm"; sourceTree = ""; }; - 8A851BA516FB2F6D00E911DB /* UnityView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityView.h; sourceTree = ""; }; - 8A851BA616FB2F6D00E911DB /* UnityView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityView.mm; sourceTree = ""; }; - 8A851BA816FB3AD000E911DB /* UnityAppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityAppController.h; sourceTree = ""; }; - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityAppController.mm; sourceTree = ""; }; - 8A851BAB16FC875E00E911DB /* UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityInterface.h; sourceTree = ""; }; - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+UnityInterface.h"; sourceTree = ""; }; - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+UnityInterface.mm"; sourceTree = ""; }; - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityForwardDecls.h; sourceTree = ""; }; - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActivityIndicator.h; sourceTree = ""; }; - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ActivityIndicator.mm; sourceTree = ""; }; - 8AA108C01948732900D0538B /* UnityRendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityRendering.h; sourceTree = ""; }; - 8AA568AC1827DD79004969C7 /* WWWConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WWWConnection.h; sourceTree = ""; }; - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WWWConnection.mm; sourceTree = ""; }; - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnityAppController+Rendering.h"; sourceTree = ""; }; - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UnityAppController+Rendering.mm"; sourceTree = ""; }; - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UnityTrampolineConfigure.h; sourceTree = ""; }; - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoPlayer.h; sourceTree = ""; }; - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = VideoPlayer.mm; sourceTree = ""; }; - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVCapture.h; sourceTree = ""; }; - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OrientationSupport.h; sourceTree = ""; }; - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OrientationSupport.mm; sourceTree = ""; }; - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AVCapture.mm; sourceTree = ""; }; - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DeviceSettings.mm; sourceTree = ""; }; - 8ACB801D177081F7005D0019 /* Preprocessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Preprocessor.h; sourceTree = ""; }; - 8ADCE38919C87177006F04F6 /* CameraCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CameraCapture.h; sourceTree = ""; }; - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CameraCapture.mm; sourceTree = ""; }; - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityMetalSupport.h; sourceTree = ""; }; - 8AF7755E17997D1300341121 /* AppDelegateListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegateListener.h; sourceTree = ""; }; - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegateListener.mm; sourceTree = ""; }; - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; path = appext.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 960391211D6CE46E003BF157 /* MediaToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaToolbox.framework; path = System/Library/Frameworks/MediaToolbox.framework; sourceTree = SDKROOT; }; - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = UnityAdsUnityWrapper.mm; path = UnityAds/UnityAdsUnityWrapper.mm; sourceTree = ""; }; - 999475381A80DBC300178130 /* UnityAdsConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UnityAdsConfig.h; path = UnityAds/UnityAdsConfig.h; sourceTree = ""; }; - AA31BF961B55660D0013FB1B /* Data */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Data; sourceTree = ""; }; - AA5D99861AFAD3C800B27605 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterFeatures.cpp; sourceTree = ""; }; - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterFeatures.h; sourceTree = ""; }; - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnityViewControllerListener.h; sourceTree = ""; }; - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UnityViewControllerListener.mm; sourceTree = ""; }; - BBA14828996CB3D3322CD1DA /* TodayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TodayViewController.m; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.m"; sourceTree = SOURCE_ROOT; }; - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IUnityGraphicsMetal.h; path = Classes/Unity/IUnityGraphicsMetal.h; sourceTree = SOURCE_ROOT; }; - D82DCFBB0E8000A5005D6AD8 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = main.mm; path = Classes/main.mm; sourceTree = SOURCE_ROOT; }; - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterMonoModules.cpp; path = Libraries/RegisterMonoModules.cpp; sourceTree = SOURCE_ROOT; }; - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterMonoModules.h; path = Libraries/RegisterMonoModules.h; sourceTree = SOURCE_ROOT; }; - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libiPhone-lib.a"; path = "Libraries/libiPhone-lib.a"; sourceTree = SOURCE_ROOT; }; - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TodayViewController.h; path = "/Users/martin/src/unity-2018-test/ios/appext/TodayViewController.h"; sourceTree = SOURCE_ROOT; }; - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhonePortrait.png"; sourceTree = SOURCE_ROOT; }; - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "LaunchScreen-iPhoneLandscape.png"; sourceTree = SOURCE_ROOT; }; - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OnDemandResources.mm; sourceTree = ""; }; - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrashReporter.h; sourceTree = ""; }; - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CrashReporter.mm; sourceTree = ""; }; - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashReporter.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 120943439F2C11A4A2EF8C58 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 85DE4C94A4C7A7C01FFD11E5 /* NotificationCenter.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5BAD78611F2B5A59006103DE /* Security.framework in Frameworks */, - 960391221D6CE46E003BF157 /* MediaToolbox.framework in Frameworks */, - 00000000008063A1000160D3 /* libiPhone-lib.a in Frameworks */, - AA5D99871AFAD3C800B27605 /* CoreText.framework in Frameworks */, - 8358D1B80ED1CC3700E3A684 /* AudioToolbox.framework in Frameworks */, - 7F36C11313C5C673007FBDD9 /* AVFoundation.framework in Frameworks */, - 56FD43960ED4745200FE3770 /* CFNetwork.framework in Frameworks */, - 56B7959B1442E0F20026B3DD /* CoreGraphics.framework in Frameworks */, - 5692F3DD0FA9D8E500EBA2F1 /* CoreLocation.framework in Frameworks */, - 7F36C11113C5C673007FBDD9 /* CoreMedia.framework in Frameworks */, - 56B7960F1442E1770026B3DD /* CoreMotion.framework in Frameworks */, - 7F36C11213C5C673007FBDD9 /* CoreVideo.framework in Frameworks */, - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 5682F4B20F3B34FF007A219C /* MediaPlayer.framework in Frameworks */, - 83B2574C0E63022200468741 /* OpenAL.framework in Frameworks */, - 83B256E20E62FEA000468741 /* OpenGLES.framework in Frameworks */, - 83B2570B0E62FF8A00468741 /* QuartzCore.framework in Frameworks */, - 56BCBA390FCF049A0030C3B2 /* SystemConfiguration.framework in Frameworks */, - 830B5C110E5ED4C100C7819F /* UIKit.framework in Frameworks */, - 83B2574F0E63025400468741 /* libiconv.2.dylib in Frameworks */, - 918B4035B6A15444A0DBAFE8 /* libbugsnag-ios.a in Frameworks */, - C339431E88DF7B1A2A0807FA /* Metal.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57017FDCB0800090B9E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57717FDCB0800090B9E /* UIKit.framework in Frameworks */, - 5623C57617FDCB0800090B9E /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */, - 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */, - 8C964B9B97FFAFD590EEF1B5 /* appext.appex */, - ); - name = Products; - sourceTree = ""; - }; - 28CC40F5AF3FB5752DB99021 /* Bugsnag */ = { - isa = PBXGroup; - children = ( - 77384B0290964B004B86C3C3 /* libbugsnag-ios.a */, - ); - path = Bugsnag; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - AA31BF961B55660D0013FB1B /* Data */, - 56C56C9717D6015100616839 /* Images.xcassets */, - D82DCFB50E8000A5005D6AD8 /* Classes */, - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - D8A1C7220E80637F000160D3 /* Libraries */, - 19C28FACFE9D520D11CA2CBB /* Products */, - 8D1107310486CEB800E47090 /* Info.plist */, - 83B2574E0E63025400468741 /* libiconv.2.dylib */, - 7B7C425B97E31A1DB753BE49 /* LaunchScreen-iPhone.xib */, - E62644BCB44CBBD51C7D9752 /* LaunchScreen-iPhonePortrait.png */, - F15F41029590058094C5B388 /* LaunchScreen-iPhoneLandscape.png */, - 56114DD0BF89BB990D923A7C /* LaunchScreen-iPad.xib */, - 261D426BB4D611B183F2EBF6 /* LaunchScreen-iPad.png */, - 4C914EC99BFBF8DDC3DF16E6 /* appext */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 5BAD78601F2B5A59006103DE /* Security.framework */, - 960391211D6CE46E003BF157 /* MediaToolbox.framework */, - AA5D99861AFAD3C800B27605 /* CoreText.framework */, - 8358D1B70ED1CC3700E3A684 /* AudioToolbox.framework */, - 7F36C11013C5C673007FBDD9 /* AVFoundation.framework */, - 56FD43950ED4745200FE3770 /* CFNetwork.framework */, - 56B7959A1442E0F20026B3DD /* CoreGraphics.framework */, - 5692F3DC0FA9D8E500EBA2F1 /* CoreLocation.framework */, - 7F36C10E13C5C673007FBDD9 /* CoreMedia.framework */, - 56B795C11442E1100026B3DD /* CoreMotion.framework */, - 7F36C10F13C5C673007FBDD9 /* CoreVideo.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 5682F4B10F3B34FF007A219C /* MediaPlayer.framework */, - 83B2574B0E63022200468741 /* OpenAL.framework */, - 83B256E10E62FEA000468741 /* OpenGLES.framework */, - 83B2570A0E62FF8A00468741 /* QuartzCore.framework */, - 56BCBA380FCF049A0030C3B2 /* SystemConfiguration.framework */, - 830B5C100E5ED4C100C7819F /* UIKit.framework */, - 1C054391970787E9FCEBEA11 /* Metal.framework */, - 40A74CD9A1C12807AB23A003 /* NotificationCenter.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4C914EC99BFBF8DDC3DF16E6 /* appext */ = { - isa = PBXGroup; - children = ( - DE4046ACA9E7D0A533C34A24 /* TodayViewController.h */, - BBA14828996CB3D3322CD1DA /* TodayViewController.m */, - ); - path = appext; - sourceTree = ""; - }; - 5623C57817FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXGroup; - children = ( - 5623C57E17FDCB0900090B9E /* Unity_iPhone_Tests.m */, - 5623C57917FDCB0800090B9E /* Supporting Files */, - ); - path = "Unity-iPhone Tests"; - sourceTree = ""; - }; - 5623C57917FDCB0800090B9E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 5623C57A17FDCB0900090B9E /* Unity-iPhone Tests-Info.plist */, - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */, - 5623C58017FDCB0900090B9E /* Unity-iPhone Tests-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 8A3EDDC51615B7C1001839E9 /* UI */ = { - isa = PBXGroup; - children = ( - 8A9FCB111617295F00C05364 /* ActivityIndicator.h */, - 8A9FCB121617295F00C05364 /* ActivityIndicator.mm */, - 8A142DC41636943E00DD87CA /* Keyboard.h */, - 8A142DC51636943E00DD87CA /* Keyboard.mm */, - 8AC71EC219E7FBA90027502F /* OrientationSupport.h */, - 8AC71EC319E7FBA90027502F /* OrientationSupport.mm */, - 8A3EDDC61615B7C1001839E9 /* SplashScreen.h */, - 8A3EDDC71615B7C1001839E9 /* SplashScreen.mm */, - 4E090A331F27884B0077B28D /* StoreReview.m */, - 8A4815BF17A287D2003FBFD5 /* UnityAppController+ViewHandling.h */, - 8A4815C017A287D2003FBFD5 /* UnityAppController+ViewHandling.mm */, - 8A851BA516FB2F6D00E911DB /* UnityView.h */, - 8A851BA616FB2F6D00E911DB /* UnityView.mm */, - 8A7939FE1ED43EE100B44EF1 /* UnityView+iOS.h */, - 8A7939FF1ED43EE100B44EF1 /* UnityView+iOS.mm */, - 8A793A001ED43EE100B44EF1 /* UnityView+tvOS.h */, - 8A793A011ED43EE100B44EF1 /* UnityView+tvOS.mm */, - 8A21AED21622F59300AF8007 /* UnityViewControllerBase.h */, - 8A7939FC1ED2F53200B44EF1 /* UnityViewControllerBase.mm */, - 8A793A021ED43EE100B44EF1 /* UnityViewControllerBase+iOS.h */, - 8A793A031ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm */, - 8A793A041ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.h */, - 8A793A051ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm */, - ); - path = UI; - sourceTree = ""; - }; - 8A5C148F174E662D0006EB36 /* PluginBase */ = { - isa = PBXGroup; - children = ( - 8AF7755E17997D1300341121 /* AppDelegateListener.h */, - 8AF7755F17997D1300341121 /* AppDelegateListener.mm */, - 8A292A9717992CE100409BA4 /* LifeCycleListener.h */, - 8A292A9817992CE100409BA4 /* LifeCycleListener.mm */, - 8A5C1490174E662D0006EB36 /* RenderPluginDelegate.h */, - 8A5C1491174E662D0006EB36 /* RenderPluginDelegate.mm */, - AAFE69D019F187C200638316 /* UnityViewControllerListener.h */, - AAFE69D119F187C200638316 /* UnityViewControllerListener.mm */, - ); - path = PluginBase; - sourceTree = ""; - }; - 8AF18FE316490981007B4420 /* Unity */ = { - isa = PBXGroup; - children = ( - FC0B20A11B7A4F0B00FDFC55 /* OnDemandResources.mm */, - 8ABDBCE019CAFCF700A842FF /* AVCapture.h */, - 8AC74A9419B47FEF00019D38 /* AVCapture.mm */, - 8ADCE38919C87177006F04F6 /* CameraCapture.h */, - 8ADCE38A19C87177006F04F6 /* CameraCapture.mm */, - 8A2AA93316E0978D001FB470 /* CMVideoSampling.h */, - 8A2AA93416E0978D001FB470 /* CMVideoSampling.mm */, - 8A367F5916A6D36F0012ED11 /* CVTextureCache.h */, - 8A367F5A16A6D36F0012ED11 /* CVTextureCache.mm */, - 8ACB801B177081D4005D0019 /* DeviceSettings.mm */, - 8A5E0B8F16849D1800CBB6FE /* DisplayManager.h */, - 8A5E0B9016849D1800CBB6FE /* DisplayManager.mm */, - 8A0FED471649699200E9727D /* EAGLContextHelper.h */, - 8A0FED481649699200E9727D /* EAGLContextHelper.mm */, - 8A25E6D118D767E20006A227 /* Filesystem.mm */, - 8A1FFFAB16512A9000DD0934 /* GlesHelper.h */, - 8A1FFFAC16512A9000DD0934 /* GlesHelper.mm */, - 8A6720A319EEB905006C92E0 /* InternalProfiler.cpp */, - 8A6720A419EEB905006C92E0 /* InternalProfiler.h */, - 1859EA9A19214E7B0022C3D3 /* MetalHelper.mm */, - 8A16150B1A8E4362006FA788 /* FullScreenVideoPlayer.mm */, - 8A6137121A10B57700059EDF /* ObjCRuntime.h */, - 8A90541019EE8843003D1039 /* UnityForwardDecls.h */, - 8A851BAB16FC875E00E911DB /* UnityInterface.h */, - 8AECDC781950835600CB29E8 /* UnityMetalSupport.h */, - 8AA108C01948732900D0538B /* UnityRendering.h */, - 84DC28F71C51383500BC67D7 /* UnityReplayKit.h */, - 84DC28F51C5137FE00BC67D7 /* UnityReplayKit.mm */, - 848031E01C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm */, - 8AB3CB3C16D390BA00697AD5 /* VideoPlayer.h */, - 8AB3CB3D16D390BB00697AD5 /* VideoPlayer.mm */, - 8AA568AC1827DD79004969C7 /* WWWConnection.h */, - 8AA568AD1827DD79004969C7 /* WWWConnection.mm */, - 10D045FCB892F5FC0E6D6619 /* IUnityInterface.h */, - 2BBF4219A5252FE92CF13AFF /* IUnityGraphics.h */, - C1164748BFB32779A2F99E54 /* IUnityGraphicsMetal.h */, - ); - path = Unity; - sourceTree = ""; - }; - 91154904B5F8F49DA8EE103B /* iOS */ = { - isa = PBXGroup; - children = ( - 28CC40F5AF3FB5752DB99021 /* Bugsnag */, - ); - path = iOS; - sourceTree = ""; - }; - 999475211A7BC3B100178130 /* UnityAds */ = { - isa = PBXGroup; - children = ( - 999475381A80DBC300178130 /* UnityAdsConfig.h */, - 9994751F1A7BC3AE00178130 /* UnityAdsUnityWrapper.mm */, - ); - name = UnityAds; - sourceTree = ""; - }; - D82DCFB50E8000A5005D6AD8 /* Classes */ = { - isa = PBXGroup; - children = ( - 999475211A7BC3B100178130 /* UnityAds */, - 8A5C148F174E662D0006EB36 /* PluginBase */, - 8A3EDDC51615B7C1001839E9 /* UI */, - 8AF18FE316490981007B4420 /* Unity */, - FC3D7EBE16D2621600D1BD0D /* CrashReporter.h */, - FC85CCB916C3ED8000BAF7C7 /* CrashReporter.mm */, - 56DBF99E15E3CE85007A4A8D /* iPhone_Sensors.h */, - 56DBF99C15E3CDC9007A4A8D /* iPhone_Sensors.mm */, - D82DCFBB0E8000A5005D6AD8 /* main.mm */, - FC85CCBA16C3ED8000BAF7C7 /* PLCrashReporter.h */, - 8A6720A619EFAF25006C92E0 /* Prefix.pch */, - 8ACB801D177081F7005D0019 /* Preprocessor.h */, - 8A851BA816FB3AD000E911DB /* UnityAppController.h */, - 8A851BA916FB3AD000E911DB /* UnityAppController.mm */, - 8AA5D80017ABE9AF007B9910 /* UnityAppController+Rendering.h */, - 8AA5D80117ABE9AF007B9910 /* UnityAppController+Rendering.mm */, - 8A8D90D81A274A7800456C4E /* UnityAppController+UnityInterface.h */, - 8A8D90D91A274A7800456C4E /* UnityAppController+UnityInterface.mm */, - 8AA6ADDB17818CFD00A1C5F1 /* UnityTrampolineConfigure.h */, - ); - path = Classes; - sourceTree = SOURCE_ROOT; - }; - D8A1C7220E80637F000160D3 /* Libraries */ = { - isa = PBXGroup; - children = ( - AAC3E38B1A68945900F6174A /* RegisterFeatures.cpp */, - AAC3E38C1A68945900F6174A /* RegisterFeatures.h */, - D8A1C72A0E8063A1000160D3 /* libiPhone-lib.a */, - D8A1C7240E80637F000160D3 /* RegisterMonoModules.cpp */, - D8A1C7250E80637F000160D3 /* RegisterMonoModules.h */, - 03F528621B447098000F4FB8 /* Il2CppOptions.cpp */, - E27B4946AEA62AAE76F8EAB0 /* Plugins */, - ); - path = Libraries; - sourceTree = SOURCE_ROOT; - }; - E27B4946AEA62AAE76F8EAB0 /* Plugins */ = { - isa = PBXGroup; - children = ( - 91154904B5F8F49DA8EE103B /* iOS */, - ); - path = Plugins; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00C64C33A163F6BBBC3998DE /* appext */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */; - buildPhases = ( - 1984447697B50992FF7B71F3 /* Sources */, - 7B84486ABE0D25523243AE77 /* Resources */, - 120943439F2C11A4A2EF8C58 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = appext; - productName = appext; - productReference = 8C964B9B97FFAFD590EEF1B5 /* appext.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 83D0C1FD0E6C8D7700EBCE5D /* CopyFiles */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - 5D0844359B6763E1774306B4 /* Embed App Extensions */, - ); - buildRules = ( - ); - dependencies = ( - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */, - ); - name = "Unity-iPhone"; - productName = "iPhone-target"; - productReference = 1D6058910D05DD3D006BFB54 /* Unity-Target-New.app */; - productType = "com.apple.product-type.application"; - }; - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */; - buildPhases = ( - 5623C56F17FDCB0800090B9E /* Sources */, - 5623C57017FDCB0800090B9E /* Frameworks */, - 5623C57117FDCB0800090B9E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5623C58217FDCB0900090B9E /* PBXTargetDependency */, - ); - name = "Unity-iPhone Tests"; - productName = "Unity-iPhone Tests"; - productReference = 5623C57317FDCB0800090B9E /* Unity-iPhone Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - TargetAttributes = { - 1D6058900D05DD3D006BFB54 = { - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.GameControllers.appletvos = { - enabled = 1; - }; - }; - }; - 5623C57217FDCB0800090B9E = { - ProvisioningStyle = Automatic; - TestTargetID = 1D6058900D05DD3D006BFB54; - }; - }; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */; - compatibilityVersion = "Xcode 10.0"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* Unity-iPhone */, - 5623C57217FDCB0800090B9E /* Unity-iPhone Tests */, - 00C64C33A163F6BBBC3998DE /* appext */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - AA31BF971B55660D0013FB1B /* Data in Resources */, - 56C56C9817D6015200616839 /* Images.xcassets in Resources */, - EC704F7CBD3D41CF628F2A3E /* LaunchScreen-iPhone.xib in Resources */, - 862D4AB88B3E3198A4811205 /* LaunchScreen-iPhonePortrait.png in Resources */, - 27454C0FA464AC3B7CCC17D4 /* LaunchScreen-iPhoneLandscape.png in Resources */, - 7E5340E0BC6EE4272C577884 /* LaunchScreen-iPad.xib in Resources */, - CFF344AB9DCAD67AE16040C3 /* LaunchScreen-iPad.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C57117FDCB0800090B9E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57D17FDCB0900090B9E /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7B84486ABE0D25523243AE77 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1984447697B50992FF7B71F3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5B1242CF821E35921CA03C05 /* TodayViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D82DCFC30E8000A5005D6AD8 /* main.mm in Sources */, - 8A793A081ED43EE100B44EF1 /* UnityViewControllerBase+iOS.mm in Sources */, - D8A1C7280E80637F000160D3 /* RegisterMonoModules.cpp in Sources */, - 8AA568AE1827DD79004969C7 /* WWWConnection.mm in Sources */, - 56DBF99D15E3CDC9007A4A8D /* iPhone_Sensors.mm in Sources */, - 8A3EDDC81615B7C1001839E9 /* SplashScreen.mm in Sources */, - 8AC71EC419E7FBA90027502F /* OrientationSupport.mm in Sources */, - 8A7939FD1ED2F53200B44EF1 /* UnityViewControllerBase.mm in Sources */, - 8A9FCB131617295F00C05364 /* ActivityIndicator.mm in Sources */, - 8A8D90DA1A274A7800456C4E /* UnityAppController+UnityInterface.mm in Sources */, - 8AA5D80217ABE9AF007B9910 /* UnityAppController+Rendering.mm in Sources */, - 8A142DC61636943E00DD87CA /* Keyboard.mm in Sources */, - 8A0FED491649699200E9727D /* EAGLContextHelper.mm in Sources */, - AAFE69D219F187C200638316 /* UnityViewControllerListener.mm in Sources */, - 8A1FFFAD16512A9000DD0934 /* GlesHelper.mm in Sources */, - 848031E11C5160D700FCEAB7 /* UnityReplayKit_Scripting.mm in Sources */, - 8A5E0B9116849D1800CBB6FE /* DisplayManager.mm in Sources */, - 8A367F5B16A6D36F0012ED11 /* CVTextureCache.mm in Sources */, - 1859EA9B19214E7B0022C3D3 /* MetalHelper.mm in Sources */, - 8A16150C1A8E4362006FA788 /* FullScreenVideoPlayer.mm in Sources */, - FC85CCBB16C3ED8000BAF7C7 /* CrashReporter.mm in Sources */, - 8AB3CB3E16D390BB00697AD5 /* VideoPlayer.mm in Sources */, - 8A793A071ED43EE100B44EF1 /* UnityView+tvOS.mm in Sources */, - 8A2AA93516E0978D001FB470 /* CMVideoSampling.mm in Sources */, - 8A851BA716FB2F6D00E911DB /* UnityView.mm in Sources */, - 8A851BAA16FB3AD000E911DB /* UnityAppController.mm in Sources */, - 4E090A341F27885B0077B28D /* StoreReview.m in Sources */, - 8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */, - 8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */, - 8A6720A519EEB905006C92E0 /* InternalProfiler.cpp in Sources */, - 8A793A061ED43EE100B44EF1 /* UnityView+iOS.mm in Sources */, - 8ADCE38B19C87177006F04F6 /* CameraCapture.mm in Sources */, - 8A4815C117A28E7F003FBFD5 /* UnityAppController+ViewHandling.mm in Sources */, - 8A25E6D218D767E20006A227 /* Filesystem.mm in Sources */, - 999475201A7BC3AE00178130 /* UnityAdsUnityWrapper.mm in Sources */, - 8AF7755D1799329100341121 /* LifeCycleListener.mm in Sources */, - 8A5C1492174E662D0006EB36 /* RenderPluginDelegate.mm in Sources */, - 8AF7756017997D2700341121 /* AppDelegateListener.mm in Sources */, - FC0B20A21B7A4F0B00FDFC55 /* OnDemandResources.mm in Sources */, - AAC3E38D1A68945900F6174A /* RegisterFeatures.cpp in Sources */, - 84DC28F61C5137FE00BC67D7 /* UnityReplayKit.mm in Sources */, - 8ACB801C177081D4005D0019 /* DeviceSettings.mm in Sources */, - 03F528631B447098000F4FB8 /* Il2CppOptions.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5623C56F17FDCB0800090B9E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5623C57F17FDCB0900090B9E /* Unity_iPhone_Tests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 5623C58217FDCB0900090B9E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1D6058900D05DD3D006BFB54 /* Unity-iPhone */; - targetProxy = 5623C58117FDCB0900090B9E /* PBXContainerItemProxy */; - }; - DAE149C7A6FA6889F996CA4B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 00C64C33A163F6BBBC3998DE /* appext */; - targetProxy = FDB94AF4B0CAFAC931D760AF /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 5623C57B17FDCB0900090B9E /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 5623C57C17FDCB0900090B9E /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 11A74F8AB335D5F126F703F3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = Release; - }; - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForProfiling; - }; - 5623C58317FDCB0900090B9E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = Release; - }; - 5623C58417FDCB0900090B9E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - WRAPPER_EXTENSION = xctest; - }; - name = Debug; - }; - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForRunning; - }; - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForRunning; - }; - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForRunning; - }; - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = ReleaseForProfiling; - }; - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Classes/Prefix.pch; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Classes\"", - "\"$(SRCROOT)\"", - ); - INFOPLIST_FILE = Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/Libraries\"", - "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag", - ); - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "$(inherited)", - "-mno-thumb", - "-DTARGET_IPHONE_SIMULATOR=1", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(inherited)", - "$(OTHER_CFLAGS)", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-weak_framework", - CoreMotion, - "-weak-lSystem", - "-Wl,-undefined,dynamic_lookup", - ); - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - }; - name = ReleaseForProfiling; - }; - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = i386; - BUNDLE_LOADER = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/$(PRODUCT_NAME).app/$(PRODUCT_NAME)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_C_LANGUAGE_STANDARD = c11; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Unity-iPhone Tests/Unity-iPhone Tests-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "Unity-iPhone Tests/Unity-iPhone Tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Libraries/Plugins/iOS/Bugsnag"; - PRODUCT_NAME = ProductName; - PROVISIONING_PROFILE = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUNDLE_LOADER)"; - UNITY_RUNTIME_VERSION = 2018.2.5f1; - UNITY_SCRIPTING_BACKEND = mono2x; - VALIDATE_PRODUCT = YES; - WRAPPER_EXTENSION = xctest; - }; - name = ReleaseForProfiling; - }; - 6A04449D84D369E35D722281 /* ReleaseForRunning */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = ReleaseForRunning; - }; - A48A4D2186B6EBC59CF4A94E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = appext/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.unity3d.product.appext; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = ""; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = armv7; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_BITCODE = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_CPP_EXCEPTIONS = YES; - GCC_ENABLE_CPP_RTTI = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_USE_INDIRECT_FUNCTION_CALLS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphonesimulator; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058950D05DD3E006BFB54 /* Release */, - 56E860841D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860811D6757FF00A1AB2B /* ReleaseForRunning */, - 1D6058940D05DD3E006BFB54 /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4D584DF6A094B8796BE6683B /* Build configuration list for PBXNativeTarget "appext" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 11A74F8AB335D5F126F703F3 /* Release */, - 2ECD4AF68AA4D04EAC7C4ACC /* ReleaseForProfiling */, - 6A04449D84D369E35D722281 /* ReleaseForRunning */, - A48A4D2186B6EBC59CF4A94E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5623C58517FDCB0900090B9E /* Build configuration list for PBXNativeTarget "Unity-iPhone Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5623C58317FDCB0900090B9E /* Release */, - 56E860851D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860821D6757FF00A1AB2B /* ReleaseForRunning */, - 5623C58417FDCB0900090B9E /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Unity-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF5008A954540054247B /* Release */, - 56E860831D67581C00A1AB2B /* ReleaseForProfiling */, - 56E860801D6757FF00A1AB2B /* ReleaseForRunning */, - C01FCF4F08A954540054247B /* Debug */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/tests/BugsnagUnity.Tests/SessionTrackerTests.cs b/tests/BugsnagUnity.Tests/SessionTrackerTests.cs deleted file mode 100644 index 3ec5cd1bf..000000000 --- a/tests/BugsnagUnity.Tests/SessionTrackerTests.cs +++ /dev/null @@ -1,103 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.Linq; -using System.Threading; -using UnityEngine; - -namespace BugsnagUnity.Payload.Tests -{ - [TestClass] - public class SessionTrackerTests - { - private SessionTracker Tracker { get; set; } - - public SessionTrackerTests() - { - Client client = new Client(new NativeClient(new Configuration("api-key"))); - Tracker = new SessionTracker(client); - Assert.IsNotNull(Tracker); - } - - /** - * Verifies that a session can be resumed after it is stopped - */ - [TestMethod] - public void ResumeFromStoppedSession() - { - Tracker.StartSession(); - var originalSession = Tracker.CurrentSession; - Assert.IsNotNull(originalSession); - - Tracker.PauseSession(); - Assert.IsNull(Tracker.CurrentSession); - - Assert.IsTrue(Tracker.ResumeSession()); - Assert.IsTrue(SessionsAreTheSame(originalSession, Tracker.CurrentSession)); - } - - /** - * Verifies that the previous session is resumed when calling SessionTracker.ResumeSession - */ - [TestMethod] - public void ResumeWithNoStoppedSession() - { - Tracker.StartSession(); - Tracker.PauseSession(); - Assert.IsTrue(Tracker.ResumeSession()); - Assert.IsFalse(Tracker.ResumeSession()); - } - - /** - * Verifies that a new session can be created after the previous one is stopped - */ - [TestMethod] - public void StartNewAfterStoppedSession() - { - Tracker.StartSession(); - var originalSession = Tracker.CurrentSession; - - Tracker.PauseSession(); - Tracker.StartSession(); - Assert.AreNotEqual(originalSession, Tracker.CurrentSession); - } - - /** - * Verifies that calling SessionTracker.ResumeSession multiple times only starts one session - */ - [TestMethod] - public void MultipleResumesHaveNoEffect() - { - Tracker.StartSession(); - var original = Tracker.CurrentSession; - Tracker.PauseSession(); - - Assert.IsTrue(Tracker.ResumeSession()); - Assert.IsTrue(SessionsAreTheSame(original, Tracker.CurrentSession)); - - Assert.IsFalse(Tracker.ResumeSession()); - Assert.IsTrue(SessionsAreTheSame(original, Tracker.CurrentSession)); - } - - /** - * Verifies that calling SessionTracker.StopSession multiple times only stops one session - */ - [TestMethod] - public void MultipleStopsHaveNoEffect() - { - Tracker.StartSession(); - Assert.IsNotNull(Tracker.CurrentSession); - - Tracker.PauseSession(); - Assert.IsNull(Tracker.CurrentSession); - - Tracker.PauseSession(); - Assert.IsNull(Tracker.CurrentSession); - } - - private bool SessionsAreTheSame(Session original, Session other) - { - return original.Id == other.Id - && original.StartedAt == other.StartedAt; - } - } -} diff --git a/tests/BugsnagUnity.Tests/StackFrameParsingTests.cs b/tests/BugsnagUnity.Tests/StackFrameParsingTests.cs deleted file mode 100644 index bca19c09d..000000000 --- a/tests/BugsnagUnity.Tests/StackFrameParsingTests.cs +++ /dev/null @@ -1,126 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Threading; -using UnityEngine; - -namespace BugsnagUnity.Payload.Tests -{ - [TestClass] - public class StackFrameParsingTests - { - [TestMethod] - public void ParseMethodWithAt() - { - var stackframe = Payload.StackTraceLine.FromLogMessage( - "at UnityEngine.Events.InvokableCall.Invoke () [0x00010] in /Users/bokken/build/output/unity/unity/Runtime/Export/UnityEvent/UnityEvent.cs:178" - ); - Assert.AreEqual("UnityEngine.Events.InvokableCall.Invoke()", stackframe.Method); - } - - [TestMethod] - public void ParseMethodNameWithColon() - { - var stackframe = Payload.StackTraceLine.FromLogMessage( - "ReporterBehavior:LogCaughtException() (at /Users/gameserver/parky/Assets/ReporterBehavior.cs:58)" - ); - Assert.AreEqual("ReporterBehavior:LogCaughtException()", stackframe.Method); - Assert.AreEqual(58, stackframe.LineNumber); - Assert.AreEqual("/Users/gameserver/parky/Assets/ReporterBehavior.cs", stackframe.File); - } - - [TestMethod] - public void ParseMethodNameWithColonWithoutFileInfo() - { - var stackframe = Payload.StackTraceLine.FromLogMessage( - "UnityEngine.EventSystems.EventSystem:Update()" - ); - Assert.AreEqual("UnityEngine.EventSystems.EventSystem:Update()", stackframe.Method); - Assert.IsNull(stackframe.LineNumber); - Assert.IsNull(stackframe.File); - } - - [TestMethod] - public void ParseMethodNameWithSpace() - { - var stackframe = Payload.StackTraceLine.FromLogMessage( - "ReporterBehavior.AssertionFailure () (at /Users/gameserver/parky/Assets/ReporterBehavior.cs:46)" - ); - Assert.AreEqual("ReporterBehavior.AssertionFailure()", stackframe.Method); - Assert.AreEqual(46, stackframe.LineNumber); - Assert.AreEqual("/Users/gameserver/parky/Assets/ReporterBehavior.cs", stackframe.File); - } - - [TestMethod] - public void ParseFilePathWithSpace() - { - var stackframe = Payload.StackTraceLine.FromLogMessage( - "ReporterBehavior.AssertionFailure () (at /Users/game server/parky/Assets/ReporterBehavior.cs:46)" - ); - Assert.AreEqual("ReporterBehavior.AssertionFailure()", stackframe.Method); - Assert.AreEqual(46, stackframe.LineNumber); - Assert.AreEqual("/Users/game server/parky/Assets/ReporterBehavior.cs", stackframe.File); - } - - [TestMethod] - public void ParseMethodArgument() - { - var stackframe = Payload.StackTraceLine.FromLogMessage( - "UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:45)" - ); - Assert.AreEqual("UnityEngine.UI.Button.OnPointerClick(UnityEngine.EventSystems.PointerEventData eventData)", stackframe.Method); - Assert.AreEqual(45, stackframe.LineNumber); - Assert.AreEqual("/Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs", stackframe.File); - } - - [TestMethod] - public void ParseMultipleMethodArguments() - { - var stackframe = Payload.StackTraceLine.FromLogMessage( - "UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50)" - ); - Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData)", stackframe.Method); - Assert.AreEqual(50, stackframe.LineNumber); - Assert.AreEqual("/Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs", stackframe.File); - } - - [TestMethod] - public void ParseInterfaceMethod() - { - var stackframe = Payload.StackTraceLine.FromLogMessage( - "UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261)" - ); - Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler](UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor)", stackframe.Method); - Assert.AreEqual(261, stackframe.LineNumber); - Assert.AreEqual("/Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs", stackframe.File); - } - - [TestMethod] - public void ParseGenericMethod() - { - var stackframe = Payload.StackTraceLine.FromLogMessage( - "UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1].Invoke (.T1 handler, UnityEngine.EventSystems.BaseEventData eventData)" - ); - Assert.AreEqual("UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1].Invoke(.T1 handler, UnityEngine.EventSystems.BaseEventData eventData)", stackframe.Method); - Assert.IsNull(stackframe.LineNumber); - Assert.IsNull(stackframe.File); - } - - [TestMethod] - public void ParseUnknownManagedToNative() - { - var stackframe = Payload.StackTraceLine.FromLogMessage("at (wrapper managed-to-native) Program.NativeMethod(Program/StructToMarshal)"); - Assert.AreEqual("(wrapper managed-to-native) Program.NativeMethod(Program/StructToMarshal)", stackframe.Method); - - stackframe = Payload.StackTraceLine.FromLogMessage("at (wrapper scoop-de-woop) SomeClass.SomeMethod(Program / Something else)"); - Assert.AreEqual("(wrapper scoop-de-woop) SomeClass.SomeMethod(Program / Something else)", stackframe.Method); - } - - [TestMethod] - public void ParseAndroidMethod() - { - var stackframe = Payload.StackTraceLine.FromAndroidJavaMessage("at com.example.lib.BugsnagCrash.throwJvmException(BugsnagCrash.java:14)"); - Assert.AreEqual("com.example.lib.BugsnagCrash.throwJvmException()", stackframe.Method); - Assert.AreEqual("BugsnagCrash.java", stackframe.File); - Assert.AreEqual(14, stackframe.LineNumber); - } - } -} diff --git a/tests/BugsnagUnity.Tests/UniqueLogCounterTests.cs b/tests/BugsnagUnity.Tests/UniqueLogCounterTests.cs deleted file mode 100644 index 61406f9b1..000000000 --- a/tests/BugsnagUnity.Tests/UniqueLogCounterTests.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Threading; -using UnityEngine; - -namespace BugsnagUnity.Tests -{ - [TestClass] - public class UniqueLogCounterTests - { - [TestMethod] - public void ShouldNotSendDuplicateMessages() - { - var counter = new UniqueLogThrottle(new Configuration("foo")); - - var message1 = new UnityLogMessage("", "", LogType.Error); - var message2 = new UnityLogMessage("", "", LogType.Error); - - counter.ShouldSend(message1); - Assert.IsFalse(counter.ShouldSend(message2)); - } - - [TestMethod] - public void SendsSingleMessage() - { - var counter = new UniqueLogThrottle(new Configuration("foo")); - - var message = new UnityLogMessage("", "", LogType.Error); - - Assert.IsTrue(counter.ShouldSend(message)); - } - - [TestMethod] - public void FlushesCorrectly() - { - var configuration = new Configuration("foo"); - var counter = new UniqueLogThrottle(configuration); - - var message = new UnityLogMessage("", "", LogType.Error); - - counter.ShouldSend(message); - - Thread.Sleep(configuration.SecondsPerUniqueLog); - - message = new UnityLogMessage("", "", LogType.Error); - - Assert.IsTrue(counter.ShouldSend(message)); - } - } -} diff --git a/tests/SceneManager.cs b/tests/SceneManager.cs deleted file mode 100644 index 3bd2c07d1..000000000 --- a/tests/SceneManager.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace UnityEngine -{ - namespace SceneManagement { - public static void sceneLoaded() {} - - } -} diff --git a/tests/UnityEngine/AndroidJavaClass.cs b/tests/UnityEngine/AndroidJavaClass.cs deleted file mode 100644 index f92c3a9d1..000000000 --- a/tests/UnityEngine/AndroidJavaClass.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace UnityEngine -{ - public class AndroidJavaClass - { - public AndroidJavaClass(string name) - { - - } - } -} diff --git a/tests/UnityEngine/AndroidJavaObject.cs b/tests/UnityEngine/AndroidJavaObject.cs deleted file mode 100644 index 58b5809a2..000000000 --- a/tests/UnityEngine/AndroidJavaObject.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace UnityEngine -{ - public class AndroidJavaObject - { - public void CallStatic(string name, params object[] args) - { - - } - } -} diff --git a/tests/UnityEngine/Application.cs b/tests/UnityEngine/Application.cs deleted file mode 100644 index d659dbc52..000000000 --- a/tests/UnityEngine/Application.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace UnityEngine -{ - public class Application - { - // - // Summary: - // The version of the Unity runtime used to play the content. - public static string unityVersion { get; } - - // - // Summary: - // Returns the platform the game is running on (Read Only). - public static RuntimePlatform platform { get; } - - // - // Summary: - // The language the user's operating system is running in. - public static SystemLanguage systemLanguage { get; } - - // - // Summary: - // Returns application identifier at runtime. On Apple platforms this is the 'bundleIdentifier' - // saved in the info.plist file, on Android it's the 'package' from the AndroidManifest.xml. - public static string identifier { get; } - - // - // Summary: - // Returns application version number (Read Only). - public static string version { get; } - - // - // Summary: - // Return application company name (Read Only). - public static string companyName { get; } - - // - // Summary: - // Returns application product name (Read Only). - public static string productName { get; } - - public static void logMessageReceivedThreaded() { } - - public static void logMessageReceived() { } - - public static void add_logMessageReceivedThreaded(LogCallback cb) { } - - public static void add_logMessageReceived(LogCallback cb) { } - - public static string persistentDataPath { get; } - - public delegate void LogCallback(string condition, string stackTrace, LogType type); - - public delegate void LowMemoryCallback(); - - public static event LowMemoryCallback lowMemory; - - } -} diff --git a/tests/UnityEngine/AsyncOperation.cs b/tests/UnityEngine/AsyncOperation.cs deleted file mode 100644 index fb88d5f5a..000000000 --- a/tests/UnityEngine/AsyncOperation.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace UnityEngine -{ - public class AsyncOperation - { - public event Action completed; - } - - public class UnityWebRequestAsyncOperation : AsyncOperation - { - - } -} diff --git a/tests/UnityEngine/BatteryStatus.cs b/tests/UnityEngine/BatteryStatus.cs deleted file mode 100644 index 7c7ed568c..000000000 --- a/tests/UnityEngine/BatteryStatus.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace UnityEngine -{ - public enum BatteryStatus - { - Charging = 0 - } -} diff --git a/tests/UnityEngine/Debug.cs b/tests/UnityEngine/Debug.cs deleted file mode 100644 index b182d85d5..000000000 --- a/tests/UnityEngine/Debug.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace UnityEngine -{ - public class Debug - { - public static bool isDebugBuild { get; } - public static void LogError(object message) { } - public static void LogWarning(object message) { } - - } -} diff --git a/tests/UnityEngine/DownloadHandler.cs b/tests/UnityEngine/DownloadHandler.cs deleted file mode 100644 index 00b584a96..000000000 --- a/tests/UnityEngine/DownloadHandler.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace UnityEngine -{ - public class DownloadHandler - { - } - - public class DownloadHandlerBuffer : DownloadHandler - { - - } -} diff --git a/tests/UnityEngine/GameObject.cs b/tests/UnityEngine/GameObject.cs deleted file mode 100644 index 05fc21013..000000000 --- a/tests/UnityEngine/GameObject.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace UnityEngine -{ - public class Component - { - } - public class GameObject - { - public GameObject(string name) { } - public T AddComponent() where T : Component - { - return null; - } - } -} diff --git a/tests/UnityEngine/JsonUtility.cs b/tests/UnityEngine/JsonUtility.cs deleted file mode 100644 index 917797373..000000000 --- a/tests/UnityEngine/JsonUtility.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -namespace UnityEngine -{ - public class JsonUtility - { - public JsonUtility() - { - } - public static T FromJson(string json) { - var t = new object(); - return (T)t; - } - public static string ToJson(object obj) { - return string.Empty; - } - - - } -} diff --git a/tests/UnityEngine/LoadSceneMode.cs b/tests/UnityEngine/LoadSceneMode.cs deleted file mode 100644 index a7ce70917..000000000 --- a/tests/UnityEngine/LoadSceneMode.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace UnityEngine.SceneManagement -{ - // - // Summary: - // Used when loading a scene in a player. - public enum LoadSceneMode - { - // - // Summary: - // Closes all current loaded scenes and loads a scene. - Single = 0, - // - // Summary: - // Adds the scene to the current loaded scenes. - Additive = 1 - } -} diff --git a/tests/UnityEngine/LogType.cs b/tests/UnityEngine/LogType.cs deleted file mode 100644 index e908f41a2..000000000 --- a/tests/UnityEngine/LogType.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace UnityEngine -{ - // - // Summary: - // The type of the log message in Debug.unityLogger.Log or delegate registered with - // Application.RegisterLogCallback. - public enum LogType - { - // - // Summary: - // LogType used for Errors. - Error = 0, - // - // Summary: - // LogType used for Asserts. (These could also indicate an error inside Unity itself.) - Assert = 1, - // - // Summary: - // LogType used for Warnings. - Warning = 2, - // - // Summary: - // LogType used for regular log messages. - Log = 3, - // - // Summary: - // LogType used for Exceptions. - Exception = 4 - } -} diff --git a/tests/UnityEngine/MonoBehaviour.cs b/tests/UnityEngine/MonoBehaviour.cs deleted file mode 100644 index bcbcbf8ca..000000000 --- a/tests/UnityEngine/MonoBehaviour.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace UnityEngine -{ - public class MonoBehaviour : Component - { - } -} diff --git a/tests/UnityEngine/Object.cs b/tests/UnityEngine/Object.cs deleted file mode 100644 index ea5fdd6b1..000000000 --- a/tests/UnityEngine/Object.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -namespace UnityEngine -{ - public class Object - { - public Object() - { - } - - public static bool op_Equality(UnityEngine.Object a, UnityEngine.Object b) - { - return a == b; - } - } -} diff --git a/tests/UnityEngine/PlayerPrefs.cs b/tests/UnityEngine/PlayerPrefs.cs deleted file mode 100644 index 6f1f865a3..000000000 --- a/tests/UnityEngine/PlayerPrefs.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -namespace UnityEngine -{ - public class PlayerPrefs - { - public static bool HasKey(string key) - { - return false; - } - - public static void SetString(string key, string value) - { - } - - public static string GetString(string key) - { - return ""; - } - } -} diff --git a/tests/UnityEngine/Resolution.cs b/tests/UnityEngine/Resolution.cs deleted file mode 100644 index 5cdf27063..000000000 --- a/tests/UnityEngine/Resolution.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -namespace UnityEngine -{ - public struct Resolution - { - /// - /// Resolution width in pixels. - /// - public int width - { - get; - set; - } - - /// - /// Resolution height in pixels. - /// - public int height - { - get; - set; - } - } -} diff --git a/tests/UnityEngine/RuntimePlatform.cs b/tests/UnityEngine/RuntimePlatform.cs deleted file mode 100644 index 4e82dc79d..000000000 --- a/tests/UnityEngine/RuntimePlatform.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace UnityEngine -{ - public enum RuntimePlatform - { - } -} diff --git a/tests/UnityEngine/Scene.cs b/tests/UnityEngine/Scene.cs deleted file mode 100644 index 7d0723d3f..000000000 --- a/tests/UnityEngine/Scene.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace UnityEngine -{ - public struct Scene - { - public string name { get; } - } -} diff --git a/tests/UnityEngine/SceneManager.cs b/tests/UnityEngine/SceneManager.cs deleted file mode 100644 index 17a8945e9..000000000 --- a/tests/UnityEngine/SceneManager.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using UnityEngine.Events; - -namespace UnityEngine.SceneManagement -{ - public struct Scene { } - - public class SceneManager - { - public static void add_sceneLoaded(UnityAction action) { } - } -} \ No newline at end of file diff --git a/tests/UnityEngine/Screen.cs b/tests/UnityEngine/Screen.cs deleted file mode 100644 index c6013f42f..000000000 --- a/tests/UnityEngine/Screen.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -namespace UnityEngine -{ - public class Screen - { - public static float dpi { get; } - - public static Resolution currentResolution - { - get; - } - } -} diff --git a/tests/UnityEngine/SystemInfo.cs b/tests/UnityEngine/SystemInfo.cs deleted file mode 100644 index a00e98140..000000000 --- a/tests/UnityEngine/SystemInfo.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace UnityEngine -{ - public class SystemInfo - { - public static string deviceModel { get; } - public static string deviceUniqueIdentifier { get; } - public static string graphicsDeviceVersion { get; } - public static int graphicsMemorySize { get; } - public static int graphicsShaderLevel { get; } - public static int systemMemorySize { get; } - public static string processorType { get; } - public static string systemLanguage { get; } - public static float batteryLevel { get; } - public static BatteryStatus batteryStatus { get; } - } - namespace Events - { - } -} diff --git a/tests/UnityEngine/SystemLanguage.cs b/tests/UnityEngine/SystemLanguage.cs deleted file mode 100644 index 1a570ca5b..000000000 --- a/tests/UnityEngine/SystemLanguage.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace UnityEngine -{ - public enum SystemLanguage - { - } -} diff --git a/tests/UnityEngine/Time.cs b/tests/UnityEngine/Time.cs deleted file mode 100644 index ea5c43acb..000000000 --- a/tests/UnityEngine/Time.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace UnityEngine -{ - public class Time - { - - public static float realtimeSinceStartup { get; set; } - - } -} \ No newline at end of file diff --git a/tests/UnityEngine/UnityAction.cs b/tests/UnityEngine/UnityAction.cs deleted file mode 100644 index 6173ac000..000000000 --- a/tests/UnityEngine/UnityAction.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace UnityEngine.Events -{ - - - public class UnityEvent { - public void AddListener(UnityAction action) { } - public void Invoke() { } - } - - public class UnityEvent { - public void AddListener(UnityAction action) { } - public void Invoke(T0 arg0) { } - } - - public delegate void UnityAction(); - public delegate void UnityAction(T0 arg0); - public delegate void UnityAction(T0 arg0, T1 arg1); - public delegate void UnityAction(T0 arg0, T1 arg1, T2 arg2); - public delegate void UnityAction(T0 arg0, T1 arg1, T2 arg2, T3 arg3); -} diff --git a/tests/UnityEngine/UnityEngine.csproj b/tests/UnityEngine/UnityEngine.csproj deleted file mode 100644 index 30cd5a42e..000000000 --- a/tests/UnityEngine/UnityEngine.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - netstandard2.0 - - - - diff --git a/tests/UnityEngine/UnityWebRequest.cs b/tests/UnityEngine/UnityWebRequest.cs deleted file mode 100644 index 2e83bce3d..000000000 --- a/tests/UnityEngine/UnityWebRequest.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; - -namespace UnityEngine.Networking -{ - public class UnityWebRequest - { - public UnityWebRequest(Uri uri, string method) - { - - } - - // - // Summary: - // Set a HTTP request header to a custom value. - // - // Parameters: - // name: - // The key of the header to be set. Case-sensitive. - // - // value: - // The header's intended value. - public void SetRequestHeader(string name, string value) - { - - } - - // - // Summary: - // Holds a reference to the UploadHandler object which manages body data to be uploaded - // to the remote server. - public UploadHandler uploadHandler { get; set; } - // - // Summary: - // Holds a reference to a DownloadHandler object, which manages body data received - // from the remote server by this UnityWebRequest. - public DownloadHandler downloadHandler { get; set; } - - // - // Summary: - // Begin communicating with the remote server. After calling this method, the UnityWebRequest - // will perform DNS resolution (if necessary), transmit an HTTP request to the remote - // server at the target URL and process the server’s response. This method can only - // be called once on any given UnityWebRequest object. Once this method is called, - // you cannot change any of the UnityWebRequest’s properties. This method returns - // a WebRequestAsyncOperation object. Yielding the WebRequestAsyncOperation inside - // a coroutine will cause the coroutine to pause until the UnityWebRequest encounters - // a system error or finishes communicating. - public UnityWebRequestAsyncOperation SendWebRequest() - { - throw new NotImplementedException(); - } - } -} diff --git a/tests/UnityEngine/UploadHandler.cs b/tests/UnityEngine/UploadHandler.cs deleted file mode 100644 index 92a29adf2..000000000 --- a/tests/UnityEngine/UploadHandler.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace UnityEngine.Networking -{ - public class UploadHandler - { - } - - public class UploadHandlerRaw : UploadHandler - { - // - // Summary: - // General constructor. Contents of the input argument are copied into a native - // buffer. - // - // Parameters: - // data: - // Raw data to transmit to the remote server. - public UploadHandlerRaw(byte[] data) - { - - } - } -} diff --git a/tests/UnityEngine/WaitForSeconds.cs b/tests/UnityEngine/WaitForSeconds.cs deleted file mode 100644 index 09a0a97b4..000000000 --- a/tests/UnityEngine/WaitForSeconds.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -namespace UnityEngine -{ - public class WaitForSeconds - { - public WaitForSeconds(float time) - { - } - } -} diff --git a/upm-tools/AssemblyDefinitions/Bugsnag.asmdef b/upm-tools/AssemblyDefinitions/Bugsnag.asmdef deleted file mode 100644 index b7a25e197..000000000 --- a/upm-tools/AssemblyDefinitions/Bugsnag.asmdef +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "Bugsnag" -} diff --git a/upm-tools/AssemblyDefinitions/Bugsnag.asmdef.meta b/upm-tools/AssemblyDefinitions/Bugsnag.asmdef.meta deleted file mode 100644 index 7ea78050e..000000000 --- a/upm-tools/AssemblyDefinitions/Bugsnag.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 79cbc3dae02434826abb4c594c4cb09b -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/upm-tools/EDM/BugsnagAndroidDependencies.xml b/upm/EDM/BugsnagAndroidDependencies.xml similarity index 100% rename from upm-tools/EDM/BugsnagAndroidDependencies.xml rename to upm/EDM/BugsnagAndroidDependencies.xml diff --git a/upm-tools/EDM/BugsnagAndroidDependencies.xml.meta b/upm/EDM/BugsnagAndroidDependencies.xml.meta similarity index 100% rename from upm-tools/EDM/BugsnagAndroidDependencies.xml.meta rename to upm/EDM/BugsnagAndroidDependencies.xml.meta diff --git a/upm-tools/README.md b/upm/README.md similarity index 100% rename from upm-tools/README.md rename to upm/README.md diff --git a/upm-tools/README.md.meta b/upm/README.md.meta similarity index 100% rename from upm-tools/README.md.meta rename to upm/README.md.meta diff --git a/upm-tools/UPMImportProject/Assets/Scenes.meta b/upm/UPMImportProject/Assets/Scenes.meta similarity index 100% rename from upm-tools/UPMImportProject/Assets/Scenes.meta rename to upm/UPMImportProject/Assets/Scenes.meta diff --git a/upm-tools/UPMImportProject/Assets/Scenes/SampleScene.unity b/upm/UPMImportProject/Assets/Scenes/SampleScene.unity similarity index 100% rename from upm-tools/UPMImportProject/Assets/Scenes/SampleScene.unity rename to upm/UPMImportProject/Assets/Scenes/SampleScene.unity diff --git a/upm-tools/UPMImportProject/Assets/Scenes/SampleScene.unity.meta b/upm/UPMImportProject/Assets/Scenes/SampleScene.unity.meta similarity index 100% rename from upm-tools/UPMImportProject/Assets/Scenes/SampleScene.unity.meta rename to upm/UPMImportProject/Assets/Scenes/SampleScene.unity.meta diff --git a/upm-tools/UPMImportProject/Packages/manifest.json b/upm/UPMImportProject/Packages/manifest.json similarity index 100% rename from upm-tools/UPMImportProject/Packages/manifest.json rename to upm/UPMImportProject/Packages/manifest.json diff --git a/upm-tools/UPMImportProject/ProjectSettings/AudioManager.asset b/upm/UPMImportProject/ProjectSettings/AudioManager.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/AudioManager.asset rename to upm/UPMImportProject/ProjectSettings/AudioManager.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/ClusterInputManager.asset b/upm/UPMImportProject/ProjectSettings/ClusterInputManager.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/ClusterInputManager.asset rename to upm/UPMImportProject/ProjectSettings/ClusterInputManager.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/DynamicsManager.asset b/upm/UPMImportProject/ProjectSettings/DynamicsManager.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/DynamicsManager.asset rename to upm/UPMImportProject/ProjectSettings/DynamicsManager.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/EditorBuildSettings.asset b/upm/UPMImportProject/ProjectSettings/EditorBuildSettings.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/EditorBuildSettings.asset rename to upm/UPMImportProject/ProjectSettings/EditorBuildSettings.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/EditorSettings.asset b/upm/UPMImportProject/ProjectSettings/EditorSettings.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/EditorSettings.asset rename to upm/UPMImportProject/ProjectSettings/EditorSettings.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/GraphicsSettings.asset b/upm/UPMImportProject/ProjectSettings/GraphicsSettings.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/GraphicsSettings.asset rename to upm/UPMImportProject/ProjectSettings/GraphicsSettings.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/InputManager.asset b/upm/UPMImportProject/ProjectSettings/InputManager.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/InputManager.asset rename to upm/UPMImportProject/ProjectSettings/InputManager.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/NavMeshAreas.asset b/upm/UPMImportProject/ProjectSettings/NavMeshAreas.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/NavMeshAreas.asset rename to upm/UPMImportProject/ProjectSettings/NavMeshAreas.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/NetworkManager.asset b/upm/UPMImportProject/ProjectSettings/NetworkManager.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/NetworkManager.asset rename to upm/UPMImportProject/ProjectSettings/NetworkManager.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/Physics2DSettings.asset b/upm/UPMImportProject/ProjectSettings/Physics2DSettings.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/Physics2DSettings.asset rename to upm/UPMImportProject/ProjectSettings/Physics2DSettings.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/PresetManager.asset b/upm/UPMImportProject/ProjectSettings/PresetManager.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/PresetManager.asset rename to upm/UPMImportProject/ProjectSettings/PresetManager.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/ProjectSettings.asset b/upm/UPMImportProject/ProjectSettings/ProjectSettings.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/ProjectSettings.asset rename to upm/UPMImportProject/ProjectSettings/ProjectSettings.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/ProjectVersion.txt b/upm/UPMImportProject/ProjectSettings/ProjectVersion.txt similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/ProjectVersion.txt rename to upm/UPMImportProject/ProjectSettings/ProjectVersion.txt diff --git a/upm-tools/UPMImportProject/ProjectSettings/QualitySettings.asset b/upm/UPMImportProject/ProjectSettings/QualitySettings.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/QualitySettings.asset rename to upm/UPMImportProject/ProjectSettings/QualitySettings.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/TagManager.asset b/upm/UPMImportProject/ProjectSettings/TagManager.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/TagManager.asset rename to upm/UPMImportProject/ProjectSettings/TagManager.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/TimeManager.asset b/upm/UPMImportProject/ProjectSettings/TimeManager.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/TimeManager.asset rename to upm/UPMImportProject/ProjectSettings/TimeManager.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/UnityConnectSettings.asset b/upm/UPMImportProject/ProjectSettings/UnityConnectSettings.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/UnityConnectSettings.asset rename to upm/UPMImportProject/ProjectSettings/UnityConnectSettings.asset diff --git a/upm-tools/UPMImportProject/ProjectSettings/VFXManager.asset b/upm/UPMImportProject/ProjectSettings/VFXManager.asset similarity index 100% rename from upm-tools/UPMImportProject/ProjectSettings/VFXManager.asset rename to upm/UPMImportProject/ProjectSettings/VFXManager.asset diff --git a/upm-tools/build-edm-package.sh b/upm/build-edm-package.sh similarity index 100% rename from upm-tools/build-edm-package.sh rename to upm/build-edm-package.sh diff --git a/upm-tools/build-upm-package.sh b/upm/build-upm-package.sh similarity index 87% rename from upm-tools/build-upm-package.sh rename to upm/build-upm-package.sh index 7fa5c334b..69ed18e72 100755 --- a/upm-tools/build-upm-package.sh +++ b/upm/build-upm-package.sh @@ -58,17 +58,12 @@ $UNITY_PATH/Unity $DEFAULT_CLI_ARGS \ echo "Copying over the unpacked sdk files" cp -r UPMImportProject/Assets/Bugsnag/. $PACKAGE_DIR -echo "Copying over the package manifest, asembly defs and readme" +echo "Copying over the package manifest and readme" cp package.json $PACKAGE_DIR cp package.json.meta $PACKAGE_DIR cp README.md $PACKAGE_DIR cp README.md.meta $PACKAGE_DIR -cp AssemblyDefinitions/Bugsnag.asmdef "$PACKAGE_DIR/Scripts" -cp AssemblyDefinitions/Bugsnag.asmdef.meta "$PACKAGE_DIR/Scripts" -cp AssemblyDefinitions/BugsnagEditor.asmdef "$PACKAGE_DIR/Editor" -cp AssemblyDefinitions/BugsnagEditor.asmdef.meta "$PACKAGE_DIR/Editor" - # remove EDM menu from package rm "$PACKAGE_DIR/Editor/BugsnagEditor.EDM.cs" diff --git a/upm-tools/package.json b/upm/package.json similarity index 100% rename from upm-tools/package.json rename to upm/package.json diff --git a/upm-tools/package.json.meta b/upm/package.json.meta similarity index 100% rename from upm-tools/package.json.meta rename to upm/package.json.meta From 9a548eddd4001cbda138b008d3171dd4b45f75e5 Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 10:31:06 +0100 Subject: [PATCH 19/46] editor only asmblydeff --- Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.asmdef | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.asmdef b/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.asmdef index 04d19fe3c..ed3a6ada5 100644 --- a/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.asmdef +++ b/Bugsnag/Assets/Bugsnag/Editor/BugsnagEditor.asmdef @@ -4,7 +4,9 @@ "references": [ "GUID:8d198819d450d4d6292709bec5a655cc" ], - "includePlatforms": [], + "includePlatforms": [ + "Editor" + ], "excludePlatforms": [], "allowUnsafeCode": false, "overrideReferences": false, From 55a0cf8886dd78857d7e84a2c866f90499580850 Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 11:08:09 +0100 Subject: [PATCH 20/46] update upgrading guide --- Rakefile | 30 +++++++++++------------------- UPGRADING.md | 4 +--- util/remove-bugsnag-v5.sh | 18 ------------------ 3 files changed, 12 insertions(+), 40 deletions(-) delete mode 100755 util/remove-bugsnag-v5.sh diff --git a/Rakefile b/Rakefile index 025f26518..dd547e9c3 100644 --- a/Rakefile +++ b/Rakefile @@ -55,27 +55,19 @@ def get_required_unity_paths [dir, exe] end -## # -# Run a command with the unity executable and the default command line parameters -# that we apply +# Run a command with the Unity executable and apply default command line parameters. # -def unity(*cmd, force_free: true, no_graphics: true) +def unity(*cmd) raise "Unable to locate Unity executable in #{unity_directory}" unless unity_executable - cmd_prepend = [unity_executable, "-force-free", "-batchmode", "-nographics", "-logFile", "unity.log", "-quit"] - unless force_free - cmd_prepend = cmd_prepend - ["-force-free"] - end - unless no_graphics - cmd_prepend = cmd_prepend - ["-nographics"] - end - cmd = cmd.unshift(*cmd_prepend) - sh *cmd do |ok, res| - if !ok - puts File.read("unity.log") if File.exist?("unity.log") + unity_options = [unity_executable, "-batchmode", "-logFile", "unity.log", "-quit", "-nographics"] - raise "unity error: #{res}" + full_cmd = unity_options + cmd + sh *full_cmd do |ok, res| + unless ok + puts File.read("unity.log") if File.exist?("unity.log") + raise "Unity error: #{res}" end end end @@ -93,17 +85,17 @@ def plugins_dir end def run_unit_tests - unity "-runTests", "-batchmode", "-projectPath", project_path, "-testPlatform", "EditMode", "-testResults", File.join(current_directory, "testResults.xml") , force_free: false + unity "-runTests", "-projectPath", project_path, "-testPlatform", "EditMode", "-testResults", File.join(current_directory, "testResults.xml") end def apply_plugin_import_settings - unity "-quit", "-batchmode", "-projectPath", project_path, "-executeMethod", "ForceImportSettings.ApplyImportSettings" + unity "-projectPath", project_path, "-executeMethod", "ForceImportSettings.ApplyImportSettings" end def export_package name="Bugsnag.unitypackage" package_output = File.join(current_directory, name) FileUtils.rm_rf package_output - unity "-projectPath", project_path, "-exportPackage", "Assets/Bugsnag", package_output, force_free: false + unity "-projectPath", project_path, "-exportPackage", "Assets/Bugsnag", package_output end def assemble_android filter_abis=true diff --git a/UPGRADING.md b/UPGRADING.md index 9430c9daa..439102169 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -49,9 +49,7 @@ You can now install Bugsnag using the [Unity Package Manager](https://docs.unity All the files in the V6 package are located in a parent Bugsnag directory and so you will need to remove all the v5 files from your project to avoid having multiple instances of Bugsnag running. -To remove these files, you can download and run the bash script `utils/remove-bugsnag-v5.sh` in the `bugsnag-unity` repository, passing the path to your project as a parameter. - -If you wish to do it manually, please remove the following directories and files: +Please remove the following directories and files: - File: `Assets/Plugins/Android/BugsnagUnity.Android.dll` - File: `Assets/Plugins/Android/bugsnag-android-ndk-release.aar` diff --git a/util/remove-bugsnag-v5.sh b/util/remove-bugsnag-v5.sh deleted file mode 100755 index e4890a336..000000000 --- a/util/remove-bugsnag-v5.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -if [ -z "$1" ] -then - echo "ERROR: Project path not set, please pass the path to your unity project as the first argument" - exit 1 -fi - -PROJECT_PATH=$1 - -cd $PROJECT_PATH - -find . -iname "*bugsnag*" -delete - -rm -f "Assets/Plugins/Android/kotlin-annotations.jar" -rm -f "Assets/Plugins/Android/kotlin-stdlib-common.jar" -rm -f "Assets/Plugins/Android/kotlin-stdlib.jar" -rm -r -f "Assets/Plugins/OSX/Bugsnag" \ No newline at end of file From bdac2201a1c28240158228c481d03a065bb451ed Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 13:57:51 +0100 Subject: [PATCH 21/46] fix upm generation --- .gitignore | 4 ++++ upm/build-upm-package.sh | 41 ++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 7593da23c..500c58fde 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,7 @@ Bugsnag/Temp Bugsnag/UserSettings Bugsnag/Assets/Bugsnag/Plugins Bugsnag/Packages +upm/UPMImportProject/Library +upm-package +upm/UPMImportProject/.vscode +UPMImportProject.sln diff --git a/upm/build-upm-package.sh b/upm/build-upm-package.sh index 69ed18e72..52bbf9ddf 100755 --- a/upm/build-upm-package.sh +++ b/upm/build-upm-package.sh @@ -26,34 +26,35 @@ fi #In which case all sub dirs and files must have .meta files to work with UPM. #Building the UPM package with unity 2019 ensures that the meta files are created -if [[ "$UNITY_UPM_VERSION" != *"2019"* ]]; then - echo "ERROR: UNITY_UPM_VERSION must be a version of Unity 2019. See script comments for details." - exit 1 -fi +# if [[ "$UNITY_UPM_VERSION" != *"2019"* ]]; then +# echo "ERROR: UNITY_UPM_VERSION must be a version of Unity 2019. See script comments for details." +# exit 1 +# fi -UNITY_PATH="/Applications/Unity/Hub/Editor/$UNITY_UPM_VERSION/Unity.app/Contents/MacOS" +# UNITY_PATH="/Applications/Unity/Hub/Editor/$UNITY_UPM_VERSION/Unity.app/Contents/MacOS" -#Check for the release package -echo "Checking for the release package" +# #Check for the release package +# echo "Checking for the release package" -# make sure the package of the release is present after building -if [ ! -f "$PACKAGE_FILE" ]; then - echo "$PACKAGE_FILE not found, please provide a release package." - exit 1 -fi +# # make sure the package of the release is present after building +# if [ ! -f "$PACKAGE_FILE" ]; then +# echo "$PACKAGE_FILE not found, please provide a release package." +# exit 1 +# fi -echo "SDK package found" +# echo "SDK package found" -echo "\`Unity\` executable = $UNITY_PATH/Unity" +# echo "\`Unity\` executable = $UNITY_PATH/Unity" -#Import unitypackage into the Import project -echo "Importing Bugsnag.unitypackage into the import project" -$UNITY_PATH/Unity $DEFAULT_CLI_ARGS \ - -projectPath $PROJECT_PATH \ - -ignoreCompilerErrors \ - -importPackage $SCRIPT_PATH/../Bugsnag.unitypackage +# #Import unitypackage into the Import project +# echo "Importing Bugsnag.unitypackage into the import project" +# $UNITY_PATH/Unity $DEFAULT_CLI_ARGS \ +# -projectPath $PROJECT_PATH \ +# -ignoreCompilerErrors \ +# -logFile upm-import-log.log \ +# -importPackage $SCRIPT_PATH/../Bugsnag.unitypackage echo "Copying over the unpacked sdk files" cp -r UPMImportProject/Assets/Bugsnag/. $PACKAGE_DIR From 69c44c57874ee5810d8bd5fda25d4d9e470d10d3 Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 14:28:14 +0100 Subject: [PATCH 22/46] import --- Bugsnag/Assets/Editor/ForceImportSettings.cs | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/Bugsnag/Assets/Editor/ForceImportSettings.cs b/Bugsnag/Assets/Editor/ForceImportSettings.cs index 567113411..a383d2439 100644 --- a/Bugsnag/Assets/Editor/ForceImportSettings.cs +++ b/Bugsnag/Assets/Editor/ForceImportSettings.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.IO; using UnityEditor; using UnityEngine; @@ -10,6 +11,7 @@ public static void ApplyImportSettings() ApplyPluginImportSettings("Assets/Bugsnag/Plugins/MacOS", new List { BuildTarget.StandaloneOSX }); ApplyPluginImportSettings("Assets/Bugsnag/Plugins/tvOS", new List { BuildTarget.tvOS }); ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Android", new List { BuildTarget.Android }); + GenerateMetaFilesForBundle(); } private static List RelevantBuildTargets = new List { @@ -55,4 +57,43 @@ private static void ApplyPluginImportSettings(string dir, List targ AssetDatabase.Refresh(); Debug.Log("Import settings applied and Asset Database refreshed."); } + + private static void GenerateMetaFilesForBundle() + { + string sourceDir = "Assets/Editor/Bugsnag/Plugins/MacOS/bugsnag-osx.bundle"; + string tempDir = "Assets/Editor/Bugsnag/Plugins/MacOS/bundleMetaGeneration"; + + // Step 1: Copy contents of bugsnag-osx.bundle to bundleMetaGeneration + if (Directory.Exists(tempDir)) + { + Directory.Delete(tempDir, true); + } + Directory.CreateDirectory(tempDir); + CopyDirectory(sourceDir, tempDir); + + // Step 2: Import assets in bundleMetaGeneration to generate .meta files + AssetDatabase.ImportAsset(tempDir, ImportAssetOptions.ForceUpdate); + + // Step 3: Overwrite bugsnag-osx.bundle with contents from bundleMetaGeneration + Directory.Delete(sourceDir, true); + Directory.CreateDirectory(sourceDir); + CopyDirectory(tempDir, sourceDir); + + // Refresh to apply changes + AssetDatabase.Refresh(); + Debug.Log("Meta files generated and contents of bugsnag-osx.bundle overwritten."); + } + + private static void CopyDirectory(string sourceDir, string targetDir) + { + foreach (var dirPath in Directory.GetDirectories(sourceDir, "*", SearchOption.AllDirectories)) + { + Directory.CreateDirectory(dirPath.Replace(sourceDir, targetDir)); + } + + foreach (var filePath in Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories)) + { + File.Copy(filePath, filePath.Replace(sourceDir, targetDir), true); + } + } } \ No newline at end of file From 4d650d30419a37dce9d2dd1e618cc372fca81450 Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 14:38:25 +0100 Subject: [PATCH 23/46] import --- Bugsnag/Assets/Editor/ForceImportSettings.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Bugsnag/Assets/Editor/ForceImportSettings.cs b/Bugsnag/Assets/Editor/ForceImportSettings.cs index a383d2439..1bc80fd14 100644 --- a/Bugsnag/Assets/Editor/ForceImportSettings.cs +++ b/Bugsnag/Assets/Editor/ForceImportSettings.cs @@ -60,8 +60,8 @@ private static void ApplyPluginImportSettings(string dir, List targ private static void GenerateMetaFilesForBundle() { - string sourceDir = "Assets/Editor/Bugsnag/Plugins/MacOS/bugsnag-osx.bundle"; - string tempDir = "Assets/Editor/Bugsnag/Plugins/MacOS/bundleMetaGeneration"; + string sourceDir = "Assets/Bugsnag/Plugins/MacOS/bugsnag-osx.bundle"; + string tempDir = "Assets/Bugsnag/Plugins/MacOS/bundleMetaGeneration"; // Step 1: Copy contents of bugsnag-osx.bundle to bundleMetaGeneration if (Directory.Exists(tempDir)) @@ -73,12 +73,13 @@ private static void GenerateMetaFilesForBundle() // Step 2: Import assets in bundleMetaGeneration to generate .meta files AssetDatabase.ImportAsset(tempDir, ImportAssetOptions.ForceUpdate); - + AssetDatabase.Refresh(); // Step 3: Overwrite bugsnag-osx.bundle with contents from bundleMetaGeneration Directory.Delete(sourceDir, true); Directory.CreateDirectory(sourceDir); CopyDirectory(tempDir, sourceDir); - + + Directory.Delete(tempDir, true); // Refresh to apply changes AssetDatabase.Refresh(); Debug.Log("Meta files generated and contents of bugsnag-osx.bundle overwritten."); From fb07507f047133c03fb625f85796809cc67011ea Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 14:52:29 +0100 Subject: [PATCH 24/46] remove meta temp dir --- Bugsnag/Assets/Editor/ForceImportSettings.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Bugsnag/Assets/Editor/ForceImportSettings.cs b/Bugsnag/Assets/Editor/ForceImportSettings.cs index 1bc80fd14..42e92f42f 100644 --- a/Bugsnag/Assets/Editor/ForceImportSettings.cs +++ b/Bugsnag/Assets/Editor/ForceImportSettings.cs @@ -62,8 +62,8 @@ private static void GenerateMetaFilesForBundle() { string sourceDir = "Assets/Bugsnag/Plugins/MacOS/bugsnag-osx.bundle"; string tempDir = "Assets/Bugsnag/Plugins/MacOS/bundleMetaGeneration"; + string tempDirMeta = "Assets/Bugsnag/Plugins/MacOS/bundleMetaGeneration.meta"; - // Step 1: Copy contents of bugsnag-osx.bundle to bundleMetaGeneration if (Directory.Exists(tempDir)) { Directory.Delete(tempDir, true); @@ -71,17 +71,18 @@ private static void GenerateMetaFilesForBundle() Directory.CreateDirectory(tempDir); CopyDirectory(sourceDir, tempDir); - // Step 2: Import assets in bundleMetaGeneration to generate .meta files AssetDatabase.ImportAsset(tempDir, ImportAssetOptions.ForceUpdate); AssetDatabase.Refresh(); - // Step 3: Overwrite bugsnag-osx.bundle with contents from bundleMetaGeneration + Directory.Delete(sourceDir, true); Directory.CreateDirectory(sourceDir); CopyDirectory(tempDir, sourceDir); Directory.Delete(tempDir, true); - // Refresh to apply changes + File.Delete(tempDirMeta); + AssetDatabase.Refresh(); + Debug.Log("Meta files generated and contents of bugsnag-osx.bundle overwritten."); } From 4b99ff3fd7bcb72c9c7f56614036b669a1210750 Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 14:57:08 +0100 Subject: [PATCH 25/46] upm build script complete --- upm/build-upm-package.sh | 57 +++++----------------------------------- 1 file changed, 6 insertions(+), 51 deletions(-) diff --git a/upm/build-upm-package.sh b/upm/build-upm-package.sh index 52bbf9ddf..d13bb56c0 100755 --- a/upm/build-upm-package.sh +++ b/upm/build-upm-package.sh @@ -1,11 +1,6 @@ #!/bin/bash -GIT_DEPLOY=false -PACKAGE_FILE=../Bugsnag.unitypackage -DEFAULT_CLI_ARGS="-quit -batchmode -nographics -logFile unity.log" -PROJECT_PATH=`pwd`/UPMImportProject -SCRIPT_PATH=`pwd` -PACKAGE_DIR=../upm-package +PACKAGE_DIR=upm-package # Check for release version if [ -z "$1" ] @@ -16,55 +11,15 @@ fi VERSION=$1 -if [ -z "$UNITY_UPM_VERSION" ] -then - echo "UNITY_UPM_VERSION must be set" - exit 1 -fi - -#There is a bug in some versions of unity 2020, 2021 and 2022 where macos bundles will not be imported as a single plugin file. -#In which case all sub dirs and files must have .meta files to work with UPM. -#Building the UPM package with unity 2019 ensures that the meta files are created - -# if [[ "$UNITY_UPM_VERSION" != *"2019"* ]]; then -# echo "ERROR: UNITY_UPM_VERSION must be a version of Unity 2019. See script comments for details." -# exit 1 -# fi - -# UNITY_PATH="/Applications/Unity/Hub/Editor/$UNITY_UPM_VERSION/Unity.app/Contents/MacOS" - - - -# #Check for the release package -# echo "Checking for the release package" - -# # make sure the package of the release is present after building -# if [ ! -f "$PACKAGE_FILE" ]; then -# echo "$PACKAGE_FILE not found, please provide a release package." -# exit 1 -# fi - -# echo "SDK package found" - -# echo "\`Unity\` executable = $UNITY_PATH/Unity" - -# #Import unitypackage into the Import project -# echo "Importing Bugsnag.unitypackage into the import project" -# $UNITY_PATH/Unity $DEFAULT_CLI_ARGS \ -# -projectPath $PROJECT_PATH \ -# -ignoreCompilerErrors \ -# -logFile upm-import-log.log \ -# -importPackage $SCRIPT_PATH/../Bugsnag.unitypackage - echo "Copying over the unpacked sdk files" -cp -r UPMImportProject/Assets/Bugsnag/. $PACKAGE_DIR +cp -r "Bugsnag/Assets/Bugsnag/." $PACKAGE_DIR echo "Copying over the package manifest and readme" -cp package.json $PACKAGE_DIR -cp package.json.meta $PACKAGE_DIR -cp README.md $PACKAGE_DIR -cp README.md.meta $PACKAGE_DIR +cp upm/package.json $PACKAGE_DIR +cp upm/package.json.meta $PACKAGE_DIR +cp upm/README.md $PACKAGE_DIR +cp upm/README.md.meta $PACKAGE_DIR # remove EDM menu from package rm "$PACKAGE_DIR/Editor/BugsnagEditor.EDM.cs" From b8094033fff7a7cecf7f5eac11f5b7f478cbe998 Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 15:20:10 +0100 Subject: [PATCH 26/46] import clarity --- Bugsnag/Assets/Editor/ForceImportSettings.cs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/Bugsnag/Assets/Editor/ForceImportSettings.cs b/Bugsnag/Assets/Editor/ForceImportSettings.cs index 42e92f42f..52aaadcfb 100644 --- a/Bugsnag/Assets/Editor/ForceImportSettings.cs +++ b/Bugsnag/Assets/Editor/ForceImportSettings.cs @@ -11,6 +11,10 @@ public static void ApplyImportSettings() ApplyPluginImportSettings("Assets/Bugsnag/Plugins/MacOS", new List { BuildTarget.StandaloneOSX }); ApplyPluginImportSettings("Assets/Bugsnag/Plugins/tvOS", new List { BuildTarget.tvOS }); ApplyPluginImportSettings("Assets/Bugsnag/Plugins/Android", new List { BuildTarget.Android }); + // There is a bug in some unity versions where MacOS bundle plugins are imported as a directory instead of a single plugin file. + // This causes issues for UPM installs, because if the plugin is imported as a directory, then the package manager will expect + // each file to have a .meta file with it and throws an error when non is found. + // This method is a work around that manually adds those meta files. GenerateMetaFilesForBundle(); } @@ -28,15 +32,12 @@ public static void ApplyImportSettings() private static void ApplyPluginImportSettings(string dir, List targets) { string[] guids = AssetDatabase.FindAssets("", new[] { dir }); - foreach (string guid in guids) { string assetPath = AssetDatabase.GUIDToAssetPath(guid); - if (!string.IsNullOrEmpty(assetPath) && !assetPath.EndsWith(".meta")) { AssetImporter importer = AssetImporter.GetAtPath(assetPath); - if (importer != null) { if (importer is PluginImporter pluginImporter) @@ -47,15 +48,11 @@ private static void ApplyPluginImportSettings(string dir, List targ pluginImporter.SetCompatibleWithPlatform(target, targets.Contains(target)); } pluginImporter.SaveAndReimport(); - - Debug.Log($"Set import settings for {assetPath}"); } } } } - AssetDatabase.Refresh(); - Debug.Log("Import settings applied and Asset Database refreshed."); } private static void GenerateMetaFilesForBundle() @@ -73,17 +70,12 @@ private static void GenerateMetaFilesForBundle() AssetDatabase.ImportAsset(tempDir, ImportAssetOptions.ForceUpdate); AssetDatabase.Refresh(); - Directory.Delete(sourceDir, true); Directory.CreateDirectory(sourceDir); CopyDirectory(tempDir, sourceDir); - Directory.Delete(tempDir, true); File.Delete(tempDirMeta); - AssetDatabase.Refresh(); - - Debug.Log("Meta files generated and contents of bugsnag-osx.bundle overwritten."); } private static void CopyDirectory(string sourceDir, string targetDir) From 8e317a597e097e24261820a61935a199fea1f931 Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 15:29:20 +0100 Subject: [PATCH 27/46] add web sub mod --- .gitmodules | 3 + .../BugsnagUnityWebRequest.cs | 353 ------------------ .../BugsnagUnityWebRequest.cs.meta | 11 - .../Runtime/BugsnagUnityWebRequest/README.md | 7 - .../BugsnagUnityWebRequest/README.md.meta | 7 - .../Bugsnag/Runtime/bugsnag-web-request | 1 + ...bRequest.meta => bugsnag-web-request.meta} | 2 +- 7 files changed, 5 insertions(+), 379 deletions(-) delete mode 100644 Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs delete mode 100644 Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta delete mode 100644 Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md delete mode 100644 Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md.meta create mode 160000 Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request rename Bugsnag/Assets/Bugsnag/Runtime/{BugsnagUnityWebRequest.meta => bugsnag-web-request.meta} (77%) diff --git a/.gitmodules b/.gitmodules index 67f106eda..61cae57e8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "bugsnag-android"] path = bugsnag-android url = https://github.com/bugsnag/bugsnag-android +[submodule "Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request"] + path = Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request + url = git@github.com:bugsnag/bugsnag-unity-web-request.git diff --git a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs deleted file mode 100644 index ed50b2d81..000000000 --- a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs +++ /dev/null @@ -1,353 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using UnityEngine; -using UnityEngine.Events; -using UnityEngine.Networking; - -namespace BugsnagNetworking -{ - - public class BugsnagUnityWebRequest : IDisposable - { - - public static RequestEvent OnSend = new RequestEvent(); - - public static RequestEvent OnComplete = new RequestEvent(); - - public static RequestEvent OnAbort = new RequestEvent(); - - public UnityWebRequest UnityWebRequest; - - // Constructors - public BugsnagUnityWebRequest() - { - UnityWebRequest = new UnityWebRequest(); - } - - public BugsnagUnityWebRequest(UnityWebRequest unityWebRequest) - { - UnityWebRequest = unityWebRequest; - } - - public BugsnagUnityWebRequest(string url) - { - UnityWebRequest = new UnityWebRequest(url); - } - - public BugsnagUnityWebRequest(Uri uri) - { - UnityWebRequest = new UnityWebRequest(uri); - } - - public BugsnagUnityWebRequest(string url, string method) - { - UnityWebRequest = new UnityWebRequest(url, method); - } - - public BugsnagUnityWebRequest(Uri uri, string method) - { - UnityWebRequest = new UnityWebRequest(uri, method); - } - - // Static Constructors - - // Get - public static BugsnagUnityWebRequest Get(string uri) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Get(uri)); - } - - public static BugsnagUnityWebRequest Get(Uri uri) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Get(uri)); - } - - // Post - public static BugsnagUnityWebRequest Post(string uri, string postData) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, postData)); - } - - public static BugsnagUnityWebRequest Post(string uri, WWWForm formData) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formData)); - } - - public static BugsnagUnityWebRequest Post(string uri, List multipartFormSections) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections)); - } - - public static BugsnagUnityWebRequest Post(string uri, Dictionary formFields) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formFields)); - } - - public static BugsnagUnityWebRequest Post(Uri uri, string postData) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, postData)); - } - - public static BugsnagUnityWebRequest Post(Uri uri, WWWForm formData) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formData)); - } - - public static BugsnagUnityWebRequest Post(Uri uri, List multipartFormSections) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections)); - } - - public static BugsnagUnityWebRequest Post(Uri uri, Dictionary formFields) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formFields)); - } - - public static BugsnagUnityWebRequest Post(string uri, List multipartFormSections, byte[] boundary) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections, boundary)); - } - - public static BugsnagUnityWebRequest Post(Uri uri, List multipartFormSections, byte[] boundary) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections, boundary)); - } - - // Put - public static BugsnagUnityWebRequest Put(string uri, byte[] bodyData) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); - } - - public static BugsnagUnityWebRequest Put(string uri, string bodyData) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); - } - - public static BugsnagUnityWebRequest Put(Uri uri, byte[] bodyData) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); - } - - public static BugsnagUnityWebRequest Put(Uri uri, string bodyData) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); - } - - // Head - public static BugsnagUnityWebRequest Head(string uri) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Head(uri)); - } - - public static BugsnagUnityWebRequest Head(Uri uri) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Head(uri)); - } - - // Delete - public static BugsnagUnityWebRequest Delete(string uri) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Delete(uri)); - } - - public static BugsnagUnityWebRequest Delete(Uri uri) - { - return new BugsnagUnityWebRequest(UnityWebRequest.Delete(uri)); - } - - // Static Methods - - public static void ClearCookieCache() - { - UnityWebRequest.ClearCookieCache(); - } - - public static string EscapeURL(string s) - { - return UnityWebRequest.EscapeURL(s); - } - - public static string EscapeURL(string s, Encoding e) - { - return UnityWebRequest.EscapeURL(s, e); - } - - public static string UnEscapeURL(string s) - { - return UnityWebRequest.UnEscapeURL(s); - } - - public static string UnEscapeURL(string s, Encoding e) - { - return UnityWebRequest.UnEscapeURL(s, e); - } - - public static byte[] GenerateBoundary() - { - return UnityWebRequest.GenerateBoundary(); - } - - public static byte[] SerializeFormSections(List multipartFormSections, byte[] boundary) - { - return UnityWebRequest.SerializeFormSections(multipartFormSections, boundary); - } - - public static byte[] SerializeSimpleForm(Dictionary formFields) - { - return UnityWebRequest.SerializeSimpleForm(formFields); - } - - - // Public methods - - public UnityWebRequestAsyncOperation SendWebRequest() - { - OnSend.Invoke(this); - var asyncAction = UnityWebRequest.SendWebRequest(); - asyncAction.completed += RequestCompleted; - return asyncAction; - } - - private void RequestCompleted(AsyncOperation obj) - { - OnComplete.Invoke(this); - } - - public void Abort() - { - OnAbort.Invoke(this); - UnityWebRequest.Abort(); - } - - public string GetRequestHeader(string name) => UnityWebRequest.GetRequestHeader(name); - - public string GetResponseHeader(string name) => UnityWebRequest.GetResponseHeader(name); - - public Dictionary GetResponseHeaders() => UnityWebRequest.GetResponseHeaders(); - - public void SetRequestHeader(string name, string value) => UnityWebRequest.SetRequestHeader(name, value); - - public void Dispose() => UnityWebRequest.Dispose(); - - // Static Properties - - public static string kHttpVerbCREATE => UnityWebRequest.kHttpVerbCREATE; - - public static string kHttpVerbDELETE => UnityWebRequest.kHttpVerbDELETE; - - public static string kHttpVerbGET => UnityWebRequest.kHttpVerbGET; - - public static string kHttpVerbHEAD => UnityWebRequest.kHttpVerbHEAD; - - public static string kHttpVerbPOST => UnityWebRequest.kHttpVerbPOST; - - public static string kHttpVerbPUT => UnityWebRequest.kHttpVerbPUT; - - // Properties - - public UnityEngine.Networking.CertificateHandler certificateHandler - { - get { return UnityWebRequest.certificateHandler; } - set { UnityWebRequest.certificateHandler = value; } - } - - public bool disposeCertificateHandlerOnDispose - { - get { return UnityWebRequest.disposeCertificateHandlerOnDispose; } - set { UnityWebRequest.disposeCertificateHandlerOnDispose = value; } - } - - public bool disposeDownloadHandlerOnDispose - { - get { return UnityWebRequest.disposeDownloadHandlerOnDispose; } - set { UnityWebRequest.disposeDownloadHandlerOnDispose = value; } - } - - public bool disposeUploadHandlerOnDispose - { - get { return UnityWebRequest.disposeUploadHandlerOnDispose; } - set { UnityWebRequest.disposeUploadHandlerOnDispose = value; } - } - - public ulong downloadedBytes => UnityWebRequest.downloadedBytes; - - - public UnityEngine.Networking.DownloadHandler downloadHandler - { - get { return UnityWebRequest.downloadHandler; } - set { UnityWebRequest.downloadHandler = value; } - } - - public UnityEngine.Networking.UploadHandler uploadHandler - { - get { return UnityWebRequest.uploadHandler; } - set { UnityWebRequest.uploadHandler = value; } - } - - public float downloadProgress => UnityWebRequest.downloadProgress; - - public string error => UnityWebRequest.error; - - public bool isModifiable => UnityWebRequest.isModifiable; - - public string method - { - get { return UnityWebRequest.method; } - set { UnityWebRequest.method = value; } - } - - public int redirectLimit - { - get { return UnityWebRequest.redirectLimit; } - set { UnityWebRequest.redirectLimit = value; } - } - - public int timeout - { - get { return UnityWebRequest.timeout; } - set { UnityWebRequest.timeout = value; } - } - - public ulong uploadedBytes => UnityWebRequest.uploadedBytes; - - public Uri uri - { - get { return UnityWebRequest.uri; } - set { UnityWebRequest.uri = value; } - } - - public string url - { - get { return UnityWebRequest.url; } - set { UnityWebRequest.url = value; } - } - - public bool useHttpContinue - { - get { return UnityWebRequest.useHttpContinue; } - set { UnityWebRequest.useHttpContinue = value; } - } - - - public bool isDone => UnityWebRequest.isDone; - - public bool isNetworkError => UnityWebRequest.isNetworkError; - - public bool isHttpError => UnityWebRequest.isHttpError; - - public long responseCode => UnityWebRequest.responseCode; - - public float uploadProgress => UnityWebRequest.uploadProgress; - - - } - - [System.Serializable] - public class RequestEvent : UnityEvent - { - - } - -} diff --git a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta deleted file mode 100644 index ce383c0b7..000000000 --- a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b82aeb55494974c79ae37b3af2925117 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md deleted file mode 100644 index 99b252299..000000000 --- a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# bugsnag-unity-web-request - -This is a wrapper for the Unity [UnityWebRequest](https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.html) class. - -It allows the BugSnag Unity Performance SDK and the BugSnag Unity Notifier to be notified of the start and end points of a UnityWebRequest. - -To use, simply use the class BugsnagUnityWebRequest in your project exactly the same way you would use UnityWebRequest. diff --git a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md.meta b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md.meta deleted file mode 100644 index 9212e3217..000000000 --- a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/README.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 0acd0c2134cda483eb3406faf5ad891f -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request b/Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request new file mode 160000 index 000000000..7fcd78f89 --- /dev/null +++ b/Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request @@ -0,0 +1 @@ +Subproject commit 7fcd78f89d1f999f10d9245c4e7e3d8f8e224a5a diff --git a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest.meta b/Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request.meta similarity index 77% rename from Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest.meta rename to Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request.meta index 4ac7e3cb9..3ff683649 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest.meta +++ b/Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 58466576693af48cfbdd92415cfde237 +guid: 6250fa367c7cb445db88179753b4b494 folderAsset: yes DefaultImporter: externalObjects: {} From 178a74a761833bcabe4e08a5bdbf90415a396590 Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 15:40:49 +0100 Subject: [PATCH 28/46] https webrequest git module --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 61cae57e8..aa91ac2e8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,4 +6,4 @@ url = https://github.com/bugsnag/bugsnag-android [submodule "Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request"] path = Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request - url = git@github.com:bugsnag/bugsnag-unity-web-request.git +url=https://github.com/bugsnag/bugsnag-unity-web-request.git From d2f410918ba7b87cd5ac77362f34ac0c272cedaa Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 16:44:59 +0100 Subject: [PATCH 29/46] Bugsnag unity web request --- .gitmodules | 3 - ...quest.meta => BugsnagUnityWebRequest.meta} | 2 +- .../BugsnagUnityWebRequest.cs | 354 ++++++++++++++++++ .../BugsnagUnityWebRequest.cs.meta | 11 + .../Bugsnag/Runtime/bugsnag-web-request | 1 - 5 files changed, 366 insertions(+), 5 deletions(-) rename Bugsnag/Assets/Bugsnag/Runtime/{bugsnag-web-request.meta => BugsnagUnityWebRequest.meta} (77%) create mode 100644 Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs create mode 100644 Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta delete mode 160000 Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request diff --git a/.gitmodules b/.gitmodules index aa91ac2e8..67f106eda 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,6 +4,3 @@ [submodule "bugsnag-android"] path = bugsnag-android url = https://github.com/bugsnag/bugsnag-android -[submodule "Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request"] - path = Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request -url=https://github.com/bugsnag/bugsnag-unity-web-request.git diff --git a/Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request.meta b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest.meta similarity index 77% rename from Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request.meta rename to Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest.meta index 3ff683649..4ac7e3cb9 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request.meta +++ b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6250fa367c7cb445db88179753b4b494 +guid: 58466576693af48cfbdd92415cfde237 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs new file mode 100644 index 000000000..3c36b020a --- /dev/null +++ b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs @@ -0,0 +1,354 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.Networking; + +namespace BugsnagNetworking +{ + + public class BugsnagUnityWebRequest : IDisposable + { + + public static RequestEvent OnSend = new RequestEvent(); + + public static RequestEvent OnComplete = new RequestEvent(); + + public static RequestEvent OnAbort = new RequestEvent(); + + public UnityWebRequest UnityWebRequest; + + // Constructors + public BugsnagUnityWebRequest() + { + UnityWebRequest = new UnityWebRequest(); + } + + public BugsnagUnityWebRequest(UnityWebRequest unityWebRequest) + { + UnityWebRequest = unityWebRequest; + } + + public BugsnagUnityWebRequest(string url) + { + UnityWebRequest = new UnityWebRequest(url); + } + + public BugsnagUnityWebRequest(Uri uri) + { + UnityWebRequest = new UnityWebRequest(uri); + } + + public BugsnagUnityWebRequest(string url, string method) + { + UnityWebRequest = new UnityWebRequest(url, method); + } + + public BugsnagUnityWebRequest(Uri uri, string method) + { + UnityWebRequest = new UnityWebRequest(uri, method); + } + + // Static Constructors + + // Get + public static BugsnagUnityWebRequest Get(string uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Get(uri)); + } + + public static BugsnagUnityWebRequest Get(Uri uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Get(uri)); + } + + // Post + public static BugsnagUnityWebRequest Post(string uri, string postData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, postData)); + } + + public static BugsnagUnityWebRequest Post(string uri, WWWForm formData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formData)); + } + + public static BugsnagUnityWebRequest Post(string uri, List multipartFormSections) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections)); + } + + public static BugsnagUnityWebRequest Post(string uri, Dictionary formFields) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formFields)); + } + + public static BugsnagUnityWebRequest Post(Uri uri, string postData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, postData)); + } + + public static BugsnagUnityWebRequest Post(Uri uri, WWWForm formData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formData)); + } + + public static BugsnagUnityWebRequest Post(Uri uri, List multipartFormSections) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections)); + } + + public static BugsnagUnityWebRequest Post(Uri uri, Dictionary formFields) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formFields)); + } + + public static BugsnagUnityWebRequest Post(string uri, List multipartFormSections, byte[] boundary) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections, boundary)); + } + + public static BugsnagUnityWebRequest Post(Uri uri, List multipartFormSections, byte[] boundary) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, multipartFormSections, boundary)); + } + + // Put + public static BugsnagUnityWebRequest Put(string uri, byte[] bodyData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); + } + + public static BugsnagUnityWebRequest Put(string uri, string bodyData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); + } + + public static BugsnagUnityWebRequest Put(Uri uri, byte[] bodyData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); + } + + public static BugsnagUnityWebRequest Put(Uri uri, string bodyData) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Put(uri, bodyData)); + } + + // Head + public static BugsnagUnityWebRequest Head(string uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Head(uri)); + } + + public static BugsnagUnityWebRequest Head(Uri uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Head(uri)); + } + + // Delete + public static BugsnagUnityWebRequest Delete(string uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Delete(uri)); + } + + public static BugsnagUnityWebRequest Delete(Uri uri) + { + return new BugsnagUnityWebRequest(UnityWebRequest.Delete(uri)); + } + + // Static Methods + + public static void ClearCookieCache() + { + UnityWebRequest.ClearCookieCache(); + } + + public static string EscapeURL(string s) + { + return UnityWebRequest.EscapeURL(s); + } + + public static string EscapeURL(string s, Encoding e) + { + return UnityWebRequest.EscapeURL(s, e); + } + + public static string UnEscapeURL(string s) + { + return UnityWebRequest.UnEscapeURL(s); + } + + public static string UnEscapeURL(string s, Encoding e) + { + return UnityWebRequest.UnEscapeURL(s, e); + } + + public static byte[] GenerateBoundary() + { + return UnityWebRequest.GenerateBoundary(); + } + + public static byte[] SerializeFormSections(List multipartFormSections, byte[] boundary) + { + return UnityWebRequest.SerializeFormSections(multipartFormSections, boundary); + } + + public static byte[] SerializeSimpleForm(Dictionary formFields) + { + return UnityWebRequest.SerializeSimpleForm(formFields); + } + + + // Public methods + + public UnityWebRequestAsyncOperation SendWebRequest() + { + OnSend.Invoke(this); + var asyncAction = UnityWebRequest.SendWebRequest(); + asyncAction.completed += RequestCompleted; + return asyncAction; + } + + private void RequestCompleted(AsyncOperation obj) + { + OnComplete.Invoke(this); + } + + public void Abort() + { + OnAbort.Invoke(this); + UnityWebRequest.Abort(); + } + + public string GetRequestHeader(string name) => UnityWebRequest.GetRequestHeader(name); + + public string GetResponseHeader(string name) => UnityWebRequest.GetResponseHeader(name); + + public Dictionary GetResponseHeaders() => UnityWebRequest.GetResponseHeaders(); + + public void SetRequestHeader(string name, string value) => UnityWebRequest.SetRequestHeader(name, value); + + public void Dispose() => UnityWebRequest.Dispose(); + + // Static Properties + + public static string kHttpVerbCREATE => UnityWebRequest.kHttpVerbCREATE; + + public static string kHttpVerbDELETE => UnityWebRequest.kHttpVerbDELETE; + + public static string kHttpVerbGET => UnityWebRequest.kHttpVerbGET; + + public static string kHttpVerbHEAD => UnityWebRequest.kHttpVerbHEAD; + + public static string kHttpVerbPOST => UnityWebRequest.kHttpVerbPOST; + + public static string kHttpVerbPUT => UnityWebRequest.kHttpVerbPUT; + + // Properties + + public UnityEngine.Networking.CertificateHandler certificateHandler + { + get { return UnityWebRequest.certificateHandler; } + set { UnityWebRequest.certificateHandler = value; } + } + + public bool disposeCertificateHandlerOnDispose + { + get { return UnityWebRequest.disposeCertificateHandlerOnDispose; } + set { UnityWebRequest.disposeCertificateHandlerOnDispose = value; } + } + + public bool disposeDownloadHandlerOnDispose + { + get { return UnityWebRequest.disposeDownloadHandlerOnDispose; } + set { UnityWebRequest.disposeDownloadHandlerOnDispose = value; } + } + + public bool disposeUploadHandlerOnDispose + { + get { return UnityWebRequest.disposeUploadHandlerOnDispose; } + set { UnityWebRequest.disposeUploadHandlerOnDispose = value; } + } + + public ulong downloadedBytes => UnityWebRequest.downloadedBytes; + + + public UnityEngine.Networking.DownloadHandler downloadHandler + { + get { return UnityWebRequest.downloadHandler; } + set { UnityWebRequest.downloadHandler = value; } + } + + public UnityEngine.Networking.UploadHandler uploadHandler + { + get { return UnityWebRequest.uploadHandler; } + set { UnityWebRequest.uploadHandler = value; } + } + + public float downloadProgress => UnityWebRequest.downloadProgress; + + public string error => UnityWebRequest.error; + + public bool isModifiable => UnityWebRequest.isModifiable; + + public string method + { + get { return UnityWebRequest.method; } + set { UnityWebRequest.method = value; } + } + + public int redirectLimit + { + get { return UnityWebRequest.redirectLimit; } + set { UnityWebRequest.redirectLimit = value; } + } + + public int timeout + { + get { return UnityWebRequest.timeout; } + set { UnityWebRequest.timeout = value; } + } + + public ulong uploadedBytes => UnityWebRequest.uploadedBytes; + + public Uri uri + { + get { return UnityWebRequest.uri; } + set { UnityWebRequest.uri = value; } + } + + public string url + { + get { return UnityWebRequest.url; } + set { UnityWebRequest.url = value; } + } + + public bool useHttpContinue + { + get { return UnityWebRequest.useHttpContinue; } + set { UnityWebRequest.useHttpContinue = value; } + } + + + public bool isDone => UnityWebRequest.isDone; + + public bool isNetworkError => UnityWebRequest.isNetworkError; + + public bool isHttpError => UnityWebRequest.isHttpError; + + public long responseCode => UnityWebRequest.responseCode; + + public float uploadProgress => UnityWebRequest.uploadProgress; + + + } + + [System.Serializable] + public class RequestEvent : UnityEvent + { + + } + +} diff --git a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta new file mode 100644 index 000000000..93edbf7ec --- /dev/null +++ b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb46dc3dd6726473faca841b7fa4fffd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request b/Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request deleted file mode 160000 index 7fcd78f89..000000000 --- a/Bugsnag/Assets/Bugsnag/Runtime/bugsnag-web-request +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7fcd78f89d1f999f10d9245c4e7e3d8f8e224a5a From 018749104ed98e901d313e24cd087f6f5902578f Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 16:51:16 +0100 Subject: [PATCH 30/46] windows smoke test [full ci] --- .buildkite/pipeline.yml | 3 ++- scripts/ci-build-windows-plugin.bat | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 scripts/ci-build-windows-plugin.bat diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 834b22e7c..348cbb57b 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -29,7 +29,8 @@ steps: UNITY_VERSION: *2021 WSLENV: UNITY_VERSION command: - - /mnt/c/Windows/System32/cmd.exe /c .\\scripts\\ci-build-windows-plugin.bat + - bundle install + - bundle exec rake plugin:export plugins: artifacts#v1.5.0: upload: diff --git a/scripts/ci-build-windows-plugin.bat b/scripts/ci-build-windows-plugin.bat deleted file mode 100644 index 4e6d70417..000000000 --- a/scripts/ci-build-windows-plugin.bat +++ /dev/null @@ -1,2 +0,0 @@ -call bundle install -call bundle exec rake plugin:export From bc16c94f0fdf1ee7e47cd4922a30274aea188472 Mon Sep 17 00:00:00 2001 From: richard elms Date: Wed, 6 Nov 2024 17:01:27 +0100 Subject: [PATCH 31/46] remove unnecessary windows step [full ci] --- .buildkite/pipeline.yml | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 348cbb57b..d04b46336 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -21,26 +21,6 @@ steps: - exit_status: "*" limit: 1 - - label: Ensure notifier builds on Windows (for development) - timeout_in_minutes: 30 - agents: - queue: windows-unity-wsl - env: - UNITY_VERSION: *2021 - WSLENV: UNITY_VERSION - command: - - bundle install - - bundle exec rake plugin:export - plugins: - artifacts#v1.5.0: - upload: - - from: Bugsnag.unitypackage - to: Bugsnag_WindowsBuilt.unitypackage - retry: - automatic: - - exit_status: "*" - limit: 1 - - label: 'Run size impact reporting' depends_on: build_unitypackage timeout_in_minutes: 10 From 7db8bcaeb24e72c8e7ee83189d212572ad4ab134 Mon Sep 17 00:00:00 2001 From: richard elms Date: Thu, 7 Nov 2024 08:10:46 +0100 Subject: [PATCH 32/46] update BugsnagUnityWebRequest to v2.0.0 --- .../BugsnagUnityWebRequest.cs | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs index 3c36b020a..3737f9e50 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/BugsnagUnityWebRequest/BugsnagUnityWebRequest.cs @@ -1,4 +1,5 @@ -using System; +// VERSION 2.0.0 +using System; using System.Collections; using System.Collections.Generic; using System.Text; @@ -65,10 +66,18 @@ public static BugsnagUnityWebRequest Get(Uri uri) } // Post + #if UNITY_2022_2_OR_NEWER + public static BugsnagUnityWebRequest PostWwwForm(string uri, string form) + { + return new BugsnagUnityWebRequest(UnityWebRequest.PostWwwForm(uri, form)); + } + #else public static BugsnagUnityWebRequest Post(string uri, string postData) { return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, postData)); } + #endif + public static BugsnagUnityWebRequest Post(string uri, WWWForm formData) { @@ -85,10 +94,18 @@ public static BugsnagUnityWebRequest Post(string uri, Dictionary return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, formFields)); } + #if UNITY_2022_2_OR_NEWER + public static BugsnagUnityWebRequest PostWwwForm(Uri uri, string form) + { + return new BugsnagUnityWebRequest(UnityWebRequest.PostWwwForm(uri, form)); + } + #else public static BugsnagUnityWebRequest Post(Uri uri, string postData) { return new BugsnagUnityWebRequest(UnityWebRequest.Post(uri, postData)); } + #endif + public static BugsnagUnityWebRequest Post(Uri uri, WWWForm formData) { @@ -334,10 +351,6 @@ public bool useHttpContinue public bool isDone => UnityWebRequest.isDone; - public bool isNetworkError => UnityWebRequest.isNetworkError; - - public bool isHttpError => UnityWebRequest.isHttpError; - public long responseCode => UnityWebRequest.responseCode; public float uploadProgress => UnityWebRequest.uploadProgress; From 1e63e3bc189e7d9471fac148b21f88da47d3513b Mon Sep 17 00:00:00 2001 From: richard elms Date: Thu, 7 Nov 2024 09:04:25 +0100 Subject: [PATCH 33/46] changelog --- CHANGELOG.md | 8 +++++++- upm/build-edm-package.sh | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1bd530cc..1ba3c0bf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,15 @@ ## TBD +### Enhancements + +- Changed from shipping the C# layer of the SDK as precomiled DLLs to shipping source. Please see the PR description for a full list of the benefits. [#847](https://github.com/bugsnag/bugsnag-unity/pull/847) + ### Dependencies -Update bugsnag-android to [v6.8.0](https://github.com/bugsnag/bugsnag-android/releases/tag/v6.8.0) [#841](https://github.com/bugsnag/bugsnag-unity/pull/841) +- Updated BugsnagUnityWebRequest to remove deprecation warnings and add new PostWwwForm methods introduced in Unity 2022.2 [#847](https://github.com/bugsnag/bugsnag-unity/pull/847) + +- Update bugsnag-android to [v6.8.0](https://github.com/bugsnag/bugsnag-android/releases/tag/v6.8.0) [#841](https://github.com/bugsnag/bugsnag-unity/pull/841) ## 8.2.0 (2024-09-23) diff --git a/upm/build-edm-package.sh b/upm/build-edm-package.sh index 977330a73..6f1f75652 100755 --- a/upm/build-edm-package.sh +++ b/upm/build-edm-package.sh @@ -3,15 +3,15 @@ # This script takes the packaged produced by the build-upm-package.sh script and # converts it to support EDM4U so that we can release a UPM version with EDM4U support. -PACKAGE_DIR=../upm-package +PACKAGE_DIR=upm-package # Remove bundled kotlin libs rm -r "$PACKAGE_DIR/Plugins/Android/Kotlin" rm "$PACKAGE_DIR/Plugins/Android/Kotlin.meta" # Copy in the EDM4U manifest -cp EDM/BugsnagAndroidDependencies.xml "$PACKAGE_DIR/Editor" -cp EDM/BugsnagAndroidDependencies.xml.meta "$PACKAGE_DIR/Editor" +cp upm/EDM/BugsnagAndroidDependencies.xml "$PACKAGE_DIR/Editor" +cp upm/EDM/BugsnagAndroidDependencies.xml.meta "$PACKAGE_DIR/Editor" # Change the readme title to reference EDM4U sed -i '' "s/Bugsnag SDK for Unity/Bugsnag SDK for Unity Including EDM4U Support/g" "$PACKAGE_DIR/README.md" From 0ef1a462c91d3006867cf09a66346e395e12557c Mon Sep 17 00:00:00 2001 From: richard elms Date: Thu, 7 Nov 2024 10:24:40 +0100 Subject: [PATCH 34/46] test fix [full ci] --- .../Csharp/Breadcrumbs/NetworkBreadcrumbsSuccess.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsSuccess.cs b/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsSuccess.cs index 500035180..c36aa9c55 100644 --- a/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsSuccess.cs +++ b/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsSuccess.cs @@ -24,8 +24,11 @@ private IEnumerator DoRun() var get = BugsnagUnityWebRequest.Get(Main.MazeHost + "?success=true&redactthis=notRedacted"); yield return get.SendWebRequest(); yield return new WaitForSeconds(1); - + #if UNITY_2022_2_OR_NEWER + var post = BugsnagUnityWebRequest.PostWwwForm(Main.MazeHost, "{\"action\":\"success\"}"); + #else var post = BugsnagUnityWebRequest.Post(Main.MazeHost, "{\"action\":\"success\"}"); + #endif yield return post.SendWebRequest(); yield return new WaitForSeconds(1); From 134df805446912c98e8298e5e2f42451269836e8 Mon Sep 17 00:00:00 2001 From: richard elms Date: Thu, 7 Nov 2024 10:33:22 +0100 Subject: [PATCH 35/46] re enable macos [full ci] --- .buildkite/unity.2020.yml | 50 --------------------- .buildkite/unity.2021.full.yml | 80 +++++++++++++++++----------------- .buildkite/unity.2021.yml | 50 --------------------- .buildkite/unity.2022.yml | 36 +++++++-------- .buildkite/unity.2023.yml | 40 ++++++++--------- 5 files changed, 78 insertions(+), 178 deletions(-) diff --git a/.buildkite/unity.2020.yml b/.buildkite/unity.2020.yml index dfc21675f..61134a7b3 100644 --- a/.buildkite/unity.2020.yml +++ b/.buildkite/unity.2020.yml @@ -27,27 +27,6 @@ steps: - exit_status: "*" limit: 1 - # - label: ':android: Build Android EDM test fixture for Unity 2020' - # timeout_in_minutes: 30 - # key: 'build-edm-fixture-2020' - # env: - # UNITY_VERSION: *2020 - # plugins: - # artifacts#v1.9.0: - # download: - # - Bugsnag.unitypackage - # upload: - # - features/fixtures/EDM_Fixture/edm_2020.apk - # - features/scripts/buildEdmFixture.log - # - features/scripts/edmImport.log - # - features/scripts/enableEdm.log - # commands: - # - rake test:edm:build - # retry: - # automatic: - # - exit_status: "*" - # limit: 1 - # # Build iOS test fixtures # @@ -198,35 +177,6 @@ steps: concurrency_group: "bitbar" concurrency_method: eager - # - label: ':android: Run Android EDM e2e tests for Unity 2020' - # timeout_in_minutes: 60 - # depends_on: 'build-edm-fixture-2020' - # agents: - # queue: opensource - # env: - # UNITY_VERSION: *2021 - # plugins: - # artifacts#v1.9.0: - # download: - # - "features/fixtures/EDM_Fixture/edm_2020.apk" - # upload: - # - "maze_output/**/*" - # docker-compose#v3.7.0: - # pull: maze-runner - # run: maze-runner - # command: - # - "--app=/app/features/fixtures/EDM_Fixture/edm_2020.apk" - # - "--farm=bs" - # - "--device=ANDROID_11_0" - # - "features/edm" - # test-collector#v1.10.2: - # files: "reports/TEST-*.xml" - # format: "junit" - # branch: "^master|next$$" - # concurrency: 5 - # concurrency_group: browserstack-app - # concurrency_method: eager - - label: ":bitbar: :ios: Run iOS e2e tests for Unity 2020" timeout_in_minutes: 60 depends_on: "build-ios-fixture-2020" diff --git a/.buildkite/unity.2021.full.yml b/.buildkite/unity.2021.full.yml index 035b6fa68..454327f6a 100644 --- a/.buildkite/unity.2021.full.yml +++ b/.buildkite/unity.2021.full.yml @@ -268,47 +268,47 @@ steps: concurrency_group: "bitbar" concurrency_method: eager - # - label: Run MacOS e2e tests for Unity 2021 - # timeout_in_minutes: 60 - # depends_on: 'macos-2021-fixture' - # agents: - # queue: macos-12-arm-unity - # env: - # UNITY_VERSION: *2021 - # plugins: - # artifacts#v1.9.0: - # download: - # - features/fixtures/maze_runner/build/MacOS-release-2021.zip - # upload: - # - maze_output/**/* - # - Mazerunner.log - # test-collector#v1.10.2: - # files: "reports/TEST-*.xml" - # format: "junit" - # branch: "^master|next$$" - # commands: - # - scripts/ci-run-macos-tests.sh release + - label: Run MacOS e2e tests for Unity 2021 + timeout_in_minutes: 60 + depends_on: 'macos-2021-fixture' + agents: + queue: macos-12-arm-unity + env: + UNITY_VERSION: *2021 + plugins: + artifacts#v1.9.0: + download: + - features/fixtures/maze_runner/build/MacOS-release-2021.zip + upload: + - maze_output/**/* + - Mazerunner.log + test-collector#v1.10.2: + files: "reports/TEST-*.xml" + format: "junit" + branch: "^master|next$$" + commands: + - scripts/ci-run-macos-tests.sh release - # - label: Run MacOS e2e DEV tests for Unity 2021 - # timeout_in_minutes: 60 - # depends_on: 'macos-2021-dev-fixture' - # agents: - # queue: macos-12-arm-unity - # env: - # UNITY_VERSION: *2021 - # plugins: - # artifacts#v1.9.0: - # download: - # - features/fixtures/maze_runner/build/MacOS-dev-2021.zip - # upload: - # - maze_output/**/* - # - Mazerunner.log - # test-collector#v1.10.2: - # files: "reports/TEST-*.xml" - # format: "junit" - # branch: "^master|next$$" - # commands: - # - scripts/ci-run-macos-tests.sh dev + - label: Run MacOS e2e DEV tests for Unity 2021 + timeout_in_minutes: 60 + depends_on: 'macos-2021-dev-fixture' + agents: + queue: macos-12-arm-unity + env: + UNITY_VERSION: *2021 + plugins: + artifacts#v1.9.0: + download: + - features/fixtures/maze_runner/build/MacOS-dev-2021.zip + upload: + - maze_output/**/* + - Mazerunner.log + test-collector#v1.10.2: + files: "reports/TEST-*.xml" + format: "junit" + branch: "^master|next$$" + commands: + - scripts/ci-run-macos-tests.sh dev - label: Run WebGL e2e tests for Unity 2021 timeout_in_minutes: 30 diff --git a/.buildkite/unity.2021.yml b/.buildkite/unity.2021.yml index b958190bf..8d192181e 100644 --- a/.buildkite/unity.2021.yml +++ b/.buildkite/unity.2021.yml @@ -27,27 +27,6 @@ steps: - exit_status: "*" limit: 1 - # - label: ':android: Build Android EDM test fixture for Unity 2021' - # timeout_in_minutes: 30 - # key: 'build-edm-fixture-2021' - # env: - # UNITY_VERSION: *2021 - # plugins: - # artifacts#v1.5.0: - # download: - # - Bugsnag.unitypackage - # upload: - # - features/fixtures/EDM_Fixture/edm_2021.3.36f1.apk - # - features/scripts/buildEdmFixture.log - # - features/scripts/edmImport.log - # - features/scripts/enableEdm.log - # commands: - # - rake test:edm:build - # retry: - # automatic: - # - exit_status: "*" - # limit: 1 - # # Build iOS test fixtures # @@ -134,35 +113,6 @@ steps: concurrency_group: "bitbar" concurrency_method: eager - # - label: ':android: Run Android EDM e2e tests for Unity 2021' - # timeout_in_minutes: 30 - # depends_on: 'build-edm-fixture-2021' - # agents: - # queue: opensource - # env: - # UNITY_VERSION: "2021.3.36f1" - # plugins: - # artifacts#v1.5.0: - # download: - # - "features/fixtures/EDM_Fixture/edm_2021.3.36f1.apk" - # upload: - # - "maze_output/**/*" - # docker-compose#v3.7.0: - # pull: maze-runner - # run: maze-runner - # command: - # - "--app=/app/features/fixtures/EDM_Fixture/edm_2021.3.36f1.apk" - # - "--farm=bs" - # - "--device=ANDROID_11_0" - # - "features/edm" - # test-collector#v1.10.2: - # files: "reports/TEST-*.xml" - # format: "junit" - # branch: "^master|next$$" - # concurrency: 5 - # concurrency_group: browserstack-app - # concurrency_method: eager - - label: ":bitbar: :ios: Run iOS e2e tests for Unity 2021" timeout_in_minutes: 60 depends_on: "build-ios-fixture-2021" diff --git a/.buildkite/unity.2022.yml b/.buildkite/unity.2022.yml index 42de6b04f..9306af91b 100644 --- a/.buildkite/unity.2022.yml +++ b/.buildkite/unity.2022.yml @@ -206,24 +206,24 @@ steps: concurrency_group: "bitbar" concurrency_method: eager - # - label: Run MacOS e2e tests for Unity 2022 - # timeout_in_minutes: 60 - # depends_on: 'macos-2022-fixture' - # env: - # UNITY_VERSION: *2022 - # plugins: - # artifacts#v1.9.0: - # download: - # - features/fixtures/maze_runner/build/MacOS-release-2022.zip - # upload: - # - maze_output/**/* - # - '*-mazerunner.log' - # test-collector#v1.10.2: - # files: "reports/TEST-*.xml" - # format: "junit" - # branch: "^master|next$$" - # commands: - # - scripts/ci-run-macos-tests.sh release + - label: Run MacOS e2e tests for Unity 2022 + timeout_in_minutes: 60 + depends_on: 'macos-2022-fixture' + env: + UNITY_VERSION: *2022 + plugins: + artifacts#v1.9.0: + download: + - features/fixtures/maze_runner/build/MacOS-release-2022.zip + upload: + - maze_output/**/* + - '*-mazerunner.log' + test-collector#v1.10.2: + files: "reports/TEST-*.xml" + format: "junit" + branch: "^master|next$$" + commands: + - scripts/ci-run-macos-tests.sh release - label: Run WebGL e2e tests for Unity 2022 timeout_in_minutes: 30 diff --git a/.buildkite/unity.2023.yml b/.buildkite/unity.2023.yml index 7b2c760d2..14d13c23a 100644 --- a/.buildkite/unity.2023.yml +++ b/.buildkite/unity.2023.yml @@ -207,26 +207,26 @@ steps: concurrency_group: "bitbar" concurrency_method: eager - # - label: Run MacOS e2e tests for Unity 2023 - # timeout_in_minutes: 60 - # depends_on: 'macos-2023-fixture' - # agents: - # queue: macos-12-arm - # env: - # UNITY_VERSION: *2023 - # plugins: - # artifacts#v1.9.0: - # download: - # - features/fixtures/maze_runner/build/MacOS-release-2023.zip - # upload: - # - maze_output/**/* - # - '*-mazerunner.log' - # test-collector#v1.10.2: - # files: "reports/TEST-*.xml" - # format: "junit" - # branch: "^master|next$$" - # commands: - # - scripts/ci-run-macos-tests.sh release + - label: Run MacOS e2e tests for Unity 2023 + timeout_in_minutes: 60 + depends_on: 'macos-2023-fixture' + agents: + queue: macos-12-arm + env: + UNITY_VERSION: *2023 + plugins: + artifacts#v1.9.0: + download: + - features/fixtures/maze_runner/build/MacOS-release-2023.zip + upload: + - maze_output/**/* + - '*-mazerunner.log' + test-collector#v1.10.2: + files: "reports/TEST-*.xml" + format: "junit" + branch: "^master|next$$" + commands: + - scripts/ci-run-macos-tests.sh release - label: Run WebGL e2e tests for Unity 2023 timeout_in_minutes: 30 From e22d46863b087b1eb980877a527b14878509ea45 Mon Sep 17 00:00:00 2001 From: richard elms Date: Thu, 7 Nov 2024 10:45:32 +0100 Subject: [PATCH 36/46] remove wrong comment --- Bugsnag/Assets/Tests/UniqueLogCounterTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Bugsnag/Assets/Tests/UniqueLogCounterTests.cs b/Bugsnag/Assets/Tests/UniqueLogCounterTests.cs index a187b4e1f..6ed4822f3 100644 --- a/Bugsnag/Assets/Tests/UniqueLogCounterTests.cs +++ b/Bugsnag/Assets/Tests/UniqueLogCounterTests.cs @@ -40,7 +40,6 @@ public void FlushesCorrectly() counter.ShouldSend(message); - // Sleep for the duration specified in the configuration (convert seconds to milliseconds) Thread.Sleep(configuration.SecondsPerUniqueLog); message = new UnityLogMessage("", "", LogType.Error); From 0373594d82c4394b0495e96b423b491406a36983 Mon Sep 17 00:00:00 2001 From: richard elms Date: Thu, 7 Nov 2024 12:26:31 +0100 Subject: [PATCH 37/46] fixes --- .buildkite/pipeline.yml | 2 +- .gitignore | 1 - Bugsnag/Packages/manifest.json | 44 ++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 Bugsnag/Packages/manifest.json diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index d04b46336..a93894858 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -23,7 +23,7 @@ steps: - label: 'Run size impact reporting' depends_on: build_unitypackage - timeout_in_minutes: 10 + timeout_in_minutes: 30 env: UNITY_VERSION: *2021 plugins: diff --git a/.gitignore b/.gitignore index 500c58fde..739813160 100644 --- a/.gitignore +++ b/.gitignore @@ -61,7 +61,6 @@ features/fixtures/maze_runner/.vscode Bugsnag/Temp Bugsnag/UserSettings Bugsnag/Assets/Bugsnag/Plugins -Bugsnag/Packages upm/UPMImportProject/Library upm-package upm/UPMImportProject/.vscode diff --git a/Bugsnag/Packages/manifest.json b/Bugsnag/Packages/manifest.json new file mode 100644 index 000000000..8ea1d9280 --- /dev/null +++ b/Bugsnag/Packages/manifest.json @@ -0,0 +1,44 @@ +{ + "dependencies": { + "com.unity.collab-proxy": "2.5.1", + "com.unity.ide.rider": "3.0.31", + "com.unity.ide.visualstudio": "2.0.22", + "com.unity.ide.vscode": "1.2.5", + "com.unity.test-framework": "1.1.33", + "com.unity.textmeshpro": "3.0.6", + "com.unity.timeline": "1.6.5", + "com.unity.ugui": "1.0.0", + "com.unity.visualscripting": "1.9.4", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} From 5a64e82c1e0d9eb5e14265157bb7f04f4813ae71 Mon Sep 17 00:00:00 2001 From: richard elms Date: Thu, 7 Nov 2024 12:51:28 +0100 Subject: [PATCH 38/46] temp CI fix [full ci] --- Gemfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Gemfile b/Gemfile index 923f872c0..51eb06ffb 100644 --- a/Gemfile +++ b/Gemfile @@ -9,6 +9,8 @@ gem 'danger' unless Gem.win_platform? # Use official Maze Runner release + # TODO Temporary workaround for uri 1.0.0 causing requests to fail + gem 'uri', '0.13.1' gem 'bugsnag-maze-runner', '~>9.0' # Use a specific Maze Runner branch From 79d010eb0a20f796647a134ab4505fdb24af5395 Mon Sep 17 00:00:00 2001 From: richard elms Date: Thu, 7 Nov 2024 15:10:02 +0100 Subject: [PATCH 39/46] breadcrumbs scenario fix --- features/csharp/csharp_breadcrumbs.feature | 14 +++++++------- .../Csharp/Breadcrumbs/NetworkBreadcrumbsFail.cs | 2 ++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/features/csharp/csharp_breadcrumbs.feature b/features/csharp/csharp_breadcrumbs.feature index c3253b52b..12f7ef64e 100644 --- a/features/csharp/csharp_breadcrumbs.feature +++ b/features/csharp/csharp_breadcrumbs.feature @@ -109,11 +109,11 @@ Feature: Csharp Breadcrumbs And I wait to receive an error Then the error is valid for the error reporting API sent by the Unity notifier And the exception "message" equals "NetworkBreadcrumbsFail" - And the event "breadcrumbs.1.name" equals "UnityWebRequest failed" - And the event "breadcrumbs.1.type" equals "request" - And the event "breadcrumbs.1.metaData.method" equals "GET" - And the error payload field "events.0.breadcrumbs.1.metaData.url" equals "https://localhost:994/?success=false" - And the event "breadcrumbs.1.metaData.status" has failed - And the event "breadcrumbs.1.metaData.urlParams.success" equals "false" - And the event "breadcrumbs.1.metaData.duration" is greater than 0 + And the event "breadcrumbs.0.name" equals "UnityWebRequest failed" + And the event "breadcrumbs.0.type" equals "request" + And the event "breadcrumbs.0.metaData.method" equals "GET" + And the error payload field "events.0.breadcrumbs.0.metaData.url" equals "https://localhost:994/?success=false" + And the event "breadcrumbs.0.metaData.status" has failed + And the event "breadcrumbs.0.metaData.urlParams.success" equals "false" + And the event "breadcrumbs.0.metaData.duration" is greater than 0 diff --git a/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsFail.cs b/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsFail.cs index bd5b59bc7..35cf91383 100644 --- a/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsFail.cs +++ b/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsFail.cs @@ -5,9 +5,11 @@ public class NetworkBreadcrumbsFail: Scenario { + public override void Run() { StartCoroutine(DoRun()); + Configuration.EnabledBreadcrumbTypes = new BugsnagUnity.Payload.BreadcrumbType[] { BugsnagUnity.Payload.BreadcrumbType.Request }; } private IEnumerator DoRun() From 433ec5d7cf90dafae7bec097a29d75f7dc65978a Mon Sep 17 00:00:00 2001 From: richard elms Date: Thu, 7 Nov 2024 15:22:42 +0100 Subject: [PATCH 40/46] test fix [full ci] --- features/csharp/csharp_breadcrumbs.feature | 2 +- .../Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsFail.cs | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/features/csharp/csharp_breadcrumbs.feature b/features/csharp/csharp_breadcrumbs.feature index 12f7ef64e..ed6be254b 100644 --- a/features/csharp/csharp_breadcrumbs.feature +++ b/features/csharp/csharp_breadcrumbs.feature @@ -113,7 +113,7 @@ Feature: Csharp Breadcrumbs And the event "breadcrumbs.0.type" equals "request" And the event "breadcrumbs.0.metaData.method" equals "GET" And the error payload field "events.0.breadcrumbs.0.metaData.url" equals "https://localhost:994/?success=false" - And the event "breadcrumbs.0.metaData.status" has failed + And the event "breadcrumbs.0.metaData.status" equals 0 And the event "breadcrumbs.0.metaData.urlParams.success" equals "false" And the event "breadcrumbs.0.metaData.duration" is greater than 0 diff --git a/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsFail.cs b/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsFail.cs index 35cf91383..867dda9cb 100644 --- a/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsFail.cs +++ b/features/fixtures/maze_runner/Assets/Scripts/Scenarios/Csharp/Breadcrumbs/NetworkBreadcrumbsFail.cs @@ -5,11 +5,15 @@ public class NetworkBreadcrumbsFail: Scenario { + public override void PrepareConfig(string apiKey, string host) + { + base.PrepareConfig(apiKey, host); + Configuration.EnabledBreadcrumbTypes = new BugsnagUnity.Payload.BreadcrumbType[] { BugsnagUnity.Payload.BreadcrumbType.Request }; + } public override void Run() { StartCoroutine(DoRun()); - Configuration.EnabledBreadcrumbTypes = new BugsnagUnity.Payload.BreadcrumbType[] { BugsnagUnity.Payload.BreadcrumbType.Request }; } private IEnumerator DoRun() From 6ed725853dbc8e064d758488ca2823f08d93f8c5 Mon Sep 17 00:00:00 2001 From: richard elms Date: Thu, 7 Nov 2024 16:34:26 +0100 Subject: [PATCH 41/46] test fix [full ci] --- features/csharp/csharp_breadcrumbs.feature | 4 +++- features/steps/unity_steps.rb | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/features/csharp/csharp_breadcrumbs.feature b/features/csharp/csharp_breadcrumbs.feature index ed6be254b..e04925e5f 100644 --- a/features/csharp/csharp_breadcrumbs.feature +++ b/features/csharp/csharp_breadcrumbs.feature @@ -113,7 +113,9 @@ Feature: Csharp Breadcrumbs And the event "breadcrumbs.0.type" equals "request" And the event "breadcrumbs.0.metaData.method" equals "GET" And the error payload field "events.0.breadcrumbs.0.metaData.url" equals "https://localhost:994/?success=false" - And the event "breadcrumbs.0.metaData.status" equals 0 + And the event "breadcrumbs.0.metaData.status" equals one of these ints: + | 0 | + | 500 | And the event "breadcrumbs.0.metaData.urlParams.success" equals "false" And the event "breadcrumbs.0.metaData.duration" is greater than 0 diff --git a/features/steps/unity_steps.rb b/features/steps/unity_steps.rb index aaf3c9ce2..c8d8b87ba 100644 --- a/features/steps/unity_steps.rb +++ b/features/steps/unity_steps.rb @@ -351,3 +351,14 @@ def switch_run_on_target "#{cache_mount_name_arg}" Maze::Runner.run_command(command) end + +Then('the event {string} equals one of these ints:') do |string, table| + # Convert the expected values in the table to integers + expected_values = table.raw.flatten.map(&:to_i) + + # Retrieve the event value as an integer + event_value = Maze::Helper.read_key_path(Maze::Server.errors.current[:body], string).to_i + + # Check if the integer event value is one of the expected values + Maze.check.true(expected_values.include?(event_value), "Expected one of #{expected_values} but got #{event_value}") +end From c7a539a1b37217c10081d61370c7741c7c1d4eba Mon Sep 17 00:00:00 2001 From: richard elms Date: Thu, 7 Nov 2024 20:02:36 +0100 Subject: [PATCH 42/46] test fix [full ci] --- features/csharp/csharp_persistence.feature | 1 + 1 file changed, 1 insertion(+) diff --git a/features/csharp/csharp_persistence.feature b/features/csharp/csharp_persistence.feature index c56f2e2ad..89984115b 100644 --- a/features/csharp/csharp_persistence.feature +++ b/features/csharp/csharp_persistence.feature @@ -38,6 +38,7 @@ Feature: Unity Persistence And the error is valid for the error reporting API sent by the Unity notifier And the event "context" equals "Error 2" And the exception "message" equals "Error 2" + And I wait for 2 seconds Scenario: Receive a persisted event with on send callback When I set the HTTP status code for the next request to 408 From 8962bc2582fcc10faa8ea8e41bcf444039ee0faa Mon Sep 17 00:00:00 2001 From: richard elms Date: Fri, 8 Nov 2024 07:06:41 +0100 Subject: [PATCH 43/46] mac 2020 [full ci] --- .buildkite/unity.2020.yml | 40 ++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/.buildkite/unity.2020.yml b/.buildkite/unity.2020.yml index 61134a7b3..e513e8ec7 100644 --- a/.buildkite/unity.2020.yml +++ b/.buildkite/unity.2020.yml @@ -96,6 +96,7 @@ steps: automatic: - exit_status: "*" limit: 1 + - label: Build Unity 2020 WebGL test fixture timeout_in_minutes: 30 key: "webgl-2020-fixture" @@ -211,25 +212,26 @@ steps: concurrency_group: "bitbar" concurrency_method: eager - - label: Run MacOS e2e tests for Unity 2020 - timeout_in_minutes: 60 - depends_on: "macos-2020-fixture" - env: - UNITY_VERSION: *2020 - plugins: - artifacts#v1.9.0: - download: - - features/fixtures/maze_runner/build/MacOS-release-2020.zip - upload: - - maze_output/**/* - - '*-mazerunner.log' - - maze_output/metrics.csv - test-collector#v1.10.2: - files: "reports/TEST-*.xml" - format: "junit" - branch: "^master|next$$" - commands: - - scripts/ci-run-macos-tests.sh release + # Pending-PLAT-13035 + # - label: Run MacOS e2e tests for Unity 2020 + # timeout_in_minutes: 60 + # depends_on: "macos-2020-fixture" + # env: + # UNITY_VERSION: *2020 + # plugins: + # artifacts#v1.9.0: + # download: + # - features/fixtures/maze_runner/build/MacOS-release-2020.zip + # upload: + # - maze_output/**/* + # - '*-mazerunner.log' + # - maze_output/metrics.csv + # test-collector#v1.10.2: + # files: "reports/TEST-*.xml" + # format: "junit" + # branch: "^master|next$$" + # commands: + # - scripts/ci-run-macos-tests.sh release - label: Run WebGL e2e tests for Unity 2020 timeout_in_minutes: 30 From e8a1feebf6cadb2a80731155f0b6bf0257d1fbbc Mon Sep 17 00:00:00 2001 From: richard elms Date: Fri, 8 Nov 2024 10:17:46 +0100 Subject: [PATCH 44/46] fail fast [full ci] --- .buildkite/unity.2020.yml | 39 +++++++++++----------- features/csharp/csharp_persistence.feature | 6 +++- features/support/maze.buildkite.cfg | 1 + 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/.buildkite/unity.2020.yml b/.buildkite/unity.2020.yml index e513e8ec7..8d995fb3c 100644 --- a/.buildkite/unity.2020.yml +++ b/.buildkite/unity.2020.yml @@ -212,26 +212,25 @@ steps: concurrency_group: "bitbar" concurrency_method: eager - # Pending-PLAT-13035 - # - label: Run MacOS e2e tests for Unity 2020 - # timeout_in_minutes: 60 - # depends_on: "macos-2020-fixture" - # env: - # UNITY_VERSION: *2020 - # plugins: - # artifacts#v1.9.0: - # download: - # - features/fixtures/maze_runner/build/MacOS-release-2020.zip - # upload: - # - maze_output/**/* - # - '*-mazerunner.log' - # - maze_output/metrics.csv - # test-collector#v1.10.2: - # files: "reports/TEST-*.xml" - # format: "junit" - # branch: "^master|next$$" - # commands: - # - scripts/ci-run-macos-tests.sh release + - label: Run MacOS e2e tests for Unity 2020 + timeout_in_minutes: 60 + depends_on: "macos-2020-fixture" + env: + UNITY_VERSION: *2020 + plugins: + artifacts#v1.9.0: + download: + - features/fixtures/maze_runner/build/MacOS-release-2020.zip + upload: + - maze_output/**/* + - '*-mazerunner.log' + - maze_output/metrics.csv + test-collector#v1.10.2: + files: "reports/TEST-*.xml" + format: "junit" + branch: "^master|next$$" + commands: + - scripts/ci-run-macos-tests.sh release - label: Run WebGL e2e tests for Unity 2020 timeout_in_minutes: 30 diff --git a/features/csharp/csharp_persistence.feature b/features/csharp/csharp_persistence.feature index 89984115b..85dd756b9 100644 --- a/features/csharp/csharp_persistence.feature +++ b/features/csharp/csharp_persistence.feature @@ -20,6 +20,7 @@ Feature: Unity Persistence And I discard the oldest session And the session payload field "app.releaseStage" equals "Session 2" + @skip_macos # Pending-PLAT-13035 Scenario: Receive a persisted event When I set the HTTP status code for the next request to 408 And I run the game in the "PersistEvent" state @@ -38,8 +39,8 @@ Feature: Unity Persistence And the error is valid for the error reporting API sent by the Unity notifier And the event "context" equals "Error 2" And the exception "message" equals "Error 2" - And I wait for 2 seconds + @skip_macos # Pending-PLAT-13035 Scenario: Receive a persisted event with on send callback When I set the HTTP status code for the next request to 408 And I run the game in the "PersistEvent" state @@ -60,6 +61,7 @@ Feature: Unity Persistence And the event "breadcrumbs.0.name" equals "Persist Message" And the event "metaData.Persist Section.Persist Key" equals "Persist Value" + @skip_macos # Pending-PLAT-13035 Scenario: Max Persisted Events When I set the HTTP status code for the next request to 408,408,408,408 When I run the game in the "MaxPersistEvents" state @@ -91,6 +93,7 @@ Feature: Unity Persistence And I wait to receive an error And the exception "message" equals "true" + @skip_macos # Pending-PLAT-13035 Scenario: Persist Device Id When I run the game in the "PersistDeviceId" state And I wait to receive an error @@ -104,6 +107,7 @@ Feature: Unity Persistence And the exception "message" equals "PersistDeviceId" And the error payload field "events.0.device.id" equals the stored value "device_id" + @skip_macos # Pending-PLAT-13035 Scenario: Handle Corrupt Json And I run the game in the "CorruptedCacheFile" state And I wait for requests to persist diff --git a/features/support/maze.buildkite.cfg b/features/support/maze.buildkite.cfg index c5bc18276..f89b888f0 100644 --- a/features/support/maze.buildkite.cfg +++ b/features/support/maze.buildkite.cfg @@ -1,3 +1,4 @@ +--fail-fast --format=junit --out=reports --format=pretty From 1911efb12c3a77de72940d16056073c2c6577e07 Mon Sep 17 00:00:00 2001 From: richard elms Date: Mon, 11 Nov 2024 11:57:48 +0100 Subject: [PATCH 45/46] rename bugsnag compiler flag --- Bugsnag/Assets/Bugsnag/Runtime/Native/Android/Breadcrumbs.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeApp.cs | 2 +- .../Assets/Bugsnag/Runtime/Native/Android/NativeAppWithState.cs | 2 +- .../Assets/Bugsnag/Runtime/Native/Android/NativeBreadcrumb.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeClient.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDevice.cs | 2 +- .../Bugsnag/Runtime/Native/Android/NativeDeviceWithState.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeError.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeEvent.cs | 2 +- .../Assets/Bugsnag/Runtime/Native/Android/NativeInterface.cs | 2 +- .../Bugsnag/Runtime/Native/Android/NativePayloadClassWrapper.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeSession.cs | 2 +- .../Assets/Bugsnag/Runtime/Native/Android/NativeStackFrame.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeThread.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeUser.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/Breadcrumbs.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeApp.cs | 2 +- .../Assets/Bugsnag/Runtime/Native/Cocoa/NativeAppWithState.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeBreadcrumb.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeClient.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeCode.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDevice.cs | 2 +- .../Bugsnag/Runtime/Native/Cocoa/NativeDeviceWithState.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeError.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeEvent.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeImage.cs | 2 +- .../Bugsnag/Runtime/Native/Cocoa/NativePayloadClassWrapper.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeSession.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeStackFrame.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeThread.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeUser.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/Breadcrumbs.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/NativeClient.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/Windows/NativeClient.cs | 2 +- Bugsnag/Assets/Bugsnag/Runtime/Native/iOS/NativeCode.cs | 2 +- 35 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/Breadcrumbs.cs index 21e9fdc4e..9c23274af 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/Breadcrumbs.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/Breadcrumbs.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeApp.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeApp.cs index caaaf3a32..130de64a8 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeApp.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeApp.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeAppWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeAppWithState.cs index aaf01d31e..c453e1768 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeAppWithState.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeAppWithState.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeBreadcrumb.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeBreadcrumb.cs index 82b0dd209..62b866de2 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeBreadcrumb.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeBreadcrumb.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System; using System.Collections.Generic; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeClient.cs index 6d5304a0c..5550c1a92 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeClient.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeClient.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System.Collections.Generic; using BugsnagUnity.Payload; using UnityEngine; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDevice.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDevice.cs index 42cd33cf3..7b4c6cc84 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDevice.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDevice.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System; using System.Collections.Generic; using UnityEngine; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDeviceWithState.cs index e58553d9a..8ae30f999 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDeviceWithState.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeDeviceWithState.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System; using BugsnagUnity.Payload; using UnityEngine; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeError.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeError.cs index 6084d7cd0..bc0ab3cf6 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeError.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeError.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System; using System.Collections.Generic; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeEvent.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeEvent.cs index 36f4a7744..d0c339c44 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeEvent.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeEvent.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System; using System.Collections.Generic; using System.Collections.ObjectModel; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeInterface.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeInterface.cs index 62f9b1070..7db1bd811 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeInterface.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeInterface.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System; using System.Collections; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativePayloadClassWrapper.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativePayloadClassWrapper.cs index a0e8c2077..c306eafa6 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativePayloadClassWrapper.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativePayloadClassWrapper.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeSession.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeSession.cs index a85be7b7e..7e9f9861e 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeSession.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeSession.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeStackFrame.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeStackFrame.cs index bc65b2051..fd620dac9 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeStackFrame.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeStackFrame.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using BugsnagUnity.Payload; using UnityEngine; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeThread.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeThread.cs index 8414605ba..607a75bd0 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeThread.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeThread.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using System.Collections.Generic; using BugsnagUnity.Payload; using UnityEngine; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeUser.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeUser.cs index 6d59ff7c9..4361baf30 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeUser.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Android/NativeUser.cs @@ -1,4 +1,4 @@ -#if (UNITY_ANDROID && !UNITY_EDITOR) || BGS_ANDROID_DEV +#if (UNITY_ANDROID && !UNITY_EDITOR) || BSG_ANDROID_DEV using UnityEngine; namespace BugsnagUnity diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/Breadcrumbs.cs index aee7bcdb5..9e6bac3a1 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/Breadcrumbs.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/Breadcrumbs.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using System.Collections.Generic; using System.IO; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeApp.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeApp.cs index 79e565977..25b4aa83e 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeApp.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeApp.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeAppWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeAppWithState.cs index 927bf8d47..18fc25760 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeAppWithState.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeAppWithState.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeBreadcrumb.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeBreadcrumb.cs index 8da99e306..7ba5bd2da 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeBreadcrumb.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeBreadcrumb.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeClient.cs index db17374e4..61896bcda 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeClient.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeClient.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using System.Collections; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeCode.cs index 985a39123..ba6bd5d81 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeCode.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeCode.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using System.Runtime.InteropServices; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDevice.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDevice.cs index a4d8cb230..23973da59 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDevice.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDevice.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDeviceWithState.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDeviceWithState.cs index b1d10e9a5..a74676fa3 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDeviceWithState.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeDeviceWithState.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeError.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeError.cs index 66811dd75..cc1ebcc19 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeError.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeError.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeEvent.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeEvent.cs index ddaee4933..5d6f4fb12 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeEvent.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeEvent.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeImage.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeImage.cs index 20cbeed86..4c34ce5fe 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeImage.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeImage.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using System.Collections; using System.Runtime.InteropServices; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativePayloadClassWrapper.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativePayloadClassWrapper.cs index 5e15e1adb..46d3ae999 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativePayloadClassWrapper.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativePayloadClassWrapper.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; namespace BugsnagUnity { diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeSession.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeSession.cs index f20769178..48867e848 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeSession.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeSession.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using System.Runtime.InteropServices; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeStackFrame.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeStackFrame.cs index 29c938014..296c56322 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeStackFrame.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeStackFrame.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeThread.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeThread.cs index 896e0a1b6..e3674b48a 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeThread.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeThread.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeUser.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeUser.cs index da0741d55..f802311b1 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeUser.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Cocoa/NativeUser.cs @@ -1,4 +1,4 @@ -#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BGS_COCOA_DEV +#if ((UNITY_IOS || UNITY_STANDALONE_OSX) && !UNITY_EDITOR) || BSG_COCOA_DEV using System; namespace BugsnagUnity diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/Breadcrumbs.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/Breadcrumbs.cs index a71cd9ae0..36e219949 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/Breadcrumbs.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/Breadcrumbs.cs @@ -1,4 +1,4 @@ -#if (UNITY_EDITOR || UNITY_STANDALONE_WIN || UNITY_WEBGL) && !(BGS_COCOA_DEV || BGS_ANDROID_DEV || BGS_WIN_DEV) +#if (UNITY_EDITOR || UNITY_STANDALONE_WIN || UNITY_WEBGL) && !(BSG_COCOA_DEV || BSG_ANDROID_DEV || BSG_WIN_DEV) using System.Collections.Generic; using System.Linq; using BugsnagUnity.Payload; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/NativeClient.cs index 887d85184..894c67a4f 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/NativeClient.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Fallback/NativeClient.cs @@ -1,4 +1,4 @@ -#if (UNITY_EDITOR || UNITY_WEBGL) && !(BGS_COCOA_DEV || BGS_ANDROID_DEV || BGS_WIN_DEV) +#if (UNITY_EDITOR || UNITY_WEBGL) && !(BSG_COCOA_DEV || BSG_ANDROID_DEV || BSG_WIN_DEV) using BugsnagUnity.Payload; using System; using System.Collections.Generic; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/Windows/NativeClient.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/Windows/NativeClient.cs index 80976d26a..26b0aebfc 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/Windows/NativeClient.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/Windows/NativeClient.cs @@ -1,4 +1,4 @@ -#if (UNITY_STANDALONE_WIN && !UNITY_EDITOR) || BGS_WIN_DEV +#if (UNITY_STANDALONE_WIN && !UNITY_EDITOR) || BSG_WIN_DEV using System; using System.Collections.Generic; using System.Runtime.InteropServices; diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Native/iOS/NativeCode.cs b/Bugsnag/Assets/Bugsnag/Runtime/Native/iOS/NativeCode.cs index 6d06929fe..b0bbea239 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Native/iOS/NativeCode.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Native/iOS/NativeCode.cs @@ -1,4 +1,4 @@ -#if (UNITY_IOS && !UNITY_EDITOR) || BGS_COCOA_DEV +#if (UNITY_IOS && !UNITY_EDITOR) || BSG_COCOA_DEV namespace BugsnagUnity { partial class NativeCode From b22ee92e7a5e8680e1ae5644e056fa8604954f3c Mon Sep 17 00:00:00 2001 From: richard elms Date: Mon, 11 Nov 2024 13:33:37 +0100 Subject: [PATCH 46/46] revert session.GetUser change --- Bugsnag/Assets/Bugsnag/Runtime/Payload/Session.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Bugsnag/Assets/Bugsnag/Runtime/Payload/Session.cs b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Session.cs index 620fbe90d..32b25665e 100644 --- a/Bugsnag/Assets/Bugsnag/Runtime/Payload/Session.cs +++ b/Bugsnag/Assets/Bugsnag/Runtime/Payload/Session.cs @@ -29,7 +29,7 @@ public DateTimeOffset? StartedAt internal User? User { get; set; } - public IUser GetUser() => User ?? new User(string.Empty, string.Empty, string.Empty); + public IUser GetUser() => User; public void SetUser(string id, string email, string name) {