Initial commit
[fillmore] / src / marina / marina / util.c
diff --git a/src/marina/marina/util.c b/src/marina/marina/util.c
new file mode 100644 (file)
index 0000000..9a506ac
--- /dev/null
@@ -0,0 +1,1673 @@
+/* util.c generated by valac, the Vala compiler
+ * generated from util.vala, do not modify */
+
+/* Copyright 2009 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later).  See the COPYING file in this distribution. 
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include <float.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gst/gst.h>
+#include <glib/gstdio.h>
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+#include <cairo.h>
+
+#define _g_free0(var) (var = (g_free (var), NULL))
+
+#define TYPE_FRACTION (fraction_get_type ())
+typedef struct _Fraction Fraction;
+
+#define TYPE_TIME_CODE (time_code_get_type ())
+typedef struct _TimeCode TimeCode;
+#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
+#define _g_checksum_free0(var) ((var == NULL) ? NULL : (var = (g_checksum_free (var), NULL)))
+#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+#define _cairo_destroy0(var) ((var == NULL) ? NULL : (var = (cairo_destroy (var), NULL)))
+#define _gst_object_unref0(var) ((var == NULL) ? NULL : (var = (gst_object_unref (var), NULL)))
+
+typedef enum  {
+       MEDIA_ERROR_MISSING_PLUGIN
+} MediaError;
+#define MEDIA_ERROR media_error_quark ()
+struct _Fraction {
+       gint numerator;
+       gint denominator;
+};
+
+struct _TimeCode {
+       gint hour;
+       gint minute;
+       gint second;
+       gint frame;
+       gboolean drop_code;
+};
+
+typedef enum  {
+       GDK_Control_L,
+       GDK_Control_R,
+       GDK_Down,
+       GDK_equal,
+       GDK_Escape,
+       GDK_KP_Add,
+       GDK_KP_Enter,
+       GDK_KP_Subtract,
+       GDK_Left,
+       GDK_minus,
+       GDK_plus,
+       GDK_Return,
+       GDK_Right,
+       GDK_Shift_L,
+       GDK_Shift_R,
+       GDK_underscore,
+       GDK_Up
+} KeySyms;
+
+
+extern gboolean debug_enabled;
+gboolean debug_enabled = FALSE;
+extern GdkModifierType GDK_SHIFT_ALT_CONTROL_MASK;
+GdkModifierType GDK_SHIFT_ALT_CONTROL_MASK = (GDK_SHIFT_MASK | GDK_MOD1_MASK) | GDK_CONTROL_MASK;
+
+GQuark media_error_quark (void);
+float float_abs (float f);
+gboolean float_within (double f, double epsilon);
+gint sign (gint x);
+gint stricmp (const char* str1, const char* str2);
+char** copy_array (char** source, int source_length1, int* result_length1);
+void print_debug (const char* text);
+GType fraction_get_type (void);
+Fraction* fraction_dup (const Fraction* self);
+void fraction_free (Fraction* self);
+void fraction_init (Fraction *self, gint numerator, gint denominator);
+void fraction_init_from_string (Fraction *self, const char* s);
+gboolean fraction_equal (Fraction *self, Fraction* f);
+gint fraction_nearest_int (Fraction *self);
+char* fraction_to_string (Fraction *self);
+GType time_code_get_type (void);
+TimeCode* time_code_dup (const TimeCode* self);
+void time_code_free (TimeCode* self);
+void time_code_get_from_length (TimeCode *self, gint64 length);
+char* time_code_to_string (TimeCode *self);
+gboolean time_in_range (gint64 time, gint64 center, gint64 delta);
+char* isolate_filename (const char* path);
+char* get_file_extension (const char* path);
+char* append_extension (const char* path, const char* extension);
+gboolean version_at_least (const char* v, const char* w);
+gboolean get_file_md5_checksum (const char* filename, char** checksum);
+void save_file_md5_checksum (const char* filename, const char* checksum);
+gboolean md5_checksum_on_file (const char* filename, char** checksum);
+void parse_color (const char* color, GdkColor* result);
+GtkWidget* get_widget (GtkUIManager* manager, const char* name);
+#define LINE_WIDTH 1.0
+#define RADIUS 15.0
+#define ANTIALIAS CAIRO_ANTIALIAS_DEFAULT
+void draw_rounded_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x0, gint y0, gint width, gint height);
+void draw_right_rounded_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x0, gint y0, gint width, gint height);
+void draw_left_rounded_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x0, gint y0, gint width, gint height);
+void draw_square_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x, gint y, gint width, gint height);
+gboolean is_drop_frame_rate (Fraction* r);
+gint64 frame_to_time_with_rate (gint frame, Fraction* rate);
+gint time_to_frame_with_rate (gint64 time, Fraction* rate);
+void frame_to_time (gint frame, Fraction* rate, TimeCode* result);
+char* frame_to_string (gint frame, Fraction* rate);
+void breakup_time (gint64 time, gint* hours, gint* minutes, double* seconds);
+char* time_to_HHMMSS (gint64 time);
+char* time_to_string (gint64 time);
+GstElement* make_element_with_name (const char* element_name, const char* display_name, GError** error);
+GstElement* make_element (const char* name, GError** error);
+static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func);
+static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func);
+static gint _vala_array_length (gpointer array);
+static int _vala_strcmp0 (const char * str1, const char * str2);
+
+const GtkTargetEntry drag_target_entries[1] = {{"text/uri-list", (guint) 0, (guint) 0}};
+
+
+GQuark media_error_quark (void) {
+       return g_quark_from_static_string ("media_error-quark");
+}
+
+
+#line 12 "util.vala"
+float float_abs (float f) {
+#line 141 "util.c"
+       float result = 0.0F;
+#line 13 "util.vala"
+       if (f < 0.0f) {
+#line 145 "util.c"
+               result = -f;
+#line 14 "util.vala"
+               return result;
+#line 149 "util.c"
+       }
+       result = f;
+#line 15 "util.vala"
+       return result;
+#line 154 "util.c"
+}
+
+
+#line 18 "util.vala"
+gboolean float_within (double f, double epsilon) {
+#line 160 "util.c"
+       gboolean result = FALSE;
+       result = float_abs ((float) f) < epsilon;
+#line 19 "util.vala"
+       return result;
+#line 165 "util.c"
+}
+
+
+#line 22 "util.vala"
+gint sign (gint x) {
+#line 171 "util.c"
+       gint result = 0;
+       gint _tmp0_ = 0;
+#line 23 "util.vala"
+       if (x == 0) {
+#line 176 "util.c"
+               result = 0;
+#line 24 "util.vala"
+               return result;
+#line 180 "util.c"
+       }
+#line 25 "util.vala"
+       if (x < 0) {
+#line 25 "util.vala"
+               _tmp0_ = -1;
+#line 186 "util.c"
+       } else {
+#line 25 "util.vala"
+               _tmp0_ = 1;
+#line 190 "util.c"
+       }
+       result = _tmp0_;
+#line 25 "util.vala"
+       return result;
+#line 195 "util.c"
+}
+
+
+#line 28 "util.vala"
+gint stricmp (const char* str1, const char* str2) {
+#line 201 "util.c"
+       gint result = 0;
+       char* temp_str1;
+       char* temp_str2;
+#line 28 "util.vala"
+       g_return_val_if_fail (str1 != NULL, 0);
+#line 28 "util.vala"
+       g_return_val_if_fail (str2 != NULL, 0);
+#line 29 "util.vala"
+       temp_str1 = g_utf8_casefold (str1, (gssize) (-1));
+#line 30 "util.vala"
+       temp_str2 = g_utf8_casefold (str2, (gssize) (-1));
+#line 213 "util.c"
+       result = g_utf8_collate (temp_str1, temp_str2);
+       _g_free0 (temp_str1);
+       _g_free0 (temp_str2);
+#line 32 "util.vala"
+       return result;
+#line 219 "util.c"
+}
+
+
+#line 36 "util.vala"
+char** copy_array (char** source, int source_length1, int* result_length1) {
+#line 225 "util.c"
+       char** result = NULL;
+       char** _tmp0_;
+       gint _destination_size_;
+       gint destination_length1;
+       char** destination;
+       gint i;
+       char** _tmp2_;
+       destination = (_tmp0_ = g_new0 (char*, source_length1 + 1), destination_length1 = source_length1, _destination_size_ = destination_length1, _tmp0_);
+#line 38 "util.vala"
+       i = 0;
+#line 236 "util.c"
+       {
+               char** item_collection;
+               int item_collection_length1;
+               int item_it;
+#line 39 "util.vala"
+               item_collection = source;
+#line 243 "util.c"
+               item_collection_length1 = source_length1;
+               for (item_it = 0; item_it < source_length1; item_it = item_it + 1) {
+                       char* item;
+                       item = g_strdup (item_collection[item_it]);
+                       {
+                               char* _tmp1_;
+#line 40 "util.vala"
+                               destination[i] = (_tmp1_ = g_strdup (item), _g_free0 (destination[i]), _tmp1_);
+#line 41 "util.vala"
+                               i = i + 1;
+#line 254 "util.c"
+                               _g_free0 (item);
+                       }
+               }
+       }
+       result = (_tmp2_ = destination, *result_length1 = destination_length1, _tmp2_);
+#line 43 "util.vala"
+       return result;
+#line 262 "util.c"
+       destination = (_vala_array_free (destination, destination_length1, (GDestroyNotify) g_free), NULL);
+}
+
+
+#line 50 "util.vala"
+void print_debug (const char* text) {
+#line 50 "util.vala"
+       g_return_if_fail (text != NULL);
+#line 51 "util.vala"
+       if (!debug_enabled) {
+#line 52 "util.vala"
+               return;
+#line 275 "util.c"
+       }
+#line 54 "util.vala"
+       g_debug ("util.vala:54: %s", text);
+#line 279 "util.c"
+}
+
+
+#line 61 "util.vala"
+void fraction_init (Fraction *self, gint numerator, gint denominator) {
+#line 285 "util.c"
+       memset (self, 0, sizeof (Fraction));
+#line 62 "util.vala"
+       (*self).numerator = numerator;
+#line 63 "util.vala"
+       (*self).denominator = denominator;
+#line 291 "util.c"
+}
+
+
+#line 66 "util.vala"
+void fraction_init_from_string (Fraction *self, const char* s) {
+#line 297 "util.c"
+       char** _tmp1_;
+       gint _elements_size_;
+       gint elements_length1;
+       char** _tmp0_;
+       char** elements;
+#line 66 "util.vala"
+       g_return_if_fail (s != NULL);
+#line 305 "util.c"
+       memset (self, 0, sizeof (Fraction));
+       elements = (_tmp1_ = _tmp0_ = g_strsplit (s, "/", 0), elements_length1 = _vala_array_length (_tmp0_), _elements_size_ = elements_length1, _tmp1_);
+#line 68 "util.vala"
+       if (elements_length1 != 2) {
+#line 69 "util.vala"
+               (*self).numerator = 0;
+#line 70 "util.vala"
+               (*self).denominator = 0;
+#line 314 "util.c"
+       } else {
+#line 72 "util.vala"
+               (*self).numerator = atoi (elements[0]);
+#line 73 "util.vala"
+               (*self).denominator = atoi (elements[1]);
+#line 320 "util.c"
+       }
+       elements = (_vala_array_free (elements, elements_length1, (GDestroyNotify) g_free), NULL);
+}
+
+
+#line 77 "util.vala"
+gboolean fraction_equal (Fraction *self, Fraction* f) {
+#line 328 "util.c"
+       gboolean result = FALSE;
+#line 78 "util.vala"
+       if (float_abs (((*self).numerator / ((float) (*self).denominator)) - ((*f).numerator / ((float) (*f).denominator))) <= (1000.0f / 1001.0f)) {
+#line 332 "util.c"
+               result = TRUE;
+#line 80 "util.vala"
+               return result;
+#line 336 "util.c"
+       }
+       result = FALSE;
+#line 81 "util.vala"
+       return result;
+#line 341 "util.c"
+}
+
+
+#line 84 "util.vala"
+gint fraction_nearest_int (Fraction *self) {
+#line 347 "util.c"
+       gint result = 0;
+       result = (gint) ((((double) (*self).numerator) / (*self).denominator) + 0.5);
+#line 85 "util.vala"
+       return result;
+#line 352 "util.c"
+}
+
+
+#line 88 "util.vala"
+char* fraction_to_string (Fraction *self) {
+#line 358 "util.c"
+       char* result = NULL;
+       result = g_strdup_printf ("%d/%d", (*self).numerator, (*self).denominator);
+#line 89 "util.vala"
+       return result;
+#line 363 "util.c"
+}
+
+
+Fraction* fraction_dup (const Fraction* self) {
+       Fraction* dup;
+       dup = g_new0 (Fraction, 1);
+       memcpy (dup, self, sizeof (Fraction));
+       return dup;
+}
+
+
+void fraction_free (Fraction* self) {
+       g_free (self);
+}
+
+
+GType fraction_get_type (void) {
+       static volatile gsize fraction_type_id__volatile = 0;
+       if (g_once_init_enter (&fraction_type_id__volatile)) {
+               GType fraction_type_id;
+               fraction_type_id = g_boxed_type_register_static ("Fraction", (GBoxedCopyFunc) fraction_dup, (GBoxedFreeFunc) fraction_free);
+               g_once_init_leave (&fraction_type_id__volatile, fraction_type_id);
+       }
+       return fraction_type_id__volatile;
+}
+
+
+#line 101 "util.vala"
+void time_code_get_from_length (TimeCode *self, gint64 length) {
+#line 102 "util.vala"
+       length = length / ((gint64) GST_SECOND);
+#line 104 "util.vala"
+       (*self).hour = (gint) (length / 3600);
+#line 105 "util.vala"
+       (*self).minute = (gint) ((length % 3600) / 60);
+#line 106 "util.vala"
+       (*self).second = (gint) ((length % 3600) % 60);
+#line 107 "util.vala"
+       (*self).frame = 0;
+#line 403 "util.c"
+}
+
+
+#line 110 "util.vala"
+char* time_code_to_string (TimeCode *self) {
+#line 409 "util.c"
+       char* result = NULL;
+       char* ret;
+       char* _tmp3_;
+       char* _tmp2_;
+       char* _tmp5_;
+       char* _tmp4_;
+       char* _tmp9_;
+       char* _tmp8_;
+#line 111 "util.vala"
+       ret = g_strdup ("");
+#line 112 "util.vala"
+       if ((*self).hour != 0) {
+#line 422 "util.c"
+               char* _tmp1_;
+               char* _tmp0_;
+#line 113 "util.vala"
+               ret = (_tmp1_ = g_strconcat (ret, _tmp0_ = g_strdup_printf ("%.2d:", (*self).hour), NULL), _g_free0 (ret), _tmp1_);
+#line 427 "util.c"
+               _g_free0 (_tmp0_);
+       }
+#line 115 "util.vala"
+       ret = (_tmp3_ = g_strconcat (ret, _tmp2_ = g_strdup_printf ("%.2d:", (*self).minute), NULL), _g_free0 (ret), _tmp3_);
+#line 432 "util.c"
+       _g_free0 (_tmp2_);
+#line 116 "util.vala"
+       ret = (_tmp5_ = g_strconcat (ret, _tmp4_ = g_strdup_printf ("%.2d", (*self).second), NULL), _g_free0 (ret), _tmp5_);
+#line 436 "util.c"
+       _g_free0 (_tmp4_);
+#line 118 "util.vala"
+       if ((*self).drop_code) {
+#line 440 "util.c"
+               char* _tmp6_;
+#line 119 "util.vala"
+               ret = (_tmp6_ = g_strconcat (ret, ";", NULL), _g_free0 (ret), _tmp6_);
+#line 444 "util.c"
+       } else {
+               char* _tmp7_;
+#line 121 "util.vala"
+               ret = (_tmp7_ = g_strconcat (ret, ":", NULL), _g_free0 (ret), _tmp7_);
+#line 449 "util.c"
+       }
+#line 122 "util.vala"
+       ret = (_tmp9_ = g_strconcat (ret, _tmp8_ = g_strdup_printf ("%.2d", (*self).frame), NULL), _g_free0 (ret), _tmp9_);
+#line 453 "util.c"
+       _g_free0 (_tmp8_);
+       result = ret;
+#line 124 "util.vala"
+       return result;
+#line 458 "util.c"
+}
+
+
+TimeCode* time_code_dup (const TimeCode* self) {
+       TimeCode* dup;
+       dup = g_new0 (TimeCode, 1);
+       memcpy (dup, self, sizeof (TimeCode));
+       return dup;
+}
+
+
+void time_code_free (TimeCode* self) {
+       g_free (self);
+}
+
+
+GType time_code_get_type (void) {
+       static volatile gsize time_code_type_id__volatile = 0;
+       if (g_once_init_enter (&time_code_type_id__volatile)) {
+               GType time_code_type_id;
+               time_code_type_id = g_boxed_type_register_static ("TimeCode", (GBoxedCopyFunc) time_code_dup, (GBoxedFreeFunc) time_code_free);
+               g_once_init_leave (&time_code_type_id__volatile, time_code_type_id);
+       }
+       return time_code_type_id__volatile;
+}
+
+
+#line 128 "util.vala"
+gboolean time_in_range (gint64 time, gint64 center, gint64 delta) {
+#line 488 "util.c"
+       gboolean result = FALSE;
+       gint64 diff;
+#line 129 "util.vala"
+       diff = time - center;
+#line 493 "util.c"
+       result = llabs (diff) <= delta;
+#line 130 "util.vala"
+       return result;
+#line 497 "util.c"
+}
+
+
+#line 133 "util.vala"
+char* isolate_filename (const char* path) {
+#line 503 "util.c"
+       char* result = NULL;
+       char* str;
+       gint _tmp1__length1;
+       char** _tmp1_;
+       char** _tmp0_;
+       char* _tmp2_;
+#line 133 "util.vala"
+       g_return_val_if_fail (path != NULL, NULL);
+#line 134 "util.vala"
+       str = g_path_get_basename (path);
+#line 514 "util.c"
+       result = (_tmp2_ = g_strdup ((_tmp1_ = _tmp0_ = g_strsplit (str, ".", 0), _tmp1__length1 = _vala_array_length (_tmp0_), _tmp1_)[0]), _tmp1_ = (_vala_array_free (_tmp1_, _tmp1__length1, (GDestroyNotify) g_free), NULL), _tmp2_);
+       _g_free0 (str);
+#line 135 "util.vala"
+       return result;
+#line 519 "util.c"
+       _g_free0 (str);
+}
+
+
+#line 138 "util.vala"
+char* get_file_extension (const char* path) {
+#line 526 "util.c"
+       char* result = NULL;
+       const char* dot;
+       const char* _tmp0_;
+#line 138 "util.vala"
+       g_return_val_if_fail (path != NULL, NULL);
+#line 139 "util.vala"
+       dot = g_utf8_strrchr (path, (gssize) (-1), (gunichar) '.');
+#line 534 "util.c"
+       _tmp0_ = NULL;
+#line 140 "util.vala"
+       if (dot == NULL) {
+#line 140 "util.vala"
+               _tmp0_ = "";
+#line 540 "util.c"
+       } else {
+#line 140 "util.vala"
+               _tmp0_ = g_utf8_next_char (dot);
+#line 544 "util.c"
+       }
+       result = g_strdup (_tmp0_);
+#line 140 "util.vala"
+       return result;
+#line 549 "util.c"
+}
+
+
+#line 143 "util.vala"
+char* append_extension (const char* path, const char* extension) {
+#line 555 "util.c"
+       char* result = NULL;
+       char* _tmp0_;
+       gboolean _tmp1_;
+       char* _tmp2_;
+       char* _tmp3_;
+#line 143 "util.vala"
+       g_return_val_if_fail (path != NULL, NULL);
+#line 143 "util.vala"
+       g_return_val_if_fail (extension != NULL, NULL);
+#line 144 "util.vala"
+       if ((_tmp1_ = _vala_strcmp0 (_tmp0_ = get_file_extension (path), extension) == 0, _g_free0 (_tmp0_), _tmp1_)) {
+#line 567 "util.c"
+               result = g_strdup (path);
+#line 145 "util.vala"
+               return result;
+#line 571 "util.c"
+       }
+       result = (_tmp3_ = g_strconcat (_tmp2_ = g_strconcat (path, ".", NULL), extension, NULL), _g_free0 (_tmp2_), _tmp3_);
+#line 147 "util.vala"
+       return result;
+#line 576 "util.c"
+}
+
+
+#line 152 "util.vala"
+gboolean version_at_least (const char* v, const char* w) {
+#line 582 "util.c"
+       gboolean result = FALSE;
+       char** _tmp1_;
+       gint _va_size_;
+       gint va_length1;
+       char** _tmp0_;
+       char** va;
+       char** _tmp3_;
+       gint _wa_size_;
+       gint wa_length1;
+       char** _tmp2_;
+       char** wa;
+#line 152 "util.vala"
+       g_return_val_if_fail (v != NULL, FALSE);
+#line 152 "util.vala"
+       g_return_val_if_fail (w != NULL, FALSE);
+#line 598 "util.c"
+       va = (_tmp1_ = _tmp0_ = g_strsplit (v, ".", 0), va_length1 = _vala_array_length (_tmp0_), _va_size_ = va_length1, _tmp1_);
+       wa = (_tmp3_ = _tmp2_ = g_strsplit (w, ".", 0), wa_length1 = _vala_array_length (_tmp2_), _wa_size_ = wa_length1, _tmp3_);
+       {
+               gint i;
+#line 155 "util.vala"
+               i = 0;
+#line 605 "util.c"
+               {
+                       gboolean _tmp4_;
+#line 155 "util.vala"
+                       _tmp4_ = TRUE;
+#line 155 "util.vala"
+                       while (TRUE) {
+#line 612 "util.c"
+                               gint vi;
+                               gint wi;
+#line 155 "util.vala"
+                               if (!_tmp4_) {
+#line 155 "util.vala"
+                                       i = i + 1;
+#line 619 "util.c"
+                               }
+#line 155 "util.vala"
+                               _tmp4_ = FALSE;
+#line 155 "util.vala"
+                               if (!(i < wa_length1)) {
+#line 155 "util.vala"
+                                       break;
+#line 627 "util.c"
+                               }
+#line 156 "util.vala"
+                               if (i >= va_length1) {
+#line 631 "util.c"
+                                       result = FALSE;
+                                       va = (_vala_array_free (va, va_length1, (GDestroyNotify) g_free), NULL);
+                                       wa = (_vala_array_free (wa, wa_length1, (GDestroyNotify) g_free), NULL);
+#line 157 "util.vala"
+                                       return result;
+#line 637 "util.c"
+                               }
+#line 158 "util.vala"
+                               vi = atoi (va[i]);
+#line 159 "util.vala"
+                               wi = atoi (wa[i]);
+#line 160 "util.vala"
+                               if (vi > wi) {
+#line 645 "util.c"
+                                       result = TRUE;
+                                       va = (_vala_array_free (va, va_length1, (GDestroyNotify) g_free), NULL);
+                                       wa = (_vala_array_free (wa, wa_length1, (GDestroyNotify) g_free), NULL);
+#line 161 "util.vala"
+                                       return result;
+#line 651 "util.c"
+                               }
+#line 162 "util.vala"
+                               if (wi > vi) {
+#line 655 "util.c"
+                                       result = FALSE;
+                                       va = (_vala_array_free (va, va_length1, (GDestroyNotify) g_free), NULL);
+                                       wa = (_vala_array_free (wa, wa_length1, (GDestroyNotify) g_free), NULL);
+#line 163 "util.vala"
+                                       return result;
+#line 661 "util.c"
+                               }
+                       }
+               }
+       }
+       result = TRUE;
+       va = (_vala_array_free (va, va_length1, (GDestroyNotify) g_free), NULL);
+       wa = (_vala_array_free (wa, wa_length1, (GDestroyNotify) g_free), NULL);
+#line 165 "util.vala"
+       return result;
+#line 671 "util.c"
+}
+
+
+#line 168 "util.vala"
+gboolean get_file_md5_checksum (const char* filename, char** checksum) {
+#line 677 "util.c"
+       gboolean result = FALSE;
+       GError * _inner_error_;
+       char* new_filename;
+       gsize buffer_length = 0UL;
+#line 168 "util.vala"
+       g_return_val_if_fail (filename != NULL, FALSE);
+#line 684 "util.c"
+       if (checksum != NULL) {
+               *checksum = NULL;
+       }
+       _inner_error_ = NULL;
+#line 169 "util.vala"
+       new_filename = append_extension (filename, "md5");
+#line 691 "util.c"
+       {
+               char* _tmp1_;
+               char* _tmp0_ = NULL;
+#line 173 "util.vala"
+               g_file_get_contents (new_filename, &_tmp0_, &buffer_length, &_inner_error_);
+#line 173 "util.vala"
+               *checksum = (_tmp1_ = _tmp0_, _g_free0 (*checksum), _tmp1_);
+#line 699 "util.c"
+               if (_inner_error_ != NULL) {
+                       if (_inner_error_->domain == G_FILE_ERROR) {
+                               goto __catch17_g_file_error;
+                       }
+                       _g_free0 (new_filename);
+                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
+                       g_clear_error (&_inner_error_);
+                       return FALSE;
+               }
+       }
+       goto __finally17;
+       __catch17_g_file_error:
+       {
+               GError * e;
+               e = _inner_error_;
+               _inner_error_ = NULL;
+               {
+                       result = FALSE;
+                       _g_error_free0 (e);
+                       _g_free0 (new_filename);
+#line 175 "util.vala"
+                       return result;
+#line 722 "util.c"
+               }
+       }
+       __finally17:
+       if (_inner_error_ != NULL) {
+               _g_free0 (new_filename);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
+               g_clear_error (&_inner_error_);
+               return FALSE;
+       }
+       result = buffer_length == 32;
+       _g_free0 (new_filename);
+#line 178 "util.vala"
+       return result;
+#line 736 "util.c"
+}
+
+
+#line 181 "util.vala"
+void save_file_md5_checksum (const char* filename, const char* checksum) {
+#line 742 "util.c"
+       GError * _inner_error_;
+       char* new_filename;
+#line 181 "util.vala"
+       g_return_if_fail (filename != NULL);
+#line 181 "util.vala"
+       g_return_if_fail (checksum != NULL);
+#line 749 "util.c"
+       _inner_error_ = NULL;
+#line 182 "util.vala"
+       new_filename = append_extension (filename, "md5");
+#line 753 "util.c"
+       {
+#line 185 "util.vala"
+               g_file_set_contents (new_filename, checksum, -1, &_inner_error_);
+#line 757 "util.c"
+               if (_inner_error_ != NULL) {
+                       if (_inner_error_->domain == G_FILE_ERROR) {
+                               goto __catch18_g_file_error;
+                       }
+                       _g_free0 (new_filename);
+                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
+                       g_clear_error (&_inner_error_);
+                       return;
+               }
+       }
+       goto __finally18;
+       __catch18_g_file_error:
+       {
+               GError * e;
+               e = _inner_error_;
+               _inner_error_ = NULL;
+               {
+#line 187 "util.vala"
+                       g_error ("util.vala:187: Cannot save md5 file %s!\n", new_filename);
+#line 777 "util.c"
+                       _g_error_free0 (e);
+               }
+       }
+       __finally18:
+       if (_inner_error_ != NULL) {
+               _g_free0 (new_filename);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
+               g_clear_error (&_inner_error_);
+               return;
+       }
+       _g_free0 (new_filename);
+}
+
+
+#line 191 "util.vala"
+gboolean md5_checksum_on_file (const char* filename, char** checksum) {
+#line 794 "util.c"
+       gboolean result = FALSE;
+       GError * _inner_error_;
+       char* file_buffer;
+       gsize len = 0UL;
+       GChecksum* c;
+       char* _tmp2_;
+#line 191 "util.vala"
+       g_return_val_if_fail (filename != NULL, FALSE);
+#line 803 "util.c"
+       if (checksum != NULL) {
+               *checksum = NULL;
+       }
+       _inner_error_ = NULL;
+       file_buffer = NULL;
+       {
+               char* _tmp1_;
+               char* _tmp0_ = NULL;
+#line 196 "util.vala"
+               g_file_get_contents (filename, &_tmp0_, &len, &_inner_error_);
+#line 196 "util.vala"
+               file_buffer = (_tmp1_ = _tmp0_, _g_free0 (file_buffer), _tmp1_);
+#line 816 "util.c"
+               if (_inner_error_ != NULL) {
+                       if (_inner_error_->domain == G_FILE_ERROR) {
+                               goto __catch19_g_file_error;
+                       }
+                       _g_free0 (file_buffer);
+                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
+                       g_clear_error (&_inner_error_);
+                       return FALSE;
+               }
+       }
+       goto __finally19;
+       __catch19_g_file_error:
+       {
+               GError * e;
+               e = _inner_error_;
+               _inner_error_ = NULL;
+               {
+                       result = FALSE;
+                       _g_error_free0 (e);
+                       _g_free0 (file_buffer);
+#line 198 "util.vala"
+                       return result;
+#line 839 "util.c"
+               }
+       }
+       __finally19:
+       if (_inner_error_ != NULL) {
+               _g_free0 (file_buffer);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
+               g_clear_error (&_inner_error_);
+               return FALSE;
+       }
+#line 201 "util.vala"
+       c = g_checksum_new (G_CHECKSUM_MD5);
+#line 202 "util.vala"
+       g_checksum_update (c, (guchar*) file_buffer, len);
+#line 203 "util.vala"
+       *checksum = (_tmp2_ = g_strdup (g_checksum_get_string (c)), _g_free0 (*checksum), _tmp2_);
+#line 855 "util.c"
+       result = TRUE;
+       _g_free0 (file_buffer);
+       _g_checksum_free0 (c);
+#line 204 "util.vala"
+       return result;
+#line 861 "util.c"
+}
+
+
+#line 239 "util.vala"
+void parse_color (const char* color, GdkColor* result) {
+#line 867 "util.c"
+       GdkColor c = {0};
+#line 239 "util.vala"
+       g_return_if_fail (color != NULL);
+#line 241 "util.vala"
+       if (!gdk_color_parse (color, &c)) {
+#line 242 "util.vala"
+               g_error ("util.vala:242: can't parse color");
+#line 875 "util.c"
+       }
+       *result = c;
+#line 243 "util.vala"
+       return;
+#line 880 "util.c"
+}
+
+
+static gpointer _g_object_ref0 (gpointer self) {
+       return self ? g_object_ref (self) : NULL;
+}
+
+
+#line 246 "util.vala"
+GtkWidget* get_widget (GtkUIManager* manager, const char* name) {
+#line 891 "util.c"
+       GtkWidget* result = NULL;
+       GtkWidget* widget;
+#line 246 "util.vala"
+       g_return_val_if_fail (GTK_IS_UI_MANAGER (manager), NULL);
+#line 246 "util.vala"
+       g_return_val_if_fail (name != NULL, NULL);
+#line 247 "util.vala"
+       widget = _g_object_ref0 (gtk_ui_manager_get_widget (manager, name));
+#line 248 "util.vala"
+       if (widget == NULL) {
+#line 249 "util.vala"
+               g_error ("util.vala:249: can't find widget");
+#line 904 "util.c"
+       }
+       result = widget;
+#line 250 "util.vala"
+       return result;
+#line 909 "util.c"
+}
+
+
+#line 262 "util.vala"
+void draw_rounded_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x0, gint y0, gint width, gint height) {
+#line 915 "util.c"
+       gboolean _tmp0_ = FALSE;
+       double x1;
+       double y1;
+       cairo_t* cairo_window;
+#line 262 "util.vala"
+       g_return_if_fail (GDK_IS_WINDOW (window));
+#line 264 "util.vala"
+       if (width == 0) {
+#line 264 "util.vala"
+               _tmp0_ = TRUE;
+#line 926 "util.c"
+       } else {
+#line 264 "util.vala"
+               _tmp0_ = height == 0;
+#line 930 "util.c"
+       }
+#line 264 "util.vala"
+       if (_tmp0_) {
+#line 265 "util.vala"
+               return;
+#line 936 "util.c"
+       }
+#line 267 "util.vala"
+       x1 = (double) (x0 + width);
+#line 268 "util.vala"
+       y1 = (double) (y0 + height);
+#line 270 "util.vala"
+       cairo_window = gdk_cairo_create (GDK_DRAWABLE (window));
+#line 271 "util.vala"
+       gdk_cairo_set_source_color (cairo_window, color);
+#line 272 "util.vala"
+       cairo_set_antialias (cairo_window, ANTIALIAS);
+#line 274 "util.vala"
+       if ((width / 2) < RADIUS) {
+#line 275 "util.vala"
+               if ((height / 2) < RADIUS) {
+#line 276 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, (y0 + y1) / 2);
+#line 277 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, (double) y0, (double) x0, (double) y0, (x0 + x1) / 2, (double) y0);
+#line 278 "util.vala"
+                       cairo_curve_to (cairo_window, x1, (double) y0, x1, (double) y0, x1, (y0 + y1) / 2);
+#line 279 "util.vala"
+                       cairo_curve_to (cairo_window, x1, y1, x1, y1, (x1 + x0) / 2, y1);
+#line 280 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, y1, (double) x0, y1, (double) x0, (y0 + y1) / 2);
+#line 962 "util.c"
+               } else {
+#line 282 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, y0 + RADIUS);
+#line 283 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, (double) y0, (double) x0, (double) y0, (x0 + x1) / 2, (double) y0);
+#line 284 "util.vala"
+                       cairo_curve_to (cairo_window, x1, (double) y0, x1, (double) y0, x1, y0 + RADIUS);
+#line 285 "util.vala"
+                       cairo_line_to (cairo_window, x1, y1 - RADIUS);
+#line 286 "util.vala"
+                       cairo_curve_to (cairo_window, x1, y1, x1, y1, (x1 + x0) / 2, y1);
+#line 287 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, y1, (double) x0, y1, (double) x0, y1 - RADIUS);
+#line 976 "util.c"
+               }
+       } else {
+#line 290 "util.vala"
+               if ((height / 2) < RADIUS) {
+#line 291 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, (y0 + y1) / 2);
+#line 292 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, (double) y0, (double) x0, (double) y0, x0 + RADIUS, (double) y0);
+#line 293 "util.vala"
+                       cairo_line_to (cairo_window, x1 - RADIUS, (double) y0);
+#line 294 "util.vala"
+                       cairo_curve_to (cairo_window, x1, (double) y0, x1, (double) y0, x1, (y0 + y1) / 2);
+#line 295 "util.vala"
+                       cairo_curve_to (cairo_window, x1, y1, x1, y1, x1 - RADIUS, y1);
+#line 296 "util.vala"
+                       cairo_line_to (cairo_window, x0 + RADIUS, y1);
+#line 297 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, y1, (double) x0, y1, (double) x0, (y0 + y1) / 2);
+#line 995 "util.c"
+               } else {
+#line 299 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, y0 + RADIUS);
+#line 300 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, (double) y0, (double) x0, (double) y0, x0 + RADIUS, (double) y0);
+#line 301 "util.vala"
+                       cairo_line_to (cairo_window, x1 - RADIUS, (double) y0);
+#line 302 "util.vala"
+                       cairo_curve_to (cairo_window, x1, (double) y0, x1, (double) y0, x1, y0 + RADIUS);
+#line 303 "util.vala"
+                       cairo_line_to (cairo_window, x1, y1 - RADIUS);
+#line 304 "util.vala"
+                       cairo_curve_to (cairo_window, x1, y1, x1, y1, x1 - RADIUS, y1);
+#line 305 "util.vala"
+                       cairo_line_to (cairo_window, x0 + RADIUS, y1);
+#line 306 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, y1, (double) x0, y1, (double) x0, y1 - RADIUS);
+#line 1013 "util.c"
+               }
+       }
+#line 309 "util.vala"
+       cairo_close_path (cairo_window);
+#line 311 "util.vala"
+       if (filled) {
+#line 312 "util.vala"
+               cairo_fill (cairo_window);
+#line 1022 "util.c"
+       } else {
+#line 314 "util.vala"
+               cairo_set_line_width (cairo_window, LINE_WIDTH);
+#line 315 "util.vala"
+               cairo_stroke (cairo_window);
+#line 1028 "util.c"
+       }
+       _cairo_destroy0 (cairo_window);
+}
+
+
+#line 319 "util.vala"
+void draw_right_rounded_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x0, gint y0, gint width, gint height) {
+#line 1036 "util.c"
+       gboolean _tmp0_ = FALSE;
+       double x1;
+       double y1;
+       cairo_t* cairo_window;
+#line 319 "util.vala"
+       g_return_if_fail (GDK_IS_WINDOW (window));
+#line 321 "util.vala"
+       if (width == 0) {
+#line 321 "util.vala"
+               _tmp0_ = TRUE;
+#line 1047 "util.c"
+       } else {
+#line 321 "util.vala"
+               _tmp0_ = height == 0;
+#line 1051 "util.c"
+       }
+#line 321 "util.vala"
+       if (_tmp0_) {
+#line 322 "util.vala"
+               return;
+#line 1057 "util.c"
+       }
+#line 324 "util.vala"
+       x1 = (double) (x0 + width);
+#line 325 "util.vala"
+       y1 = (double) (y0 + height);
+#line 327 "util.vala"
+       cairo_window = gdk_cairo_create (GDK_DRAWABLE (window));
+#line 328 "util.vala"
+       gdk_cairo_set_source_color (cairo_window, color);
+#line 329 "util.vala"
+       cairo_set_antialias (cairo_window, ANTIALIAS);
+#line 331 "util.vala"
+       if ((width / 2) < RADIUS) {
+#line 332 "util.vala"
+               if ((height / 2) < RADIUS) {
+#line 333 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, (double) y0);
+#line 334 "util.vala"
+                       cairo_line_to (cairo_window, (x0 + x1) / 2, (double) y0);
+#line 335 "util.vala"
+                       cairo_curve_to (cairo_window, x1, (double) y0, x1, (double) y0, x1, (y0 + y1) / 2);
+#line 336 "util.vala"
+                       cairo_curve_to (cairo_window, x1, y1, x1, y1, (x1 + x0) / 2, y1);
+#line 337 "util.vala"
+                       cairo_line_to (cairo_window, (double) x0, y1);
+#line 338 "util.vala"
+                       cairo_line_to (cairo_window, (double) x0, (double) y0);
+#line 1085 "util.c"
+               } else {
+#line 340 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, (double) y0);
+#line 341 "util.vala"
+                       cairo_line_to (cairo_window, (x0 + x1) / 2, (double) y0);
+#line 342 "util.vala"
+                       cairo_curve_to (cairo_window, x1, (double) y0, x1, (double) y0, x1, y0 + RADIUS);
+#line 343 "util.vala"
+                       cairo_line_to (cairo_window, x1, y1 - RADIUS);
+#line 344 "util.vala"
+                       cairo_curve_to (cairo_window, x1, y1, x1, y1, (x1 + x0) / 2, y1);
+#line 345 "util.vala"
+                       cairo_line_to (cairo_window, (double) x0, y1);
+#line 346 "util.vala"
+                       cairo_line_to (cairo_window, (double) x0, (double) y0);
+#line 1101 "util.c"
+               }
+       } else {
+#line 349 "util.vala"
+               if ((height / 2) < RADIUS) {
+#line 350 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, (double) y0);
+#line 351 "util.vala"
+                       cairo_line_to (cairo_window, x1 - RADIUS, (double) y0);
+#line 352 "util.vala"
+                       cairo_curve_to (cairo_window, x1, (double) y0, x1, (double) y0, x1, (y0 + y1) / 2);
+#line 353 "util.vala"
+                       cairo_curve_to (cairo_window, x1, y1, x1, y1, x1 - RADIUS, y1);
+#line 354 "util.vala"
+                       cairo_line_to (cairo_window, (double) x0, y1);
+#line 355 "util.vala"
+                       cairo_line_to (cairo_window, (double) x0, (double) y0);
+#line 1118 "util.c"
+               } else {
+#line 357 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, (double) y0);
+#line 358 "util.vala"
+                       cairo_line_to (cairo_window, x1 - RADIUS, (double) y0);
+#line 359 "util.vala"
+                       cairo_curve_to (cairo_window, x1, (double) y0, x1, (double) y0, x1, y0 + RADIUS);
+#line 360 "util.vala"
+                       cairo_line_to (cairo_window, x1, y1 - RADIUS);
+#line 361 "util.vala"
+                       cairo_curve_to (cairo_window, x1, y1, x1, y1, x1 - RADIUS, y1);
+#line 362 "util.vala"
+                       cairo_line_to (cairo_window, (double) x0, y1);
+#line 363 "util.vala"
+                       cairo_line_to (cairo_window, (double) x0, (double) y0);
+#line 1134 "util.c"
+               }
+       }
+#line 366 "util.vala"
+       cairo_close_path (cairo_window);
+#line 368 "util.vala"
+       if (filled) {
+#line 369 "util.vala"
+               cairo_fill (cairo_window);
+#line 1143 "util.c"
+       } else {
+#line 371 "util.vala"
+               cairo_set_line_width (cairo_window, LINE_WIDTH);
+#line 372 "util.vala"
+               cairo_stroke (cairo_window);
+#line 1149 "util.c"
+       }
+       _cairo_destroy0 (cairo_window);
+}
+
+
+#line 376 "util.vala"
+void draw_left_rounded_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x0, gint y0, gint width, gint height) {
+#line 1157 "util.c"
+       gboolean _tmp0_ = FALSE;
+       double x1;
+       double y1;
+       cairo_t* cairo_window;
+#line 376 "util.vala"
+       g_return_if_fail (GDK_IS_WINDOW (window));
+#line 378 "util.vala"
+       if (width == 0) {
+#line 378 "util.vala"
+               _tmp0_ = TRUE;
+#line 1168 "util.c"
+       } else {
+#line 378 "util.vala"
+               _tmp0_ = height == 0;
+#line 1172 "util.c"
+       }
+#line 378 "util.vala"
+       if (_tmp0_) {
+#line 379 "util.vala"
+               return;
+#line 1178 "util.c"
+       }
+#line 381 "util.vala"
+       x1 = (double) (x0 + width);
+#line 382 "util.vala"
+       y1 = (double) (y0 + height);
+#line 384 "util.vala"
+       cairo_window = gdk_cairo_create (GDK_DRAWABLE (window));
+#line 385 "util.vala"
+       gdk_cairo_set_source_color (cairo_window, color);
+#line 386 "util.vala"
+       cairo_set_antialias (cairo_window, ANTIALIAS);
+#line 388 "util.vala"
+       if ((width / 2) < RADIUS) {
+#line 389 "util.vala"
+               if ((height / 2) < RADIUS) {
+#line 390 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, (y0 + y1) / 2);
+#line 391 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, (double) y0, (double) x0, (double) y0, (x0 + x1) / 2, (double) y0);
+#line 392 "util.vala"
+                       cairo_line_to (cairo_window, x1, (double) y0);
+#line 393 "util.vala"
+                       cairo_line_to (cairo_window, x1, y1);
+#line 394 "util.vala"
+                       cairo_line_to (cairo_window, (x1 + x0) / 2, y1);
+#line 395 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, y1, (double) x0, y1, (double) x0, (y0 + y1) / 2);
+#line 1206 "util.c"
+               } else {
+#line 397 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, y0 + RADIUS);
+#line 398 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, (double) y0, (double) x0, (double) y0, (x0 + x1) / 2, (double) y0);
+#line 399 "util.vala"
+                       cairo_line_to (cairo_window, x1, (double) y0);
+#line 400 "util.vala"
+                       cairo_line_to (cairo_window, x1, y1);
+#line 401 "util.vala"
+                       cairo_line_to (cairo_window, (x1 + x0) / 2, y1);
+#line 402 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, y1, (double) x0, y1, (double) x0, y1 - RADIUS);
+#line 1220 "util.c"
+               }
+       } else {
+#line 405 "util.vala"
+               if ((height / 2) < RADIUS) {
+#line 406 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, (y0 + y1) / 2);
+#line 407 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, (double) y0, (double) x0, (double) y0, x0 + RADIUS, (double) y0);
+#line 408 "util.vala"
+                       cairo_line_to (cairo_window, x1, (double) y0);
+#line 409 "util.vala"
+                       cairo_line_to (cairo_window, x1, y1);
+#line 410 "util.vala"
+                       cairo_line_to (cairo_window, x0 + RADIUS, y1);
+#line 411 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, y1, (double) x0, y1, (double) x0, (y0 + y1) / 2);
+#line 1237 "util.c"
+               } else {
+#line 413 "util.vala"
+                       cairo_move_to (cairo_window, (double) x0, y0 + RADIUS);
+#line 414 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, (double) y0, (double) x0, (double) y0, x0 + RADIUS, (double) y0);
+#line 415 "util.vala"
+                       cairo_line_to (cairo_window, x1, (double) y0);
+#line 416 "util.vala"
+                       cairo_line_to (cairo_window, x1, y1);
+#line 417 "util.vala"
+                       cairo_line_to (cairo_window, x0 + RADIUS, y1);
+#line 418 "util.vala"
+                       cairo_curve_to (cairo_window, (double) x0, y1, (double) x0, y1, (double) x0, y1 - RADIUS);
+#line 1251 "util.c"
+               }
+       }
+#line 421 "util.vala"
+       cairo_close_path (cairo_window);
+#line 423 "util.vala"
+       if (filled) {
+#line 424 "util.vala"
+               cairo_fill (cairo_window);
+#line 1260 "util.c"
+       } else {
+#line 426 "util.vala"
+               cairo_set_line_width (cairo_window, LINE_WIDTH);
+#line 427 "util.vala"
+               cairo_stroke (cairo_window);
+#line 1266 "util.c"
+       }
+       _cairo_destroy0 (cairo_window);
+}
+
+
+#line 431 "util.vala"
+void draw_square_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x, gint y, gint width, gint height) {
+#line 1274 "util.c"
+       gboolean _tmp0_ = FALSE;
+       cairo_t* cairo_window;
+#line 431 "util.vala"
+       g_return_if_fail (GDK_IS_WINDOW (window));
+#line 433 "util.vala"
+       if (width == 0) {
+#line 433 "util.vala"
+               _tmp0_ = TRUE;
+#line 1283 "util.c"
+       } else {
+#line 433 "util.vala"
+               _tmp0_ = height == 0;
+#line 1287 "util.c"
+       }
+#line 433 "util.vala"
+       if (_tmp0_) {
+#line 434 "util.vala"
+               return;
+#line 1293 "util.c"
+       }
+#line 436 "util.vala"
+       cairo_window = gdk_cairo_create (GDK_DRAWABLE (window));
+#line 437 "util.vala"
+       gdk_cairo_set_source_color (cairo_window, color);
+#line 438 "util.vala"
+       cairo_set_antialias (cairo_window, ANTIALIAS);
+#line 440 "util.vala"
+       cairo_rectangle (cairo_window, (double) x, (double) y, (double) width, (double) height);
+#line 442 "util.vala"
+       if (filled) {
+#line 443 "util.vala"
+               cairo_fill (cairo_window);
+#line 1307 "util.c"
+       } else {
+#line 445 "util.vala"
+               cairo_set_line_width (cairo_window, LINE_WIDTH);
+#line 446 "util.vala"
+               cairo_stroke (cairo_window);
+#line 1313 "util.c"
+       }
+       _cairo_destroy0 (cairo_window);
+}
+
+
+#line 452 "util.vala"
+gboolean is_drop_frame_rate (Fraction* r) {
+#line 1321 "util.c"
+       gboolean result = FALSE;
+       gboolean _tmp0_ = FALSE;
+       gboolean _tmp1_ = FALSE;
+#line 453 "util.vala"
+       if ((*r).numerator == 2997) {
+#line 453 "util.vala"
+               _tmp1_ = (*r).denominator == 100;
+#line 1329 "util.c"
+       } else {
+#line 453 "util.vala"
+               _tmp1_ = FALSE;
+#line 1333 "util.c"
+       }
+#line 453 "util.vala"
+       if (_tmp1_) {
+#line 453 "util.vala"
+               _tmp0_ = TRUE;
+#line 1339 "util.c"
+       } else {
+               gboolean _tmp2_ = FALSE;
+#line 454 "util.vala"
+               if ((*r).numerator == 30000) {
+#line 454 "util.vala"
+                       _tmp2_ = (*r).denominator == 1001;
+#line 1346 "util.c"
+               } else {
+#line 454 "util.vala"
+                       _tmp2_ = FALSE;
+#line 1350 "util.c"
+               }
+#line 454 "util.vala"
+               _tmp0_ = _tmp2_;
+#line 1354 "util.c"
+       }
+       result = _tmp0_;
+#line 453 "util.vala"
+       return result;
+#line 1359 "util.c"
+}
+
+
+#line 457 "util.vala"
+gint64 frame_to_time_with_rate (gint frame, Fraction* rate) {
+#line 1365 "util.c"
+       gint64 result = 0LL;
+       gint64 time;
+#line 458 "util.vala"
+       time = (gint64) gst_util_uint64_scale ((guint64) frame, (guint64) (GST_SECOND * (*rate).denominator), (guint64) (*rate).numerator);
+#line 1370 "util.c"
+       result = time;
+#line 459 "util.vala"
+       return result;
+#line 1374 "util.c"
+}
+
+
+#line 462 "util.vala"
+gint time_to_frame_with_rate (gint64 time, Fraction* rate) {
+#line 1380 "util.c"
+       gint result = 0;
+       gint frame;
+       gint _tmp0_ = 0;
+#line 463 "util.vala"
+       frame = (gint) gst_util_uint64_scale ((guint64) time, (guint64) (*rate).numerator, (guint64) (GST_SECOND * (*rate).denominator));
+#line 469 "util.vala"
+       if (time >= frame_to_time_with_rate (frame + 1, rate)) {
+#line 469 "util.vala"
+               _tmp0_ = frame + 1;
+#line 1390 "util.c"
+       } else {
+#line 469 "util.vala"
+               _tmp0_ = frame;
+#line 1394 "util.c"
+       }
+       result = _tmp0_;
+#line 469 "util.vala"
+       return result;
+#line 1399 "util.c"
+}
+
+
+#line 472 "util.vala"
+void frame_to_time (gint frame, Fraction* rate, TimeCode* result) {
+#line 1405 "util.c"
+       gint frame_rate;
+       TimeCode _tmp0_ = {0};
+       TimeCode t;
+       gint64 secs;
+#line 473 "util.vala"
+       frame_rate = 0;
+#line 475 "util.vala"
+       t = (_tmp0_);
+#line 477 "util.vala"
+       t.drop_code = FALSE;
+#line 478 "util.vala"
+       if ((*rate).denominator == 1) {
+#line 479 "util.vala"
+               frame_rate = (*rate).numerator;
+#line 1420 "util.c"
+       } else {
+#line 480 "util.vala"
+               if (is_drop_frame_rate (rate)) {
+#line 1424 "util.c"
+                       gint FRAMES_PER_MINUTE;
+                       gint FRAMES_PER_10_MINUTES;
+                       gint block;
+                       gint minute_in_block;
+                       gint minutes;
+#line 481 "util.vala"
+                       t.drop_code = TRUE;
+#line 482 "util.vala"
+                       frame_rate = 30;
+#line 485 "util.vala"
+                       FRAMES_PER_MINUTE = (30 * 60) - 2;
+#line 486 "util.vala"
+                       FRAMES_PER_10_MINUTES = (10 * FRAMES_PER_MINUTE) + 2;
+#line 488 "util.vala"
+                       block = frame / FRAMES_PER_10_MINUTES;
+#line 489 "util.vala"
+                       minute_in_block = ((frame % FRAMES_PER_10_MINUTES) - 2) / FRAMES_PER_MINUTE;
+#line 490 "util.vala"
+                       minutes = (10 * block) + minute_in_block;
+#line 491 "util.vala"
+                       frame = frame + ((2 * minutes) - (2 * block));
+#line 1446 "util.c"
+               } else {
+#line 495 "util.vala"
+                       frame_rate = (*rate).numerator / (*rate).denominator;
+#line 1450 "util.c"
+               }
+       }
+#line 498 "util.vala"
+       t.frame = frame % frame_rate;
+#line 500 "util.vala"
+       secs = (gint64) (frame / frame_rate);
+#line 501 "util.vala"
+       t.hour = ((gint) secs) / 3600;
+#line 502 "util.vala"
+       t.minute = (((gint) secs) % 3600) / 60;
+#line 503 "util.vala"
+       t.second = (((gint) secs) % 3600) % 60;
+#line 1463 "util.c"
+       *result = t;
+#line 505 "util.vala"
+       return;
+#line 1467 "util.c"
+}
+
+
+#line 508 "util.vala"
+char* frame_to_string (gint frame, Fraction* rate) {
+#line 1473 "util.c"
+       char* result = NULL;
+       TimeCode _tmp1_;
+       TimeCode _tmp0_ = {0};
+       result = time_code_to_string ((_tmp1_ = (frame_to_time (frame, rate, &_tmp0_), _tmp0_), &_tmp1_));
+#line 509 "util.vala"
+       return result;
+#line 1480 "util.c"
+}
+
+
+#line 512 "util.vala"
+void breakup_time (gint64 time, gint* hours, gint* minutes, double* seconds) {
+#line 1486 "util.c"
+       gint64 the_time;
+       gint64 minute;
+       gint64 hour;
+#line 513 "util.vala"
+       the_time = time;
+#line 514 "util.vala"
+       minute = (gint64) (GST_SECOND * 60);
+#line 515 "util.vala"
+       hour = minute * 60;
+#line 516 "util.vala"
+       *hours = (gint) (the_time / hour);
+#line 517 "util.vala"
+       the_time = the_time % hour;
+#line 518 "util.vala"
+       *minutes = (gint) (the_time / minute);
+#line 519 "util.vala"
+       the_time = the_time % minute;
+#line 520 "util.vala"
+       *seconds = ((double) the_time) / GST_SECOND;
+#line 1506 "util.c"
+}
+
+
+#line 523 "util.vala"
+char* time_to_HHMMSS (gint64 time) {
+#line 1512 "util.c"
+       char* result = NULL;
+       gint hours = 0;
+       gint minutes = 0;
+       double seconds = 0.0;
+#line 528 "util.vala"
+       breakup_time (time, &hours, &minutes, &seconds);
+#line 1519 "util.c"
+       result = g_strdup_printf ("%02d:%02d:%05.2lf", hours, minutes, seconds);
+#line 529 "util.vala"
+       return result;
+#line 1523 "util.c"
+}
+
+
+#line 532 "util.vala"
+char* time_to_string (gint64 time) {
+#line 1529 "util.c"
+       char* result = NULL;
+       gint hours = 0;
+       gint minutes = 0;
+       double seconds = 0.0;
+       char* return_value;
+       gboolean _tmp0_ = FALSE;
+#line 537 "util.vala"
+       breakup_time (time, &hours, &minutes, &seconds);
+#line 538 "util.vala"
+       return_value = g_strdup_printf ("%1.2lfs", seconds);
+#line 539 "util.vala"
+       if (hours > 0) {
+#line 539 "util.vala"
+               _tmp0_ = TRUE;
+#line 1544 "util.c"
+       } else {
+#line 539 "util.vala"
+               _tmp0_ = minutes > 0;
+#line 1548 "util.c"
+       }
+#line 539 "util.vala"
+       if (_tmp0_) {
+#line 1552 "util.c"
+               char* _tmp2_;
+               char* _tmp1_;
+#line 540 "util.vala"
+               return_value = (_tmp2_ = g_strconcat (_tmp1_ = g_strdup_printf ("%dm ", minutes), return_value, NULL), _g_free0 (return_value), _tmp2_);
+#line 1557 "util.c"
+               _g_free0 (_tmp1_);
+       }
+#line 543 "util.vala"
+       if (hours > 0) {
+#line 1562 "util.c"
+               char* _tmp4_;
+               char* _tmp3_;
+#line 544 "util.vala"
+               return_value = (_tmp4_ = g_strconcat (_tmp3_ = g_strdup_printf ("%dh ", hours), return_value, NULL), _g_free0 (return_value), _tmp4_);
+#line 1567 "util.c"
+               _g_free0 (_tmp3_);
+       }
+       result = return_value;
+#line 547 "util.vala"
+       return result;
+#line 1573 "util.c"
+}
+
+
+#line 550 "util.vala"
+GstElement* make_element_with_name (const char* element_name, const char* display_name, GError** error) {
+#line 1579 "util.c"
+       GstElement* result = NULL;
+       GError * _inner_error_;
+       GstElement* e;
+#line 550 "util.vala"
+       g_return_val_if_fail (element_name != NULL, NULL);
+#line 1585 "util.c"
+       _inner_error_ = NULL;
+#line 552 "util.vala"
+       e = gst_element_factory_make (element_name, display_name);
+#line 553 "util.vala"
+       if (e == NULL) {
+#line 1591 "util.c"
+               char* _tmp0_;
+               GError* _tmp1_;
+               _inner_error_ = (_tmp1_ = g_error_new_literal (MEDIA_ERROR, MEDIA_ERROR_MISSING_PLUGIN, _tmp0_ = g_strdup_printf ("Could not create element %s(%s)", element_name, display_name)), _g_free0 (_tmp0_), _tmp1_);
+               {
+                       g_propagate_error (error, _inner_error_);
+                       _gst_object_unref0 (e);
+                       return NULL;
+               }
+       }
+       result = e;
+#line 557 "util.vala"
+       return result;
+#line 1604 "util.c"
+}
+
+
+#line 560 "util.vala"
+GstElement* make_element (const char* name, GError** error) {
+#line 1610 "util.c"
+       GstElement* result = NULL;
+       GError * _inner_error_;
+       GstElement* _tmp0_;
+#line 560 "util.vala"
+       g_return_val_if_fail (name != NULL, NULL);
+#line 1616 "util.c"
+       _inner_error_ = NULL;
+#line 561 "util.vala"
+       _tmp0_ = make_element_with_name (name, NULL, &_inner_error_);
+#line 1620 "util.c"
+       if (_inner_error_ != NULL) {
+               g_propagate_error (error, _inner_error_);
+               return NULL;
+       }
+       result = _tmp0_;
+#line 561 "util.vala"
+       return result;
+#line 1628 "util.c"
+}
+
+
+static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) {
+       if ((array != NULL) && (destroy_func != NULL)) {
+               int i;
+               for (i = 0; i < array_length; i = i + 1) {
+                       if (((gpointer*) array)[i] != NULL) {
+                               destroy_func (((gpointer*) array)[i]);
+                       }
+               }
+       }
+}
+
+
+static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) {
+       _vala_array_destroy (array, array_length, destroy_func);
+       g_free (array);
+}
+
+
+static gint _vala_array_length (gpointer array) {
+       int length;
+       length = 0;
+       if (array) {
+               while (((gpointer*) array)[length]) {
+                       length++;
+               }
+       }
+       return length;
+}
+
+
+static int _vala_strcmp0 (const char * str1, const char * str2) {
+       if (str1 == NULL) {
+               return -(str1 != str2);
+       }
+       if (str2 == NULL) {
+               return str1 != str2;
+       }
+       return strcmp (str1, str2);
+}
+
+
+
+