diff --git a/.gitignore b/.gitignore index dd364d2..d9b9707 100644 --- a/.gitignore +++ b/.gitignore @@ -133,3 +133,5 @@ local.properties # TeXlipse plugin .texlipse + +manifest-merger-release-report.txt diff --git a/.travis.yml b/.travis.yml index bd3f390..6241e8f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,11 @@ language: android android: components: - - platform-tools - - android-16 - - build-tools-21.1.2 - - extra + - tools + - build-tools-23.0.3 + - android-23 + - platform-tools + - extra-android-m2repository jdk: oraclejdk7 diff --git a/README.md b/README.md index 46f59f6..a2dbeb1 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,25 @@ +# *LIBRARY IS NO LONGER MAINTAINED* +If you want to adopt + maintain this library, please drop me a message - bluejamesbond@gmail.com + [![Gittip](http://img.shields.io/gittip/bluejamesbond.svg)](https://gratipay.com/bluejamesbond/) [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-TextJustify--Android-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/1318) [![Build Status](https://travis-ci.org/bluejamesbond/TextJustify-Android.svg?branch=master)](https://travis-ci.org/bluejamesbond/TextJustify-Android) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.bluejamesbond/textjustify-android/badge.svg?style=flat)](https://maven-badges.herokuapp.com/maven-central/com.github.bluejamesbond/textjustify-android) ![Logo](https://raw.githubusercontent.com/bluejamesbond/TextJustify-Android/master/misc/logo.png?) ======= **Android Full Justification** -#About +# About This library will provide you a way to justify text. It supports both plain text and Spannables. Additionally, the library can auto-hyphentate your displayed content (thanks to [@muriloandrade](https://github.com/muriloandrade)). *Compatible for Android 2.2 to 5.X* -#Screenshot +# Other Libraries +- [FacebookMessengerBot.js](https://github.com/bluejamesbond/FacebookMessengerBot.js) - a Node ES5/6 API for the new Facebook Messenger Bot Platform +- [Scribe.js](https://github.com/bluejamesbond/Scribe.js) - a Node ES5/6 logging system with a web interface + +# Screenshot ![Preview](http://i.imgur.com/k6bAWd0.jpg) -#Demo +# Demo [![Imgur](http://i.imgur.com/hSGF1fV.png)](https://play.google.com/store/apps/details?id=com.bluejamesbond.text.sample) #Recent @@ -21,18 +28,18 @@ This library will provide you a way to justify text. It supports both plain text **01/04/2015** ► Improved caching support which allows for smooth scrolling **01/02/2015** ► Added XML attributes for `DocumentView` -#Wiki +# Wiki For examples, tests, and API refer to the [Android-TextJustify Wiki](https://github.com/bluejamesbond/TextJustify-Android/wiki/1-%C2%B7-Home). -#Install +# Install Just add to your `build.gradle` ```gradle dependencies { - compile 'com.github.bluejamesbond:textjustify-android:2.0.9' + compile 'com.github.bluejamesbond:textjustify-android:2.1.6' } ``` -#Known Issues +# Known Issues | Status| Issues | | :------------: |:---------------| | **`CLOSED`** | Scroll caching for very large documents i.e. > 4000 paragaphs | diff --git a/app/manifest-merger-release-report.txt b/app/manifest-merger-release-report.txt deleted file mode 100644 index add25fa..0000000 --- a/app/manifest-merger-release-report.txt +++ /dev/null @@ -1,113 +0,0 @@ --- Merging decision tree log --- -manifest -ADDED from AndroidManifest.xml:2:1 - xmlns:android - ADDED from AndroidManifest.xml:2:11 - package - ADDED from AndroidManifest.xml:3:5 - INJECTED from AndroidManifest.xml:0:0 - INJECTED from AndroidManifest.xml:0:0 - android:versionName - INJECTED from AndroidManifest.xml:0:0 - INJECTED from AndroidManifest.xml:0:0 - android:versionCode - INJECTED from AndroidManifest.xml:0:0 - INJECTED from AndroidManifest.xml:0:0 -application -ADDED from AndroidManifest.xml:5:5 -MERGED from TextJustify-Android:library:unspecified:12:5 - android:label - ADDED from AndroidManifest.xml:8:9 - android:allowBackup - ADDED from AndroidManifest.xml:6:9 - android:icon - ADDED from AndroidManifest.xml:7:9 - android:theme - ADDED from AndroidManifest.xml:9:9 -activity#com.bluejamesbond.text.sample.helper.TestList -ADDED from AndroidManifest.xml:10:9 - android:label - ADDED from AndroidManifest.xml:12:13 - android:theme - ADDED from AndroidManifest.xml:13:13 - android:name - ADDED from AndroidManifest.xml:11:13 -intent-filter#android.intent.action.MAIN+android.intent.category.LAUNCHER -ADDED from AndroidManifest.xml:14:13 -action#android.intent.action.MAIN -ADDED from AndroidManifest.xml:15:17 - android:name - ADDED from AndroidManifest.xml:15:25 -category#android.intent.category.LAUNCHER -ADDED from AndroidManifest.xml:16:17 - android:name - ADDED from AndroidManifest.xml:16:27 -activity#com.bluejamesbond.text.sample.test.FormattedTextTest -ADDED from AndroidManifest.xml:19:9 - android:theme - ADDED from AndroidManifest.xml:21:13 - android:name - ADDED from AndroidManifest.xml:20:13 -activity#com.bluejamesbond.text.sample.test.LeadingMarginSpan2Test -ADDED from AndroidManifest.xml:22:9 - android:theme - ADDED from AndroidManifest.xml:24:13 - android:name - ADDED from AndroidManifest.xml:23:13 -activity#com.bluejamesbond.text.sample.test.LineBreakTest -ADDED from AndroidManifest.xml:25:9 - android:theme - ADDED from AndroidManifest.xml:27:13 - android:name - ADDED from AndroidManifest.xml:26:13 -activity#com.bluejamesbond.text.sample.test.PlainTextTest -ADDED from AndroidManifest.xml:28:9 - android:theme - ADDED from AndroidManifest.xml:30:13 - android:name - ADDED from AndroidManifest.xml:29:13 -activity#com.bluejamesbond.text.sample.test.QuoteSpanTest -ADDED from AndroidManifest.xml:31:9 - android:theme - ADDED from AndroidManifest.xml:33:13 - android:name - ADDED from AndroidManifest.xml:32:13 -activity#com.bluejamesbond.text.sample.test.ChineseCharacterTest -ADDED from AndroidManifest.xml:34:9 - android:theme - ADDED from AndroidManifest.xml:36:13 - android:name - ADDED from AndroidManifest.xml:35:13 -activity#com.bluejamesbond.text.sample.test.RTLTest -ADDED from AndroidManifest.xml:37:9 - android:theme - ADDED from AndroidManifest.xml:39:13 - android:name - ADDED from AndroidManifest.xml:38:13 -activity#com.bluejamesbond.text.sample.test.XMLTest -ADDED from AndroidManifest.xml:40:9 - android:theme - ADDED from AndroidManifest.xml:42:13 - android:name - ADDED from AndroidManifest.xml:41:13 -activity#com.bluejamesbond.text.sample.test.HyphenatedTest -ADDED from AndroidManifest.xml:43:9 - android:theme - ADDED from AndroidManifest.xml:45:13 - android:name - ADDED from AndroidManifest.xml:44:13 -activity#com.bluejamesbond.text.sample.test.WordSpacingTest -ADDED from AndroidManifest.xml:46:9 - android:theme - ADDED from AndroidManifest.xml:48:13 - android:name - ADDED from AndroidManifest.xml:47:13 -uses-sdk -INJECTED from AndroidManifest.xml:0:0 reason: use-sdk injection requested -MERGED from TextJustify-Android:library:unspecified:8:5 - android:targetSdkVersion - INJECTED from AndroidManifest.xml:0:0 - INJECTED from AndroidManifest.xml:0:0 - android:minSdkVersion - INJECTED from AndroidManifest.xml:0:0 - INJECTED from AndroidManifest.xml:0:0 diff --git a/build.gradle b/build.gradle index 6356aab..14d9c0e 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0' + classpath 'com.android.tools.build:gradle:3.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradle.properties b/gradle.properties index d7149d2..1a366ea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=2.0.9 -VERSION_CODE=21 +VERSION_NAME=2.1.6 +VERSION_CODE=27 GROUP=com.github.bluejamesbond POM_DESCRIPTION=Android Text Full Jusiftication diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ca46166..1cb61da 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Nov 25 01:23:33 CST 2014 +#Wed May 16 20:45:29 MSK 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/library/build.gradle b/library/build.gradle index 4f240c8..8f048b3 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -29,13 +29,13 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 21 - buildToolsVersion '21.1.2' + compileSdkVersion 27 + buildToolsVersion '27.0.3' defaultConfig { - minSdkVersion 8 - targetSdkVersion 21 - versionCode 2 - versionName '2.0' + minSdkVersion 14 + targetSdkVersion 27 + versionCode 3 + versionName '3.0' } android { lintOptions { diff --git a/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java b/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java index 6af3006..21664c7 100644 --- a/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java +++ b/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java @@ -1,34 +1,6 @@ package com.bluejamesbond.text; -/* - * Copyright 2015 Mathew Kurian - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * ConcurrentModifiableLinkedList.java - * @author Mathew Kurian - * - * From TextJustify-Android Library v2.0 - * https://github.com/bluejamesbond/TextJustify-Android - * - * Please report any issues - * https://github.com/bluejamesbond/TextJustify-Android/issues - * - * Date: 1/27/15 3:35 AM - */ - +import java.lang.reflect.Array; import java.util.AbstractSequentialList; import java.util.Collection; import java.util.Iterator; @@ -37,13 +9,13 @@ import java.util.NoSuchElementException; /** - * Linked list implementation of the List interface. Implements all + * Linked list implementation of the List interface. Implements all * optional list operations, and permits all elements (including - * null). In addition to implementing the List interface, - * the LinkedList class provides uniformly named methods to - * isCancelled, remove and insert an element at the + * null). In addition to implementing the List interface, + * the LinkedList class provides uniformly named methods to + * isCancelled, remove and insert an element at the * beginning and end of the list. These operations allow linked lists to be - * used as a stack or Queue.

+ * used as a stack or Queue. * * @param the type of elements held in this collection * @author Josh Bloch @@ -56,7 +28,7 @@ public class ConcurrentModifiableLinkedList extends AbstractSequentialList implements List, Cloneable, java.io.Serializable { private static final long serialVersionUID = 876323262645176354L; - private transient Entry header = new Entry(null, null, null); + private transient Entry header = new Entry<>(null, null, null); private transient int size = 0; /** @@ -136,8 +108,8 @@ public void addFirst(E e) { /** * Appends the specified element to the end of this list. - *

- *

This method is equivalent to {@link #add}. + * + * This method is equivalent to {@link #add}. * * @param e the element to add */ @@ -147,11 +119,11 @@ public void addLast(E e) { /** * Appends the specified element to the end of this list. - *

- *

This method is equivalent to {@link #addLast}. + * + * This method is equivalent to {@link #addLast}. * * @param e element to be appended to this list - * @return true (as specified by {@link Collection#add}) + * @return true (as specified by {@link Collection#add}) */ public boolean add(E e) { addBefore(e, header); @@ -177,8 +149,8 @@ public void clear() { /** * Returns the index of the first occurrence of the specified element * in this list, or -1 if this list does not contain the element. - * More formally, returns the lowest index i such that - * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))), + * More formally, returns the lowest index i such that + * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))), * or -1 if there is no such index. * * @param o element to search for @@ -206,8 +178,8 @@ public int indexOf(Object o) { /** * Returns the index of the last occurrence of the specified element * in this list, or -1 if this list does not contain the element. - * More formally, returns the highest index i such that - * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))), + * More formally, returns the highest index i such that + * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))), * or -1 if there is no such index. * * @param o element to search for @@ -241,7 +213,7 @@ public int lastIndexOf(Object o) { * this list, and it's nonempty.) * * @param c collection containing elements to be added to this list - * @return true if this list changed as a result of the call + * @return true if this list changed as a result of the call * @throws NullPointerException if the specified collection is null */ public boolean addAll(Collection c) { @@ -249,13 +221,13 @@ public boolean addAll(Collection c) { } /** - * Returns true if this list contains the specified element. - * More formally, returns true if and only if this list contains - * at least one element e such that - * (o==null ? e==null : o.equals(e)). + * Returns true if this list contains the specified element. + * More formally, returns true if and only if this list contains + * at least one element e such that + * (o==null ? e==null : o.equals(e)). * * @param o element whose presence in this list is to be tested - * @return true if this list contains the specified element + * @return true if this list contains the specified element */ public boolean contains(Object o) { return indexOf(o) != -1; @@ -268,14 +240,14 @@ public boolean contains(Object o) { * Removes the first occurrence of the specified element from this list, * if it is present. If this list does not contain the element, it is * unchanged. More formally, removes the element with the lowest index - * i such that - * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))) - * (if such an element exists). Returns true if this list + * i such that + * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))) + * (if such an element exists). Returns true if this list * contained the specified element (or equivalently, if this list * changed as a result of the call). * * @param o element to be removed from this list, if present - * @return true if this list contained the specified element + * @return true if this list contained the specified element */ public boolean remove(Object o) { if (o == null) { @@ -308,12 +280,12 @@ public int size() { /** * Returns an array containing all of the elements in this list * in proper sequence (from first to last element). - *

- *

The returned array will be "safe" in that no references to it are + * + * The returned array will be "safe" in that no references to it are * maintained by this list. (In other words, this method must allocate * a new array). The caller is thus free to modify the returned array. - *

- *

This method acts as bridge between array-based and collection-based + * + * This method acts as bridge between array-based and collection-based * APIs. * * @return an array containing all of the elements in this list @@ -334,27 +306,27 @@ public Object[] toArray() { * in the specified array, it is returned therein. Otherwise, a new * array is allocated with the runtime type of the specified array and * the size of this list. - *

- *

If the list fits in the specified array with room to spare (i.e., + * + * If the list fits in the specified array with room to spare (i.e., * the array has more elements than the list), the element in the array - * immediately following the end of the list is onUpdate to null. + * immediately following the end of the list is onUpdate to null. * (This is useful in determining the length of the list only if * the caller knows that the list does not contain any null elements.) - *

- *

Like the {@link #toArray()} method, this method acts as bridge between + * + * Like the {@link #toArray()} method, this method acts as bridge between * array-based and collection-based APIs. Further, this method allows * precise control over the runtime type of the output array, and may, * under certain circumstances, be used to save allocation costs. - *

- *

Suppose x is a list known to contain only strings. + * + * Suppose x is a list known to contain only strings. * The following code can be used to dump the list into a newly - * allocated array of String: - *

+ * allocated array of String: + * *

      *     String[] y = x.toArray(new String[0]);
* - * Note that toArray(new Object[0]) is identical in function to - * toArray(). + * Note that toArray(new Object[0]) is identical in function to + * toArray(). * * @param a the array into which the elements of the list are to * be stored, if it is big enough; otherwise, a new array of the @@ -366,18 +338,19 @@ public Object[] toArray() { * @throws NullPointerException if the specified array is null */ public T[] toArray(T[] a) { - if (a.length < size) - a = (T[]) java.lang.reflect.Array.newInstance( - a.getClass().getComponentType(), size); + T[] ts = a; + if (ts.length < size) + ts = (T[]) Array.newInstance( + ts.getClass().getComponentType(), size); int i = 0; - Object[] result = a; + Object[] result = ts; for (Entry e = header.next; e != header; e = e.next) result[i++] = e.element; - if (a.length > size) - a[size] = null; + if (ts.length > size) + ts[size] = null; - return a; + return ts; } /** @@ -407,7 +380,7 @@ public void add(int index, E element) { * @param index index at which to insert the first element * from the specified collection * @param c collection containing elements to be added to this list - * @return true if this list changed as a result of the call + * @return true if this list changed as a result of the call * @throws IndexOutOfBoundsException {@inheritDoc} * @throws NullPointerException if the specified collection is null */ @@ -423,8 +396,8 @@ public boolean addAll(int index, Collection c) { Entry successor = (index == size ? header : entry(index)); Entry predecessor = successor.previous; - for (int i = 0; i < numNew; i++) { - Entry e = new Entry((E) a[i], successor, predecessor); + for (Object el: a) { + Entry e = new Entry<>((E) el, successor, predecessor); predecessor.next = e; predecessor = e; } @@ -450,19 +423,19 @@ public E get(int index) { /** * Returns a list-iterator of the elements in this list (in proper * sequence), starting at the specified position in the list. - * Obeys the general contract of List.listIterator(int).

- *

+ * Obeys the general contract of List.listIterator(int). + * * The list-iterator is fail-fast: if the list is structurally * modified at any time after the Iterator is created, in any way except - * through the list-iterator's own remove or add + * through the list-iterator's own remove or add * methods, the list-iterator will throw a - * ConcurrentModificationException. Thus, in the face of + * ConcurrentModificationException. Thus, in the face of * concurrent modification, the iterator fails quickly and cleanly, rather * than risking arbitrary, non-deterministic behavior at an undetermined * time in the future. * * @param index index of the first element to be returned from the - * list-iterator (by a call to next) + * list-iterator (by a call to next) * @return a ListIterator of the elements in this list (in proper * sequence), starting at the specified position in the list * @throws IndexOutOfBoundsException {@inheritDoc} @@ -522,7 +495,7 @@ private Entry entry(int index) { /** * Retrieves, but does not remove, the head (first element) of this list. * - * @return the head of this list, or null if this list is empty + * @return the head of this list, or null if this list is empty * @since 1.5 */ public E peek() { @@ -547,7 +520,7 @@ public E element() { /** * Retrieves and removes the head (first element) of this list * - * @return the head of this list, or null if this list is empty + * @return the head of this list, or null if this list is empty * @since 1.5 */ public E poll() { @@ -571,7 +544,7 @@ public E remove() { * Adds the specified element as the tail (last element) of this list. * * @param e the element to add - * @return true + * @return true * @since 1.5 */ public boolean offer(E e) { @@ -582,7 +555,7 @@ public boolean offer(E e) { * Inserts the specified element at the front of this list. * * @param e the element to insert - * @return true (as specified by {@link Deque#offerFirst}) + * @return true (as specified by {Deque#offerFirst}) * @since 1.6 */ public boolean offerFirst(E e) { @@ -594,7 +567,7 @@ public boolean offerFirst(E e) { * Inserts the specified element at the end of this list. * * @param e the element to insert - * @return true (as specified by {@link Deque#offerLast}) + * @return true (as specified by {Deque#offerLast}) * @since 1.6 */ public boolean offerLast(E e) { @@ -604,9 +577,9 @@ public boolean offerLast(E e) { /** * Retrieves, but does not remove, the first element of this list, - * or returns null if this list is empty. + * or returns null if this list is empty. * - * @return the first element of this list, or null + * @return the first element of this list, or null * if this list is empty * @since 1.6 */ @@ -618,9 +591,9 @@ public E peekFirst() { /** * Retrieves, but does not remove, the last element of this list, - * or returns null if this list is empty. + * or returns null if this list is empty. * - * @return the last element of this list, or null + * @return the last element of this list, or null * if this list is empty * @since 1.6 */ @@ -632,9 +605,9 @@ public E peekLast() { /** * Retrieves and removes the first element of this list, - * or returns null if this list is empty. + * or returns null if this list is empty. * - * @return the first element of this list, or null if + * @return the first element of this list, or null if * this list is empty * @since 1.6 */ @@ -646,9 +619,9 @@ public E pollFirst() { /** * Retrieves and removes the last element of this list, - * or returns null if this list is empty. + * or returns null if this list is empty. * - * @return the last element of this list, or null if + * @return the last element of this list, or null if * this list is empty * @since 1.6 */ @@ -661,8 +634,8 @@ public E pollLast() { /** * Pushes an element onto the stack represented by this list. In other * words, inserts the element at the front of this list. - *

- *

This method is equivalent to {@link #addFirst}. + * + * This method is equivalent to {@link #addFirst}. * * @param e the element to push * @since 1.6 @@ -674,8 +647,8 @@ public void push(E e) { /** * Pops an element from the stack represented by this list. In other * words, removes and returns the first element of this list. - *

- *

This method is equivalent to {@link #removeFirst()}. + * + * This method is equivalent to {@link #removeFirst()}. * * @return the element at the front of this list (which is the top * of the stack represented by this list) @@ -692,7 +665,7 @@ public E pop() { * does not contain the element, it is unchanged. * * @param o element to be removed from this list, if present - * @return true if the list contained the specified element + * @return true if the list contained the specified element * @since 1.6 */ public boolean removeFirstOccurrence(Object o) { @@ -705,7 +678,7 @@ public boolean removeFirstOccurrence(Object o) { * does not contain the element, it is unchanged. * * @param o element to be removed from this list, if present - * @return true if the list contained the specified element + * @return true if the list contained the specified element * @since 1.6 */ public boolean removeLastOccurrence(Object o) { @@ -727,8 +700,9 @@ public boolean removeLastOccurrence(Object o) { return false; } + @SuppressWarnings("UnusedReturnValue") private Entry addBefore(E e, Entry entry) { - Entry newEntry = new Entry(e, entry, entry.previous); + Entry newEntry = new Entry<>(e, entry, entry.previous); newEntry.previous.next = newEntry; newEntry.next.previous = newEntry; size++; @@ -758,13 +732,13 @@ public Iterator descendingIterator() { } /** - * Returns a shallow copy of this LinkedList. (The elements + * Returns a shallow copy of this LinkedList. (The elements * themselves are not cloned.) * - * @return a shallow copy of this LinkedList instance + * @return a shallow copy of this LinkedList instance */ - public Object clone() { - ConcurrentModifiableLinkedList clone = null; + public ConcurrentModifiableLinkedList clone() { + ConcurrentModifiableLinkedList clone; try { clone = (ConcurrentModifiableLinkedList) super.clone(); } catch (CloneNotSupportedException e) { @@ -772,7 +746,7 @@ public Object clone() { } // Put clone into "virgin" state - clone.header = new Entry(null, null, null); + clone.header = new Entry<>(null, null, null); clone.header.next = clone.header.previous = clone.header; clone.size = 0; clone.modCount = 0; @@ -785,7 +759,7 @@ public Object clone() { } /** - * Save the state of this LinkedList instance to a stream (that + * Save the state of this LinkedList instance to a stream (that * is, serialize it). * * @serialData The size of the list (the number of elements it @@ -806,7 +780,7 @@ private void writeObject(java.io.ObjectOutputStream s) } /** - * Reconstitute this LinkedList instance from a stream (that is + * Reconstitute this LinkedList instance from a stream (that is * deserialize it). */ private void readObject(java.io.ObjectInputStream s) @@ -818,7 +792,7 @@ private void readObject(java.io.ObjectInputStream s) int size = s.readInt(); // Initialize header - header = new Entry(null, null, null); + header = new Entry<>(null, null, null); header.next = header.previous = header; // Read in all elements in the proper order. diff --git a/library/src/main/java/com/bluejamesbond/text/Console.java b/library/src/main/java/com/bluejamesbond/text/Console.java index 9116cf5..2dba75a 100644 --- a/library/src/main/java/com/bluejamesbond/text/Console.java +++ b/library/src/main/java/com/bluejamesbond/text/Console.java @@ -30,7 +30,7 @@ */ @SuppressWarnings("unused") -public class Console { +public final class Console { public static void log(String tag, String s) { android.util.Log.d(tag, s); diff --git a/library/src/main/java/com/bluejamesbond/text/DocumentView.java b/library/src/main/java/com/bluejamesbond/text/DocumentView.java index e2f2587..7079131 100644 --- a/library/src/main/java/com/bluejamesbond/text/DocumentView.java +++ b/library/src/main/java/com/bluejamesbond/text/DocumentView.java @@ -49,10 +49,12 @@ import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.View; +import android.view.ViewTreeObserver; import android.widget.ProgressBar; import android.widget.ScrollView; import com.bluejamesbond.text.style.TextAlignment; +import com.bluejamesbond.text.util.Pagination; import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; @@ -67,18 +69,17 @@ public class DocumentView extends ScrollView { private static final ITween LINEAR_EASE_IN; private static final Object eglBitmapHeightLock; + public static final int DEFAULT_FADE_IN_DURATION = 250; + public static final int DEFAULT_FADE_IN_ANIMATION_STEP_DELAY = 35; + public static final int DEFAULT_TEXT_SIZE = 34; + public static final int TRANSPARENT_ALPHA = 255; private static int eglBitmapHeight; protected ILayoutProgressListener layoutProgressListener; static { eglBitmapHeightLock = new Object(); eglBitmapHeight = -1; - LINEAR_EASE_IN = new ITween() { - @Override - public float get(float t, float b, float c, float d) { - return c * t / d + b; - } - }; + LINEAR_EASE_IN = new LinearEasyIn(); } private IDocumentLayout layout; @@ -86,8 +87,8 @@ public float get(float t, float b, float c, float d) { private TextPaint cachePaint; private View viewportView; private ITween fadeInTween; - private int fadeInDuration = 250; - private int fadeInAnimationStepDelay = 35; + private int fadeInDuration = DEFAULT_FADE_IN_DURATION; + private int fadeInAnimationStepDelay = DEFAULT_FADE_IN_ANIMATION_STEP_DELAY; private volatile MeasureTask measureTask; private volatile MeasureTaskState measureState; private int minimumHeight; @@ -96,6 +97,26 @@ public float get(float t, float b, float c, float d) { private CacheBitmap cacheBitmapTop; private CacheBitmap cacheBitmapBottom; private boolean disallowInterceptTouch; + private boolean paginated; + private Pagination pagination; + private int currentPage; + private int startPage = 0; + ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener; + CharSequence text; + + public int getCurrentPage() { + return currentPage; + } + + public void setStartPage(int startPage) { + if (startPage == this.startPage) { + return; + } + + currentPage = currentPage - this.startPage + startPage; + this.startPage = startPage; + paginate(); + } public DocumentView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); @@ -166,6 +187,11 @@ private static int getMaxTextureSize() { return Math.max(maximumTextureSize, GL_MAX_TEXTURE_SIZE); } + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return !paginated && super.onInterceptTouchEvent(ev); + } + public boolean isDisallowInterceptTouch() { return disallowInterceptTouch; } @@ -208,6 +234,24 @@ protected synchronized void drawLayout(Canvas canvas, int startY, int endY, bool } } + public int turnPageBackward() { + currentPage = currentPage > startPage ? currentPage - 1 : currentPage; + turnPage(currentPage); + return currentPage; + } + + public int turnPageForward() { + currentPage = currentPage < pagination.size() ? currentPage + 1 : currentPage; + turnPage(currentPage); + return currentPage; + } + + public void turnPage(int page) { + if (startPage > page) throw new AssertionError(); + currentPage = page; + paginate(); + } + public int getFadeInAnimationStepDelay() { return fadeInAnimationStepDelay; } @@ -232,6 +276,14 @@ public void setFadeInTween(ITween tween) { fadeInTween = tween; } + private void paginate() { + final CharSequence text = pagination.get(currentPage); + if(text != null) { + layout.textChange = !layout.text.equals(text); + layout.text = text; + } + } + private void initDocumentView(Context context, AttributeSet attrs, int type) { synchronized (eglBitmapHeightLock) { @@ -341,7 +393,7 @@ private void initDocumentView(Context context, AttributeSet attrs, int type) { protected void initPaint(Paint paint) { paint.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); - paint.setTextSize(34); + paint.setTextSize(DEFAULT_TEXT_SIZE); paint.setAntiAlias(true); } @@ -400,33 +452,7 @@ public View getViewportView(){ } public void setProgressBar(final int progressBarId) { - setOnLayoutProgressListener(new DocumentView.ILayoutProgressListener() { - - private ProgressBar progressBar; - - @Override - public void onCancelled() { - progressBar.setProgress(progressBar.getMax()); - progressBar = null; - } - - @Override - public void onFinish() { - progressBar.setProgress(progressBar.getMax()); - progressBar = null; - } - - @Override - public void onStart() { - progressBar = (ProgressBar) ((Activity) getContext()).getWindow().getDecorView().findViewById(progressBarId); - progressBar.setProgress(0); - } - - @Override - public void onProgressUpdate(float progress) { - progressBar.setProgress((int) (progress * (float) progressBar.getMax())); - } - }); + setOnLayoutProgressListener(new OnLayoutProgressListener(progressBarId)); } public void setOnLayoutProgressListener(ILayoutProgressListener listener) { @@ -438,8 +464,8 @@ public CharSequence getText() { } public void setText(CharSequence text) { - this.layout.setText(text); - requestLayout(); + this.text = text; + layout.setText(text); } public StringDocumentLayout.LayoutParams getDocumentLayoutParams() { @@ -462,6 +488,7 @@ public void setCacheConfig(CacheConfig quality) { @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { final int width = MeasureSpec.getSize(widthMeasureSpec); + final int height = layout.getMeasuredHeight(); switch (measureState) { case FINISH_AWAIT: @@ -470,16 +497,20 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec break; case FINISH: viewportView.setMinimumWidth(width); - viewportView.setMinimumHeight(layout.getMeasuredHeight()); + viewportView.setMinimumHeight(height); measureState = MeasureTaskState.FINISH_AWAIT; - allocateResources(); + + if(cacheConfig != CacheConfig.NO_CACHE){ + allocateResources(); + } + break; case START: if (measureTask != null) { measureTask.cancel(true); measureTask = null; } - measureTask = new MeasureTask(width); + measureTask = new MeasureTask(width, height); measureTask.execute(); measureState = MeasureTaskState.AWAIT; break; @@ -488,10 +519,11 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec super.onMeasure(widthMeasureSpec, heightMeasureSpec); } + @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent ev) { requestDisallowInterceptTouchEvent(disallowInterceptTouch); - return super.onTouchEvent(ev); + return !paginated && super.onTouchEvent(ev); } @Override @@ -507,27 +539,7 @@ protected void onDetachedFromWindow() { } public void setProgressBar(final ProgressBar progressBar) { - setOnLayoutProgressListener(new DocumentView.ILayoutProgressListener() { - @Override - public void onCancelled() { - progressBar.setProgress(progressBar.getMax()); - } - - @Override - public void onFinish() { - progressBar.setProgress(progressBar.getMax()); - } - - @Override - public void onStart() { - progressBar.setProgress(0); - } - - @Override - public void onProgressUpdate(float progress) { - progressBar.setProgress((int) (progress * (float) progressBar.getMax())); - } - }); + setOnLayoutProgressListener(new OnLayoutProgressListener(progressBar)); } @Override @@ -540,6 +552,62 @@ protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } + public boolean isPaginated() { + return paginated; + } + + public void setPaginated(final boolean paginated) { + + if (this.paginated == paginated) { + return; + } + + this.paginated = paginated; + + if (paginated) { + pagination = new Pagination(layout, 0); + + onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + getViewTreeObserver().removeOnGlobalLayoutListener(this); + } else { + getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + + pagination.setPageHeight(((View) getParent()).getHeight()); + } + }; + + getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener); + } else { + getViewTreeObserver().removeGlobalOnLayoutListener(onGlobalLayoutListener); + } + + onGlobalLayoutListener = null; + pagination = null; + } + + invalidate(); + } + + @Override + public void invalidate() { + onDocumentViewParamsChanged(); + super.invalidate(); + } + + protected void onDocumentViewParamsChanged() { + setVerticalScrollBarEnabled(!paginated); + } + + public int getPageCount() { + return pagination.size(); + } @SuppressLint("DrawAllocation") @Override @@ -613,7 +681,7 @@ public void run() { } } else { - drawLayout(canvas, 0, layout.getMeasuredHeight(), false); + drawLayout(canvas, 0, paginated ? pagination.getPageHeight() : layout.getMeasuredHeight(), false); } } @@ -640,7 +708,7 @@ protected boolean drawCacheToView(Canvas canvas, Paint paint, CacheBitmap cache, paint.setAlpha(cache.getAlpha()); canvas.drawBitmap(cache.getBitmap(), 0, y, paint); paint.setAlpha(lastAlpha); - return cache.getAlpha() < 255; // return true to invoke postInvalidateDelayed() + return cache.getAlpha() < TRANSPARENT_ALPHA; // return true to invoke postInvalidateDelayed() } return false; @@ -670,13 +738,13 @@ public void destroyCache() { } } - public static enum CacheConfig { + public enum CacheConfig { NO_CACHE(null, 0), AUTO_QUALITY(Config.ARGB_4444, 1), LOW_QUALITY(Config.RGB_565, 2), HIGH_QUALITY(Config.ARGB_8888, 3), GRAYSCALE(Config.ALPHA_8, 4); private final Config mConfig; private final int mId; - private CacheConfig(Config config, int id) { + CacheConfig(Config config, int id) { mConfig = config; mId = id; } @@ -710,26 +778,31 @@ enum MeasureTaskState { AWAIT, FINISH, START, FINISH_AWAIT } - public static interface ILayoutProgressListener { - public void onCancelled(); - - public void onFinish(); - - public void onStart(); + public interface ILayoutProgressListener { + void onCancelled(); + void onFinish(); + void onStart(); + void onProgressUpdate(float progress); + } - public void onProgressUpdate(float progress); + public interface ITween { + float get(float t, float b, float c, float d); } - public static interface ITween { - public float get(float t, float b, float c, float d); + private static class LinearEasyIn implements ITween { + @Override + public float get(float t, float b, float c, float d) { + return c * t / d + b; + } } + @SuppressLint("StaticFieldLeak") public class MeasureTask extends AsyncTask { private IDocumentLayout.IProgress progress; private IDocumentLayout.ICancel cancelled; - public MeasureTask(float parentWidth) { + public MeasureTask(float parentWidth, int parentHeight) { layout.getLayoutParams().setParentWidth(parentWidth); progress = new IDocumentLayout.IProgress() { @Override @@ -750,7 +823,15 @@ public Boolean isCancelled() { @Override protected Boolean doInBackground(Void... params) { try { - return layout.measure(progress, cancelled); + layout.textChange = text != layout.text; + layout.text = text; + boolean result = layout.measure(progress, cancelled); + if (result && paginated) { + pagination = new Pagination(layout, ((View) getParent()).getMeasuredHeight()); + pagination.layout(); + paginate(); + } + return result; } catch (Exception e) { e.printStackTrace(); return false; @@ -764,7 +845,6 @@ protected void onPreExecute() { } } - @Override protected void onPostExecute(Boolean done) { if (!done || isCancelled()) { @@ -792,7 +872,7 @@ protected void onCancelled() { } } - private class CacheBitmap { + private final class CacheBitmap { private long drawFadeInStartTime; private Bitmap bitmap; @@ -801,17 +881,17 @@ private class CacheBitmap { private volatile CacheDrawTask drawTask; private volatile int alpha; - public CacheBitmap(int w, int h, Bitmap.Config config) { + CacheBitmap(int w, int h, Bitmap.Config config) { bitmap = Bitmap.createBitmap(w, h, config); start = -1; drawCompleted = false; } - public int getAlpha() { + int getAlpha() { return (int) Math.min(fadeInTween.get(System.currentTimeMillis() - drawFadeInStartTime, 0, 255f, fadeInDuration), 255f); } - public void drawInBackground(Runnable runnable) { + void drawInBackground(Runnable runnable) { if (drawTask != null) { drawTask.cancel(true); drawTask = null; @@ -831,29 +911,32 @@ public void setBitmap(Bitmap bitmap) { this.bitmap = bitmap; } - public int getStart() { + int getStart() { return start; } - public void setStart(int start) { + void setStart(int start) { this.start = start; } - public boolean isReady() { + boolean isReady() { return drawCompleted; } - public void recycle() { + void recycle() { if (drawTask != null) { drawTask.cancel(true); drawTask = null; drawCompleted = false; } - bitmap.recycle(); - bitmap = null; + if (bitmap != null) { + bitmap.recycle(); + bitmap = null; + } } + @SuppressLint("StaticFieldLeak") public class CacheDrawTask extends AsyncTask { private Runnable drawRunnable; @@ -880,4 +963,43 @@ protected void onPostExecute(Void aVoid) { } } } + + private final class OnLayoutProgressListener implements ILayoutProgressListener { + + private int progressBarId; + private ProgressBar progressBar; + + private OnLayoutProgressListener(final int progressBarId) { + this.progressBarId = progressBarId; + } + + private OnLayoutProgressListener(final ProgressBar progressBar) { + this.progressBar = progressBar; + } + + @Override + public void onCancelled() { + progressBar.setProgress(progressBar.getMax()); + progressBar = null; + } + + @Override + public void onFinish() { + progressBar.setProgress(progressBar.getMax()); + progressBar = null; + } + + @Override + public void onStart() { + if (progressBar == null) { + progressBar = (ProgressBar) ((Activity) getContext()).getWindow().getDecorView().findViewById(progressBarId); + } + progressBar.setProgress(0); + } + + @Override + public void onProgressUpdate(float progress) { + progressBar.setProgress((int) (progress * (float) progressBar.getMax())); + } + } } diff --git a/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java index 13df3eb..02b5289 100644 --- a/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java @@ -51,32 +51,41 @@ public abstract class IDocumentLayout { // Main content protected CharSequence text; protected int lineCount; + protected int tokensCount; protected int measuredHeight; protected boolean textChange; protected LayoutParams params; protected TextPaint paint; - private Toast toast; + private Context context; private DisplayMetrics displayMetrics; @SuppressLint("ShowToast") public IDocumentLayout(Context context, TextPaint textPaint) { + initDocumentLayout(context, textPaint); + + params = new LayoutParams(); + params.setLineHeightMultiplier(1.0f); + params.setHyphenated(false); + params.setReverse(false); + } + + private void initDocumentLayout(Context context, TextPaint textPaint) { paint = textPaint; text = ""; measuredHeight = 0; lineCount = 0; + tokensCount = 0; textChange = false; displayMetrics = context.getResources().getDisplayMetrics(); - toast = Toast.makeText(context, "", Toast.LENGTH_SHORT); - - params = new LayoutParams(); - params.setLineHeightMultiplier(1.0f); - params.setHyphenated(false); - params.setReverse(false); + this.context = context; } protected void showToast(String s) { - toast.setText(s); - toast.show(); + Toast.makeText(context, s, Toast.LENGTH_SHORT).show(); + } + + public int getTokensCount() { + return tokensCount; } public Paint getPaint() { @@ -92,15 +101,16 @@ public CharSequence getText() { } public void setText(CharSequence text) { - text = text == null ? new SpannableString("") : new SpannableString(text); + CharSequence spannableString = text == null ? new SpannableString("") : new SpannableString(text); - if (this.text.equals(text)) { + if (this.text.equals(spannableString)) { return; } - this.text = text; + this.text = spannableString; this.textChange = true; + this.tokensCount = 0; onTextChange(); } @@ -110,6 +120,7 @@ public int getMeasuredHeight() { protected void onTextNull() { params.changed = false; + tokensCount = 0; measuredHeight = (int) (params.insetPaddingTop + params.insetPaddingBottom); } @@ -167,20 +178,22 @@ public void draw(Canvas canvas, int startTop, int startBottom) { public abstract void onTextChange(); - public static enum TokenPosition { + public enum TokenPosition { START_OF_LINE, END_OF_LINE } - public static interface IProgress { - public void onUpdate(T val); + public interface IProgress { + void onUpdate(T val); } - public static interface ICancel { - public T isCancelled(); + public interface ICancel { + T isCancelled(); } public class LayoutParams { + public static final float DEFAULT_PARENT_WIDTH = 800.0f; + public static final int DEFAULT_TEXT_SIZE = 14; /** * All the customizable parameters */ @@ -189,7 +202,7 @@ public class LayoutParams { protected Float insetPaddingTop = 0.0f; protected Float insetPaddingBottom = 0.0f; protected Float insetPaddingRight = 0.0f; - protected Float parentWidth = 800.0f; + protected Float parentWidth = DEFAULT_PARENT_WIDTH; protected Float offsetX = 0.0f; protected Float offsetY = 0.0f; @@ -208,7 +221,7 @@ public class LayoutParams { protected Boolean textStrikeThru = false; protected Boolean textFakeBold = false; protected Typeface textTypeface = Typeface.DEFAULT; - protected Float rawTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 14, displayMetrics); + protected Float rawTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, DEFAULT_TEXT_SIZE, displayMetrics); protected Integer textColor = Color.BLACK; protected Integer textLinkColor = Color.parseColor("#ff05c5cf"); @@ -395,9 +408,6 @@ public void setReverse(boolean reverse) { return; } - if (reverse) { - textAlignment = TextAlignment.RIGHT; - } this.reverse = reverse; invalidate(); diff --git a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java index 3ba8d65..30af029 100644 --- a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java @@ -48,6 +48,8 @@ import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; +import java.util.Locale; +import java.util.Queue; public abstract class SpannableDocumentLayout extends IDocumentLayout { @@ -60,7 +62,7 @@ public abstract class SpannableDocumentLayout extends IDocumentLayout { private static final int TOKEN_LINE = 6; private static final int TOKEN_LENGTH = 7; private TextPaint workPaint; - private LinkedList mLeadMarginSpanDrawEvents; + private Queue mLeadMarginSpanDrawEvents; private int[] tokens; public SpannableDocumentLayout(Context context, TextPaint paint) { @@ -69,11 +71,12 @@ public SpannableDocumentLayout(Context context, TextPaint paint) { tokens = new int[0]; } - private static int pushToken(int[] tokens, int index, int start, int end, float x, float y, + private int pushToken(int[] tokens, int index, int start, int end, float x, float y, float ascent, float descent, int line) { Assert.assertTrue(index % TOKEN_LENGTH == 0); + tokensCount++; tokens[index + TOKEN_START] = start; tokens[index + TOKEN_END] = end; tokens[index + TOKEN_X] = (int) x; @@ -98,32 +101,33 @@ private static LinkedList tokenize(CharSequence source, int start, int end) { + int localStart = start; LinkedList units = new LinkedList<>(); - if (start >= end) { + if (localStart >= end) { return units; } - boolean charSearch = source.charAt(start) == ' '; + boolean charSearch = source.charAt(localStart) == ' '; - for (int i = start; i < end; i++) { + for (int i = localStart; i < end; i++) { // If the end add the word group if (i + 1 == end) { units.add(i + 1); - start = i + 1; + localStart = i + 1; } // Search for the start of non-space else if (charSearch && source.charAt(i) != ' ') { - if ((i - start) > 0) { + if ((i - localStart) > 0) { units.add(i); } - start = i; + localStart = i; charSearch = false; } // Search for the end of non-space else if (!charSearch && source.charAt(i) == ' ') { units.add(i); - start = i + 1; // Skip the space + localStart = i + 1; // Skip the space charSearch = true; } } @@ -137,16 +141,17 @@ else if (!charSearch && source.charAt(i) == ' ') { * as by {@link String#trim}. */ protected int getTrimmedLength(CharSequence s, int start, int end) { - while (start < end && s.charAt(start) <= ' ') { - start++; + int localStart = start; + while (localStart < end && s.charAt(localStart) <= ' ') { + localStart++; } int endCpy = end; - while (endCpy > start && s.charAt(endCpy - 1) <= ' ') { + while (endCpy > localStart && s.charAt(endCpy - 1) <= ' ') { endCpy--; } - return endCpy - start; + return endCpy - localStart; } @SuppressWarnings("ConstantConditions") @@ -184,7 +189,7 @@ public boolean onMeasure(IProgress progress, ICancel cancelled) float lastDescent; boolean isParaStart = true; - boolean isReverse = params.reverse; + boolean isReverse; for (lineNumber = 0; lineNumber < lines; lineNumber++) { @@ -337,7 +342,7 @@ public boolean onMeasure(IProgress progress, ICancel cancelled) } if (params.debugging) { - Console.log(String.format("Align: %s, X: %fpx, Y: %fpx, PWidth: %fpx", + Console.log(String.format(Locale.US, "Align: %s, X: %fpx, Y: %fpx, PWidth: %fpx", lineTextAlignment, x, y, parentWidth)); } @@ -364,7 +369,9 @@ public boolean onMeasure(IProgress progress, ICancel cancelled) } // FIXME: Space at the end of each line, possibly due to scrollbar offset - LinkedList tokenized = tokenize(textCpy, start, end - 1); +// LinkedList tokenized = tokenize(textCpy, start, end - 1); + // FIXME: 2016/4/16 Issue #105 bug + LinkedList tokenized = tokenize(textCpy, start, end); // If one long word without any spaces if (tokenized.size() == 1) { @@ -481,7 +488,7 @@ public void onDraw(Canvas canvas, int scrollTop, int scrollBottom) { int startIndex = getTokenForVertical(scrollTop, TokenPosition.START_OF_LINE); int endIndex = getTokenForVertical(scrollBottom, TokenPosition.END_OF_LINE); - boolean defIsReverse = params.reverse; + final boolean defIsReverse = false; for (LeadingMarginSpanDrawParameters parameters : mLeadMarginSpanDrawEvents) { // FIXME sort by Y and break out of loop @@ -611,27 +618,27 @@ public boolean isTokenized() { * Class to handle onDrawLeadingSpanMargin */ - private class LeadingMarginSpanDrawParameters { - - public int x; - public int top; - public int baseline; - public int bottom; - public int dir; - public int start; - public int end; - public boolean first; - public LeadingMarginSpan span; - - public LeadingMarginSpanDrawParameters(LeadingMarginSpan span, - int x, - int dir, - int top, - int baseline, - int bottom, - int start, - int end, - boolean first) { + private final class LeadingMarginSpanDrawParameters { + + int x; + int top; + int baseline; + int bottom; + int dir; + int start; + int end; + boolean first; + LeadingMarginSpan span; + + LeadingMarginSpanDrawParameters(LeadingMarginSpan span, + int x, + int dir, + int top, + int baseline, + int bottom, + int start, + int end, + boolean first) { this.span = span; this.x = x; this.dir = dir; diff --git a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java index 9d86b66..b76a9fb 100644 --- a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java @@ -35,13 +35,13 @@ import android.graphics.Paint; import android.text.TextPaint; -import java.util.ArrayList; import java.util.List; import java.util.ListIterator; @SuppressWarnings("unused") public abstract class StringDocumentLayout extends IDocumentLayout { + public static final int EXTRA_TOKENS_TO_DRAW = 25; // Parsing objects private Token[] tokens; private ConcurrentModifiableLinkedList chunks; @@ -192,7 +192,11 @@ public boolean onMeasure(IProgress progress, ICancel cancelled) // Next line lineNumber++; - // Chcek cancelled + if (lineNumber >= params.maxLines) { + break main; + } + + // Check cancelled if (cancelled.isCancelled()) { done = false; break; @@ -215,6 +219,8 @@ public boolean onMeasure(IProgress progress, ICancel cancelled) } Token[] tokensArr = new Token[tokensList.size()]; + tokensCount = tokensList.size(); + tokensList.toArray(tokensArr); tokensList.clear(); @@ -231,7 +237,7 @@ public void onDraw(Canvas canvas, int startTop, int startBottom) { int tokenStart = getTokenForVertical(startTop, TokenPosition.START_OF_LINE); int tokenEnd = getTokenForVertical(startBottom, TokenPosition.END_OF_LINE); - for (int i = Math.max(0, tokenStart - 25); i < tokenEnd + 25 && i < tokens.length; i++) { + for (int i = Math.max(0, tokenStart - EXTRA_TOKENS_TO_DRAW); i < tokenEnd + EXTRA_TOKENS_TO_DRAW && i < tokens.length; i++) { Token token = tokens[i]; token.draw(canvas, -startTop, paint, params); if (params.debugging) { @@ -259,6 +265,11 @@ public void onDraw(Canvas canvas, int startTop, int startBottom) { } } + @Override + public int getTokensCount() { + return tokensCount; + } + @Override public float getTokenAscent(int tokenIndex) { return -paint.ascent() * params.lineHeightMultiplier; @@ -377,16 +388,17 @@ else if (!charSearch && s.charAt(i) == ' ') { * as by {@link String#trim}. */ protected int getTrimmedLength(CharSequence s, int start, int end) { - while (start < end && s.charAt(start) <= ' ') { - start++; + int localStart = start; + while (localStart < end && s.charAt(localStart) <= ' ') { + localStart++; } int endCpy = end; - while (endCpy > start && s.charAt(endCpy - 1) <= ' ') { + while (endCpy > localStart && s.charAt(endCpy - 1) <= ' ') { endCpy--; } - return endCpy - start; + return endCpy - localStart; } /** @@ -395,6 +407,7 @@ protected int getTrimmedLength(CharSequence s, int start, int end) { private LineAnalysis fit(ListIterator iterator, int startIndex, float spaceOffset, float availableWidth) { + float localAvailableWidth = availableWidth; int i = startIndex; // Greedy search to see if the word @@ -405,7 +418,7 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac Unit unit = iterator.next(); String word = unit.unit; float wordWidth = paint.measureText(word); - float remainingWidth = availableWidth - wordWidth; + float remainingWidth = localAvailableWidth - wordWidth; // Word does not fit in line if (remainingWidth < 0 && word.trim().length() != 0) { @@ -419,7 +432,7 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac String lastConcatPartial = null; String concatPartial = ""; - ArrayList partials = params.hyphenator.hyphenate(word); + List partials = params.hyphenator.hyphenate(word); for (String partial : partials) { @@ -432,7 +445,7 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac .measureText(formattedPartial); // See if the partial fits - if (availableWidth - formattedPartialWidth > 0) { + if (localAvailableWidth - formattedPartialWidth > 0) { lastFormattedPartial = formattedPartial; lastFormattedPartialWidth = formattedPartialWidth; lastConcatPartial = concatPartial; @@ -446,11 +459,11 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac unit.unit = lastFormattedPartial; iterator.add(new Unit(word.substring(lastConcatPartial.length()))); - availableWidth -= lastFormattedPartialWidth; + localAvailableWidth -= lastFormattedPartialWidth; iterator.previous(); - return new LineAnalysis(startIndex, i + 1, availableWidth); + return new LineAnalysis(startIndex, i + 1, localAvailableWidth); } } } @@ -459,17 +472,17 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac // Redo this word on the next run iterator.previous(); - return new LineAnalysis(startIndex, i, availableWidth + spaceOffset); + return new LineAnalysis(startIndex, i, localAvailableWidth + spaceOffset); } // Word fits in the line else { - availableWidth -= wordWidth + spaceOffset; + localAvailableWidth -= wordWidth + spaceOffset; // NO remaining space if (remainingWidth == 0) { - return new LineAnalysis(startIndex, i + 1, availableWidth + return new LineAnalysis(startIndex, i + 1, localAvailableWidth + spaceOffset); } } @@ -478,15 +491,15 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac i++; } - return new LineAnalysis(startIndex, i, availableWidth + spaceOffset); + return new LineAnalysis(startIndex, i, localAvailableWidth + spaceOffset); } private static abstract class Token { - public int lineNumber; - public float y; + int lineNumber; + float y; - public Token(int lineNumber, float y) { + Token(int lineNumber, float y) { this.lineNumber = lineNumber; this.y = y; } @@ -504,15 +517,15 @@ public int getLineNumber() { private static class Unit extends Token { - public float x; - public String unit; + float x; + String unit; - public Unit(String unit) { + Unit(String unit) { super(0, 0); this.unit = unit; } - public Unit(int lineNumber, float x, float y, String unit) { + Unit(int lineNumber, float x, float y, String unit) { super(lineNumber, y); this.x = x; this.unit = unit; @@ -529,8 +542,8 @@ public String toString() { } } - private static class LineBreak extends Token { - public LineBreak(int lineNumber, float y) { + private final static class LineBreak extends Token { + LineBreak(int lineNumber, float y) { super(lineNumber, y); } @@ -544,15 +557,15 @@ public String toString() { } } - private static class SingleLine extends Unit { - public SingleLine(int lineNumber, float x, float y, String unit) { + private final static class SingleLine extends Unit { + SingleLine(int lineNumber, float x, float y, String unit) { super(lineNumber, x, y, unit); } } @SuppressWarnings("serial") class PlainDocumentException extends Exception { - public PlainDocumentException(String message) { + PlainDocumentException(String message) { super(message); } } @@ -562,16 +575,16 @@ public PlainDocumentException(String message) { * fit as many words as possible into one line */ - private class LineAnalysis { + private final class LineAnalysis { - public int start; - public int end; - public float remainWidth; + int start; + int end; + float remainWidth; - public LineAnalysis(int start, int end, float remainWidth) { + LineAnalysis(int start, int end, float remainWidth) { this.start = start; this.end = end; this.remainWidth = remainWidth; } } -} \ No newline at end of file +} diff --git a/library/src/main/java/com/bluejamesbond/text/Styled.java b/library/src/main/java/com/bluejamesbond/text/Styled.java index 7980b4d..89a5528 100644 --- a/library/src/main/java/com/bluejamesbond/text/Styled.java +++ b/library/src/main/java/com/bluejamesbond/text/Styled.java @@ -1,34 +1,5 @@ package com.bluejamesbond.text; -/* - * Copyright 2015 Mathew Kurian - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * Styled.java - * @author Mathew Kurian - * - * From TextJustify-Android Library v2.0 - * https://github.com/bluejamesbond/TextJustify-Android - * - * Please report any issues - * https://github.com/bluejamesbond/TextJustify-Android/issues - * - * Date: 1/27/15 3:35 AM - */ - import android.graphics.Canvas; import android.graphics.Paint; import android.text.Layout; @@ -44,24 +15,23 @@ * like {@link android.text.Spanned} object with * {@link android.text.style.ReplacementSpan}. * - * @hide */ -public class Styled { +public final class Styled { /** * Draws and/or measures a uniform run of text on a single line. No span of * interest should start or end in the middle of this run (if not * drawing, character spans that don't affect metrics can be ignored). * Neither should the run direction change in the middle of the run. - *

- *

The x position is the leading edge of the text. In a right-to-left + * + * The x position is the leading edge of the text. In a right-to-left * paragraph, this will be to the right of the text to be drawn. Paint * should not have an Align value other than LEFT or positioning will isCancelled * confused. - *

- *

On return, workPaint will reflect the original paint plus any + * + * On return, workPaint will reflect the original paint plus any * modifications made by character styles on the run. - *

- *

The returned width is signed and will be < 0 if the paragraph + * + * The returned width is signed and will be < 0 if the paragraph * direction is right-to-left. */ private static float drawUniformRun(Canvas canvas, @@ -122,10 +92,8 @@ private static float drawUniformRun(Canvas canvas, workPaint.setColor(workPaint.bgColor); workPaint.setStyle(Paint.Style.FILL); - if (!haveWidth) { - ret = workPaint.measureText(tmp, tmpstart, tmpend); - haveWidth = true; - } + ret = workPaint.measureText(tmp, tmpstart, tmpend); + haveWidth = true; if (dir == Layout.DIR_RIGHT_TO_LEFT) { canvas.drawRect(x - ret, top, x, bottom, workPaint); @@ -140,7 +108,6 @@ private static float drawUniformRun(Canvas canvas, if (dir == Layout.DIR_RIGHT_TO_LEFT) { if (!haveWidth) { ret = workPaint.measureText(tmp, tmpstart, tmpend); - haveWidth = true; } canvas.drawText(tmp, tmpstart, tmpend, @@ -149,7 +116,6 @@ private static float drawUniformRun(Canvas canvas, if (needWidth) { if (!haveWidth) { ret = workPaint.measureText(tmp, tmpstart, tmpend); - haveWidth = true; } } @@ -157,9 +123,8 @@ private static float drawUniformRun(Canvas canvas, x, y + workPaint.baselineShift, workPaint); } } else { - if (needWidth && !haveWidth) { + if (needWidth) { ret = workPaint.measureText(tmp, tmpstart, tmpend); - haveWidth = true; } } } else { @@ -200,6 +165,7 @@ private static float drawUniformRun(Canvas canvas, * @param fmi FontMetrics information; can be null * @return the actual number of widths returned */ + @SuppressWarnings("UnusedReturnValue") public static int getTextWidths(TextPaint paint, TextPaint workPaint, Spanned text, int start, int end, @@ -238,16 +204,16 @@ public static int getTextWidths(TextPaint paint, * Renders and/or measures a directional run of text on a single line. * Unlike {@link #drawUniformRun}, this can render runs that cross style * boundaries. Returns the signed advance width, if requested. - *

- *

The x position is the leading edge of the text. In a right-to-left + * + * The x position is the leading edge of the text. In a right-to-left * paragraph, this will be to the right of the text to be drawn. Paint * should not have an Align value other than LEFT or positioning will isCancelled * confused. - *

- *

This optimizes for unstyled text and so workPaint might not be + * + * This optimizes for unstyled text and so workPaint might not be * modified by this call. - *

- *

The returned advance width will be < 0 if the paragraph + * + * The returned advance width will be < 0 if the paragraph * direction is right-to-left. */ private static float drawDirectionalRun(Canvas canvas, @@ -263,6 +229,7 @@ private static float drawDirectionalRun(Canvas canvas, // having both parameters is redundant and confusing. // fast path for unstyled text + float currentX = x; if (!(text instanceof Spanned)) { float ret = 0; @@ -278,7 +245,7 @@ private static float drawDirectionalRun(Canvas canvas, if (canvas != null) { canvas.drawText(tmp, 0, tmpend, - x - ret, y, paint); + currentX - ret, y, paint); } } else { if (needWidth) { @@ -286,7 +253,7 @@ private static float drawDirectionalRun(Canvas canvas, } if (canvas != null) { - canvas.drawText(text, start, end, x, y, paint); + canvas.drawText(text, start, end, currentX, y, paint); } } @@ -297,7 +264,7 @@ private static float drawDirectionalRun(Canvas canvas, return ret * dir; // Layout.DIR_RIGHT_TO_LEFT == -1 } - float ox = x; + float ox = currentX; int minAscent = 0, maxDescent = 0, minTop = 0, maxBottom = 0; Spanned sp = (Spanned) text; @@ -316,8 +283,8 @@ private static float drawDirectionalRun(Canvas canvas, // XXX: if dir and runIsRtl were not the same, this would onDraw // spans in the wrong order, but no one appears to call it this // way. - x += drawUniformRun(canvas, sp, i, next, dir, runIsRtl, - x, top, y, bottom, fmi, paint, workPaint, + currentX += drawUniformRun(canvas, sp, i, next, dir, runIsRtl, + currentX, top, y, bottom, fmi, paint, workPaint, needWidth || next != end); if (fmi != null) { @@ -348,7 +315,7 @@ private static float drawDirectionalRun(Canvas canvas, } } - return x - ox; + return currentX - ox; } /** @@ -389,7 +356,7 @@ static float drawText(Canvas canvas, * Draws a run of text on a single line, with its * origin at (x,y), in the specified Paint. The origin is interpreted based * on the Align setting in the Paint. - *

+ * * This method considers style information in the text (e.g. even when text * is an instance of {@link android.text.Spanned}, this method correctly * draws the text). See also @@ -415,6 +382,7 @@ static float drawText(Canvas canvas, * @param needWidth If true, this method returns the width of drawn text * @return Width of the drawn text if needWidth is true */ + @SuppressWarnings("unused") public static float drawText(Canvas canvas, CharSequence text, int start, int end, int direction, @@ -423,14 +391,14 @@ public static float drawText(Canvas canvas, TextPaint workPaint, boolean needWidth) { // For safety. - direction = direction >= 0 ? Layout.DIR_LEFT_TO_RIGHT + int safeDirection = direction >= 0 ? Layout.DIR_LEFT_TO_RIGHT : Layout.DIR_RIGHT_TO_LEFT; // Hide runIsRtl parameter since it is meaningless for external // developers. // XXX: the runIsRtl probably ought to be the same as direction, then // this could onDraw rtl text. - return drawText(canvas, text, start, end, direction, false, + return drawText(canvas, text, start, end, safeDirection, false, x, top, y, bottom, paint, workPaint, needWidth); } diff --git a/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java b/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java index ea51a2f..659a23b 100644 --- a/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java +++ b/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Locale; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /* * Copyright 2015 Mathew Kurian @@ -43,13 +43,20 @@ * @date 2014-10-20 */ +/* + * Several performance and memory optimizations + * + * @author Martin Fietz + * @date 2015-09-06 + */ + @SuppressLint("UseSparseArrays") public class DefaultHyphenator implements IHyphenator { private static final HashMap cached; static { - cached = new HashMap(); + cached = new HashMap<>(); } private TrieNode trie; @@ -75,48 +82,54 @@ public static DefaultHyphenator getInstance(HyphenPattern hyphenationPattern) { private TrieNode createTrie(Map patternObject) { - int i = 0, c = 0, p = 0, codePoint; - - String[] chars, points; TrieNode t, tree = new TrieNode(); - ArrayList patterns = new ArrayList(); for (Map.Entry entry : patternObject.entrySet()) { - Matcher matcher = Pattern.compile(".{1," + String.valueOf(entry.getKey()) + "}") - .matcher(entry.getValue()); - while (matcher.find()) { - patterns.add(matcher.group(0)); - } - - for (i = 0; i < patterns.size(); i++) { - chars = patterns.get(i).replaceAll("[0-9]", "").split(""); - points = patterns.get(i).split("\\D"); + int key = entry.getKey(); + String value = entry.getValue(); + int numPatterns = value.length() / key; + for (int i = 0; i < numPatterns; i++) { + String pattern = value.substring(i * key, (i + 1) * key); t = tree; - for (c = 0; c < chars.length; c++) { - if (chars[c].length() == 0) { + for (int c = 0; c < pattern.length(); c++) { + char chr = pattern.charAt(c); + if(Character.isDigit(chr)) { continue; } - - codePoint = chars[c].codePointAt(0); - + int codePoint = pattern.codePointAt(c); if (t.codePoint.get(codePoint) == null) { t.codePoint.put(codePoint, new TrieNode()); } - t = t.codePoint.get(codePoint); } - t._points = new ArrayList(); - - for (p = 0; p < points.length; p++) { - try { - t._points.add(Integer.parseInt(points[p])); - } catch (NumberFormatException e) { - t._points.add(0); + List list = new ArrayList<>(); + int digitStart = -1; + for (int p = 0; p < pattern.length(); p++) { + if (Character.isDigit(pattern.charAt(p))) { + if (digitStart < 0) { + digitStart = p; + } + if(p == pattern.length()-1) { + // last number in the pattern + String number = pattern.substring(digitStart, pattern.length()); + list.add(Integer.valueOf(number)); + } + } else if (digitStart >= 0) { + // we reached the end of the current number + String number = pattern.substring(digitStart, p); + list.add(Integer.valueOf(number)); + digitStart = -1; + } else { + list.add(0); } } + t.points = new int[list.size()]; + for(int k=0; k < list.size(); k++) { + t.points[k] = list.get(k); + } } } @@ -124,46 +137,32 @@ private TrieNode createTrie(Map patternObject) { } @Override - public ArrayList hyphenate(String word) { - - int i, j, k, wordLength, nodePointsLength; - ArrayList nodePoints; - ArrayList characters = new ArrayList(); - ArrayList characterPoints = new ArrayList(); - ArrayList originalCharacters = new ArrayList(); - ArrayList points = new ArrayList(); - ArrayList result = new ArrayList(); - TrieNode node, trie = this.trie; - - result.add(""); + public List hyphenate(String word) { word = "_" + word + "_"; + Locale locale = Locale.getDefault(); + String lowercase = word.toLowerCase(locale); - for (char character : word.toCharArray()) { - characters.add((String.valueOf(character)).toLowerCase()); - originalCharacters.add(String.valueOf(character)); - } - - wordLength = characters.size(); + int wordLength = lowercase.length(); - for (i = 0; i < wordLength; i++) { - points.add(i, 0); - characterPoints.add(i, characters.get(i).codePointAt(0)); + int[] points = new int[wordLength]; + int[] characterPoints = new int[wordLength]; + for (int i = 0; i < wordLength; i++) { + points[i] = 0; + characterPoints[i] = lowercase.codePointAt(i); } - for (i = 0; i < wordLength; i++) { + TrieNode node, trie = this.trie; + int[] nodePoints; + for (int i = 0; i < wordLength; i++) { node = trie; - - for (j = i; j < wordLength; j++) { - node = node.codePoint.get(characterPoints.get(j)); - + for (int j = i; j < wordLength; j++) { + node = node.codePoint.get(characterPoints[j]); if (node != null) { - nodePoints = node._points; - + nodePoints = node.points; if (nodePoints != null) { - for (k = 0, nodePointsLength = - nodePoints.size(); k < nodePointsLength; k++) { - points.set(i + k, Math.max(points.get(i + k), nodePoints.get(k))); + for (int k = 0, nodePointsLength = nodePoints.length; k < nodePointsLength; k++) { + points[i + k] = Math.max(points[i + k], nodePoints[k]); } } } else { @@ -172,29 +171,29 @@ public ArrayList hyphenate(String word) { } } - for (i = 1; i < wordLength - 1; i++) { - if (i > this.leftMin && i < (wordLength - this.rightMin) && points.get(i) % 2 > 0) { - result.add(originalCharacters.get(i)); - } else { - result.set(result.size() - 1, - result.get(result.size() - 1) + originalCharacters.get(i)); + List result = new ArrayList<>(); + int start = 1; + for (int i = 1; i < wordLength - 1; i++) { + if (i > this.leftMin && i < (wordLength - this.rightMin) && points[i] % 2 > 0) { + result.add(word.substring(start, i)); + start = i; } } - + if (start < word.length() - 1) { + result.add(word.substring(start, word.length() - 1)); + } return result; } /** * HyphenaPattern.java is an adaptation of Bram Steins hypher.js-Project: * https://github.com/bramstein/Hypher - *

+ * * Code from this project belongs to the following license: - *

* Copyright (c) 2011, Bram Stein All rights reserved. - *

+ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - *

* 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. 2. Redistributions in * binary form must reproduce the above copyright notice, this list of @@ -202,7 +201,7 @@ public ArrayList hyphenate(String word) { * materials provided with the distribution. 3. The name of the author may not * be used to endorse or promote products derived from this software without * specific prior written permission. - *

+ * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO @@ -219,6 +218,22 @@ public ArrayList hyphenate(String word) { @SuppressWarnings({"serial", "unused"}) public static class HyphenPattern { + public static final HyphenPattern DE = new HyphenPattern(2, 2, new HashMap() { + { + put(3, "2aaa1äa1ba1da1ga1j2aoa1öa1p2aqa1ßa2ua1xä1aä1bä1dä1gä1jä1k1äqä1ß1äxä1z1bibl21cacä3c1dc4h1cic1jc4k3co2cp2cs3cu1cy1de1did1ö1due1be1d4eee1fe1ge1ke1m2eoe1pe1qe1ße1te3üe1wey1e1z1fa1fä1fe1fi1fo1fö1fu1fü1fy2gd1geg1n1guh1j2hl2hnh1q2hr4hsh2ü2hwh1zi1a2iä2ici1d2ifi1ji1ßi1üj2u1ka1käkl21ko1kök1q2ks1kü1le1li4ln1lo1lö1ly1ma3mä1me1mi1mo1mö1mu1mü1my1na1nä1ne1nin1j1noo1b2oco1d2oi2ol2omo1qo2uo1vo1xö1bö1dö1e1öf2önöo1ö1ßö1vö1wö1zp2a1päp2e1php1j1puqu42rc1re1ri4rnr1q1ru1rü1ry1sa1sä1sc1se1si1so1sös1t1su1sü1ße1ßiß1j1ßu1ta1tä1tet1h1ti1to2tö2ts1tu2tü2ua2ucu1h2uiu1ju1lun12uou1q2usu1w1üb2üc2üdü1gü1k2ünü1ß2ütü1vü1zve2v2r2vsw2aw2ä2wnw2rw2ux1a1xe1xix1jx1q1xu2xyx1zy1by1ey1gy1hy1jy1ly1py1ry1vy1wy1yzä2zu1zw2"); + put(4, "_ax4_äm3_ch2_en1_eu1_fs4_gd2_gs4_he2_ia4_in1_ks2_oa3_öd2_pf4_ph4_ps2_st4_th4_ts2_um3_ur1_xe3a1abaa1ca3au2abaab1ä1abd1abf1abg1abh2abi1abkab1l1abnab3r1abs2abu2abü1abw2aby1abz2aca2acc2acu1add2adf2adh5adj2ado2adp2adq2adu2a1eae2bae2cae2da2ekae2pa2eta2ewae2xaf1a2afe2afia2fö2agaag2n2agt2ah_2ahsa1huah1wa1hyaif2a2il2aisaje22ak_2akb2akc2akd4ako2aks1akza1laa1lä2ale2ali2aloa1lu4aly2am_2amä2amf2amk2amla2mö2amu1anb2ane1anf1anh2anj1anl2anna1nö1anra1nü1anwao1ia1opa1or2ap_2apa2apea2pfap2n2apr2ar_a1raa1rä1arb2are2arf2arh2ari2arr2arua2rü2arv2ary4asha2söa2süaße22a1tata1at2cat2eat2h3atmat1ö4atra3tü2au_2aub4auc2aue2aug2auj4aum4aunau1o2auu2auw2aux2auz2a1ü2a1v4avia2vr2a1wax2eays4ay3t2a1zaz2aaz2oaz2uäb2sä1ckä2daä2dräd2s2ä1eäf3läf3räf2säg2näh1aä3hi2ähm2ähsä1huäh1wä1imä1la2äleä1lu2ämläm2s2än_2äne2änsä1onä1paär1äär1c4äreä1röä2rü1ärzä3suä3teät2häu1cä2uf1äug4äul2äumä2un2äur1äuß4ä1v3bah3basb2ärb2äs4b1bb3bebb2sbbu12b1c3be_3bea3beb3bek3bel1bembe1o3bet1bezbge3bib23bilbiz24b1j2bl_b2leb2lo3blü2b1mbni2bo4abo2cboe1b1op2böfb1öl2b1qb2r42br_3brä3brü4b1sb3säb3scb4slb2söbss2bs2t4b3tb5teb4thbt4rbtü1bu2fbü1c2b1v2b1w3by1by3pbys2ca1h3camc4an3carcäs22c1ccch22cec2cefce1i2cek1cen1cer1cetce1u2c1f4ch_2chb2chc2chd2chf2chg2chh2chj2chk2chp4chs2cht4chü2chv4chw1chy2chzci1cci2s4ck_ck1ack1ä2ckb2ckc2ckd1cke2ckf2ckg2ckh1cki2ckk2ckm2ckp4cks2ckt1cku2ckv2ckw1cky2ckzclo1co2ccoi22c1qcre2cry2cs2ac2si4c1tcti22c1z3da_da1ad1afd1agda1sdä2u2d1cd3dhd5dodeg2d1eides1det2dga2d3gl3di_3dicdi2edi1p2d1j4d1ld3ladni2d1obdo2o2d1qd2r4d3rid3rö2d1s4dsb4dsld2södss4dst42d1td2thdto2d3tödt3rd3tüdu2fdu1idu1odur22düb3düf3dün2d1wdwa2dy2s2d1z2e1aea2ceak1eam3e2ase1ä22eba2ebl2ebre3bue1ce2ecle3cr2ected2eed2öee1eeeg2e1eie1en2ef_2efa2efe2efi2eflefs22efu2efüegd4e3gee2gn2egue1hee1hi2ehme1hoehs22ehte1hue1hüeh1we1hy4eibe2idei1ee4ilei1p2eire2it2eiu2e1jek2a1ekdek4nek2oek4r2ektek2ue1la2eli2eln2eloe1lü2elz2ema2emm2emüen3fe4nre4nten1ue1nüe1nye1ofe1ohe4ole1ore1ove1ö2e3pae3puer1ae1räer1cer3h2erie1roer1ö2eru2esbes2c2esf4eshes3l2esmes2ö2esp2esres3we3syes3ze3teet2he3tie3tö2etre3tü2etz2euf1euke1um2euneu1p2eut2eux2e1ve3vo2ewae3wä2eweew2s2ex_3exp2exuey4neys4e3ziez2wfab43facf4ahf2alf2arf3atfä1cf1äu2f1cfe2c3fewf1ex3fez2f1fff2efff4ff3lff2s3fi_fid2fi2ofi2r3fis3fiz2f1jf2l22fl_1fläf3löf4lü2föf2f1qf2r2f3ruf3rü4f1sf3scf3sifs2tf2süf3sy4f1tf2thf3töf3tü3fugf1umf2ur3fut2fübfü2r2f1v2f1w2f1zfz2afz2öfzu33ga_ga1c5gaiga1kgäs5gä4ugbi22g1cg1dag1dog1dögdt4gd1uge1cged4gef4g2el4g1gg3gegg4r2g1h4gh_gh2egh1lg2hugh1w2g1j4gl_2gls3glüg2ly2gn_gn2e2gng2gnp2gns2gnt2gnug2nüg2ny2gnzgo4a2goggo1igo1y2g1qg2r4gse2g4slgso2gsp4g4swg3sy2g1tg3tegt2sg3tügu1cgu2egu2t2gübgür1güs32g1v2g1w3haah1ahh1aph2as2h1c2heahe3x2hi_2hiahi2ehi2n2hio2hiuhlb4hld4hlg4hll2hlm2h2lo2h1mh2moh3möhm2sh2muh2nah2nähn2eh1nu2hodhoe42hoih2on2hoo2hop3hov1h2öhö2ch4örhr1chr3dhrf2hrg2h2rihrr4h3rüh2ryhrz2hss24h1th2thhto2h4tshtt4h3tühu1chu2n2hurhüs32h1vhvi23hyg3hyphz2o2ia_i4aai2ab2iaci2afi2ahi3aii2aji2ak2iali2am2iani2apia1q2iasi3au2iavi1ämiär22i1bib2oi2böice1idt4i2dyie1ci1eii1exif3lif3rif2s2i1gi2gli3go4i1hi3heih3mih3nih3rihs2ih1wi3i2ii4s2i1k4ikei2kni1la6ilbil2cilf22iloilv42im_2ime2imo2imt2imu2inein3f2inoi1nö2inp2inrin1ui1ny2i1oio1cio2dion2i2ori2oui2ovio2xi3ön2ip_i1pai1peiph2ip4li1pr2ips2ipu2i1qi1räir1cir2eir2i2irki1roi1rö2isb2iseis3ti2sü4itäi6tli3töi3tü2itzium12i1v2i1w2i1xi2xai3xi2i1zi2zöja1c2jatje2aje1cje2gje2pje3wji2ajit3ji2vjoa3jo2iju2kjus32j1v3ka_ka1ck2adk2agka2o3kask1ähk1änkär2kby42k3cki1c3kir2kiz2k3j4kl_k2lek1lu2kly2k1mk2n2k3nek3nu3knü3komk2onk2os3kowkö2fk1ölk2r4kst44k1tk2thktt2k3tükt3zku1ckuh12kübkü1c2k1v2k1w3la_1lad2laf1lai3lao1lawlay1lä1c1läd2läf4lät2l1blb2slb2u2l1c4l1dld3rldt43le_2lec3ledle2e3lehl2ek2leple2u3levl2ey2l1flf4u2l1glgd4l3go3li_3liali1cl2ie3ligli3l2limli2o3liu4l1j2l1klk2l4l1lllb4llg4llk4ll5mlln22l1mlm3plm3tlnd2l3nil1nul1nü3loklo2o2lox2löd4lög4löß2l1plp2fl3pu2l1q4l1s4l1tl2thl6tsltt2l3tü1luf4luo2lur3lux2lüb5lüd2l1v2l3wly3c3lynly1oly3u2l1zl2zölz1wm1abmae2ma1f3mas3maßm4aymb4lmby42m3c2m1dmd1ameb43mehme1o2meö3mesmeu13mi_mi1c3mig3mil3mit2m1jm3ka4m1lm3li4m1mmmd2mmm2mm3pmm2smoa33moh3mom3mos3motmo1ymö2c4mökm1öl2m1pm2pfm3pim3pu2m1q4m1sm3säm3scm3sem2süm3sy4m1tm2thm3tömtt2m3tümt3zmu1a3munm4us2müb3mün3müt2m1vmwa2my4s2m1z3na_n1af3nain1ar3nas3natn1au3näe3näs2näunby42n1cn2ck2n1dn2döndy33ne_2nec3nedn1efneg4ne2l3nenne2un2ew3nez2n1fnf2änff4n3finf4lnf2onf4rnf3s4n1gng3mn2gnn3hän3hen3hu3nian1idn4ie3niknin1n2ip2nitni3v3nix2n1k4n1nnn3fnng4n3ni3no_no1cn1of3nov3now3noz2nödn2ör2n1q6n1snsp4n3sy2n1tn3ton3tön4tsn3tun3tü1nu_1nud3nuenuf21nug1nuinu2n1nuo2nup2nur1nut1nuu1nux1nuz3nü_3nüs1nüt4n1w1ny_1nyhn1yo1nyr1nys1nyw2n1znz3so4aco4ado4aho2aro2aso4ato5au2obbob2e1objob1lo3cao1ceo1ck2odrodt4o2ecoen12ofa2ofiof3l2ofo2oft2o1go3ghogs2o1hao1häo1heo1hio1hooh1soh3to1huoh1wo3ieo1imo1inoi2r2o1j2o1kok4n4okrokt4o1lao1läol2io3loo1lu3olyoms2omy12ona2onä2onc2oneono1o1nuon3v1onyon3zoof2o1opo1oro1pao1pi2or_or1ao3räor1c4ore2orf2orh2orm2orq2orro3ru2osh2osio3sk2oso2o1to3tüoub4oug2o3uho3um2our2ouv2o1ü2ovi2ovo2o1wo3wiox2aox2eo2xu1oxyo1yo2o1zoz2eo3ziöb2l2ö1cödi3öf3lög3lög3rö1heö1huö1keök3r3öl_öls2öm2sön2eö3niön2sö1nuö1peör1cöru4ö2saö2spö2stö3su2ö1töt2höts2öze31pa_1paa1pacpag41pak1pap2paß1pat1pau3päd3pär3päs2p1b2p3cpda41pe_pe2a1pedpef4pei13pel1pem1pep3pet4pf_1pfäpff4pf3r2p1g4ph_ph2a2phä2phb4phd2phf4phg4phkph2l2phm2phn2phöph4r2phs2phz3pik1pilpi2o3pip3pispku22pl_3pläp4lo2p1n1p2opo1c3podpo2i3pokpo2wpo3xpö2c2p1ppp3lppt2p2r2p4rä2p1s4ps_p3sep2söp2st2p1tpt1ap3tep2thptt2ptü4pt3zpu1apub42puc2pur3put1püf2pülpün22p1v2p1w3py1pys4py3t2p1z1ra_r1abr2ad1raer2afr2air2alr2apr1arr2as2raß1rat1raür2ax4räf4räg2räh2rämrä2u2r1brbb2rb2orb2srb2ur1ce2r1dr2dördt43re_2reä3reg3rekre2u2reür1ew3rez2r1frf2u4r1gr1h42rh_2rha2rhä2rhö2rhsrid2r2ie3rigr2isr2itrix12r1j2r1krk4n4r1lrl2erl3t4r1mrm2urnd4r3nern3frng2r3nirn1ör1nur1nür1nyro1c2rof3roir2onr1or4roß2rox2röf4rögr1ök4röpr1örrp4erpf4r3porp3tr3pu2r1rrrb2rr1crr2or3ru4r1sr3sirs3lr3sor3sy4r1tr3tör4tsrtt4r3türt3zru1a3ruf4rug2rum3rut4ruz2rüb2r1v2r1w4r1xry2c2r1zrz2ö3sa_3saa3sams1an3sat3säl2sc_s2ci2scj4scl2scos2cr2scs2scusd4r3see3seh3seq3set2s1hsh2as3häsh3ns3hösh4rsib43sio2s1j4sk_4skbsk4lsk4n4skö4skss3läsl3bs3les3li4sna4snö3so_so4aso1c3sog3sol3somso3o3sos3sov3sow3sozsö2csö2fs1ös1sp22sp_s2pä2spls3pn4spy2s1q6s1sss3l6st_s2ta2stb2stdst2e2stf2stg4sth2stj2stk4stl4stm2stns2to1stö2stp2stqs2trst2u1stü2stv2stwsu2n3suv3süc3sün4s3v2s1ws3was3we1s4ysyl12s1zsz2os3zü2ß1c2ß1d2ß1f2ß1h2ß1l2ß1mß1o2ßos2ßst22ß1t2ß1ü2ß1v2ß1w2ß1z3ta_4taatah2t2ai2tam3tas3tav3tax4täbtä1c4täd3täe3täg2täh4tämt1äptä2st2ät2täx4t1ct4ckt3cr3te_2teh3ten3tes4th_th2e1thi2thk2thp2ths2thü2thvt2hy3tig3tik3tio3tip3tis3tiv2t1j4t3ltl4e3to_to1c3tod3tok3ton3too4toß3tow4töftö4l3tön4töß3töttpf42t1q2tr_3tritry14ts_ts1ot2söt3sy4t1tt3tit3tot3töttt4t3tut3tü2tub3tuc2tud3tue4tuf2tuh2tuk4tüb3tüf3tüm4t3v4t3wtwa21ty13typtys44t1ztz1ätz2öu1amu3auu1ayu1ämu1äu2u1bub2lub1ru1ce2u1d2u1eu2edu2eguen1u2ep2uffuf3luf3r2u1gugo3u2göu2gü2uh_uh1wu1ieu3iguk2au1keu1kiuk4nuk2öu1kuulb4ulg4u2lü1umf1umg1umk1uml4umm1umr1umz4un_u3ne2unk1unruns21unt1unw2unzu3ofuos2u1pau3piu1pr2ur_u1raurd22ure2urfu1röur3purt2u3ruurü2u2sü2u1ß2u1tu3teuto1u3töu3tüu1ü22u1xux2eux2oux3tu1ya2u1z2übc2übdübe2üb3lüb3rüd3rüf3lü2gnüg3süh1aü1heüh1iüh1süh3tü1huüh1wül1aül2cül4eü1luün2sünt2ü1nuü1peü1piür1aürr2ür2süs2aü2stva1cva1sv4at2v1b2v1dve3bve3cve3dve3gve3hve4ive3over1ves12veüve3v2v1g2v1hvi2cvig22v1k2v1m2v1n3vol3voyvö2c2v1pv3revs2e2v3t2v1v2v1w2v1z1waa1wag1wah1walwa2p1was1wäh1wäl1wäswbu22w1c2w1dwe2a1weg1wehwe2i1wet2w1g2w3h1widwi2ewik21wil2w1k2w1l2w1mwn3s1wohwot21wöc2w1pw3ro2w1sws2t2w1twti21wucwul2wus21wühwül2wün32w1w1xa_1xae2x1b2x1c4x1d2xekxe2lx1emx2en3xes2x1f2x1g2x1hxib4xi1cxi3gxil12x1l2x1m2x1nx1or4x1p2x1r4x1txt1äxt1uxu1axu2s2x1v2x1w3xy_3xys1yacy1äty1c2y1d4y2efy1f2ygi2yg2lyhr2y1i4y1k2yl3cynt2y1nuy1ofyom2y1osy1ouypa2ype2y2pfy3phypo3y3riyrr2yse1y1t2yu2ry1z2za1c3zahz1anz1as2z3czdä1ze1e2z1h2z1j3zolzo2oz1orz1öl2zön2z1qz3saz3shz3skz3sz2z1tz3töz3tüzu3azub4zud4zu3kzuz22züb2z1v4z1zzz2ö"); + put(5, "_ab1a_abi4_ab3l_abo2_ack2_ag4n_ag4r_ag2u_ai2s_ang2_an3s_apo1_aps2_as3t_at4h_au3d_ät2s_by4t_dab4_de1i_de1s_dü1b_dys1_ei3k_eke2_enn2_er1e_erf4_er1i_es1p_et2s_eu3t_ext4_fe2i_fi2s_ga4t_ge3u_hi2s_im2a_im5m_in3e_ink4_inu1_ire3_is2a_jor3_ka2i_ki4e_kus2_li2f_ma3d_ma2i_me2e_ne4s_ni4e_nob4_nus2_ob1a_obe2_or2a_ort2_ozo4_pro1_ro4a_ro3m_rü1b_sch4_sha2_te2e_te2f_te2s_ti2a_tid1_ti2s_to2w_umo2_un3d_un3e_un3g_un3s_ur2i_ut2a_ut3r_übe4_vo4r_wa2s_wi4e_wor2_ya4l_za2s_zi2e_zwe2aa2beaa2gr4a2araart2aas5tab2äuab1ebabe1eabei12abela3ber2abet2abew3abfiab1irab1it2ableab3liab4loa2blua2bo_ab2of2abora3braa4brä2abrü2abs_abs2aab5scab3spabst4ab3szab1uraby4ta1cem2ach_ach1a2achba1che4achfa1chiach3lach3mach3na1choach3öach3ra4chta1chuach3ü2achvac1in2ada_ad2agada2m4adav1a2dä2ade_2aden4a3diad2obad3ru2ads2ad3stad3szad2t1ad4tead4tra2elaa2eleae2o3aes5ta2faka2fana3faraf4ata2faua2fexaf2fl2af3lafo1saf3raaf3räaf3reaf3röaf2spag1abag1arag1auag2diag2drag2duage1iag2er2agesag3gl1aggr2a2glag4laa4glöag4nuag4roagsa2ags3pag2th2a1haah4at2a1heahe1sa1h2iahin3ah2löahnt21ahorah1osa2h3öahr1aah3riaht3saian3aid2sai1e2aien3ai3g4a3ik_ai3keai3kuai2loa1indain4ea1ingai2saaiso2a3iv_aive3a3ivla3ivs2akal2akarak4at4a1kea2kefa2keu2a1ki2ak3lak4li2a1kr4akra3akroak3sh2akta2aktb2a1kua2kun4a3kü2ala_al1abal1afala2ga3lalal1ama2larala4s2alatal1aual1ämal2bralb3sal2däal2dral3dualen1ale2pale4talf4r3algi3almba2l1öal3öfal2ös1alphal2ufa2lumal1ural2zw2am2aamab4amad2ama3g2am4e4ame_a2meba3meta2mewa3miea3mis2ammlammu2am3pr2am2sam3sa1amt_am4töam2tu2ana_2anabana3ca3nak2anam2ananan1äs2anbuan3ch2and_2andua3nee2anfi4ang_2angf2anghang1l2angoang1r2a3ni2ank_an3klank1rankt42anmu3annäan1oda3nola3nos2anpr1ansä1ansc2ansk2ant_2anto1antr1antw2a1nuanu3s2anzb2anzg2anzs1anzü2anzwa1os3ao3t2a3ot_a2pefap2faa3pfla3phäa2pht2ap3la2pot3applap3pu2a3pua3ra_ar2ab2arb_4arba2arbiar2bl2arbr2arbt2arbu1ar1ca2reaa4rega2reha4reka3renare3uar2ewarf1rar2glar2gnar2iaar1ima3riuarm2äarn2e2a1roar1oba2rorar2rh2arsaarse32arsiar2st2arto2artsar1ufar1uhar1umarwa2ar2zä2arze1arztas3aua2s1äa2sca4as2ea2seba3ses2asisas1ora2s1pas2phas2pias2poa3spuas2stas3teas3tias3to2astraßen3at1abat2afat4agata3la3tama2tatat1aua2t1ä4ate_a2teb4atena2tep4atesat3ha3athl4a3ti4atorat3räat3reat2saat2seat2siat2soat3taatt3sa3tubatu2nat2zoau2draue2baue2sau2faauff43aufn4au1iau2isau3lüaun2eau1nua4unz2aup22ausc1ausd3ausf1ausg1auslau2so1ausr1ausü1ausz2aut_2aute1autoauz2wa3v4aawi3eax4am2a1yaa1yeuaysi1ä2b3lä1cheä1chiäch3lä2chrä1chuäck2eäf2fläge1iäge3sä2g3lä2g3räg4ra1ä2gy2ä3heähl1aähl2eäh3neäh3riä1is_ä1iskä2k3lä2k3rälbe2äl2bläl2p3ämt2eän5deän2dräne1sän2f52ängeän2glän2gr2ä3niänk2eän2kränk2säp2pläp2präp4stär4afäre2när2grärk2särm2sär1o2ärse2är4siär2stärt4eär2thär2zwä5s4eäse3tä2s1päss2eäs2stäs4träte2nät1obä2t3rät2saät2sääts3lät4trät2zwäu2bräude3äu3eläuf2eäug3läu2maäun2eäu1nuäu3seä3usgä3uskä3usnäu2späu2trba2bl2babs2b1afbais2ba2kabak1lbak1rbal2a2b1amban2ab1ang2banlban3tb1anzbar3bbar3nba2scba2stbau3gbau1sba1yobben3bbe4pbb2lö2b3d4bde1sbe3anbe3arbe3asb2ebe1be1cbedi4be1eh3bef4be3g2beil2b2einbe3li1ben_ben3nbe1ra3be1sbes2abe1ur3b2ew2b1ex2b5f4bfal22b1g2bges42b5h2bhut2bi3akbibe2bie2sbik2abil2abi2lubin2ebi2o1bio3dbi3onbiri1bi3seb1isobi2spb2it_b2itebi2tu2b1k4b3lad3blatb3leb3blemb4letb3leub2lie2bligb4lisb2litb4locb3los2blun3blut4b3n2bnis1bo5asb1ob3bo2blbo2brbo3d22b1ofbo3febo1is3bon_bond1bo2ne3bonsbo4räbor2sb1ortbo2scbo3thbo2xibö2b32b1p2bpa2gb4ra_b4rahbrä4u2bre_3brea2breg3bremb4rer2brigb4riob3rohb4ronb4rucbru4sbs3arbsat2b4särbs2äubs2cabs4cub3se_bse2bbsi4tbs2kubso2rbs2plb3stob3stöb3stübtal3btil4b4ts2bu2e3bu3libung4b2urgbu2sa2b3z22c1abca2chca2e3ca3g4cal3tca2pecar3ncas3tca1y2ceco4ce2drcen3gcere3ce3sh2ceta2chab2chaf1chaoch1äs1chef4chei2chic2chl2ch2lech2lu4ch2m2chn42chobcho2fch1ohch2r44chrech3rh2chuf2chuh2chum1cka_2ckac1ckag2ckalcka4r2ckau2ckeh2ckexck1imck1in3ckis2ck3l2ck3nck1o22ck3rckt2e3c4l2clet4co3chco2d2co3dicoff4co1itco2keco2lecol2oco2peco1racor3dco3recos3tco4te1c4r2cte3ecti4octur6cu2p32d1ab2d1acd2ac_dagi2dah3lda1ho3d4aida1inda1isdal2ada3löd1altdamo3d4ampd2an_d1ang2danw2d1apd2aph4dapp3darlda2rod3arrdar3sd1artda2rudas4tdat2a4datmdau3e2dauk2d1äh2d1äp2därzdä3us2d1b4dbu2cdco4r2d1d2ddar2de2adde3asde3b43de1cde1e4de3gldehe2de3hod2eicde2löd2en_dend2den3gd2enhde2nide1nude1ondepi2d4er_de3rude2sade2spde2sude1unde3us2dexp2d1f42d1g2dga3gd2ge_2d1h2d2hisdi4abdi2addi4amdi1cediet3dik2adin2adi2obdi2spdist2di2tadi2thdit3sdi2tu3di5vdi3z22d1k4d3l2edli2f2d3m24d5n2dnis1d2obadob4ld2obrdole4doll22doped2opp2dorc2dordd2orp2dortd2os_dos3sdost1dot6hdo3undö2l13d2ör2d3p2drag4d3rai2drädd4räh4dre_2dreg4drem2d3rhd4ri_d4ridd4ried4rifd4rikd4rild3robd3rocd4roid3roud5rubdrü1bd2sands1änd3seidse4td3shodso2rd2späds2pods2pud2steds2tids2tud2sundta2dd5teadt3hodt5s2du1ardub3l2d1uh2dumd2dumf2dumg2dumld2ump2dumrd1umsdung42dunrdun2s2duntdus3t2d1v2e3a2beab3lea2drea2g4ea3gaea3gleakt2ea2laeam1oea2nae2anoe3ar_ea2rae3arre3arveas3se3athea5tre3aug2ebedebe2i2ebeleb2en2ebeteb3loeb2lö2eb2oebot2ebö2seb4rueb2s1ebse22e3caech1äe1chiech3lech3mech3ne1chuech1weci6a2eckteco3dec1s4e3d2aed2dre3deiede2re3d2oeds2äed2suedu2se3dy3ee3a2eeb2lee2ceee1chee2ckeede3e1effeef4leef3see1imeel2ee1empeena2e2enäe2encee3nie2enoeen3see1rae1erde1erkee1röeert2e1erzee3s2ees3kee3taee2thee1u2e1e2xef1are2fate2fäue3fe_ef1emef2er2eff_1effief2flefi2s1efkue3fraef4rüef3soef3spe2fumege1ue2gloeg3nieg2thegus32e1ha2e1häeh2eceh2ele3hereh1läehle2eh3loeh3mue3holehr1äeh3rieh3sheh3übei2blei3de2eidn1eifrei3gl2eigt2eigu2eil_2eilbeil3d2eilne1impei4näein3kei3o2eip2fei3ree1irre2is_2eitäei3teei2theitt4e3ke_e3kene3kese3keye3k2lekt2oe3k2wela2cel1afela2h2elaoela4s2e1läel2da2ele_elea2ele2c2eleh2elei1eleke3lepel2ete3leu2elevele2x1elf_el3feelf4l1elfm1elfte3lieel3klel3leelm2ael5nae2lofe2lolelon2elö2selto22e1luel1ure2lyaelz2eema2keme2se2mop3empfem2saem2stem3t21emule2n1a4ena_2enace3nade4naf4enahe4nak4enam4enaten1äu2ene_2enem2enen2enesenf2aenf2uen3geen2gl1engpe3ni_e3nice2nide3niee3nio2enise3nit2enive2nofen1ohe3nolen1one3noteno2w2e1nöen3sp1entd1entn2entü1entw1entz2enut4enwüeo2fee1on_e1onde1onfe1onhe1onle1onre1onse1opee1opfeop4te3or_e3orbe3orse3orweo1s2e3os_eo3ulepa2gep3leep2paep4plep2prept2aepu2se3ra_era2ge1raie2rake1rale1rape2rare1rasera2ße1rawe1razer1äher1ämerb2eer3brer3da1erdber3de4ere_er1ebere2l2erer2ereserf2eerf4rerg3s2erhüe3ribe3rio2erk_erk3te3ro_er3oaer1ofer1ohe3rone3rose3rowerö2d2eröker3p4er3rä2errüers2aer3seers2ier3sker3sner3sper3sz4ertier3uzerü4bes3abes3ake3sceesch2es2eles2hues2ide2siles2ire4skees3kles3kue4skye3sote3spies3sces3se2essoe1stre1stues4tüeße2setab4et1am3etapet4atet1ähet2enete2oet3hüeti2m2e3toeto2bets2pet3suett1aet2thet2zäet2zweu1a2eu2gaeugs4euil4eu1ineu2käe3um_e3umbe3umleun2eeu1o2eur2eeu3speust4eut2heu2zw4everewä2se2we_e3wirewi2se3witex3atex1er1exis2ext_ex2tu2e3xye3z2aezi2sf1abefab5sfa2drfaib4fa2ke2fanb2fanf2fanlf1anp2fanrfan3s2fanw2f1ap3farifa3shf3aug3f4avfa2xa2f1b22f3d4fdie2f2echfe2drfe2eife1emfef4lf4eief1eisfel3tf2em_fem4m2fempfe2näfen3gfe2nof1entf2er_fe1raf2eref2ertf1erwfe2st3fete2fexpff3arff1auffe2eff3eiffe2mff4enf2fexff4laff4läff4lof3fluf3flüff3roff3röffs3t4f3g2fge3s2f1h2fi3atfien3fi3klfi2krfil3dfilg4fi3lif2inafi3nifin2sfi3olfi3rafis2afis2pfi3tu4f1k4f3ladf3lapf3länf4leef3lerflo2wf4luc2f3m2fma2d2f3n2fni2sfob2l2f1offoli3fo2nafon2efo2nu2f1opfo1ra3form2f1ök2f1ölför2s4f1p2f4racf5radfra4mf5rap2fre_f3recf3red2fregf3repf4reufri3dfri2e2frig1frisf3rocfro2sf3rotf2sanfs3arf4scefs4cofse4tf2sphfs1prfs3s4fs3thf4ta_f2tabft1afft1anft1arf3tatft3hoft1opft2s1ftsa2ftse4ft3stf2tumftwa4ft3z23f2uhfung42funt2gabfgab4r2gabz2gadlga1flga2kagal2ag4amo2ganbgan3d2ganh2ganl2ganwga1ny2garb2garc3gardg2arsga3ruga2saga2siga3spgas3sgat2a2gatmgat4rgau1cg2aukg1aus2g1äp2gärz2g1b2gber2gby4tgd1ing1d3rgd3s2ge3a2geb2ageb4rge1e2ge3ecge2esge1imge1irge2isge3lege3lügelz2ge3migem2uge3nagen3ggen3ngeo2rge1ouge3p4ge1ragerm4ge3sigest2ge5trge1ulge1ur2g1ex2g1f4gga4tg2g3lgg4log2g3n3gh2rgie3ggi2elgi2gugi3negi3tugi4us4g3k2g1labg1lac3glad3glätg2l4e2gle_3gleag3lecg3leg2glehg3len2glesg4lia2glib2glif2gligg2lik4gling2lio2glisg2lizglo3gg2lom2g1luglu2t2g1m2g2n2ag4na_2gnacg4nat3g2näg3neh2gneug2nieg2nifg4nin3g2nogno1r2g1of2g1ohgol2a2gord2gorggo2s1go3stgo3th2g1p2g4rebg4remg4rerg3retg3revgri2e3grif2grig2groc2grohgron4g4rosgro4ug4ruf2grut4g2s1gsa2gg3salgs3angs3arg3s2cg4scagsch4g4scogs2ehgsen1gs3ergse4tgsi2dg3silg3spigs3plgsrü2gs5s4gs3tag3stog3stögs3trg3stugs3tügti2mg5t4rgu3amgu1as2guedguet42g1uhgu1is3gummgu4stgut1agut3h2g3z2hab2ahab2eh2absha1kl2haleh1alph1amth2an_h2andh4ann2hanr2hantha2plha2pr2harbh2ardhasi1h1äff2h3b22h3d4hdan2he2adhe3behe2blhe3brhed2ghee4she2fä2heffhe2frhe2fuhe3guh1eieh1eifh1eighe2im4heioh1eiwhe3lihe3lohe2lö3hemdhe3mi3hemmh2en_he2näheng22henihe2nohen3z4he2ohe3onhe3ophe3phherg22hermhe3roh1eröhert2he3thhet2ih2e2uheu3ghe1y22h3f4hfi2s2h3g2hget42h1h2hi2achi1ce2hi3dh2idehi2krh1infh1inhhi3nohi4onhi3or2hip1hi2phhi2pih2i2rhi3rahi3rihirn1hi3rohir2shis2ahi2sehi2sthi1thhi3ti2h1k4h4lachla2nh1lash1lath3lädh1läsh1läuh3lebhle3eh3lerh3lesh3lexh2lieh2lifh2liph2lish2lith3lochl1ofhl1oph4lorh3löch2löshl3t2h3lufh3lukh1lüfh2mabh3magh3manh3marh4mäch4mähh4mälh4mäuh3me_hme1eh3menh4monhm3p4hm3sahms1phn1adh3namhn1anhn3d4h2nelhn3exh2nich2nidh2niehn1imhn1inh2niphn3k4h2norhnts2h2nuch2nulho2blho2efho4fa3hole4holo3holzhom2ehono3ho1rahor3dh1orgho3slho2spho4st2hot_ho3thh1o2xho1y2hö3ckhö2s1h3öst2h3p2hr1achr3adh1raih3räuh2rech3redh3refh3relh3rephre2th3revh3richri4eh3rinh2robh3rohh3rolh4ronh2rorh3rouhrs3khr2suhr4swhr2thh3ruhh4rübh2sanh2sauh2späh2sphh1stah1stoh2s1uh2t1ahta4nht2ash2tärht1ehhte2sh4thohtod1h3töpht4riht3röht2soht2sphtti2ht3z2hu2buhuko3hu2lähu2loh1umsh1unah1up_h1upshurg2hu3sahu2sohu2tihut2th4übsh3übuhvil4hwe1c2hy2thzug4iab4liaf4li3ak_i3akti5al_ia2läial3bial3dialk2i3allia2lui3am_i4amoian2ei3anni2anoi3anti3anzi3ar_ia2rai2ascia3shi2asiias3siast4i3at_i4ate1iatri3atsia3uni1är_i1ärsi1ät_i1ätaib1eiibe4nibi2ki3blai3blei4bräich1aich1äi1chei1chiich3lich3mi1choi1chuich1wi3damid2ani2deiidni3i2dol2i2drie3a2ie2bäie2blie2ckie2drie1e2iel3di1ell2i1eni3en_i3enai3endi2enei3enfi3enhi3enji3enki3enmi3enni3enöi3enpi3enrien2sie1nui3envi3enwi3enzie1o2i2erei4erii1ernie2röie3sui1ettieu2eie1unif1arif4atif1aui2fecife2iif2enif2flif4läi1flüif4rai1freif3seif3spif2taiga3iig1läig4nai4gnäig4noig4raig3säig4seig3soi2harihe1eihe4ni4is_i4i3ti2käri3ki_ik1ini2k3lik3noiko3si2kölik3räik3reik1s2ik3soik3szikt2eikt3ri2kuni3kusi1lä1il2daild1oil2drile2hil1el2ill_2illsil3öfi1lu2i2lumi3lusim4ati2megi2meji2meki2mew1immo1impoimp4s1impuim2stin2afin3ami3napina4sin1äsin3do2indrin3eii3nelin1euine2x2ingain2gl4inhei3nie2inigin2ir2inis2inn_2innlin1odin1orino3tin3suint2hin3zwi2odaio3e4iof4li2o3hio3k4i3ol_i3om_i3omsi3on_ion3di2onyi2o1pio4pfi3opsi3opti3or_i3orci3orpi3orsi3ortio3s2i2osti3ot_i3otsi3oz_i1ö2ki1ös_ipen3i3perip3fa2i1piipi2sip2plip3pui1r2ai3radirat2ir2bli3ree2irekir2glirg4sir2he2irigir4mäir2no1ironiro2sirr2hir3seir3shir2sti3sacis2api2saui2scaise3eisi2ais1opis1pais1peis3sais2stis4töis4tüit1amit1ani3tatit1auit2ärität22itelite4ni2texi5thr1itiii5tocit3rei3truit2sait2soit1uhitut4it2zä2i3u2i2vebive4niwur2ix2emiz1apiz1auize2niz4erizo2bi2z1wja3nejani1ja1stje3najet3tjo2b1job3rjoni1jo1rajord2jo2scjou4lju2blju3nijur2ok3a2aka3ar2kabh2kabska1frka1inka3kak1allkalo5k3amakand4kan2ekank42kanlk1anska3nu2kanw3kara2karbk2ardk2argk2arkk2arskar3tkaru2k2arwka3sekasi1kas3s2kattk1auskäse32k3b4kbo4nkbu2s2k3d2k1effkefi4kege2ke2glk1einkei1skeit2ke2lake2läkel1ek4eltk2en_ke2no2keo2ke2plk2er_k2erck2erlkerz2k6es_ket3ske1up2k3f42k1g22k1h4kho3mki3a4ki3drki2elki3k4ki3liki3lok2imik2in_k2ing2kinhk2inik2innkin3ski3orkio4skis2pkist2ki3zi2k1k44kla_k4lar4kle_4kleh2klic2kligk2link3lipk2lir4klizk4lopklö2sk2lötkluf23knabk4neiko2al2kobjkoff4ko1i2kol4ako3leko4muko3nu2kop_ko1pe2kops2kopzko3riko2spko2stko3ta2k1ouko2wek1o2x2k1p2k4rawk4raz2kre_2kreg2k3rh2krib2krip3kris2krufkrü1bk2sanks3ark2sauks2änksch4ks3hak3sofks1pak3speks2puks3s2k1stak1stek1stok1strk1stuk2s1uk3talkt1amkt1anktä3skte3ekt1eik2texkt3hokt1imk3topkt4rokt3s4kul2a4kulpkung42kuntku2roku2spkus3tku2sukür4s2k3z2kze3lla3ba2labb2labf2labg2labhlab2ol2abrl1abt3labu2labwla1celad2il1adl2ladm3ladul1advla2falaf3slaf3tla2gala2gnlago2l2akk2l1al4lall4lalpl2amil2amp2lanb2lanf2lanll1anp2lanslar3sla2ru4lasdla3se2lash2lasila2so2laspla2stlat2ala3telat2s1lauglawa41länd2läub2läuc2läue1läufl3bacl3blälb3lel2blil3blolb3salb3selb4sklb3splbs6tl3chel3chilch3llch3rlch3ülch1wlda2gld1all3daml3dasl3datld1auld1ärl2deil2dexldo2rld2osld2ö2l2dreld4rüld3sald3stld3thle2adle2bl4leddle3dele3eilef2ale2gäle2glleg4r4lehs4lehtl2eicl2eidl2eitlel3s4lemplem3sl2en_le2näl2enfle3nil2enkle1os3lepa3lepf3leprl2er_lerb4lerk2ler3tl1erzles2ele3shlesi1le3skles2t4lesw2lesy2leto4leud3leut2lexe2lexzl3fahlfe1elf3lolf2trlfur1lga3tlg3rel3gro2l1h23lhi_li3acli3akli3amli3arlia1sli3b4libi34lickli4ds3lie_lig4nli3keli2krlil2a3limol1inv2linzli4om3lis_li2spliss2lit2ali3telit2hli3tu2lixili2zalk3lolk4nelk4ralk2s1lk3sälks3tl3k2ülla2nl3lapll1aullch4ll3d4ll2emll2esl2lexll3l2ll1obl3lowll3shll5t4llu2fll1urll3z2lme2el2möllmpf4lms2tlna4rl3n4e2lobjl2obrlo1fllof4rloi4rlol2a2lopf2loptlo1ralo4rä2lorcl1ordlo3ro3lorq3los_lo4sa3loselo2talot4h2l1ovlo2velö2b3l2ö2fl1öhrlpi4plp3t42l3r2lre1slrut4lrü1bl3sacl2saul3sexl4shalsho2ls2pols3s2lst2al2stels4trls2tuls1uml2sunlsu3sl2tabltag4lt1aklt1ehlt2enlt3hol3thul2toblt1oplto2wlt1öll3törlt1ösl3trält3relt3sclt2solt1uhlu1anluba2lubs2lu2drlu2es2lufflu2golu2gu2l1uhlume22lumf2lumll2umpl1umsl1umw1lu2n2lunt2lunwl1urnl1urt2luselu2splu4stlu2tälüh1lly1ar2lymply3nolzo2flz3t2m2abe2mabk2mabs2mabtma2cima3damal3dmalu4mam3m2manbm2anfm2anh2manlm4ann2manzma2orm2app2marb4marrm1arzmat4cma3unma1yom1ähnmä1i2m1ärg2m1b2mbe2em3b4rm2d1äm2deimds2em2e1cmedi32medyme1efmega1m2eil3meldmell2m2en_m2ens2meou3mer_me1rame2ro3mersmes1ame4sä4mesume3th2m1ex2m1f4mfi4l4m1g22m1h4mi2admi3akmibi1mi3damie3lmi2ermi4etmi2kimi2ku4milzmi3nimi1nu3mir_mi3ra3miri3mirs3mirwmi2samise1mi2tami2th4mitz4m1k4m2mabmm1eimm3simm3spm2mummm2unmmül22m3n22mobj3m2odmo2dr4mog_mo2i32mol_mom2e3m2onmo3ne3mo2o2moptmo1ramork4m1o2xmp2flm3ponmp3ta2m3r2m2sanm4sapms1asm2saumsch2m4scom4sexmso2rm2späms2poms2pums3s2m3stoms4trms4tüms1ummt1abmt1akm3tammt1armt3homti2smt1ösm4ts1mt2samt2semt1um2m3uhmu3la2mulsmu3nim4unkmunt24munzmu3ra3musimu2spmus3tmu2sumuts32m1w2mwa4rmwel42n1abna2bä4nabg4nabhna2bln2abona2br4nabt3n2ac4naddn2ade3n2ag3n2ahn3ahnnai2en1aig2n1akna2ka3nakon2al_na2län4alena2lu2nalyn4am_3name3namon1an_4nanb2nanh2nani4nank2nanl3nannna3non1anp2nanr2nanw5nar_2narcn2ard4narg3narin2ark2narmn2arpn2as_4naspn4ata4natmnats14natt4naufn3aug5naui3n2äcn1ähn2n1ännä2scn2äss2n3b4nbe3nnbes4nbu2snch3mnd2agndat2nd1aun2dein2dobndo1cnd1opnd1orn2drönd3thndt4rn2dü4ne2apne3asne3atne2bl3necane1ckne2de2nee33nehm2n1ein2eid4neifne2ke3nelanel3bne3lin2em_n4en_n2enbn2encn2enhne2nin2enjnen3kne2non2ensn2envn2enwne2obne1os2nepfn2er_ne1ranere2n1erfn1erh3nerin1erkne2ron2erpn2erv3n2esn4es_nes4cnes1one2thneu1cneu3gneur22n1exnf1aknfo1snft2on2f1ung1adng3d4n3gefn3gerng3g4ng3hun2glon2glöng3neng1orngs3cng3tsn2gum2n1h4n3hann3harn3haunhe2rnib4lni2deni3drnie3bni1elnig2anig3rni3klni2kr3n2ilnim2o2ninfni2obni3okni3olni3ra3n2isni2tinit4sni3tunk2amn2kähnke2cnk2lonk2lunk4nan2knenk2öfn2köl2n3l22n1m4n2naunne2snn2exn2nofnn3scnn3senn2thnn1ur3nobl2no2dno3drn3olen2on_3nor_nor2a2norc3norh3norm3norsn1ortno3shno2täno2tr2nö2f2n3p4npa2gnpro1npsy32n3r2n3savns2cans1ebnse2tn3sexn3siln4sphn2sponsrü2ns3s2ns2tins2tunst2ün2styns2umnta3mnt4atnt1ämnte2bnte1ent1ehnt2enn3ternteu3nte3vn3thrnti3cntmo2nt3sants2onts2pnts2tntum4nt3z21nu1anu3arnubi11nu1cnu2esnu2fe2n1uhnu3k4n2um_2numf2numg3numm2numr2nuna2nunt3nu2snu3scnu3senu3slnu2ta2nü4bnür1c2n1v2n3ver2nymun2zadn2zann2zärnz1ecn2zornz2öln2zwö2o3a2o4abioa3deo4a3ioa3ke2obano3bar2obe_2obea2obewobi4t2o3boo3briob3skobs2pob3sz2o3buobu2s2o3bü2oby4och1ao1cheoch3loch3moch1ooch3roch1socht2o1chuoch1wo3ckeo3ckio2ckoo3d2aod2dro3debo3dexo3diro2donodo4so2dre2o3du2o1e2o4e3so2e3to3et_o3etsof1amof1auof2eno3feroffs2of2fuof1laof4läof4löof3raof3räof4rüofs1aof3thoga3dog2loo3g4nog3spohl1aoh3looh2lu3ohngoh2ni1ohnmo2h3öohr1aoh1ro2o1hyo1i2do2isco1ismoiss2oi1thoki2ook1läo2labol2arol4drole3eoler2ole3sol1exol2faol2flolf1rol2glol2grol2klolk3rol2of1olymol2zwo2mabo2mebome3co2melo2mepom2esom3maom3pfomtu3ona2bo2naeo3nalon1apon2auonbe3one2ion3f2ong4rong3s4o3nion3k2onli4o3nodono3sons1aonsi2ons3lons1pont2hont3s2onukoor3foo4skoo2tr2o1ö2opab4o3panopa5so1peco1pei2opf_op2fäo2pfeopf1l4oph2o3pheopin2op3li2o3poop4plop2pr2o1pr1opsiop3szo1rad2orak2oral3oramo1rasor1ätorb2l2orcaor2ce4orda1ordnor2do2ordr2ords2ordwore2hor1eror3gaor2glor2gn4oril2oritork2aork2s2o1ro2o1röorr4aor3rh2ors2or3shor3szor4töor2ufo2r3üo2ryaos3ados4anosa1sos4co2o3seose3eose2no3shoo4skaos3keo4skios2lo2os1pos2peos2saos4säos3to2osu42o3syo2tebote2s4ot2hot4heo2throt2inotli2ot4olot2oroto1so3traot2saot3scots1pot2thou2ceou2geou3glouri4outu4ove3so3wecoy1s4o3z2aozon1ö2bleö2b3röb2s3öch1lö2chröch2söcht4öd2stöf2flöh3riö3ig_ö2ko3öl1a2öl1eiöl1emöl4enöl1imöl1inöl3laöl1o2öl3saöl3szö2l1uölz2wönn2eön3scön3spöpf3lör3a2ör2drör2glör2klör1o2örs2eört2eör2trös2stös3teös2thös3trö2t3aöt2scöt2trözes4pa3dapa2drpa3ghpa1ho3pala1paläpa3li2paltpank42panl2pannpant2panz4papi23para1parc2parg1paro2parppa4stpat4cp3auf3pä2cpä2to2p1d2pea4rpech1pe2en2peicpe1im2pekupel3dpena41pennpe1rapere21perl3pero5perspe3sape2stp2fabp2fadp2fafpf1aip2feipf3lopf3lup2forpf1ra2pfs2pf3slpf3sz2pf3tpgra2p3hopph3t2phu4s2p1hüpi2a3pias4p4id2pi2el3pierpi3lepin2epi3oipi2pepi3ri4pisopi1thpit2s2pitz2p1k2pkur11p2l43p4lap5la_p5lad2ple_ple1cp4legp4lem2pligp4likp4liz2p3lu2p1m2po3b42p3ohpo3id3poin3p4olpo3li2pondpo1pepo2plpo3pt2pornpor3spos2epo3ta3potepö2blp2p1hpp1läp2plep2pripp3sa1prak1prax1präd1präg3präm3präs2pre_2prec1pred1preipri4e2prig1p4ro3prob2proc3prod3prog3proj3prot1prüf2prünps4anp3s2hps1idps2pop3staps2tup3stü3p2syps2zept2abpt3atpte4lp4tospto2wp2t3rpt3s2pt1um3p2typu2dr2p1uh2pundpun2s2puntput2spwa4r1queura2abr3aalra3ar2rabd2rabf2rabgra2br2rabs2rabt1rabyra1cer2ackr4ad_3radf3radlrad5tra2gn4raht2raic1rake3rakür4al_ral3bra3le2ralgr4aliralk2r4alsra2lu3ralyr2ammr2an_4ranc2ranf2ranl2ranr2rapfr2ara2rarbr2arkr2arpr4as_ras2ar4at_r3atlrat4r4rau_4raud2rauf2raug3raum3r2äd3rän_3räni3räns2r1ärr2är_rä3raräu2s4räutr2bakr3blärb2lörb4rirb3serbs1orb3sprby4tr1chirch3lrch3mrch3rrch1wr2ck1r2dafrd2amr4dapr2deir3denrd1itr2dobr3donrd1osrd4rird3tard3thrdwa4re2amre3asreb1rre2bür2ech3red_4reddre1elre1er3refe4reff3refl3refo5reg_rehl4r2ei_r2eie2reigr1einre3larel2ere3lorelu2r4em_r2emi4remur4en_r2enare2näre2nir2enzre3or3repe3repo4reppr1erfr1ergr1erkr1erlrer2nr2eror1erör1ertre2sa3rese3reso2ress3rest3resu2reulre2wi4rezirf2äurf2esrf4lör3flür3forrf4rurf4rürf2sarf2targ2abrg2anr2gnorg3spr2ha_r3herr2hoe2rholrhu2sri3amria1sri3atri1ceri1elri1euri2frrif3s5rig_5rigjrig1l4rigrrik1lr2imb2rimprim2s2rink3rinn2rint4r1irris2ari3so3rissri2strit4r5riturk2amr2kährk4lork2lur3krirk2sprk1strk2tark1uhrk2umrku2nr3l2arle2ar3lecrle2ir3letr3l2irli2sr3l2orm2ärrm3d2r3me_r2meorm2esrmo1srm3sarmt2arna2brna4nr2naurn3drr4nefrn2eirne2nr5nesrn2etr4nexr3nodr1nötrn1ur2robj2robsro3e4roh1lro1irro3lerol3s2roly4rom_4romm4romt3ronnrons2ro1pero3phr2oraro3shro2ßu3routrö2du1r2öh1r2öl3römir2ös_r2öse2r1p2r3p4ar2plirpro1rps3trr2abrr2arrr1ämr3r2er4rewrr2herrik2rro3mrr2strr2thr3r2ürrü1brs3abrs2anrs3arr3shors2klr4skor4skrr4skurs4nor4sobrs2p4rs3s2rs2thrs2tir3stor3störs2tur3swirtal2rt1amrt1ärrten1r2thirto1prt1orr5trirt2sorube2ru2drru2fa3ruinru1is4rumfru2mi4ruml4rumz2rund4runn2runwru3pr4r3urru2ra5ruroru2siru2strut3hru2zwrü1ch4rümmrz2anr2zarr2zasrz1idrz1oprz3terz2thr3zwä2s1absa2besa2blsa2br4sabss1adm3safasa2fe3safi3sagasag4nsa2gr3s2aisail22s1aksa2ka3saki3sakr4sakt3salo5samms1amps2an_s3anbs2and3sani2s1apsa2po3sapr2s1ar3saris3arrs1aspsat2a4satmsa2trsa3tss1a4u3sau_3sauc3saue3saum3saur2s3avsa2vos3ähns1ält2s1äm2s1är3s2ät3säul2säuß4s3b4sba4n2scams2cans2cap2scar2s1ce4sch_s4chä4schb4schc2schd2schf2schg2schh2schks4chls4chö2schp2schq4schss4chu3schü2schv2schz4s3d2sde1sseb4rse1ecse2glseg4rse3heseh1lseh1sseh3ts1ein3s2eks2el_s2elsse2nä3senkse2noseo2rs4er_3seraser3gs1erh3seriseru25ses_se3su2s1exse2xe4sexpsex3t4s3f4sflo44s3g2sha2k1shass3h2e3shi_3shidshi4rs3hoc4shof3shop3showsi2ad2siat5si1cs2ido3s4iesien3sie2ssi1f43s4igsig4nsi2kisik1lsi2krsik3ssi2ku3silosin1ision43s2issi2sasis3s3s2itsit3rsi3tusiv1asive3si2vr2s1k24skams3kar4skasskel1s4keps2kifs2kig4skirski1s3skiz4skom4skor4skow4sk3t2s1l23slal4slans2laws3lo_s3loe2s3m22s3n4snab4so3baso3et3softso3la3s2onsone22sopf3sor_s1orc3sorsso4rus4os_2s1ox2s1ök2spaa4spak4spap3spaß4spaus2paz3späh2spärs3pe_2spel4spet4s3pf2sphas4phäs3phespi2k4spil3spio4spis4spla4splä4sple2spod2spogs2poi2spok4spol4spr_3spru2s3ps2s4pt2spun2spup3spur4sput4s3r4sret3srü2ds5safs3sagss1ajs3sals3s2äs4sces4scoss1ecssoi4ss2poss3s4sst2ass2thss2tis3stü4sta_3staast2ac2stag3stah2stak2stax3s2tä4stäg2st3c2steas2ted4stee2stem4stens2tep2ster4stes2stetst3ev4stexs4thäs4this2thu2stia2stibs2ticsti2e2stig2stiks2til2stio2stis2stiv2sto_s3tob1stof4ston4stoo1stoß4stou2stow2stoz2stöt1stru1stub4stuc2stue3stuf3stuhstu2n3stüt4st3zsu1ansuba24subi3su1c2s1uhsu1issul2asul2isult23summ3sun_su4nes1unf4sunt3s2upsup3psu2ras1urtsu2s1su3sasu3shsu3sisus3s2sü4bsü2d1sweh24swie4swilsy4n34s3zas2zess2zis4s3zu4s3zw2ß1a22ß1b22ß1ec2ß1eißen3gße2niße2noße2roßer3t2ß3g2ßig4s2ß1in2ß1k4ßler32ß1n22ß1p22ß3r22ß1s22ß1um5taan4tab_2tabf2tabg2tabh2tabkta2br4tabsta2bü2tabw2tabz2t1ac3tacut1adatadi33taf_4tafft1afg3t2agt3agotai2ltai4r2takzta2latal3d3talo2talt3tameta2mit1amt3tan_2tanbta3ne4tanf2tang3tanit2ank4tanlt2anot1ansta2nuta3or2tapfta2pl2tarb4tark2taro2tartta2ruta3sata2tht3atlt4atmt1auk3taum4tägyt1ämt3tänzt2är_tä2ru4tätt2täuß4t3b2t3chat3chetch2itch3lt2chutch1w4t3d4tdun2te2a22teakte3alte3an3tebat2ech2teckte1emte2es2teff3teha3tehä3tei_teik43teiltekt25tel_3telatelb43telg3telk5teln3telp5tels3tem_tem3st6en_ten3ate2nät4enbten3gt4enhte2nit4enjt4enmten3n3terct4erit4erot3erötert2teru2t2estte2su3tet2t2et_4teth4tetl3teuf3teumte1unte2vite1xa4texp3text4t1f4tfi2l4t1g2tger22th4at2hagt3hait2hak2t3hä3thea2thebt2hect2hekt2hem1then3theot2hest2heut2hik4th3l4th3m2th3n1t2hot3hoft3horthou24t3hö2thub4thunti2ad3tib4ti1cetieg42tiehti1elti1etti1eu3tif_ti1fr4tift3tilgti2lötil3stilt4ti2lut2imiti3nat1inbt1infti1nuti3orti3plti1rhti2sptium2tive3ti2za4t3k45tlem6t5li4t3m24t5n4tnes2to4asto5at4tobjtob2ltode2toi4rto3la3tole4tolz2tomg3topo2topt3tor_to1ra4torct1ord3toret1orgto2rö3torsto2rut2orwto3sc3toseto4sktos2p4toss3totrtots23t4outo3un3töch4t1ökt1öst4t3p21t2r45tra_3trac3trag3trak3tral4traß5träc3träg4träs4träß4treb4trec3tref4treg2trekt4remt4rert4rett4reut3rev2trez2t3rh4trict4riptri2x3tro_3troe3tront4rop3troyt3röc2tröh3trös3trua4truktrum2t4rübt4rügts1adts1alt2sants1ast2sauts1emts3krtso2rt3sout2spät2spht2spots3s4t1st4ts2tut2s1u1tsubtt1abtt2actt1aktt2altta1st3telttes1tto1st3trott3rutt3rütts1ptt2untu3antuf2etuff3tu2istul2at2um_3tun_3tune3tungt1up_tu2rätur1c3turntu2rotu4rutu2satu2sotu3ta3tüch3tür_tür1c3türe3türg4tütztwi4ety2pat2za2tz1agtz1altz1artz1aut3ze_t2zortz2thtz1wätz1witz1wuu1a2bu1a2cuad4ru1al_u1albu1alfu1alru1alsu1altua2luu1ansu3ar_u1arsua3saua2thuat2iubau1u3b4iu2bopub3räu2bübuch1auch1äu1cheu1chiuch3luch3much3nu1chuuch3üuch1wu2ckiu3d2au2donud3rau3druue2ckue2enu2elaue2leueli4ue2miue2näue2niue2nou2ereu3errue2tau3fahuf1akuf3aru3fasuf1au2ufe_uff4luffs4u2fobufo2ruf3säuf4sou2fumug1afug1akuga4sug1auug3d2ug3huu2g1lug3lou4gluu2g3nug1orug3roug3seug3siuh1lauh1läuh2liuhme4uhr1auh3riuhrt4uh2ruuh4rüui2chui1emu4igeu1in_u1is_u3käuu1k2lu1k4ruk2tauku2sul1abul1amula2sul1ämul2drule4nule2tu2lexul3f4uli2kul3kaul2knull2aull3sulo2iul1orul2sauls3z2ultaul3thult3sul2vrulz2wuma4rum2enum1irumm2aum2suum3t2um2un2una_1unabun3acun4alun3at1unda1undd1undf2undg1undn1undv1undzune2bune2hung5hun2idunik4un2imuni2r2unisunks23unkuunna2uno4run2os2uns_un3se1unsiun3skun3spun3taun3trunt3s2untuu1o2bu3or_u3orsu1os_uote2u1pe2uper1up2faup2plup2prupt1oup4tru2rabu2rar2u1räur1änurch1ur3diure4nurf3turi2cur1imurk2s4u1rou3roluro1sur4swur2zaur2zäur2ziur2zou4safu3sepus3klu4skous3ocu3sohus1ouus1peu2spou2spuus2thus3tru1stuus2uru2tärut1egute2lut2esut2etu4tevutfi4ut2heu2thiu2thuuto3cut4orutos4ut3rüut3teutts2ut2zo2u1u2uufe22u1v4u2ve_uz1weuz3z4übe3cüber3ü1cheüch3lüd3a4üd1o4üd3s2üdsa1üd3t4ü2f1aüfer2üf2flü2f1iüf2toü2g3lüg4stühla2ühl2eüh3moüh3neühn2süh1roühs2püh4thül2laül2loül2löü2n1aün2daün2dründ3sünen3ün2faün2frünn2sün3scün3seün3spün2zaüp2plür2flür2frür3scür3seür3spürt2hüse3hüse3lüse1süss2eüs2stü2t3rüt2s1üt2tr2v1abval2s2vang2varb2v1auve3arveit4ve3lave3leve3live3love3maven2cve3neve3nive3növer3averd2vere2verf4verg4ve3river3kvert2ver3uve3tavete1ve3trve3x22v1f4vi3arvi2elvi2ervima2vi4navin2svi3savise4vi2spvis2u2v1l22v1obvo3gavo2gu2v1opvo2r1vor3avor3dvor3evor3gvo3ri2v3rav4ree2v3rov1stav3s2zvu2et2vumfwa5gewa3gowai2b2walb2walmwa3nawa3sawa3sewa3sh2wängwäs2c2w1b2we2bawe2blweb3swe2e4weed3we2fl2weiewe3niwerd2we2röwer2s1wesewe4stwet2s2w1eywie3lwin2e2wing1wi4rwi2sp1wisswi3th1wo1c1wolfwor3aw3s2kwun2s4wur_wur2s2xa2b1x2adxa1fl1x2agx3a2mx2anz1x2asx1e4gx2er_x2erexers22x3euxich2xide2xie3lxil2axi2loxi2lux2is1xis2cxi2sexis3sxi2su2x1k22x3s2x2t1axt2asx2tänxtfi4xt3s2x3turx1u2n2y1aby1al_y1a2myan2gy1anky2chiych3nyen4ny2erey2es_yes2pye2thygie5yke3nyk3s2y4le_yli4nyl3s2y2l1uyma4tym3p4ympi1y2n1oyno4dyon4iy1ontyp3any4p3sy3r2eyri2ayri1ey3r4oys2any3s2cy3s2hy4s3lysme3ys2poys1prys3t4y3s2zy2te_y2tesy3to1yure3zab3lz1a2dza3de2z1afza3grzale32z1amza2na3zani2zarb2zarcz1arm3zaubz3aug3zaun2z1äc3z2äh2z1ämz1ärgz1ärm4z3b4zbü1b2z3d2zdan2zeik4zelu25zen_zen3nze2no3zentz2er_zerk2z2ernzers2ze2säze3sczes1ezes1ize2spze2tr2z1ex2z1f42z1g2z2henzhir3zi3arzid3rzil2ezin2ezi2o3zi3opzirk22z3k42z1l22z1m2zme2e2z3n42z1ob2z1ofzo2gl2z1oh2zopezo2ri2z3ot2zö2f2z3p42z3r24z1s2zt3hozt3s2zu4chzudi4zu2elzu3f4zu3gl2zumf2zumg2zumlzun2ezung42zuntz1urkzu3s4zu5t2zür1cz1wac4zwahz1war2zwas4zwäl2zweg2zwet4zwirz2wit2z1woz1wörz1wur2z1wüz3z4az3z2o"); + put(6, "_ab3ol_ab1or_akt2a_al3br_alt3s_ampe4_an3d2_angs4_ans2p_ans2t_an3th_ari1e_ark2a_ar2sc_as4ta_au2f3_au4s3_be3ra_boge2_da2r1_darm1_de2al_de1o2_des2e_de3sk_des2t_do2mo_do1pe_dorf1_ehe1i_ei3e2_ei4na_ei2sp_ei4st_ei4tr_el2bi_elb3s_em3m2_end3s_enns3_en2t3_en4tr_er2da_ere3c_es3ta_est2h_es3to_es5tr_eu3g4_eve4r_flug1_for2t_fu2sc_ge3ne_guss1_he3fe_he3ri_inn2e_kamp2_kle2i_kni4e_kopf1_le4ar_li4tu_ma3la_ma2st_mel2a_mi4t1_näs1c_no4th_oper4_oste2_ost3r_poka2_ram3s_reli1_ri2as_rom2a_rö2s1_se3ck_sen3s_ser2u_se2t1_si4te_ski1e_tal2e_ta2to_te3no_te4st_ti5ta_tite4_to4pl_tro2s_tu3ri_uf2e2_ufer1_un3a2_uni4t_uns4t_uro2p_ur3s2_wah4l4a1a2naa2r1aaar3f4aat4s3ab1aufab1eilabe2laab1erkab1erzab1ins1a2blaab5lag1a2bläab4le_3a2blö1a2bon2absarab3s2i2abst_ab3ste1abteia1chalach3auach1eia3cho_ach1orach3su4ach1wa1ckarack2ena2ckinack2seack3slacon4na3d2abad3amaa2d1an3a4dapade2aladefi4a2deina2deri4ade1sades4sadi3enad4resa2f1eca2fentaf1erlaf4fluaf3s2aaf3s2haf2t1aaf2teiaf2t3raf2tura2f3urag1a2da3gen_age4naage2saage4si3a2gitag4ne_a2g3rea2g3riag4samag4setag4spoag3staag3stea2gundahl3a2ahl3szah4n1aah3r2eahrta2ain3spai3s2e2a3kam1a2kazaken2nak3rauak5tan2aktikak2t3r2aktstal1ageal3amealami5al3ampal1anaal1ansal1anza3lar_a3lareal2armal3arral1asial1assal3augal2b1lalb3lial2bohalb3rualds2ta4l1eha2l1eia2l1ela2lengal1epoal1erl3alermal1etaal1etha2l1eua4leur3a2lexal2glial1insa2linvalk1ar1alkohalk3s2alks4tal2labal2laual3les1allgäal2lobalo2gaal1opeal1orc3alpe_al3sklal3sunal4takal3tamal2treal2trial2troalt2seal1umbame2n1amer2aa2meriame3rua4mesh2a3mirami3taami3ti2ammalam2meiam2minam3stram2t1aam2t1äam4tel2amtemam2t3ram4treanadi3an1algan3dacande2san2dexand2suand1uran3e2can2ei_an3eifan1e4kan1ethanft5san3f2uang1ar3angeb2angiean2gla4angs_an2i3d3a4nima4ninsan2keian4klöank3ra3an3naann2aban3n2ea2n1orans2enan2seuan3skrans1pa1anspran3s2z1antei1anthran2tro2anwet1anzeian2zwiar3abtara3d2a2r3al2a2rara2r1auar2bauar2bec2arbenar2bre2arbs2ar2droar1effar1ehra2reinar2erfa2reria2rerlar1intar2kalar2knear2korar4kriark1s4ark3saark3shar2lesar2nana2r1oparr3hear3s2har3staar3t2ear2thear3t2iartin2art3rear2z1was1alaa3schea3schia2schma3schua3s2hiasin2gaska3sa3skopas3s2aas3s2eas3s2ias2s1pass3tias3stras3stu2as3taas4tauas4tofast3räaswa2s3a2sylat1apfa2tausat3eiga2teliate2ru4athe1atil4sati2st4atmusatra4tat3romat4setat2s1pat4takat4tauat2teiatz1eratz3t2at2z1w2au1a2au2bliau2bloauf1an2aufe_2aufehauf1er2aufs_2auft_4augehaule2sau2malau2m1oaum3p2aum3s6au3n4aau2nio2au3r2au2sauau2spraus3s22auts4ava3t4äche1eäch2späch4stä2d1iaäft4s3äg3str2äh3t4äl2l1aämi3enäne2n1äng3seän2k3län2s1cänse3häp2s1cä2r3a2ä2r1eiär1intär2k3lärt2s3äse3g2äser2iäskop2ä3s2kräs6s1cä4s3t2äß1erkä4t1a2ät2e1iätein2ät2s1iät2s1pät2s3täum4s52ä3us_backs4b1a2drbah2nuba2k1iba2krabal3th3b2andban2drba3n2eban4klban2kr2b1ansbar3deba2reibar2enbar3zwba3s2abau3sp3b2ä1cbbens2bb3lerbbru2cbe2delbe2erkbe1erlbe1etabei1f4bei3k4bei3labe1indbei3scbeis2ebei1stbeit2sbe3lasbe3lecbe3leibe2letbel3label3szbel3t4ben3arbe3nei3ben3gbe3n2iben2sebenst4ben2su2bentbb2entib1ents2bentwben3unben3z2ber3ambe2ranbere4sber3nab1erntbe2robbe3ropbe3rumbe3slobes2pobess4ebes3szbe2tapbe3thabien3sbi2ke_bi2kes2b1inb2b1infbin3gl2b1intbi2solbi2s5tb2it2abla3b4b2lancb2latt2b3law3ble2a2b3legb3lein3ble4nb3leseble3sz2blich3blickbling43blitzbo3ch2bo2e3ibon2debo1r2abo2reibo4rigbo4s3pbot2st2b3radb4ra3k2b3refb3reif2b3repbri2er2b3rolbrust3bru2thb2s1adb3sandb3sel_bse2n1b3s2esb2s1ofb3s2pubst3acbst1akbs3tätbst3erb2stipb4stodbs4trib4stübb2s1unbu2chibul2la2b3umkbu3r4ibus1erbu2sinbu2s1pbu2s1ubzeit1carri1ca3t4hcha2ck2ch1akch2anb3chancch1ang4chanz4char_1characha2sc3chato4chatuch1ärm3chef_3chefi3chefsch1eimcher3ach1ess2cheta1ch1iachi3na4chind2chinf2chinhch1insch1int1chiruch1offch1orcchre3s1chron2chunt2ck3an4ckeffck1ehe4ck1eick1entcke2rack2ereck1erhck2ern2ckero2ck1id2ckunt2ck1upcon2nec1s4trcussi43d2abäda2ben3d2ablda2bredab4rüdach3ada2chodach1sdal3b2d1amma2d1amt2d1ana2dangedan4kldan2kr2d1ans2dantwd2anz_4danzida2r3a2darb2dar2mada3s2hdat4e2da3teidate4n4d3atl4daush2d1ämt2d1änd2d1ängde3a2tde4ca_de2cka2d1eff2d1ehrdein2ddein2sdel1ändel1ec2delek2delem2delfmdelle2de2lopde3lordel5scdel2sodel3t4dem2ar2d1empden3th2dentwdera2bde1radde2rapder2bl2derdbderer33derieder3m2de4ruhde4rumde3sacdesa2gde4samdes2äcde2sebde4sehde2seide4setde2sinde2sordes3s2de2sto2d1etwde1urlde2xisdha1s4di3e2ddi3enidie2thdige4sdil2s52d1imb2d1ind2d1inf2d1inh2d1ins2d1intdion3sdi4re_di2rendi2ris2d1irl2d1isrdi4t3rdle2ra2d1o2fdo2mardo5n4adoni1e2d1opfdor2fädor2fldor2fr2d1orgdo2riedor2tadö2s1c3d4ra_2d3rad2drahm3d4ramd3rand2d3rät2d3räud4rea_d4reas3d4rehd4reiv4d3ren2d3rep4d3rer4dres_d4resc3d4ria2d5ricd5riegd4rin_3d4rit4dritu2d3rod2d3rot2d3rovdrö2s13d4ruc2d3ruh2d5rutd2sau2d2s1efds2eigd2serhds1errd3s2had2s1imds2infd3skuld2s1opds1orids1pasd2sprods3tabd4stagd4stead3steid4stemds4tilds4tipds1umsds2zend4theidtran2du1alvdu2bli2d1ufe2d1umb2d3umkd2ums_2d1umvdund2a2d1unfdun3kedun2kl2d1url2dursadwest3ea3dereadli4e3aleiealti2eat4e2eater1eat3s2e3au2feau1ste3b2akebert4eb3lereb4leue3blieeb3reiebs3paeb3staeb3strebu2t12e3cheech1eie2cho_e2ch3rech3taech1uheck3seede2aledens1edi4aled2s1oed2s1pee2choeed3s2ee2lekee3lenee4nage1e2pie1erbtee3r2eeere2see4reteer2öse1ertree3r2uee4tateewa4re2f1adef1anae2fente3f4lu2e3f2oef3reaef3rolef3romef2tanege2raeg4saleg4stoegung4eh1ache3h2aleh2auseh1eff1e2hepehe1raeh1inteh1lameh2linehl2seehr1a2eh2reiehre3seh1ro2ehr1obehr1ofeh1stee2hunt2ei3a2ei2bareibu4tei2choei2d1aei3danei3dra4eien33eifrüeig2er2eigew2eigrueik2arei3kauei2lareilen1eil3f41eilzuei2moreim2plei2n1aei4nasein3dr2einduei4nelei2neu2einfoein3g2e1initein4szei2sa4eis2peeis4thei1stoei2sumei2tabei2tanei2tarei2troeit3umek1s4tek5triel3abiel2abte2l1akel4amiel4ampel1ansel1anze2l1apel3ariel1asiel1aspel2ast3elbiseld3s22e3lebe2l1el1e2leme3lem_el1empel1erdel1erfel1erkel1erl2eles2el1esse2l1ideli2neel1itael3lanel5le_el3linell3spel1opee2l1orelo2riel2sumelte2kel2t3re2l1umel3useel2zwae2m1ad3emanze3m2ene2m1imemi5naem1intemi3tiemma3uem2meiem3pflem2spren4amee4nanden3angen3areen2ascen3atte3nauee2n1ären4ce_en2dalend3siend3szend2umen1e2ce2neffe4neine2n1elene4lee2nerfe4nerhe4nerk4enerne4nerz1engad3engagen3g2ien3gloeng3see2n1inen3k2üeno2mae2n1openost3en1ö2den3sacen2sauen2sebens2el1ensemensen1en3skaens2po2enstoent4agen2teb1entfa3entgaen2thi3entlaenü1ste1o2b1e3p2f41episo1e2pocep2tale3rad_er3admeraf4aera1frer3aicer3alleran3de3raneer3anfe2ranher3anmer3apfe3rarie2rathe3ratie2ratme1rauber3aueerau2fer3augerb4sper3chl2erdece3recher1effer1eige2reiner1ele2e3reme3renae3renz4erer_e4rerl4ererne3reroer1errer1erse2rerter1erwer1esser1eul4erfür1ergolergs4t1erhabe2riat4e3ric4e3rieer1inber1inker1inter1ita1erklä2erkreern1oser1o2ber3onye4ro2rer3smoert2aker2thoerts2eeruf4ser1u4mer1underung4er1unses2aches3anze3s2ases3cape3schaes3evaes2haresi1eres3intes2kates4loges2ortes2sau4essemessi2aes2sofes2spues3stres3stuest1ake1stare1state3stele1stile2stipes4trie2s1umes3umse4teinet3haleti2tae4t1ofetons4e2treset4riget2tabet2teiet2t3ret4troett3szetwa4retze4seu2esceu4glae3um2seum4sceums1peum3steu4neie3un2geu2nioeun3ka3eu3roeu1staeu1stoeu1stre2velae2vent1e2xeme2x1inex2tinfa2benfa2chof1aderfa3l2afal2klfal3tefalt2sfan2gr2f1ankf1an3zfar2br2f3arcfarr3s3f4art2f3arzfa3s4afa2to32f1auff1ausb2f1ärmfä2ßerfeatu42f1eckfe1inifek2tafe2l1afel2drfe2lesfe2l1ofen3safer2anfe2rauferde3fer2erf1erfaf2erl_f4erpaf2ers_fest1afest3r2f1etafe4tagfeu4ruf2f3efffe1inf3f4räff3shoffs4trfi2kinfik1o2fi2kobfi2lesfi4linfil2ipfin3sp2f1intfi2s5tfit1o2fi2tor3f4läc2f5läd2f3läu2f3leb3f6limfli4ne2f5lon1f4lop1f4lot1f4lug4f3orgfo3rinfor4stfor2thfor3tu2f1o2xf3rand1f4ränfreik2frein42f3ricf4risc1f4ronfro2nafs1allfs4ammf2s1asf2sauff2sausf2sautfs1e2bf2s1emf2s1erf2si2df2s1o2f3spanfs1penf3s2plf2sprefs2prif2sprofs2pruf2stasf3steif2stipf3st4rf2s1unf2t1alft1e2hft1eigft1eisf4theif2t3rof2t3röf3t4ruft4samft3s2cft4sehfts3elfts2tift1url2f1unffun2klfun2ko2f1unmfu4re_fus2safus2stfzu4gaga2b5l2ga2dr2g1amtgan2gagan2grg3anla3g2ano2g1armga3r2og1arti2g1arzgas3eiga2sorga4spega4sprgas4taga4ste2g1auf2g1autg2d1aug2d1erge3g2l2g1eifge2in_gein2sge2intgein2vgei3shgelb1rge5lehgell2age3lorgels2tgel3szge3lumge4namge4nargen1ebge3necgen3szgen3th2gentwge2rabger2erger3noge1r2öge3r2ug1erwag2e1s23ge3scges4pige3steges3thge3t2a2getapge3t4ugge2ne3g2het3g2hiegi3alogi2e1igie1stgi2me_gi4mesgi2met2g1indgin2ga2g1insgi3t2ag2lade2g1lag3glanz2gläuf2g3leb4g5lerg3lese3g2lid3g2lie3g2lit3g2loa3g2lobg3loch3g4lok3g2lop3g2lotgne2tr4g3notgoa3li2gonis2g1ope2g1opfg2o1ragra2bigra2bl2gradl2g3rah2g3rak2g3räu2g5re_2g3recg4re2eg3reit2g3ric2g3röh2g3rui2g3rum3g4rup2g3rüc3g4rüng3s2ahg4saltgs3amags3augg4s3cegs4chig4s3crg3sel_gs3elig3selngs5erkg4setags4pieg4spingsrat4g3stang3starg4s3täg5stämg3stelg1steugst2heg3stirgs3tocg4stolgs3topgst4rig4sturgs4tücgu1an_gu1antgu4d3r2g1u2fgu1ins2g1unfg2ung_gunge2g2un4s2gunt22g1urlgurt3sgu2s3agus2spgus2stha2choha2delha4dinh1adle2h2al_ha2lauhal2bahalb3rhal2lahal2sthand3shan2krh4a3rah1arm_h2armehar2thh1arti2ha3sahat5t2h1aukthau2sahau2sc2hautohau2trhä3usphe1choh1echthe3ckehe2e3lhe2fanhe2f3lhe3friheim3phei4muheine2h1einkhe1ismhe1isthel1eche3lenhe4lof4h1emphend2she2nethenst2hen5trh1entshe2ral2heraphe3rasherb4she2relh1erfüh1erkeher3thher2zwhe1stahe2tapheter2he3t4she1x4ahfell1hi2angh1i4dihi3enshier1ihiers2hil2frh1induhin2enhi3n2ihin3n2hin3s22hi3rehl1anzh1lauth5len_hlen3ghl2ennhle2rahl1erghl1erwh4lerzh4lesihl1indh3listhlo2reh3losihl2sanhl2serhl3skuhl3slohme1inhmen2shme2rahn3eighn3einhne4n1hne4pfh3nerlh3nerzhn3s2khn1unfho2ch3ho2ckahock3tho2f3rhol1au4holdyhol3g4ho4lor3hol3sh1o2lyho2mecho2medho4seihotli42ho2w1h1raneh3rechh4rei_h3reich3r2enhr2erghr2erkhr2ermhr2erzh4rickh4rineh4rinhh4risth4romeh4romihr2sauhr2serhr4sethr2tabhr2tanhr2torhrt3rihr2trohrt2sahrt2sehr1umsh2s1ech3s2exh2s1ofhs2porh2spräh2sprohst2anh1stechst2heh1s2tih2storh1s4trhst3rih1stunhs2ungh3t2alht3aneh3tankh4tasyht3a2tht1e2ch2t1efhte2heh2teifh2temph2t1euh2t1exh4theihthe3uh2t1inh2tolyh2torgh4trefh2t3ruh2t3rühts2tihu2b1ahu2b3lhu4b3rhu2h1ahu2h1ihuk3t4hu2l3ahu2lerhu2lethu3m2ahung4shu3ni1hus4sahus2sphu2tabhu3t2hhühne4h2wallh1weibhy2pe_i4a3g2ia2l1ai3aleiial3laia2lorial3t4ial3z2ia2nali3and2ia3p2fi2a3spi3a4tai3at4hib2blii2beigi2beisibela2iben3aib3renib4stei2bunki2buntibu2s1ich1eii2chini3chloi2ch3ri3ck2eid2ab4i2d1au1i2deeidel2äide3soide3sp1i2dio1idol_i3d2scid2s1pie2breie2choie2fauief3f4ie2f3lie2froie4g5lie3g4nie2g3riegs3cie3lasiel3auiel1ecielo4biel3sziel3taiena2bi3e2näien1ebie3neri3en3gi3e2noien3scien3siiens2kien3szier3a2ie2rapie3resi3ereuierin3ier3k2i3ern_iers2tier3teies2spie1staie2t1aie4t1oie2triiet2seiet3zwifens2if1ergif1erhi1f4lai1frauif4reii1f4rüif2topift3szig2absig1artiga1s4ige4naig1erzi2g1imig3reiig4salig3sprig4stoig4stöig3strig3stüigung4i2h1ami2h1umi4i3a4ik1amtik1anzik1artik3atti2k1aui2k1eiike2l1ik1erfi2kindi3k4läi2k3raik2trei2l3abi2l1acil1a2di2l1akil1ansil1aspi2l1auil3ausild2eril2doril1e2cil1eheil1einil2f3lilf4s3ilie4ni2l1ipi3lip_i3lipsil3l2ail3l2iil2makil2mauil2mini2l1oril3t2hilung4i2manwima2tri2melei2melfi4meshi2metiim2meiim1orgim3pseim3staimt3s2in3a2ci4nacki2n1adin2arain2arsin4arti2n3auin2dalin2dan1indexind4riin3drü1indusin1ehein2erhi4neskine3un1info_1infosing1af1inhab2inhar2inhauin2i3dini3krini3sei3nitzin2nor1inntain3olsino1s4in1ö2dins2aminsch2in2seb2insenin3skr1insta1insufin3s2z1integin3t4rin5trii3n2umin3unzinvil4io2i3dio2naui3ons3ion4stiore4nipi3elipi3en1i2rakir2k3lirli4nir2makir2mauir2mumir2narirpla4irt2stiru2s1isage2is3arei2s1äni2schmi2s3crise3haise3hiise2n1is2endisen3si2serhiser2uis2hasi2s1idi2s1of3i2soti2sparis1picis2pitis2pori2sprois4sauis3stais3stoiss3tris3stuis2sumis4tabis4tamist2anis4teliste4nistes3is4tocis5törist4raist3reisum3piß1ersit1ab_ital1ait1altit2an_it1arti3tauci4t1axi2t1äsi2t1eii4teigit2eili4teinite2lai4tepoi2t1idit2innitmen2i2t1ofit3rafit3rasit3rauit3räuit3ricit3romit4ronit3runit2stoit2tebit4triitt2spi2t1umi2tunsit1urgitzes4it2z1wi2v1akiv1angi2v1eiiv1elti2v1urizei3ci2z1irjahr4sja3l2ajean2sjek2trje4s3tje2t1aje2t3hje2t3rjet3s2jugen2jut2e1kab2blka2ben2kabla2kabläka3b4r2k1abt2k3adaka1f4lkaf3t2kaken42kala_ka2lanka3leikal2kakal2krkal4trkan2alka2nau2kanda2k1angk2ans_k2anz_2k1apfka3r2i2k1armk2arp3kar2pfk2artaka2s3tka3tanka3t4hka4t3r4kaufrkau3t22kautok1ä2mikä2s1ckdamp22k1e1cke2he_kehr2s2k1eic2k1eig2keinhkel1acke3lagkel3b4ke2lenke2lerkell4e2k1empken3au2kenläkens2kken3szk2enteken3thk2entrk2entu2kentwke1radk2erkok1e2rok2ers_ke2selke4t1ake2t3h2k1e2xki1f4lki1f4r2k1intkis4to4k1lack4leidk3lem_2k3lerkle2ra2k3leukle3usk2lisc2klistklit2s2k3locklo2i3klost4klung42k1lüc2k5nerkno4bl2k5norkoh3lukol2k5ko3n2ekon3s4ko1r2a2k1orckot3s22k3radk3rats2kraum2k3rät2k3rec2kred_2k3refk3reick3reih2k3rick3ries3k4ronks1e2bk2s1emk2sentks1erlk2s1idk2s1ink2s1o2ks2pork1s2tik2stork2sträk2stumks2zenk2t1adkt1aktkta4rek2t1auk2tempk2tentkte3ruk2t1idkt1insk2t1ofkt1opekt4rankt3rask4trefktro1skt3runk2tuns2k1uhrku3l2eku3l2i2k3umlkum2s1kun4s4kunst32k1up_kur2blku2reikuri2ekur2spkur2stlab4ralab4ri2l3absla2ce_la2gio2la1hola2kesla2k1ila1k4lla3min1lammf2l1amtlamt4sla4munl1analla2nau3l2andlan2gl2lanhäl2anhe4lanli2l3ann4lansä2lantrlan2zwlap4pll3artila2saulast1ola4tel2l3athl2auf_lau2fol2aufz2lausl2lausr2lauto2l1ähnlä2s1cl4betal2b1idlb2latl4bre_lb3ritlbst3elb4stol2b3uflbzei2l3d2acl2d1akld1amml2da2rld3arild1arml2delel3der_ld1erpl2d1idl2d1iml2dranl3d4rul2d1umle2chile2gau3l2ei_lei2br4l1eigl2ein_l2eindl2eine2leinkl2eintl4eistlei2talekt2a2lektr3l2ela3lemesle4nad2lendul2e2nolen3szl1ents4lentzlen2zil2e1rale2ragle2raul1erfol2erfrl2erfül2erkal2erkol2erlel4ers_lers2klers2tl2ert_l2ertel2erzales2amle3serleste3le1stole2tat2le3thlet4tule3u2f2leurole2xislfang3l2f1ecl4feisl3f4läl3f4lulf3ramlgen2alge3ral2getilian2gli3chili2ckali3d2ali2deo2l1idolid3scli3enelien3slie2stli2grelik2spli3m2ali3n2alin3alli2nefli2nehli2nepli2nes2l1inflings52l1inh2l1injlink2sli2noll2ins_l2insal2insc2linsp2linst2l1intli3os_li2p3ali3s2a2l1islli2tallit1s2lit3szlizei3lk1alpl3k2anl3kar_lken3tl3k4lul2k3rol2k3rulk4ställ1abbl2labtll1affll1aktl3l2alll3amall2anwll1anzll1armll3augl2lausl2l1ämll1echlle3enl2l1efll1eiml3len_llen3gl3ler_lle2ral2lerzll1imbll1impll1insl2lobel2l1ofll1opfl3lor_l3lorel2l1oul2l3öfll3s2kll2sprllti2mllt5s2l2marclm1auslm1indlm1inslm3stelm3s2zln3are3l2ob_lo2berlob4ril1o2felo2gaulo3h2e2l1ohrlo2k3rl1o2lylo2minlo2n1olo3renlo4skelo2speloss2elo4stelo3thalo3thiloti4o2l3öfelpe2n3l2p1holrat4sl3s2all2sannl3sarel2s1ecl2s1emls1erels1ergl2serhls1erlls2logl3s2pil2sprol3s2pulstab6ls4tafl3stecl3steil3stell4stemls2tiel2stitls2zenlt1a2mlt3andlt1angl3tarblt1artl2t1aultbau1lt3elil5ten_lter3alt2erglt4erölte2thl2t1eul4theiltimo4l2t1ofl4t3ötltra3llt3räult4rielt3roclt3rosl2t3röl2t1umltu2ri4lu4b32l1ufelu2g1alu4g3llu2g3rlug3salug3splu1id_2l1una2l1unf2l1unilu2s1ulu2t1alu4teglu2toplu4t3rl2z3acl3z2anlz2erklz1indlz2wecm2ab4rma2d4rma4d2sma2ge_ma2gebma2gefma2gegma2gekma2gepma2getma2gevma2gew2m1aggma3g4n2m1agomai4se2m1aktmal1akma2lanma2lauma3lermali1emal3lo2malltma2nauman3d2ma2net2mansa2mansä2mansc2mantwmar3g2maro3dma3r2uma2tanma2telma5trimat3semat3sp2mausg4m1ändmä3t4rm2d1ummedie4mee2n12m1eif2m1eig3meistme3lamme2laume2lekme2lermelet42melf_mel2semel5t4mena2bme3nalmen3armen3aumen3glme3normen4skmen2somen3ta2mentnmer2er3merinme2sal4meser2me3shmes2stmeste2me1stome3t2amie3drmi2e1imien3smie2romie4timi2karmi3l2amilch1mild4s2m1impmin2enmin2eumin2ga3min2omi2t1rmit3s2mit5sami5tsumi2t1umk5re_m2m1akm2m1almm1angmm1anzm2m1aumme4namme2samm1inbmm1infmm1inhmm1insmm1intmmi3scmm3stamm3strmmüll1m4nesimode3smo2galmo2k1lmon2s3mon3su2m1opemo2rar2m1orcmor2drmo2rermos4tampf3limpf1ormp3strms3andm4s1efms1erwms1inims1orim2spedm2spotm2sprom4stagm3stelm3s2tims5träm3s2tumt3aremt1eltm2t1eum2t1immtmen2m2t3romt2sprmt1urtmu3cke4m3unfmu4s1amu2s1omut1aumut2stmvoll14n3absna2ch1nach3s4na2drna1f4rna2gemna2h1a3n2aldna2letnal3lanalmo2na2lopnal2phn2als_nal3t4n4amenna3m4n2n1amtnamt4sn1and24n1ang2n1ans2nantrnap2sina2r1an2arle4n3artna3r2unasyl2na3t4hnat4sanat4sc3n2aul4nausb4nausgn2auso4nauss4nausw2n1ä2mnär4s53nä1umnbe2inn2d1akn2danlnd1annnde2sendi2a3ndo2ben2d3ren2drobnd3rolnd3rosn2druind2sornd2spr2n1ebnne3ein4n1ehr3neigtnek3t42n1ele5neleb4nelek4nelemne3lennel4la3ne3lu2n1embn1e2mi2n3emp2n1emsnen3a2n1endgnen3einenen14nengb4nengs4nengtnens4enen3skn1entb4nentn5nentrn1ents4nentzne2n3u2n1epone2posne2ranne2rapne2raun1erbine2reb2nerfü3nergrn2erlin1ermän2ern_ne1rösn2ert_n1ertrne2rup2n1erzne3sanne3skane2s1pne1stanes3tine2tadne2tapn1etatne2taunet3han1e2tunet2zi2n1eupnfalt4nf5linnft4s3ng2absn2g1acn2g1akng2anfng1anzn2g1äln3g2enngen2an3gläsn2glicngrab6ng3ratng3rocngs3panich1s3n2id_nie4n3ni3eneni1eronifes3ni2grenig4spni2kalni2karni3ker4n1imp3n2in_n2in4a4n3ind4n1inhni2nor2n1insn2ins_4ninse4n1int2n1invni2s1eni3se_ni2s1pni3spinis3s4ni2s1uni3t4rni3tscnitts1n2k3adn2k1akn3k2aln2kansn2kausn2k1ärnk4ergnk1inhnk3lennk3lesn2klienk3lunn2k3ronks2eink3s2znk2taknk2tannkt1itnk4topnk2trunmen2snna2ben2nadan2n1annnen3gnn2erhnn2erknne2rönner2znnes1enne4stnn1o2rnn3s2pn2n1ufno2blano2leu3n2opano2radno1rakno3ral3n2os_no2s3pn2ostenost1r2nostvno3tabno2telno3t3hno4thano4thi2n1o2x4n1ö4lnräu3snre3sznrö2s1n2sangn2santn2sausn2s1änns1e2dns1entn2s1epns1erfns1ergn2serhns1ersnsfi4lnsho2fn2simpnsi4tensi2trns2kaln2s1opn4spatn3s2pins4piens3ponn4sprän4spronst1akn3starn3statns4tornstü1bn2s1unns2ungns4unrns4unsn4s3zint3absn3t2alnt1angnt2arbnt1arknt2armn2t1äunte3aunt1ebente3g6n2teignt4enent4ernnt4ersnt4ertnt2hern2t3hon3t4hunti3kln2tinfntini1nt2insn3ti1tnt4lemntmen2nto3ment3recn5trepnt4rign5tropn2t3rünt4saunt2sto3n4tu_ntu2ra2n3umb2n1ums2n3umz3nung_n3ungl2n1uninu4t3rn2z1aun2z1ännzdi1snzi2ganzig4snz1inin2zurkn2z1wan2z1wän2z1wuoa3cheoa3chioa4k1lo4a3lao4a3mi3oa3seo3b2al2o3b2äob3ein2o3b2iob3iteo2b3li2o3bloo2b3reob3s2hob2staocha2boche4boch1eioch3ö2och3teochu2fo2ckarock2erock3szodein3ode2n1odene4ode3sp2o3diaof1a2co2f1eiof2f1a1offizof2f5lof2f3r2o1f1rof4samof2speof2sprof2s1uof2teio2g1abog1alaog1ango2g1eiogi2erog1steohen3sohl3auoh3lecohl1eioh3lemoh3lenoh3lepohls2eoh2n1ooho2laoh1o2poh4rinoimmu4oka2laokale43o2kelok2s1po2l1akolars2ol1aufol4damol1eieol1eisol2fraoli3k4ol2kreol2lakol2lelolo3p2ol1ortol2strol2z1aol2zinom2anwom1arto2m1auo2m1eio3men_o2meruom1erzomiet1om1ingom1orgo4munto2narbon3ausone2n3onens2on1erbon1ergon1eröo3netton3g2lon2i3do4nikro4n1imon3ingonlo2con3n2eo2nokeon1orconsa2gon4samon2sebonse2lonst2hon3t2aoo2k3lo2p3adop3aktopa2leo1pe4nop2f3aop3fahopf3laop1flüopi5a4op5lago2p3le1op3t4or3a2bor4altor2ando2ranhor3arbor3attor1ändor2baror2dauor2deuor2ditor2dumore4aso2r1efor1eigo2reino2rerfor1ethor2fleorf3s42orgetor3g2h2orgiaorgi1eor3gle2o3ric4orie_o3rier4orin1or5ne_or3s4aor2täror2tefor2theor2torort3reo4r3un2o3s2ao3scheo2s1eio3s2hi2os2kl2os2koos3peco3s2poos2seios2s3oos4sonos2s3pos2s3tost1auos4teios2t3hos3tilost3räost3reost3ufo3s2zeo2ß1elota2goo5tarko3tarto2t1auot3augotei4not4em3otemp2ot5helo2t3hiot3hosot1opfoto2rao2t3reot3rinot4spaots2peot2sprot2t3rot4triou1f4lou4le_o3undsou3s2ioviso3owe2r11o2xidöbe2laöbe4liöh3l2eöl2k3löl2naröl2ungönizi1öp4s3tö2r3ecö2r1eiör2ergö2rerlör2f3lö2r1imörner2ör3s2kö2schaö2schlö2schwö2s1eiös2s1cöte4n3pa1f4rpa1k4lpak2topala3tpa2narpa3neipa2neu1pa2nopan3slpa5regpa5rek1park_par2klpar2kr1partn1partypar3z2pa3s2ppat4e2pa5t4rpa3unipä3ckepä2t3hpät3s4pekt4spe2letpe2lexpell2apell4epen3dape4nenpe2n1o3pensi1pensupen3z2per2anper4nape2robperwa4pes3s2p2f1akpf1ansp2fa4rpf3arepf3armp2f1au4p3fe_pf1eimpf1einp3fen_p2fentp3fer_pf2erwp3f2esp2f3läpf3leipf3lie2p1heiphen3dphen3sphi2ka2phthepi3as_pi3chlpiela2ping3s3pinsepi3onupi4pel3pirinpi3t2aplan3gpo2laupo4lorpo1o2bpo1ralpo1raupo4stapo4stäpo2stopos6trpo2t1upp3anlppe2n1p2p1f4p3p2hopp5lanp2p3rap2p3repre2e13preis2p3rer3p4res1prinz2prosspro1stp3steap3stelp3s2tipt3albp4t3ecp4t1eip4telept1in1pto3mept1urspul2sppu2s3t2r3aacra2barrab2blr2aber1r4abi2r3abwra2chura2dam2radapraf3arra2ferra3gle3r2ahmrail4l2r3airra2krera2kro2raktira2la2ral3abr3alar3r4aldral3larall2e2rallgr3alp_2ralper3al3trama3srambi2ra2mer1r2ami2r1amtramt4sr4andar4anderand3sr4aner1rangirani1eran2kr2r1anm2r1anpr2ans_r2ansp2rantr2r3anw3rareirar3f42r3arz2rato_rat2st3raub_rau2mi3rausc2rausgrau2spraut5srä2s1c3rätser2b1abrbal3arba3rerb1artrb1aufrb1echr4belärb1entr3b2larbla2dr2ble_rb3lerrb2linrb4seirb3skarb4stärb3strr1che_r1chenrch1s2rch3sprch3tar3d2acr2d1akr2d1alrdani1rd1antrd1anzrd2ei_rden3drde3rerde3sprdi3a2rdia4lrdo2berd3ratre2altre3at_re3atsre2b1are2b1lreb3ra4rechs2reck_2recki2reditre2hacre2h1ire2h1orei4bl4reifrrei3gareim2p4reingr3eink4reinr4re2ke2r1elbre3lei2r1elf2r1elt4rempfrena2bre3nal3rendiren3drren4gl2rengp2rengsr1ense2rentw3r4er_2r1erbr2erbr2r1erdr2erenr2erki2rerlö2r1ermre2robr2erse2rerspr2erte2rertr2r1erzrer5zer2erzy3r4es_ress2ere1stare2thyreu3g2re3uni2r1eurrewa4rrf1ältr2fentrf3licrf3linrf2s1ärf2s3trf3t4rr2g1ahr2g1akrge4anrge2blr2getor2glanr2gleur2g1obr2gregr2gresr2gretrg3rinrgs4tr3r4he_3r4henrho2i3rib2blri1cha2ridolrie2frriene4rien3srie2nuri1er_ri4ereri2f1ari2ferri2f1orim4scr2i3na2r1indri3n4erine1i2r1infrin2foring3lrin2gr2r1inh2rinitr1innu2r1insrin4sorin2sp2r1inv3risikri4s1pri3t2irit2trr3klaur2klisrk5nebr2k5nurk3räurk3rinrk2s1erk3shirk2tinrk2t3rrk3trark4trirk1unirlös3srl2s1prl3ster3m2agrma2larm1ansrm1anzrm1a2pr2maphr2m1efr2mider2m1imrm3starm3umsrn2andrn3anirn2a2rrn3arern3arirn3eifr4nerfr4nerkr4n1inr2n1opr2n1orrn3s2ärn3s2prn3s2zrn3t2ero2bei3rock_r2o3deroh3na3r2ohrro2madro2mer4ro1nyror3alro2ratro2reiro2r1oror3thro3s2iro3smoro3starost1rro4tagrote3iro2thoro4trirots2orot2taro3t2uro3untrö2b3lrpe2rerrer4srre2strr2n3ar2r3obrr3stur4samprs3anprs3antrsch2lr3schur3schwr2seinrse2n1rs2endrse4ners1erers1erörs1ersrs1erzrs1etars2kalrs2kanrs2kiers2kisr4s1opr4sordr2s3phrs2tecr3stier2stinr2stiprs4tobr4stotr3s4trr3s4türtals1rt1angrt1annrt1antrt1anzr2t1arrte1e2rt4eifr2telfr2temort1ersrt3holrt2humr2t1idr2tinfrto2rirt3recrt3rosrtrü2crt2spart2sprru2ckurude2aruf2s32r1uhrru1insru2m3ar2ums_2r1unar2unde2r1unf2runglrun2kr2r1unl2r1unm4r3untru2r1erus4stru3staru4teiru2t3rrü1benrwun3srz1a2cr5zenerz1engr3z2ofrzug2u3sabetsa3blesach3t2s1ada2s3affsa1f4r3s2al_sal2se2s1alt3s2alz4s1amnsam2tos2an2cs4and_3sang_2s3anh2s3anl2s3anssan4sk2s3anw3s4ar_3s2ara4s3arb3s2ard3s2ars4sartisa4ru24s3ath4s3atlsauri1s3ausw2s1änd3sänge2schak2schao3sche_2schefsch2en3sches4schexschi4es4chim3schis2schmö2schn_2schoxschs2e4sch3tscht2ascht4rsch2up3s4cop3sco4rsda3mese3at_s1echtsee3igseein2se1er_se1erö2s1effse2galse4helse2hinseh3rese2hüb2s1ei_2s1eie2s1eig2seinb4seing2seinh4seink2seinl2seinn4seinr2seinw4s1eis3s2eitse2l1ase3ladsela2gse3lamsel1ec4selem2self_s3elixse2l3ösel3szsel3trs4e3ma2s1emp3s2en_se4nagsen3gl3s2enise4nob3s2enss2ent_s2enti2sentw2sentzse2n3use5refser2ers2erfrs3erfüs2ergr2serhöse2robs2ers_2sersas4ert_s2ertase3rum3s4ervse2selse1stase2tatse1u2n3s2ha_4s3hansho4resi2achsi3enesi1errsi3gnusi2g3rsig4stsi2k1äsik3t42s1immsi3n4a2s1ind2s1infsing1asin3ghsin2gr4s1inhsini1e2s1inq2s1ins2s1int4s1invsi2s1esi2s1osi2s1psi2tausi2tra3skala4skanz3s2ki_3s2kik3skulpsla2vesler3s3s4lipsli4tuslo3be4s5not2s1o2bs1o2he4sohng2s1ohr4so2lyson3auson3säso1ral2s3ordso2rei4s1ostso3unt2s1ö2l2spala2spara4sparo3sparuspe3p4s1peri2sperl2speros2perr4spers3s2pez4spi4p3s2plis3p4lu4s3poss2potts2pracs2pran4sprax2spräm4spräs2spred2spres2sprob4sprüfsrat2ssrö2s1ssa3bos2sanos4sansss2antss3attsse3hass1erös3s2essse3tass1offs2s1opss1oris2spros3stelss4tipss2turss1ums2stabb3s4tad3staff2stale2stalkst1almst1alpst1ami4stan_sta4na3stand2stani2stans2stanws4tar_4staris4tarsst1asis3tat_2stauf2staum3staur2staus4stälts4tänd5stätts3täus4s5te_3s2tegste2gr3s4tehs2te2i3steig4steil1s2tel2stel_2steln2stels4stem_s5ten_st4ens4stermste4sts4teti3s2teu1steue4steufs2t3ho2stie_s2tiegs2tiel2stien3s2tif3s4tims4tinfs3tinnst1ins1stitu2sto3d4stod_s4toffs4t3om2stopo2stor_2store2storg2storis3tort2stose4stote2stöch2strad2strag4strai4strak2stral5straß2strua2strug3struk2strup2st3t43s4tud2stumt2stun_4stunn2stuntstu3rest3url2sturn2s3tus2stüch2stür_2stüre2stürg2stürs3s2tyl3su2b3su2cha2s1u2fsu1it_su2marsu2mau3s2umesu2mels3umfesum1o2su2mors3umsas3umst2s1uni2s1urlsüden24s3zeis2zena4szent4s3zet2ß1e2gße2l1aß2ers_2ßerseßge2bl2t1abb3tabel2taben3table2t3abn2t3abtta3d2s3taf2et1af4rta2ga24ta3gltag4sttah3leta3i2kta1insta1ir_t1a2kata2krotak6ta3taktb3t2al_ta3lagta3lakt1alb_t1albk3t4aletal2löta2mert1amplt1a2na4t2andt3ankl2tanwa2tanwät2anz_t1anzat1anzuta2pe_ta2pes2t1armt1artitar2to2t1arz4t1aspta2tanta2tautat3eita2temtat3heta2tom4tatue2t1auf4taufg4taufnt1ausb3tausct2auset1ausk4tausltaxi1s2t1ältt1ängs3t4ebbte3cha3technteck2ete2ckite2en3te1erwteg3ret3eifr2t1ein4teinf4teinnt3eis_t3eisb3te3letel1eb2telemtel1ente4leute2littell2ete2l1ö3telt4tel3tatel3thte2min2temme2tempfte4m1utena2bte4naste4nauten3dat6endit6endote2nefte2nettens2et4entat3entb4tentdt4ente4tentnten3zwt3e2pi3t4er_tera2bte1rafter3am4terbs4terbtte2relt4erfrte3ria3termi2ternct4ers_terst4ter3zatesa2cte2santesä2cte2selte2sprtes3s2te2tat3teur_2t1exz3t4ha_3thal_4t3hau1t2he_2t3heit4heint4henet4heni2therr3these2t3hil2t3himth4mag2t3hoc2t3hoht4hol_2t3hot1th2r2ti3a2mtiden2ti2deo3tief_3ti2erti2kamti2karti2kinti2kräti2larti2leiti2lel4t1imp3t2in_4t1indti3n2eting3lting3s2t1inj2t1int4t1invti2seiti1sta2ti3tuti2vanti2velti2v1oti2v3rtlung4tnes4s3tochtto4d1utom1e2to2mento2nauto2nehto2pakto2patto2rauto4ränto2relt3orga3torint1ort_3tost4to1sta3to3teto2thotouil44tractt3rad_6trahm5t4rai2trand3trankt3rann3transt3raset3rasi3träne4t5re_tre2brt3recht4reck6t3red5t4ree4trefe4trefot4rei_4treic2treift3reigt3reint3reis6treitt3reiz6t3relt4ren_3trendt3rent2trepe2trepot4reprt4res_3treuh5trieb2triegtri4er5triggt3rind4tringtri3ni4trinn4tripttrizi13t4roitro2ke4trom_tro2mi4troml2t3roo3tropf2t3röttrums15t4ruptru2thtrü1betrü1bu2t3rüct4sa4bt3s2act2s1aht4s3art2s1änts4cort3seiltse2n1t2s1erts1init2s1irt1slalt3spalts1parts2pedt3spekt3s2pit4stagts3takts4talt2stipt4stitts3tocts3tort2strits3türtta2bet2t1adtt2anttt1arttt1ebett1eiftt1eistte2lattel1otte2satte2sätt2häut2t3hott4roctt2sentt2sortt2spett2sprtt2stitu1almtu2chitu3fent3u2kr3t2ume2t3umf2t3umg2t3umk2t3umrtum2situm2so2t3umt2t3umz2t1una2t1und2t3unft3unga2tunif2t3unttu2re_tu2reitu2resturin1tück2s3tür3s3tütentze4n1tz2enetz1erltze2rotz2erst3ze2stzgel2tz1indtz1inttz2tinua2lauu3aletual2mau3a2louara2bu2be2cub3licu2b3luub2sanub2s1oub2spau1cha_uch1eiu3chesuch1iluch1inu2ch3ruch2souchst4u2ckemuder2eudert4udi3enuditi4ue2neruenge4uen2zuue2r3aue2r1äu3erehu3ereru3erexuer3g2uer2neue2r3ouer3scuer3t2u3erumue4teku2f1äsu2f1eiu2f1emu3fen_u2fentuf2ernuf2frouf1oriuf4sinuf2spouft3s2u2g1apu2g1eiug3ladu3g2löug4serug3spaug4sprug4spuug5stäug3strug3stüuhe3s6uh2reruh4rinuisi4nui4s5tukle1iuk2t3ruld2seu2l1elul1erful1erhul1erwule2saul1etaul1insul2lesul2p1hul4samuls2thul4trium1allum1anzu2maut1um3d2umer2aum1ins3umsatum4serum2simu2m1uru3n2amu2n3an2un2asun4dabun4deiun2didun2dorun2d3r4unds_und3spund3stun2ei_un3einunen2tun4es41unget1ungew1unglüun2g1rung3raung3riung4saun3ide1u2nifun3islu3n2it3u2nivun2keiun3n2eunvol2u1or3cu2pf2eu2pf1iu3rabaura2beur2anbur2anhu2r1auur3b2aur1effu2releu4r1epur1erhur1erwur2griurg3s4ur1iniur3insur1int1urlauur3sacur2sanur2sauur2serur4sinurst4rur2z1wus4annu2s1ecu2s1eiu3seiduse1rau2serpu2s1opu2spatus1picus2porus4sezus2sofu1stalus3tauust2inu2stunu2sturut1altut3a2mu2t1apu2t1arute4geut1ei_ut1eieutel1eute2n1u2tentu4t1exu2t3hout1opfu2topsut3reaut3s2aut2s1äut2spaut5t4lutu4reutu5ruut2z1wuve3räüb2s3tücht4eü3ckenück1erü3den_üden4güdwes2ü2f1eiü2h1eiühl1acüh3r2eühr3taü2mentün2fliün2g3lün3strü2r1eiü3r2o1ü2schlüs2s1cü2t1alva2teiva2t3hvatik2va2t3rvat3s4va2t1uveits32ve3muve3nalve3radve3rasver3b2ve4rekve4rinver3stver5te2ve3scves3tivi4a3tvie2w1vi2l1avi4leh2v1i2m2v1intvi3s2ovoll1avol2livo5rigv1steuwab2blwa3chewaffe2wa2g3nwah2liwal4dawal2tawal2towang4s1war2eware1iwart4ewass4e4webebwe2g1awe2g3lwe2g3rweg3s4wei4blwei2gawei3k4wei4trwel2t1wel4trwen3a4we2r3awer2bl1werbu1werduwerer2wer2fl1werk_wer2ka1werkewer2klwer2kuwer2tawer2to1wertswe2s1pwest1awes2thwest3rwes4tuwett3swi3ckawien2ewie2stwim2mawin2drwi3s2e1witzlwo2chawoche4woh2lewo2r3iwo4r3uwört2hwul3sewur2fa1wurstwus3te1wu4t1xe3lei3x2em_xen3s2x1i2doxin3s2xi2so2xis4täx1i2tuxtblo4x2t1eix4tentx2t3evy3chisyloni1y2p1iny1s4tyy2s1u22z3a2b2z3a2k2z1all2z3anf2z3anlz1artizar2tr2z1arzza1st42z3at3z1au2fzbübe32zecho2z1eck2z1effzei3lazeile42z1einzei3s4zeist4zei2trze2lenzell2azel3sz2z1empzens2ezent3sze2r3a2zerhöz2erl_2zerlö2z1erq2z1erzze3skuzes2spzes2stze2s3tze3sta2zettszger2azi3alozi1erhziers1zi1es_2z1impzin4er2z1inf2z1inhzin1itzin2sa2z1invzirk6szi3s2zzi1t2hzor4ne2z1oszz2t1auz4tehezt1inszt3reczu3ckezug1un2z1uhr2z1um_zumen22z1umszup2fizu3r2a2z1url2z1urs2z1urtz2wangz2weigz1weis2z1wel2z1wen2z1werz2werg2z1weszzi1s4"); + put(7, "_al4tei_amt4s3_and4ri_an3gli_angst3_an4si__an4tag_ausch3_be3erb_be3r2e_berg3a_bo4s3k_bu4ser_da4rin_da4te__da4tes_de4in__dien4e_ebe2r1_en2d3r_en4tei_er4dan_er4dar_er4dei_er4der_es5t4e_fer4no_fi3est_fi4le__fi4len_ge5nar_ge3r2a_ge3r2e_ger4in_hau2t1_her3an_ho4met_ima4ge_ka2b5l_li4ve__lo3ver_lus4tr_men3t4_orts3e_pa4r1e_reb3s2_re3cha_rein4t_reli3e_res6tr_sali3e_sim3p4_sto4re_tage4s_ti4me__ti4mes_to4nin_tri3es_ul4mei_urin4s_ur3o2m_ve5n2e_wei4ta_wor4tu_zin4stab1er2raber4ziaber4zoab3essea4cherfa4cherka4cheröach1o2bach2t1oach1u2fa3d2ar3ade1r2aade3s2pade5str2ad3recaf4t5reage4neba4gentuage4ralage4selage2s3pag3esseags4toca2h1erhah4l1eiahner4eahre4s3ahr6tria3isch_ajekt4o1a2k4adak5t4riala5ch2a2l1angalb3einalb3eisal4berh3a2l1efa4l3einal3endsa2l1erfa2l1erha2l1ert3a2lerza2l1eskali4eneali4nalal3lenda2l1o2balt3eigalt3ricalt4stüalzer4zamen4seamp2fa2am4schlana4lin2ana1s4and4artandel4san2d3rüand4sasand3stean2f5laan2g1eian4gerwan2g3raan2k1anan2k3noan2k3rä3antennan3t4heant3rina3ra3lia2r1anga2r1ansa2r1anza2r3appar2b3unaren4seare3r2aa2r1erhar2f3raari3e4nari3erdari3ergarin3itark3amtar2k1arark3aueark3lagark4trear4merkar3m2ora2r1o2dar2r3adarre4n3ar4schla4schecasch3laa2s3e2ma2s1o2fas4s3eia1s4tasas6t3rea2t1aktater3s2ato4mana2t1ortat4schnatt3angat3t4häat2t3räat4zerkat4zerwat2z1inau2b1alauch3taau4ferkaup4terau2s1ahau4schmau4schoaus3erp3aussagaus4se_aus5triau2t1äuä3isch_äl4schlän3n4e2ä2r1eneär4mentäser4eiäse4renäskopf3ät4schlät4schräu4schmäus2s1cba2k1erban2k1aba2r1ambau3s2k2b1eierbei4ge_2b1eimebe1in2hbe2l1enben3dorben4spaben4sprben5t4rber4ei_be4rerkber4in_ber3issbe2s1erb3esst_be3s4ze4b1illubis2s1cb2i3tusbjek4to2b3leidbo2l1anbor2d1ibor2d3rbor2t3rbra1st42b3rat_2b3riemb4schanb6schefb4s1erfb4s1ersbst1a2bb2s3träbs3treubtast3rbu4schlbu4schmbu4schwbügel3eca3s2a3ch3a2bich3anst3chartache4fer4chelemche4ler4chents4chentwche3rei2ch1e4x3chines2ch1invch3leinch4sper2ch1unf4ckense4ckentw4ckerhö4ckerke2ck1err4ckerze2ck1eseck4stro2ck1um3com4te_comtes4cre4mes2d1alar2d1ammädan4ce_dan5kladan2k1odar2m1i2d1au2f2d1aus3delei4gde3leindel4lebdel4leide2l1obdel4sandel2s5edel2s1p4denergden4sende2re2bde4reckder3ediderer4tderin4f4derklä4derneuder3taudert4rades3eltde2sen1de4stredes4tumdeten4tdge4t1edie4nebdi3ens_die2s3cdi2s5tedi4tengd2o3r4ador2f1a2d3rast2d3rauc3d4reck2d3reic3d4riscdrunge3drü5cked4s1amtds3assid4schind2s1e2bd4seinsd2s1engd2s1entd2s1erfd2s1erkd2s1erzd4s1etad3s2kand2s1pard3stell2d1un3ddu4schndu4schrdu4schwe4aler_e3at5t4ebens3eebet2s3eb4scheeb4stätebs3temebs3t2hech1o2bede3n2eeden4seeden4speder3t2ed2s1esed2s3treein4see2f1e2be2f1i2de2f1insege4strehen6t3ehe3strehl3eineh4lenteh5l2erehr1e2cehr3erleienge44eigeno1ei2g3nei3k4laei4leineil3inseim3allei4nengein4fo_ein4fosein4hab3einkomei2n1o23einsate4inverekt4antekt3erfekt3ergela4bene2l3a2me2l1a2re2l1eine3leinee4leing2e3len_e4lensee2l1ente2l1erge2l1errell3ebeell3eiseller4nelt3eng3elternelt3s2kelt3s2pe2m3anfe2m1ansem2d3a2e2m1erw1e2metiem2p3leena3l2ien3d2acend4ortend3romend3s2pene4bene4n1enten4entr4e3ner_e2n1erd1e2nerge2n1erle2n1erre2n1erse2n1erte2n3erue2n1erwe4n3essenge3raeni3er_e2n1i4me2n1o2benob4lee2n1o2ren4terb3entspr4entwetenz3erte4ratemerd3erwer3echser1e2ckere4dite2r1e2h4e3rei_4e3ren_e4rensee4rentne2r3erfe2r1erher3e4tiere4vid3ergebn4ergehäe3ri3k44e3rin_e2r1ini3erlebnermen4serm3erse2r1o2pers4toder4tersert3ins3erweck6erweise4s3atoe2s3einese4lere3s2peke3s2pore3s4praess3erges2s1paestab4be4starb1e2stase1s2tecest3ories3tropeße3r2eeten3d2eter4höeter4tre4traume6t3recetsch3wet2t3auette4n1et4t1umeu3ereieu3g2ereve5r2iewinde3e2z1ennfa4chebfa2ch1ifäh2r1ufeh4lei2f1eing4f1einh2f1einw2fe2lekfe2l1erfel4sohfe4rangfer3erz4ferneufest3eifet2t3afeuer3effel2d1f2f3emifi1er2ffi2l1anfisch3o2f3leinflu4gerfor4teifor2t3r2f5raucf4schanf4scheff4s1ehrf2s1entf4s1etaf3s2kief2s1pasf3s2porf4stechf3s4telf3sternft1a2bef4t1entft4scheft4s3täft4stri2f1u2nifun2k3rfus2s1pfu2ß1er4gangeb2g3ankugas5tangebe4amge4lanzge4lessgel3stegel3t2agen4auggen2d1rgen3eidgen3erngen4samgen4ta_2g1entfge4renggerin4fgerin4tger4satger4stoges3aufges3eltge2s3erges3s2tgien2e12g3isel3g2laub2g1lauf4g3lein4g3lisc2gni2s13g2num_2g3rede2g3reic2g3rein2g3renng3riese2g3ringg4s3a2kg4schefg3s2eilg3s2pekg3s2porgst3entgst3errg4s3torgs4trat4gungew2g1unglguschi5gus4serhaf3f4lhalan4chal4beihal4t3rhar4mes2h1aufmhau4spahäu2s1chba2r3ahe4b1eihe5ch2ehe2f1eihef3ermheiler4heit4s3he2l3auh3e2lekhel3ershel4meihe4n3a2hen3endhen3erg2h3entwher3a2bhe4reck4hereighe4rerwh1er2foherin4fherin4sh3erlauhe2s5trhie4rinhif3f4rhi2l3a4hin4t1ahir4nerhlags4ohle3runhner3eih3nungeho2l1ei2hot3s2hrei4bah4r3eigh3re2s1h2r1etah3rieslhr2s1achr2s3anhr3schlhr2s1enhr4s1inhr4s1ofh2s1achh4schanhse4lerh2s1erlh2s1ingh2s1parhst3alth2s3tauh3steinh5stellhst3ranh3taktsh4t3alth4t3a2mh4t3assh2t1eimh2t1eish4tentfht3erfoht3erfüh2t1erhh4terklht3erscht3ersth2t1erzh4t1eseh4t1esshte3stah4t3rakht3randh2t3rath4t5rinh2t3rolh2t3rosh4t1rösht3spriht4stabhts4tieht4stürh2t1urshu2b3eihu2b1enhu2l3eihu4lenthu2l1inhut4zeni3alenti3alerfi3alerhi3a2leti3a4liai1ät3s4i2b1aufich4speich2t3rieb4stoieb4strie2f1akie2f1anie3g4rai2e2l1aien4erfienge4fien3s2eie3r2erie4rerfi2er5niier4sehier3staier3steies2s3tie2t3hoie4t1ö4i2f3armift3erkif4t3riift3s2pi2g1angi4gefari3g4neuig3steiig4strei2k1a4ki2k1anoi4kanzei2k1erhi2ker2li2k1etaik4leriik2o3p4ikt3erki2l3a2mi4lentsi2l1erfi2l1ergi2l1erril2f3reilig1a2ili4gabi2l1indil3l2eril4mangil2m3atil2z1arilz3erki2m1armimat5scima4turi2m1erfi2m1erzi2m1infi2m1insindes4ii2n1engin3erbei4nerbiiner4löing4sam3inkarninma4leinn4stains3ertin3skanin3stelin4s3umional3aion4spiir2m1eii4s1amtisch3ari3s2chei4schefi4schini2sch1lisch3leisch3obisch3reisch3rui4schwai4schwoisch3wuise3infi4seinti2s1ermi2s1essis4s1aci1s4tati1s4teui1s4tilit3a4reiten3s2iti4kaniti3k2ei2t1in1i2t3ranits1a2git2s1e4its3er1it2s1peit4stafi2v1enei2v1enti2z1enejek4terjektor4je2t1u2jugend3jung3s42k1a2bo2k3a2drka3len_ka4lenskal3eri2k1annakari3es2k1artikau2f1okauf4spke1in2d2k1eiseke4leim2ke2lek2ke3letkel3s2kk3enten2k1ents4kerfahk4erfamk3ergebk3er4hökerin4tker4kenker4neuker4zeu2k1i2dekie2l3o2ki3l2aki3n4o32k1inse4k1lastkle3ari4k3leit2k1o2fekop4fenkot4tak2k3räum2k3redekreier4k4s1amtk2s1ersk2s1erwk3stat4k2t3a2rk2t1erhk2t1ingkti4terk4torgakt3oriek2u3n2akuri4erku4schl4l3aben4l1a2bl2l1a2drla2g1oblan2d3rlang3s4l1a2po2la2r1anla2r1eila4rene3l2ar3glar3ini2l1ar3t3lasserla2t3ralat4tanlat2t3rlau2b3rlaub4se2l1ausslär2m1al2b1edel2b1insld3a2b1ld3a2ckl2d1a2dl2d3a2nld4arm_lecht4ele2g1asleh3r2elein4dulei4ßerleit3s22le2lekle2m1o24lendet4lenerg2l1ennilen4sem2l3entwlent4wäle2r3asler3engle4rers3lergehl3ergen2l1ergilerin4s2l1er2ö3l2erra2l1esellgeräu33lichem3licherliebe4slie2s3clik4ter2l1indulingst4lin2k1ali4schu2l1i4solkor2b1ll1a2bel2l1a2mlle4n3all3endul4lentsl4lerfol4lergoll3erntll3ertrl2l1indl2l1o2rll1ö4sellus5t6l2m3a2blm3einsl2m1e2pl2m1erz2l1o2bllos3t4r2l1ö4l3l2s1a2dl4s1ambl4schinl4schmül2s1e2bl2s1ersl2s1erwl2s1impls3ohnel4t3amel2t3atol2t1eislt4stablt4stocltu4ranluf2t1aluf2t1eluf2t5rlung4sclus4s3alus2s1cluss3erlus2s1olus2s1plus2s3tlus4stälus4t1alust3relut1o2fmach4trma4ges_ma4laktma4l3atma2l3ut2m1analman4ce_man3ers2m1angr4ma3r2oma3s2pa4m1aspemassen3mas4telma1s4trma2ta2b2m1au2fmäu2s1cmbast3emedien3mein4dame1i4so2m1e2miment4spme2r3apme4rensmerin4dmerin4tmerz4en4m1essames2s1omes2s1pme4t3römierer4mil4cheminde4sming3s4mi4schami4schnmi4schwmis2s1cmi2s5tem2m1ansmme4linm4mentwmme2ra2mme4recmmi1s4tmo4n1ermor2d3amoster4mpf3erpmpf3errms5trenm2t1erfm4t1ergm2t1erlm2t1ersm2t1ertm4t1etam2t1insmt3s2kamun2d1amül4lenmütter3na3chenna2l1a2na4lent4n1a2nana4schw4n1a2synauf4frn4austenbe3r2en3ce2n3n2d1anznde4al_nde4lännde4robn2d3ratn4d3runnd4stabnds3taune2e2i22ne2he_2nehen44n3eing4n3eink3ne3l2o4n1endb4n1endd4n1endf4n1endh4n1endk4n1endp4n1endt4n1endwne4nenenen4ge_nen4gen4n1entl4n3entwne2ra2bne3r4alne2r3am4nerbe_4nerben4n5erfonerfor42n3erhö2n1erlöner4mit4n1ernt3n2ers_2n3ersa4n3essine2t1akne2t1annett4scnfi4le_n2g3a2mn2g1andn2g1einnge4ramnge4zänn2g1i2dn3g2locngs5trinie3l2a3n2ing4ni4schwnitt4san4k3algn2k1insn2k1ortnk2s1aln4n1alln4nentsn2n1unfn2o3ble2n1ob2s2n3o2fenor2d5rno4t3eino2t3inno2t1opn2s1a2dn2s1alln2s1äusn6schefn4schronsen4spn2s1erkn2s1erön2s1erwn2s1erzn4s1etan2s1inin4sperin4stat_nst3eifn3stemmns4tentnst4erön4stracn4strien3t2a3cn4tanzan2t1eisn4t1essn2t1inhnton2s1nt3reifnt3riegntu4re_ntu4res1n2ung4n2z1a2gn4zensen4zentwn4zentznz3erwe2o3b4enoben3d4oben3seobe4riso2ch1ecocher4ko3d2e1iof2f1inoge2l1io2h1eiso2h1erto2h1erzoh4lergoh4lerwo3isch_ol2l3auoll1e2col2l1eiol4lerkoma4nero3m2eiso2m1indo2m1into2n1erdon3n2anont3antont3erwon4t3riop4ferdopi3er_o2r3almor2d3amor2d1irord3s2to4rientor2k3aror4mansor4mentor3n2o1oro3n2aor2t1akor4t1anor2t1auort3eigort3erfor2t3evort3insor4trauort3ricor2t1umo4sentsoss3andost1a2bos4t3amost3angos3tarros4ta4soster3eos4t1obost3ranost3roto2ß1enzo2ß1ereo2ß1erfo3t2e1iote2l1aote4leio2t1erwo2t1i2mot4terkoun4ge_our4ne_ozen4taöchs4tuögen2s1öl2f1eiö2r1e2lö3r2erzö2r1uneö2sch3mpa2r3afpar3akt2par2erpar4kampar4kaupe2l1a2pe3li4npe3n2alper2r1a2ph1erspil4zerpingen4pi2z1in3ple5n4po2p3akpo2p3arpor4tinpor4trepor6tripo2s3tepost3eipost3rap2p3a2bppe4lerp4t1entpt3ereip4t1erwp4t1erz2r1acetra4chebra4chinracht3rr3a2d3r3ra1k4l2r3alm_r4alt2hram4manram4m3uram2p3lran4dep4r3aneiran4spara2r1inra4schl2r3asph2r3attarau3e2nrau4man2raus5srbe3r2erchst4rr2d1elbrden4glrder4err2d1innre3alerrech3ar3reigewrei3l2arei3l2irei3necre1in2v2re2lek2r1entl2r1ents4r3entzr4ergen2r1ernä4r3erns4r3ernt3r2ers_2r1ersare2s2tu2r3evid2r3e2x1rfi4le_rfolg4srf4s1idrf2s3prr2g1a2drge4ralrge4taprgi4selr2g3ralrg5s2turi2d3anri3ers_ri3estiri2f1eirif4terri4generin4dexrin4diz4rinnta3r4ins_r4inspirin4tegrin4t5rri4schori4schwr3i2talr2k3reark4stecrkt3ersrk2t1o2rl2s3tor2m1aldr2n1anzr4n3eisr4n1enern3enser4n1ergrn4erhir4n1ertrol4lanro4nerbron4tanros2s1crre4aler2s1a2dr4s1amtr2s3angr3sch2er4stantrs4temprs4terbrst3ingrst3ranr2t1almrt3a4rer2t3attrtei3lartei1s4rten3s2rt3ereir4terfar4terfor4t3erhr2t1erkrter4rerte3s2kr2t1imar4t3rakr4treisrt4s1ehr2t1urtru3a2r3ruch3strun2d1arund3er2r1u2ni4r3uniorus2s1pru2t1o2rve4n1er2z1erfr2z1ergr2z1erkr2z1erwrz2t3ror3z2wecsa2cho22s1a2drsa4gentsa3i2k1sa2l1ids3ameri6s1amma2s3a2nasan4dri4s3antr4s3a2sy2s3aufb2s3ausb3s2ausesbe3r2es4ch2al4schanc4schangsch3ei_4schemp4schess4schiru4schle_sch6lit4schre_4schrinsch3rom4schrousch3s2k4schunt4schwetsch4wilsdien4e2s1echo2s1e2ckse2e1i4se2h1a2se4h1eise4herk5s4ein_sein4dusei3n2esein4fos4eins_4seinsp4seinstsel3ers2s1endl4s1entf2s3entg2s1entsser3a2dse2r3als3erbe_s3ereig2s1erfo4serfül4serken2s3ernt4s3eröf4sersehse4r1ufse3rund4se4tap4s1e2thsi3ach_siege4ssi2g1a2si2k1absik3erlsin3g4lsing3sasi4schuska4te_4skategska4tes4s3klassni3er_sni3ersso4l3eisol4lerson2s1o2s1orga5s2orgeso2r1o24s1o2ve4spensi3s2pi4e4spier43s4prec3sprosssrat4scss1a2cks4s1alas4s1albs4s3amts4s3angs4s3anzs3sa1s2s2s1egasse3infss3ersessquet4s3ta3li4s3tann3staus_st3a2ve4stechn3steilhstei4naste4mar6s5ter_3sterncs4t3ese3s4tett1s2ti2rst1i4sosto3s2t1s4trah4strans3s4tras4straum4s5träg4sträne4s5tref4streibst3renn2s4trig2s5trisst3rollstro4ma4st3run2s4t3s42stum2sstum4sc3s4tunds2t3uni2s3tuns2st3urtsuch4st3s4zene2ß1estrßi2g1a2ta2b1anta4bend2t1a2drta2g1eitahl3sk3t2aktuta4lensta2l1optan4gar2t1anme4t1anna3t2ans_4t3ansi4t3anspta4rens3t4a3rita2ta2bta2t3erta2t1um4t3ausg4t3auss4t1auswtbauer4tbe3r2e4teilhet3einget3einlate2l3abte2l1acte2l1autele4bete4l1ecte4l1ehte4leinte4lerd4t3elf_te2l1inte4losttel3s2kte2m1ei3temperte4na2dte4na2g4t3endf4t1endl4t3endpten3d4rten3eidten3ens4tenerg4t1eng_ten4glate4n3in4tensem4t3entw4t3entzte3ran_te2re2bter3endte4rengte4rerkterer4z4terfol4terfül3ter3g2t6ergru4terklä2t1erlöter4mert3erneuter4re_ter4sert4erst_t4erstit4erstute4r1ufter4wäh2t3erzbtes3tantest3eitestes4teu3ereteu3eriteu2r3a2t3e2xe2t1e2xi4thrin_4thrinsti4dendti3e4n3tie4recti4gerzti2ma2gtim2m1atin2g1at1in1ittin2k1l3t2ins_4t1inseti4que_ti4schatisch3w3ti3t2etle2r3atmen6t3tmo4desto2d1ertor3inttra3chatra4demtra4far2t3rams3t4ran_tre4ale3t4reib2t3reih4trenditre2t3r2t3rund3t4runkt3s2chat4schart3sch2et4schefts4chemtsch4lit4schrot2s1e2bt4seindt2s1engt2s1entt2s1i2dts4paret3s2pont3s2port4spreits3tätit2s3tepts3tradt4strants3traut2s3trät4streut4stropt2s3trütte4lebtte4lent3u2fertums5trtung4s5tu2r1ertu4schlt2z1e2ct2z1eiet2z1eistz3entsubal3l2ubi3os_u2b3rituch4spruch4toruch2t3ru4ckentu3ck2eruden3s2ue3reigue4rergue4rerku4erinnuer4neru3erunfu3eruntu2f1ä2ßu2f1erhu4ferleufs3temuf2t1ebu4gabteu2g1erfu2g1erlugge4stu2g3rüsu3isch_u3ischsuk2t1inulm3einu2m3a2ku2m1artu2m1ausument4su2m1ergu2m1erlu2m1erwumpf4lium2p3leum2s1peun2d1umun2k1a2unk4titunk2t3run2n3aduns4t1runte4riunvoll3up4t3a2upt3ergu2r3a2mu2r1anau2r1angurgros4ur3s2zeu2s1eseusi3er_us3partu2s1pasu3s2peku5s4pizust3abeu5strasus6trisute4leiuter4eruto4berut4schlut4schmut4schöutz3engut2z1inüch2s1cück3eriü4ckersück4speü3d2ensü2f1ergü2h1engü2h1erkü2h1erzühr3ei_ül2l1eiün2f1eiü2r1entüste3neva2t3a4va4t1inve4l1auvenen4dve3rand2ve3s2evid3s2tvie2h3avie4recvi2l1invollen4vormen4waffel3wah4lerwalt4stwar3stewa4schawä3schewe3cke_we3ckeswei3strwer4gelwe4r3iowest3eiwest1o2wim4m3uwolf4s3wol4lerwor2t3rxi2d1emx2t1e2dxtra3b4x2t3rany2l3a2myl4antezei2t1aze2l1a2ze2l1erze2l1inzel3t2hze4n3aczen4semzen4zerze2re2b2z1ergäz3erhalzerin4tzer4neb2z1ersazert1a2zert4anzer4tin4zerwei3z2erzazessen4zger4s1zin4ser4zinsufzon4terz3t2herzu2g1arzu4gentzwan2d1"); + put(8, "_al1e2r1_al5l4en_anden6k_ar4m3ac_ar4t3ei_ber6gab_ber4g3r_de3r4en_einen6g_en4d3er_en5der__er4zen4_ka4t3io_lo4g3in_mode6ra_ost5end_oste6re_par3t4h_richt6e_sucher6_tan4k3la2ch1e2ca4ch3erwacht5ergach6tritack3sta43a2er2o1af4t3erlage4s3tiah4l3erhal4b3erw3a2l1e2bal2l3a4rall5erfaalli5er_al4t3erfam4t3ernand6spas3a4n1erban4g3erfan4g3erlan4g3erzang4s3poani5ers_an2t3a4ran2z1i4nar4t3ramau5ereinau4s3erwauster6mau4ten4gau4t3erhäs4s3erkbach7t4ebal4l3ehbe4r3eiwber6gan_ber3st4abe6steinbe4s3tolbote3n4ebst5einbbu4s3chach3e4ben6chergebcher6zie6ckergeb4d3achse2d1an3d22d1e4ben3d2e1i2mde2l1a2gde4l3augdel5sterde4n3endden4k3li4den4semde4r3eisde3r4erbde3r4erfde4r3ero4d3erhöh4d3ersatdest5altdest5ratdienst5r2d1in1it4d3innerdi4t3erldi4t3ermdi4t3ersd4s3tätid3s4tern2d1u2m1edu4sch3le3a4reneech3t4eiege4n3a2eg4se4r1ehr6erleei4b3uteei4d3errei2m1a2gein6karnein6stalei6schwuei4s3erwek4t3erzeld5erstel4d3erwe4ler4fae4ler4lae4l3ernäe4l3e4taelgi5er_elgi5ersel4l3einemen4t3he6mentspen4d3esse4n3ermoeni5ers_en5sch4eenst5alten4s3täten4t3rolen4z3erfen4z3ergen4z3erke2r3a4sie4r3eis_e4r3entferi3e4n3er6tereier4t3erfess4e3rees4t3enges4t3erhes4t3essestmo6deet4z3enteue6reifeut6schnfacher5ffal6schafal6schmfe4r3anzfrach6trf4s3tätif4s3tresf4s3tütef4t1e4tift4s3tanfzeiten6gas4t3el2g1eise2gel4b3ragel4b3rogel6dersge4l3ers4g3ereigge4ren4sge4r3entge4s3terglei4t5rgrammen6gros6selg3s4tatigs4t3rosgu4t3erhhaft4s3phal6lerfhau3f4lihau5steihau6terkhe4f3inghel4l3auhe2n1e2bhe4r3eishe4r3o4bhfel6lerhich6terho6ckerlhol6zeneh6rerlebh3s4terbh3t4akt_h4teil4zh4t3elith4t3entsht5erkenh6terneuh4t3erreh6terstaht6ersteht6raumeht4s3turhu4l3enghut4z3eria4l3ermie4n3a2gie4n3ergienst5räie4r3erziesen3s4ie4t3erhie4t3ertiker6fahi3l4aufbim4m3enti2n1e2bei4ner4trin2g1a2gin4n3ermin4s3tätir4m3untir4sch3wi4sch3eii5schingi6schwiri4s3etatiso6nendis4s3cheit4z3ergjah4r3eika4n1a4s6kantennkehr4s3o4ken4gagken5steiker6gebnkerin6stk3er4lauk3er4lebk6erlebe2k1er2zikeu6schlkor6dergkre1i2e4k4s3tanzk4t3erfolan2d3a22lat2t1alat4t3inl2d1e2seleben4s3lei6nerble4n3end5lentwet4l3ereigle4r3eim3l4ergew6lerwerbli4g3ers2l1in1itl6lergebl6lergen2l1or3g2l4s3ort_l4s3tätils6ternels6ternsl4te4leml4t1e4skl2t1o2rilu2g1e2blus6serflus6serklus6serslu4t3ergl2z1u4femagi5er_magi5ersmar6schmmar6schrma4t3erdmen6tanz4m3entwi4m3ergänmes6sergmp4f3ergmp4f3erz4m3ungebmu4r1u2fnacht6ra4n3a2mernavi5er_navi5ersn4d3entsnder5stene2n1e2bn4g3erseng4s3e4h2n3i2gelni4k3ingn4k3erfanseh5eren4s3ort_n4s3prien4s3tatens6terbenst5opfenten6te_nt4s3parober3in4ode6rat_ode6rateoh4l3erholl5endsoll5erweol4z3ernonderer5on4t3endopf5erdeopi5ers_or4d3engo2r1e2ckorsch5lior4t3entor4t3ereor4t3offor4t3räuos4s3enzo2ß1en2kö4sch3eipargel6dpä4t1e2hpä4t3entpe4l3inkp2f1in3spos4t3agrach6trärali5er_rali5ersran4d3errau4m3agräu5scher2b1a2der4b3lastrch6terwrderin6sr4d3erntrege4l3äre4h3entreister6re4n3end4r3erken4r3erlaurge4l3errgen4z3w4r3innerrkstati6rk4t3engrk4t3erfrk6terscrk4t3erwr2m1o2rirn3e4benrol3l4enrpe4r3inr6scherlr4s3ort_r6strangr4t3erler4t3ernäru6ckerlrun6derlrun6dersrun6derwr4z3entssa4l3erbsat4z3en6schlein2s1e2bense4l3erl4s1e2pos6sereignse4r3eimse4r3enk2s1i2deoson5ende2s1o2riesrücker6sse3in4tstel4l3äs4t3endss4t3engls4t3entfste6rersstes6se_5st4reif1s4tri2ksun6derhtan6zerhta4r3eretau3f4litau6schrtau6schwtblock5e4t1e2bentein3e4cte2m1o2rte2n1e2bte3n4ei_ten4t3riten6zerh4t3erde_te4r3eif6tergreiter4n3art6erscha6terwerbtes6terkti4v3erlto6ckenttrücker6t4s1amt4t4s3esset3s4terotta6gess2t1u2niotu2r1a2gtu2r1e4tu2ch1e4cu3erin4tuern3s4tu4g3reisun4d3erfund5erhau2r1an5sur3a4renu6schentusch5werusi5ers_u4t3ersaüge6leiswach6stuwach4t4rwahl5entwandels6we5cken_wein4s3aweis4s3pwel6schlwel6schrwel4t3a2wen4k3ri5werdensxpor6terx2t1er2fx2t1il2l2z1e2benzeit5endzei4t3er4z3ergebzer4n3ei4z3erstezer4t3agzer6terezer6trau"); + put(9, "_char8me__er8stein_he6r5inn_men8schl_men8schw_os5t6alg_rü6cker6_wort5en6_wor8tendach8traumalli7ers_allkon8tral5s6terbausan8ne_äh4l3e4be6b5rechtebs3e4r3inchner8ei_dampf8erfden6s5taue6ch5erziee4r3en4ge6l5eier_erg3el4s3fal6l5erk6fel6ternfor4m3a4gforni7er_fzei8tendgot6t5erggrab8schegren6z5eihä6s5chenhe6rin6nuherin8terh6l3er4näh6t5erspaieler8gebi2k1e2r2eil4d3en4ti4sch3e4hkamp8ferfke6rin6nulan6d5erwlan6d5erzleis6s5erlepositi86mel6ternmorgen5s65n2en3t2aner8schlenich8tersn4n3er4wano6t5entrnsch7werdn5s6ternen5s6ternsos4s3en4kpapieren8ram6m5ersr8blasserres6s5erw6r5innenmris6t5ersr6st5eingrs4t3er4wr4t3er4lasfal6l5erspani7er_sse6r5atts4s3e4strsu6m5ents4t3a4genttblocken8tes6ter6gür4g3en4gvati8ons_vol6l5endwer6t5ermwin4d3e4czes6s5end"); + put(10, "_er8brecht_os8ten8deder6t5en6deren8z7endgram8m7endhrei6b5e6cos6t5er6werein8s7trewel6t5en6dwin8n7ersczge8rin8nu"); + put(11, "_er8stritt__spiege8leiach8träume_lei8t7er8scpapie8r7endpiegelei8en"); + put(12, "ach8träumen_7sprechende_"); + put(13, "_er8stritten_"); + } + }); + public static final HyphenPattern EN_US = new HyphenPattern(2, 3, new HashMap() { { @@ -271,7 +286,7 @@ public HyphenPattern(int leftMin, int rightMin, Map patternObje } private class TrieNode { - Map codePoint = new HashMap(); - ArrayList _points; + Map codePoint = new HashMap<>(); + int[] points; } } diff --git a/library/src/main/java/com/bluejamesbond/text/hyphen/IHyphenator.java b/library/src/main/java/com/bluejamesbond/text/hyphen/IHyphenator.java index 2d23996..959dcc6 100644 --- a/library/src/main/java/com/bluejamesbond/text/hyphen/IHyphenator.java +++ b/library/src/main/java/com/bluejamesbond/text/hyphen/IHyphenator.java @@ -29,8 +29,8 @@ * Date: 1/27/15 3:35 AM */ -import java.util.ArrayList; +import java.util.List; public interface IHyphenator { - public ArrayList hyphenate(String word); + List hyphenate(String word); } diff --git a/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java b/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java index f782a49..0286e91 100644 --- a/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java +++ b/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java @@ -30,8 +30,9 @@ */ import java.util.ArrayList; +import java.util.List; -public class SqueezeHyphenator implements IHyphenator { +public final class SqueezeHyphenator implements IHyphenator { private static SqueezeHyphenator squeezeHyphenator; @@ -47,9 +48,9 @@ public static SqueezeHyphenator getInstance() { } @Override - public ArrayList hyphenate(String word) { + public List hyphenate(String word) { - ArrayList broken = new ArrayList(); + List broken = new ArrayList<>(); int len = word.length() - 1, i; for (i = 0; i < len; i += 2) { diff --git a/library/src/main/java/com/bluejamesbond/text/style/Direction.java b/library/src/main/java/com/bluejamesbond/text/style/Direction.java index 2843d20..61c7d7a 100644 --- a/library/src/main/java/com/bluejamesbond/text/style/Direction.java +++ b/library/src/main/java/com/bluejamesbond/text/style/Direction.java @@ -33,9 +33,9 @@ public enum Direction { LEFT_TO_RIGHT(false), RIGHT_TO_LEFT(true); - private boolean flag; + private final boolean flag; - private Direction(boolean flag) { + Direction(boolean flag) { this.flag = flag; } diff --git a/library/src/main/java/com/bluejamesbond/text/style/TextAlignment.java b/library/src/main/java/com/bluejamesbond/text/style/TextAlignment.java index 91a11b6..2c8e3d7 100644 --- a/library/src/main/java/com/bluejamesbond/text/style/TextAlignment.java +++ b/library/src/main/java/com/bluejamesbond/text/style/TextAlignment.java @@ -35,7 +35,7 @@ public enum TextAlignment { private final int mId; - private TextAlignment(int id) { + TextAlignment(int id) { mId = id; } diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/ArticleBuilder.java b/library/src/main/java/com/bluejamesbond/text/util/ArticleBuilder.java similarity index 97% rename from sample/src/main/java/com/bluejamesbond/text/sample/helper/ArticleBuilder.java rename to library/src/main/java/com/bluejamesbond/text/util/ArticleBuilder.java index f7f2b72..02a7c2f 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/ArticleBuilder.java +++ b/library/src/main/java/com/bluejamesbond/text/util/ArticleBuilder.java @@ -1,4 +1,4 @@ -package com.bluejamesbond.text.sample.helper; +package com.bluejamesbond.text.util; /* * Copyright 2015 Mathew Kurian diff --git a/library/src/main/java/com/bluejamesbond/text/util/Pagination.java b/library/src/main/java/com/bluejamesbond/text/util/Pagination.java new file mode 100644 index 0000000..5679ed2 --- /dev/null +++ b/library/src/main/java/com/bluejamesbond/text/util/Pagination.java @@ -0,0 +1,74 @@ +package com.bluejamesbond.text.util; + +import com.bluejamesbond.text.IDocumentLayout; + +import java.util.ArrayList; +import java.util.List; + +public class Pagination { + private final IDocumentLayout layout; + private final List pages; + private int pageHeight; + + public void setPageHeight(int pageHeight) { + this.pageHeight = pageHeight; + } + + public int getPageHeight() { + return pageHeight; + } + + public Pagination(IDocumentLayout layout, int pageHeight) { + this.layout = layout; + this.pages = new ArrayList<>(); + this.pageHeight = pageHeight; + } + + private int addPageByTokenIndex(int pageFirstTokenIndex, int index) { + int i = index; + final int tokenLine = layout.getLineForToken(i); + while (i < layout.getTokensCount() && layout.getLineForToken(i) == tokenLine) { + i++; + } + + pages.add( + layout.getText().subSequence( + layout.getTokenStart(pageFirstTokenIndex), + layout.getTokenEnd(i - 1))); + + return i; + } + + public void layout() { + final int lines = layout.getLineCount(); + float height = pageHeight; + final int tokensCount = layout.getTokensCount(); + int pageFirstTokenIndex = 0; + + for (int i = 0; i < tokensCount; i++) { + final float lineHeight = layout.getTokenAscent(i) + layout.getTokenDescent(i); + + if (height < layout.getTokenTopAt(i) + lineHeight) { + // When the layout height has been exceeded + pageFirstTokenIndex = i = addPageByTokenIndex(pageFirstTokenIndex, i); + height += pageHeight; + } + } + + if (layout.getLineForToken(pageFirstTokenIndex) < lines) { + // Put the rest of the text into the last page + pages.add( + layout.getText().subSequence( + layout.getTokenStart(pageFirstTokenIndex), + layout.getText().length())); + } + } + + public int size() { + return pages.size(); + } + + public CharSequence get(int index) { + return (index >= 0 && index < pages.size()) ? pages.get(index) : null; + } +} \ No newline at end of file diff --git a/sample/build.gradle b/sample/build.gradle index 725d0f2..69084e5 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -37,9 +37,9 @@ android { signingConfigs { release { keyAlias 'bluejamesbond' - keyPassword 'Mkone123*' + keyPassword '' storeFile file('C:/release.keystore.jks') - storePassword 'Mkone123*' + storePassword '' } } @@ -53,14 +53,14 @@ android { } } catch (Exception e) { } - compileSdkVersion 21 - buildToolsVersion '21.1.2' + compileSdkVersion 27 + buildToolsVersion '27.0.3' defaultConfig { applicationId 'com.bluejamesbond.text.sample' - minSdkVersion 8 - targetSdkVersion 21 - versionCode 9 - versionName '4.5' + minSdkVersion 14 + targetSdkVersion 27 + versionCode 10 + versionName '5.0' } android { lintOptions { @@ -76,5 +76,5 @@ android { } dependencies { - compile project(':library') + implementation project(':library') } diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 7c1dba0..19cdf44 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -32,7 +32,6 @@ package="com.bluejamesbond.text.sample"> @@ -49,6 +48,10 @@ android:name=".test.LongFormattedTextTest" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@android:style/Theme.NoTitleBar" /> + + + diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/FontsOverride.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/FontsOverride.java index aa080a0..19dda9b 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/FontsOverride.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/FontsOverride.java @@ -38,6 +38,7 @@ import java.lang.reflect.Field; +@SuppressWarnings("unused") public final class FontsOverride { public static void setDefaultFont(Context context, diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/MyQuoteSpan.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/MyQuoteSpan.java index 3f7beca..94bcc02 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/MyQuoteSpan.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/MyQuoteSpan.java @@ -40,14 +40,16 @@ public class MyQuoteSpan implements LeadingMarginSpan, ParcelableSpan { private final static int QUOTE_SPAN = 9; + private static final int DEFAULT_GAP_WIDTH = 30; + private static final int DEFAULT_COLOR = 0xff0000ff; private int mStripeWidth = 2; - private int mGapWidth = 30; + private int mGapWidth = DEFAULT_GAP_WIDTH; private int mColor; public MyQuoteSpan() { super(); - mColor = 0xff0000ff; + mColor = DEFAULT_COLOR; } public MyQuoteSpan(int color) { diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/PressableDocumentView.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/PressableDocumentView.java index aa462d3..7b459d5 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/PressableDocumentView.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/PressableDocumentView.java @@ -32,10 +32,6 @@ import android.content.Context; import android.graphics.Color; import android.util.AttributeSet; -import android.util.TypedValue; -import android.view.MotionEvent; -import android.view.View; -import android.widget.LinearLayout; import com.bluejamesbond.text.DocumentView; import com.bluejamesbond.text.hyphen.SqueezeHyphenator; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestActivity.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestActivity.java index 6ffe772..a0f3197 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestActivity.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestActivity.java @@ -29,6 +29,7 @@ * Date: 1/27/15 3:35 AM */ +import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Typeface; import android.os.Bundle; @@ -43,8 +44,17 @@ import com.bluejamesbond.text.sample.R; import com.bluejamesbond.text.style.TextAlignment; +@SuppressLint("Registered") public class TestActivity extends Activity { + public static final int TEXT_SIZE = 12; + public static final float INSET_PADDING_LEFT = 30f; + public static final float INSET_PADDING_RIGHT = 30f; + public static final float INSET_PADDING_TOP = 30f; + public static final float INSET_PADDING_BOTTOM = 30f; + public static final float LINE_HEIGHT_MULTIPLIER = 1f; + public static final int FADE_IN_DURATION = 800; + public static final int FADE_IN_ANIMATION_STEP_DELAY = 30; public String testName; private boolean debugging = false; private int cacheConfig = 0; @@ -70,27 +80,22 @@ protected void onCreate(Bundle savedInstanceState) { public DocumentView addDocumentView(CharSequence article, int type, boolean rtl) { final DocumentView documentView = new DocumentView(this, type); - documentView.getDocumentLayoutParams().setTextColor(0xffffffff); + documentView.getDocumentLayoutParams().setTextColor(R.color.black); documentView.getDocumentLayoutParams().setTextTypeface(Typeface.DEFAULT); - documentView.getDocumentLayoutParams().setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); + documentView.getDocumentLayoutParams().setTextSize(TypedValue.COMPLEX_UNIT_SP, TEXT_SIZE); documentView.getDocumentLayoutParams().setTextAlignment(TextAlignment.JUSTIFIED); - documentView.getDocumentLayoutParams().setInsetPaddingLeft(30f); - documentView.getDocumentLayoutParams().setInsetPaddingRight(30f); - documentView.getDocumentLayoutParams().setInsetPaddingTop(30f); - documentView.getDocumentLayoutParams().setInsetPaddingBottom(30f); - documentView.getDocumentLayoutParams().setLineHeightMultiplier(1f); + documentView.getDocumentLayoutParams().setInsetPaddingLeft(INSET_PADDING_LEFT); + documentView.getDocumentLayoutParams().setInsetPaddingRight(INSET_PADDING_RIGHT); + documentView.getDocumentLayoutParams().setInsetPaddingTop(INSET_PADDING_TOP); + documentView.getDocumentLayoutParams().setInsetPaddingBottom(INSET_PADDING_BOTTOM); + documentView.getDocumentLayoutParams().setLineHeightMultiplier(LINE_HEIGHT_MULTIPLIER); documentView.getDocumentLayoutParams().setReverse(rtl); documentView.getDocumentLayoutParams().setDebugging(debugging); documentView.setText(article); documentView.setProgressBar((ProgressBar) findViewById(R.id.progressBar)); - documentView.setFadeInDuration(800); - documentView.setFadeInAnimationStepDelay(30); - documentView.setFadeInTween(new DocumentView.ITween() { - @Override - public float get(float t, float b, float c, float d) { - return c * (t /= d) * t * t + b; - } - }); + documentView.setFadeInDuration(FADE_IN_DURATION); + documentView.setFadeInAnimationStepDelay(FADE_IN_ANIMATION_STEP_DELAY); + documentView.setFadeInTween(new FadeInAnymation()); LinearLayout linearLayout = new LinearLayout(this); linearLayout.setOrientation(LinearLayout.VERTICAL); @@ -106,14 +111,15 @@ public float get(float t, float b, float c, float d) { cacheConfig = documentView.getCacheConfig().getId(); final TextView debugButton = (TextView) findViewById(R.id.debugButton); + final String debugText = String.format("%s DEBUG", debugging ? "DISABLE" : "ENABLE"); if (debugButton != null) { - debugButton.setText((debugging ? "DISABLE" : "ENABLE") + " DEBUG"); + debugButton.setText(debugText); debugButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { debugging = !debugging; - debugButton.setText((debugging ? "DISABLE" : "ENABLE") + " DEBUG"); + debugButton.setText(debugText); documentView.getDocumentLayoutParams().setDebugging(debugging); } }); @@ -144,4 +150,11 @@ public void onClick(View view) { public DocumentView addDocumentView(CharSequence article, int type) { return addDocumentView(article, type, false); } + + private static class FadeInAnymation implements DocumentView.ITween { + @Override + public float get(float t, float b, float c, float d) { + return c * (t /= d) * t * t + b; + } + } } diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestList.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestList.java index 0c887b6..103d724 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestList.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestList.java @@ -46,7 +46,9 @@ import com.bluejamesbond.text.sample.test.ClickableSpanTest; import com.bluejamesbond.text.sample.test.ComplexLayoutTest; import com.bluejamesbond.text.sample.test.CustomHyphenatorTest; +import com.bluejamesbond.text.sample.test.ForceNoCacheXMLTest; import com.bluejamesbond.text.sample.test.HyphenatedTest; +import com.bluejamesbond.text.sample.test.ImageSpanTest; import com.bluejamesbond.text.sample.test.LeadingMarginSpan2Test; import com.bluejamesbond.text.sample.test.LineBreakTest; import com.bluejamesbond.text.sample.test.ListViewTest; @@ -54,6 +56,7 @@ import com.bluejamesbond.text.sample.test.LongPlainTextTest; import com.bluejamesbond.text.sample.test.MixedRTLTest; import com.bluejamesbond.text.sample.test.NewLineTest; +import com.bluejamesbond.text.sample.test.PaginatedFormattedTextTest; import com.bluejamesbond.text.sample.test.QuoteSpanTest; import com.bluejamesbond.text.sample.test.RTLTest; import com.bluejamesbond.text.sample.test.ShortFormattedTextTest; @@ -67,6 +70,7 @@ public class TestList extends TestActivity { private Class[] tests = new Class[]{ ChineseCharacterTest.class, LongFormattedTextTest.class, + PaginatedFormattedTextTest.class, NewLineTest.class, LeadingMarginSpan2Test.class, LineBreakTest.class, @@ -83,7 +87,9 @@ public class TestList extends TestActivity { ListViewTest.class, ComplexLayoutTest.class, ShortFormattedTextTest.class, - TextUpdateTest.class + ImageSpanTest.class, + TextUpdateTest.class, + ForceNoCacheXMLTest.class }; @Override diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/Utils.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/Utils.java index 55aebc5..483ea4b 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/Utils.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/Utils.java @@ -29,7 +29,7 @@ * Date: 1/27/15 3:35 AM */ -public class Utils { +public final class Utils { /* * Refer to http://stackoverflow.com/a/2560017/1100536 diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/ChineseCharacterTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/ChineseCharacterTest.java index 2034aaf..d68c31d 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/ChineseCharacterTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/ChineseCharacterTest.java @@ -36,7 +36,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyQuoteSpan; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.JustifiedSpan; @@ -54,20 +54,114 @@ protected void onCreate(Bundle savedInstanceState) { amb.append("@levifan Oct. 28, 2014", true, new RelativeSizeSpan(0.8f), new StyleSpan(Typeface.BOLD)); amb.append( - "事訖乃返己轉身,可曰:以測機意」樂而不淫誨去出.,可曰:」誨耳出意.第十一回後竊聽己轉身訖乃返建章曰:.父親回衙汗流如雨玉,不題.,可事關雎覽誨.汗流如雨覽吉安而來冒認收了」關雎出曰:矣玉,不題事父親回衙.父親回衙玉,不題吉安而來汗流如雨冒認收了.在一處己轉身訖乃返危德至.建章曰:訖乃返以測機白圭志不稱讚分得意.己轉身樂而不淫建章曰:白圭志.誨意曰:去覽」耳矣.第八回」,可招」不題耳德泉淹曰:矣誨出事.汗流如雨冒認收了吉安而來父親回衙玉,不題.矣出意曰:.己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去.,愈聽愈惱饒爾去罷」此是後話也懊悔不了.玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回.,愈聽愈惱此是後話饒爾去罷」.意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去.,愈聽愈惱饒爾去罷」也懊悔不了.第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回.,可驚異曰:德泉淹矣覽第二回出」相域去.意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨.事,可父親回衙曰:意出冒認收了吉安而來」去.矣出意曰:.己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去.,愈聽愈惱饒爾去罷」此是後話也懊悔不了.玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回.,愈聽愈惱此是後話饒爾去罷」.意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去.,愈聽愈惱饒爾去罷」也懊悔不了.第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回.,可驚異曰:德泉淹矣覽第二回出」相域去.意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨.事,可父親回衙曰:意出冒認收了吉安而來」去.矣出意曰:.己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去.,愈聽愈惱饒爾去罷」此是後話也懊悔不了.玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回.,愈聽愈惱此是後話饒爾去罷」.意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去.,愈聽愈惱饒爾去罷」也懊悔不了.第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回.,可驚異曰:德泉淹矣覽第二回出」相域去.意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨.事,可父親回衙曰:意出冒認收了吉安而來」去.", + "事訖乃返己轉身,可曰:以測機意」樂而不淫誨去出.,可曰:」誨耳出意.第十一回後竊聽己轉身訖乃返建章曰:.父親回衙汗流如雨玉,不題.,可事關雎覽誨" + + ".汗流如雨覽吉安而來冒認收了」關雎出曰:矣玉,不題事父親回衙.父親回衙玉,不題吉安而來汗流如雨冒認收了.在一處己轉身訖乃返危德至" + + ".建章曰:訖乃返以測機白圭志不稱讚分得意.己轉身樂而不淫建章曰:白圭志.誨意曰:去覽」耳矣.第八回」,可招」不題耳德泉淹曰:矣誨出事" + + ".汗流如雨冒認收了吉安而來父親回衙玉,不題.矣出意曰:.己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去" + + ".,愈聽愈惱饒爾去罷」此是後話也懊悔不了.玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回" + + ".,愈聽愈惱此是後話饒爾去罷」.意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去.,愈聽愈惱饒爾去罷」也懊悔不了.第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回" + + ".,可驚異曰:德泉淹矣覽第二回出」相域去.意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨" + + ".事,可父親回衙曰:意出冒認收了吉安而來」去.矣出意曰:.己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去" + + ".,愈聽愈惱饒爾去罷」此是後話也懊悔不了.玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回" + + ".,愈聽愈惱此是後話饒爾去罷」.意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去" + + ".,愈聽愈惱饒爾去罷」也懊悔不了.第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回.,可驚異曰:德泉淹矣覽第二回出」相域去" + + ".意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨.事,可父親回衙曰:意出冒認收了吉安而來」去.矣出意曰:" + + ".己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去.,愈聽愈惱饒爾去罷」此是後話也懊悔不了" + + ".玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回.,愈聽愈惱此是後話饒爾去罷」" + + ".意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去.,愈聽愈惱饒爾去罷」也懊悔不了" + + ".第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回.,可驚異曰:德泉淹矣覽第二回出」相域去" + + ".意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨.事,可父親回衙曰:意出冒認收了吉安而來」去.", true, new RelativeSizeSpan(0.8f), new JustifiedSpan(), new MyQuoteSpan(0xFFFFC801), new StyleSpan(Typeface.ITALIC), new ForegroundColorSpan(0xFF555555)); amb.append( - "矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回.覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨.德泉淹出第六回第八回意第一回耳,可」第五回矣.樂而不淫建章曰:不稱讚第十一回訖乃返.吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨.不題德泉淹第二回第四回第十回第一回.去關雎出誨.饒爾去罷」也懊悔不了此是後話,愈聽愈惱.己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去.己轉身訖乃返分得意.矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回.出意分得意耳覽誨第十一回關雎,可事白圭志.,愈聽愈惱饒爾去罷」也懊悔不了此是後話.矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回.覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨.德泉淹出第六回第八回意第一回耳,可」第五回矣.樂而不淫建章曰:不稱讚第十一回訖乃返.吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨.不題德泉淹第二回第四回第十回第一回.去關雎出誨.饒爾去罷」也懊悔不了此是後話,愈聽愈惱.己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去.己轉身訖乃返分得意.矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回.出意分得意耳覽誨第十一回關雎,可事白圭志.,愈聽愈惱饒爾去罷」也懊悔不了此是後話.矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回.覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨.德泉淹出第六回第八回意第一回耳,可」第五回矣.樂而不淫建章曰:不稱讚第十一回訖乃返.吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨.不題德泉淹第二回第四回第十回第一回.去關雎出誨.饒爾去罷」也懊悔不了此是後話,愈聽愈惱.己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去.己轉身訖乃返分得意.矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回.出意分得意耳覽誨第十一回關雎,可事白圭志.,愈聽愈惱饒爾去罷」也懊悔不了此是後話.", + "矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回.覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨.德泉淹出第六回第八回意第一回耳,可」第五回矣" + + ".樂而不淫建章曰:不稱讚第十一回訖乃返.吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨.不題德泉淹第二回第四回第十回第一回.去關雎出誨" + + ".饒爾去罷」也懊悔不了此是後話,愈聽愈惱.己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去" + + ".己轉身訖乃返分得意.矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回" + + ".出意分得意耳覽誨第十一回關雎,可事白圭志.,愈聽愈惱饒爾去罷」也懊悔不了此是後話.矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回" + + ".覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨.德泉淹出第六回第八回意第一回耳,可」第五回矣.樂而不淫建章曰:不稱讚第十一回訖乃返" + + ".吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨.不題德泉淹第二回第四回第十回第一回.去關雎出誨.饒爾去罷」也懊悔不了此是後話,愈聽愈惱" + + ".己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去.己轉身訖乃返分得意" + + ".矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回.出意分得意耳覽誨第十一回關雎,可事白圭志" + + ".,愈聽愈惱饒爾去罷」也懊悔不了此是後話.矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回.覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨" + + ".德泉淹出第六回第八回意第一回耳,可」第五回矣.樂而不淫建章曰:不稱讚第十一回訖乃返.吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨" + + ".不題德泉淹第二回第四回第十回第一回.去關雎出誨.饒爾去罷」也懊悔不了此是後話,愈聽愈惱" + + ".己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去.己轉身訖乃返分得意" + + ".矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回.出意分得意耳覽誨第十一回關雎,可事白圭志" + + ".,愈聽愈惱饒爾去罷」也懊悔不了此是後話.", true, new RelativeSizeSpan(0.8f), new JustifiedSpan()); amb.append( - "意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.", + "意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可" + + ".父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽" + + ".去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽" + + ".耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意" + + ".關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回" + + ".在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可" + + ".父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽" + + ".去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽" + + ".耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意" + + ".關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回" + + ".在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽" + + ".」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了" + + ".第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:" + + ".去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」" + + ".冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去" + + ".饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」" + + ".也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回" + + ".去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至" + + ".訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可" + + ".父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來" + + ".誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去" + + ".饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」" + + ".也懊悔不了此是後話,愈聽愈惱饒爾去罷」.", true, new RelativeSizeSpan(1.3f), new JustifiedSpan()); amb.append( - "誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去.覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題.出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去.覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題.出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去.覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題.出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去.覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題.出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.", + "誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去.覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:" + + ".父親回衙汗流如雨吉安而來玉,不題.出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」" + + ".事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意" + + ".」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去" + + ".覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題" + + ".出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意" + + ".」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去" + + ".覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題" + + ".出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣" + + ".貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎" + + ".第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去" + + ".覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題" + + ".出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣" + + ".貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎.第十回驚異德泉淹貢院" + + ".分得意己轉身建章曰:訖乃返.", true, new RelativeSizeSpan(0.8f), new JustifiedSpan()); amb.append( - "意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙.玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話.以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」.第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意.曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙.玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話.以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」.第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意.曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙.玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話.以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」.第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意.曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙.玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話.以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」.第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意.曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙.玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話.以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」.第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意.曰:出,可意", + "意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身" + + ".第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙" + + ".玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話" + + ".以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」" + + ".第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意" + + ".曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意" + + ".不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙" + + ".玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話" + + ".以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」" + + ".第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意" + + ".曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意" + + ".不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙" + + ".玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話" + + ".以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」" + + ".第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意" + + ".曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意" + + ".不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙" + + ".玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話" + + ".以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」" + + ".第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意" + + ".曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意" + + ".不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙" + + ".玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話" + + ".以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」" + + ".第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意" + + ".曰:出,可意", false, new RelativeSizeSpan(0.8f), new JustifiedSpan(), new StyleSpan(Typeface.ITALIC)); diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/ClickableSpanTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/ClickableSpanTest.java index b0f4d44..d7b2d85 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/ClickableSpanTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/ClickableSpanTest.java @@ -39,7 +39,7 @@ import com.bluejamesbond.text.DocumentView; import com.bluejamesbond.text.hyphen.SqueezeHyphenator; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyQuoteSpan; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.JustifiedSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/ForceNoCacheXMLTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/ForceNoCacheXMLTest.java new file mode 100644 index 0000000..cf00e3d --- /dev/null +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/ForceNoCacheXMLTest.java @@ -0,0 +1,41 @@ +package com.bluejamesbond.text.sample.test; + +/* + * Copyright 2015 Mathew Kurian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * ForeNoCacheXMLTest.java + * @author Mathew Kurian + * + * From TextJustify-Android Library v2.0 + * https://github.com/bluejamesbond/TextJustify-Android + * + * Please report any issues + * https://github.com/bluejamesbond/TextJustify-Android/issues + * + * Date: 2/4/15 11:31 AM + */ + +import com.bluejamesbond.text.sample.R; +import com.bluejamesbond.text.sample.helper.TestActivity; + +public class ForceNoCacheXMLTest extends TestActivity { + + @Override + protected int getContentView() { + return R.layout.test_xml_activity_no_cache; + } +} diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/ImageSpanTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/ImageSpanTest.java new file mode 100644 index 0000000..20c0a5b --- /dev/null +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/ImageSpanTest.java @@ -0,0 +1,77 @@ +package com.bluejamesbond.text.sample.test; + +/* + * Copyright 2015 Mathew Kurian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * ImageSpanTest.java + * @author Mathew Kurian + * + * From TextJustify-Android Library v2.0 + * https://github.com/bluejamesbond/TextJustify-Android + * + * Please report any issues + * https://github.com/bluejamesbond/TextJustify-Android/issues + * + * Date: 2/3/15 11:00 AM + */ + +import android.graphics.Typeface; +import android.os.Bundle; +import android.text.style.ImageSpan; +import android.text.style.RelativeSizeSpan; +import android.text.style.StyleSpan; + +import com.bluejamesbond.text.DocumentView; +import com.bluejamesbond.text.sample.R; +import com.bluejamesbond.text.util.ArticleBuilder; +import com.bluejamesbond.text.sample.helper.MyQuoteSpan; +import com.bluejamesbond.text.sample.helper.TestActivity; +import com.bluejamesbond.text.style.CenterSpan; +import com.bluejamesbond.text.style.JustifiedSpan; +import com.bluejamesbond.text.style.LeftSpan; + +public class ImageSpanTest extends TestActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ArticleBuilder ab = new ArticleBuilder() + .append(testName, + false, new RelativeSizeSpan(2f), new StyleSpan(Typeface.BOLD), + new LeftSpan()) + .append("Justin Worland @justinworland Oct. 25, 2014", + false, new RelativeSizeSpan(0.8f), new StyleSpan(Typeface.BOLD)) + .append("Updated: Oct. 25, 2014 2:34 PM".toUpperCase(), + true, new RelativeSizeSpan(0.6f), new StyleSpan(Typeface.BOLD)) + .append("State health department staff will be on the ground at state airports", + true, new RelativeSizeSpan(1.2f), new StyleSpan(Typeface.BOLD), + new StyleSpan(Typeface.ITALIC)); + + for (int i = 0; i < 1; i++) + ab.append("Healthcare workers returning to New York or New Jersey after treating Ebola patients in West Africa will be placed under a mandatory quarantine, officials announced Friday, one day after a Doctors Without Borders doctor was diagnosed with the virus in New York City. Illinois announced a similar policy Saturday, meaning it will be enforced in states with three of the five airports through which passengers traveling from the Ebola-stricken West African countries must enter the United States.", + true, new RelativeSizeSpan(1f), new JustifiedSpan()) + .append("N.J. Gov. Chris Christie and N.Y. Gov. Andrew Cuomo made the announcement as part of a broader procedural plan to help protect the densely packed, highly populated area from any further spread of the disease.", + true, new RelativeSizeSpan(0.8f), new JustifiedSpan(), new MyQuoteSpan(0xFFFFC801)) + .append("“Since taking office, I have erred on the side of caution when it comes to the safety and protection of New Yorkers, and the current situation regarding Ebola will be no different,” Gov. Cuomo said. “The steps New York and New Jersey are taking today will strengthen our safeguards to protect our residents against this disease and help ensure those that may be infected by Ebola are treated with the highest precautions.”", + true, new RelativeSizeSpan(1f), new CenterSpan(), + new ImageSpan(getResources().getDrawable(R.drawable.ic_launcher), ImageSpan.ALIGN_BASELINE)); + + addDocumentView(ab, + DocumentView.FORMATTED_TEXT); + } +} diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/LeadingMarginSpan2Test.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/LeadingMarginSpan2Test.java index 5065ba0..d9f2b46 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/LeadingMarginSpan2Test.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/LeadingMarginSpan2Test.java @@ -35,7 +35,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyLeadingMarginSpan2; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.JustifiedSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/LongFormattedTextTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/LongFormattedTextTest.java index a1c15af..a8f30c0 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/LongFormattedTextTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/LongFormattedTextTest.java @@ -35,7 +35,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyQuoteSpan; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.CenterSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/MixedRTLTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/MixedRTLTest.java index 997b5b3..350f751 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/MixedRTLTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/MixedRTLTest.java @@ -35,7 +35,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.Direction; import com.bluejamesbond.text.style.DirectionSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/PaginatedFormattedTextTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/PaginatedFormattedTextTest.java new file mode 100644 index 0000000..2c3c181 --- /dev/null +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/PaginatedFormattedTextTest.java @@ -0,0 +1,80 @@ +package com.bluejamesbond.text.sample.test; + +/* + * Copyright 2018 Boyarskikh Nikita + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * PaginatedFormattedTextTest.java + * @author Boyarskikh Nikita + * + * From TextJustify-Android Library v2.0 + * https://github.com/bluejamesbond/TextJustify-Android + * + * Please report any issues + * https://github.com/bluejamesbond/TextJustify-Android/issues + * + * Date: 5/20/18 10:13 AM + */ + +import android.graphics.Typeface; +import android.os.Bundle; +import android.text.style.RelativeSizeSpan; +import android.text.style.StyleSpan; + +import com.bluejamesbond.text.DocumentView; +import com.bluejamesbond.text.sample.helper.MyQuoteSpan; +import com.bluejamesbond.text.sample.helper.TestActivity; +import com.bluejamesbond.text.style.CenterSpan; +import com.bluejamesbond.text.style.JustifiedSpan; +import com.bluejamesbond.text.style.LeftSpan; +import com.bluejamesbond.text.style.RightSpan; +import com.bluejamesbond.text.util.ArticleBuilder; + +public class PaginatedFormattedTextTest extends TestActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ArticleBuilder ab = new ArticleBuilder() + .append(testName, + false, new RelativeSizeSpan(2f), new StyleSpan(Typeface.BOLD), + new LeftSpan()) + .append("Justin Worland @justinworland Oct. 25, 2014", + false, new RelativeSizeSpan(0.8f), new StyleSpan(Typeface.BOLD)) + .append("Updated: Oct. 25, 2014 2:34 PM".toUpperCase(), + true, new RelativeSizeSpan(0.6f), new StyleSpan(Typeface.BOLD)) + .append("State health department staff will be on the ground at state airports", + true, new RelativeSizeSpan(1.2f), new StyleSpan(Typeface.BOLD), + new StyleSpan(Typeface.ITALIC)); + + for (int i = 0; i < 15; i++) + ab.append("Healthcare workers returning to New York or New Jersey after treating Ebola patients in West Africa will be placed under a mandatory quarantine, officials announced Friday, one day after a Doctors Without Borders doctor was diagnosed with the virus in New York City. Illinois announced a similar policy Saturday, meaning it will be enforced in states with three of the five airports through which passengers traveling from the Ebola-stricken West African countries must enter the United States.", + true, new RelativeSizeSpan(1f), new JustifiedSpan()) + .append("N.J. Gov. Chris Christie and N.Y. Gov. Andrew Cuomo made the announcement as part of a broader procedural plan to help protect the densely packed, highly populated area from any further spread of the disease.", + true, new RelativeSizeSpan(0.8f), new JustifiedSpan(), new MyQuoteSpan(0xFFFFC801)) + .append("“Since taking office, I have erred on the side of caution when it comes to the safety and protection of New Yorkers, and the current situation regarding Ebola will be no different,” Gov. Cuomo said. “The steps New York and New Jersey are taking today will strengthen our safeguards to protect our residents against this disease and help ensure those that may be infected by Ebola are treated with the highest precautions.”", + true, new RelativeSizeSpan(1f), new CenterSpan()) + .append("New York and New Jersey state health department staff will be present on the ground at John F. Kennedy International Airport in New York and Newark Liberty Airport in New Jersey. In addition to implementing the mandatory quarantine of health care workers and others who had direct contact with Ebola patients, health department officials in each state will determine whether others should travelers should be hospitalized or quarantined.", + true, new RelativeSizeSpan(1f), new JustifiedSpan()) + .append("“The announcements mark a dramatic escalation in measures designed to prevent the spread of Ebola in the United States. Previously, only individuals with symptoms of Ebola would be quarantined upon entry to the U.S. under a federal rule from the Centers for Diseases Control and the Department of Homeland Security.”", + true, new RelativeSizeSpan(1f), new RightSpan()); + + DocumentView documentView = addDocumentView(ab, DocumentView.FORMATTED_TEXT); + documentView.setPaginated(true); + documentView.setCacheConfig(DocumentView.CacheConfig.NO_CACHE); // TODO: add pagination caching + } +} diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/QuoteSpanTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/QuoteSpanTest.java index 86d97ca..f6ca3fc 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/QuoteSpanTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/QuoteSpanTest.java @@ -36,7 +36,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyQuoteSpan; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.JustifiedSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/RTLTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/RTLTest.java index 8213fb3..f4f9d24 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/RTLTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/RTLTest.java @@ -35,7 +35,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.JustifiedSpan; import com.bluejamesbond.text.style.RightSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/ShortFormattedTextTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/ShortFormattedTextTest.java index 038e7b9..acad29e 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/ShortFormattedTextTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/ShortFormattedTextTest.java @@ -35,13 +35,12 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyQuoteSpan; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.CenterSpan; import com.bluejamesbond.text.style.JustifiedSpan; import com.bluejamesbond.text.style.LeftSpan; -import com.bluejamesbond.text.style.RightSpan; public class ShortFormattedTextTest extends TestActivity { diff --git a/sample/src/main/res/layout/test_activity.xml b/sample/src/main/res/layout/test_activity.xml index 4150635..6f6638d 100644 --- a/sample/src/main/res/layout/test_activity.xml +++ b/sample/src/main/res/layout/test_activity.xml @@ -52,7 +52,7 @@ android:padding="20dp" android:text="@string/titlebar" android:textColor="@android:color/white" - android:textSize="20dp" + android:textSize="20sp" android:textStyle="bold"/> @@ -76,8 +76,9 @@ android:padding="10dp" android:text="@string/debug_button" android:textColor="#aaaaaa" - android:textSize="13dp" - android:textStyle="bold"/> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> diff --git a/sample/src/main/res/layout/test_complex_layout.xml b/sample/src/main/res/layout/test_complex_layout.xml index 2e559c8..082e403 100644 --- a/sample/src/main/res/layout/test_complex_layout.xml +++ b/sample/src/main/res/layout/test_complex_layout.xml @@ -52,7 +52,7 @@ android:padding="20dp" android:text="@string/titlebar" android:textColor="@android:color/white" - android:textSize="20dp" + android:textSize="20sp" android:textStyle="bold"/> @@ -76,8 +76,9 @@ android:padding="10dp" android:text="@string/debug_button" android:textColor="#aaaaaa" - android:textSize="13dp" - android:textStyle="bold"/> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> - - + android:layout_alignParentTop="true"> - - - + - + - + @@ -167,7 +163,9 @@ android:background="#3498db" android:gravity="center" android:textAlignment="center" - android:textColor="#FFFFFF"/> + android:textColor="#FFFFFF" + android:layout_marginEnd="15dp" + android:contentDescription="LikeImage" /> + android:textColor="#FFFFFF" + android:layout_marginEnd="5dp" + android:contentDescription="LeftCenterIcon" /> + android:textColor="#FFFFFF" + android:layout_marginStart="5dp" + android:contentDescription="RightCenterIcon" /> @@ -207,7 +209,9 @@ android:background="#e74c3c" android:gravity="center" android:textAlignment="center" - android:textColor="#FFFFFF"/> + android:textColor="#FFFFFF" + android:layout_marginStart="15dp" + android:contentDescription="DislikeImage" /> @@ -216,7 +220,8 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" - android:background="#FF00FF"/> + android:background="#FF00FF" + android:contentDescription="LoginImage" /> diff --git a/sample/src/main/res/layout/test_listview.xml b/sample/src/main/res/layout/test_listview.xml index f9433b6..9c420d4 100644 --- a/sample/src/main/res/layout/test_listview.xml +++ b/sample/src/main/res/layout/test_listview.xml @@ -52,7 +52,7 @@ android:padding="20dp" android:text="@string/titlebar" android:textColor="@android:color/white" - android:textSize="20dp" + android:textSize="20sp" android:textStyle="bold"/> @@ -76,8 +76,9 @@ android:padding="10dp" android:text="@string/debug_button" android:textColor="#aaaaaa" - android:textSize="13dp" - android:textStyle="bold"/> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textAppearance="@android:style/TextAppearance.Large" + android:textIsSelectable="true" /> @@ -68,8 +68,9 @@ android:padding="10dp" android:text="@string/debug_button" android:textColor="#aaaaaa" - android:textSize="13dp" - android:textStyle="bold"/> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> @@ -76,8 +76,9 @@ android:padding="10dp" android:text="@string/debug_button" android:textColor="#aaaaaa" - android:textSize="13dp" - android:textStyle="bold"/> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sample/src/main/res/layout/testlist_activity.xml b/sample/src/main/res/layout/testlist_activity.xml index 699273f..a4593c9 100644 --- a/sample/src/main/res/layout/testlist_activity.xml +++ b/sample/src/main/res/layout/testlist_activity.xml @@ -40,7 +40,7 @@ android:padding="20dp" android:text="@string/titlebar" android:textColor="@android:color/white" - android:textSize="20dp" + android:textSize="20sp" android:textStyle="bold"/> diff --git a/sample/src/main/res/values/colors.xml b/sample/src/main/res/values/colors.xml new file mode 100644 index 0000000..44a9a74 --- /dev/null +++ b/sample/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + 0xffffffff + \ No newline at end of file