Several workflow features.

This commit is contained in:
Heath Volmer
2017-02-09 15:27:19 -07:00
parent f9225c4bd9
commit 227ce575fa
19 changed files with 165 additions and 111 deletions

View File

@@ -9,7 +9,7 @@ using PepperDash.Essentials.Core;
namespace PepperDash.Essentials
{
public class EssentialsHuddleSpaceRoom : EssentialsRoomBase
public class EssentialsHuddleSpaceRoom : EssentialsRoomBase, IHasCurrentSourceInfoChange
{
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
public event SourceInfoChangeHandler CurrentSourceInfoChange;

View File

@@ -9,7 +9,7 @@ using PepperDash.Essentials.Core;
namespace PepperDash.Essentials
{
public class EssentialsPresentationRoom : EssentialsRoomBase
public class EssentialsPresentationRoom : EssentialsRoomBase, IHasCurrentSourceInfoChange
{
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
public event SourceInfoChangeHandler CurrentSourceInfoChange;

View File

@@ -8,6 +8,18 @@ using PepperDash.Essentials.Core;
namespace PepperDash.Essentials
{
/// <summary>
///
/// </summary>
public interface IHasCurrentSourceInfoChange
{
event SourceInfoChangeHandler CurrentSourceInfoChange;
}
/// <summary>
///
/// </summary>
public class EssentialsRoomBase : Device
{
public EssentialsRoomBase(string key, string name) : base(key, name)

View File

@@ -0,0 +1,35 @@
2/9/2017 7:42:37 AM, Info: Initializing SIMPLSharp Services...
2/9/2017 7:42:37 AM, Info: ProjectInfo successfully initialized.
2/9/2017 8:56:31 AM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll...
2/9/2017 8:56:32 AM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll
2/9/2017 8:56:32 AM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.cpz...
2/9/2017 8:56:34 AM, Info: Saving project information...
2/9/2017 10:01:00 AM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll...
2/9/2017 10:01:00 AM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll
2/9/2017 10:01:00 AM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.cpz...
2/9/2017 10:01:02 AM, Info: Saving project information...
2/9/2017 10:35:15 AM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll...
2/9/2017 10:35:16 AM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll
2/9/2017 10:35:16 AM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.cpz...
2/9/2017 10:35:18 AM, Info: Saving project information...
2/9/2017 10:35:57 AM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll...
2/9/2017 10:35:57 AM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll
2/9/2017 10:35:57 AM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.cpz...
2/9/2017 10:35:59 AM, Info: Saving project information...
2/9/2017 10:53:38 AM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll...
2/9/2017 10:53:39 AM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll
2/9/2017 10:53:39 AM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.cpz...
2/9/2017 10:53:40 AM, Info: Saving project information...
2/9/2017 11:00:03 AM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll...
2/9/2017 11:00:04 AM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll
2/9/2017 11:00:04 AM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.cpz...
2/9/2017 11:00:05 AM, Info: Saving project information...
2/9/2017 11:37:00 AM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll...
2/9/2017 11:37:01 AM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll
2/9/2017 11:37:01 AM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.cpz...
2/9/2017 11:37:02 AM, Info: Saving project information...
2/9/2017 11:37:39 AM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll...
2/9/2017 11:37:40 AM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll
2/9/2017 11:37:40 AM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.cpz...
2/9/2017 11:37:41 AM, Info: Saving project information...
2/9/2017 2:32:35 PM, Info: Terminating SIMPLSharp Services

View File

@@ -22,8 +22,6 @@ namespace PepperDash.Essentials
PresentationMode, AudioSetup
}
//public BoolFeedback SelectASourceVisibleFeedback { get; private set; }
/// <summary>
/// Whether volume ramping from this panel will show the volume
/// gauge popup.
@@ -103,8 +101,6 @@ namespace PepperDash.Essentials
/// </summary>
PanelDriverBase Parent;
SingleSubpageModalDriver VolumesPageDriver;
/// <summary>
/// All children attached to this driver. For hiding and showing as a group.
/// </summary>
@@ -182,7 +178,6 @@ namespace PepperDash.Essentials
/// </summary>
public override void Show()
{
// We'll want to show the current state of AV, but for now, just show rooms
TriList.BooleanInput[UIBoolJoin.TopBarVisible].BoolValue = true;
TriList.BooleanInput[UIBoolJoin.ActivityFooterVisible].BoolValue = true;
@@ -192,14 +187,27 @@ namespace PepperDash.Essentials
// Attach actions
TriList.SetSigFalseAction(UIBoolJoin.VolumeButtonPopupPress, VolumeButtonsTogglePress);
//Interlocked modals
TriList.SetSigFalseAction(UIBoolJoin.InterlockedModalClosePress, HideCurrentInterlockedModal);
TriList.SetSigFalseAction(UIBoolJoin.HelpPress, () =>
{
string message = null;
var room = DeviceManager.GetDeviceForKey(Config.DefaultRoomKey)
as EssentialsHuddleSpaceRoom;
if (room != null)
message = room.Config.HelpMessage;
else
message = "Sorry, no help message available. No room connected.";
TriList.StringInput[UIStringJoin.HelpMessage].StringValue = message;
ShowInterlockedModal(UIBoolJoin.HelpPageVisible);
});
TriList.SetSigFalseAction(UIBoolJoin.RoomHeaderButtonPress, () =>
ShowInterlockedModal(UIBoolJoin.RoomHeaderPageVisible));
#warning Add press and hold to gear button here
TriList.SetSigFalseAction(UIBoolJoin.GearHeaderButtonPress, () =>
{
if (VolumesPageDriver == null)
VolumesPageDriver =
new SingleSubpageModalDriver(this, UIBoolJoin.VolumesPageVisible, UIBoolJoin.VolumesPageClosePress);
VolumesPageDriver.Toggle();
});
ShowInterlockedModal(UIBoolJoin.VolumesPageVisible));
// power-related functions
// Note: some of these are not directly-related to the huddle space UI, but are held over
@@ -233,6 +241,8 @@ namespace PepperDash.Essentials
TriList.BooleanInput[UIBoolJoin.TopBarVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.ActivityFooterVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.StagingPageVisible].BoolValue = false;
VolumeButtonsPopupFeedback.ClearNow();
CancelPowerOff();
@@ -253,10 +263,18 @@ namespace PepperDash.Essentials
{
case UiDisplayMode.PresentationMode:
// show start page or staging...
if (!CurrentRoom.OnFeedback.BoolValue)
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = true;
else
if (CurrentRoom.OnFeedback.BoolValue)
{
TriList.BooleanInput[UIBoolJoin.StagingPageVisible].BoolValue = true;
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
}
else
{
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = true;
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = true;
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
}
// Date/time
if (Config.ShowDate && Config.ShowTime)
{
@@ -282,17 +300,8 @@ namespace PepperDash.Essentials
void SetupActivityFooterWhenRoomOff()
{
ActivityFooterSrl.Clear();
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(1, ActivityFooterSrl, 0, b =>
{
if (b) return; // ignore press
ShareButtonSig = ActivityFooterSrl.BoolInputSig(1, 1);
if (!_CurrentRoom.OnFeedback.BoolValue)
{
ShareButtonSig.BoolValue = true;
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.StagingPageVisible].BoolValue = true;
}
}));
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(1, ActivityFooterSrl, 0,
b => { if (!b) ShareButtonPressed(); }));
ActivityFooterSrl.Count = 1;
TriList.UShortInput[UIUshortJoin.PresentationListCaretMode].UShortValue = 0;
}
@@ -312,6 +321,43 @@ namespace PepperDash.Essentials
EndMeetingButtonSig = ActivityFooterSrl.BoolInputSig(2, 1);
}
/// <summary>
/// Attached to activity list share button
/// </summary>
void ShareButtonPressed()
{
ShareButtonSig = ActivityFooterSrl.BoolInputSig(1, 1);
if (!_CurrentRoom.OnFeedback.BoolValue)
{
ShareButtonSig.BoolValue = true;
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.StagingPageVisible].BoolValue = true;
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = true;
}
}
uint CurrentInterlockedModalJoin;
void ShowInterlockedModal(uint join)
{
if (CurrentInterlockedModalJoin == join)
HideCurrentInterlockedModal();
else
{
TriList.BooleanInput[UIBoolJoin.HelpPageVisible].BoolValue = join == UIBoolJoin.HelpPageVisible;
TriList.BooleanInput[UIBoolJoin.RoomHeaderPageVisible].BoolValue = join == UIBoolJoin.RoomHeaderPageVisible;
TriList.BooleanInput[UIBoolJoin.VolumesPageVisible].BoolValue = join == UIBoolJoin.VolumesPageVisible;
CurrentInterlockedModalJoin = join;
}
}
void HideCurrentInterlockedModal()
{
TriList.BooleanInput[CurrentInterlockedModalJoin].BoolValue = false;
CurrentInterlockedModalJoin = 0;
}
/// <summary>
/// Shows all sigs that are in CurrentDisplayModeSigsInUse
/// </summary>
@@ -360,20 +406,14 @@ namespace PepperDash.Essentials
void ShowCurrentSource()
{
if (CurrentRoom.CurrentSourceInfo == null)
{
#warning When system is "off" show start screen and hide staging.
//var offPm = new DefaultPageManager(UIBoolJoin.SelectSourcePopupVisible, TriList);
//PageManagers["OFF"] = offPm;
//CurrentSourcePageManager = offPm;
//offPm.Show();
return;
}
var uiDev = CurrentRoom.CurrentSourceInfo.SourceDevice as IUiDisplayInfo;
PageManager pm = null;
// If we need a page manager, get an appropriate one
if (uiDev != null)
{
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
// Got an existing page manager, get it
if (PageManagers.ContainsKey(uiDev))
pm = PageManagers[uiDev];
@@ -389,12 +429,6 @@ namespace PepperDash.Essentials
CurrentSourcePageManager = pm;
pm.Show();
}
//else // show some default thing
//{
// CurrentDisplayModeSigsInUse.Add(TriList.BooleanInput[12345]);
//}
//ShowCurrentDisplayModeSigsInUse();
}
/// <summary>
@@ -425,9 +459,11 @@ namespace PepperDash.Essentials
modal.PresentModalTimerDialog(2, "End Meeting", "Power", message,
"End Meeting Now", "Cancel", time, true,
but =>
{
if (but != 2)
{
if (but != 2)
CurrentRoom.RunRouteAction("roomOff");
else
ShareButtonSig.BoolValue = true; // restore Share fb
EndMeetingButtonSig.BoolValue = false;
});
}
@@ -544,12 +580,11 @@ namespace PepperDash.Essentials
srcConfig.SourceKey);
continue;
}
//Debug.Console(0, "Adding source '{0}'", srcConfig.SourceKey);
//var s = srcConfig; // assign locals for scope in button lambda
var routeKey = kvp.Key;
var item = new SubpageReferenceListSourceItem(i++, SourcesSrl, srcConfig.PreferredName,
var item = new SubpageReferenceListSourceItem(i++, SourcesSrl, srcConfig,
b => { if (!b) UiSelectSource(routeKey); });
SourcesSrl.AddItem(item); // add to the SRL
SourcesSrl.AddItem(item); // add to the SRL
item.RegisterForSourceChange(_CurrentRoom);
}
SourcesSrl.Count = (ushort)(i - 1);
}

View File

@@ -1,7 +1,6 @@
using System;
using Crestron.SimplSharpPro.DeviceSupport;
using Crestron.SimplSharpPro.UI;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.SmartObjects;
@@ -18,59 +17,21 @@ namespace PepperDash.Essentials
/// </summary>
public PanelDriverBase AvDriver { get; set; }
SingleSubpageModalDriver HelpDriver;
public PanelDriverBase CurrentChildDriver { get; private set; }
CrestronTouchpanelPropertiesConfig Config;
SubpageReferenceList ActivityFooterList;
public EssentialsPanelMainInterfaceDriver(BasicTriListWithSmartObject trilist,
CrestronTouchpanelPropertiesConfig config)
: base(trilist)
{
Config = config;
trilist.SetSigFalseAction(UIBoolJoin.StartPagePress, () => ShowSubDriver(AvDriver));
// Need this?
trilist.SetSigFalseAction(UIBoolJoin.ShowPanelSetupPress, () =>
ShowSubDriver(new SingleSubpageModalAndBackDriver(this, UIBoolJoin.PanelSetupVisible)));
ActivityFooterList = new SubpageReferenceList(trilist, 1234, 3, 3, 3);
}
public override void Show()
{
CurrentChildDriver = null;
//if (Config.UsesSplashPage)
// TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = true;
//else
ShowSubDriver(AvDriver);
TriList.SetSigFalseAction(UIBoolJoin.HelpPress, () =>
{
string message = null;
var room = DeviceManager.GetDeviceForKey(Config.DefaultRoomKey)
as EssentialsHuddleSpaceRoom;
if (room != null)
message = room.Config.HelpMessage;
else
message = "Sorry, no help message available. No room connected.";
TriList.StringInput[UIStringJoin.HelpMessage].StringValue = message;
if (HelpDriver == null)
HelpDriver = new SingleSubpageModalDriver(this, UIBoolJoin.HelpPageVisible, UIBoolJoin.HelpClosePress);
HelpDriver.Toggle();
});
TriList.SetSigFalseAction(UIBoolJoin.RoomHeaderButtonPress, () =>
{
});
base.Show();
}

View File

@@ -494,9 +494,10 @@ namespace PepperDash.Essentials
//Debug.Console(0, "Adding source '{0}'", srcConfig.SourceKey);
//var s = srcConfig; // assign locals for scope in button lambda
var routeKey = kvp.Key;
var item = new SubpageReferenceListSourceItem(i++, SourcesSrl, srcConfig.PreferredName,
var item = new SubpageReferenceListSourceItem(i++, SourcesSrl, srcConfig,
b => { if (!b) UiSelectSource(routeKey); });
SourcesSrl.AddItem(item); // add to the SRL
item.RegisterForSourceChange(_CurrentRoom);
}
SourcesSrl.Count = (ushort)(i - 1);
}

View File

@@ -21,8 +21,6 @@ namespace PepperDash.Essentials
{
public const uint VolumeUpPress = 901;
public const uint VolumeDownPress = 902;
//public const uint MuteTogglePress = 3813;
//public const uint MutedFeedback = 3813;
public const uint VolumeSingleMute1Visible = 3811;
public const uint VolumeSlider1Press = 3812;
@@ -51,22 +49,17 @@ namespace PepperDash.Essentials
/// 3870
/// </summary>
public const uint VolumesPageVisible = 3870;
/// <summary>
/// 3871
/// </summary>
public const uint VolumesPageClosePress = 3871;
public const uint GenericModalVisible = 3999;
public const uint AvNoControlsSubVisible = 12345;
public const uint HomeVisible = 15001;
public const uint StartPageVisible = 15001;
/// <summary>
/// 15002 Shows the start page in the source controls area of the screen
/// </summary>
public const uint StartPageVisible = 15002;
public const uint StartPagePress = 15003; // REMOVE -------------------------------------------------
public const uint TapToBeginVisible = 15002;
public const uint SelectASourceVisible = 15003;
public const uint RoomIsOn = 15004;
//public const uint SelectSourcePopupVisible = 15005;
/// <summary>
/// 15005 Shows always-on volume control subpage with only audio mute
/// </summary>
@@ -99,6 +92,9 @@ namespace PepperDash.Essentials
/// 15029 the room button in header
/// </summary>
public const uint RoomHeaderButtonPress = 15029;
/// <summary>
/// 15030 Visibility for room data popup
/// </summary>
public const uint RoomHeaderPageVisible = 15030;
public const uint AllRoomsOffPress = 15031;
public const uint DisplayPowerTogglePress = 15032;
@@ -109,6 +105,10 @@ namespace PepperDash.Essentials
public const uint VolumeGaugePopupVisbible = 15036;
public const uint CallStatusPageVisible = 15040;
public const uint LightsPageVisbible = 15041;
/// <summary>
/// 15042 Closes whichever interlocked modal is open
/// </summary>
public const uint InterlockedModalClosePress = 15042;
/// <summary>
/// 15085 Visibility join for help subpage
@@ -118,10 +118,7 @@ namespace PepperDash.Essentials
/// 15086 Press for help header button
/// </summary>
public const uint HelpPress = 15086;
/// <summary>
/// 15087 Press to close help page
/// </summary>
public const uint HelpClosePress = 15087;
public const uint DateOnlyVisible = 15088;
public const uint TimeOnlyVisible = 15089;
public const uint DateAndTimeVisible = 15090;
@@ -160,6 +157,7 @@ namespace PepperDash.Essentials
public const uint CurrentSourceName = 3902;
public const uint CurrentSourceIcon = 3903;
public const uint PowerOffMessage = 3911;
public const uint StartPageMessage = 3912;
public const uint HelpMessage = 3922;
}
}
}

View File

@@ -12,12 +12,29 @@ namespace PepperDash.Essentials
{
public class SubpageReferenceListSourceItem : SubpageReferenceListItem
{
public SourceListItem SourceItem { get; private set; }
public SubpageReferenceListSourceItem(uint index, SubpageReferenceList owner,
string name, Action<bool> routeAction)
SourceListItem sourceItem, Action<bool> routeAction)
: base(index, owner)
{
SourceItem = sourceItem;
owner.GetBoolFeedbackSig(index, 1).UserObject = new Action<bool>(routeAction);
owner.StringInputSig(index, 1).StringValue = name;
owner.StringInputSig(index, 1).StringValue = SourceItem.PreferredName;
}
public void RegisterForSourceChange(IHasCurrentSourceInfoChange room)
{
room.CurrentSourceInfoChange -= room_CurrentSourceInfoChange;
room.CurrentSourceInfoChange += room_CurrentSourceInfoChange;
}
void room_CurrentSourceInfoChange(EssentialsRoomBase room, SourceListItem info, ChangeType type)
{
if (type == ChangeType.WillChange && info == SourceItem)
Owner.BoolInputSig(Index, 1).BoolValue = false;
else if (type == ChangeType.DidChange && info == SourceItem)
Owner.BoolInputSig(Index, 1).BoolValue = true;
}
/// <summary>
@@ -28,10 +45,5 @@ namespace PepperDash.Essentials
Owner.BoolInputSig(Index, 1).UserObject = null;
Owner.StringInputSig(Index, 1).StringValue = "";
}
//public override void Refresh()
//{
//}
}
}

View File

@@ -10,8 +10,8 @@
<ArchiveName />
</RequiredInfo>
<OptionalInfo>
<CompiledOn>2/8/2017 3:16:22 PM</CompiledOn>
<CompilerRev>1.0.0.27489</CompilerRev>
<CompiledOn>2/9/2017 2:44:02 PM</CompiledOn>
<CompilerRev>1.0.0.26519</CompilerRev>
</OptionalInfo>
<Plugin>
<Version>Crestron.SIMPLSharp, Version=2.0.48.0, Culture=neutral, PublicKeyToken=812d080f93e2de10</Version>

View File

@@ -1,4 +1,4 @@
MainAssembly=PepperDashEssentials.dll:2da047fb96fb025c52a872139c06d7c2
MainAssembly=PepperDashEssentials.dll:7c8692784ef9f276843cfa635fe44e4b
MainAssemblyMinFirmwareVersion=1.009.0029
MainAssemblyResource=SimplSharpData.dat:315526abf906cded47fb0c7510266a7e
ü