#include <gtk/gtk.h> 
#include <gtk/gtkx.h> 
#include <locale.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <libintl.h> 
#include <getopt.h> 
#include <libintl.h> 
#include <json-c/json.h> 
#include <sys/statvfs.h>
#include <libublsettings.h>
#include <libublsettings-gtk3.h>
#include <libublsettingsui-gtk3.h>
#ifdef WEBKIT_FOUND 
    #include <webkit2/webkit2.h> 
#endif  
#include "ubl-strings.h" 
 
#define WIKI_LINK "https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubinstall-gtk" 
 
#define _(String) gettext(String) 
 
#define glade_path "/com/ublinux/ui/ubinstall-gtk.glade"
#define glade_path_ubinstall_keyboard "/com/ublinux/ui/ubinstall-gtk-keyboard.glade"
#define glade_path_ubinstall_language "/com/ublinux/ui/ubinstall-gtk-language.glade"
#define glade_path_network_info "/com/ublinux/ui/ubinstall-gtk-network-box.glade"
#define glade_path_log_view "/com/ublinux/ui/ubinstall-gtk-log-view.glade"
#define glade_path_user "/com/ublinux/ui/ubinstall-gtk-user.glade"
#define glade_path_menu_window "/com/ublinux/ui/ubinstall-gtk-menu.glade"
#define glade_path_menu_item "/com/ublinux/ui/ubinstall-gtk-menu-item.glade"
#define glade_path_kernel_row "/com/ublinux/ui/ubinstall-gtk-kernel-row.glade"
#define glade_path_os_row "/com/ublinux/ui/ubinstall-gtk-os-row.glade"
#define glade_path_service "/com/ublinux/ui/ubinstall-gtk-service-window.glade"
#define glade_path_bootloader_user "/com/ublinux/ui/ubinstall-gtk-bootloader-user.glade"
#define glade_path_advanced_part "/com/ublinux/ui/ubinstall-gtk-advanced-box.glade"
#define glade_path_configuration_mode "/com/ublinux/ui/ubinstall-gtk-configuration-mode.glade"
#define glade_path_source "/com/ublinux/ui/ubinstall-gtk-source.glade"
#define glade_path_source_element "/com/ublinux/ui/ubinstall-gtk-source-element.glade"
 
#define CssPath "/com/ublinux/css/ubinstall-gtk.css" 
#define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) 
#define icon_path "com.ublinux.ubinstall-gtk"

#define LocalePath "/usr/share/locale"  
#define LocaleName "ubinstall-gtk" 
 
#define clear_config_both_command "ubconfig remove TEMP_SECTION TEMP_PATAMETER" 
#define clear_config_global_command "ubconfig --target global remove TEMP_SECTION TEMP_PATAMETER" 
#define clear_config_local_command "ubconfig --target system remove TEMP_SECTION TEMP_PATAMETER" 
 
#define regions_path "/com/ublinux/images/map-time-zone.png"
#define keyboard_path "/com/ublinux/images/keyboard.png"
#define users_path "/com/ublinux/images/keyboard.png"
#define startup_path "/com/ublinux/images/keyboard.png"
#define bootloader_path "/com/ublinux/images/keyboard.png"
#define network_icon_path "/com/ublinux/images/keyboard.png"

#define licence_path "/usr/share/ublinux/agreement/EULA.txt"

#define languages_path "/usr/share/ubinstall-gtk/csv/locales.csv"
// #define installer_languages_path "resource:///com/ublinux/csv/languages.csv"

#define zone_path "/usr/share/zoneinfo/"

#define system_base_modules_path "/memory/data/from/0/ublinux/base"
#define system_modules_path "/memory/data/from/0/ublinux/modules"
#define additional_software_path "resource:///com/ublinux/csv/modules.csv"
#define kernel_list_path "resource:///com/ublinux/csv/kernel-list.csv"
#define kernel_list_addon_path "resource:///com/ublinux/csv/kernel-list-addon.csv"
#define services_list_path "resource:///com/ublinux/csv/services-list.csv"
#define network_path "resource:///com/ublinux/csv/network-list.csv"
#define fs_types_path "resource:///com/ublinux/csv/filesystems-format-list.csv"

#define locales_list_command "/usr/share/i18n/locales/"

#define slide_0_path "/com/ublinux/images/slide-0.png"

#define slide_repeat_path "/com/ublinux/images/slide-1.png", \
"/com/ublinux/images/slide-2.png", \
"/com/ublinux/images/slide-3.png", \
"/com/ublinux/images/slide-4.png", \
"/com/ublinux/images/slide-5.png", \
"/com/ublinux/images/slide-6.png", \
"/com/ublinux/images/slide-7.png", \
"/com/ublinux/images/slide-8.png", \
"/com/ublinux/images/slide-9.png", \
"/com/ublinux/images/slide-10.png", \
"/com/ublinux/images/slide-11.png", \
"/com/ublinux/images/slide-12.png", \
NULL

#define get_modules_command "pacman --color never -Ss ^ubm- | sed -Enr -e 'N;s/\\n/ ;/' -e \"s/^([^\\/]+)\\/([^[:blank:]]+)[[:blank:]]+([^[:blank:]]+)[[:blank:]]+(\\(([^\\)]+)\\)[^\\;]+|[^\\;]*);[[:blank:]]*(.*)/\\2;\\3;\\5;\\6/p\""

#define get_local_module_info_command(target) yon_char_unite("pacman --color never -Sp $(pacman -Ssq '",target,"') --print-format '%n;%v;%d' | grep -v \"^::\"",NULL);

#define get_menus_entry_command "/usr/lib/ublinux/scripts/grub-functions exec_get_all_menuentry"

#define encrypt_domain_password_command(target) yon_char_unite("echo '",target,"' | base64",NULL)

#define get_ntp_default_command "ubconfig --default get [network] NTPSERVERS_DEFAULT"
#define get_ntp_ru_command "ubconfig --default get [network] NTPSERVERS_RU"

#define get_models_command "sed '/<\\/modelList>/q' /usr/share/X11/xkb/rules/base.xml | grep -E '^ {8,8}<name>|^ {8,8}<description>'|sed -e 's/  *<name>//g' -e 's,</name>,,g' -e 's/  *<description>//g' -e 's,</description>,,g'"

#define check_is_password_hash(password) system(yon_char_unite("/lib/ublinux/functions is_hash_password '", password,"'",NULL))

#define network_value(ip,mask,gateway, dns) g_strdup_printf("ipv4.method manual ipv4.addr %s/%s ipv4.gateway %s ipv4.dns %s",ip,mask,gateway,dns)
#define network_value_auto "ipv4.method auto"

#define get_layouts_command "xkbcli list --load-exotic | awk \"\
layout && /description:/ {\
    match(\\$0, /: *(.*)/, matches);\
    description = matches[1];\
    printf \\\"%s|%s|%s\\\\n\\\", layout, variant, description;\
    layout = \\\"\\\"; variant = \\\"\\\";\
}\
/layout:/ {\
    match(\\$0, /: *'([^']+)'/, matches);\
    l = matches[1];\
    layout = layouts[l] = l;\
}\
/variant:/ {\
    match(\\$0, /: *'([^']+)'/, matches);\
    variant = matches[1];\
}\
\" | sort -u\
"

#define enable_vnc_command "ubconfig --target system set [desktop] X11VNC=ublinux"
#define disable_vnc_command "ubconfig --target system remove [desktop] X11VNC=ublinux"

#define get_layouts_local_command(layout) yon_char_unite("xkbcli list --load-exotic | awk -v layout=\"",layout,"\" \"BEGIN {layout_pattern = sprintf(\\\"^ *- *layout: *'%s'\\\",layout);matched=0} matched && /variant:/ {match(\\$0, /: *'([^']+)'/, matches);variant = matches[1]} matched && /description:/ {match(\\$0, /: *(.+)/, matches);description = matches[1]} matched && /^ *-/{matched=0; if (variant) printf \\\"%s|%s\\n\\\",variant,description} \\$0 ~ layout_pattern {matched=1;variant=\\\"\\\";description=\\\"\\\";next}\" | sort -u",NULL)
#define get_devices_command "lsblk --noheadings --nodeps -Jo PATH,SIZE,MODEL,VENDOR,SERIAL --exclude 7"
#define get_parts_and_devices_command "lsblk --noheadings --bytes -o TYPE,PATH,SIZE,FSTYPE,LABEL,PARTLABEL,MOUNTPOINT,FSUSED,FSUSE% --exclude 7 |awk '{print ($1\";\"$2\";\"$3\";\"$4\";\"$5\";\"$6\";\"$7\";\"$8\";\"$9)}'"

#define AUTOINSTALL(target) yon_char_unite("AUTOINSTALL[",target,"]",NULL)
#define AUTOINSTALL_TYPE_INSTALL "AUTOINSTALL[install_type]"
#define AUTOINSTALL_TYPE_INSTALL_command "ubconfig --source global get [autoinstall] AUTOINSTALL[install_type]"

#define AUTOINSTALL_DEVICE "AUTOINSTALL[device]"
#define AUTOINSTALL_DEVICE_command "ubconfig --source global get [autoinstall] AUTOINSTALL[device]"

#define part_parameter "AUTOINSTALL[part]"
#define part_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[part]"

#define modules_parameter "AUTOINSTALL[modules]"
#define modules_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[modules]"

#define modules_extra_parameter "AUTOINSTALL[modules_extra]"
#define modules_extra_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[modules_extra]"

/*------------------------------------------------------------*/
#define root_password_parameter "AUTOINSTALL[ubconfig set [users] DEFAULTROOTPASSWD]"
#define root_password_parameter_command "ubconfig --source global --conarg get [autoinstall] AUTOINSTALL['ubconfig set [users] DEFAULTROOTPASSWD']"
#define autologin_parameter "AUTOINSTALL[ubconfig set [desktop] AUTOLOGINUSER]"
#define autologin_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [desktop] AUTOLOGINUSER']"
#define xkbmodel_parameter "AUTOINSTALL[ubconfig set [keyboard] XKBMODEL]"
#define xkbmodel_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [keyboard] XKBMODEL']"
#define xkblayout_parameter "AUTOINSTALL[ubconfig set [keyboard] XKBLAYOUT]"
#define xkblayout_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [keyboard] XKBLAYOUT']"
#define xkbvariant_parameter "AUTOINSTALL[ubconfig set [keyboard] XKBVARIANT]"
#define xkbvariant_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [keyboard] XKBVARIANT']"
#define xkboptions_parameter "AUTOINSTALL[ubconfig set [keyboard] XKBOPTIONS]"
#define xkboptions_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [keyboard] XKBOPTIONS']"
#define hostname_parameter "AUTOINSTALL[ubconfig set [system] HOSTNAME]"
#define hostname_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [system] HOSTNAME']"
#define zone_parameter "AUTOINSTALL[ubconfig set [clock] ZONE]"
#define zone_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [clock] ZONE']"
#define lang_parameter "AUTOINSTALL[ubconfig set [locale] LANG]"
#define lang_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [locale] LANG']"
#define locale_parameter "AUTOINSTALL[ubconfig set [locale] LOCALE]"
#define locale_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [locale] LOCALE']"
/*------------------------------------------------------------*/

#define part_size_parameter "AUTOINSTALL[part_size]"
#define part_size_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[part_size]"
#define part_fs_type_parameter "AUTOINSTALL[part_fs_type]"
#define part_fs_type_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[part_fs_type]"
#define part_format_parameter "AUTOINSTALL[part_format]"
#define part_format_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[part_format]"
#define part_label_parameter "AUTOINSTALL[part_label]"
#define part_label_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[part_label]"
#define part_fs_label_parameter "AUTOINSTALL[part_fs_label]"
#define part_fs_label_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[part_fs_label]"
#define part_crypt_parameter "AUTOINSTALL[part_crypt]"
#define part_crypt_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[part_crypt]"
#define swap_parameter "AUTOINSTALL[swap]"
#define swap_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[swap]"
#define swap_size_parameter "AUTOINSTALL[swap_size]"
#define swap_size_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[swap_size]"
#define boot_parameter "AUTOINSTALL[boot]"
#define boot_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[boot]"
#define packages_parameter "AUTOINSTALL[packages]"
#define packages_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[packages]"
#define device_typevfs_parameter "AUTOINSTALL[device_typevfs]"
#define device_typevfs_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[device_typevfs]"
#define NTPSERVERS_parameter "AUTOINSTALL[ubconfig set [network] NTPSERVERS]"
#define NTPSERVERS_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [network] NTPSERVERS']"
#define DOMAIN_parameter "AUTOINSTALL[ubconfig set [network] DOMAIN]"
#define DOMAIN_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [network] DOMAIN']"
#define DOMAIN_admanger_parameter "AUTOINSTALL[ubconfig set [network] DOMAIN[admanger]]"
#define DOMAIN_admanger_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL['ubconfig set [network] DOMAIN[admanger]']"
#define USERADD_parameter_all "AUTOINSTALL[ubconfig set [users] USERADD[*]]"
#define USERADD_parameter_search "AUTOINSTALL[ubconfig set [users] USERADD["
#define USERADD_parameter(target) yon_char_unite("AUTOINSTALL[ubconfig set [users] USERADD[",target,"]]",NULL)
#define USERADD_parameter_command(target) yon_char_unite("ubconfig --source global get autoinstall AUTOINSTALL['ubconfig set [users] USERADD[",target,"]']",NULL)
#define KERNEL_BOOT_parameter "AUTOINSTALL[ubconfig set [boot] KERNEL_BOOT]"
#define KERNEL_BOOT_parameter_command "ubconfig --source global get autoinstall AUTOINSTALL['ubconfig set [boot] KERNEL_BOOT']"
#define SERVICES_ENABLE_parameter "AUTOINSTALL[ubconfig set [boot] SERVICES_ENABLE]" 
#define SERVICES_ENABLE_parameter_command "ubconfig get autoinstall AUTOINSTALL['ubconfig set [boot] SERVICES_ENABLE']" 
#define GRUB_SUPERUSERS_parameter "AUTOINSTALL[ubconfig set [boot] GRUB_SUPERUSERS]"
#define GRUB_SUPERUSERS_parameter_command "ubconfig get autoinstall AUTOINSTALL['ubconfig set [boot] GRUB_SUPERUSERS']"
#define GRUB_TIMEOUT_parameter "AUTOINSTALL[ubconfig set [boot] GRUB_TIMEOUT]"
#define GRUB_TIMEOUT_parameter_command "ubconfig get autoinstall AUTOINSTALL['ubconfig set [boot] GRUB_TIMEOUT']"
#define GRUB_DEFAULT_parameter "AUTOINSTALL[ubconfig set [boot] GRUB_DEFAULT]"
#define GRUB_DEFAULT_parameter_command "ubconfig get autoinstall AUTOINSTALL['ubconfig set [boot] GRUB_DEFAULT']"
#define GRUB_PASSWORD_parameter_search "AUTOINSTALL[ubconfig set [boot] GRUB_PASSWORD["
#define GRUB_PASSWORD_parameter_all "AUTOINSTALL[ubconfig set [boot] GRUB_PASSWORD[*]]"
#define GRUB_PASSWORD_parameter(target) yon_char_unite("AUTOINSTALL[ubconfig set [boot] GRUB_PASSWORD[",target,"]]",NULL)
#define GRUB_PASSWORD_parameter_command_all "ubconfig get autoinstall AUTOINSTALL['ubconfig set [boot] GRUB_PASSWORD[*]']"
#define GRUB_PASSWORD_parameter_command(target) yon_char_unite("ubconfig get autoinstall AUTOINSTALL['ubconfig set [boot] GRUB_PASSWORD[",target,"]']",NULL)
#define AUTOLOGINUSER_parameter "AUTOINSTALL[ubconfig set [desktop] AUTOLOGINUSER]"
#define AUTOLOGINUSER_parameter_command "ubconfig get autoinstall AUTOINSTALL['ubconfig set [boot] AUTOLOGINUSER']"
#define NETWORK_parameter_search "AUTOINSTALL[ubconfig set [network] NETWORK["
#define NETWORK_parameter(target) yon_char_unite("AUTOINSTALL[ubconfig set [network] NETWORK[",target,"@connmod]]",NULL)
#define NETWORK_devdown_parameter(target) yon_char_unite("AUTOINSTALL[ubconfig set [network] NETWORK[",target,"@devdown]]",NULL)
#define NETWORK_parameter_command(target) yon_char_unite("ubconfig get autoinstall AUTOINSTALL['ubconfig set [network] NETWORK[",target,"@connmod]']",NULL)
#define NETWORK_devdown_parameter_command(target) yon_char_unite("ubconfig get autoinstall AUTOINSTALL['ubconfig set [network] NETWORK[",target,"@devdown]']",NULL)
#define NETWORK(target) yon_char_unite("NETWORK[",target,"@connmod]",NULL)
#define installer_lang_parameter "AUTOINSTALL[installer_lang]"
#define installer_lang_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[installer_lang]"
#define source_parameter "AUTOINSTALL[source]"
#define source_parameter_command "ubconfig --source global get [autoinstall] AUTOINSTALL[source]"

#define save_config_command(parameters) yon_char_unite("ubconfig --target system set [autoinstall] AUTOINSTALL[log]=yes ",parameters, "; nice ubinstall2 --debug autoinstall", NULL)

#define set_user_config_command(parameters) yon_char_unite("ubconfig --target system set [autoinstall] ",parameters,";nice ubinstall2 autoconfig",NULL)
#define save_additional_config_command(parameters) yon_char_unite("ubconfig --target system set [autoinstall] ",parameters,NULL)

#define get_default_password_command "ubconfig --raw --conarg --source default get [users] NOSECUREROOTPASSWD"

#define open_gparted_command "gparted"


#define PASSWORD_DEFAULT "ublinux"

#define start_fast_install_command "ubinstall2 --autoinstall"

#define progress_path "/var/log/ubinstall_progress.log"

#define password_limits_path "/etc/security/pwquiality.conf"

#define short_log_path "/var/log/ubinstall_progress.log"

#define full_log_path "/var/log/ubinstall.log"

#define yon_config_get_command(target) yon_char_unite("ubconfig --source ",target," --conarg get [autoinstall] AUTOINSTALL[*]",NULL)
			
#define config_get_default_command "ubconfig --source default --conarg get [autoinstall] AUTOINSTALL[*]"

#define config_get_global_only_parameters ""
#define config_get_local_only_parameters ""

#define ubconfig_file_create(target) yon_char_unite("ubconfig --target \"",target,"\" create",NULL)

#define default_langs(size) yon_char_parsed_new(size,"en_US.UTF-8","ru_RU.UTF-8",NULL);

#define install_common_parameters \
        AUTOINSTALL_TYPE_INSTALL,\
        AUTOINSTALL_DEVICE,\
        part_format_parameter,\
        part_label_parameter,\
		part_fs_type_parameter

#define install_part_parameters \
        AUTOINSTALL_TYPE_INSTALL,\
        AUTOINSTALL_DEVICE,\
        part_format_parameter,\
        part_fs_label_parameter,\
        part_parameter,\
        part_fs_type_parameter,\
		part_fs_label_parameter

#define install_next_parameters \
        AUTOINSTALL_TYPE_INSTALL,\
        AUTOINSTALL_DEVICE,\
        part_format_parameter,\
        part_fs_label_parameter,\
        part_parameter,\
        part_fs_type_parameter,\
        part_size_parameter

#define install_advanced_parameters \
        AUTOINSTALL_TYPE_INSTALL,\
        AUTOINSTALL_DEVICE,\
        part_format_parameter,\
        part_label_parameter,\
        part_parameter,\
        part_fs_type_parameter,\
        part_size_parameter

#define install_grub_install_update_parameters \
        AUTOINSTALL_TYPE_INSTALL,\
        AUTOINSTALL_DEVICE,\
        part_parameter

#define install_system_only_parameters \
        AUTOINSTALL_TYPE_INSTALL,\
        AUTOINSTALL_DEVICE,\
        part_format_parameter,\
        part_label_parameter,\
        part_parameter,\
        part_fs_type_parameter,\
        part_size_parameter,\
		part_crypt_parameter

#define install_userdata_only_parameters \
        AUTOINSTALL_TYPE_INSTALL,\
        AUTOINSTALL_DEVICE,\
        part_format_parameter,\
        part_label_parameter,\
        part_parameter,\
        part_fs_type_parameter,\
        part_size_parameter,\
		part_crypt_parameter

typedef char* string; 
__attribute__((unused)) static \
string version_application;

enum YON_PAGES {
	YON_PAGE_WELCOME = 0,
	YON_PAGE_LICENCE,
	YON_PAGE_SECTIONS,
	YON_PAGE_OS_COMPONENTS,
	YON_PAGE_INSTALLATION_BEGIN,
	YON_PAGE_KERNEL,
	YON_PAGE_KERNEL_ADDON,
	YON_PAGE_SOFTWARE,
	YON_PAGE_PACMAN_SOFTWARE,
	YON_PAGE_REGION,
	YON_PAGE_KEYBOARD,
	YON_PAGE_USERS,
	YON_PAGE_STARTUP,
	YON_PAGE_BOOTLOADER,
	YON_PAGE_NETWORK,
	YON_PAGE_INSTALLATION,
	YON_PAGE_COMPLETION,
	YON_PAGE_COMPLETED,
	YON_PAGE_INSTALL_ERROR,
	YON_PAGE_CONFIGURE_END,
	YON_PAGE_CONFIGURE_SAVE,

	YON_PAGE_INSTALL_COMMON,
	YON_PAGE_INSTALL_SEPARATE,
	YON_PAGE_INSTALL_SAME_PARTITION,
	YON_PAGE_INSTALL_ADVANCED,
	YON_PAGE_INSTALL_RECOVERY,

	YON_PAGE_RECOVERY_GRUB_INSTALL,
	YON_PAGE_RECOVERY_GRUB_UPDATE,
	YON_PAGE_RECOVERY_OS_ONLY,
	YON_PAGE_RECOVERY_USRDATA_ONLY
};

typedef struct { 
	template_config_fields
	config_str launch_arguments;
	int launch_size;
	int save_done;
	int save_configured;
 
	int install_complete;
	guint slider_thread;
	int install_mode;
	unsigned long install_thread;
	guint progress_thread;
	int configure_mode;
	int log_progress_buzy;
	int autologin_default;
	int format_default;
	int log_end;
	int exit_accepted;
	GMutex progress_mutex;
	GMutex install_mutex;
	
	int arg_size;
	config_str arg_target;
	GtkWidget *status_box;
	GHashTable *network_types;
	GtkWidget *kernel_unchosen_radio;

	char *config_load_path;
	char *config_save_path;
	unsigned int cur_slide;
} config; 

extern config main_config;

typedef struct {
	GtkWidget *CommonInstallationDevicesTree;
	GtkWidget *GpartedCommonButton;
	GtkWidget *CommonInstallationFilesystemTypeCombo;
	GtkWidget *CommonInstallationSectionNameEntry;
	GtkListStore *DevicesList;
} install_common_page;
 
typedef struct { 
	GtkBuilder *builder;
    GtkListStore *DevicesList;
	GtkListStore *LanguagesList;
	GtkTreeStore *LayoutList;
	GtkListStore *AdditionalSoftwareList;
	GtkListStore *PartitionsList;

	GtkWidget *LoadGlobalConfigurationMenuItem;
	GtkWidget *LoadLocalConfigurationMenuItem;
	GtkWidget *LoadExternalConfigurationMenuItem;

	GtkWidget *SaveGlobalLocalConfigurationMenuItem;
	GtkWidget *SaveGlobalConfigurationMenuItem;
	GtkWidget *SaveLocalConfigurationMenuItem;
	GtkWidget *SaveExternalConfigurationMenuItem;

	GtkWidget *MainWindow;

	GtkWidget *StartScenarioButton;
	GtkWidget *SourceButton;
	GtkWidget *SkipInstallationButton;
	GtkWidget *MainSpinner;

	GtkWidget *StatusBox;
	GtkWidget *StatusBox2;
	GtkWidget *WelcomeToggle;
	GtkWidget *LicenceToggle;
	GtkWidget *LocationToggle;
	GtkWidget *KeyboardToggle;
	GtkWidget *SectionsToggle;
	GtkWidget *UsersToggle;
	GtkWidget *SummaryToggle;
	GtkWidget *CompletionToggle;
	GtkWidget *InstallationToggle;
	GtkWidget *LanguagesTree;
	GtkWidget *CountryLanguagesTree;
	GtkListStore *InstallerCountryList;
	GtkListStore *InstallerLanguageList;
	GtkTreeModel *InstallerCountryFilter;
	// GtkWidget *LanguageCombo;
	GtkWidget *RegionCombo;
	GtkWidget *ZoneCombo;
	GtkWidget *AvailableLanguagesEntry;
	GtkWidget *AvailableLanguagesButton;
	GtkWidget *LanguagesCombo;
	GtkWidget *KeyboardModelCombo;
	GtkWidget *LayoutBindingCombo;
	GtkWidget *LayoutTree;
	GtkWidget *AddButton;
	GtkWidget *RemoveButton;

	GtkWidget *InstallationRadio;
	GtkWidget *InstallationNearRadio;
	GtkWidget *InstallationLinuxRadio;
	GtkWidget *InstallationWindowsRadio;
	GtkWidget *InstallationOptionsRadio;
	
	GtkWidget *UserImage;
	GtkWidget *UserRootNameEntry;
	GtkWidget *UserRootLoginEntry;
	GtkWidget *UserRootPasswordCombo;
	GtkWidget *UserRootPasswordEntry;
	GtkWidget *UserRootPasswordButton;
	GtkWidget *UserAutologinSwitch;
	GtkWidget *UserAddBox;
	GtkWidget *UserAddButton;

	GtkWidget *HotnameEntry;
	GtkWidget *AutoHostnameCheck;
	GtkWidget *CancelInstallButton;
	GtkWidget *BackButton;
	GtkWidget *NextButton;
	GtkWidget *mainSettingsButton;
	GtkWidget *menu1;
	GtkWidget *menu2;

	GtkWidget *RegionImage;
	GtkWidget *RegionBox;
	GtkWidget *RegionAspect;
	GtkWidget *KeyboardImage;
	GtkWidget *KeyboardBox;
	GtkCellRenderer *KeyboardLayoutChosenCell;

	GtkWidget *Notebook;
	GtkWidget *LicenceLabel;
	GtkWidget *SlidesImage;

	GtkWidget *CommonInstallationDevicesTree;
	GtkWidget *CommonInstallationFilesystemTypeCombo;
	GtkWidget *CommonInstallationSectionNameEntry;
	GtkWidget *CommonFormatSwitch;
	GtkWidget *GpartedCommonButton;

	GtkWidget *NextInstallationSysDevicesTree;
	GtkWidget *NextInstallationSysSectionTree;
	GtkWidget *NextInstallationFormatSwitch;
	GtkWidget *NextInstallationFormatRevealer;
	GtkWidget *NextInstallationSizeSpin;
	GtkWidget *NextInstallationSizeTypeSpin;
	GtkWidget *NextInstallationFilesystemTypeCombo;
	GtkWidget *NextInstallationSectionNameEntry;
	GtkWidget *GpartedNextInstallationButton;

	GtkWidget *SamePlaceDeviceTree;
	GtkWidget *SamePlacePartTree;
	GtkWidget *SameInstallationFormatSwitch;
	GtkWidget *SameInstallationFormatRevealer;
	GtkWidget *SameInstallationFilesystemTypeCombo;
	GtkWidget *SameInstallationSectionNameEntry;
	GtkWidget *GpartedSameButton;

	GtkWidget *InstallationProgress;
	GtkWidget *InstallationLabel;
	GtkWidget *ReadShortLogButton;
	GtkWidget *PackageInstallationProgress;
	GtkWidget *PackageInstallationLabel;
	GtkWidget *ReadFullLogButton;


	GtkWidget *ConfigurationModeMenuItem;
	GtkWidget *EnableVNCMenuItem;
	GtkWidget *AboutMenuItem;
	GtkWidget *DocumentationMenuItem;

	GtkCellRenderer *AdditionalSoftwareCell;

	GtkWidget *AdditionalSoftwareTree;
	
	GtkWidget *GrubInstallRadio;
	GtkWidget *GrubUpdateRadio;
	GtkWidget *SeparateRadio;
	GtkWidget *OSRadio;
	GtkWidget *UserDataOnlyRadio;

	GtkWidget *GpartedGrubInstallButton;
	GtkWidget *GrubInstallDevicesTree;
	GtkWidget *GrubInstallPartitionTree;

	GtkWidget *GpartedGrubUpdateButton;
	GtkWidget *GrubUpdateDevicesTree;
	GtkWidget *GrubUpdatePartitionTree;

	GtkWidget *GpartedOSButton;
	GtkWidget *OSDevicesTree;
	GtkWidget *OSSysSectionTree;
	GtkWidget *OSFormatSwitch;
	GtkWidget *OSFormatSizeSpin;
	GtkWidget *OSFormatSizeCombo;
	GtkWidget *OSFormatPartitionEntry;
	GtkWidget *OSFilesystemTypeCombo;
	GtkWidget *OSFormatFSMarkEntry;
	GtkWidget *OSFormatEncryptionCombo;
	GtkWidget *OSFormatEncryptionEntry;

	GtkWidget *GpartedUserdataButton;
	GtkWidget *UserdataDevicesTree;
	GtkWidget *UserdataSysSectionTree;
	GtkWidget *UserdataFormatSwitch;
	GtkWidget *UserdataFormatSizeSpin;
	GtkWidget *UserdataFormatSizeCombo;
	GtkWidget *UserdataFormatPartitionEntry;
	GtkWidget *UserdataFilesystemTypeCombo;
	GtkWidget *UserdataFormatFSMarkEntry;
	GtkWidget *UserdataFormatEncryptionCombo;
	GtkWidget *UserdataFormatEncryptionEntry;

	GtkTreeModel *LanguagesFilter;
	GtkTreeModel *LayoutsFilter;

    GdkPixbuf *region_original;
    GdkPixbuf *keyboard_original;
    GdkPixbuf *user_original;
    GdkPixbuf *startup_original;
    GdkPixbuf *bootloader_original;
    GdkPixbuf *network_original;
    GList *slides_original;
    float region_height_mult;
 
	GtkWidget *RegionSensitiveSwitch;
	GtkWidget *HostnameSensitiveSwitch;

	GtkWidget *KernelListBox;
	GtkWidget *KernelInstallLabel;
	GtkWidget *KernelEnableLabel;
	GtkWidget *KernelNameLabel;
	GtkWidget *KernelTagsLabel;
	GtkWidget *KernelModulesLabel;
	GtkWidget *KernelDescriptionLabel;
	GtkSizeGroup *KernelSizeGroup;

	GtkWidget *KernelAddonListBox;
	GtkWidget *KernelAddonInstallLabel;
	GtkWidget *KernelAddonNameLabel;
	GtkWidget *KernelAddonModulesLabel;
	GtkWidget *KernelAddonDescriptionLabel;

	GtkWidget *OSSoftwareListBox;
	GtkWidget *OSSoftwareInstallLabel;
	GtkWidget *OSSoftwareNameLabel;
	GtkWidget *OSSoftwareTagsLabel;
	GtkWidget *OSSoftwareDescriptionLabel;

	GtkWidget *PacmanSoftwareSearchEntry;
	GtkWidget *PacmanSoftwareStatusImage;
	GtkWidget *PacmanSoftwareStatusLabel;
	GtkWidget *PacmanSoftwareStatusButton;

	GtkWidget *PacmanLoadingOverlay;
	GtkWidget *PacmanSoftwareAllPackagesTree;
	GtkListStore *PacmanSoftwareAllList;
	GtkCellRenderer *PacmanSoftwareAllCell;
	GHashTable *pacmanchosen;

	GtkWidget *PacmanSoftwareChosenPackagesTree;
	GtkListStore *PacmanSoftwareChosenList;
	GtkCellRenderer *PacmanSoftwareChosenCell;

	GtkWidget *StartupImage;
	GtkWidget *StartupServicesTree;
	GtkWidget *StartupServicesAddButton;
	GtkWidget *StartupServicesEditButton;
	GtkWidget *StartupServicesRemoveButton;
	GtkCellRenderer *StartupChosenCell;
	GtkListStore *StartupList;

	GtkWidget *BootloaderImage;
	GtkWidget *BootloadTimerSwitch;
	GtkWidget *BootloadTimerSpin;
	GtkWidget *BootloadDefaultOSEntry;
	GtkWidget *BootloadDefaulOSButton;
	GtkWidget *BootloadNoPasswordSwitch;
	GtkWidget *BootloadUserAddButton;
	GtkWidget *BootloadUserRemoveButton;
	GtkWidget *BootloadUserTree;
	GtkListStore *BootloadUsersList;

	GtkWidget *NetworkImage;
	GtkWidget *NetworkDomainSwitch;
	GtkWidget *NetworkDomainNameEntry;
	GtkWidget *NetworkDomainAdminEntry;
	GtkWidget *NetworkDomainPasswordEntry;
	GtkWidget *NetworkNTPServerSwitch;
	GtkWidget *NetworkNTPCombo;
	GtkWidget *NetworkNTPEntry;
	GtkWidget *NetworkConnectionsBox;
	GtkWidget *NetworkConnectionsAddButton;
	GHashTable *network_connections;

	GtkCellRenderer *AdvancedDeviceChosenCell;
	GtkCellRenderer *AdvancedPartChosenCell;
	GtkWidget *AdvancedDeviceTree;
	GtkWidget *AdvancedVirtualDeviceCombo;
	GtkWidget *AdvancedPartitionTree;
	GtkWidget *AdvancedPartitionAddBox;
	GtkWidget *AdvancedAddButton;
	GtkWidget *AdvancedLoadTypeSwitch;
	GtkWidget *AdvancedBiosSectorSwitch;
	GtkWidget *AdvancedEFISwitch;
	GtkWidget *AdvancedSwapSwitch;
	GtkWidget *AdvancedSwapAutoSwitch;
	GtkWidget *AdvancedSwapRamSwitch;
	GtkWidget *AdvancedSwapFixedSpin;
	GtkWidget *AdvancedSwapFixedSwitch;
	GtkWidget *AdvancedSwapFixedSizeSwitch;
	GtkWidget *AdvancedSwapRevealer;
	GtkWidget *AdvancedLoadTypeRevealer;
	dictionary *advanced_sections;
	GSequence *advanced_partition_order;


	GFile *install_progress_file;
	GFileMonitor *install_progress_monitor;
	GFile *install_info_file;
	GFileMonitor *install_info_monitor;

} main_window; 
 
enum ADVANCED_PART_TYPE {
	ADVANCED_PART_NEW,
	ADVANCED_PART_EXISTING
};

typedef struct {
	GtkWidget *MainBox;
	GtkWidget *SectionLabel;
	GtkWidget *SystemSectionToggle;
	GtkWidget *UserDataSectionToggle;
	GtkWidget *RemoveButton;
	GtkWidget *FormatSwitch;
	GtkWidget *FormatRevealer;
	GtkWidget *SizeSpin;
	GtkWidget *SizeCombo;
	GtkWidget *SectionMarkEntry;
	GtkWidget *FileSystemTypeCombo;
	GtkWidget *FileSystemMarkentry;
	GtkWidget *EncryptionCombo;
	GtkWidget *EncryptionEntry;
	GtkWidget *EncryptionButton;
	GSequenceIter *order_iter;

	enum ADVANCED_PART_TYPE part_type;
	char *part;
} advanced_partition;
 
typedef struct { 
    GtkWidget *Window; 
    GtkWidget *HeaderLabel;
    GtkWidget *AlwaysOpenCheck; 
 
    GtkWidget *CloseButton; 
    GtkWidget *AcceptButton; 
} documentation_confirmation_window; 
 
typedef struct{
	GtkWidget *MainWindow;
	GtkWidget *StatusBox;
	GtkWidget *headerBar;
	GtkWidget *CancelButton;
	GtkWidget *SaveButton;
	GtkWidget *LayoutsTree;
	GtkCellRenderer *ActiveToggle;
} ubinstall_keyboard_window;

typedef struct{
	GtkListStore *liststore1;
	GtkWidget *MainWindow;
	GtkWidget *StatusBox;
	GtkWidget *DefaultCheck;
	GtkWidget *headerBar;
	GtkWidget *CancelButton;
	GtkWidget *SaveButton;
	GtkWidget *LanguagesTree;

	GtkCellRenderer *ToggleRenderer;
} ubinstall_language_window;

typedef struct{
	GtkWidget *CreateGroupWindow;
	GtkWidget *StatusBox;
	GtkWidget *UserCancelButton;
	GtkWidget *UserOkButton;
	GtkWidget *UserRootPasswordEntry;
	GtkWidget *RepeatPasswordEntry;
	GtkWidget *PasswordHashEntry;
	GtkWidget *HashBox;
	GtkWidget *PasswordBox;
	GtkWidget *NoEncriptionCheck;
} password_window;

typedef struct {
	GtkWidget *Window;
	GtkWidget *ScrollWindow;
	GtkWidget *StatusBox;
	GtkWidget *HeadLabel;
	GtkWidget *LogLabel;
	GtkWidget *ScrollToEndCheck;
	GFileMonitor *monitor;

	char *command;
} log_window;

typedef struct {
	GtkWidget *Window;
	GtkWidget *TitleLabel;
	GtkWidget *TextLabel;
	GtkWidget *AcceptButton;
	GtkWidget *CancelButton;
} confirmation_window;

typedef struct {
	GtkWidget *MainBox;
	GtkWidget *TypeCombo;
	GtkWidget *ConnectionCombo;
	GtkWidget *ConnectionEntry;
	GtkWidget *EnabledSwitch;
	GtkWidget *RemoveButton;
	GtkWidget *AutoGetIPSwitch;
	GtkWidget *IpRevealer;
	GtkWidget *IpAdressEntry;
	GtkWidget *GatewayEntry;
	GtkWidget *MaskEntry;
	GtkWidget *DNSEntry;
} network_info;

typedef struct {
    GtkWidget *MainBox;
    GtkWidget *RemoveButton;
    GtkWidget *UsernameEntry;
    GtkWidget *LoginEntry;
    GtkWidget *PasswordCombo;
    GtkWidget *PasswordEntry;
    GtkWidget *PasswordButton;
} yon_user_struct;


typedef struct {
    GtkWidget *MenuWindow;
    GtkWidget *BackButton;
    GtkWidget *ItemsRevealer;
    GtkWidget *ItemsListBox;
    GtkWidget *ChildrenRevealer;
    GtkWidget *ChildrenListBox;

    int seat_grab;
    dictionary *menu_items;
    char *cur_selection;
    int button_pos_x;
    int button_pos_y;
} yon_menu_window;

typedef struct {
    GtkWidget *MenuItemBox;
    GtkWidget *MenuButton;
    GtkWidget *MenuTextLabel;
    GtkWidget *NextIconButton;
    
    char *target;

    main_window *widgets;
    yon_menu_window *window;

    dictionary *children;

} yon_menu_item;

typedef struct {
    GtkWidget *row;
    GtkWidget *RowBox;
    GtkWidget *TagsBox;
    GtkWidget *InstallCheck;
    GtkWidget *EnableRadio;
    GtkWidget *EnableSeparator;
	GtkWidget *TagsSeparator;
    GtkWidget *NameLabel;
    GtkWidget *DescriptionLabel;
    GtkWidget *ModulesLabel;

    char *name;
    char *modules;
    char *package;
} kernel_row;

typedef struct {
    GtkWidget *row;
    GtkWidget *RowBox;
    GtkWidget *TagsBox;
    GtkWidget *InstallCheck;
    GtkWidget *NameLabel;
    GtkWidget *VersionLabel;
    GtkWidget *DescriptionLabel;

    char *name;
    char *modules;
    char *version;
} os_row;

typedef struct {
	GtkWidget *Window;
	GtkWidget *StatusBox;
	GtkWidget *UnitEntry;
	GtkWidget *ServiceEntry;
	GtkWidget *DescriptionEntry;
	GtkWidget *CancelButton;
	GtkWidget *AcceptButton;
} startup_service_window;

struct pacman_struct{
    main_window *widgets;
    const char *find_package;
    gsize packages_size;
    config_str packages;
};

typedef struct {
	GtkWidget *Window;
	GtkWidget *StatusBox;
    GtkWidget *TitleLabel;

	GtkWidget *AdminCheck;
	GtkWidget *UsernameEntry;
	GtkWidget *PasswordEntry;
    GtkWidget *PasswordButton;

	GtkWidget *CancelButton;
	GtkWidget *AcceptButton;

    char *prev_name;
} bootloader_user_window;

typedef struct {
	GtkWidget *Window;
	GtkWidget *StatusBox;
	GtkWidget *PathEntry;
	GtkWidget *PathButton;
	GtkWidget *CancelButton;
	GtkWidget *ChooseButton;
} configuration_window;

typedef struct {
	GtkWidget *Window;
	GtkWidget *StatusBox;
	GtkWidget *CancelButton;
	GtkWidget *AcceptButton;
	GtkWidget *AutoSwitch;
	GtkWidget *TypeCombo;
	GtkWidget *PathEntry;
	GtkWidget *PathButton;
	GtkWidget *AddButton;
	GtkWidget *AddBox;
	GHashTable *sources;
} source_window;

typedef struct {
	GtkWidget *MainBox;
	GtkWidget *TypeCombo;
	GtkWidget *PathEntry;
	GtkWidget *PathButton;
	GtkWidget *RemoveButton;
	
} source_element;

void config_init();
main_window *yon_main_window_complete();
ubinstall_language_window *yon_ubinstall_language_new();
void NewFunction(ubinstall_language_window *window, GtkBuilder *builder);
ubinstall_keyboard_window *yon_ubinstall_keyboard_new();

void on_password_accept(GtkWidget *self, dictionary *dict);


void yon_interface_update(main_window *widgets);

void on_summary_log_view(GtkWidget *,main_window *widgets);
void on_device_selection_changed(GtkWidget *self, main_window *widgets);

void on_toggle_button_switch_on(GtkWidget *, GtkToggleButton *toggle);

void on_autohostname_sensitiveness_check(GtkWidget *, int status, main_window *widgets);
void on_autohostname_check(GtkWidget *, main_window *widgets);
void on_hostname_entry_changed (GtkWidget *, main_window *widgets);

gboolean on_install_success(main_window *widgets);

gboolean on_install_error(main_window *widgets);

// confirmation_window *yon_confirmation_window_new();

void on_reboot_accepted(main_window *widgets);

void on_keyboard_clicked (GtkWidget *, main_window *widgets);
void on_keyboard_accept(GtkWidget *self,main_window *widgets);
void on_layout_toggle(GtkCellRendererToggle*,  gchar* path, ubinstall_keyboard_window *window);
void on_language_clicked(GtkWidget *, main_window *widgets);
void yon_language_selection_changed(GtkCellRenderer *, char *path, ubinstall_language_window *window);
void on_language_window_accept(GtkWidget *,dictionary *dict);
void on_keyboard_removed(GtkWidget *, main_window *widgets);
void on_exit_accepted(main_window *widgets);
void on_gparted_open();
// void on_same_installation_device_changed(GtkWidget *, main_window *widgets);
void on_separate_installation_changed(GtkWidget *self, main_window *widgets);
void on_partition_changed(GtkWidget *self, main_window *widgets);
void yon_set_max_size_from_partition(GtkTreeView *table, GtkSpinButton *spin_size, GtkComboBox *size_type);
gboolean on_yon_exit(GtkWidget *,GdkEvent*, main_window *widgets);
void on_locale_changed(GtkWidget *,main_window *);
void on_region_changed(GtkComboBox *self, main_window *widgets);
void on_page_cancel_clicked(GtkWidget *, main_window *widgets);
int yon_install_options_save(GtkWidget *device_tree, GtkWidget *part_tree,char *mode,main_window *widgets);
void on_process_log_view(GtkWidget *,main_window *widgets);
void yon_read_log(GFileMonitor *,GFile *,GFile *,GFileMonitorEvent ,log_window *window);
log_window *yon_log_window_new();
void on_log_closed(GtkWidget *, log_window *window);
void on_page_changed(GtkWidget *,GtkWidget *,int page, main_window *widgets);
void yon_installation_progress_update(GFileMonitor *,GFile *,GFile *,GFileMonitorEvent ,main_window *widgets);
void *on_config_save(void *data);
void *on_setup_system_configuration(void * data);
gboolean on_image_slide(void *data);
void on_region_resized(GtkWidget *,main_window *widgets);
int yon_image_resize_from_container(GtkImage *target, GdkPixbuf *pixbuf_unscaled);
void on_configuration_mode_switch(GtkWidget *self,main_window *widgets);
double yon_size_long_convert_automatic(unsigned long bytes, char *size);
double yon_size_long_convert_to_mod(double size, char mod);
void on_root_get_root(char *argline);
void on_config_custom_save(GtkWidget *, main_window *widgets);
void on_config_global_save(GtkWidget *,main_window *widgets);
void on_config_local_save(GtkWidget *,main_window *widgets);
void on_config_global_local_save(GtkWidget *,main_window *widgets);
void on_config_custom_load_last(GtkWidget *,main_window *widgets);
void on_config_custom_load(GtkWidget *,main_window *);
void on_config_global_load(GtkWidget *,main_window *);
void on_config_local_load(GtkWidget *,main_window *widgets);
void yon_config_save_proceed(char *path, YON_CONFIG_TYPE type);
void on_page_next_clicked(GtkWidget *, main_window *widgets);
void on_page_prev_clicked(GtkWidget *, main_window *widgets);
void yon_load_proceed(YON_CONFIG_TYPE type);
void _yon_saving_threaded(char *final_command);
enum YON_PAGES yon_page_get_next(main_window *widgets,enum YON_PAGES page);
enum YON_PAGES yon_page_get_prev(enum YON_PAGES page);
enum YON_PAGES yon_sections_get_next_page(main_window *widgets);
enum YON_PAGES yon_recovery_get_next(main_window *widgets);
enum YON_PAGES yon_page_get_current(GtkNotebook *target);
void yon_switch_page_render(main_window *widgets);
void yon_page_update(main_window *);
void yon_navigation_buttons_set_sensetiveness(main_window *widgets);
int yon_region_save(main_window *widgets);
int yon_keyboard_save(main_window *widgets);
int yon_install_common_save(main_window *widgets);
int yon_install_separate_save(main_window *widgets);
int yon_install_same_partition_save(main_window *widgets);
int yon_grub_install_save(main_window *widgets);
int yon_grub_update_save(main_window *widgets);
int yon_os_components_save(main_window *widgets);
int yon_software_save(main_window *widgets);
int yon_kernel_save(main_window *widgets);
int yon_page_save(main_window *widgets, enum YON_PAGES page);
int yon_users_save(main_window *widgets);
int yon_bootloader_save(main_window *widgets);
int yon_startup_save(main_window *widgets);
network_info *yon_network_info_new();
int yon_install_advanced_save(main_window *widgets);
int yon_network_save(main_window *widgets);
void on_connection_add(GtkWidget *,main_window *widgets);
void on_ntp_sync(GtkWidget *, main_window *widgets);
int yon_advanced_sections_save(dictionary *dict);
void yon_configuration_mode_check(main_window *widgets);
void on_configuration_mode_switch(GtkWidget *self,main_window *widgets);
void *_yon_installation_start(main_window *widgets);
int yon_installation_start(main_window *widgets);
enum INSTALL_TYPE yon_ubl_get_install_mode();
int yon_user_save(yon_user_struct *user);
void on_user_add(GtkWidget *,main_window *widgets);
yon_user_struct *yon_user_struct_new();
void on_user_remove_clicked(GtkWidget *,yon_user_struct *user);
void yon_password_new(GtkWidget *, yon_user_struct *user);
void yon_password_root_new(GtkWidget *, main_window *widgets);
yon_menu_item *yon_menu_item_new();
 yon_menu_window *yon_menu_window_new();
void on_menu_window_size_reallocated(GtkWidget *self,GtkAllocation *,yon_menu_window *window);
void on_children_clean(GtkWidget*, yon_menu_window *window);
gboolean yon_on_revealer_switched (yon_menu_window *window);
gboolean on_menu_clicked(GtkWidget *, GdkEventButton *event, yon_menu_window *window);
yon_menu_window *yon_menu_window_open(GtkWidget *, main_window *widgets);
void on_submenu_open(GtkWidget *,yon_menu_item *item);
void on_menu_chosen(GtkWidget *, yon_menu_item *item);
void yon_kernel_setup(main_window *widgets);
void yon_kernel_row_setup(kernel_row *row, char *name, char *modules,char *package, char *tags, char *description);
void yon_kernel_row_setup_tags(kernel_row *row, char *tags);
int yon_tag_add(GtkBox *target,char *tag_label, char *tag_style, char *icon_name);
kernel_row *yon_kernel_row_new();
void yon_kernel_resize(main_window *widgets);
void on_additional_software_toggled(GtkWidget *, char *path, main_window *widgets);
void yon_kernel_addon_setup(main_window *widgets);
void yon_kernel_addon_resize(main_window *widgets);
void yon_startup_services_setup(main_window *widgets);
void on_srartup_services_toggled(GtkWidget *, char *path, main_window *widgets);
void on_startup_service_edit(GtkWidget *, main_window *widgets);
void on_startup_service_add(GtkWidget *, main_window *widgets);
startup_service_window *yon_startup_service_window_new();
void on_startup_edit_accept(GtkWidget *, main_window *widgets);
void on_startup_add_accept(GtkWidget *, main_window *widgets);
void yon_startup_services_setup(main_window *widgets);
void on_startup_services_remove(GtkWidget *self,main_window *widgets);
void on_startup_services_selection_changed(GtkWidget *,main_window *widgets);
void on_pacman_software_all_toggled(GtkWidget *, char *path, main_window *widgets);
void on_pacman_software_chosen_toggled(GtkWidget *, char *path, main_window *widgets);
int yon_pacman_software_save(main_window *widgets);
void on_pacman_icon_press(GtkEntry *self,GtkEntryIconPosition icon_pos,GdkEvent* event,main_window *widgets);
gboolean yon_pacman_fill(struct pacman_struct *pacman);
void *yon_pacman_load(struct pacman_struct *pacman);
int yon_kernel_addon_save(main_window *widgets);
void yon_password_change(GtkWidget *, bootloader_user_window *window);
bootloader_user_window *yon_bootloader_user_window_new();
void on_bootloader_user_add(GtkWidget *, main_window *widgets);
void on_bootloader_user_accept(GtkWidget *, bootloader_user_window *window);
void yon_bootloader_interface_update(main_window *widgets);
void on_type_changed(GtkComboBox *self,network_info *info);
void yon_network_init(main_window *widgets);
void yon_page_init(main_window *widgets, enum YON_PAGES page);
void yon_bootloader_init(main_window *widgets);
void on_kernel_install_enabled(GtkWidget *, kernel_row *row);
void yon_user_init(main_window *widgets);
void yon_region_init(main_window *widgets);
void yon_keyboard_init(main_window *widgets);
void yon_install_init(main_window *widgets, enum YON_PAGES page);
void yon_install_advanced_init(main_window *widgets);
void yon_os_components_init(main_window *widgets);
void yon_pacman_init(main_window *widgets);
void yon_software_init(main_window *widgets);
void on_install_advanced_add_new(GtkWidget *, main_window *widgets);
void on_install_advanced_device_chosen(GtkCellRenderer*, gchar *path, main_window *widgets);
void on_install_advanced_partition_chosen(GtkCellRenderer*, gchar *path, main_window *widgets);
void yon_devices_setup(main_window *widgets);
void on_advanced_password_clicked(GtkWidget *, advanced_partition *part);
advanced_partition *yon_advanced_partition_new();
void yon_advanced_partition_setup(advanced_partition *part,main_window *widgets);
void on_advanced_part_remove(GtkWidget *self, main_window *widgets);
int yon_advanced_get_part_size(main_window *widgets);
void yon_advanced_set_part_sensitivity(main_window *widgets, gboolean state);
void yon_advanced_set_device_sensitivity(main_window *widgets, gboolean state);
void on_advanced_parts_removed(GtkWidget *,GtkWidget*,main_window *widgets);
void on_advanced_parts_added(GtkWidget *,GtkWidget*,main_window *widgets);
void yon_advanced_partition_clear(main_window *widgets);
void yon_layout_build(char *key, GHashTable *value, main_window *widgets);
void yon_os_row_setup(os_row *row, char *name, char *version,char *tags, char *description);
os_row *yon_os_row_new();
void yon_quick_install(GtkWidget *, main_window *widgets);
void on_keyboard_layout_chosen(GtkCellRenderer *self, gchar *path, main_window *widgets);
void configuration_mode_accept(GtkWidget *,configuration_window *window);
void on_path_choose(GtkWidget *,configuration_window *window);
void on_configuration_exit(GtkWidget *,configuration_window *window);
int yon_config_save(main_window *widgets);
void yon_config_restore(main_window *widgets);
void on_source_clicked(GtkWidget *,main_window *widgets);
source_window *yon_source_window_new();
void on_source_accept(GtkWidget *,source_window *window);
void on_source_choose(GtkWidget *self);
void on_source_remove(GtkWidget *,source_element *element);
void on_source_add(GtkWidget *,source_window *window);
void yon_source_update(source_window *window);
void yon_source_element_add(char *key,void*,source_window *window);
source_element *yon_source_element_new();
void on_system_setup_pass(GtkWidget *, main_window *widgets);
void yon_resize_images_update(main_window *widgets);
void on_vnc_toggled(GtkWidget *self, main_window *widgets);
void yon_main_window_create(main_window *widgets);
void set_locales_list(main_window *widgets);
void on_installer_language_changed(GtkWidget *self, main_window *widgets);
gboolean on_country_filter(GtkTreeModel *self, GtkTreeIter *iter, main_window *widgets);