diff --git a/patches/Html.patch b/patches/Html.patch
index 61ee5d359e..aa21d7bc91 100644
--- a/patches/Html.patch
+++ b/patches/Html.patch
@@ -1,1203 +1,272 @@
---- /home/marcel/Android/Sdk/sources/android-30/android/text/Html.java 2020-09-10 08:18:47.009487012 +0200
-+++ ./app/src/main/java/eu/faircode/email/HtmlEx.java 2020-10-03 11:19:59.338719036 +0200
-@@ -1,3 +1,5 @@
-+package eu.faircode.email;
-+
- /*
- * Copyright (C) 2007 The Android Open Source Project
- *
-@@ -14,15 +16,12 @@
- * limitations under the License.
- */
-
--package android.text;
--
--import android.app.ActivityThread;
--import android.app.Application;
--import android.compat.annotation.UnsupportedAppUsage;
--import android.content.res.Resources;
--import android.graphics.Color;
-+import android.content.Context;
- import android.graphics.Typeface;
--import android.graphics.drawable.Drawable;
-+import android.text.Layout;
-+import android.text.Spanned;
-+import android.text.TextDirectionHeuristics;
-+import android.text.TextUtils;
- import android.text.style.AbsoluteSizeSpan;
- import android.text.style.AlignmentSpan;
- import android.text.style.BackgroundColorSpan;
-@@ -41,213 +40,22 @@ import android.text.style.TypefaceSpan;
- import android.text.style.URLSpan;
- import android.text.style.UnderlineSpan;
-
--import org.ccil.cowan.tagsoup.HTMLSchema;
--import org.ccil.cowan.tagsoup.Parser;
--import org.xml.sax.Attributes;
--import org.xml.sax.ContentHandler;
--import org.xml.sax.InputSource;
--import org.xml.sax.Locator;
--import org.xml.sax.SAXException;
--import org.xml.sax.XMLReader;
--
--import java.io.IOException;
--import java.io.StringReader;
--import java.util.HashMap;
--import java.util.Locale;
--import java.util.Map;
--import java.util.regex.Matcher;
--import java.util.regex.Pattern;
--
--/**
-- * This class processes HTML strings into displayable styled text.
-- * Not all HTML tags are supported.
-- */
--public class Html {
-- /**
-- * Retrieves images for HTML <img> tags.
-- */
-- public static interface ImageGetter {
-- /**
-- * This method is called when the HTML parser encounters an
-- * <img> tag. The source argument is the
-- * string from the "src" attribute; the return value should be
-- * a Drawable representation of the image or null
-- * for a generic replacement image. Make sure you call
-- * setBounds() on your Drawable if it doesn't already have
-- * its bounds set.
-- */
-- public Drawable getDrawable(String source);
-- }
--
-- /**
-- * Is notified when HTML tags are encountered that the parser does
-- * not know how to interpret.
-- */
-- public static interface TagHandler {
-- /**
-- * This method will be called whenn the HTML parser encounters
-- * a tag that it does not know how to interpret.
-- */
-- public void handleTag(boolean opening, String tag,
-- Editable output, XMLReader xmlReader);
-- }
--
-- /**
-- * Option for {@link #toHtml(Spanned, int)}: Wrap consecutive lines of text delimited by '\n'
-- * inside <p> elements. {@link BulletSpan}s are ignored.
-- */
-- public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0x00000000;
--
-- /**
-- * Option for {@link #toHtml(Spanned, int)}: Wrap each line of text delimited by '\n' inside a
-- * <p> or a <li> element. This allows {@link ParagraphStyle}s attached to be
-- * encoded as CSS styles within the corresponding <p> or <li> element.
-- */
-- public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 0x00000001;
--
-- /**
-- * Flag indicating that texts inside <p> elements will be separated from other texts with
-- * one newline character by default.
-- */
-- public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 0x00000001;
--
-- /**
-- * Flag indicating that texts inside <h1>~<h6> elements will be separated from
-- * other texts with one newline character by default.
-- */
-- public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 0x00000002;
--
-- /**
-- * Flag indicating that texts inside <li> elements will be separated from other texts
-- * with one newline character by default.
-- */
-- public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 0x00000004;
--
-- /**
-- * Flag indicating that texts inside <ul> elements will be separated from other texts
-- * with one newline character by default.
-- */
-- public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 0x00000008;
--
-- /**
-- * Flag indicating that texts inside <div> elements will be separated from other texts
-- * with one newline character by default.
-- */
-- public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 0x00000010;
--
-- /**
-- * Flag indicating that texts inside <blockquote> elements will be separated from other
-- * texts with one newline character by default.
-- */
-- public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 0x00000020;
--
-- /**
-- * Flag indicating that CSS color values should be used instead of those defined in
-- * {@link Color}.
-- */
-- public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 0x00000100;
--
-- /**
-- * Flags for {@link #fromHtml(String, int, ImageGetter, TagHandler)}: Separate block-level
-- * elements with blank lines (two newline characters) in between. This is the legacy behavior
-- * prior to N.
-- */
-- public static final int FROM_HTML_MODE_LEGACY = 0x00000000;
-+import static android.text.Html.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE;
-
-- /**
-- * Flags for {@link #fromHtml(String, int, ImageGetter, TagHandler)}: Separate block-level
-- * elements with line breaks (single newline character) in between. This inverts the
-- * {@link Spanned} to HTML string conversion done with the option
-- * {@link #TO_HTML_PARAGRAPH_LINES_INDIVIDUAL}.
-- */
-- public static final int FROM_HTML_MODE_COMPACT =
-- FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH
-- | FROM_HTML_SEPARATOR_LINE_BREAK_HEADING
-- | FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM
-- | FROM_HTML_SEPARATOR_LINE_BREAK_LIST
-- | FROM_HTML_SEPARATOR_LINE_BREAK_DIV
-- | FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE;
-+public class HtmlEx {
-+ private Context context;
-
-- /**
-- * The bit which indicates if lines delimited by '\n' will be grouped into <p> elements.
-- */
- private static final int TO_HTML_PARAGRAPH_FLAG = 0x00000001;
-
-- private Html() { }
--
-- /**
-- * Returns displayable styled text from the provided HTML string with the legacy flags
-- * {@link #FROM_HTML_MODE_LEGACY}.
-- *
-- * @deprecated use {@link #fromHtml(String, int)} instead.
-- */
-- @Deprecated
-- public static Spanned fromHtml(String source) {
-- return fromHtml(source, FROM_HTML_MODE_LEGACY, null, null);
-- }
--
-- /**
-- * Returns displayable styled text from the provided HTML string. Any <img> tags in the
-- * HTML will display as a generic replacement image which your program can then go through and
-- * replace with real images.
-- *
-- *
This uses TagSoup to handle real HTML, including all of the brokenness found in the wild. -- */ -- public static Spanned fromHtml(String source, int flags) { -- return fromHtml(source, flags, null, null); -- } -- -- /** -- * Lazy initialization holder for HTML parser. This class will -- * a) be preloaded by the zygote, or b) not loaded until absolutely -- * necessary. -- */ -- private static class HtmlParser { -- private static final HTMLSchema schema = new HTMLSchema(); -- } -- -- /** -- * Returns displayable styled text from the provided HTML string with the legacy flags -- * {@link #FROM_HTML_MODE_LEGACY}. -- * -- * @deprecated use {@link #fromHtml(String, int, ImageGetter, TagHandler)} instead. -- */ -- @Deprecated -- public static Spanned fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler) { -- return fromHtml(source, FROM_HTML_MODE_LEGACY, imageGetter, tagHandler); -- } -- -- /** -- * Returns displayable styled text from the provided HTML string. Any <img> tags in the -- * HTML will use the specified ImageGetter to request a representation of the image (use null -- * if you don't want this) and the specified TagHandler to handle unknown tags (specify null if -- * you don't want this). -- * -- *
This uses TagSoup to handle real HTML, including all of the brokenness found in the wild.
-- */
-- public static Spanned fromHtml(String source, int flags, ImageGetter imageGetter,
-- TagHandler tagHandler) {
-- Parser parser = new Parser();
-- try {
-- parser.setProperty(Parser.schemaProperty, HtmlParser.schema);
-- } catch (org.xml.sax.SAXNotRecognizedException e) {
-- // Should not happen.
-- throw new RuntimeException(e);
-- } catch (org.xml.sax.SAXNotSupportedException e) {
-- // Should not happen.
-- throw new RuntimeException(e);
-- }
--
-- HtmlToSpannedConverter converter =
-- new HtmlToSpannedConverter(source, imageGetter, tagHandler, parser, flags);
-- return converter.convert();
-+ public HtmlEx(Context context){
-+ this.context = context;
- }
-
- /**
+diff --git a/app/src/main/java/eu/faircode/email/HtmlEx.java b/app/src/main/java/eu/faircode/email/HtmlEx.java
+index af06a672b..bbfcdc5fc 100644
+--- a/app/src/main/java/eu/faircode/email/HtmlEx.java
++++ b/app/src/main/java/eu/faircode/email/HtmlEx.java
+@@ -55,7 +55,7 @@ public class HtmlEx {
* @deprecated use {@link #toHtml(Spanned, int)} instead.
*/
@Deprecated
-- public static String toHtml(Spanned text) {
-+ public /* static */ String toHtml(Spanned text) {
+- public /* static */ String toHtml(Spanned text) {
++ public static String toHtml(Spanned text) {
return toHtml(text, TO_HTML_PARAGRAPH_LINES_CONSECUTIVE);
}
-@@ -261,7 +69,7 @@ public class Html {
+@@ -69,7 +69,7 @@ public class HtmlEx {
* {@link #TO_HTML_PARAGRAPH_LINES_INDIVIDUAL}
* @return string containing input converted to HTML
*/
-- public static String toHtml(Spanned text, int option) {
-+ public /* static */ String toHtml(Spanned text, int option) {
+- public /* static */ String toHtml(Spanned text, int option) {
++ public static String toHtml(Spanned text, int option) {
StringBuilder out = new StringBuilder();
withinHtml(out, text, option);
return out.toString();
-@@ -270,13 +78,13 @@ public class Html {
+@@ -78,13 +78,13 @@ public class HtmlEx {
/**
* Returns an HTML escaped representation of the given plain text.
*/
-- public static String escapeHtml(CharSequence text) {
-+ public /* static */ String escapeHtml(CharSequence text) {
+- public /* static */ String escapeHtml(CharSequence text) {
++ public static String escapeHtml(CharSequence text) {
StringBuilder out = new StringBuilder();
withinStyle(out, text, 0, text.length());
return out.toString();
}
-- private static void withinHtml(StringBuilder out, Spanned text, int option) {
-+ private /* static */ void withinHtml(StringBuilder out, Spanned text, int option) {
+- private /* static */ void withinHtml(StringBuilder out, Spanned text, int option) {
++ private static void withinHtml(StringBuilder out, Spanned text, int option) {
if ((option & TO_HTML_PARAGRAPH_FLAG) == TO_HTML_PARAGRAPH_LINES_CONSECUTIVE) {
encodeTextAlignmentByDiv(out, text, option);
return;
-@@ -285,7 +93,7 @@ public class Html {
+@@ -93,7 +93,7 @@ public class HtmlEx {
withinDiv(out, text, 0, text.length(), option);
}
-- private static void encodeTextAlignmentByDiv(StringBuilder out, Spanned text, int option) {
-+ private /* static */ void encodeTextAlignmentByDiv(StringBuilder out, Spanned text, int option) {
+- private /* static */ void encodeTextAlignmentByDiv(StringBuilder out, Spanned text, int option) {
++ private static void encodeTextAlignmentByDiv(StringBuilder out, Spanned text, int option) {
int len = text.length();
int next;
-@@ -298,7 +106,7 @@ public class Html {
- for(int j = 0; j < style.length; j++) {
- if (style[j] instanceof AlignmentSpan) {
- Layout.Alignment align =
-- ((AlignmentSpan) style[j]).getAlignment();
-+ ((AlignmentSpan) style[j]).getAlignment();
- needDiv = true;
- if (align == Layout.Alignment.ALIGN_CENTER) {
- elements = "align=\"center\" " + elements;
-@@ -321,8 +129,8 @@ public class Html {
+@@ -129,7 +129,7 @@ public class HtmlEx {
}
}
-- private static void withinDiv(StringBuilder out, Spanned text, int start, int end,
-- int option) {
-+ private /* static */ void withinDiv(StringBuilder out, Spanned text, int start, int end,
-+ int option) {
+- private /* static */ void withinDiv(StringBuilder out, Spanned text, int start, int end,
++ private static void withinDiv(StringBuilder out, Spanned text, int start, int end,
+ int option) {
int next;
for (int i = start; i < end; i = next) {
- next = text.nextSpanTransition(i, end, QuoteSpan.class);
-@@ -340,7 +148,7 @@ public class Html {
+@@ -148,7 +148,7 @@ public class HtmlEx {
}
}
-- private static String getTextDirection(Spanned text, int start, int end) {
-+ private /* static */ String getTextDirection(Spanned text, int start, int end) {
+- private /* static */ String getTextDirection(Spanned text, int start, int end) {
++ private static String getTextDirection(Spanned text, int start, int end) {
if (TextDirectionHeuristics.FIRSTSTRONG_LTR.isRtl(text, start, end - start)) {
return " dir=\"rtl\"";
} else {
-@@ -348,8 +156,8 @@ public class Html {
+@@ -156,7 +156,7 @@ public class HtmlEx {
}
}
-- private static String getTextStyles(Spanned text, int start, int end,
-- boolean forceNoVerticalMargin, boolean includeTextAlign) {
-+ private /* static */ String getTextStyles(Spanned text, int start, int end,
-+ boolean forceNoVerticalMargin, boolean includeTextAlign) {
+- private /* static */ String getTextStyles(Spanned text, int start, int end,
++ private static String getTextStyles(Spanned text, int start, int end,
+ boolean forceNoVerticalMargin, boolean includeTextAlign) {
String margin = null;
String textAlign = null;
-
-@@ -362,7 +170,7 @@ public class Html {
- // Only use the last AlignmentSpan with flag SPAN_PARAGRAPH
- for (int i = alignmentSpans.length - 1; i >= 0; i--) {
- AlignmentSpan s = alignmentSpans[i];
-- if ((text.getSpanFlags(s) & Spanned.SPAN_PARAGRAPH) == Spanned.SPAN_PARAGRAPH) {
-+ if ((text.getSpanFlags(s) & Spanned.SPAN_PARAGRAPH) == Spanned.SPAN_PARAGRAPH || true) {
- final Layout.Alignment alignment = s.getAlignment();
- if (alignment == Layout.Alignment.ALIGN_NORMAL) {
- textAlign = "text-align:start;";
-@@ -392,8 +200,8 @@ public class Html {
+@@ -200,7 +200,7 @@ public class HtmlEx {
return style.append("\"").toString();
}
-- private static void withinBlockquote(StringBuilder out, Spanned text, int start, int end,
-- int option) {
-+ private /* static */ void withinBlockquote(StringBuilder out, Spanned text, int start, int end,
-+ int option) {
+- private /* static */ void withinBlockquote(StringBuilder out, Spanned text, int start, int end,
++ private static void withinBlockquote(StringBuilder out, Spanned text, int start, int end,
+ int option) {
if ((option & TO_HTML_PARAGRAPH_FLAG) == TO_HTML_PARAGRAPH_LINES_CONSECUTIVE) {
withinBlockquoteConsecutive(out, text, start, end);
- } else {
-@@ -401,9 +209,9 @@ public class Html {
+@@ -209,9 +209,9 @@ public class HtmlEx {
}
}
-- private static void withinBlockquoteIndividual(StringBuilder out, Spanned text, int start,
-- int end) {
-- boolean isInList = false;
-+ private /* static */ void withinBlockquoteIndividual(StringBuilder out, Spanned text, int start,
-+ int end) {
-+ Boolean isInBulletList = null;
+- private /* static */ void withinBlockquoteIndividual(StringBuilder out, Spanned text, int start,
++ private static void withinBlockquoteIndividual(StringBuilder out, Spanned text, int start,
+ int end) {
+- Boolean isInBulletList = null;
++ boolean isInList = false;
int next;
for (int i = start; i <= end; i = next) {
next = TextUtils.indexOf(text, '\n', i, end);
-@@ -412,42 +220,48 @@ public class Html {
+@@ -220,48 +220,42 @@ public class HtmlEx {
}
if (next == i) {
-- if (isInList) {
-+ if (isInBulletList != null) {
+- if (isInBulletList != null) {
++ if (isInList) {
// Current paragraph is no longer a list item; close the previously opened list
-- isInList = false;
-- out.append("\n");
-+ out.append(isInBulletList ? "\n" : "\n");
-+ isInBulletList = null;
+- out.append(isInBulletList ? "\n" : "\n");
+- isInBulletList = null;
++ isInList = false;
++ out.append("\n");
}
-- out.append("
\n");
-+ if (i != text.length())
-+ out.append("
\n");
+- if (i != text.length())
+- out.append("
\n");
++ out.append("
\n");
} else {
-- boolean isListItem = false;
-+ Boolean isBulletListItem = null;
+- Boolean isBulletListItem = null;
++ boolean isListItem = false;
ParagraphStyle[] paragraphStyles = text.getSpans(i, next, ParagraphStyle.class);
for (ParagraphStyle paragraphStyle : paragraphStyles) {
final int spanFlags = text.getSpanFlags(paragraphStyle);
if ((spanFlags & Spanned.SPAN_PARAGRAPH) == Spanned.SPAN_PARAGRAPH
&& paragraphStyle instanceof BulletSpan) {
-- isListItem = true;
-+ isBulletListItem = !(paragraphStyle instanceof eu.faircode.email.NumberSpan);
+- isBulletListItem = !(paragraphStyle instanceof eu.faircode.email.NumberSpan);
++ isListItem = true;
break;
}
}
-- if (isListItem && !isInList) {
-+ if (isBulletListItem != null && isInBulletList != null && isBulletListItem != isInBulletList) {
-+ out.append(isInBulletList ? "\n" : "\n");
-+ isInBulletList = null;
-+ }
-+
-+ if (isBulletListItem != null && isInBulletList == null) {
+- if (isBulletListItem != null && isInBulletList != null && isBulletListItem != isInBulletList) {
+- out.append(isInBulletList ? "\n" : "\n");
+- isInBulletList = null;
+- }
+-
+- if (isBulletListItem != null && isInBulletList == null) {
++ if (isListItem && !isInList) {
// Current paragraph is the first item in a list
-- isInList = true;
-- out.append("
");
-+ private /* static */ void withinBlockquoteConsecutive(StringBuilder out, Spanned text, int start,
-+ int end) {
-+ out.append("");
+- private /* static */ void withinBlockquoteConsecutive(StringBuilder out, Spanned text, int start,
++ private static void withinBlockquoteConsecutive(StringBuilder out, Spanned text, int start,
+ int end) {
+- out.append("");
++ out.append(" ");
int next;
for (int i = start; i < end; i = next) {
-@@ -486,24 +302,24 @@ public class Html {
+@@ -302,24 +294,24 @@ public class HtmlEx {
withinParagraph(out, text, i, next - nl);
-- if (nl == 1) {
-+ if (nl == 0) {
+- if (nl == 0) {
++ if (nl == 1) {
out.append(" ");
-+ out.append("
\n");
} else {
-- for (int j = 2; j < nl; j++) {
-+ for (int j = 0; j < nl; j++) {
+- for (int j = 0; j < nl; j++) {
++ for (int j = 2; j < nl; j++) {
out.append("
");
}
if (next != end) {
/* Paragraph should be closed and reopened */
-- out.append("
"); } } } -- out.append("
\n"); -+ out.append("\n"); +- out.append("\n"); ++ out.append("\n"); } -- private static void withinParagraph(StringBuilder out, Spanned text, int start, int end) { -+ private /* static */ void withinParagraph(StringBuilder out, Spanned text, int start, int end) { +- private /* static */ void withinParagraph(StringBuilder out, Spanned text, int start, int end) { ++ private static void withinParagraph(StringBuilder out, Spanned text, int start, int end) { int next; for (int i = start; i < end; i = next) { next = text.nextSpanTransition(i, end, CharacterStyle.class); -@@ -523,9 +339,11 @@ public class Html { +@@ -339,11 +331,9 @@ public class HtmlEx { if (style[j] instanceof TypefaceSpan) { String s = ((TypefaceSpan) style[j]).getFamily(); -- if ("monospace".equals(s)) { -- out.append(""); -- } -+ //if ("monospace".equals(s)) { -+ // out.append(""); -+ //} -+ -+ out.append(""); +- //if ("monospace".equals(s)) { +- // out.append(""); +- //} +- +- out.append(""); ++ if ("monospace".equals(s)) { ++ out.append(""); ++ } } if (style[j] instanceof SuperscriptSpan) { out.append(""); -@@ -556,8 +374,8 @@ public class Html { +@@ -374,8 +364,8 @@ public class HtmlEx { AbsoluteSizeSpan s = ((AbsoluteSizeSpan) style[j]); float sizeDip = s.getSize(); if (!s.getDip()) { -- Application application = ActivityThread.currentApplication(); -- sizeDip /= application.getResources().getDisplayMetrics().density; -+ //Application application = ActivityThread.currentApplication(); -+ sizeDip /= context.getResources().getDisplayMetrics().density; +- //Application application = ActivityThread.currentApplication(); +- sizeDip /= context.getResources().getDisplayMetrics().density; ++ Application application = ActivityThread.currentApplication(); ++ sizeDip /= application.getResources().getDisplayMetrics().density; } // px in CSS is the equivalance of dip in Android -@@ -609,11 +427,13 @@ public class Html { +@@ -427,13 +417,11 @@ public class HtmlEx { out.append(""); } if (style[j] instanceof TypefaceSpan) { -- String s = ((TypefaceSpan) style[j]).getFamily(); -+ //String s = ((TypefaceSpan) style[j]).getFamily(); +- //String s = ((TypefaceSpan) style[j]).getFamily(); +- +- //if (s.equals("monospace")) { +- // out.append(""); +- //} ++ String s = ((TypefaceSpan) style[j]).getFamily(); -- if (s.equals("monospace")) { -- out.append(""); -- } -+ //if (s.equals("monospace")) { -+ // out.append(""); -+ //} -+ -+ out.append(""); +- out.append(""); ++ if (s.equals("monospace")) { ++ out.append(""); ++ } } if (style[j] instanceof StyleSpan) { int s = ((StyleSpan) style[j]).getStyle(); -@@ -629,8 +449,8 @@ public class Html { +@@ -449,8 +437,8 @@ public class HtmlEx { } } -- @UnsupportedAppUsage -- private static void withinStyle(StringBuilder out, CharSequence text, -+ //@UnsupportedAppUsage -+ private /* static */ void withinStyle(StringBuilder out, CharSequence text, +- //@UnsupportedAppUsage +- private /* static */ void withinStyle(StringBuilder out, CharSequence text, ++ @UnsupportedAppUsage ++ private static void withinStyle(StringBuilder out, CharSequence text, int start, int end) { for (int i = start; i < end; i++) { char c = text.charAt(i); -@@ -665,668 +485,3 @@ public class Html { - } - } - } -- --class HtmlToSpannedConverter implements ContentHandler { -- -- private static final float[] HEADING_SIZES = { -- 1.5f, 1.4f, 1.3f, 1.2f, 1.1f, 1f, -- }; -- -- private String mSource; -- private XMLReader mReader; -- private SpannableStringBuilder mSpannableStringBuilder; -- private Html.ImageGetter mImageGetter; -- private Html.TagHandler mTagHandler; -- private int mFlags; -- -- private static Pattern sTextAlignPattern; -- private static Pattern sForegroundColorPattern; -- private static Pattern sBackgroundColorPattern; -- private static Pattern sTextDecorationPattern; -- -- /** -- * Name-value mapping of HTML/CSS colors which have different values in {@link Color}. -- */ -- private static final Map