first commit

main
Snep 4 weeks ago
commit 9518e5f767

@ -0,0 +1,26 @@
{
"version": "0.2.0",
"configurations": [
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md
"name": ".NET Core Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/bin/Debug/net8.0/ansifahrplan.dll",
"args": [],
"cwd": "${workspaceFolder}",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}

41
.vscode/tasks.json vendored

@ -0,0 +1,41 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/ansifahrplan.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/ansifahrplan.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/ansifahrplan.csproj"
],
"problemMatcher": "$msCompile"
}
]
}

@ -0,0 +1,82 @@
using Mindmagma.Curses;
namespace ANSI_Fahrplan;
public class AsciiArt {
/// <summary>
/// Shows ASCII art centered vertically and horizontally on screen
/// </summary>
/// <param name="window">Window to print the ASCII art to</param>
/// <param name="asciiArt">ASCII art string</param>
/// <param name="altText">Text to show if the ASCII art does not fit the window</param>
public static void ShowCentered (nint window, string asciiArt, string altText = "failed_ascii_render") {
int longestLine = 0;
// Capture each line as seperate string in list for easier iteration later
var lines = new List<string> ();
// Find the longest line of the specified ASCII art
using StringReader strReader = new StringReader (asciiArt);
string? line;
while ((line = strReader.ReadLine ()) is not null) {
lines.Add (line);
if (line.Length > longestLine) longestLine = line.Length;
}
int amountLines = lines.Count;
// Get window geometry
NCurses.GetMaxYX (window, out int height, out int width);
int centerX = width / 2;
int centerY = height / 2;
// Show alt text if ASCII art is too big for window
if (longestLine > width || amountLines > height) {
int textBeginX = centerX - (altText.Length / 2);
NCurses.MoveWindowAddString (window, centerY, textBeginX, altText);
NCurses.Refresh ();
NCurses.WindowRefresh (window);
return;
}
int textCurrentY = centerY - (amountLines / 2);
foreach (string strline in lines) {
int textBeginX = centerX - (strline.Length / 2);
NCurses.MoveWindowAddString (window, textCurrentY, textBeginX, strline);
textCurrentY ++;
}
NCurses.Refresh ();
NCurses.WindowRefresh (window);
}
public static string logo38c3_80x24 { get {
return
@"
.;lllllllllc, .;c,:oddoc;. 'coddoc' ,clllllllll:.
kMMMMWKOdc;'xx cWMN' 'lkXMMO .dNMM0l' kMN: :MMMMMX0xl:':K
,;'..':ok0kc ;NMMN' .cNKl .NXx;. NMMW. ';,...;lxOOo.
l0NMMM0c. .:o0lldl, xMo,. dKKo ;kXWMMNd'
'WMMWo::oOXX0' :kO0kl;;lkK0k, OMMMMWK, 0MMMOc;lxKNKc
.,;;clodkXMc :MKo. .l0W. cMMMW0o. ;0WN, .',;:lodxKM0
cOkkxdollc::l: .XOddddxxxxxxkO cNMx ,0MMXo 'kOkxddolc:::l
.lxkkkkxoc,. ':odxkkkxoc' ,lc;lxo:. :dxkkkxdl;.
";
}}
public static string lorem_ipsum { get {
return
@"
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer euismod in sapien id rhoncus. Suspendisse potenti. Nam bibendum risus lobortis mollis commodo. Donec ac ante nec augue vestibulum consequat. In condimentum id nisl sed placerat. Suspendisse rhoncus lectus a risus sollicitudin accumsan. Quisque semper dui a erat aliquet, ac venenatis felis blandit. In id eros quis tellus condimentum luctus et sit amet enim. Aliquam malesuada erat augue, in euismod libero rhoncus quis. Nam augue sapien, pellentesque quis congue ac, semper nec nisl. Donec accumsan vitae justo ac volutpat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus in dictum ipsum. Nunc venenatis egestas metus id maximus. Aliquam erat volutpat.
Fusce vitae tortor a tortor hendrerit condimentum quis non libero. Proin eget dignissim neque. Aliquam ac justo tempus, semper diam eget, finibus eros. Nullam elementum odio ante, eu volutpat sapien aliquet quis. Nulla eget volutpat lorem. Sed feugiat est vel tellus sodales, ac mollis libero faucibus. Vestibulum auctor dapibus quam, eu efficitur dolor feugiat id. Vestibulum tincidunt maximus arcu. Integer a urna posuere sapien efficitur tincidunt ut nec nibh. Etiam eu ultrices metus, in pretium leo. Duis egestas arcu quis tristique pretium. Maecenas dapibus enim vel quam malesuada elementum. Fusce vulputate mollis fringilla. Nullam fermentum magna velit, ac pharetra ante viverra ac.
In at urna ut dui pretium elementum et a nunc. Aliquam non rutrum velit, vitae mollis justo. Etiam tempus, odio ac finibus semper, ipsum turpis pretium dolor, maximus volutpat metus ante sed ligula. Phasellus interdum odio at tempor consectetur. Curabitur sit amet semper enim, vel sagittis urna. Integer sit amet nulla quis nisi sagittis consectetur fringilla eu diam. Nam lacinia libero eu ornare placerat. Nunc lacinia lacus felis, at efficitur tortor euismod non. Donec eget mi maximus, suscipit dolor sed, sagittis tortor. Proin nec consectetur lectus. Cras vulputate tempus ante at tristique. Morbi eu sodales lorem. Etiam eget pharetra ex. Donec in dictum sem.
";
}}
}

@ -0,0 +1,267 @@
using System.Diagnostics.Contracts;
using System.IO.Pipes;
using Microsoft.VisualBasic;
using Mindmagma.Curses;
using Newtonsoft.Json.Linq;
namespace SCI.CursesWrapper;
public class Helper {
/// <summary>
/// Create a centered NCurses window on the specified screen
/// </summary>
/// <param name="screen">Parent screen to attach window to</param>
/// <param name="width">Width of columns of window</param>
/// <param name="height">Height of rows of window</param>
/// <param name="borders">If true, shows default borders around window</param>
/// <returns>nint - Pointer of new window</returns>
/// <exception cref="ArgumentOutOfRangeException">Throws exception if window is outside of screen bounds</exception>
public static nint CreateCenteredWindow (nint screen, int width, int height, bool borders = true) {
NCurses.GetMaxYX (screen, out int screenHeight, out int screenWidth);
int originY = (screenHeight / 2) - (height / 2);
int originX = (screenWidth / 2) - (width / 2);
if (originX + width > screenWidth) throw new ArgumentOutOfRangeException ("width");
if (originY + height > screenHeight) throw new ArgumentOutOfRangeException ("height");
if (originX < 0) throw new ArgumentOutOfRangeException ("originX");
if (originY < 0) throw new ArgumentOutOfRangeException ("originY");
nint window = NCurses.NewWindow (height, width, originY, originX);
if (borders) NCurses.Box (window, (char) 0, (char) 0);
return window;
}
/// <summary>
/// Prints text horizontally centered to window (on a specific line);
/// </summary>
/// <param name="window">Parent window to print into</param>
/// <param name="text">Text to display</param>
/// <param name="y">Y posititon of the text</param>
public static void PrintHCenteredText (nint window, string text, int y = 0) {
NCurses.GetMaxYX (window, out int _, out int windowWidth);
var x = windowWidth / 2 - text.Length / 2;
NCurses.MoveWindowAddString (window, y, x, text);
}
}
public class MessageBox {
public enum MessageBoxButtons {
OK,
YesNo,
RetryCancel,
RetryIgnoreCancel
}
/// <summary>
/// Shows a message box with specified text and returns the selected button from zero index
/// </summary>
/// <param name="screen">Parent screen to show message box on</param>
/// <param name="text">Text to show</param>
/// <param name="buttons">Type of buttons to show</param>
/// <returns>Button pressed by user, zero indexed</returns>
public static int Show (nint screen, string text, MessageBoxButtons buttons = MessageBoxButtons.OK) {
NCurses.GetMaxYX (screen, out int screenHeight, out int screenWidth);
// Set static box width, if width is larger than screen, reduce to screen size,
// then calculate the message box and inner pad origin X coords
var boxWidth = 50;
if (boxWidth + 3 >= screenWidth) boxWidth = screenWidth - 3;
int originX = (screenWidth / 2) - (boxWidth / 2);
var padOriginX = originX + 2; // Add one for the border and for a single character padding
// Calculate sizes for the inner pad element
var padWidth = boxWidth - 4; // Add four to the total box width due to the two character padding on both sides
var totalTextLines = (int) Math.Ceiling ((double) text.Length / padWidth); // Get total amount of lines required to hold all text limited by box width
var padHeight = totalTextLines;
if (padHeight + 8 > screenHeight) { // If height required to show all text lines plus padding is larger than screen, reduce size of message box
padHeight = screenHeight - 8;
}
// Now calculate the height and Y origin of the text box and inner pad
var boxHeight = padHeight + 6; // Add five to the pad height due to the title bar and two character padding top and bottom
if (boxHeight + 2 > screenHeight) boxHeight = screenHeight - 2;
int originY = (screenHeight / 2) - (boxHeight / 2);
var padOriginY = originY + 3; // Add one for the border, one for the title and one for a single character padding
//if (text.Length > (totalTextRows * textCols)) text = text.Substring (0, (totalTextRows * textCols) - 1) + "$";
// Create message box and inner Pad
var msgBoxWindow = Helper.CreateCenteredWindow (screen, boxWidth, boxHeight, true);
var msgTextPad = NCurses.NewPad (padHeight, padWidth);
NCurses.Refresh ();
// Title, currently not in use
Helper.PrintHCenteredText (msgBoxWindow, "Info", 1);
NCurses.WindowRefresh (msgBoxWindow);
NCurses.WindowAddString (msgTextPad, text);
NCurses.PadRefresh (msgTextPad, 0, 0, padOriginY, padOriginX, padOriginY + padHeight, padOriginX + padWidth);
return InputHandler (msgBoxWindow, buttons);
}
private static List<string> GetStringsFromButtonEnum (MessageBoxButtons buttons) {
List<string> buttonStrings;
switch (buttons) {
case MessageBoxButtons.OK:
buttonStrings = new List<string> () { "OK" };
break;
case MessageBoxButtons.YesNo:
buttonStrings = new List<string> () { "Yes", "No" };
break;
case MessageBoxButtons.RetryCancel:
buttonStrings = new List<string> () { "Retry", "Cancel" };
break;
case MessageBoxButtons.RetryIgnoreCancel:
buttonStrings = new List<string> () { "Retry", "Ignore", "Cancel" };
break;
default:
throw new Exception ("Unknown button layout for message box");
}
return buttonStrings;
}
/// <summary>
/// Draws buttons specified by the buttons type
/// </summary>
/// <param name="window">Window to draw buttons on</param>
/// <param name="buttons">Buttons to display</param>
private static void DrawButtons (nint window, MessageBoxButtons buttons, int active = 0) {
NCurses.GetMaxYX (window, out int windowHeight, out int windowWidth);
var buttonStrings = GetStringsFromButtonEnum (buttons);
var totalStringLength = buttonStrings.Count - 1;
foreach (var str in buttonStrings) totalStringLength += str.Length + 2;
NCurses.WindowMove (window, windowHeight - 2, (windowWidth / 2) - (totalStringLength / 2));
var index = 0;
foreach (var str in buttonStrings) {
if (index == active) {
NCurses.WindowAddString (window, $"[{str}]");
} else {
NCurses.WindowAddString (window, $" {str} ");
}
NCurses.WindowAddChar (window, ' ');
index ++;
}
NCurses.WindowRefresh (window);
}
/// <summary>
/// Handle the user selection of the buttons
/// </summary>
/// <param name="window">Window to draw buttons on</param>
/// <param name="buttons">Buttons to display</param>
/// <returns>User choice of button, zero indexed</returns>
private static int InputHandler (nint window, MessageBoxButtons buttons) {
DrawButtons (window, buttons);
int index = 0;
int maxIndex = GetStringsFromButtonEnum (buttons).Count - 1;
int chr = 0;
while ((chr = NCurses.GetChar ()) != 10) {
if (chr == 260) { // Left
index ++;
if (index > maxIndex) index = 0;
DrawButtons (window, buttons, index);
} else if (chr == 261) { // Right
index --;
if (index < 0) index = maxIndex;
DrawButtons (window, buttons, index);
}
}
return index;
}
}
public class ColorPairs {
public static int Ch_Topmenu_Label = 101;
public static int Ch_Topmenu_Label_Active = 102;
public static void InitColors () {
NCurses.InitPair (101, CursesColor.WHITE, CursesColor.BLUE);
NCurses.InitPair (102, CursesColor.BLACK, CursesColor.BLUE);
}
}
public class TopMenu {
private nint parentScreen;
private nint childWindow;
public List<MenuItem> MenuItems { get; set; } = new List<MenuItem> ();
public TopMenu (nint screen) {
parentScreen = screen;
NCurses.GetMaxYX (screen, out _, out int width);
childWindow = NCurses.NewWindow (1, width, 0, 0);
}
public void Render (int? activeItem = null) {
int index = 0;
uint
normalColorPair = 0,
activeColorPair = 0;
var hasColor = NCurses.HasColors ();
if (hasColor) {
normalColorPair = NCurses.ColorPair (ColorPairs.Ch_Topmenu_Label);
activeColorPair = NCurses.ColorPair (ColorPairs.Ch_Topmenu_Label_Active);
NCurses.WindowBackground (childWindow, normalColorPair);
NCurses.WindowRefresh (childWindow);
}
NCurses.MoveWindowAddString (childWindow, 0, 0, " ");
foreach (var item in MenuItems) {
var itemIsActive = activeItem is not null && index == (int) activeItem;
if (itemIsActive && hasColor) {
NCurses.WindowAttributeOn (childWindow, activeColorPair);
}
if (itemIsActive) {
NCurses.WindowAddString (childWindow, $"[{item.Label}] ");
} else {
NCurses.WindowAddString (childWindow, $" {item.Label} ");
}
if (itemIsActive && hasColor) {
NCurses.WindowAttributeOff (childWindow, activeColorPair);
}
index ++;
}
NCurses.WindowRefresh (childWindow);
}
public class MenuItem {
public required string Label { get; set; }
public string? HotKey { get; set; }
public MenuType Type { get; set; } = MenuType.Simple;
public List<MenuItem> SubMenuItems = new List<MenuItem> ();
public enum MenuType {
Simple,
TopMenu,
SubMenu,
Spacer
}
}
}

@ -0,0 +1,97 @@
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
using Newtonsoft.Json;
namespace Fahrplan;
public class Root {
[JsonProperty("$schema")]
public string schema { get; set; }
public Generator generator { get; set; }
public Schedule schedule { get; set; }
}
public class Colors {
public string primary { get; set; }
}
public class Conference {
public string acronym { get; set; }
public string title { get; set; }
public string start { get; set; }
public string end { get; set; }
public int daysCount { get; set; }
public string timeslot_duration { get; set; }
public string time_zone_name { get; set; }
public Colors colors { get; set; }
public List<Room> rooms { get; set; }
public List<Track> tracks { get; set; }
public List<Day> days { get; set; }
}
public class Day {
public int index { get; set; }
public string date { get; set; }
public DateTime day_start { get; set; }
public DateTime day_end { get; set; }
public Dictionary<string, List<RoomEvent>> rooms { get; set; }
}
public class Generator {
public string name { get; set; }
public string version { get; set; }
}
public class Person {
public string guid { get; set; }
public int id { get; set; }
public string code { get; set; }
public string public_name { get; set; }
public string avatar { get; set; }
public string biography { get; set; }
public List<object> answers { get; set; }
}
public class Room {
public string name { get; set; }
public string guid { get; set; }
public object description { get; set; }
public int capacity { get; set; }
}
public class Track {
public string name { get; set; }
public string color { get; set; }
}
public class RoomEvent {
public string url { get; set; }
public int id { get; set; }
public string guid { get; set; }
public DateTime date { get; set; }
public string start { get; set; }
public string logo { get; set; }
public string duration { get; set; }
public string room { get; set; }
public string slug { get; set; }
public string title { get; set; }
public string subtitle { get; set; }
public string track { get; set; }
public string type { get; set; }
public string language { get; set; }
public string @abstract { get; set; }
public string description { get; set; }
public string recording_license { get; set; }
public bool do_not_record { get; set; }
public List<Person> persons { get; set; }
public List<object> links { get; set; }
public List<object> attachments { get; set; }
public List<object> answers { get; set; }
}
public class Schedule {
public string url { get; set; }
public string version { get; set; }
public string base_url { get; set; }
public Conference conference { get; set; }
}

@ -0,0 +1,181 @@
using System.Security.Principal;
using Mindmagma.Curses;
namespace ANSI_Fahrplan;
public class InputHandler {
/// <summary>
/// Handler called by the input handler routine when a key is pressed
/// </summary>
/// <param name="sender">Sender object of event callback</param>
/// <param name="e">Event arguments with details like the pressed key code</param>
public delegate void KeypressEventHandler (object sender, NCursesKeyPressEventArgs e);
// Event fired when key is pressed
public event KeypressEventHandler? OnKeyPress;
// Similar to OnKeyPress, but called before any regular OnKeyPress event handlers are called
public event KeypressEventHandler? OnKeyPressPrivileged;
// When this variable is set, no event handlers will be called except this one
// Once e.CancelNextEvent is true from this event, it will be set to null again
private KeypressEventHandler? _rawKeyPressHandler;
public KeypressEventHandler? RawKeyPressHandler { get { return _rawKeyPressHandler; }}
private nint _targetWindow;
public nint TargetWindow { get { return _targetWindow; }}
private CancellationTokenSource? listeningRoutineCts;
private Task? listeningTask;
/// <summary>
/// Class constructor
/// </summary>
/// <param name="targetWindow">Window for which to listen to key presses</param>
public InputHandler (nint targetWindow) {
_targetWindow = targetWindow;
}
/// <summary>
/// Start listening to key presses and call registered callbacks
/// <paramref name="window">Window to listen to key presses in<param/>
/// </summary>
public void StartListening () {
if (IsListening ()) return;
listeningRoutineCts = new CancellationTokenSource ();
listeningTask = Task.Run (_ListeningRoutine);
while (listeningTask.Status == TaskStatus.WaitingToRun) Thread.Sleep (50);
}
/// <summary>
/// Stop listening to key presses
/// </summary>
public void StopListening () {
if (! IsListening ()) return;
if (listeningRoutineCts is null) return;
if (listeningTask is null) return;
listeningRoutineCts.Cancel ();
listeningTask.Wait ();
listeningTask = null;
NCurses.Keypad (TargetWindow, false);
}
/// <summary>
/// Returns the current listening status of the input event handler
/// </summary>
/// <returns>True if the event handler routine is listening to key presses</returns>
public bool IsListening () {
return listeningTask is not null && (
listeningTask.Status == TaskStatus.Running ||
listeningTask.Status == TaskStatus.WaitingForActivation
);
}
/// <summary>
/// Enable temporary raw keypress event handler to forward
/// all keypressed directly to a specific function
/// </summary>
/// <param name="eventHandler">Event handler to pass key presses to</param>
/// <param name="screen">Screen to pass key char duty to</param>
public void EnableRawEventHandler (KeypressEventHandler eventHandler, nint? window = null) {
if (window is not null) {
StopListening ();
_targetWindow = (nint) window;
StartListening ();
}
_rawKeyPressHandler = eventHandler;
}
/// <summary>
/// Disables the temporary raw keypress event handler
/// <param name="screen">Screen to pass key char duty back to</param>
/// </summary>
public void DisableRawEventHandler (nint? screen = null) {
if (RawKeyPressHandler is null) return;
if (screen is not null) {
StopListening ();
_targetWindow = (nint) screen;
StartListening ();
}
_rawKeyPressHandler = null;
}
/// <summary>
/// Prepares the window for proper key press reading
/// </summary>
private void WindowSetup () {
NCurses.Keypad (TargetWindow, true);
NCurses.NoDelay (TargetWindow, false);
}
/// <summary>
/// Actual keypress handler being called as Task by StartListening ()
/// </summary>
private void _ListeningRoutine () {
if (listeningRoutineCts is null) return;
WindowSetup ();
while (!listeningRoutineCts.Token.IsCancellationRequested) {
int keyCode = NCurses.WindowGetChar (TargetWindow);
// Do nothing until the key code is larger than -1
if (keyCode < 0) continue;
var eventArgs = new NCursesKeyPressEventArgs (keyCode, TargetWindow);
// If enabled, forward all key pressed directly to raw keypress event handler
if (RawKeyPressHandler is not null) {
RawKeyPressHandler (this, eventArgs);
continue;
}
var skipRegularEventHandlers = false;
// Handle any registered privileged key handlers
if (OnKeyPressPrivileged is not null) {
foreach (KeypressEventHandler h in OnKeyPressPrivileged.GetInvocationList ()) {
h (this, eventArgs);
if (eventArgs.CancelNextEvent == true) {
skipRegularEventHandlers = true;
break;
}
}
}
// Handle any regular registered key handlers
if (OnKeyPress is not null && !skipRegularEventHandlers) {
foreach (KeypressEventHandler h in OnKeyPress.GetInvocationList ()) {
h (this, eventArgs);
if (eventArgs.CancelNextEvent == true) continue ;
}
}
}
listeningRoutineCts.Dispose ();
listeningRoutineCts = null;
}
}
public class NCursesKeyPressEventArgs : EventArgs {
private int _keyCode;
public int KeyCode { get { return _keyCode; }}
private nint _targetWindow;
public nint TargetWindow { get { return _targetWindow; }}
public bool CancelNextEvent { get; set; } = false;
public NCursesKeyPressEventArgs (int keyCode, nint targetWindow) {
_keyCode = keyCode;
_targetWindow = targetWindow;
}
}

@ -0,0 +1,35 @@
using Mindmagma.Curses;
namespace ANSI_Fahrplan;
public class ColorSchemes {
public static void InitAll () {
// Default
NCurses.InitPair (1, CursesColor.YELLOW, CursesColor.BLACK);
// TopMenuNormal
NCurses.InitPair (2, CursesColor.CYAN, CursesColor.BLACK);
// TopMenuActive
NCurses.InitPair (3, CursesColor.RED, CursesColor.BLACK);
// TextInputField
NCurses.InitPair (4, CursesColor.BLACK, CursesColor.WHITE);
}
public static uint Default () {
return NCurses.ColorPair (1);
}
public static uint TopMenuNormal () {
return NCurses.ColorPair (2);
}
public static uint TopMenuActive () {
return NCurses.ColorPair (3);
}
public static uint TextInputField () {
return NCurses.ColorPair (4);
}
}

@ -0,0 +1,114 @@
using Fahrplan;
using Mindmagma.Curses;
using Newtonsoft.Json;
using SCI.CursesWrapper;
namespace ANSI_Fahrplan;
public class Playground {
public static void Run (string [] args) {
Console.WriteLine ("Program initializing Curses...");
// var jsonString = File.ReadAllText ("schedule.json");
// var schedule = JsonConvert.DeserializeObject<Fahrplan.Root> (jsonString);
// foreach (var day in schedule.schedule.conference.days) {
// Console.WriteLine ($"Day: {day.date}, {day.index}");
// foreach (var room in day.rooms) {
// Console.WriteLine ($" \\__ Room: {room.Key}");
// foreach (var ev in room.Value) {
// if (ev is null) continue;
// Console.WriteLine ($" \\__ Event: {ev.title}");
// }
// }
// }
var screen = NCurses.InitScreen ();
NCurses.NoEcho ();
NCurses.CBreak ();
NCurses.SetCursor (0);
var hasColors = NCurses.HasColors ();
if (hasColors) {
NCurses.StartColor ();
NCurses.InitPair (1, CursesColor.WHITE, CursesColor.BLUE);
//ColorPairs.InitColors ();
}
var win1 = NCurses.NewWindow (10, 20, 10, 10);
NCurses.Box (win1, (char) 0, (char) 0);
NCurses.WindowBackground (win1, ColorSchemes.Default ());
NCurses.MoveWindowAddString (win1, 1, 1, "Hello world!");
// Draw windows
NCurses.Refresh ();
NCurses.WindowRefresh (win1);
NCurses.GetChar ();
NCurses.EndWin ();
/*var window = CreateWindowCentered (screen, 40, 12);
NCurses.WindowBackground (window, NCurses.ColorPair (1));
NCurses.WindowAttributeOn (window, NCurses.ColorPair (1));*/
//NCurses.GetMaxYX (screen, out int screenHeight, out int screenWidth);
//NCurses.MoveAddString (screenHeight - 1, 0, "NCurses Example");
/*var menuItems = new List<TopMenu.MenuItem> () {
new TopMenu.MenuItem () { Label = "Test 1" },
new TopMenu.MenuItem () { Label = "Test 2" },
new TopMenu.MenuItem () { Label = "Test 3" },
};
var menu = new TopMenu (screen) { MenuItems = menuItems };
menu.Render ();*/
var msgBoxResponse = MessageBox.Show (screen, "Hello World, this is a message box text, yippee!! Let's make this text even longer, wooowiieeeee!", MessageBox.MessageBoxButtons.YesNo);
NCurses.AddString ($"Input was {msgBoxResponse}");
NCurses.Refresh ();
var inputTask = Task.Run (() => InputRoutine ());
while (inputTask.Status == TaskStatus.WaitingToRun);
while (inputTask.Status == TaskStatus.Running) {
NCurses.Refresh ();
//NCurses.WindowRefresh (window);
NCurses.Nap (1000 / 30);
}
//NCurses.AttributeOff (NCurses.ColorPair (1));
NCurses.EndWin ();
}
static void InputRoutine () {
int chr = 0;
while (chr != CursesKey.ESC) {
chr = NCurses.GetChar ();
/*if (chr == 265) {
menu.Render (0);
} else if (chr == 266) {
menu.Render (1);
} else if (chr == 267) {
menu.Render (2);
} else if (chr > 0) {
menu.Render ();
NCurses.MoveAddString (2, 10, $"You pressed the key {chr} ");
}*/
if (chr > 0) NCurses.MoveAddString (2, 10, $"You pressed the key {chr} ");
}
/*NCurses.WindowBorder (window, ' ', ' ', ' ',' ',' ',' ',' ',' ');
NCurses.WindowRefresh (window);
NCurses.DeleteWindow (window);*/
NCurses.MoveAddString (10, 10, "Input routine exited");
NCurses.Refresh ();
return;
}
}

@ -0,0 +1,86 @@
using ANSI_Fahrplan.Screens;
using ANSI_Fahrplan.UiElements;
using Mindmagma.Curses;
namespace ANSI_Fahrplan;
class Program {
private static void Main (string [] args) {
//Playground.Run (args);
/**
* General procedure:
* - Draw welcome screen
* - User picks the view they want to see
* - Data is being pulled from server
* - Data is being read, processed and displayed in the selected view
* - User can scroll up and down with Up and Down the view if it is longer than one page
* - User can change date, room, speaker etc. by pressing left and right
* - User can change the list type with function keys
**/
var screen = NCurses.InitScreen ();
NCurses.SetCursor (0);
NCurses.NoEcho ();
var hasColors = NCurses.HasColors ();
if (hasColors) {
NCurses.StartColor ();
ColorSchemes.InitAll ();
}
// -- Screen-wide input handler -- //
var screenInputHandler = new InputHandler (screen);
screenInputHandler.StartListening ();
// -- Create menu bar -- //
var topMenu = new TopMenu (screen, CreateMenuItems (screen, screenInputHandler));
// -- Show introduction screen -- //
NCurses.GetMaxYX (screen, out int height, out int width);
var innerWindow = NCurses.NewWindow (height - 2, width - 4, 1, 2);
NCurses.Box (innerWindow, (char) 0, (char) 0);
//var introScreen = new IntroScreen (innerWindow);
//introScreen.Show ();
// Wait until the input handler routine stops
while (true) Thread.Sleep (500);
NCurses.EndWin ();
Console.WriteLine ("Oh wow, the input handler crashed, that's not supposed to happen. Sorry!");
Environment.Exit (1);
}
private static List<MenuItem> CreateMenuItems (nint screen, InputHandler inputHandler) {
var helpItem = new MenuItem ("Help", "F1", inputHandler);
var upcomingItem = new MenuItem ("Upcoming", "F2", inputHandler);
var byDayItem = new MenuItem ("By Day", "F3", inputHandler);
var byRoomItem = new MenuItem ("By Room", "F4", inputHandler);
var bySpeakerItem = new MenuItem ("By Speaker", "F5", inputHandler);
var quitItem = new MenuItem ("Quit", "q", inputHandler);
quitItem.OnItemActivated += (object? sender, EventArgs e) => {
NCurses.EndWin ();
Console.WriteLine ("Bye-bye!");
Environment.Exit (0);
};
helpItem.OnItemActivated += (object? sender, EventArgs e) => {
InputBox.InputCompleted callback = (string ee) => {
NCurses.MoveAddString (3, 3, $"<{ee}>");
};
new InputBox().RequestInput (screen, inputHandler, callback, "Please enter some text now:");
};
return new List<MenuItem> {
helpItem,
upcomingItem,
byDayItem,
byRoomItem,
bySpeakerItem,
quitItem
};
}
}

@ -0,0 +1,12 @@
namespace ANSI_Fahrplan.Screens;
/// <summary>
/// NCurses Header Window
/// </summary>
public class Header {
public Header () {
}
}

@ -0,0 +1,32 @@
using Mindmagma.Curses;
namespace ANSI_Fahrplan.Screens;
public class IntroScreen : Screen {
private nint infoTextBox;
/// <summary>
/// Pass class constructor through to inherited constructor
/// </summary>
/// <param name="rootWindow">Root window to use for this screen</param>
public IntroScreen (nint rootWindow) : base (rootWindow) { }
public override void Show () {
string asciiArtPlusText =
"Press F1 for a quick start guide or simply press Enter\n" +
"to see upcoming events\n" +
AsciiArt.logo38c3_80x24 +
"\n38C3 Fahrplan in your terminal!";
AsciiArt.ShowCentered (RootWindow, asciiArtPlusText);
//infoTextBox = NCurses.SubWindow (infoTextBox, );
NCurses.Refresh ();
NCurses.WindowRefresh (RootWindow);
}
public override void Hide () {
}
}

@ -0,0 +1,27 @@
using Mindmagma.Curses;
namespace ANSI_Fahrplan.Screens;
public abstract class Screen {
private nint _rootWindow;
public nint RootWindow { get { return _rootWindow; }}
public Screen (nint rootWindow) {
_rootWindow = rootWindow;
PrepareWindow ();
}
private void PrepareWindow () {
NCurses.NoEcho ();
NCurses.CBreak ();
NCurses.SetCursor (0);
//NCurses.ClearWindow (RootWindow);
NCurses.WindowMove (RootWindow, 0, 0);
}
public abstract void Show ();
public abstract void Hide ();
}

@ -0,0 +1,13 @@
- [x] Create JSON parser for Fahrplan
- [] Add networking functions to pull up-to-date Fahrplan from web
- [] User interface
- [] Add landing page
- [] Add schedule overview by
- [] Day (List view, go left and right to change days)
- [] Room ()
- [] Category
- [] Speakers
- [] Today/Currently running
- [] Timeline?
- [] Add search interface
- [] Add about page

@ -0,0 +1,98 @@
using System.Runtime.InteropServices.Marshalling;
using Mindmagma.Curses;
namespace ANSI_Fahrplan.UiElements;
public class InputBox {
public delegate void InputCompleted (string input);
public void RequestInput (nint screen, InputHandler inputHandler, InputCompleted callback, string question) {
const int boxPaddingTop = 1;
const int boxPaddingSides = 2;
const int boxPaddingBottom = 2;
const int boxMarginTopBottom = 1;
const int boxMarginSides = 2;
NCurses.GetMaxYX (screen, out int height, out int width);
// Contents inside the question box may not be larger than these
int maxInnerWidth = width - (boxPaddingSides * 2) - (boxMarginSides * 2);
int maxInnerHeight = height - boxPaddingTop - boxPaddingBottom - boxMarginTopBottom;
using var strReader = new StringReader (question);
string? inStr;
int innerWidth = 1;
int innerHeight = 1;
while ((inStr = strReader.ReadLine ()) is not null) {
if (inStr.Length > innerWidth) innerWidth = inStr.Length;
if (innerWidth > maxInnerWidth) {
innerWidth = maxInnerWidth;
innerHeight += (int) Math.Ceiling (inStr.Length / (double) maxInnerWidth);
} else {
innerHeight ++;
}
}
int boxWidth = innerWidth + (boxPaddingSides * 2);
int boxHeight = innerHeight + boxPaddingTop + boxPaddingBottom;
int boxAnchorX = (width / 2) - (boxWidth / 2);
int boxAnchorY = (height / 2) - (boxHeight / 2);
var boxWin = NCurses.SubWindow (screen, boxHeight, boxWidth, boxAnchorY, boxAnchorX);
NCurses.Box (boxWin, (char) 0, (char) 0);
NCurses.Refresh ();
NCurses.WindowRefresh (boxWin);
int questionTextWinAnchorX = boxAnchorX + boxPaddingSides;
int questionTextWinAnchorY = boxAnchorY + boxPaddingTop;
var questionTextWin = NCurses.SubWindow (boxWin, innerHeight, innerWidth, questionTextWinAnchorY, questionTextWinAnchorX);
NCurses.WindowAddString (questionTextWin, question.Trim ());
NCurses.WindowRefresh (questionTextWin);
int inputFieldWinX = questionTextWinAnchorX;
int inputFieldWinY = boxAnchorY + boxHeight - boxMarginTopBottom - 1;
var inputFieldWin = NCurses.SubWindow (boxWin, 1, innerWidth, inputFieldWinY, inputFieldWinX);
NCurses.WindowBackground (inputFieldWin, ColorSchemes.TextInputField ());
NCurses.WindowAttributeSet (inputFieldWin, ColorSchemes.TextInputField ());
NCurses.WindowRefresh (inputFieldWin);
NCurses.MoveWindow (inputFieldWin, inputFieldWinY, inputFieldWinX);
NCurses.SetCursor (1);
NCurses.Echo ();
var userInput = "";
InputHandler.KeypressEventHandler handlerFunction = (object sender, NCursesKeyPressEventArgs e) => {
if (e.KeyCode == '\n' || e.KeyCode == CursesKey.ENTER) {
callback (userInput);
}
if (e.KeyCode == '\n' || e.KeyCode == CursesKey.ENTER || e.KeyCode == CursesKey.ESC) {
NCurses.SetCursor (0);
NCurses.NoEcho ();
inputHandler.DisableRawEventHandler (screen);
NCurses.MoveWindow (screen, 0, 0);
NCurses.DeleteWindow (inputFieldWin);
NCurses.DeleteWindow (questionTextWin);
NCurses.DeleteWindow (boxWin);
NCurses.Refresh ();
} else if (e.KeyCode == CursesKey.BACKSPACE) {
userInput = userInput.Substring (0, userInput.Length - 2);
} else if (char.IsAscii ((char) e.KeyCode)) {
userInput += (char) e.KeyCode;
}
NCurses.MoveWindow (inputFieldWin, inputFieldWinY, inputFieldWinX);
};
inputHandler.EnableRawEventHandler (handlerFunction, inputFieldWin);
}
}

@ -0,0 +1,51 @@
using Mindmagma.Curses;
namespace ANSI_Fahrplan.UiElements;
public class MenuItem {
private List<MenuItem> _childItems;
public List<MenuItem> ChildItems { get { return _childItems; }}
private string _label;
public string Label { get { return _label; }}
private string _key;
public string Key { get { return _key; }}
public delegate void ItemActivated (object sender, EventArgs e);
// Event fired when menu item is activated
public event EventHandler? OnItemActivated;
private InputHandler _inputHandler;
public InputHandler InputHandler { get { return _inputHandler; }}
public MenuItem (string label, string key, InputHandler inputHandler, List<MenuItem>? childItems = null) {
_childItems = childItems ?? new List<MenuItem> ();
_key = key;
_inputHandler = inputHandler;
_label = label;
}
public void KeyHandler (object sender, NCursesKeyPressEventArgs e) {
if (OnItemActivated is null) return;
if (Key.Length > 1 && Key.StartsWith ("F")) { // Handle F keys
if (e.KeyCode == CursesKey.KEY_F (int.Parse (Key.Substring (1)))) {
OnItemActivated (this, EventArgs.Empty);
}
} else if (Key.Length == 1) { // Handle letters and numbers
if (e.KeyCode == Key [0]) {
OnItemActivated (this, EventArgs.Empty);
}
} else throw new NotImplementedException ("Currently only F-keys and letters work for Top Menu actions");
}
public void RegisterKeyHandler () {
InputHandler.OnKeyPress += KeyHandler;
}
public void UnregisterKeyHandler () {
InputHandler.OnKeyPress -= KeyHandler;
}
}

@ -0,0 +1,107 @@
using Mindmagma.Curses;
namespace ANSI_Fahrplan.UiElements;
public class TopMenu : UiElement {
private List<MenuItem> _menuItems = new List<MenuItem> ();
public List<MenuItem> MenuItems {
get {
return _menuItems;
}
set {
UnregisterItemEventHandlers ();
_menuItems = value;
RegisterItemEventHandlers ();
DrawMenu ();
}
}
private MenuItem? activeMenuItem;
public TopMenu (nint screen, List<MenuItem> menuItems) : base (screen) {
NCurses.GetMaxYX (screen, out _, out int width);
innerWindow = NCurses.NewWindow (1, width, 0, 0);
var colorSchemeNormal = ColorSchemes.TopMenuNormal ();
NCurses.WindowBackground (innerWindow, colorSchemeNormal);
NCurses.WindowAttributeOn (innerWindow, colorSchemeNormal);
MenuItems = menuItems;
}
/// <summary>
/// Register key event handlers for each menu item
/// </summary>
private void RegisterItemEventHandlers () {
foreach (var item in MenuItems) {
item.OnItemActivated += ItemActivatedHandler;
item.RegisterKeyHandler ();
}
}
/// <summary>
/// Unregister key event handlers for each menu item
/// </summary>
private void UnregisterItemEventHandlers () {
foreach (var item in MenuItems) {
item.OnItemActivated -= ItemActivatedHandler;
item.UnregisterKeyHandler ();
}
}
/// <summary>
/// Event handler to update menu interface when item reports itself as activated
/// </summary>
/// <param name="sender">Sender Menu Item firing the event</param>
/// <param name="e">Event arguments</param>
private void ItemActivatedHandler (object? sender, EventArgs e) {
if (sender is null) return;
activeMenuItem = (MenuItem) sender;
DrawMenu ();
}
/// <summary>
/// Draw the top menu with currently configured menu items
/// </summary>
private void DrawMenu () {
NCurses.ClearWindow (innerWindow);
var normalColor = ColorSchemes.TopMenuNormal ();
var activeColor = ColorSchemes.TopMenuActive ();
foreach (var item in MenuItems) {
var itemIsActive = item == activeMenuItem;
var itemString = " ";
if (itemIsActive) {
itemString = "[";
NCurses.WindowAttributeOff (innerWindow, normalColor);
NCurses.WindowAttributeOn (innerWindow, activeColor);
}
itemString += $"{item.Label}";
if (item.Key is not null) {
itemString += $" ({item.Key})";
}
if (itemIsActive) {
NCurses.WindowAttributeOff (innerWindow, activeColor);
NCurses.WindowAttributeOn (innerWindow, normalColor);
itemString += "] ";
} else {
itemString += " ";
}
NCurses.WindowAddString (innerWindow, itemString);
}
NCurses.Refresh ();
NCurses.WindowRefresh (innerWindow);
}
public void Refresh () {
DrawMenu ();
}
}

@ -0,0 +1,12 @@
namespace ANSI_Fahrplan.UiElements;
public abstract class UiElement {
private nint _screen;
public nint Screen { get { return _screen; }}
protected nint innerWindow { get; set; }
public UiElement (nint screen) {
_screen = screen;
}
}

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PublishAot>true</PublishAot>
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="dotnet-curses" Version="1.0.3" />
</ItemGroup>
</Project>

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.002.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ansifahrplan", "ansifahrplan.csproj", "{E45C4F1F-23A9-417B-9D6F-F93401EB8AFB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E45C4F1F-23A9-417B-9D6F-F93401EB8AFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E45C4F1F-23A9-417B-9D6F-F93401EB8AFB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E45C4F1F-23A9-417B-9D6F-F93401EB8AFB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E45C4F1F-23A9-417B-9D6F-F93401EB8AFB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B580F04A-51FC-4D42-9199-24317D67E121}
EndGlobalSection
EndGlobal

Binary file not shown.

@ -0,0 +1,749 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"ansifahrplan/1.0.0": {
"dependencies": {
"Microsoft.DotNet.ILCompiler": "8.0.11",
"Microsoft.NET.ILLink.Tasks": "8.0.11",
"dotnet-curses": "1.0.3"
},
"runtime": {
"ansifahrplan.dll": {}
}
},
"dotnet-curses/1.0.3": {
"dependencies": {
"Microsoft.Extensions.DependencyModel": "2.1.0"
},
"runtime": {
"lib/netstandard2.0/dotnet-curses.dll": {
"assemblyVersion": "1.0.3.0",
"fileVersion": "1.0.3.0"
}
}
},
"Microsoft.CSharp/4.0.1": {
"dependencies": {
"System.Collections": "4.0.11",
"System.Diagnostics.Debug": "4.0.11",
"System.Dynamic.Runtime": "4.0.11",
"System.Globalization": "4.0.11",
"System.Linq": "4.1.0",
"System.Linq.Expressions": "4.1.0",
"System.ObjectModel": "4.0.12",
"System.Reflection": "4.1.0",
"System.Reflection.Extensions": "4.0.1",
"System.Reflection.Primitives": "4.0.1",
"System.Reflection.TypeExtensions": "4.1.0",
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.Extensions": "4.1.0",
"System.Runtime.InteropServices": "4.1.0",
"System.Threading": "4.0.11"
}
},
"Microsoft.DotNet.ILCompiler/8.0.11": {},
"Microsoft.DotNet.PlatformAbstractions/2.1.0": {
"dependencies": {
"System.AppContext": "4.1.0",
"System.Collections": "4.0.11",
"System.IO": "4.1.0",
"System.IO.FileSystem": "4.0.1",
"System.Reflection.TypeExtensions": "4.1.0",
"System.Runtime.Extensions": "4.1.0",
"System.Runtime.InteropServices": "4.1.0",
"System.Runtime.InteropServices.RuntimeInformation": "4.0.0"
},
"runtime": {
"lib/netstandard1.3/Microsoft.DotNet.PlatformAbstractions.dll": {
"assemblyVersion": "2.1.0.0",
"fileVersion": "2.1.0.0"
}
}
},
"Microsoft.Extensions.DependencyModel/2.1.0": {
"dependencies": {
"Microsoft.DotNet.PlatformAbstractions": "2.1.0",
"Newtonsoft.Json": "9.0.1",
"System.Diagnostics.Debug": "4.0.11",
"System.Dynamic.Runtime": "4.0.11",
"System.Linq": "4.1.0"
},
"runtime": {
"lib/netstandard1.6/Microsoft.Extensions.DependencyModel.dll": {
"assemblyVersion": "2.1.0.0",
"fileVersion": "2.1.0.0"
}
}
},
"Microsoft.NET.ILLink.Tasks/8.0.11": {},
"Microsoft.NETCore.Platforms/1.0.1": {},
"Microsoft.NETCore.Targets/1.0.1": {},
"Newtonsoft.Json/9.0.1": {
"dependencies": {
"Microsoft.CSharp": "4.0.1",
"System.Collections": "4.0.11",
"System.Diagnostics.Debug": "4.0.11",
"System.Dynamic.Runtime": "4.0.11",
"System.Globalization": "4.0.11",
"System.IO": "4.1.0",
"System.Linq": "4.1.0",
"System.Linq.Expressions": "4.1.0",
"System.ObjectModel": "4.0.12",
"System.Reflection": "4.1.0",
"System.Reflection.Extensions": "4.0.1",
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.Extensions": "4.1.0",
"System.Runtime.Serialization.Primitives": "4.1.1",
"System.Text.Encoding": "4.0.11",
"System.Text.Encoding.Extensions": "4.0.11",
"System.Text.RegularExpressions": "4.1.0",
"System.Threading": "4.0.11",
"System.Threading.Tasks": "4.0.11",
"System.Xml.ReaderWriter": "4.0.11",
"System.Xml.XDocument": "4.0.11"
},
"runtime": {
"lib/netstandard1.0/Newtonsoft.Json.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.1.19813"
}
}
},
"runtime.native.System/4.0.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1"
}
},
"System.AppContext/4.1.0": {
"dependencies": {
"System.Runtime": "4.1.0"
}
},
"System.Collections/4.0.11": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Diagnostics.Debug/4.0.11": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Diagnostics.Tools/4.0.1": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Dynamic.Runtime/4.0.11": {
"dependencies": {
"System.Collections": "4.0.11",
"System.Diagnostics.Debug": "4.0.11",
"System.Globalization": "4.0.11",
"System.Linq": "4.1.0",
"System.Linq.Expressions": "4.1.0",
"System.ObjectModel": "4.0.12",
"System.Reflection": "4.1.0",
"System.Reflection.Emit": "4.0.1",
"System.Reflection.Emit.ILGeneration": "4.0.1",
"System.Reflection.Primitives": "4.0.1",
"System.Reflection.TypeExtensions": "4.1.0",
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.Extensions": "4.1.0",
"System.Threading": "4.0.11"
}
},
"System.Globalization/4.0.11": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Runtime": "4.1.0"
}
},
"System.IO/4.1.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Runtime": "4.1.0",
"System.Text.Encoding": "4.0.11",
"System.Threading.Tasks": "4.0.11"
}
},
"System.IO.FileSystem/4.0.1": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.IO": "4.1.0",
"System.IO.FileSystem.Primitives": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.Handles": "4.0.1",
"System.Text.Encoding": "4.0.11",
"System.Threading.Tasks": "4.0.11"
}
},
"System.IO.FileSystem.Primitives/4.0.1": {
"dependencies": {
"System.Runtime": "4.1.0"
}
},
"System.Linq/4.1.0": {
"dependencies": {
"System.Collections": "4.0.11",
"System.Diagnostics.Debug": "4.0.11",
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.Extensions": "4.1.0"
}
},
"System.Linq.Expressions/4.1.0": {
"dependencies": {
"System.Collections": "4.0.11",
"System.Diagnostics.Debug": "4.0.11",
"System.Globalization": "4.0.11",
"System.IO": "4.1.0",
"System.Linq": "4.1.0",
"System.ObjectModel": "4.0.12",
"System.Reflection": "4.1.0",
"System.Reflection.Emit": "4.0.1",
"System.Reflection.Emit.ILGeneration": "4.0.1",
"System.Reflection.Emit.Lightweight": "4.0.1",
"System.Reflection.Extensions": "4.0.1",
"System.Reflection.Primitives": "4.0.1",
"System.Reflection.TypeExtensions": "4.1.0",
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.Extensions": "4.1.0",
"System.Threading": "4.0.11"
}
},
"System.ObjectModel/4.0.12": {
"dependencies": {
"System.Collections": "4.0.11",
"System.Diagnostics.Debug": "4.0.11",
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0",
"System.Threading": "4.0.11"
}
},
"System.Reflection/4.1.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.IO": "4.1.0",
"System.Reflection.Primitives": "4.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Reflection.Emit/4.0.1": {
"dependencies": {
"System.IO": "4.1.0",
"System.Reflection": "4.1.0",
"System.Reflection.Emit.ILGeneration": "4.0.1",
"System.Reflection.Primitives": "4.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Reflection.Emit.ILGeneration/4.0.1": {
"dependencies": {
"System.Reflection": "4.1.0",
"System.Reflection.Primitives": "4.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Reflection.Emit.Lightweight/4.0.1": {
"dependencies": {
"System.Reflection": "4.1.0",
"System.Reflection.Emit.ILGeneration": "4.0.1",
"System.Reflection.Primitives": "4.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Reflection.Extensions/4.0.1": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Reflection": "4.1.0",
"System.Runtime": "4.1.0"
}
},
"System.Reflection.Primitives/4.0.1": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Reflection.TypeExtensions/4.1.0": {
"dependencies": {
"System.Reflection": "4.1.0",
"System.Runtime": "4.1.0"
}
},
"System.Resources.ResourceManager/4.0.1": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Globalization": "4.0.11",
"System.Reflection": "4.1.0",
"System.Runtime": "4.1.0"
}
},
"System.Runtime/4.1.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1"
}
},
"System.Runtime.Extensions/4.1.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Runtime.Handles/4.0.1": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Runtime.InteropServices/4.1.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Reflection": "4.1.0",
"System.Reflection.Primitives": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.Handles": "4.0.1"
}
},
"System.Runtime.InteropServices.RuntimeInformation/4.0.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"System.Reflection": "4.1.0",
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.InteropServices": "4.1.0",
"System.Threading": "4.0.11",
"runtime.native.System": "4.0.0"
}
},
"System.Runtime.Serialization.Primitives/4.1.1": {
"dependencies": {
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Text.Encoding/4.0.11": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Text.Encoding.Extensions/4.0.11": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Runtime": "4.1.0",
"System.Text.Encoding": "4.0.11"
}
},
"System.Text.RegularExpressions/4.1.0": {
"dependencies": {
"System.Collections": "4.0.11",
"System.Globalization": "4.0.11",
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.Extensions": "4.1.0",
"System.Threading": "4.0.11"
}
},
"System.Threading/4.0.11": {
"dependencies": {
"System.Runtime": "4.1.0",
"System.Threading.Tasks": "4.0.11"
}
},
"System.Threading.Tasks/4.0.11": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.NETCore.Targets": "1.0.1",
"System.Runtime": "4.1.0"
}
},
"System.Threading.Tasks.Extensions/4.0.0": {
"dependencies": {
"System.Collections": "4.0.11",
"System.Runtime": "4.1.0",
"System.Threading.Tasks": "4.0.11"
}
},
"System.Xml.ReaderWriter/4.0.11": {
"dependencies": {
"System.Collections": "4.0.11",
"System.Diagnostics.Debug": "4.0.11",
"System.Globalization": "4.0.11",
"System.IO": "4.1.0",
"System.IO.FileSystem": "4.0.1",
"System.IO.FileSystem.Primitives": "4.0.1",
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.Extensions": "4.1.0",
"System.Runtime.InteropServices": "4.1.0",
"System.Text.Encoding": "4.0.11",
"System.Text.Encoding.Extensions": "4.0.11",
"System.Text.RegularExpressions": "4.1.0",
"System.Threading.Tasks": "4.0.11",
"System.Threading.Tasks.Extensions": "4.0.0"
}
},
"System.Xml.XDocument/4.0.11": {
"dependencies": {
"System.Collections": "4.0.11",
"System.Diagnostics.Debug": "4.0.11",
"System.Diagnostics.Tools": "4.0.1",
"System.Globalization": "4.0.11",
"System.IO": "4.1.0",
"System.Reflection": "4.1.0",
"System.Resources.ResourceManager": "4.0.1",
"System.Runtime": "4.1.0",
"System.Runtime.Extensions": "4.1.0",
"System.Text.Encoding": "4.0.11",
"System.Threading": "4.0.11",
"System.Xml.ReaderWriter": "4.0.11"
}
}
}
},
"libraries": {
"ansifahrplan/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"dotnet-curses/1.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-N8f0uDCaBoe/9/8OYeEzI0yl1V4O5r75dTgmGReaCXEsC1dptHORb+vIK04k0uh0vhbs7Rf/NYUdpR89ndd6jg==",
"path": "dotnet-curses/1.0.3",
"hashPath": "dotnet-curses.1.0.3.nupkg.sha512"
},
"Microsoft.CSharp/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-17h8b5mXa87XYKrrVqdgZ38JefSUqLChUQpXgSnpzsM0nDOhE40FTeNWOJ/YmySGV6tG6T8+hjz6vxbknHJr6A==",
"path": "microsoft.csharp/4.0.1",
"hashPath": "microsoft.csharp.4.0.1.nupkg.sha512"
},
"Microsoft.DotNet.ILCompiler/8.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9SWRKJzFrE07m77G/9jSR1lqdlPmKCsQX1UflZEFBGYzmOZ53sjLEEcAiWtnWY0QJ750h2ahciOPO8oVjztQ0g==",
"path": "microsoft.dotnet.ilcompiler/8.0.11",
"hashPath": "microsoft.dotnet.ilcompiler.8.0.11.nupkg.sha512"
},
"Microsoft.DotNet.PlatformAbstractions/2.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9KPDwvb/hLEVXYruVHVZ8BkebC8j17DmPb56LnqRF74HqSPLjCkrlFUjOtFpQPA2DeADBRTI/e69aCfRBfrhxw==",
"path": "microsoft.dotnet.platformabstractions/2.1.0",
"hashPath": "microsoft.dotnet.platformabstractions.2.1.0.nupkg.sha512"
},
"Microsoft.Extensions.DependencyModel/2.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-nS2XKqi+1A1umnYNLX2Fbm/XnzCxs5i+zXVJ3VC6r9t2z0NZr9FLnJN4VQpKigdcWH/iFTbMuX6M6WQJcTjVIg==",
"path": "microsoft.extensions.dependencymodel/2.1.0",
"hashPath": "microsoft.extensions.dependencymodel.2.1.0.nupkg.sha512"
},
"Microsoft.NET.ILLink.Tasks/8.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-zk5lnZrYJgtuJG8L4v17Ej8rZ3PUcR2iweNV08BaO5LbYHIi2wNaVNcJoLxvqgQdnjLlKnCCfVGLDr6QHeAarQ==",
"path": "microsoft.net.illink.tasks/8.0.11",
"hashPath": "microsoft.net.illink.tasks.8.0.11.nupkg.sha512"
},
"Microsoft.NETCore.Platforms/1.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
"path": "microsoft.netcore.platforms/1.0.1",
"hashPath": "microsoft.netcore.platforms.1.0.1.nupkg.sha512"
},
"Microsoft.NETCore.Targets/1.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
"path": "microsoft.netcore.targets/1.0.1",
"hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512"
},
"Newtonsoft.Json/9.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==",
"path": "newtonsoft.json/9.0.1",
"hashPath": "newtonsoft.json.9.0.1.nupkg.sha512"
},
"runtime.native.System/4.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-QfS/nQI7k/BLgmLrw7qm7YBoULEvgWnPI+cYsbfCVFTW8Aj+i8JhccxcFMu1RWms0YZzF+UHguNBK4Qn89e2Sg==",
"path": "runtime.native.system/4.0.0",
"hashPath": "runtime.native.system.4.0.0.nupkg.sha512"
},
"System.AppContext/4.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3QjO4jNV7PdKkmQAVp9atA+usVnKRwI3Kx1nMwJ93T0LcQfx7pKAYk0nKz5wn1oP5iqlhZuy6RXOFdhr7rDwow==",
"path": "system.appcontext/4.1.0",
"hashPath": "system.appcontext.4.1.0.nupkg.sha512"
},
"System.Collections/4.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
"path": "system.collections/4.0.11",
"hashPath": "system.collections.4.0.11.nupkg.sha512"
},
"System.Diagnostics.Debug/4.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
"path": "system.diagnostics.debug/4.0.11",
"hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512"
},
"System.Diagnostics.Tools/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
"path": "system.diagnostics.tools/4.0.1",
"hashPath": "system.diagnostics.tools.4.0.1.nupkg.sha512"
},
"System.Dynamic.Runtime/4.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==",
"path": "system.dynamic.runtime/4.0.11",
"hashPath": "system.dynamic.runtime.4.0.11.nupkg.sha512"
},
"System.Globalization/4.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
"path": "system.globalization/4.0.11",
"hashPath": "system.globalization.4.0.11.nupkg.sha512"
},
"System.IO/4.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
"path": "system.io/4.1.0",
"hashPath": "system.io.4.1.0.nupkg.sha512"
},
"System.IO.FileSystem/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-IBErlVq5jOggAD69bg1t0pJcHaDbJbWNUZTPI96fkYWzwYbN6D9wRHMULLDd9dHsl7C2YsxXL31LMfPI1SWt8w==",
"path": "system.io.filesystem/4.0.1",
"hashPath": "system.io.filesystem.4.0.1.nupkg.sha512"
},
"System.IO.FileSystem.Primitives/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kWkKD203JJKxJeE74p8aF8y4Qc9r9WQx4C0cHzHPrY3fv/L/IhWnyCHaFJ3H1QPOH6A93whlQ2vG5nHlBDvzWQ==",
"path": "system.io.filesystem.primitives/4.0.1",
"hashPath": "system.io.filesystem.primitives.4.0.1.nupkg.sha512"
},
"System.Linq/4.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
"path": "system.linq/4.1.0",
"hashPath": "system.linq.4.1.0.nupkg.sha512"
},
"System.Linq.Expressions/4.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
"path": "system.linq.expressions/4.1.0",
"hashPath": "system.linq.expressions.4.1.0.nupkg.sha512"
},
"System.ObjectModel/4.0.12": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
"path": "system.objectmodel/4.0.12",
"hashPath": "system.objectmodel.4.0.12.nupkg.sha512"
},
"System.Reflection/4.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
"path": "system.reflection/4.1.0",
"hashPath": "system.reflection.4.1.0.nupkg.sha512"
},
"System.Reflection.Emit/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
"path": "system.reflection.emit/4.0.1",
"hashPath": "system.reflection.emit.4.0.1.nupkg.sha512"
},
"System.Reflection.Emit.ILGeneration/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
"path": "system.reflection.emit.ilgeneration/4.0.1",
"hashPath": "system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512"
},
"System.Reflection.Emit.Lightweight/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
"path": "system.reflection.emit.lightweight/4.0.1",
"hashPath": "system.reflection.emit.lightweight.4.0.1.nupkg.sha512"
},
"System.Reflection.Extensions/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
"path": "system.reflection.extensions/4.0.1",
"hashPath": "system.reflection.extensions.4.0.1.nupkg.sha512"
},
"System.Reflection.Primitives/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
"path": "system.reflection.primitives/4.0.1",
"hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512"
},
"System.Reflection.TypeExtensions/4.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
"path": "system.reflection.typeextensions/4.1.0",
"hashPath": "system.reflection.typeextensions.4.1.0.nupkg.sha512"
},
"System.Resources.ResourceManager/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
"path": "system.resources.resourcemanager/4.0.1",
"hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512"
},
"System.Runtime/4.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
"path": "system.runtime/4.1.0",
"hashPath": "system.runtime.4.1.0.nupkg.sha512"
},
"System.Runtime.Extensions/4.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
"path": "system.runtime.extensions/4.1.0",
"hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512"
},
"System.Runtime.Handles/4.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-nCJvEKguXEvk2ymk1gqj625vVnlK3/xdGzx0vOKicQkoquaTBJTP13AIYkocSUwHCLNBwUbXTqTWGDxBTWpt7g==",
"path": "system.runtime.handles/4.0.1",
"hashPath": "system.runtime.handles.4.0.1.nupkg.sha512"
},
"System.Runtime.InteropServices/4.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-16eu3kjHS633yYdkjwShDHZLRNMKVi/s0bY8ODiqJ2RfMhDMAwxZaUaWVnZ2P71kr/or+X9o/xFWtNqz8ivieQ==",
"path": "system.runtime.interopservices/4.1.0",
"hashPath": "system.runtime.interopservices.4.1.0.nupkg.sha512"
},
"System.Runtime.InteropServices.RuntimeInformation/4.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-hWPhJxc453RCa8Z29O91EmfGeZIHX1ZH2A8L6lYQVSaKzku2DfArSfMEb1/MYYzPQRJZeu0c9dmYeJKxW5Fgng==",
"path": "system.runtime.interopservices.runtimeinformation/4.0.0",
"hashPath": "system.runtime.interopservices.runtimeinformation.4.0.0.nupkg.sha512"
},
"System.Runtime.Serialization.Primitives/4.1.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
"path": "system.runtime.serialization.primitives/4.1.1",
"hashPath": "system.runtime.serialization.primitives.4.1.1.nupkg.sha512"
},
"System.Text.Encoding/4.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
"path": "system.text.encoding/4.0.11",
"hashPath": "system.text.encoding.4.0.11.nupkg.sha512"
},
"System.Text.Encoding.Extensions/4.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
"path": "system.text.encoding.extensions/4.0.11",
"hashPath": "system.text.encoding.extensions.4.0.11.nupkg.sha512"
},
"System.Text.RegularExpressions/4.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
"path": "system.text.regularexpressions/4.1.0",
"hashPath": "system.text.regularexpressions.4.1.0.nupkg.sha512"
},
"System.Threading/4.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
"path": "system.threading/4.0.11",
"hashPath": "system.threading.4.0.11.nupkg.sha512"
},
"System.Threading.Tasks/4.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
"path": "system.threading.tasks/4.0.11",
"hashPath": "system.threading.tasks.4.0.11.nupkg.sha512"
},
"System.Threading.Tasks.Extensions/4.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pH4FZDsZQ/WmgJtN4LWYmRdJAEeVkyriSwrv2Teoe5FOU0Yxlb6II6GL8dBPOfRmutHGATduj3ooMt7dJ2+i+w==",
"path": "system.threading.tasks.extensions/4.0.0",
"hashPath": "system.threading.tasks.extensions.4.0.0.nupkg.sha512"
},
"System.Xml.ReaderWriter/4.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZIiLPsf67YZ9zgr31vzrFaYQqxRPX9cVHjtPSnmx4eN6lbS/yEyYNr2vs1doGDEscF0tjCZFsk9yUg1sC9e8tg==",
"path": "system.xml.readerwriter/4.0.11",
"hashPath": "system.xml.readerwriter.4.0.11.nupkg.sha512"
},
"System.Xml.XDocument/4.0.11": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Mk2mKmPi0nWaoiYeotq1dgeNK1fqWh61+EK+w4Wu8SWuTYLzpUnschb59bJtGywaPq7SmTuPf44wrXRwbIrukg==",
"path": "system.xml.xdocument/4.0.11",
"hashPath": "system.xml.xdocument.4.0.11.nupkg.sha512"
}
}
}

Binary file not shown.

Binary file not shown.

@ -0,0 +1,28 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"Microsoft.Extensions.DependencyInjection.VerifyOpenGenericServiceTrimmability": true,
"System.ComponentModel.TypeConverter.EnableUnsafeBinaryFormatterInDesigntimeLicenseContextSerialization": false,
"System.Diagnostics.Tracing.EventSource.IsSupported": false,
"System.Globalization.Invariant": true,
"System.Globalization.PredefinedCulturesOnly": true,
"System.Resources.ResourceManager.AllowCustomResourceTypes": false,
"System.Runtime.CompilerServices.RuntimeFeature.IsDynamicCodeSupported": false,
"System.Runtime.InteropServices.BuiltInComInterop.IsSupported": false,
"System.Runtime.InteropServices.EnableConsumingManagedCodeFromNativeHosting": false,
"System.Runtime.InteropServices.EnableCppCLIHostActivation": false,
"System.Runtime.InteropServices.Marshalling.EnableGeneratedComInterfaceComImportInterop": false,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
"System.StartupHookProvider.IsSupported": false,
"System.Text.Encoding.EnableUnsafeUTF7Encoding": false,
"System.Text.Json.JsonSerializer.IsReflectionEnabledByDefault": false,
"System.Threading.Thread.EnableAutoreleasePool": false,
"System.Linq.Expressions.CanEmitObjectArrayDelegate": false
}
}
}

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("ansifahrplan")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("ansifahrplan")]
[assembly: System.Reflection.AssemblyTitleAttribute("ansifahrplan")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

@ -0,0 +1 @@
7099f7067c1060bcec82387858fbaeedf2bc0f4f8f5534c308d36d8e98576a67

@ -0,0 +1,17 @@
is_global = true
build_property.EnableAotAnalyzer = true
build_property.EnableSingleFileAnalyzer = true
build_property.EnableTrimAnalyzer = true
build_property.IncludeAllContentForSelfExtract =
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization = true
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = ansifahrplan
build_property.ProjectDir = /home/snep/Documents/Coding/ansifahrplan/
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop = false

@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

@ -0,0 +1 @@
e1131ac5254bc073e740b9cee0ff9bec79fc4473591b1d99a998c4bada73d1b8

@ -0,0 +1,20 @@
/home/snep/Documents/Coding/ansifahrplan/bin/Debug/net8.0/ansifahrplan
/home/snep/Documents/Coding/ansifahrplan/bin/Debug/net8.0/ansifahrplan.deps.json
/home/snep/Documents/Coding/ansifahrplan/bin/Debug/net8.0/ansifahrplan.runtimeconfig.json
/home/snep/Documents/Coding/ansifahrplan/bin/Debug/net8.0/ansifahrplan.dll
/home/snep/Documents/Coding/ansifahrplan/bin/Debug/net8.0/ansifahrplan.pdb
/home/snep/Documents/Coding/ansifahrplan/bin/Debug/net8.0/dotnet-curses.dll
/home/snep/Documents/Coding/ansifahrplan/bin/Debug/net8.0/Microsoft.DotNet.PlatformAbstractions.dll
/home/snep/Documents/Coding/ansifahrplan/bin/Debug/net8.0/Microsoft.Extensions.DependencyModel.dll
/home/snep/Documents/Coding/ansifahrplan/bin/Debug/net8.0/Newtonsoft.Json.dll
/home/snep/Documents/Coding/ansifahrplan/obj/Debug/net8.0/ansifahrplan.csproj.AssemblyReference.cache
/home/snep/Documents/Coding/ansifahrplan/obj/Debug/net8.0/ansifahrplan.GeneratedMSBuildEditorConfig.editorconfig
/home/snep/Documents/Coding/ansifahrplan/obj/Debug/net8.0/ansifahrplan.AssemblyInfoInputs.cache
/home/snep/Documents/Coding/ansifahrplan/obj/Debug/net8.0/ansifahrplan.AssemblyInfo.cs
/home/snep/Documents/Coding/ansifahrplan/obj/Debug/net8.0/ansifahrplan.csproj.CoreCompileInputs.cache
/home/snep/Documents/Coding/ansifahrplan/obj/Debug/net8.0/ansifahr.ACD2E987.Up2Date
/home/snep/Documents/Coding/ansifahrplan/obj/Debug/net8.0/ansifahrplan.dll
/home/snep/Documents/Coding/ansifahrplan/obj/Debug/net8.0/refint/ansifahrplan.dll
/home/snep/Documents/Coding/ansifahrplan/obj/Debug/net8.0/ansifahrplan.pdb
/home/snep/Documents/Coding/ansifahrplan/obj/Debug/net8.0/ansifahrplan.genruntimeconfig.cache
/home/snep/Documents/Coding/ansifahrplan/obj/Debug/net8.0/ref/ansifahrplan.dll

Binary file not shown.

@ -0,0 +1 @@
f46936cff44d8c437b889af941e59476c4bd00d5375ddc305e4b28328b8a93c4

Binary file not shown.

Binary file not shown.

@ -0,0 +1,90 @@
{
"format": 1,
"restore": {
"/home/snep/Documents/Coding/ansifahrplan/ansifahrplan.csproj": {}
},
"projects": {
"/home/snep/Documents/Coding/ansifahrplan/ansifahrplan.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/home/snep/Documents/Coding/ansifahrplan/ansifahrplan.csproj",
"projectName": "ansifahrplan",
"projectPath": "/home/snep/Documents/Coding/ansifahrplan/ansifahrplan.csproj",
"packagesPath": "/home/snep/.nuget/packages/",
"outputPath": "/home/snep/Documents/Coding/ansifahrplan/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/home/snep/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"Microsoft.DotNet.ILCompiler": {
"suppressParent": "All",
"target": "Package",
"version": "[8.0.11, )",
"autoReferenced": true
},
"Microsoft.NET.ILLink.Tasks": {
"suppressParent": "All",
"target": "Package",
"version": "[8.0.11, )",
"autoReferenced": true
},
"dotnet-curses": {
"target": "Package",
"version": "[1.0.3, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"downloadDependencies": [
{
"name": "runtime.linux-x64.Microsoft.DotNet.ILCompiler",
"version": "[8.0.11, 8.0.11]"
}
],
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/8.0.404/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/snep/.nuget/packages/</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/snep/.nuget/packages/</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.11.1</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="/home/snep/.nuget/packages/" />
</ItemGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.net.illink.tasks/8.0.11/build/Microsoft.NET.ILLink.Tasks.props" Condition="Exists('$(NuGetPackageRoot)microsoft.net.illink.tasks/8.0.11/build/Microsoft.NET.ILLink.Tasks.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.dotnet.ilcompiler/8.0.11/build/Microsoft.DotNet.ILCompiler.props" Condition="Exists('$(NuGetPackageRoot)microsoft.dotnet.ilcompiler/8.0.11/build/Microsoft.DotNet.ILCompiler.props')" />
</ImportGroup>
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<PkgNewtonsoft_Json Condition=" '$(PkgNewtonsoft_Json)' == '' ">/home/snep/.nuget/packages/newtonsoft.json/9.0.1</PkgNewtonsoft_Json>
<PkgMicrosoft_NET_ILLink_Tasks Condition=" '$(PkgMicrosoft_NET_ILLink_Tasks)' == '' ">/home/snep/.nuget/packages/microsoft.net.illink.tasks/8.0.11</PkgMicrosoft_NET_ILLink_Tasks>
<PkgMicrosoft_DotNet_ILCompiler Condition=" '$(PkgMicrosoft_DotNet_ILCompiler)' == '' ">/home/snep/.nuget/packages/microsoft.dotnet.ilcompiler/8.0.11</PkgMicrosoft_DotNet_ILCompiler>
</PropertyGroup>
</Project>

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

File diff suppressed because it is too large Load Diff

@ -0,0 +1,54 @@
{
"version": 2,
"dgSpecHash": "Mvy9Z2baCgw=",
"success": true,
"projectFilePath": "/home/snep/Documents/Coding/ansifahrplan/ansifahrplan.csproj",
"expectedPackageFiles": [
"/home/snep/.nuget/packages/dotnet-curses/1.0.3/dotnet-curses.1.0.3.nupkg.sha512",
"/home/snep/.nuget/packages/microsoft.csharp/4.0.1/microsoft.csharp.4.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/microsoft.dotnet.ilcompiler/8.0.11/microsoft.dotnet.ilcompiler.8.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/microsoft.dotnet.platformabstractions/2.1.0/microsoft.dotnet.platformabstractions.2.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/microsoft.extensions.dependencymodel/2.1.0/microsoft.extensions.dependencymodel.2.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/microsoft.net.illink.tasks/8.0.11/microsoft.net.illink.tasks.8.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/microsoft.netcore.platforms/1.0.1/microsoft.netcore.platforms.1.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/microsoft.netcore.targets/1.0.1/microsoft.netcore.targets.1.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/newtonsoft.json/9.0.1/newtonsoft.json.9.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/runtime.native.system/4.0.0/runtime.native.system.4.0.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.appcontext/4.1.0/system.appcontext.4.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.collections/4.0.11/system.collections.4.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/system.diagnostics.debug/4.0.11/system.diagnostics.debug.4.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/system.diagnostics.tools/4.0.1/system.diagnostics.tools.4.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/system.dynamic.runtime/4.0.11/system.dynamic.runtime.4.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/system.globalization/4.0.11/system.globalization.4.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/system.io/4.1.0/system.io.4.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.io.filesystem/4.0.1/system.io.filesystem.4.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/system.io.filesystem.primitives/4.0.1/system.io.filesystem.primitives.4.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/system.linq/4.1.0/system.linq.4.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.linq.expressions/4.1.0/system.linq.expressions.4.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.objectmodel/4.0.12/system.objectmodel.4.0.12.nupkg.sha512",
"/home/snep/.nuget/packages/system.reflection/4.1.0/system.reflection.4.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.reflection.emit/4.0.1/system.reflection.emit.4.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/system.reflection.emit.ilgeneration/4.0.1/system.reflection.emit.ilgeneration.4.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/system.reflection.emit.lightweight/4.0.1/system.reflection.emit.lightweight.4.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/system.reflection.extensions/4.0.1/system.reflection.extensions.4.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/system.reflection.primitives/4.0.1/system.reflection.primitives.4.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/system.reflection.typeextensions/4.1.0/system.reflection.typeextensions.4.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.resources.resourcemanager/4.0.1/system.resources.resourcemanager.4.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/system.runtime/4.1.0/system.runtime.4.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.runtime.extensions/4.1.0/system.runtime.extensions.4.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.runtime.handles/4.0.1/system.runtime.handles.4.0.1.nupkg.sha512",
"/home/snep/.nuget/packages/system.runtime.interopservices/4.1.0/system.runtime.interopservices.4.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.runtime.interopservices.runtimeinformation/4.0.0/system.runtime.interopservices.runtimeinformation.4.0.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.runtime.serialization.primitives/4.1.1/system.runtime.serialization.primitives.4.1.1.nupkg.sha512",
"/home/snep/.nuget/packages/system.text.encoding/4.0.11/system.text.encoding.4.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/system.text.encoding.extensions/4.0.11/system.text.encoding.extensions.4.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/system.text.regularexpressions/4.1.0/system.text.regularexpressions.4.1.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.threading/4.0.11/system.threading.4.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/system.threading.tasks/4.0.11/system.threading.tasks.4.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/system.threading.tasks.extensions/4.0.0/system.threading.tasks.extensions.4.0.0.nupkg.sha512",
"/home/snep/.nuget/packages/system.xml.readerwriter/4.0.11/system.xml.readerwriter.4.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/system.xml.xdocument/4.0.11/system.xml.xdocument.4.0.11.nupkg.sha512",
"/home/snep/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.11/runtime.linux-x64.microsoft.dotnet.ilcompiler.8.0.11.nupkg.sha512"
],
"logs": []
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,527 @@
{
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "https://c3voc.de/schedule/schema.json",
"type": "object",
"additionalProperties": false,
"properties": {
"schedule": {
"$ref": "#/definitions/Schedule"
},
"$schema": {
"type": "string"
},
"generator": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"version": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
}
}
}
},
"required": ["schedule"],
"definitions": {
"Schedule": {
"type": "object",
"additionalProperties": true,
"properties": {
"version": {
"type": "string"
},
"base_url": {
"description": "base for relative media URIs in this document",
"type": "string",
"format": "uri"
},
"conference": {
"$ref": "#/definitions/Conference"
},
"rooms": false
},
"required": ["conference", "version"]
},
"Conference": {
"type": "object",
"title": "Conference",
"required": [
"title",
"acronym",
"days",
"daysCount",
"start",
"end",
"timeslot_duration"
],
"additionalProperties": false,
"properties": {
"acronym": {
"type": "string",
"examples": ["36c3", "rc3", "divoc-ptt"],
"pattern": "^[a-z0-9_-][a-z0-9_]{3,}(-2[0-9]{3}-[a-z]+)?$"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"start": {
"type": "string",
"$oneOf": [
{ "format": "date" },
{ "format": "date-time" }
]
},
"end": {
"type": "string",
"$oneOf": [
{ "format": "date" },
{ "format": "date-time" }
]
},
"daysCount": {
"type": "integer"
},
"timeslot_duration": {
"type": "string"
},
"time_zone_name": {
"type": "string",
"examples": ["Europe/Amsterdam", "Europe/Berlin", "UTC"],
"pattern": "^([A-Z][a-z]+/[A-Z][a-z]+)|UTC$"
},
"logo": {
"type": "string",
"format": "uri",
"$comment": "absolute URL, or relative to base_url"
},
"colors": {
"type": "object",
"additionalProperties": true,
"properties": {
"primary": {
"type": "string",
"format": "color"
},
"background": {
"type": "string",
"format": "color"
}
}
},
"keywords": {
"type": "array",
"items": {
"type": "string"
}
},
"url": {
"description": "URL to the conference schedule or public website",
"type": "string",
"format": "uri"
},
"tracks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string",
"pattern": "^[a-z0-9_-]+[a-z0-9]$"
},
"color": {
"type": "string",
"format": "color"
}
}
}
},
"rooms": {
"type": "array",
"items": {
"$ref": "#/definitions/Room"
}
},
"meta": {
"type": "object",
"additionalProperties": true
},
"days": {
"type": "array",
"items": {
"$ref": "#/definitions/Day"
}
}
}
},
"Day": {
"type": "object",
"additionalProperties": false,
"properties": {
"index": {
"type": "integer"
},
"date": {
"type": "string",
"format": "date"
},
"day_start": {
"type": "string",
"format": "date-time"
},
"day_end": {
"type": "string",
"format": "date-time"
},
"rooms": {
"type": "object",
"patternProperties": {
".*": {
"type": "array",
"items": {
"$ref": "#/definitions/Event"
}
}
}
}
},
"required": ["date", "day_end", "day_start", "index", "rooms"]
},
"Event": {
"type": "object",
"additionalProperties": false,
"properties": {
"guid": {
"type": "string",
"format": "uuid"
},
"code": {
"type": "string",
"pattern": "^[A-Z0-9]+$"
},
"id": {
"type": "integer",
"minimum": 1,
"deprecated": true,
"$comment": "use guid instead"
},
"logo": {
"type": ["string", "null"],
"format": "uri",
"description": "absolute URL, or relative to base_url"
},
"date": {
"type": "string",
"format": "date-time",
"examples": ["2020-12-14T09:00:00+01:00"]
},
"start": {
"type": "string",
"pattern": "^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$",
"examples": ["09:00"]
},
"duration": {
"$ref": "#/definitions/Duration"
},
"room": {
"$ref": "#/definitions/RoomName"
},
"slug": {
"type": "string",
"pattern": "^[a-z0-9_-]+[a-z0-9]$"
},
"url": {
"type": "string",
"format": "uri"
},
"title": {
"type": "string"
},
"subtitle": {
"type": ["string", "null"]
},
"track": {
"type": ["string", "null"]
},
"type": {
"type": "string",
"examples": [
"talk",
"workshop",
"hands-on",
"meeting",
"discussion",
"game",
"other"
]
},
"language": {
"type": "string",
"examples": ["en", "de", "cs", "ab"]
},
"abstract": {
"type": ["string", "null"]
},
"description": {
"type": ["string", "null"]
},
"recording_license": {
"type": "string"
},
"do_not_record": {
"type": ["boolean", "null"]
},
"do_not_stream": {
"type": ["boolean", "string", "null"]
},
"persons": {
"type": "array",
"items": {
"$ref": "#/definitions/Person"
}
},
"links": {
"type": "array",
"items": {
"$ref": "#/definitions/Reference"
}
},
"feedback_url": {
"type": "string",
"format": "uri"
},
"attachments": {
"type": "array",
"items": {
"$ref": "#/definitions/Reference"
}
},
"answers": {
"type": "array",
"items": {},
"$ref": "https://c3voc.de/schedule/submission#/definitions/Answers"
}
},
"required": [
"abstract",
"date",
"duration",
"guid",
"id",
"language",
"links",
"persons",
"room",
"slug",
"start",
"subtitle",
"title",
"track",
"type",
"url"
]
},
"Person": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"guid": {
"type": "string",
"format": "uuid",
"description": "Person UUID generated from email address via uuid5(NS_URL, 'acct:user@domain.tld') or random uuid4() if email not available"
},
"id": {
"type": "integer",
"description": "deprecated integer person id, use guid with uuid5(NS_URL, 'acct:user@domain.tld') instead"
},
"url": {
"type": "string",
"format": "uri"
},
"links": {
"type": "array",
"items": {
"$ref": "#/definitions/Reference"
}
},
"public_name": {
"type": "string",
"deprecated": true,
"$comment": "use name instead"
}
},
"oneOf": [
{ "$ref": "#/definitions/FrabPerson" },
{ "$ref": "#/definitions/PretalxPerson" }
]
},
"FrabPerson": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"public_name": {
"type": "string",
"deprecated": true,
"$comment": "use name instead"
}
},
"required": ["public_name", "id"]
},
"HubAssembly": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string",
"pattern": "^[a-z0-9_-]+[a-z0-9]$"
},
"guid": {
"type": "string",
"format": "uuid"
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": ["name", "guid", "slug"]
},
"PretalxPerson": {
"type": "object",
"properties": {
"code": {
"type": "string",
"pattern": "^[A-Z0-9]+$"
},
"name": {
"type": "string"
},
"avatar": {
"type": ["string", "null"],
"format": "uri",
"description": "absolute URL, or relative to base_url"
},
"biography": {
"type": ["string", "null"]
},
"answers": {
"type": "array",
"items": {}
}
},
"required": ["name"]
},
"Room": {
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string",
"pattern": "^[a-z0-9_-]+[a-z0-9]$"
},
"type": {
"type": "string",
"enum": ["lecturehall", "stage", "workshop", "outside", "online", "project", "bbb", "hangar", "other"]
},
"guid": {
"type": "string",
"format": "uuid"
},
"stream_id": {
"type": ["string", "null"]
},
"description": {
"type": ["string", "null"],
"description": "might also be set as description_de, description_en etc."
},
"capacity": {
"type": ["number", "null"]
},
"url": {
"type": "string",
"format": "uri"
},
"features" :{
"$ref": "#/definitions/RoomFeatures"
},
"assembly": {
"$ref": "#/definitions/HubAssembly"
}
},
"patternProperties": {
"description_.+": {
"type": ["string", "null"]
}
},
"required": ["name", "guid"]
},
"RoomName": {
"type": "string"
},
"RoomFeatures": {
"type": "object",
"additionalProperties": true,
"properties": {
"recording": {
"type": "string",
"enum": ["record_by_default", "not_recorded_by_default", "recording_forbidden", "recording_not_possible", "unknown"]
}
}
},
"Duration": {
"title": "Duration (hh:mm)",
"type": "string",
"examples": ["00:30", "01:30"],
"pattern": "^[0-9]+:[0-9]{2}$"
},
"Reference": {
"title": "Link or Attachment",
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"slides",
"paper",
"web",
"blog",
"article",
"media",
"related",
"activitypub"
]
},
"url": {
"type": "string",
"format": "uri"
},
"title": {
"type": "string"
}
},
"required": [
"url"
]
}
}
}
Loading…
Cancel
Save