From e5d334af1d784b8b37ff49f792956c2676010085 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 29 Oct 2015 09:04:32 +0100 Subject: [PATCH] =?UTF-8?q?fertige=20Flows=20und=20Update=20des=20Modules?= =?UTF-8?q?=20f=C3=BCr=20Version=200.8.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 74_AMAD.pm | 2 +- 74_AMADautomagicFlows0.7.9.xml | 1374 -------------------------------- 2 files changed, 1 insertion(+), 1375 deletions(-) delete mode 100644 74_AMADautomagicFlows0.7.9.xml diff --git a/74_AMAD.pm b/74_AMAD.pm index 29e9cf0..73041d2 100644 --- a/74_AMAD.pm +++ b/74_AMAD.pm @@ -35,7 +35,7 @@ use Time::HiRes qw(gettimeofday); use HttpUtils; use TcpServerUtils; -my $version = "0.7.11"; +my $version = "0.8.0"; diff --git a/74_AMADautomagicFlows0.7.9.xml b/74_AMADautomagicFlows0.7.9.xml deleted file mode 100644 index 7e5566d..0000000 --- a/74_AMADautomagicFlows0.7.9.xml +++ /dev/null @@ -1,1374 +0,0 @@ - - - - false - com.android.music.metachanged - true - com.android.music.metachanged - - - - - - - - global_artist = getString("artist"); -global_track = getString("track"); -global_album = getString("album"); - false - - - true - Display Status: Aus - false - false - - - true - Display Status: Ein - false - true - - - true - Globale Variable: global_own_reading - true - global_own_reading - - - true - Globale Variable: global_touched - false - global_touched - - - false - HTTP Request: /fhem-amad/deviceInfo/ - true - /fhem-amad/deviceInfo/ - 8090 - true - - - false - HTTP Request: /fhem-amad/setCommands/* - true - /fhem-amad/setCommands/* - 8090 - true - - - true - Periodischer Timer: alle 4m - false - 240000 - true - false - false - Mon - Tue - Wed - Thu - Fri - Sat - Sun - 8 - 0 - 17 - 0 - - - true - Akku Ladestand: grösser als 0% - 0 - HIGHER_THAN - - - false - App Task läuft: App3 (neuster) - - true - - - false - App Task läuft: App4 (neuster) - - true - - - false - App Task läuft: App5 (neuster) - - true - - - false - App Task läuft: gplay (neuster) - com.google.android.music - true - - - false - App Task läuft: tuneinradio (neuster) - tunein.player - true - - - true - App Task läuft: {header_activetask} (neuster) - {header_activetask} - true - - - false - Benachrichtigung in Statusbar angezeigt: Automagic - ch.gridvision.ppam.androidautomagic - TEXT - CONTAINS_TEXT - - false - false - - - true - Bluetooth eingeschaltet - - - true - Bluetooth Gerät verbunden: Beliebiges Geräte - true - - - - - true - Bluetooth Gerät verbunden: {param_btdeviceone} - false - {param_btdeviceone} - - - - true - Bluetooth Gerät verbunden: {param_btdevicetwo} - false - {param_btdevicetwo} - - - - true - Display automatisch drehen eingeschaltet - - - true - Display eingeschaltet - - - true - Display Orientierung: Portrait - true - - - false - Expression: All - param_app == "All" - - - false - Expression: App3 - param_app == "" - - - false - Expression: App4 - param_app == "" - - - false - Expression: App5 - param_app == "" - - - false - Expression: Automagic - param_app == "Automagic" - - - false - Expression: Clear Automagic Meldungen" - request_path == "/fhem-amad/setCommands/clearnotificationbar" - - - true - Expression: global_touched=="ja" - global_touched=="ja" - - - true - Expression: global_touched=="wait" - global_touched=="wait" - - - false - Expression: gplay - param_app == "gplay" - - - false - Expression: mediaPlayer" - request_path == "/fhem-amad/setCommands/mediaPlayer" - - - false - Expression: notifysnd" - request_path == "/fhem-amad/setCommands/playnotifysnd" - - - false - Expression: openApp" - request_path == "/fhem-amad/setCommands/openApp" - - - false - Expression: openURL" - request_path == "/fhem-amad/setCommands/openURL" - - - true - Expression: param_bluetooth == "off" - param_bluetooth == "off" - - - true - Expression: param_bluetooth == "on" - param_bluetooth == "on" - - - true - Expression: param_button == "back" - param_button == "back" - - - true - Expression: param_button == "next" - param_button == "next" - - - true - Expression: param_button == "play" - param_button == "play" - - - true - Expression: param_button == "stop" - param_button == "stop" - - - true - Expression: param_fullscreen == "off" - param_fullscreen == "off" - - - true - Expression: param_fullscreen == "on" - param_fullscreen == "on" - - - true - Expression: param_orientation == "auto" - param_orientation == "auto" - - - true - Expression: param_orientation == "landscape" - param_orientation == "landscape" - - - true - Expression: param_orientation == "portrait" - param_orientation == "portrait" - - - true - Expression: param_screen=="off" - param_screen=="off" - - - true - Expression: param_screen=="on" - param_screen=="on" - - - false - Expression: Reboot - param_syscmd == "reboot" - - - false - Expression: screenMsg" - request_path == "/fhem-amad/setCommands/screenMsg" - - - false - Expression: setAlarm" - request_path == "/fhem-amad/setCommands/setAlarm" - - - false - Expression: setBluetooth" - request_path == "/fhem-amad/setCommands/setbluetooth" - - - false - Expression: setBrightness" - request_path == "/fhem-amad/setCommands/setBrightness" - - - false - Expression: setBTDevice" - request_path == "/fhem-amad/setCommands/setbtdevice" - - - false - Expression: setScreenFullscreen" - request_path == "/fhem-amad/setCommands/setScreenFullscreen" - - - false - Expression: setScreenOnOff" - request_path == "/fhem-amad/setCommands/setScreenOnOff" - - - false - Expression: setScreenOrientation" - request_path == "/fhem-amad/setCommands/setScreenOrientation" - - - false - Expression: setVolume" - request_path == "/fhem-amad/setCommands/setVolume" - - - false - Expression: System Command" - request_path == "/fhem-amad/setCommands/systemcommand" - - - true - Expression: trigger == "com.android.music.metachanged" - trigger == "com.android.music.metachanged" - - - true - Expression: trigger == "Globale Variable: global_own_reading" - trigger == "Globale Variable: global_own_reading" - - - true - Expression: trigger == "HTTP Request: /fhem-amad/setCommands/*" - trigger == "HTTP Request: /fhem-amad/setCommands/*" - - - false - Expression: ttsMsg" - request_path == "/fhem-amad/setCommands/ttsMsg" - - - false - Expression: tuneinradio - param_app == "tuneinradio" - - - true - Flow Aktiv: Informations - Informations - - - true - Flow Aktiv: SetCommands - SetCommands - - - true - Musik Aktiv - - - true - WLAN Verbunden: Alle SSIDs - true - - - - false - App Starten: App3 - - - - - false - App Starten: App4 - - - - - false - App Starten: App5 - - - - - false - App Starten: PlayMusic - com.google.android.music - - - - false - App Starten: tuneinradio - tunein.player - - - - true - Audio Player steuern: Medienknopf Play (Google Play Musik) - true - LAUNCH - KEYCODE_MEDIA_PLAY - true - com.google.android.music - com.google.android.music.playback.MediaButtonIntentReceiver - Google Play Musik - - - true - Audio Player steuern: Medienknopf Stopp (Google Play Musik) - true - LAUNCH - KEYCODE_MEDIA_STOP - true - com.google.android.music - com.google.android.music.playback.MediaButtonIntentReceiver - Google Play Musik - - - true - Audio Player steuern: Medienknopf Weiter (Google Play Musik) - true - LAUNCH - KEYCODE_MEDIA_NEXT - true - com.google.android.music - com.google.android.music.playback.MediaButtonIntentReceiver - Google Play Musik - - - true - Audio Player steuern: Medienknopf Zurück (Google Play Musik) - true - LAUNCH - KEYCODE_MEDIA_PREVIOUS - true - com.google.android.music - com.google.android.music.playback.MediaButtonIntentReceiver - Google Play Musik - - - true - Benachrichtigung auf Bildschirm: {param_message} (lange) - true - {param_message} - - 200 - 250 - false - 1.0 - true - false - TOP_LEFT - 0 - 0 - - - true - Benachrichtigung aus Statusbar entfernen: Alle - false - true - 1 - true - - true - - - - true - Benachrichtigung aus Statusbar entfernen: Alle (Automagic) - true - true - 1 - false - - true - - - - true - Bluetooth ein-/ausschalten: Aus - false - - - true - Bluetooth ein-/ausschalten: Ein - true - - - true - Bluetooth Gerät verbinden/trennen: Trennen Advanced Audio Distribution {param_btdeviceone} - A2DP - {param_btdeviceone} - - false - - - true - Bluetooth Gerät verbinden/trennen: Trennen Advanced Audio Distribution {param_btdevicetwo} - A2DP - {param_btdevicetwo} - - false - - - true - Bluetooth Gerät verbinden/trennen: Trennen Eingabegerät {param_btdeviceone} - INPUT_DEVICE - {param_btdeviceone} - - false - - - true - Bluetooth Gerät verbinden/trennen: Trennen Eingabegerät {param_btdevicetwo} - INPUT_DEVICE - {param_btdevicetwo} - - false - - - true - Bluetooth Gerät verbinden/trennen: Trennen Headset {param_btdeviceone} - HEADSET - {param_btdeviceone} - - false - - - true - Bluetooth Gerät verbinden/trennen: Trennen Headset {param_btdevicetwo} - HEADSET - {param_btdevicetwo} - - false - - - true - Bluetooth Gerät verbinden/trennen: Trennen Personal Area Network {param_btdeviceone} - PAN - {param_btdeviceone} - - false - - - true - Bluetooth Gerät verbinden/trennen: Trennen Personal Area Network {param_btdevicetwo} - PAN - {param_btdevicetwo} - - false - - - true - Bluetooth Gerät verbinden/trennen: Verbinden Advanced Audio Distribution {param_swtobtdevicemac} - A2DP - {param_swtobtdevicemac} - - true - - - true - Display automatisch drehen ein-/ausschalten: Aus - false - - - true - Display automatisch drehen ein-/ausschalten: Ein - true - - - true - Gerät sperren - - - false - HTTP Response Information - powerLevel@@{battery_percentage}@@@@powerPlugged@@{battery_plugged}@@@@volumeMusikBluetooth@@{volumeMusikBluetooth}@@@@volumeMusikSpeaker@@{volumeMusikSpeaker}@@@@screenBrightness@@{screenBrightness}@@@@nextAlarmTime@@{next_alarmtime}@@@@nextAlarmDay@@{next_alarmday}@@@@screen@@{screen_state}@@@@automagicState@@{notification_text}@@@@screenOrientation@@{screen_orientation}@@@@currentMusicTrack@@{global_track}@@@@currentMusicAlbum@@{global_album}@@@@currentMusicArtist@@{global_artist}@@@@bluetooth@@{bluetooth_state}@@@@connectedBTdevices@@{connected_devices_names}@@@@connectedBTdevicesMAC@@{connected_devices_addresses}@@@@flow_SetCommands@@{setCommandFlow_state}@@@@checkActiveTask@@{runTask} - true - text/plain - - - false - HTTP Response SetCommand - flow_informations@@{informationFlow_state}@@@@ - true - text/plain - - - false - Initialisiere Variable Nächster Alarm: next_alarm - next_alarm - - - false - Initialisiere Variable Systemeinstellung: screenBrightness - SYSTEM - screen_brightness - screenBrightness - - - false - Initialisiere Variable Systemeinstellung: volumeMusikBluetooth - SYSTEM - volume_music_bt_a2dp - volumeMusikBluetooth - - - false - Initialisiere Variable Systemeinstellung: volumeMusikSpeaker - SYSTEM - volume_music_speaker - volumeMusikSpeaker - - - true - Kommandozeilenbefehl als Root ausführen: getevent -c 1 in - getevent -c 1 - - - stdout - stderr - exit_code - - - false - Lautstärken setzen - false - global_volume_alarm - false - global_volume_dtmf - true - param_volume - false - global_volume_notification - false - global_volume_ring - false - global_volume_system - false - global_volume_voice_call - false - global_ringer_mode - false - global_interruptions_mode - - - true - Neustart - - - - false - Own Reading - http://{global_fhemip}:8090 - false - false - - POST - GENERAL_TEXT - text/plain - {substring(getValue("global_own_reading",""),14)}@@{replaceAll(getValue("global_{substring(getValue('global_own_reading',''),14)}","nicht gefunden"),"\\s","%20")}@@@@ - @@@@readingsNameXYZ@@readingsValueABC - 5000 - true - FHEMDEVICE: {global_fhemdevice} -FHEMCMD: setreading - true - response - /storage/emulated/0/Download/file.bin - - - true - Pause: 10s (Schlafmodus zulassen) - 10s - false - - - true - Pause: 15s (Gerät wach halten) - 15s - true - - - true - Pause: 2s (Gerät wach halten) - 2s - true - - - true - Pause: 3s (Gerät wach halten) - 3s - true - - - false - Reading Music Metachanged - http://{global_fhemip}:8090 - false - false - - POST - GENERAL_TEXT - text/plain - currentMusicTrack@@{global_track}@@@@currentMusicAlbum@@{global_album}@@@@currentMusicArtist@@{global_artist}@@@@ - @@@@readingsNameXYZ@@readingsValueABC - 5000 - true - FHEMDEVICE: {global_fhemdevice} -FHEMCMD: setreading - true - response - /storage/emulated/0/Download/file.bin - - - true - Schalte Display ein: Hell für 120s - true - 120s - true - - - true - Script: bluetooth_state = "off" - - - - true - Script: bluetooth_state = "on" - - - - true - Script: global_artist = "no soundplayer activ"; global_track = "no soundplayer activ"; global_album = "no soundplayer activ"; - - - - true - Script: global_display="an";global_own_reading="{getDate()}_display" - - - - true - Script: global_display="aus";global_own_reading="{getDate()}_display" - - - - true - Script: global_fhemip = {header_fhemip} global_fhemdevice = {header_fhemdevice} - - - - true - Script: global_touch="ja";global_own_reading="{getDate()}_touch";global_touched="ja" - - - - true - Script: global_touch="nein";global_own_reading="{getDate()}_touch" - - - - true - Script: global_touched="ja" - - - - true - Script: global_touched="wait" - - - - true - Script: informationFlow_state = "aktiv" - - - - true - Script: informationFlow_state = "inaktiv" - - - - true - Script: next_alarmday = "{next_alarm,dateformat,c}" - - - - true - Script: next_alarmtime = "{next_alarm,dateformat,HH:mm}" - - - - true - Script: notification_text = "no supported from your device" - - - - true - Script: runTask = "0" - - - - true - Script: runTask = "1" - - - - true - Script: screen_orientation = "auto" - - - - true - Script: screen_orientation = "landscape" - - - - true - Script: screen_orientation = "portrait" - - - - true - Script: screen_state = "off" - - - - true - Script: screen_state = "on" - - - - true - Script: setCommandFlow_state = "aktiv" - - - - true - Script: setCommandFlow_state = "inaktiv" - - - - true - Setze Alarm: um {param_hour}:{param_minute} - - {param_hour} - {param_minute} - - - true - Setze Display Orientierung: Auf Default zurücksetzen - UNSPECIFIED - false - - - true - Setze Display Orientierung: Landscape - LANDSCAPE - false - - - true - Setze Display Orientierung: Portrait - PORTRAIT - false - - - true - Setze Flow Status: Aktivieren Informations - true - Informations - - - - true - Setze Flow Status: Aktivieren SetCommands - true - SetCommands - - - - true - Setze Systemeinstellung: System screen_brightness auf {param_brightness} - SYSTEM - screen_brightness - {param_brightness} - true - - - true - Setze Vollbild Modus: Auf Default zurücksetzen - UNSPECIFIED - false - - - true - Setze Vollbild Modus: Navigation nicht anzeigen - HIDE_NAVIGATION - false - - - true - Sound: /storage/emulated/0/Notifications/{param_notifyfile} als Benachrichtigung - FILE - Lautlos - /storage/emulated/0/Notifications/{param_notifyfile} - NOTIFICATION - false - true - true - TRANSIENT - - - true - Sprachausgabe: {param_message} - MUSIC - {param_message} - de_DE - true - 1.0 - true - 1.0 - true - false - false - true - TRANSIENT - - - false - StatusRequest - http://{global_fhemip}:8090 - false - false - - POST - GENERAL_TEXT - text/plain - - @@@@readingsNameXYZ@@readingsValueABC - 5000 - true - FHEMDEVICE: {global_fhemdevice} -FHEMCMD: statusrequest - true - response - /storage/emulated/0/Download/file.bin - - - true - URL in Browser öffnen: {param_url} (mit Chrome) - {param_url} - true - com.android.chrome - com.google.android.apps.chrome.Main - Chrome - - - Informations - FHEM Info / Steuerung über AMAD Modul v0.7.9 - true - QUEUE - 120 - Script: notification_text = "no supported from your device" - Script: screen_orientation = "auto" - Display automatisch drehen eingeschaltet - Script: screen_orientation = "portrait" - Display Orientierung: Portrait - Script: screen_orientation = "landscape" - Bluetooth eingeschaltet - Script: bluetooth_state = "off" - Script: screen_state = "off" - Script: screen_state = "on" - Display eingeschaltet - Script: next_alarmtime = "{next_alarm,dateformat,HH:mm}" - Initialisiere Variable Nächster Alarm: next_alarm - Script: next_alarmday = "{next_alarm,dateformat,c}" - Initialisiere Variable Systemeinstellung: screenBrightness - Initialisiere Variable Systemeinstellung: volumeMusikSpeaker - Initialisiere Variable Systemeinstellung: volumeMusikBluetooth - Flow Aktiv: SetCommands - Script: setCommandFlow_state = "aktiv" - Setze Flow Status: Aktivieren SetCommands - Script: global_artist = "no soundplayer activ"; global_track = "no soundplayer activ"; global_album = "no soundplayer activ"; - Musik Aktiv - Pause: 2s (Gerät wach halten) - Expression: trigger == "com.android.music.metachanged" - Expression: trigger == "Globale Variable: global_own_reading" - WLAN Verbunden: Alle SSIDs - WLAN Verbunden: Alle SSIDs - Script: bluetooth_state = "on" - Bluetooth Gerät verbunden: Beliebiges Geräte - Akku Ladestand: grösser als 0% - Script: setCommandFlow_state = "inaktiv" - Script: global_fhemip = {header_fhemip} global_fhemdevice = {header_fhemdevice} - App Task läuft: {header_activetask} (neuster) - Script: runTask = "0" - Script: runTask = "1" - Reading Music Metachanged - Own Reading - HTTP Response Information - Benachrichtigung in Statusbar angezeigt: Automagic - - HTTP Request: /fhem-amad/deviceInfo/ - com.android.music.metachanged - Globale Variable: global_own_reading - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Meldung Display An - AMAD FHEM / OwnReadings Examples - false - PARALLEL - - Display Status: Ein - - Script: global_display="an";global_own_reading="{getDate()}_display" - - - - Meldung Display Aus - AMAD FHEM / OwnReadings Examples - false - PARALLEL - - Display Status: Aus - - Script: global_display="aus";global_own_reading="{getDate()}_display" - - - - Meldung kein Touch - AMAD FHEM / OwnReadings Examples - false - STOP - - Globale Variable: global_touched - - Pause: 15s (Gerät wach halten) - Script: global_touched="wait" - Expression: global_touched=="ja" - Expression: global_touched=="wait" - Script: global_touch="nein";global_own_reading="{getDate()}_touch" - - - - - - - - Meldung Touch - AMAD FHEM / OwnReadings Examples - false - STOP - - Periodischer Timer: alle 4m - - Kommandozeilenbefehl als Root ausführen: getevent -c 1 in - Script: global_touched="ja" - Script: global_touch="ja";global_own_reading="{getDate()}_touch";global_touched="ja" - Pause: 10s (Schlafmodus zulassen) - - - - - - - - SetCommands - FHEM Info / Steuerung über AMAD Modul v0.7.9 - true - QUEUE - 120 - - HTTP Request: /fhem-amad/deviceInfo/ - HTTP Request: /fhem-amad/setCommands/* - - Expression: param_screen=="on" - Expression: setBrightness" - Expression: setAlarm" - Expression: screenMsg" - URL in Browser öffnen: {param_url} (mit Chrome) - Benachrichtigung auf Bildschirm: {param_message} (lange) - Expression: setScreenFullscreen" - Expression: param_orientation == "auto" - Setze Display Orientierung: Portrait - Setze Display Orientierung: Landscape - Expression: param_orientation == "landscape" - Expression: param_orientation == "portrait" - Setze Vollbild Modus: Navigation nicht anzeigen - Setze Vollbild Modus: Auf Default zurücksetzen - Audio Player steuern: Medienknopf Zurück (Google Play Musik) - Expression: param_button == "back" - Expression: param_button == "next" - Setze Display Orientierung: Auf Default zurücksetzen - Expression: param_button == "play" - Expression: mediaPlayer" - Audio Player steuern: Medienknopf Weiter (Google Play Musik) - Expression: param_button == "stop" - Expression: param_screen=="off" - Gerät sperren - Expression: setScreenOnOff" - App Task läuft: App5 (neuster) - Expression: App5 - Expression: App4 - App Task läuft: App3 (neuster) - Expression: App3 - App Starten: App3 - App Starten: App4 - App Task läuft: App4 (neuster) - Expression: tuneinradio - App Task läuft: tuneinradio (neuster) - App Starten: tuneinradio - App Starten: App5 - App Task läuft: gplay (neuster) - Expression: gplay - App Starten: PlayMusic - Expression: System Command" - Neustart - Setze Flow Status: Aktivieren Informations - Script: informationFlow_state = "inaktiv" - Script: informationFlow_state = "aktiv" - Flow Aktiv: Informations - Expression: ttsMsg" - Lautstärken setzen - Setze Systemeinstellung: System screen_brightness auf {param_brightness} - Schalte Display ein: Hell für 120s - Display automatisch drehen ein-/ausschalten: Aus - Display automatisch drehen ein-/ausschalten: Ein - Setze Alarm: um {param_hour}:{param_minute} - Audio Player steuern: Medienknopf Stopp (Google Play Musik) - Expression: setScreenOrientation" - Expression: param_fullscreen == "off" - Expression: param_fullscreen == "on" - Expression: setBluetooth" - Expression: openURL" - Expression: setVolume" - Sprachausgabe: {param_message} - Sound: /storage/emulated/0/Notifications/{param_notifyfile} als Benachrichtigung - StatusRequest - Expression: param_bluetooth == "off" - Bluetooth ein-/ausschalten: Aus - Expression: param_bluetooth == "on" - Bluetooth ein-/ausschalten: Ein - Expression: setBTDevice" - Bluetooth eingeschaltet - Bluetooth Gerät verbinden/trennen: Trennen Advanced Audio Distribution {param_btdeviceone} - Bluetooth Gerät verbinden/trennen: Trennen Personal Area Network {param_btdeviceone} - Bluetooth Gerät verbinden/trennen: Trennen Eingabegerät {param_btdeviceone} - Bluetooth Gerät verbinden/trennen: Trennen Headset {param_btdevicetwo} - Bluetooth Gerät verbinden/trennen: Trennen Advanced Audio Distribution {param_btdevicetwo} - Bluetooth Gerät verbinden/trennen: Trennen Eingabegerät {param_btdevicetwo} - Bluetooth Gerät verbinden/trennen: Trennen Personal Area Network {param_btdevicetwo} - HTTP Response SetCommand - Bluetooth Gerät verbunden: {param_btdeviceone} - Bluetooth Gerät verbunden: {param_btdevicetwo} - Bluetooth Gerät verbinden/trennen: Trennen Headset {param_btdeviceone} - Bluetooth Gerät verbinden/trennen: Verbinden Advanced Audio Distribution {param_swtobtdevicemac} - Pause: 3s (Gerät wach halten) - Expression: notifysnd" - Audio Player steuern: Medienknopf Play (Google Play Musik) - Expression: openApp" - Expression: trigger == "HTTP Request: /fhem-amad/setCommands/*" - Expression: Reboot - Benachrichtigung aus Statusbar entfernen: Alle - Expression: All - Benachrichtigung aus Statusbar entfernen: Alle (Automagic) - Expression: Automagic - Expression: Clear Automagic Meldungen" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file