Fehler E/libc(10939): mmap fail (pid 10939, tid 10960, size 20971

  • 8 Antworten
  • Letztes Antwortdatum
A

Anojo

Neues Mitglied
1
hi hi,

ich hab auf ein mal ein Fehler was wohl mit meiner Datenbank zu tun hat blick nicht was damit gemeint ist.

Ich hoffe jemand kann mir helfen, ist ganz wichtig da die app schon online ist und ich nicht weiter komm.

Hier mal die Fehlermeldung...

Code:
10-26 01:41:52.900: E/libc(10939): mmap fail (pid 10939, tid 10960, size 2097152, flags 0x1, errno 12(Out of memory))
10-26 01:41:52.900: E/CursorWindow(10939): Fail on mmap of ashmemFd: 742,  errno: 12, msg: Out of memory
10-26 01:41:52.900: E/CursorWindow(10939): Could not allocate CursorWindow '//data//data//de.ap.test/databases//test.db' of size 2097152 due to error -12.
10-26 01:41:52.910: W/dalvikvm(10939): threadid=15: thread exiting with uncaught exception (group=0x414c5ba0)

wenn ich sie im Emulator laufen lasse kommt der Fehler nicht, nur auf dem Handy.

Ist eventuell der speicher voll?
 
Komischerweise kommt der Fehler auch nicht wenn ich alle Daten lösche, und die app dann starte.


Gesendet von meinem HTC One mit der Android-Hilfe.de App
 
Anojo schrieb:
Ist eventuell der speicher voll?

Woher sollen wir jetzt wissen ob dein Gerätespeicher voll ist? ;) Da musst du schon selbst nachschauen ...
 
Ja ich mein nicht vom Handy sonder das Android vielleicht ein Speicher vorhält für die db oder dem Cursor oder so.


Gesendet von meinem HTC One mit der Android-Hilfe.de App

Der ursprüngliche Beitrag von 14:48 Uhr wurde um 16:39 Uhr ergänzt:

hier noch die Meldung wo sie dann abschmiert...

hab mich mal umgeschaut und finde ständig das es am Cursor liegt wenn man sie nicht schließt.
ich hab jetzt extra alle nochmal angeschaut und geschlossen aber der Fehler kommt trotzdem.

Code:
10-26 01:41:52.910: E/AndroidRuntime(10939): FATAL EXCEPTION: Thread-12103
10-26 01:41:52.910: E/AndroidRuntime(10939): android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=640 (# cursors opened by this proc=640)
 
Okay, vll. liegt es am Cursor ...
Machst du vll. sowas?:
java - Android CursorWindowAllocationException - Stack Overflow

Aber ohne den entsprechenden Teil des Quellcodes nur im Ansatz zu sehen, kann man dir nicht weiterhelfen. Ebenso wenig, wenn du nur zwei Zeilen der Fehlermeldung rauskopierst. (Kurzer Vergleich: Ich gehe in die Autowerkstatt, bringe meine linkes Hinterrad mit und sage: "Hinten höre ich ein seltsames Geräusch, könnte von den Reifen kommen". Auf Nachfrage hole ich das zweite Hinterrad und frage wieder "Woran könnte es liegen" und dann soll der Werkstattleiter mir sagen woran es an meinem Auto hapert ;))
 
Oh sorry, hab gedacht vielleicht kennt jemand den Fehler...

hier die komplette Meldung:
Code:
10-26 01:41:52.499: D/qdmemalloc(10939): ion: Mapped buffer base:0x740dc000 size:8355840 offset:0 fd:152
10-26 01:41:52.499: D/qdmemalloc(10939): ion: Mapped buffer base:0x74ad4000 size:4096 offset:0 fd:153
10-26 01:41:52.509: W/dalvikvm(10939): [GC Control] disableGcForExternalAlloc: false
10-26 01:41:52.509: W/dalvikvm(10939): [GC Control] disableGcForExternalAlloc: false
10-26 01:41:52.509: W/dalvikvm(10939): [GC Control] disableGcForExternalAlloc: false
10-26 01:41:52.649: D/qdmemalloc(10939): ion: Mapped buffer base:0x8b9b0000 size:8355840 offset:0 fd:337
10-26 01:41:52.649: D/qdmemalloc(10939): ion: Mapped buffer base:0x7e167000 size:4096 offset:0 fd:338
10-26 01:41:52.649: W/dalvikvm(10939): [GC Control] disableGcForExternalAlloc: false
10-26 01:41:52.649: W/dalvikvm(10939): [GC Control] disableGcForExternalAlloc: false
10-26 01:41:52.649: W/dalvikvm(10939): [GC Control] disableGcForExternalAlloc: false
10-26 01:41:52.649: W/dalvikvm(10939): [GC Control] disableGcForExternalAlloc: false
10-26 01:41:52.900: E/libc(10939): mmap fail (pid 10939, tid 10960, size 2097152, flags 0x1, errno 12(Out of memory))
10-26 01:41:52.900: E/CursorWindow(10939): Fail on mmap of ashmemFd: 742,  errno: 12, msg: Out of memory
10-26 01:41:52.900: E/CursorWindow(10939): Could not allocate CursorWindow '//data//data//de.ap.test//databases//test.db' of size 2097152 due to error -12.
10-26 01:41:52.910: W/dalvikvm(10939): threadid=15: thread exiting with uncaught exception (group=0x414c5ba0)
10-26 01:41:52.910: E/AndroidRuntime(10939): FATAL EXCEPTION: Thread-12103
10-26 01:41:52.910: E/AndroidRuntime(10939): android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=640 (# cursors opened by this proc=640)
10-26 01:41:52.910: E/AndroidRuntime(10939): 	at android.database.CursorWindow.<init>(CursorWindow.java:156)
10-26 01:41:52.910: E/AndroidRuntime(10939): 	at android.database.CursorWindow.<init>(CursorWindow.java:124)
10-26 01:41:52.910: E/AndroidRuntime(10939): 	at android.database.AbstractWindowedCursor.generateNewWindowCursor(AbstractWindowedCursor.java:194)
10-26 01:41:52.910: E/AndroidRuntime(10939): 	at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:209)
10-26 01:41:52.910: E/AndroidRuntime(10939): 	at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:161)
10-26 01:41:52.910: E/AndroidRuntime(10939): 	at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:155)
10-26 01:41:52.910: E/AndroidRuntime(10939): 	at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
10-26 01:41:52.910: E/AndroidRuntime(10939): 	at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237)
10-26 01:41:52.910: E/AndroidRuntime(10939): 	at de.ap.test.DatenbankHandlerInet$1.run(DatenbankHandlerInet.java:181)
10-26 01:41:53.020: W/dalvikvm(10939): [GC Control] disableGcForExternalAlloc: false
10-26 01:41:53.020: W/dalvikvm(10939): [GC Control] disableGcForExternalAlloc: false
10-26 01:41:53.020: W/dalvikvm(10939): [GC Control] disableGcForExternalAlloc: false
10-26 01:41:53.150: D/qdmemalloc(10939): ion: Unmapping buffer  base:0x6d389000 size:8355840
10-26 01:41:53.150: D/qdmemalloc(10939): ion: Unmapping buffer  base:0x6db81000 size:4096
10-26 01:41:53.150: D/qdmemalloc(10939): ion: Unmapping buffer  base:0x740dc000 size:8355840
10-26 01:41:53.150: D/qdmemalloc(10939): ion: Unmapping buffer  base:0x74ad4000 size:4096
10-26 01:41:53.150: D/qdmemalloc(10939): ion: Unmapping buffer  base:0x8b9b0000 size:8355840
10-26 01:41:53.150: D/qdmemalloc(10939): ion: Unmapping buffer  base:0x7e167000 size:4096

der Code wo ich es vermute ist der da:
Code:
package de.ap.test;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.annotation.TargetApi;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.util.Log;

public class DatenbankHandlerInet extends Activity {

	private static final String TAG = DatenbankHandlerInet.class
			.getSimpleName();

	// für Dateneingang und Speichern
	private InputStream is;
	JSONObject json_data;
	private Datenbank openHandler;
	private boolean dbExist = true;
	private MainActivity main;

	// zum Löschen falscher oder Abgelaufener Partnerschaften
	private List<Integer> notIn = new ArrayList<Integer>();

	// fals verbindung fehlschlägt
	private int fehler;
	private final int ANZAHL = 20;
	
	//Wenn 30 werte gesammelt wurden sende Json an php
	private boolean fertig = false;
	private ArrayList<Integer> postList= new ArrayList<Integer>();
	private ArrayList<Integer> postListUpdate= new ArrayList<Integer>();
	private int notFertig = 0;
	private int notFertigUpdate = 0;

	// Spalten von der Datenbank
	private int id;
	private String version;
	private String anbieter;
	private String kurztext;
	private String code_html;
	private String banner;
	private String bemerkung;
	private String code_klartext;
	private String gueltig_bis;
	private String kategorie;
	private long gueltig_bisTime;
	private String logo;

	@TargetApi(11)
	public void getData() {

		Thread t = new Thread() {

			private String result = "";

			/*
			 * (non-Javadoc)
			 * 
			 * @see java.lang.Thread#run()
			 */
			public void run() {
				ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

				while (fehler != ANZAHL) {
					try {
						Log.d(TAG, "Verbindung zur Datenbank wird hergestellt!");

						HttpClient httpclient = new DefaultHttpClient();
						HttpPost httppost = new HttpPost(
								"http://xxx");
						httppost.setEntity(new UrlEncodedFormEntity(
								nameValuePairs));
						HttpResponse response = httpclient.execute(httppost);
						HttpEntity entity = response.getEntity();
						is = entity.getContent();

						fehler = ANZAHL;
					} catch (Exception e) {

						if (fehler == ANZAHL - 1) {
							SQLiteDatabase db = SQLiteDatabase
									.openDatabase(Datenbank.dbPfad
											+ Datenbank.DATENBANK_NAME, null,
											SQLiteDatabase.OPEN_READWRITE);

							löschen(db);
							main.progressStop();
							main.setNetzwerkfehler(true);

						}
						fehler++;
						try {
							sleep(400);
						} catch (InterruptedException e1) {

							e1.printStackTrace();
						}

						Log.e(TAG,
								"Fehler bei der http Verbindung "
										+ e.toString());
					}
				}

				try {
					BufferedReader reader = new BufferedReader(
							new InputStreamReader(is, "iso-8859-1"), 8);
					StringBuilder sb = new StringBuilder();
					String line = null;
					while ((line = reader.readLine()) != null) {
						sb.append(line + "n");
					}
					is.close();
					result = sb.toString();
				} catch (Exception e) {
					Log.e(TAG, "Error converting result " + e.toString());
				}

				JSONArray jArray;
				try {
					jArray = new JSONArray(result);

					Cursor cursor = null;
					SQLiteDatabase db = SQLiteDatabase.openDatabase(
							Datenbank.dbPfad + Datenbank.DATENBANK_NAME, null,
							SQLiteDatabase.OPEN_READWRITE);

					if (isDbExist() == true) {

						for (int i = 0; i < jArray.length(); i++) {

							try {
								json_data = jArray.getJSONObject(i);
								id = json_data.getInt("id");
								version = json_data.getString("version");
								
								// Zum löschen von daten die nicht im Datenabgleich vorhanden sind 
								notIn.add(id);

							} catch (JSONException e) {
								Log.e(TAG, "Error parsing data " + e.toString());
							}
							
							cursor = db.rawQuery("SELECT "
									+ Datenbank.SPALTE_VERSION + " FROM "
									+ Datenbank.TABLE_NAME_DATEN + " WHERE "
									+ Datenbank._ID + " = " + id + ";", null);

							cursor.moveToFirst();

							if (cursor.getCount() == 1) {
								// wenn Datensatz existiert aber version nicht
								// gleich
								if (!cursor.getString(0).equals(version)) {
									getDataFullUpdate(id, db);

									Log.d(TAG, "Update id = " + id
											+ "| version = " + version);
								}
							} else if (cursor.getCount() == 0) {
								// Wenn Datensatz nicht existiert
								getDataFull(id, db);

								Log.d(TAG, "Insert id = " + id + "| version = "
										+ version);
							}

						}
						cursor.close();
						fertig = true;
						getDataFull(-1, db);
						löschen(db);

					} else {

						for (int i = 0; i < jArray.length(); i++) {

							try {
								json_data = jArray.getJSONObject(i);
								id = json_data.getInt("id");
								version = (String) json_data.get("version");

								Log.d(TAG, "id = " + id + " als version = "
										+ version + " wird heruntergeladen");

							} catch (JSONException e) {
								Log.e(TAG, "Error parsing data " + e.toString());
							}

							getDataFull(id, db);
				}
						fertig = true;
						getDataFull(-1, db);
						löschen(db);
						main.progressStop();

					}

				} catch (JSONException e) {

					e.printStackTrace();
				}
				main.progressStop();
				
			}

		};

		openHandler = new Datenbank(this);
		main = new MainActivity();

		t.start();
		

	}

	public void getDataFull(int id, SQLiteDatabase db) {
		
		if(fertig || notFertig == 30){
			if(id != -1){
				postList.add(id);
			}
			notFertig = 0;
			String result = "";
			String post = "";
		
		for(int i = 0; i < postList.size(); i++){
			post += postList.get(i);
			if(i < postList.size()-1){
				post += ", ";
			}
		}
		postList.clear();
		
		ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		nameValuePairs.add(new BasicNameValuePair("post", post));

		try {
			Log.d(TAG, "Verbindung zur Datenbank wird hergestellt!");
			
			HttpClient httpclient = new DefaultHttpClient();
			HttpPost httppost = new HttpPost("https://www.ssl-id.de/xxx");
			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
			HttpResponse response = httpclient.execute(httppost);
			HttpEntity entity = response.getEntity();
			is = entity.getContent(); 
		} catch (Exception e) {
			Log.e(TAG, "Fehler bei der http Verbindung " + e.toString());
		}

		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					is, "iso-8859-1"), 8);
			StringBuilder sb = new StringBuilder();
			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line + "n");
			}
			is.close();
			result = sb.toString();
		} catch (Exception e) {
			Log.e(TAG, "Error converting result " + e.toString());
		}

		JSONArray jArray;

		try {
			jArray = new JSONArray(result);

			for (int i = 0; i < jArray.length(); i++) {
			json_data = jArray.getJSONObject(i);
			id = json_data.getInt("id");
			version = json_data.getString("version");
			anbieter = json_data.getString("anbieter");
			kurztext = json_data.getString("kurztext");
			code_html = json_data.getString("code_html");
			banner = json_data.getString("banner");
			bemerkung = json_data.getString("bemerkung");
			code_klartext = json_data.getString("code_klartext");
			gueltig_bis = json_data.getString("gueltig_bis");
			kategorie = json_data.getString("kategorie");
			logo = json_data.getString("logo");

			Date df = null;
			Date d = null;
			try {
				df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
						.parse(gueltig_bis);
				d = new Date(System.currentTimeMillis());

			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
				if (df.getTime() > d.getTime()) {
					gueltig_bisTime = df.getTime();
						openHandler.insert(id, version, anbieter, kurztext,
								code_html, banner, bemerkung,
								code_klartext, gueltig_bisTime, kategorie, logo, db);

					
				}
			}
			Log.d(TAG, "Insert Paket ist fertig!");
			
			} catch (JSONException e) {
				Log.e(TAG, "Error parsing data " + e.toString());
			}
		
		} else {
			
			postList.add(id);
			notFertig++;
			
		}
		
		if(fertig){
			getDataFullUpdate(-1, db);
		}

	}
	
public void getDataFullUpdate(int id, SQLiteDatabase db) {
		
		if(fertig || notFertigUpdate == 30){
			if(id != -1){
				postList.add(id);
			}
			notFertig = 0;
			String result = "";
			String post = "";
		
		for(int i = 0; i < postListUpdate.size(); i++){
			post += postListUpdate.get(i);
			if(i < postListUpdate.size()-1){
				post += ", ";
			}
		}
		postListUpdate.clear();
		
		ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		nameValuePairs.add(new BasicNameValuePair("post", post));

		try {
			Log.d(TAG, "Verbindung zur Datenbank wird hergestellt!");
			
			HttpClient httpclient = new DefaultHttpClient();
			HttpPost httppost = new HttpPost("https://www.ssl-id.de/XXX");
			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
			HttpResponse response = httpclient.execute(httppost);
			HttpEntity entity = response.getEntity();
			is = entity.getContent(); 
		} catch (Exception e) {
			Log.e(TAG, "Fehler bei der http Verbindung " + e.toString());
		}

		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					is, "iso-8859-1"), 8);
			StringBuilder sb = new StringBuilder();
			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line + "n");
			}
			is.close();
			result = sb.toString();
		} catch (Exception e) {
			Log.e(TAG, "Error converting result " + e.toString());
		}

		JSONArray jArray;

		try {
			jArray = new JSONArray(result);

			for (int i = 0; i < jArray.length(); i++) {
			json_data = jArray.getJSONObject(i);
			id = json_data.getInt("id");
			version = json_data.getString("version");
			anbieter = json_data.getString("anbieter");
			kurztext = json_data.getString("kurztext");
			code_html = json_data.getString("code_html");
			banner = json_data.getString("banner");
			bemerkung = json_data.getString("bemerkung");
			code_klartext = json_data.getString("code_klartext");
			gueltig_bis = json_data.getString("gueltig_bis");
			kategorie = json_data.getString("kategorie");
			logo = json_data.getString("logo");

			Date df = null;
			Date d = null;
			try {
				df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
						.parse(gueltig_bis);
				d = new Date(System.currentTimeMillis());

			} catch (ParseException e) {
				
				e.printStackTrace();
			}
				if (df.getTime() > d.getTime()) {
					gueltig_bisTime = df.getTime();
					openHandler.update(id, version, anbieter, kurztext,
							code_html, banner, bemerkung,
							code_klartext, gueltig_bisTime, kategorie, logo, db);;
					

					
				}
			}
			Log.d(TAG, "Update Packet ist fertig!");

			} catch (JSONException e) {
				Log.e(TAG, "Error parsing data " + e.toString());
			}
		
		} else {
			
			postListUpdate.add(id);
			notFertigUpdate++;
			
		}

	}

	public boolean isDbExist() {

		return dbExist;
	}

	public void setDbExist(boolean dbExist) {
		this.dbExist = dbExist;
	}

	private void löschen(SQLiteDatabase db) {
		
		
		openHandler.delete(System.currentTimeMillis(), db);
		Log.d(TAG, "alle veralteten daten wurden gelöscht" );
		
	
			if (!notIn.isEmpty()) {
				openHandler.ungueltig(notIn, db);
			}

			db.close();


	}

}


Der ursprüngliche Beitrag von 17:14 Uhr wurde um 17:42 Uhr ergänzt:

komischerweise hat das alles ja ein halbes Jahr ohne Probleme funktioniert und jetzt zickt er auf ein mal rum
 
Zuletzt bearbeitet:
Was genau soll das einzeln dastehende cursor.moveToFirst()? ;)
Cursor | Android Developers)

Mach ein if (cursor.moveToFirst()){} draus ;)


"private void löschen(SQLiteDatabase db)" sehe ich da gerade nicht richtig oder was soll das "löschen" ;)

Du initalisiert dbExist gleich mal mit true, setDbExist rufst du jedoch nie auf, d.h. das Ding ist immer true ...

Vll. lad ichs später in Eclipse/Android Studio und schau noch genauer drüber.
 
das mit dem löschen ist der befehl das er damit anfangen soll alle alten daten zu löschen die ich davor schon gesammelt habe.

dbexist steuer ich von einen anderen activity aus der davor mal durchtestet ob überhaupt eine da ist und wenn nicht kann er sich sparen nach Datensätze zu suchen weil ja noch keine db vorhanden ist...
Also gleich alles rein laden

Der ursprüngliche Beitrag von 18:19 Uhr wurde um 18:24 Uhr ergänzt:

kleinerkathe schrieb:
Mach ein if (cursor.moveToFirst()){} draus ;)

hat nichts gebracht :crying:

Der ursprüngliche Beitrag von 18:24 Uhr wurde um 19:09 Uhr ergänzt:

ich habs :thumbsup::lol::biggrin:

war doch der cursor...
Ich hab ihn immer überschrieben statt ihn geschlossen, ich hab in die schleife am ende jetzt den befehl cursor.close; eingebaut und jetzt gehts.

also anstatt ihn zu überschreiben schließe ich ihn und und dann überschreibe ich ihn.

Blick zwar nicht was der unterschied sein soll weil er ja gleich wieder geöffnet wir und überschrieben aber meine app kackt nicht mehr ab.

für die wo es Interresiert hier der code...

PHP:
				try {
					jArray = new JSONArray(result);

					Cursor cursor = null;
					SQLiteDatabase db = SQLiteDatabase.openDatabase(
							Datenbank.dbPfad + Datenbank.DATENBANK_NAME, null,
							SQLiteDatabase.OPEN_READWRITE);

					if (isDbExist() == true) {

						for (int i = 0; i < jArray.length(); i++) {

							try {
								json_data = jArray.getJSONObject(i);
								id = json_data.getInt("id");
								version = json_data.getString("version");

								// Zum löschen von daten die nicht im
								// Datenabgleich vorhanden sind
								notIn.add(id);

							} catch (JSONException e) {
								Log.e(TAG, "Error parsing data " + e.toString());
							}

							cursor = db.rawQuery("SELECT "
									+ Datenbank.SPALTE_VERSION + " FROM "
									+ Datenbank.TABLE_NAME_DATEN + " WHERE "
									+ Datenbank._ID + " = " + id + ";", null);

							cursor.moveToFirst();

							if (cursor.getCount() == 1) {
								// wenn Datensatz existiert aber version nicht
								// gleich
								if (!cursor.getString(0).equals(version)) {
									getDataFullUpdate(id, db);

									Log.d(TAG, "Update id = " + id
											+ "| version = " + version);
									
								}
							} else if (cursor.getCount() == 0) {
								// Wenn Datensatz nicht existiert
								getDataFull(id, db);

								Log.d(TAG, "Insert id = " + id + "| version = "
										+ version);
								
							}
							cursor.close();

						}


Der ursprüngliche Beitrag von 19:09 Uhr wurde um 19:29 Uhr ergänzt:

Trotzdem danke für deine Unterstützung!

Ich schließe jetzt den Thread.
 
Die If-bedingung sollte dennoch um den Cursor-Block herum ;)

Und das mit löschen ... ich red nicht mal von der Konvention alles englischsprachig zu machen, dass kann jeder handhaben wie er möchte, sondern vom ö ... Umlaute würde ich tunlichst vermeiden, ich find zwar auf die Schnelle nichts, was meine Meinung untermauern würde, aber Sonderzeichen waren immer böse ;)
 
Zurück
Oben Unten