Index: modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XGraphics2D.java =================================================================== --- modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XGraphics2D.java (revision 545729) +++ modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/XGraphics2D.java (working copy) @@ -82,7 +82,7 @@ blitter = XBlitter.getInstance(); Rectangle bounds = clip.getBounds(); dstSurf = new XSurface(this, bounds.width, bounds.height); - jtr = DrawableTextRenderer.inst; +// jtr = DrawableTextRenderer.inst; //setTransformedClip(clip); setClip(clip); Index: modules/awt/src/main/java/common/java/awt/Font.java =================================================================== --- modules/awt/src/main/java/common/java/awt/Font.java (revision 545729) +++ modules/awt/src/main/java/common/java/awt/Font.java (working copy) @@ -24,6 +24,7 @@ import java.awt.font.TransformAttribute; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; +import java.awt.peer.FontPeer; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; @@ -38,11 +39,12 @@ import java.util.Map; import java.util.StringTokenizer; -import java.awt.peer.FontPeer; - import org.apache.harmony.awt.gl.font.CommonGlyphVector; +import org.apache.harmony.awt.gl.font.FontManager; import org.apache.harmony.awt.gl.font.FontPeerImpl; +import org.apache.harmony.awt.gl.font.fontlib.FLFontManager; import org.apache.harmony.awt.internal.nls.Messages; +import org.apache.harmony.luni.util.NotImplementedException; import org.apache.harmony.misc.HashCode; @@ -245,8 +247,14 @@ if (!Character.isValidCodePoint(i)) { throw new IllegalArgumentException(); } - //TODO implement true code point support - return canDisplay((char)i); + + if (!FontManager.IS_FONTLIB) { + //TODO implement true code point support + return canDisplay((char)i); + } else { + FontPeerImpl peer = (FontPeerImpl)this.getPeer(); + return peer.canDisplay(peer.getUnicodeByIndex(i)); + } } public int canDisplayUpTo(char[] text, int start, int limit) { @@ -311,19 +319,25 @@ } public GlyphVector createGlyphVector(FontRenderContext frc, int[] glyphCodes) throws org.apache.harmony.luni.util.NotImplementedException { - // TODO : to find out, how to operate with glyphcodes - if (true) { - throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + if (!FontManager.IS_FONTLIB) { + // TODO : to find out, how to operate with glyphcodes + throw new NotImplementedException(); } - return null; + + int length = glyphCodes.length; + char[] chars = new char[length]; + FontPeerImpl peer = (FontPeerImpl) getPeer(); + + for (int i = 0; i < length; i ++) { + chars[i] = peer.getUnicodeByIndex(glyphCodes[i]); + } + + return new CommonGlyphVector(chars, frc, this, 0); } public GlyphVector createGlyphVector(FontRenderContext frc, String str) { - return new CommonGlyphVector(str.toCharArray(), frc, this, 0); - - } /** @@ -596,7 +610,7 @@ } - public String getFontName() { + public String getFontName() { FontPeerImpl peer = (FontPeerImpl)this.getPeer(); return peer.getFontName(); } @@ -608,6 +622,7 @@ public LineMetrics getLineMetrics(char[] chars, int start, int end, FontRenderContext frc) { + if (frc == null) { // awt.00=FontRenderContext is null throw new NullPointerException(Messages.getString("awt.00")); //$NON-NLS-1$ @@ -845,9 +860,14 @@ * @deprecated */ @Deprecated - public FontPeer getPeer() { + public FontPeer getPeer() { if (fontPeer == null){ - fontPeer = (FontPeerImpl)Toolkit.getDefaultToolkit().getGraphicsFactory().getFontPeer(this); + fontPeer = (FontPeerImpl) FontManager.getInstance().getFontPeer( + this.getName(), + this.getStyle(), + this.getSize() + ); + } return fontPeer; } @@ -936,11 +956,22 @@ public static Font createFont(int fontFormat, File fontFile) throws FontFormatException, IOException { - InputStream is = new FileInputStream(fontFile); - try { - return createFont(fontFormat, is); - } finally { - is.close(); + if (fontFile == null) throw new NullPointerException(); + + if (FontManager.IS_FONTLIB) { + if (fontFormat != TRUETYPE_FONT && fontFormat != TYPE1_FONT) { + // awt.9A=Unsupported font format + throw new IllegalArgumentException ( Messages.getString("awt.9A") ); //$NON-NLS-1$ + } + + return ((FLFontManager)FontManager.getInstance()).embedFont(fontFile.getAbsolutePath(), fontFormat); + } else { + InputStream is = new FileInputStream(fontFile); + try { + return createFont(fontFormat, is); + } finally { + is.close(); + } } } @@ -952,13 +983,14 @@ int size = 8192; // memory page size, for the faster reading byte buf[] = new byte[size]; - if (fontFormat != TRUETYPE_FONT) { + if (fontFormat != TRUETYPE_FONT && !FontManager.IS_FONTLIB) { // awt.9A=Unsupported font format throw new IllegalArgumentException ( Messages.getString("awt.9A") ); //$NON-NLS-1$ } /* Get font file in system-specific directory */ - File fontFile = Toolkit.getDefaultToolkit().getGraphicsFactory().getFontManager().getTempFontFile(); + File fontFile = FontManager.getInstance().getTempFontFile(); +// File fontFile = Toolkit.getDefaultToolkit().getGraphicsFactory().getFontManager().getTempFontFile(); buffStream = new BufferedInputStream ( fontStream ); @@ -975,8 +1007,12 @@ fOutStream.close(); Font font = null; - - font = Toolkit.getDefaultToolkit().getGraphicsFactory().embedFont(fontFile.getAbsolutePath()); + + if (FontManager.IS_FONTLIB) { + font = ((FLFontManager)FontManager.getInstance()).embedFont(fontFile.getAbsolutePath(), fontFormat); + } else { + font = Toolkit.getDefaultToolkit().getGraphicsFactory().embedFont(fontFile.getAbsolutePath()); + } if ( font == null ) { // awt.9B=Can't create font - bad font data throw new FontFormatException ( Messages.getString("awt.9B") ); //$NON-NLS-1$ @@ -986,3 +1022,4 @@ } + Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/CommonGraphics2D.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/CommonGraphics2D.java (revision 545729) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/CommonGraphics2D.java (working copy) @@ -58,6 +58,8 @@ import java.util.Map; import org.apache.harmony.awt.gl.Surface; +import org.apache.harmony.awt.gl.font.FontManager; +import org.apache.harmony.awt.gl.font.fontlib.FLTextRenderer; import org.apache.harmony.awt.gl.image.OffscreenImage; import org.apache.harmony.awt.gl.render.Blitter; import org.apache.harmony.awt.gl.render.JavaArcRasterizer; @@ -145,7 +147,10 @@ protected Font font = new Font("Dialog", Font.PLAIN, 12);; //$NON-NLS-1$ - protected TextRenderer jtr = JavaTextRenderer.inst; + protected TextRenderer jtr = + FontManager.IS_FONTLIB ? + FLTextRenderer.getInstance() : + JavaTextRenderer.inst; // Current graphics transform protected AffineTransform transform = new AffineTransform(); @@ -1129,4 +1134,4 @@ //copy.origTransform = new AffineTransform(origTransform); copy.origPoint = new Point(origPoint); } -} \ No newline at end of file +} Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/opengl/OGLGraphics2D.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/opengl/OGLGraphics2D.java (revision 545729) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/opengl/OGLGraphics2D.java (working copy) @@ -25,6 +25,7 @@ import org.apache.harmony.awt.gl.MultiRectArea; import org.apache.harmony.awt.gl.Utils; import org.apache.harmony.awt.gl.Surface; +import org.apache.harmony.awt.gl.font.FontManager; import org.apache.harmony.awt.gl.render.NullBlitter; import org.apache.harmony.awt.wtk.NativeWindow; import org.apache.harmony.awt.nativebridge.Int32Pointer; @@ -197,7 +198,9 @@ blitter = OGLBlitter.getInstance(); - jtr = new OGLTextRenderer(); + if (!FontManager.IS_FONTLIB) { + jtr = new OGLTextRenderer(); + } } public OGLGraphics2D(NativeWindow nwin, int tx, int ty, int width, int height) { Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/FontManager.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/FontManager.java (revision 545729) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/FontManager.java (working copy) @@ -21,6 +21,7 @@ package org.apache.harmony.awt.gl.font; import java.awt.Font; +import java.awt.GraphicsEnvironment; import java.awt.peer.FontPeer; import java.io.File; import java.io.FileInputStream; @@ -34,16 +35,20 @@ import java.util.Vector; import org.apache.harmony.awt.gl.CommonGraphics2DFactory; +import org.apache.harmony.awt.gl.font.fontlib.FLFontManager; public abstract class FontManager { + public static final boolean IS_FONTLIB = "true".equals(System.getProperty("java.awt.fontlib")) || + GraphicsEnvironment.isHeadless(); + /** * array of font families names */ public String[] allFamilies; - public static final String DEFAULT_NAME = "Default"; /* Default font name */ //$NON-NLS-1$ + public static final String DEFAULT_NAME = IS_FONTLIB ? "Luxi Sans" : "Default"; /* Default font name */ //$NON-NLS-1$ public static final String DIALOG_NAME = "Dialog"; /* Dialog font name */ //$NON-NLS-1$ /** @@ -197,13 +202,16 @@ public Hashtable> fProperties = new Hashtable>(); public FontManager(){ - allFamilies = getAllFamilies(); - /* - * Creating and registering shutdown hook to free resources - * before object is destroyed. - */ - DisposeNativeHook shutdownHook = new DisposeNativeHook(); - Runtime.getRuntime().addShutdownHook(shutdownHook); + + if (!IS_FONTLIB) { + allFamilies = getAllFamilies(); + /* + * Creating and registering shutdown hook to free resources + * before object is destroyed. + */ + DisposeNativeHook shutdownHook = new DisposeNativeHook(); + Runtime.getRuntime().addShutdownHook(shutdownHook); + } } /** @@ -214,7 +222,7 @@ /** * Locale - Language ID hash table. */ - Hashtable tableLCID = new Hashtable(); + protected Hashtable tableLCID = new Hashtable(); /** * Hash table that contains FontPeers instances. @@ -231,7 +239,10 @@ /** * Singleton instance */ - public final static FontManager inst = CommonGraphics2DFactory.inst.getFontManager(); + private static FontManager inst = + IS_FONTLIB ? + new FLFontManager() : + CommonGraphics2DFactory.inst.getFontManager(); /** @@ -305,7 +316,7 @@ * @param logicalIndex index of the logical face name in LOGICAL_FONT_FACES * array or -1 if desired font peer is not logical. */ - private FontPeer createFontPeer(String name, int style, int size, int logicalIndex){ + protected FontPeer createFontPeer(String name, int style, int size, int logicalIndex){ FontPeer peer; if (logicalIndex != -1){ peer = createLogicalFontPeer(name, style, size); @@ -765,7 +776,7 @@ * Class contains SoftReference instance that can be stored in the * Hashtable by means of key field corresponding to it. */ - private class HashMapReference extends SoftReference { + protected class HashMapReference extends SoftReference { /** * The key for Hashtable. @@ -810,3 +821,4 @@ } + Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/FontPeerImpl.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/FontPeerImpl.java (revision 545729) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/FontPeerImpl.java (working copy) @@ -21,12 +21,11 @@ package org.apache.harmony.awt.gl.font; +import java.awt.font.FontRenderContext; +import java.awt.font.LineMetrics; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.peer.FontPeer; - -import java.awt.font.FontRenderContext; -import java.awt.font.LineMetrics; import java.util.ArrayList; import java.util.Locale; @@ -53,16 +52,16 @@ float height; // the style of this font peer - int style; + protected int style; // the point size of this font peer (in pixels) - int size; + protected int size; // the logical hight of this font peer (in pixels) int logicalHeight; // the name of this font peer - String name; + protected String name; // family name of this font peer String fontFamilyName; @@ -71,7 +70,7 @@ String faceName; // bounds rectanlge of the largest character in this font peer - Rectangle2D maxCharBounds; + protected Rectangle2D maxCharBounds; // italic angle value of this font peer float italicAngle = 0.0f; @@ -80,13 +79,13 @@ int numGlyphs = 0; // native font handle - long pFont; + protected long pFont; // cached line metrics object - LineMetricsImpl nlm; + protected LineMetricsImpl nlm = null; // the postscript name of this font peer - String psName = null; + protected String psName = null; /** * Default glyph index, that is used, when the desired glyph @@ -402,6 +401,9 @@ * Returns cached LineMetrics object of this font peer. */ public LineMetrics getLineMetrics(){ + if (nlm == null) { + nlm = (LineMetricsImpl) getLineMetrics("", null, AffineTransform.getTranslateInstance(0,0)); + } return nlm; } @@ -459,6 +461,10 @@ fontType = newType; } } + + public char getUnicodeByIndex(int glyphCode) { + return 0; + } /** * Sets new font type to the font object. Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLOutline.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLOutline.java (revision 0) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLOutline.java (revision 0) @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.harmony.awt.gl.font.fontlib; + +public class FLOutline { + + byte[] commands; + float[] points; + + FLOutline() { + } + + public void setOutline(byte[] commands, float[] points) { + this.commands = commands; + this.points = points; + } + +} Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLFontManager.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLFontManager.java (revision 0) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLFontManager.java (revision 0) @@ -0,0 +1,529 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.harmony.awt.gl.font.fontlib; + +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.peer.FontPeer; +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Iterator; + +import org.apache.harmony.awt.gl.font.CompositeFont; +import org.apache.harmony.awt.gl.font.FontManager; +import org.apache.harmony.awt.gl.font.FontPeerImpl; +import org.apache.harmony.awt.internal.nls.Messages; + +public class FLFontManager extends FontManager { + + private ArrayList allFonts = new ArrayList(); + + static { + System.loadLibrary("FL"); + } + + public FLFontManager() { + + Runtime.getRuntime().addShutdownHook(new DisposeNativeHook()); + + initManager(); + + addPath(new File(System.getProperty("java.home") + "/lib/fonts/")); + addPath(new File("C:\\WINNT\\Fonts")); + addPath(new File("/usr/X11R6/lib/X11/fonts/Type1/")); + addPath(new File("/usr/X11R6/lib/X11/fonts/truetype/")); + + Font[] nativeFonts = getAllFontsNative(); + + if (nativeFonts != null) + for(int i = 0; i < nativeFonts.length; i ++) { + allFonts.add(nativeFonts[i]); + } + + allFamilies = getAllFamilies(); + } + + class FLFilenameFilter implements FilenameFilter { + + public boolean accept(File dir, String str) { + String suffix = str.substring(str.length() - 3).toLowerCase(); + return suffix.equals("pfb") || suffix.equals("pfa") || suffix.equals("ttf"); + } + + } + + FilenameFilter filter = new FLFilenameFilter(); + + private void addPath(File path){ + if (!path.canRead() || !path.isDirectory()) return; + + String[] strMas = path.list(filter); + + String dir = path.getAbsolutePath(); + + Font newFont; + + for (int i = 0; i < strMas.length; i++) { + String str = strMas[i].substring(strMas[i].length() - 3).toLowerCase(); + newFont = addFont(dir + "/" + strMas[i], str.equals("ttf") ? Font.TRUETYPE_FONT : Font.TYPE1_FONT); + + if (newFont != null) { + allFonts.add(newFont); + } + } + + allFamilies = getAllFamilies(); + } + + @Override + public FontPeer createPhysicalFontPeer(String name, int style, int size) { + FontPeerImpl peer = null; + + if (isFontExistInList(name, style)){ + try { + peer = new FLFontPeer(name, style, size); + + peer.setFamily(name); + } catch(NullPointerException e) { + peer = new FLFontPeer(DEFAULT_NAME, style, size); + + peer.setFamily(DEFAULT_NAME); + } + } else { + peer = new FLFontPeer(DEFAULT_NAME, style, size); + + peer.setFamily(DEFAULT_NAME); + } + + return peer; + } + + private boolean isFontExistInList(String name, int style) { + for (Font font : allFonts) { + if (font.getStyle() == style && font.getName().equals(name)) { + return true; + } + } + + return false; + } + + @Override + public FontPeer createDefaultFont(int style, int size) { + //return getFontPeer(DIALOG_NAME, style, size); + return createPhysicalFontPeer(DEFAULT_NAME, style, size); + } + + /** + * Initializes LCID table + */ + @Override + public void initLCIDTable(){ + + Hashtable ht = tableLCID; + + /* + * Language records with LCID values (0x04**). + */ + ht.put(new String("ar"), new Short((short)0x0401)); // ar-dz //$NON-NLS-1$ + ht.put(new String("bg"), new Short((short)0x0402)); //$NON-NLS-1$ + ht.put(new String("ca"), new Short((short)0x0403)); //$NON-NLS-1$ + ht.put(new String("zh"), new Short((short)0x0404)); // zh-tw //$NON-NLS-1$ + ht.put(new String("cs"), new Short((short)0x0405)); //$NON-NLS-1$ + ht.put(new String("da"), new Short((short)0x0406)); //$NON-NLS-1$ + ht.put(new String("de"), new Short((short)0x0407)); // de-de //$NON-NLS-1$ + ht.put(new String("el"), new Short((short)0x0408)); //$NON-NLS-1$ + ht.put(new String("fi"), new Short((short)0x040b)); //$NON-NLS-1$ + ht.put(new String("fr"), new Short((short)0x040c)); // fr-fr //$NON-NLS-1$ + ht.put(new String("iw"), new Short((short)0x040d)); // "he" //$NON-NLS-1$ + ht.put(new String("hu"), new Short((short)0x040e)); //$NON-NLS-1$ + ht.put(new String("is"), new Short((short)0x040f)); //$NON-NLS-1$ + ht.put(new String("it"), new Short((short)0x0410)); // it-it //$NON-NLS-1$ + ht.put(new String("ja"), new Short((short)0x0411)); //$NON-NLS-1$ + ht.put(new String("ko"), new Short((short)0x0412)); //$NON-NLS-1$ + ht.put(new String("nl"), new Short((short)0x0413)); // nl-nl //$NON-NLS-1$ + ht.put(new String("no"), new Short((short)0x0414)); // no_no //$NON-NLS-1$ + ht.put(new String("pl"), new Short((short)0x0415)); //$NON-NLS-1$ + ht.put(new String("pt"), new Short((short)0x0416)); // pt-br //$NON-NLS-1$ + ht.put(new String("rm"), new Short((short)0x0417)); //$NON-NLS-1$ + ht.put(new String("ro"), new Short((short)0x0418)); //$NON-NLS-1$ + ht.put(new String("ru"), new Short((short)0x0419)); //$NON-NLS-1$ + ht.put(new String("hr"), new Short((short)0x041a)); //$NON-NLS-1$ + ht.put(new String("sk"), new Short((short)0x041b)); //$NON-NLS-1$ + ht.put(new String("sq"), new Short((short)0x041c)); //$NON-NLS-1$ + ht.put(new String("sv"), new Short((short)0x041d)); // sv-se //$NON-NLS-1$ + ht.put(new String("th"), new Short((short)0x041e)); //$NON-NLS-1$ + ht.put(new String("tr"), new Short((short)0x041f)); //$NON-NLS-1$ + ht.put(new String("ur"), new Short((short)0x0420)); //$NON-NLS-1$ + ht.put(new String("in"), new Short((short)0x0421)); // "id" //$NON-NLS-1$ + ht.put(new String("uk"), new Short((short)0x0422)); //$NON-NLS-1$ + ht.put(new String("be"), new Short((short)0x0423)); //$NON-NLS-1$ + ht.put(new String("sl"), new Short((short)0x0424)); //$NON-NLS-1$ + ht.put(new String("et"), new Short((short)0x0425)); //$NON-NLS-1$ + ht.put(new String("lv"), new Short((short)0x0426)); //$NON-NLS-1$ + ht.put(new String("lt"), new Short((short)0x0427)); //$NON-NLS-1$ + ht.put(new String("fa"), new Short((short)0x0429)); //$NON-NLS-1$ + ht.put(new String("vi"), new Short((short)0x042a)); //$NON-NLS-1$ + ht.put(new String("hy"), new Short((short)0x042b)); //$NON-NLS-1$ + ht.put(new String("eu"), new Short((short)0x042d)); //$NON-NLS-1$ + ht.put(new String("sb"), new Short((short)0x042e)); //$NON-NLS-1$ + ht.put(new String("mk"), new Short((short)0x042f)); //$NON-NLS-1$ + ht.put(new String("sx"), new Short((short)0x0430)); //$NON-NLS-1$ + ht.put(new String("ts"), new Short((short)0x0431)); //$NON-NLS-1$ + ht.put(new String("tn"), new Short((short)0x0432)); //$NON-NLS-1$ + ht.put(new String("xh"), new Short((short)0x0434)); //$NON-NLS-1$ + ht.put(new String("zu"), new Short((short)0x0435)); //$NON-NLS-1$ + ht.put(new String("af"), new Short((short)0x0436)); //$NON-NLS-1$ + ht.put(new String("fo"), new Short((short)0x0438)); //$NON-NLS-1$ + ht.put(new String("hi"), new Short((short)0x0439)); //$NON-NLS-1$ + ht.put(new String("mt"), new Short((short)0x043a)); //$NON-NLS-1$ + ht.put(new String("gd"), new Short((short)0x043c)); //$NON-NLS-1$ + ht.put(new String("yi"), new Short((short)0x043d)); //$NON-NLS-1$ + ht.put(new String("sw"), new Short((short)0x0441)); //$NON-NLS-1$ + ht.put(new String("tt"), new Short((short)0x0444)); //$NON-NLS-1$ + ht.put(new String("ta"), new Short((short)0x0449)); //$NON-NLS-1$ + ht.put(new String("mr"), new Short((short)0x044e)); //$NON-NLS-1$ + ht.put(new String("sa"), new Short((short)0x044f)); //$NON-NLS-1$ + + /* + * Language-country records. + */ + ht.put(new String("ar_SA"), new Short((short)0x401)); //$NON-NLS-1$ + ht.put(new String("bg_BG"), new Short((short)0x402)); //$NON-NLS-1$ + ht.put(new String("ca_ES"), new Short((short)0x403)); //$NON-NLS-1$ + ht.put(new String("zh_TW"), new Short((short)0x404)); //$NON-NLS-1$ + ht.put(new String("cs_CZ"), new Short((short)0x405)); //$NON-NLS-1$ + ht.put(new String("da_DK"), new Short((short)0x406)); //$NON-NLS-1$ + ht.put(new String("de_DE"), new Short((short)0x407)); //$NON-NLS-1$ + ht.put(new String("el_GR"), new Short((short)0x408)); //$NON-NLS-1$ + ht.put(new String("en_US"), new Short((short)0x409)); //$NON-NLS-1$ + ht.put(new String("es_ES"), new Short((short)0x40a)); //$NON-NLS-1$ + ht.put(new String("fi_FI"), new Short((short)0x40b)); //$NON-NLS-1$ + ht.put(new String("fr_FR"), new Short((short)0x40c)); //$NON-NLS-1$ + ht.put(new String("he_IL"), new Short((short)0x40d)); //$NON-NLS-1$ + ht.put(new String("hu_HU"), new Short((short)0x40e)); //$NON-NLS-1$ + ht.put(new String("is_IS"), new Short((short)0x40f)); //$NON-NLS-1$ + ht.put(new String("it_IT"), new Short((short)0x410)); //$NON-NLS-1$ + ht.put(new String("ja_JP"), new Short((short)0x411)); //$NON-NLS-1$ + ht.put(new String("ko_KR"), new Short((short)0x412)); //$NON-NLS-1$ + ht.put(new String("nl_NL"), new Short((short)0x413)); //$NON-NLS-1$ + ht.put(new String("nb_NO"), new Short((short)0x414)); //$NON-NLS-1$ + ht.put(new String("pl_PL"), new Short((short)0x415)); //$NON-NLS-1$ + ht.put(new String("pt_BR"), new Short((short)0x416)); //$NON-NLS-1$ + ht.put(new String("ro_RO"), new Short((short)0x418)); //$NON-NLS-1$ + ht.put(new String("ru_RU"), new Short((short)0x419)); //$NON-NLS-1$ + ht.put(new String("hr_HR"), new Short((short)0x41a)); //$NON-NLS-1$ + ht.put(new String("sk_SK"), new Short((short)0x41b)); //$NON-NLS-1$ + ht.put(new String("sq_AL"), new Short((short)0x41c)); //$NON-NLS-1$ + ht.put(new String("sv_SE"), new Short((short)0x41d)); //$NON-NLS-1$ + ht.put(new String("th_TH"), new Short((short)0x41e)); //$NON-NLS-1$ + ht.put(new String("tr_TR"), new Short((short)0x41f)); //$NON-NLS-1$ + ht.put(new String("ur_PK"), new Short((short)0x420)); //$NON-NLS-1$ + ht.put(new String("id_ID"), new Short((short)0x421)); //$NON-NLS-1$ + ht.put(new String("uk_UA"), new Short((short)0x422)); //$NON-NLS-1$ + ht.put(new String("be_BY"), new Short((short)0x423)); //$NON-NLS-1$ + ht.put(new String("sl_SI"), new Short((short)0x424)); //$NON-NLS-1$ + ht.put(new String("et_EE"), new Short((short)0x425)); //$NON-NLS-1$ + ht.put(new String("lv_LV"), new Short((short)0x426)); //$NON-NLS-1$ + ht.put(new String("lt_LT"), new Short((short)0x427)); //$NON-NLS-1$ + ht.put(new String("fa_IR"), new Short((short)0x429)); //$NON-NLS-1$ + ht.put(new String("vi_VN"), new Short((short)0x42a)); //$NON-NLS-1$ + ht.put(new String("hy_AM"), new Short((short)0x42b)); //$NON-NLS-1$ + ht.put(new String("az_AZ"), new Short((short)0x42c)); //$NON-NLS-1$ + ht.put(new String("eu_ES"), new Short((short)0x42d)); //$NON-NLS-1$ + ht.put(new String("mk_MK"), new Short((short)0x42f)); //$NON-NLS-1$ + ht.put(new String("af_ZA"), new Short((short)0x436)); //$NON-NLS-1$ + ht.put(new String("ka_GE"), new Short((short)0x437)); //$NON-NLS-1$ + ht.put(new String("fo_FO"), new Short((short)0x438)); //$NON-NLS-1$ + ht.put(new String("hi_IN"), new Short((short)0x439)); //$NON-NLS-1$ + ht.put(new String("ms_MY"), new Short((short)0x43e)); //$NON-NLS-1$ + ht.put(new String("kk_KZ"), new Short((short)0x43f)); //$NON-NLS-1$ + ht.put(new String("ky_KG"), new Short((short)0x440)); //$NON-NLS-1$ + ht.put(new String("sw_KE"), new Short((short)0x441)); //$NON-NLS-1$ + ht.put(new String("uz_UZ"), new Short((short)0x443)); //$NON-NLS-1$ + ht.put(new String("tt_TA"), new Short((short)0x444)); //$NON-NLS-1$ + ht.put(new String("pa_IN"), new Short((short)0x446)); //$NON-NLS-1$ + ht.put(new String("gu_IN"), new Short((short)0x447)); //$NON-NLS-1$ + ht.put(new String("ta_IN"), new Short((short)0x449)); //$NON-NLS-1$ + ht.put(new String("te_IN"), new Short((short)0x44a)); //$NON-NLS-1$ + ht.put(new String("kn_IN"), new Short((short)0x44b)); //$NON-NLS-1$ + ht.put(new String("mr_IN"), new Short((short)0x44e)); //$NON-NLS-1$ + ht.put(new String("sa_IN"), new Short((short)0x44f)); //$NON-NLS-1$ + ht.put(new String("mn_MN"), new Short((short)0x450)); //$NON-NLS-1$ + ht.put(new String("gl_ES"), new Short((short)0x456)); //$NON-NLS-1$ + ht.put(new String("ko_IN"), new Short((short)0x457)); //$NON-NLS-1$ + ht.put(new String("sy_SY"), new Short((short)0x45a)); //$NON-NLS-1$ + ht.put(new String("di_MV"), new Short((short)0x465)); //$NON-NLS-1$ + ht.put(new String("ar_IQ"), new Short((short)0x801)); //$NON-NLS-1$ + ht.put(new String("zh_CN"), new Short((short)0x804)); //$NON-NLS-1$ + ht.put(new String("de_CH"), new Short((short)0x807)); //$NON-NLS-1$ + ht.put(new String("en_GB"), new Short((short)0x809)); //$NON-NLS-1$ + ht.put(new String("es_MX"), new Short((short)0x80a)); //$NON-NLS-1$ + ht.put(new String("fr_BE"), new Short((short)0x80c)); //$NON-NLS-1$ + ht.put(new String("it_CH"), new Short((short)0x810)); //$NON-NLS-1$ + ht.put(new String("nl_BE"), new Short((short)0x813)); //$NON-NLS-1$ + ht.put(new String("nn_NO"), new Short((short)0x814)); //$NON-NLS-1$ + ht.put(new String("pt_PT"), new Short((short)0x816)); //$NON-NLS-1$ + ht.put(new String("sr_SP"), new Short((short)0x81a)); //$NON-NLS-1$ + ht.put(new String("sv_FI"), new Short((short)0x81d)); //$NON-NLS-1$ + ht.put(new String("az_AZ"), new Short((short)0x82c)); //$NON-NLS-1$ + ht.put(new String("ms_BN"), new Short((short)0x83e)); //$NON-NLS-1$ + ht.put(new String("uz_UZ"), new Short((short)0x843)); //$NON-NLS-1$ + ht.put(new String("ar_EG"), new Short((short)0xc01)); //$NON-NLS-1$ + ht.put(new String("zh_HK"), new Short((short)0xc04)); //$NON-NLS-1$ + ht.put(new String("de_AT"), new Short((short)0xc07)); //$NON-NLS-1$ + ht.put(new String("en_AU"), new Short((short)0xc09)); //$NON-NLS-1$ + ht.put(new String("es_ES"), new Short((short)0xc0a)); //$NON-NLS-1$ + ht.put(new String("fr_CA"), new Short((short)0xc0c)); //$NON-NLS-1$ + ht.put(new String("sr_SP"), new Short((short)0xc1a)); //$NON-NLS-1$ + ht.put(new String("ar_LY"), new Short((short)0x1001)); //$NON-NLS-1$ + ht.put(new String("zh_SG"), new Short((short)0x1004)); //$NON-NLS-1$ + ht.put(new String("de_LU"), new Short((short)0x1007)); //$NON-NLS-1$ + ht.put(new String("en_CA"), new Short((short)0x1009)); //$NON-NLS-1$ + ht.put(new String("es_GT"), new Short((short)0x100a)); //$NON-NLS-1$ + ht.put(new String("fr_CH"), new Short((short)0x100c)); //$NON-NLS-1$ + ht.put(new String("ar_DZ"), new Short((short)0x1401)); //$NON-NLS-1$ + ht.put(new String("zh_MO"), new Short((short)0x1404)); //$NON-NLS-1$ + ht.put(new String("de_LI"), new Short((short)0x1407)); //$NON-NLS-1$ + ht.put(new String("en_NZ"), new Short((short)0x1409)); //$NON-NLS-1$ + ht.put(new String("es_CR"), new Short((short)0x140a)); //$NON-NLS-1$ + ht.put(new String("fr_LU"), new Short((short)0x140c)); //$NON-NLS-1$ + ht.put(new String("ar_MA"), new Short((short)0x1801)); //$NON-NLS-1$ + ht.put(new String("en_IE"), new Short((short)0x1809)); //$NON-NLS-1$ + ht.put(new String("es_PA"), new Short((short)0x180a)); //$NON-NLS-1$ + ht.put(new String("fr_MC"), new Short((short)0x180c)); //$NON-NLS-1$ + ht.put(new String("ar_TN"), new Short((short)0x1c01)); //$NON-NLS-1$ + ht.put(new String("en_ZA"), new Short((short)0x1c09)); //$NON-NLS-1$ + ht.put(new String("es_DO"), new Short((short)0x1c0a)); //$NON-NLS-1$ + ht.put(new String("ar_OM"), new Short((short)0x2001)); //$NON-NLS-1$ + ht.put(new String("en_JM"), new Short((short)0x2009)); //$NON-NLS-1$ + ht.put(new String("es_VE"), new Short((short)0x200a)); //$NON-NLS-1$ + ht.put(new String("ar_YE"), new Short((short)0x2401)); //$NON-NLS-1$ + ht.put(new String("en_CB"), new Short((short)0x2409)); //$NON-NLS-1$ + ht.put(new String("es_CO"), new Short((short)0x240a)); //$NON-NLS-1$ + ht.put(new String("ar_SY"), new Short((short)0x2801)); //$NON-NLS-1$ + ht.put(new String("en_BZ"), new Short((short)0x2809)); //$NON-NLS-1$ + ht.put(new String("es_PE"), new Short((short)0x280a)); //$NON-NLS-1$ + ht.put(new String("ar_JO"), new Short((short)0x2c01)); //$NON-NLS-1$ + ht.put(new String("en_TT"), new Short((short)0x2c09)); //$NON-NLS-1$ + ht.put(new String("es_AR"), new Short((short)0x2c0a)); //$NON-NLS-1$ + ht.put(new String("ar_LB"), new Short((short)0x3001)); //$NON-NLS-1$ + ht.put(new String("en_ZW"), new Short((short)0x3009)); //$NON-NLS-1$ + ht.put(new String("es_EC"), new Short((short)0x300a)); //$NON-NLS-1$ + ht.put(new String("ar_KW"), new Short((short)0x3401)); //$NON-NLS-1$ + ht.put(new String("en_PH"), new Short((short)0x3409)); //$NON-NLS-1$ + ht.put(new String("es_CL"), new Short((short)0x340a)); //$NON-NLS-1$ + ht.put(new String("ar_AE"), new Short((short)0x3801)); //$NON-NLS-1$ + ht.put(new String("es_UY"), new Short((short)0x380a)); //$NON-NLS-1$ + ht.put(new String("ar_BH"), new Short((short)0x3c01)); //$NON-NLS-1$ + ht.put(new String("es_PY"), new Short((short)0x3c0a)); //$NON-NLS-1$ + ht.put(new String("ar_QA"), new Short((short)0x4001)); //$NON-NLS-1$ + ht.put(new String("es_BO"), new Short((short)0x400a)); //$NON-NLS-1$ + ht.put(new String("es_SV"), new Short((short)0x440a)); //$NON-NLS-1$ + ht.put(new String("es_HN"), new Short((short)0x480a)); //$NON-NLS-1$ + ht.put(new String("es_NI"), new Short((short)0x4c0a)); //$NON-NLS-1$ + ht.put(new String("es_PR"), new Short((short)0x500a)); //$NON-NLS-1$ + } + + + @Override + public String[] getAllFamilies() { + if (allFamilies != null) { + return allFamilies; + } + if (allFonts == null) { + return null; + } + + ArrayList al = new ArrayList(); + String str; + + for (Font font : allFonts) { + str = font.getName(); + if (!al.contains(str)) { + al.add(str); + } + } + + allFamilies = new String[al.size()]; + al.toArray(allFamilies); + +// if (allFamilies != null) +// for (int i = 0; i < allFamilies.length; i ++) { +// System.out.println(allFamilies[i]); +// } + + return allFamilies; + } + + @Override + public Font[] getAllFonts() { + return allFonts.toArray(new Font[0]); + } + + public Font embedFont(String path, int type) throws FontFormatException, IOException { + Font newFont = addFont(path, type); + + if (newFont == null) { + if ((new File(path)).canRead()) { + //awt.9B=Can't create font - bad font data + throw new FontFormatException ( Messages.getString("awt.9B") ); //$NON-NLS-1$ + } else { + throw new IOException(); + } + } + + allFonts.add(newFont); + + allFamilies = getAllFamilies(); + + return newFont; + } + + private native Font addFont(String path, int type); + + private native void initManager(); + + private native Font[] getAllFontsNative(); + + private native void dispose(); + + /** + * Returns platform-dependent Font peer created from the specified + * Font object from the table with cached FontPeers instances. + * + * Note, this method checks whether FontPeer with specified parameters + * exists in the table with cached FontPeers' instances. If there is no needed + * instance - it is created and cached. + * + * @param fontName name of the font + * @param _fontStyle style of the font + * @param size font size + * + * @return platform dependent FontPeer implementation created from + * the specified parameters + */ + public FontPeer getFontPeer(String fontName, int _fontStyle, int size) { + + //updateFontsTable(); + + FontPeer peer = null; + String key; + String name; + int fontStyle = _fontStyle; + + int logicalIndex = getLogicalFaceIndex(fontName); + + if (logicalIndex != -1){ + name = getLogicalFaceFromFont(fontStyle, logicalIndex); + fontStyle = getStyleFromLogicalFace(name); + key = name.concat(String.valueOf(size)); + } else { + name = fontName; + key = name.concat(String.valueOf(fontStyle)). + concat(String.valueOf(size)); + } + + HashMapReference hmr = fontsTable.get(key); + if (hmr != null) { + peer = hmr.get(); + } + + if (peer == null) { + peer = createFontPeer(name, fontStyle, size, logicalIndex); + if (peer == null){ + peer = getFontPeer(DIALOG_NAME, fontStyle, size); + } else if (logicalIndex == -1) { + fontsTable.put(key, new HashMapReference(key, peer, queue)); + } + } + + return peer; + } + + /** + * Returns default font peer class with "Default" name that is usually + * used when font with specified font names and style doesn't exsist + * on a system. + * + * @param style style of the font + * @param size size of the font + */ + public FontPeer getDefaultFont(int style, int size){ + + FontPeer peer = null; + String key = DEFAULT_NAME.concat(String.valueOf(style)). + concat(String.valueOf(size)); + + HashMapReference hmr = fontsTable.get(key); + if (hmr != null) { + peer = hmr.get(); + } + + if (peer == null) { + peer = createDefaultFont(style, size); + + ((FontPeerImpl)peer).setFamily(DEFAULT_NAME); + ((FontPeerImpl)peer).setPSName(DEFAULT_NAME); + ((FontPeerImpl)peer).setFontName(DEFAULT_NAME); + + fontsTable.put(key, new HashMapReference(key, peer, queue)); + } + + return peer; + } + + public void removeFontFromHash(FontPeerImpl font) { + fontsTable.remove(font.getName().concat(String.valueOf(font.getStyle())).concat(String.valueOf(font.getSize()))); + } + + /** + * Freeing native resources. This hook is used to avoid + * sudden application exit and to free resources created in native code. + */ + private class DisposeNativeHook extends Thread { + + @Override + public void run() { + try{ + /* Disposing native font peer's resources */ + Enumeration kEnum = fontsTable.keys(); + + while(kEnum.hasMoreElements()){ + Object key = kEnum.nextElement(); + HashMapReference hmr = fontsTable.get(key); + FontPeerImpl delPeer = (FontPeerImpl)hmr.get(); + + if ((delPeer != null) && (delPeer.getClass() != CompositeFont.class)){ + // there's nothing to dispose in CompositeFont objects + + delPeer.dispose(); + } + } + + dispose(); + + } catch (Throwable t){ + throw new RuntimeException(t); + } + } + } +} Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLFontPeer.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLFontPeer.java (revision 0) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLFontPeer.java (revision 0) @@ -0,0 +1,309 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.harmony.awt.gl.font.fontlib; + +import java.awt.font.FontRenderContext; +import java.awt.font.LineMetrics; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.util.Hashtable; + +import org.apache.harmony.awt.gl.font.FontExtraMetrics; +import org.apache.harmony.awt.gl.font.FontManager; +import org.apache.harmony.awt.gl.font.FontPeerImpl; +import org.apache.harmony.awt.gl.font.Glyph; +import org.apache.harmony.awt.gl.font.LineMetricsImpl; + +final public class FLFontPeer extends FontPeerImpl { + private static final boolean USE_CONSTANT_METRICS = false; + private static final Hashtable handlersTable = new Hashtable(); + private static final Hashtable glyphTable = new Hashtable(); + + private static long getHandler(String name, int style) { + String hash = name.concat(String.valueOf(style)); + + FontPeerNativeHandler handl = handlersTable.get(hash); + + if (handl == null) { + handl = new FontPeerNativeHandler(name, style); + + handlersTable.put(hash, handl); + } + + handl.incriment(); + + return handl.getHandl(); + } + + private static void releaseHandler(String name, int style) { + handlersTable.get(name.concat(String.valueOf(style))).decriment(); + } + + private static final class FontPeerNativeHandler { + private long pFont; + private char count = 0; + private String name; + private int style; + + FontPeerNativeHandler(String name, int style) { + this.name = name; + this.style = style; + } + + void incriment(){ + if (count == 0) { + pFont = initFLFontPeer(name, style); + + //System.out.println("pFont = " + pFont + "name = " + name + ", style = " + style); + } + + if (pFont == 0) { + throw new NullPointerException(); + } + + count ++; + } + + void decriment(){ + count --; + + if (count == 0) { + //System.out.println("native dispose " + pFont); + + dispose(pFont); + } + } + + long getHandl() { + return pFont; + } + + } + private int missingGlyphCode = -1; + + private Glyph defGlyph; + + public FLFontPeer(String name, int style, int size) { + super(); +// if (true) throw new NullPointerException(); + this.size = size; + this.style = style; + this.name = name; + + pFont = getHandler(name, style); + + getLineMetrics(); + + /* if (pFont != 0){ + this.numGlyphs = LinuxNativeFont.getNumGlyphsNative(pFont); + this.italicAngle = LinuxNativeFont.getItalicAngleNative(pFont, this.fontType); + } + + this.nlm = new LinuxLineMetrics(this, null, " "); //$NON-NLS-1$ + + this.ascent = nlm.getLogicalAscent(); + this.descent = nlm.getLogicalDescent(); + this.height = nlm.getHeight(); + this.leading = nlm.getLogicalLeading(); + this.maxAdvance = nlm.getLogicalMaxCharWidth(); + + if (this.fontType == FontManager.FONT_TYPE_T1){ + this.defaultChar = 1; + } else { + this.defaultChar = 0; + } + + this.maxCharBounds = new Rectangle2D.Float(0, -nlm.getAscent(), nlm.getMaxCharWidth(), this.height); + +*/ + + maxCharBounds = new Rectangle2D.Float(0, -nlm.getAscent(), nlm.getMaxCharWidth(), nlm.getHeight()); + + //if (pFont == 0) throw new NullPointerException(); + + //System.out.println("create font size " + size + " style " + style + " name " + name + " pFont " + pFont); + } + + @Override + public FontExtraMetrics getExtraMetrics() { + // TODO Auto-generated method stub + return null; + } + + @Override + public LineMetrics getLineMetrics(String str, FontRenderContext frc, AffineTransform at) { + /* + * metrics[0] - ascent

+ * metrics[1] - descent

+ * metrics[2] - external leading

+ * metrics[3] - underline thickness

+ * -metrics[4] - underline offset

+ * metrics[5] - strikethrough thickness

+ * -metrics[6] - strikethrough offset

+ * metrics[7] - maximum char width

*/ + + + /*System.out.println("LineMetrics length " + metrics.length + " Font " + pFont); + for (int i = 0; i < metrics.length; i ++) { + System.out.println(metrics[i]); + }//*/ + + /** + * Creates LineMetricsImpl object from specified parameters. If baseline data parameter + * is null than {0, (-ascent+descent)/2, -ascent} values are used for baseline offsets. + * + * @param _numChars number of chars + * @param _baseLineIndex index of the baseline offset + * @param _baselineOffsets an array of baseline offsets + * @param _underlineThickness underline thickness + * @param _underlineOffset underline offset + * @param _strikethroughThickness strikethrough thickness + * @param _strikethroughOffset strinkethrough offset + * @param _leading leading of the font + * @param _height font height + * @param _ascent ascent of the font + * @param _descent descent of the font + * @param _maxCharWidth max char width + * + public LineMetricsImpl(int _numChars, int _baseLineIndex, + float[] _baselineOffsets, float _underlineThickness, + float _underlineOffset, float _strikethroughThickness, + float _strikethroughOffset, float _leading, float _height, + float _ascent, float _descent, float _maxCharWidth) {*/ + +// System.out.println("LineMetricsImpl"); + + + LineMetricsImpl lm; + if (USE_CONSTANT_METRICS) { + float height = size; + float ascent = canDisplay('H') ? + getGlyph('H').getHeight() : + (height *3) /4; + float descent = canDisplay('p') ? + (float) getGlyph('p').getGlyphMetrics().getBounds2D().getMaxY() : + height / 4; + + lm = new LineMetricsImpl( + str.length(), //_numChars number of chars + 0, //_baseLineIndex index of the baseline offset + new float[]{0, (-ascent+descent)/2, -ascent}, //_baselineOffsets an array of baseline offsets + ascent/13, //_underlineThickness underline thickness + -descent/2, //_underlineOffset underline offset + ascent/13, //_strikethroughThickness strikethrough thickness + ascent/2, //_strikethroughOffset strinkethrough offset + height - ascent- descent, //_leading leading of the font + height, //_height font height + ascent, //_ascent ascent of the font + descent, //_descent descent of the font + canDisplay('W') ? getGlyph('W').getWidth() : getGlyph(' ').getWidth()); //_maxCharWidth max char width + + } else { + float[] metrics = getLineMetrics(pFont); + lm = new LineMetricsImpl( + str.length(), //_numChars number of chars + 0, //_baseLineIndex index of the baseline offset + new float[]{0, (-metrics[0]+metrics[1])*size/2, -metrics[0]*size}, //_baselineOffsets an array of baseline offsets + metrics[3]*size, //_underlineThickness underline thickness + metrics[4]*size, //_underlineOffset underline offset + metrics[5]*size, //_strikethroughThickness strikethrough thickness + metrics[6]*size, //_strikethroughOffset strinkethrough offset + metrics[2]*size, //_leading leading of the font + (metrics[0] + metrics[1] + metrics[2])*size, //_height font height + metrics[0]*size, //_ascent ascent of the font + metrics[1]*size, //_descent descent of the font + metrics[7]*size); //_maxCharWidth max char width + } + + + + if ((at != null) && (!at.isIdentity())){ + lm.scale((float)at.getScaleX(), (float)at.getScaleY()); + } + + return lm; + } + + @Override + public String getPSName() { + psName = getPSName(pFont); + return psName; + } + + @Override + public int getMissingGlyphCode() { + if (missingGlyphCode == -1) { + missingGlyphCode = getMissingGlyphCode(pFont); + } + return missingGlyphCode; + } + + @Override + public Glyph getGlyph(char ch) { + Integer id = new Integer((size << 8) + ch); + + if (!glyphTable.containsKey(id)) { + //System.out.println("size = " + size + ", char " + ch + ", id = " + id); + glyphTable.put(id, new FLGlyph(ch, pFont, size)); + } + + return glyphTable.get(id); + } + + @Override + public void dispose() { + ((FLFontManager) FontManager.getInstance()).removeFontFromHash(this); + + //System.out.println("dispose " + pFont); + + releaseHandler(name, style); + + //dispose(pFont); + } + + @Override + public Glyph getDefaultGlyph() { + if (defGlyph == null) { + defGlyph = getGlyph((char)0); + } + return defGlyph; + } + + @Override + public boolean canDisplay(char c) { + return canDisplay(c, pFont); + } + + @Override + public char getUnicodeByIndex(int glyphCode) { + return getUnicodeByIndex(glyphCode, pFont); + } + + private static native long initFLFontPeer(String family, int style); + + private static native float[] getLineMetrics(long fontPeerPointer); + + private static native String getPSName(long fontPeerPointer); + + private static native int getMissingGlyphCode(long fontPeerPointer); + + private static native void dispose(long fontPeerPointer); + + private static native boolean canDisplay(char c, long fontPeerPointer); + + private static native char getUnicodeByIndex(int glyphCode, long fontPeerPointer); +} Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLGlyph.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLGlyph.java (revision 0) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLGlyph.java (revision 0) @@ -0,0 +1,135 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.harmony.awt.gl.font.fontlib; + +import java.awt.Shape; +import java.awt.font.GlyphMetrics; + +import org.apache.harmony.awt.gl.font.Glyph; + +final public class FLGlyph extends Glyph { + + private long glyphPointer; + +// private static final JavaShapeRasterizer jsr = new JavaShapeRasterizer(); + + //this.glMetrics = new GlyphMetrics((float)Math.ceil(metrics[2]), rect, (byte)0); + /* + values[0] = - extents.x ; // Glyph Pixels Bounds : X + values[1] = extents.y ; // Glyph Pixels Bounds : Y + values[2] = extents.xOff; // Pixels AdvanceX + values[3] = extents.yOff; // Pixels AdvanceY ?= Ascent+Descent + values[4] = acbox.xMax-acbox.xMin; // Glyph Pixels Bounds : width + values[5] = acbox.yMax-acbox.yMin; // Glyph Pixels Bounds : height + */ + + FLGlyph(char c, long fontPeerPointer, int size) { +// System.out.println("create glyph char " + (new Integer(c)).intValue() + " " + c + " size " + size + " pfont " + fontPeerPointer); + + glChar = c; + glyphPointer = initGlyph(c, size, fontPeerPointer); + } + + @Override + public byte[] getBitmap() { + /*MultiRectArea mra = jsr.rasterize(initOutline(), 0.5); + + Rectangle rec = mra.getBounds(); + int w = rec.width; + int h = rec.height; + + System.out.println(" " + w + " " + h); + if(w <= 0 || h <= 0) { + return null; + } + + BufferedImage bim = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + + ((Graphics2D)bim.getGraphics()).draw(mra); + +// bim.getRaster(). + + + int dbufferLenght = w * h; + + DataBufferByte dbuffer = new DataBufferByte(dbufferLenght); + + WritableRaster scanRaster = Raster.createInterleavedRaster(dbuffer, w, h, w, 1,new int[]{0}, null); + + /*WritableRaster scanRaster = Raster.createPackedRaster( + dbuffer, + (dbufferLenght / h) << 3, + h, + 1, + null + );* + + scanRaster.setRect(bim.getRaster());*/ + +// return dbuffer.getData(); + + return null; + } + + public Shape initOutline() { + if (glOutline == null) { + FLPath path = new FLPath(glyphPointer); + glOutline = path.getShape(); + } + + return glOutline; + } + + @Override + public Shape initOutline(char arg0) { + return initOutline(); + } + + public GlyphMetrics getGlyphMetrics(){ + if (glMetrics == null) { + //System.out.println("getGlyphMetrics"); + float[] metrics = getGlyphMetrics(glyphPointer); + +// System.out.println("x = " + metrics[0] + ", y = " + metrics[1]); +// System.out.println("after x = " + Math.round(metrics[0]) + ", y = " + Math.round(metrics[1])); + + this.glMetrics = new GlyphMetrics( + true, + Math.round(metrics[0]),//metrics[0], + Math.round(metrics[1]),//metrics[1], + //new Rectangle2D.Double(initOutline().getBounds2D().getMinX(), initOutline().getBounds2D().getMinY(), initOutline().getBounds2D().getMaxX() + 5, initOutline().getBounds2D().getMaxY()), + initOutline().getBounds2D(),//new Rectangle2D.Float(metrics[2], -metrics[5]-1,metrics[4]- metrics[2] + 1, metrics[5] - metrics[3] + 1), + GlyphMetrics.STANDARD); + + /*System.out.println("GlyphMetrics length " + metrics.length + " glyph " + new Integer(glChar)); + for (int i = 0; i < metrics.length; i ++) { + System.out.println(metrics[i]); + }*/ + } + + return glMetrics; + } + + public GlyphMetrics getGlyphPointMetrics(){ + //System.out.println("getGlyphPointMetrics"); + return glPointMetrics = getGlyphMetrics(); + } + + private native float[] getGlyphMetrics(long glyphPointer); + + private native long initGlyph(char c, int size, long fontPeerPointer); +} Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLTextRenderer.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLTextRenderer.java (revision 0) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLTextRenderer.java (revision 0) @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.harmony.awt.gl.font.fontlib; + +import java.awt.Graphics2D; +import java.awt.font.GlyphVector; + +import org.apache.harmony.awt.gl.TextRenderer; + +public class FLTextRenderer extends TextRenderer { + + private static final FLTextRenderer inst = new FLTextRenderer(); + + public static FLTextRenderer getInstance() { + return inst; + } + + /* (non-Javadoc) + * @see org.apache.harmony.awt.gl.TextRenderer#drawString(java.awt.Graphics2D, java.lang.String, float, float) + */ + @Override + public void drawString(Graphics2D g2d, String str, float x, float y) { + g2d.fill(g2d.getFont().createGlyphVector(g2d.getFontRenderContext(), str).getOutline(x, y)); + } + + /* (non-Javadoc) + * @see org.apache.harmony.awt.gl.TextRenderer#drawGlyphVector(java.awt.Graphics2D, java.awt.font.GlyphVector, float, float) + */ + @Override + public void drawGlyphVector(Graphics2D g2d, GlyphVector gv, float x, float y) { + g2d.fill(gv.getOutline(x,y)); + } + +} Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLPath.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLPath.java (revision 0) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/fontlib/FLPath.java (revision 0) @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.harmony.awt.gl.font.fontlib; + +import java.awt.Shape; +import java.awt.geom.GeneralPath; +import java.awt.geom.PathIterator; +import java.util.NoSuchElementException; + +import org.apache.harmony.awt.internal.nls.Messages; + +final public class FLPath implements PathIterator { + + /** + * The space amount in points buffer for different segmenet's types + */ + /*private static int pointShift[] = { + 0, // CLOSE + 2, // LINETO + 2, // MOVETO + 6, // CUBICTO + 4}; // QUADTO*/ + + //General path + static int pointShift[] = { + 2, // MOVETO + 2, // LINETO + 4, // QUADTO + 6, // CUBICTO + 0}; // CLOSE + + + + /** + * The current cursor position in types buffer + */ + int commandsIndex; + + /** + * The current cursor position in points buffer + */ + int pointIndex = 0; + + private int size; + + private final FLOutline outline = new FLOutline(); + + FLPath(long glyphPointer) { + getShape(outline, glyphPointer); + + size = outline.commands.length; + } + + public int getWindingRule() { + return PathIterator.WIND_EVEN_ODD; + } + + public boolean isDone() { + return commandsIndex >= size; + } + + public void next() { + commandsIndex++; + } + + public int currentSegment(double[] coords) { + if (isDone()) { + // awt.4B=Iterator out of bounds + throw new NoSuchElementException(Messages.getString("awt.4B")); //$NON-NLS-1$ + } + int type = outline.commands[commandsIndex]; + int count = pointShift[type]; + for (int i = 0; i < count; i++) { + coords[i] = outline.points[pointIndex + i]; + } + pointIndex += count; + return type; + } + + public int currentSegment(float[] coords) { + if (isDone()) { + // awt.4B=Iterator out of bounds + throw new NoSuchElementException(Messages.getString("awt.4B")); //$NON-NLS-1$ + } + + int type = outline.commands[commandsIndex]; + int count = pointShift[type]; + + System.arraycopy(outline.points, pointIndex, coords, 0, count); + pointIndex += count; + return type; + } + + Shape getShape() { + GeneralPath gp = new GeneralPath(); + + gp.append(this, false); + + return gp; + } + + private native void getShape(FLOutline outline, long glyphPointer); +} Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/FontMetricsImpl.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/FontMetricsImpl.java (revision 545729) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/FontMetricsImpl.java (working copy) @@ -84,7 +84,7 @@ this.maxAscent = ascent; this.maxDescent = descent; this.maxAdvance = lm.getLogicalMaxCharWidth(); - initWidths(); +// initWidths(); } /** @@ -134,9 +134,9 @@ */ @Override public int charWidth(int ch) { - if (ch < 256){ - return widths[ch]; - } +// if (ch < 256){ +// return widths[ch]; +// } return getFontPeer().charWidth((char)ch); } @@ -151,9 +151,9 @@ */ @Override public int charWidth(char ch) { - if (ch < 256){ - return widths[ch]; - } +// if (ch < 256){ +// return widths[ch]; +// } return (int)(getFontPeer().charWidth(ch)*scaleX); } @@ -202,6 +202,10 @@ */ @Override public int[] getWidths() { + this.widths = new int[256]; + for (int chr=0; chr < 256; chr++){ + widths[chr] = (int)(getFontPeer().charWidth((char)chr)*scaleX); + } return this.widths; } Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/Glyph.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/Glyph.java (revision 545729) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/font/Glyph.java (working copy) @@ -28,13 +28,13 @@ public abstract class Glyph{ // character of the glyph - char glChar; + protected char glChar; // precise glyph metrics - GlyphMetrics glMetrics; + protected GlyphMetrics glMetrics; // glyph metrics in pixels - GlyphMetrics glPointMetrics; + protected GlyphMetrics glPointMetrics; // glyph code of this Glyph int glCode; @@ -55,7 +55,7 @@ BufferedImage image; // shape that representing the outline of this glyph - Shape glOutline = null; + protected Shape glOutline = null; /** * image bitmap parameters @@ -94,14 +94,14 @@ * Retruns precise width of this glyph object */ public int getWidth(){ - return Math.round((float)glMetrics.getBounds2D().getWidth()); + return Math.round((float)getGlyphMetrics().getBounds2D().getWidth()); } /** * Retruns precise height of this glyph object */ public int getHeight(){ - return Math.round((float)glMetrics.getBounds2D().getHeight()); + return Math.round((float)getGlyphMetrics().getBounds2D().getHeight()); } /** @@ -150,9 +150,9 @@ */ public int[] getABC(){ int[] abc = new int[3]; - abc[0] = (int)glMetrics.getLSB(); - abc[1] = (int)glMetrics.getBounds2D().getWidth(); - abc[2] = (int)glMetrics.getRSB(); + abc[0] = (int)getGlyphMetrics().getLSB(); + abc[1] = (int)getGlyphMetrics().getBounds2D().getWidth(); + abc[2] = (int)getGlyphMetrics().getRSB(); return abc; } @@ -194,14 +194,14 @@ * Returns height of the glyph in points. */ public int getPointHeight(){ - return (int)glPointMetrics.getBounds2D().getHeight(); + return (int)getGlyphPointMetrics().getBounds2D().getHeight(); } /** * Returns width of the glyph in points. */ public int getPointWidth(){ - return (int)glPointMetrics.getBounds2D().getWidth(); + return (int)getGlyphPointMetrics().getBounds2D().getWidth(); } public Shape getShape(){ @@ -234,3 +234,4 @@ } + Index: modules/awt/src/main/java/common/org/apache/harmony/awt/gl/CommonGraphicsEnvironment.java =================================================================== --- modules/awt/src/main/java/common/org/apache/harmony/awt/gl/CommonGraphicsEnvironment.java (revision 545729) +++ modules/awt/src/main/java/common/org/apache/harmony/awt/gl/CommonGraphicsEnvironment.java (working copy) @@ -27,6 +27,8 @@ import java.util.ArrayList; import java.util.Locale; +import org.apache.harmony.awt.gl.font.FontManager; +import org.apache.harmony.awt.gl.font.fontlib.FLFontManager; import org.apache.harmony.awt.gl.image.BufferedImageGraphics2D; /** @@ -57,11 +59,11 @@ @Override public Font[] getAllFonts() { - return CommonGraphics2DFactory.inst.getFontManager().getAllFonts(); + return FontManager.getInstance().getAllFonts(); } @Override public String[] getAvailableFontFamilyNames() { - return CommonGraphics2DFactory.inst.getFontManager().getAllFamilies(); + return FontManager.getInstance().getAllFamilies(); } } Index: modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGDIPGraphics2D.java =================================================================== --- modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGDIPGraphics2D.java (revision 545729) +++ modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/WinGDIPGraphics2D.java (working copy) @@ -39,7 +39,9 @@ import org.apache.harmony.awt.gl.CommonGraphics2D; import org.apache.harmony.awt.gl.MultiRectArea; +import org.apache.harmony.awt.gl.font.FontManager; import org.apache.harmony.awt.gl.font.NativeFont; +import org.apache.harmony.awt.gl.font.fontlib.FLTextRenderer; import org.apache.harmony.awt.wtk.NativeWindow; @@ -92,8 +94,10 @@ size = new Dimension(b.width, b.height); gi = createGraphicsInfo(this.nw.getId(), tx, ty, b.width, b.height); - setTransformedClip(this.clip); - jtr = GDIPTextRenderer.inst; + setTransformedClip(this.clip); + if (!FontManager.IS_FONTLIB) { + jtr = GDIPTextRenderer.inst; + } dstSurf = new GDISurface(gi); blitter = GDIBlitter.getInstance(); setTransform(getTransform()); @@ -107,8 +111,9 @@ gi = createGraphicsInfo(this.nw.getId(), tx, ty, width, height); setTransformedClip(this.clip); - jtr = GDIPTextRenderer.inst; - + if (!FontManager.IS_FONTLIB) { + jtr = GDIPTextRenderer.inst; + } dstSurf = new GDISurface(gi); blitter = GDIBlitter.getInstance(); if (debugOutput) { @@ -134,18 +139,22 @@ setTransformedClip(this.clip); dstSurf = img.getImageSurface(); blitter = GDIBlitter.getInstance(); - jtr = GDIPTextRenderer.inst; + if (!FontManager.IS_FONTLIB) { + jtr = GDIPTextRenderer.inst; + } setTransform(getTransform()); } @Override public void addRenderingHints(Map hints) { super.addRenderingHints(hints); - Object value = this.getRenderingHint(RenderingHints.KEY_ANTIALIASING); - if (value == RenderingHints.VALUE_ANTIALIAS_ON) { - NativeFont.setAntialiasing(gi,true); - } else { - NativeFont.setAntialiasing(gi,false); + if (!FontManager.IS_FONTLIB) { + Object value = this.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + if (value == RenderingHints.VALUE_ANTIALIAS_ON) { + NativeFont.setAntialiasing(gi,true); + } else { + NativeFont.setAntialiasing(gi,false); + } } } @@ -563,22 +572,26 @@ @Override public void setRenderingHint(RenderingHints.Key key, Object value) { super.setRenderingHint(key,value); - Object val = this.getRenderingHint(RenderingHints.KEY_ANTIALIASING); - if (val == RenderingHints.VALUE_ANTIALIAS_ON) { - NativeFont.setAntialiasing(gi,true); - } else { - NativeFont.setAntialiasing(gi,false); + if (!FontManager.IS_FONTLIB) { + Object val = this.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + if (val == RenderingHints.VALUE_ANTIALIAS_ON) { + NativeFont.setAntialiasing(gi,true); + } else { + NativeFont.setAntialiasing(gi,false); + } } } @Override public void setRenderingHints(Map hints) { super.setRenderingHints(hints); - Object value = this.getRenderingHint(RenderingHints.KEY_ANTIALIASING); - if (value == RenderingHints.VALUE_ANTIALIAS_ON) { - NativeFont.setAntialiasing(gi,true); - } else { - NativeFont.setAntialiasing(gi,false); + if (!FontManager.IS_FONTLIB) { + Object value = this.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + if (value == RenderingHints.VALUE_ANTIALIAS_ON) { + NativeFont.setAntialiasing(gi,true); + } else { + NativeFont.setAntialiasing(gi,false); + } } } @@ -606,4 +619,4 @@ WinGDIPGraphics2D.gdiPlusShutdown(WinGDIPGraphics2D.gdipToken); } } -} \ No newline at end of file +} Index: modules/awt/src/main/native/fontlib/unix/exports.txt =================================================================== --- modules/awt/src/main/native/fontlib/unix/exports.txt (revision 0) +++ modules/awt/src/main/native/fontlib/unix/exports.txt (revision 0) @@ -0,0 +1,14 @@ +Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_initManager +Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_getAllFontsNative +Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_dispose +Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_addFont +Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_initFLFontPeer +Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getLineMetrics +Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getPSName +Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getMissingGlyphCode +Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_dispose +Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_canDisplay +Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getUnicodeByIndex +Java_org_apache_harmony_awt_gl_font_fontlib_FLGlyph_getGlyphMetrics +Java_org_apache_harmony_awt_gl_font_fontlib_FLGlyph_initGlyph +Java_org_apache_harmony_awt_gl_font_fontlib_FLPath_getShape Index: modules/awt/src/main/native/fontlib/unix/makefile =================================================================== --- modules/awt/src/main/native/fontlib/unix/makefile (revision 0) +++ modules/awt/src/main/native/fontlib/unix/makefile (revision 0) @@ -0,0 +1,43 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +include $(HY_HDK)/build/make/defines.mk + +CFLAGS += -fpic +INCLUDES += -I$(SHARED)common -I$(SHAREDSUB)include -I$(PNG_DIR) + +BUILDFILES = \ + $(SHAREDSUB)fljni.o \ + $(SHAREDSUB)EncodedValue.o \ + $(SHAREDSUB)Environment.o \ + $(SHAREDSUB)Font.o \ + $(SHAREDSUB)Glyph.o \ + $(SHAREDSUB)Outline.o \ + $(SHAREDSUB)ParsingTables.o \ + $(SHAREDSUB)T1Font.o \ + $(SHAREDSUB)T1Glyph.o \ + $(SHAREDSUB)TTCurve.o \ + $(SHAREDSUB)TTFont.o + +MDLLIBFILES += \ + $(LIBPATH)libhyzip.a $(DLLPATH)libhyzlib.so \ + $(LIBPATH)libhypool.a $(LIBPATH)libhyfdlibm.a $(LIBPATH)libvmi.so + +OSLIBS += $(STDCLIBS) + +DLLNAME=../libFL.so +EXPNAME=HYFONTLIB_0.1 + +include $(HY_HDK)/build/make/rules.mk Index: modules/awt/src/main/native/fontlib/shared/ParsingTables.cpp =================================================================== --- modules/awt/src/main/native/fontlib/shared/ParsingTables.cpp (revision 0) +++ modules/awt/src/main/native/fontlib/shared/ParsingTables.cpp (revision 0) @@ -0,0 +1,1160 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev + * @version $Revision$ + */ +#include +#include + +#include "Tables.h" + +static inline unsigned long dwReverse(unsigned long data) +{ + unsigned char *dataElems = (unsigned char *) &data; + return (unsigned long)((dataElems[0]<<24) | (dataElems[1]<<16) | (dataElems[2]<<8) | dataElems[3]); +} + +/* Reverses WORD bytes order */ +static inline unsigned short wReverse(unsigned short data) +{ + return (unsigned short)(((data<<8) & 0xFF00) | ((data>>8) & 0x00FF)); +} + +/* Reverses WORD bytes order */ +static inline short wReverse(short data) +{ + return (short)(((data<<8) & 0xFF00) | ((data>>8) & 0x00FF)); +} + +/* Searching of table, + return TRUE if table founded */ +bool searchTable(unsigned long table, unsigned long* offset, FILE* tt_file) +{ + Table_Offset tableOffset; + Table_Directory tableDirectory; + + bool isFound = false; + int size; + int i; + + /* Open font file stream */ +// if( (tt_file = fopen( fPath,"rb")) == NULL ){ +// printf("Error opening font file"); +// return 0; +// } + + size = (int)fseek(tt_file,0,SEEK_SET); + if (size != 0) + { +#ifdef DEBUG + printf("Error seeking table\n"); +#endif + return 0; + } + + size = (int)fread(&tableOffset, sizeof(Table_Offset), 1, tt_file); + if (size != 1){ +#ifdef DEBUG + printf("Error reading font file\n"); +#endif + return 0; + } + + /* Reverse byte order */ + tableOffset.version = dwReverse(tableOffset.version); + tableOffset.num_tables = wReverse(tableOffset.num_tables); +// tableOffset.search_range = wReverse(tableOffset.search_range); +// tableOffset.entry_selector = wReverse(tableOffset.entry_selector); + + /* check whether the version is 1.0 */ + if(tableOffset.version != 0x10000) + return 0; + + /* look for 'head' table */ + for(i=0; i< tableOffset.num_tables; i++) + { + size = (int)fread(&tableDirectory, sizeof(Table_Directory), 1, tt_file); + if ( size != 1){ +#ifdef DEBUG + printf("Error reading Table Directory from file."); +#endif + return 0; + } + if (* (unsigned long*)tableDirectory.tag == table){ + isFound = true; +// tableDirectory.length = dwReverse(tableDirectory.length); +// tableDirectory.offset = dwReverse(tableDirectory.offset); + *offset = dwReverse(tableDirectory.offset); + break; + } + } + return isFound; +} + +int getTableEncode_4(FILE* tt_file, TableEncode* te, unsigned short table_len) +{ + unsigned short* tableEncode; + unsigned short length; + int size, i; + + length = (table_len - sizeof(Table_encode_header))/sizeof(unsigned short); // in USHORTs + tableEncode = new unsigned short[length]; + + /* reading tail of the table */ + size = (int)fread(tableEncode,sizeof(unsigned short),length,tt_file); + if(size != length) + { +#ifdef DEBUG + printf("Error reading table encode format 4 from 'cmap' table"); +#endif + delete[] tableEncode; + tableEncode = NULL; + return -1; + } + + for(i=0;iTableEncode = tableEncode; // pointer to tail of 'Table_encode' subtable (of 'cmap') + return 0; +} + +#ifndef WIN32 +static inline bool compare(wchar_t* wstr, char* str) +{ + char cstr[256]; + wcstombs(cstr,wstr,256); + return !strcasecmp(cstr,str); +} +#endif + +int parseNameTable(FILE* tt_file, wchar_t** familyName, wchar_t** psName, StyleName* fontStyle) +{ + unsigned long dwTable = *(unsigned long*)NAME_TABLE; + unsigned long offset; + Table_name tableName; + Name_Entry nameRecord; + long curPos; + unsigned short *subFamilyName; + + int i, j; + int size; + bool inFamilyNameCase = false, inSubfamilyNameCase = false, inPSNameCase = false; + + if (searchTable(dwTable, &offset, tt_file)) + { + /* move position to the 'name' table */ + size = fseek(tt_file, offset, SEEK_SET); + if (size != 0){ +#ifdef DEBUG + printf("Error executing fseek() for 'name' table."); +#endif + return -1; + } + + /* read 'name' table header */ + size = (int)fread(&tableName, sizeof(Table_name) - sizeof(Name_Entry), 1, tt_file); + if (size != 1){ +#ifdef DEBUG + printf("Error reading Table 'Name' from file."); +#endif + return -1; + } + + tableName.num_name_records = wReverse(tableName.num_name_records); + tableName.storage_offset = wReverse(tableName.storage_offset); + + /* enumerating NameRecords and finding Family Name value */ + for(i=0; i < tableName.num_name_records; i++) + { + size = (int)fread(&nameRecord, sizeof(Name_Entry), 1, tt_file); + if (size != 1) + { +#ifdef DEBUG + printf("Error reading Name Record from file."); +#endif + return -1; + } + + nameRecord.nameID = wReverse(nameRecord.nameID); + nameRecord.platformID = wReverse(nameRecord.platformID); + if(nameRecord.platformID == WINDOWS_PLATFORM_ID) + switch (nameRecord.nameID) + { + case FAMILY_NAME_ID: + if (familyName != NULL && !inFamilyNameCase) + { + nameRecord.string_length = wReverse(nameRecord.string_length); + nameRecord.string_offset = wReverse(nameRecord.string_offset); + + /* Save current position if someting wrong with family name */ + curPos = ftell(tt_file); + size = fseek( tt_file, + offset + tableName.storage_offset + nameRecord.string_offset, + SEEK_SET); + if (size != 0){ +#ifdef DEBUG + printf("Error executing fseek() for 'name' table."); +#endif + return -1; + } + + +// ZeroMemory(&fontFamilyName, nameRecord.string_length/2 + sizeof(unsigned short)); + + unsigned short *fontFamilyName = new unsigned short[nameRecord.string_length/2+1]; + +// ZeroMemory(&(fontName[nameRecord.string_length]),1); + + size = (int)fread(fontFamilyName, sizeof(unsigned short), nameRecord.string_length/2, tt_file); + if (size != nameRecord.string_length/2) + { +#ifdef DEBUG + printf("Error reading Family Name from file."); +#endif + delete[] fontFamilyName; + fontFamilyName = NULL; + return -1; + } + + for(j=0; j < nameRecord.string_length/2; j++) + { + (fontFamilyName)[j] = wReverse((fontFamilyName)[j]); +//printf("%c",(char)(fontFamilyName)[j]); + } +//printf("\n"); + (fontFamilyName)[j] = 0; + inFamilyNameCase = true; + +#ifdef WIN32 + *familyName = (wchar_t*)fontFamilyName; +#else +//TODO: To unify this cycle and previous + *familyName = new wchar_t[nameRecord.string_length/2+1]; + + for(j=0; j < nameRecord.string_length/2+1; j++) + { + (*familyName)[j] = (wchar_t)fontFamilyName[j]; + } + delete fontFamilyName; +#endif + + size = fseek( tt_file, curPos, SEEK_SET); + if (size != 0){ +#ifdef DEBUG + printf("Error executing fseek() for 'name' table."); +#endif + return -1; + } + } + break; + case POSTSCRIPT_NAME_ID: + if (psName != NULL && !inPSNameCase) + { + nameRecord.string_length = wReverse(nameRecord.string_length); + nameRecord.string_offset = wReverse(nameRecord.string_offset); + + /* Save current position if someting wrong with postscript name */ + curPos = ftell(tt_file); + size = fseek( tt_file, + offset + tableName.storage_offset + nameRecord.string_offset, + SEEK_SET); + if (size != 0){ +#ifdef DEBUG + printf("Error executing fseek() for 'name' table."); +#endif + return -1; + } + + unsigned short *fontPSName = new unsigned short[nameRecord.string_length/2+1]; + + size = (int)fread(fontPSName, sizeof(unsigned short), nameRecord.string_length/2, tt_file); + if (size != nameRecord.string_length/2) + { +#ifdef DEBUG + printf("Error reading PostScript Name from file."); +#endif + delete[] fontPSName; + fontPSName = NULL; + return -1; + } + + for(j=0; j < nameRecord.string_length/2; j++) + { + (fontPSName)[j] = wReverse((fontPSName)[j]); + } + (fontPSName)[j] = 0; + inPSNameCase = true; + +#ifdef WIN32 + *psName = (wchar_t*)fontPSName; +#else + + *psName = new wchar_t[nameRecord.string_length/2+1]; +//TODO: To unify this cycle and previous + for(j=0; j < nameRecord.string_length/2+1; j++) + { + (*psName)[j] = (wchar_t)fontPSName[j]; + } + delete fontPSName; +#endif + + size = fseek( tt_file, curPos, SEEK_SET); + if (size != 0){ +#ifdef DEBUG + printf("Error executing fseek() for 'name' table."); +#endif + return -1; + } + } + break; + case SUBFAMILY_NAME_ID: + if(fontStyle != NULL && !inSubfamilyNameCase) + { + nameRecord.string_length = wReverse(nameRecord.string_length); + nameRecord.string_offset = wReverse(nameRecord.string_offset); + + /* Save current position if someting wrong with subfamily name */ + curPos = ftell(tt_file); + size = fseek( tt_file, + offset + tableName.storage_offset + nameRecord.string_offset, + SEEK_SET); + if (size != 0){ +#ifdef DEBUG + printf("Error executing fseek() for 'name' table."); +#endif + return -1; + } + +// ZeroMemory(&fontName, nameRecord.string_length + sizeof(unsigned short)); + + subFamilyName = new unsigned short[nameRecord.string_length/2+1]; + +// ZeroMemory(&(fontName[nameRecord.string_length]),1); + + size = (int)fread(subFamilyName, sizeof(unsigned short), nameRecord.string_length/2, tt_file); + if (size != nameRecord.string_length/2) + { +#ifdef DEBUG + printf("Error reading SubFamily Name from file."); +#endif + delete[] subFamilyName; + subFamilyName = NULL; + return -1; + } + + for(j=0; j < nameRecord.string_length/2; j++) + { + subFamilyName[j] = wReverse(subFamilyName[j]); + } + subFamilyName[j] = 0; + +#ifdef WIN32 + +#define COMPARE_IT (!_wcsicmp((wchar_t *)subFamilyName,L"Italic")) +#define COMPARE_BD (!_wcsicmp((wchar_t *)subFamilyName,L"Bold")) +#define COMPARE_BDIT (!_wcsicmp((wchar_t *)subFamilyName,L"Bold Italic")) +#define COMPARE_REG (!_wcsicmp((wchar_t *)subFamilyName,L"Regular") || !_wcsicmp((wchar_t *)subFamilyName,L"Normal")) + +#else + +#define COMPARE_IT (compare((wchar_t *)subFamilyName, "Italic")) +#define COMPARE_BD (compare((wchar_t *)subFamilyName, "Bold")) +#define COMPARE_BDIT (compare((wchar_t *)subFamilyName, "Bold Italic")) +#define COMPARE_REG (compare((wchar_t *)subFamilyName, "Regular") || compare((wchar_t *)subFamilyName, "Normal")) + +#endif + + if COMPARE_IT + { + *fontStyle = Italic; + inSubfamilyNameCase = true; + } + else if COMPARE_BD + { + *fontStyle = Bold; + inSubfamilyNameCase = true; + } + else if COMPARE_BDIT + { + *fontStyle = BoldItalic; + inSubfamilyNameCase = true; + } + else if COMPARE_REG + { + *fontStyle = Regular; + inSubfamilyNameCase = true; + } + + delete[] subFamilyName; + subFamilyName = NULL; + + size = fseek( tt_file, curPos, SEEK_SET); + if (size != 0){ +#ifdef DEBUG + printf("Error executing fseek() for 'name' table."); +#endif + return -1; + } + + } + + } + } + } + + + /* Close font file stream */ +/* if( fclose( tt_file ) ){ + printf("Error closing TrueType font file."); + return 0; + } +*/ +// fclose(tt_file); + + if (!inSubfamilyNameCase) + fontStyle = NULL; + return 0; +} + +int parseHeadTable(FILE* tt_file, float* bbox, short* format, unsigned short* unitsPerEm) +{ + unsigned long hTable = *(unsigned long*)HEAD_TABLE; + unsigned long offset; + Table_head tableHead; + + int size; + + if (searchTable(hTable, &offset, tt_file)) + { + /* move position to the 'head' table */ + size = fseek(tt_file, offset, SEEK_SET); + if (size != 0){ +#ifdef DEBUG + printf("Error executing fseek() for 'head' table."); +#endif + return -1; + } + + /* read 'head' table header */ + size = (int)fread(&tableHead, sizeof(Table_head), 1, tt_file); + if (size != 1){ +// printf("Error reading Table 'Head' from file."); + return -1; + } + + bbox[0] = wReverse(tableHead.xMin); + bbox[1] = wReverse(tableHead.yMin); + bbox[2] = wReverse(tableHead.xMax);//for wingding must be -432(?) + bbox[3] = wReverse(tableHead.yMax); + + tableHead.index_to_loc_format=wReverse(tableHead.index_to_loc_format); + if (wReverse(tableHead.glyph_data_format)) + { +// if (tableHead.index_to_loc_format == 1 || tableHead.index_to_loc_format == 0) + *format = !tableHead.index_to_loc_format; + } + else + { + *format = tableHead.index_to_loc_format; +// printf("debug information: see 'loca' table format!!!\n"); + } + + *unitsPerEm = wReverse(tableHead.units_per_EM); + } + +// ******* Validating data ********* + +// HDC hDC = GetDC(NULL); +// HDC hDC = GetDC(NULL); +// Table_head tableHead1; +// unsigned long tbl = (unsigned long)"head"; +// int m = GetFontData(hDC,tbl,(unsigned long)offset,&tableHead1,sizeof(Table_head)); + +// ******* Validating data ********* +// return *bbox; +// fclose(tt_file); + return 0; +} + +int parseMaxpTable(FILE* tt_file, unsigned short* numGlyphs) +{ + unsigned long hTable = *(unsigned long*)MAXP_TABLE; + unsigned long offset; + Table_maxp tableMaxp; + + int size; + + if (searchTable(hTable, &offset, tt_file)) + { + /* move position to the 'maxp' table */ + size = fseek(tt_file, offset, SEEK_SET); + if (size != 0){ +// printf("Error executing fseek() for 'maxp' table."); + return -1; + } + + /* read 'maxp' table header */ + size = (int)fread(&tableMaxp, sizeof(Table_maxp), 1, tt_file); + if (size != 1){ +// printf("Error reading Table 'maxp' from file."); + return -1; + } + }else + { + return -1; + } + + *numGlyphs = wReverse(tableMaxp.numGlyphs); + tableMaxp.maxPoints = wReverse(tableMaxp.maxPoints); + tableMaxp.maxContours = wReverse(tableMaxp.maxContours); + tableMaxp.maxCompositePoints = wReverse(tableMaxp.maxCompositeContours); //must be 141 for wingding(?) + tableMaxp.maxCompositeContours = wReverse(tableMaxp.maxCompositeContours); + tableMaxp.maxStackElements = wReverse(tableMaxp.maxStackElements); + tableMaxp.maxSizeOfInstructions = wReverse(tableMaxp.maxSizeOfInstructions); + +// fclose(tt_file); + return 0; +} + +int parseHheaTable(FILE* tt_file, unsigned short* numOfHMetrics, float* ascent, float* descent, float* lineGap) +{ + unsigned long hTable = *(unsigned long*)HHEA_TABLE; + unsigned long offset; + Table_hhea tableHhea; + + int size; + + if (searchTable(hTable, &offset, tt_file)) + { + /* move position to the 'hhea' table */ + size = fseek(tt_file, offset, SEEK_SET); + if (size != 0){ +// printf("Error executing fseek() for 'hhea' table."); + return -1; + } + + /* read 'hhea' table header */ + size = (int)fread(&tableHhea, sizeof(Table_hhea), 1, tt_file); + if (size != 1){ +// printf("Error reading Table 'hhea' from file."); + return -1; + } + }else + { + return -1; + } + + *numOfHMetrics = wReverse(tableHhea.number_of_hMetrics); + *ascent = wReverse(tableHhea.ascender); + *descent = wReverse(tableHhea.descender); + *lineGap = wReverse(tableHhea.line_gap); + + return 0; +} + +int parseOs2Table(FILE* tt_file, float* strikeOutSize, float* strikeOutOffset) +{ + unsigned long hTable = *(unsigned long*)OS2_TABLE; + unsigned long offset; + Table_os2 tableOs2; + + int size; + + if (searchTable(hTable, &offset, tt_file)) + { + /* move position to the 'OS/2' table */ + size = fseek(tt_file, offset, SEEK_SET); + if (size != 0){ +// printf("Error executing fseek() for 'OS/2' table."); + return -1; + } + + /* read 'OS/2' table header */ + size = (int)fread(&tableOs2, sizeof(Table_os2), 1, tt_file); + if (size != 1){ +// printf("Error reading Table 'OS/2' from file."); + return -1; + } + } else + { + return -1; + } + +// tableOs2.usFirstCharIndex = wReverse(tableOs2.usFirstCharIndex); +// *ascent = wReverse(tableOs2.sTypoAscender); +// *descent = wReverse(tableOs2.sTypoDescender); + *strikeOutSize = wReverse(tableOs2.yStrikeoutSize); + *strikeOutOffset = wReverse(tableOs2.yStrikeoutPosition); +// fclose(tt_file); + + return 0; +} + +int parsePostTable(FILE* tt_file, short* uOffset, short* uThickness) +{ + unsigned long hTable = *(unsigned long*)POST_TABLE; + unsigned long offset; + Table_post tablePost; + + int size; + + if (searchTable(hTable, &offset, tt_file)) + { + /* move position to the 'post' table */ + size = fseek(tt_file, offset, SEEK_SET); + if (size != 0){ +// printf("Error executing fseek() for 'post' table."); + return -1; + } + + /* read 'post' table header */ + size = (int)fread(&tablePost, sizeof(Table_post), 1, tt_file); + if (size != 1){ +// printf("Error reading Table 'post' from file."); + return -1; + } + } else + { + return -1; + } + + *uOffset = wReverse(tablePost.underlineOffset); + *uThickness = wReverse(tablePost.underlineThickness); + + return 0; +} + +int parseHmtxTable(FILE* tt_file, unsigned short numOfHMetrics, HMetrics** hm) +{ + unsigned long hTable = *(unsigned long*)HMTX_TABLE; + unsigned long offset; + + int size; + + if (searchTable(hTable, &offset, tt_file)) + { + /* move position to the 'hmtx' table */ + size = fseek(tt_file, offset, SEEK_SET); + if (size != 0){ +// printf("Error executing fseek() for 'OS/2' table."); + return -1; + } + /* read 'hmtx' table */ + *hm = new HMetrics[numOfHMetrics]; + + size = (int)fread(*hm, sizeof(HMetrics), numOfHMetrics, tt_file); + if (size != numOfHMetrics){ + delete[] hm; +// printf("Error reading Table 'hmtx' from file."); + return -1; + } + + for (int i=0; iformat) + { + delete[] gShortOffsets; + } + return -1; + } + + /* read 'loca' table */ + if (gOffsets->format) + { + size = (int)fread(gLongOffsets, sizeof(long),numGlyphs+1, tt_file); + if (size != numGlyphs+1) + { +// printf("Error reading Table 'loca' from file."); + delete[] gLongOffsets; + gLongOffsets = NULL; + return -1; + } + for (i=0; i<=numGlyphs; i++) + gLongOffsets[i] = dwReverse(gLongOffsets[i])+localGlyfOffset; + }else + { + size = (int)fread(gShortOffsets, sizeof(short), numGlyphs+1, tt_file); + if (size != numGlyphs+1) + { +// printf("Error reading Table 'loca' from file."); + delete[] gShortOffsets; + gShortOffsets = NULL; + delete[] gLongOffsets; + gLongOffsets = NULL; + return -1; + } + for (i=0;i<=numGlyphs;i++) + gLongOffsets[i] = wReverse(gShortOffsets[i])*2+localGlyfOffset; + } + (*gOffsets).offsets = gLongOffsets; + delete[] gShortOffsets; + } + +// fclose(tt_file); + + return 0; +}; + +int parseCmapTable(FILE* tt_file, TableEncode* te) +{ + unsigned long hTable = *(unsigned long*)CMAP_TABLE; + unsigned long offset; + Table_cmap tableCmap; + Cmap_Entry cmapRecord; + Table_encode_header tableEncodeHeader; + long curPos; + + int i; + int size; + + if (searchTable(hTable, &offset, tt_file)) + { + /* move position to the 'cmap' table */ + size = fseek(tt_file, offset, SEEK_SET); + if (size != 0){ +// printf("Error executing fseek() for 'cmap' table."); + return -1; + } + + /* read 'cmap' table header */ + size = (int)fread(&tableCmap, sizeof(Table_cmap) - sizeof(Cmap_Entry), 1, tt_file); + if (size != 1){ +// printf("Error reading Table 'cmap' from file."); + return -1; + } + + tableCmap.numSubTables = wReverse(tableCmap.numSubTables); + + for(i=0; i < tableCmap.numSubTables; i++) + { + size = (int)fread(&cmapRecord, sizeof(Cmap_Entry), 1, tt_file); + if (size != 1) + { +// printf("Error reading cmap Record from file."); + return -1; + } + + cmapRecord.encodingID = wReverse(cmapRecord.encodingID); + cmapRecord.platform = wReverse(cmapRecord.platform); + + if(cmapRecord.platform == WINDOWS_PLATFORM_ID) + { + switch (cmapRecord.encodingID) + { + case UNICODE_ENCODING: + cmapRecord.table_offset = dwReverse(cmapRecord.table_offset); + + /* Save current position if someting wrong with family name */ + curPos = ftell(tt_file); + size = fseek( tt_file, offset + cmapRecord.table_offset, SEEK_SET); + if (size != 0){ +// printf("Error executing fseek() for 'cmap' table."); + return -1; + } + + + size = (int)fread(&tableEncodeHeader, sizeof(Table_encode_header), 1, tt_file); + if (size != 1) + { +// printf("Error reading Table Encode from file."); + return -1; + } + + tableEncodeHeader.format = wReverse(tableEncodeHeader.format); + tableEncodeHeader.length = wReverse(tableEncodeHeader.length); + tableEncodeHeader.version = wReverse(tableEncodeHeader.version); + + if (tableEncodeHeader.format == 0 && te->TableEncode == NULL) + { + unsigned char *map = new unsigned char[256]; + te->format = 0; + size = (int)fread(map, sizeof(unsigned char), 256, tt_file); + if (size != 256) + { +// printf("Error reading map format 0"); + delete[] map; + map = NULL; + } else + { + te->TableEncode = map; + } + + }else if (tableEncodeHeader.format == 4 && te->TableEncode == NULL) + { + te->format = 4; + getTableEncode_4(tt_file, te, tableEncodeHeader.length); + } + size = fseek( tt_file, curPos, SEEK_SET); + if (size != 0){ +// printf("Error executing fseek() for 'name' table."); + return -1; + } + + break; + } + } + } + } + +// fclose(tt_file); + return 0; +} + +int parseGlyphData(FILE* tt_file, const GlyphOffsets gO, unsigned short numGlyphs, unsigned short glyphIndex, TTCurve *curve, short* bRect, float transform) +{ + unsigned long offset; + Glyph_header glyphHeader; + short numOfContours; + unsigned short *endPtsOfContours = NULL; + unsigned short instructionLength;//instruction length in bytes + unsigned char* instructions = NULL; + unsigned char* flags = NULL; + unsigned char* xCoord = NULL; //pointer to array of X coordinates + unsigned char* yCoord = NULL; //pointer to array of Y coordinates + unsigned char* tmp = NULL; + + int numPoints; // number of Points + int size, i, j, curLen; + int flagIndex = 0; + int xCoordIndex = 0; + int yCoordIndex = 0; + int rep = 0; + + short xLength = 0; //length of array of X coordinates + short yLength = 0; //length of array of Y coordinates + unsigned char curFlag = 0; + + if (glyphIndex >= numGlyphs) + { +// printf("debug info: glyphIndex out of range"); + glyphIndex = 0; + } + + offset = gO.offsets[glyphIndex]; + if (offset == gO.offsets[glyphIndex+1]) + { + curve->add(0,0, 1); + return 0; + } + + size = fseek(tt_file, offset, SEEK_SET); + if (size != 0){ +// printf("Error executing fseek() for someone glyph."); + return -1; + } + + /* read 'Glyph_header' table */ + size = (int)fread(&glyphHeader, sizeof(Glyph_header), 1, tt_file); + if (size != 1){ +// printf("Error reading 'Glyph_header' table from file."); + return -1; + } + + glyphHeader.number_of_contours = wReverse(glyphHeader.number_of_contours); + numOfContours = glyphHeader.number_of_contours; + bRect[0] = (short)(wReverse(glyphHeader.xMin)*transform); + bRect[1] = (short)(wReverse(glyphHeader.yMin)*transform); + bRect[2] = (short)(wReverse(glyphHeader.xMax)*transform); + bRect[3] = (short)(wReverse(glyphHeader.yMax)*transform); + + if (numOfContours > 0) + { + endPtsOfContours = new unsigned short[numOfContours]; + size = (int)fread(endPtsOfContours, sizeof(short),numOfContours,tt_file); + if (size != numOfContours) + { +// printf("Error reading endPtsOfContours for someone glyph."); + delete endPtsOfContours; + return -1; + } + + for (i=0; i1) && !(curFlag & ON_CURVE ) && + ((rep == 1) ? (!(flags[flagIndex-2] & ON_CURVE)) : (!(flags[flagIndex-3] & ON_CURVE)))) + curve->add((x+xChange/2)*transform,(y+yChange/2)*transform,FLAG_ONCURVE); + + + x+=xChange; + y+=yChange; + + if (contBegin) + { + curve->add(x*transform,y*transform, 1); + xFirstInContour = x*transform; + yFirstInContour = y*transform; + + contBegin = 0; + } else + curve->add(x*transform,y*transform, curFlag & ON_CURVE ? FLAG_ONCURVE : 0); + + rep--; + i++; + } + curve->add(xFirstInContour,yFirstInContour,FLAG_ONCURVE); + } + } + + + delete[] xCoord; + delete[] yCoord; + delete[] flags; + delete[] endPtsOfContours; + delete[] instructions; + + return 0; +} + +/* Should be removed when the composite glyph parsing will be realized */ +bool isCompositeGlyph(FILE* tt_file, const GlyphOffsets gO, unsigned short numGlyphs, unsigned short glyphIndex) +{ + unsigned long offset; + Glyph_header glyphHeader; + + int size; + + if (glyphIndex >= numGlyphs) + glyphIndex = 0; + + offset = gO.offsets[glyphIndex]; + if (offset == gO.offsets[glyphIndex+1]) + return false; + +/*printf("glyphIndex = %d\n",glyphIndex); +if (tt_file == NULL) +printf("file is NULL\n"); +else +printf("file isn't NULL\n");*/ + size = fseek(tt_file, offset, SEEK_SET); + if (size != 0) +{ +//printf("return false\n"); + return false; +} +//printf("second return\n"); + /* read 'Glyph_header' table */ + size = (int)fread(&glyphHeader, sizeof(Glyph_header), 1, tt_file); + if (size != 1) + return false; +//printf("third return\n"); + return wReverse(glyphHeader.number_of_contours) < 0; + +} Index: modules/awt/src/main/native/fontlib/shared/EncodedValue.cpp =================================================================== --- modules/awt/src/main/native/fontlib/shared/EncodedValue.cpp (revision 0) +++ modules/awt/src/main/native/fontlib/shared/EncodedValue.cpp (revision 0) @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Viskov Nikolay + * @version $Revision$ + */ +#include "EncodedValue.h" +#include + +EncodedValue::EncodedValue(void) { + text = NULL; +} + +EncodedValue::~EncodedValue(void) { + delete[] text; +} Index: modules/awt/src/main/native/fontlib/shared/Type1Structs.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/Type1Structs.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/Type1Structs.h (revision 0) @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Viskov Nikolay + * @version $Revision$ + */ + +#ifndef __TYPE_1_STRUCTS_H +#define __TYPE_1_STRUCTS_H + +#include +#include "EncodedValue.h" +#include "AGL.h" + +typedef std::map Type1Map; + +typedef std::map Type1GlyphCodeMap; + +typedef std::map Type1AFMMap; + +typedef enum DecodeStateTag {HEADER, PRIVATE_DIR, SUBRS_MASSIVE, CHAR_STRING} DecodeState; + +typedef std::map Type1CharMap;//inner glyph number -- unicode + +static const unsigned short MAX_STR_LENGHT = 1024; +static const unsigned short C1 = 52845; +static const unsigned short C2 = 22719; +static const unsigned short DEF_R_EXEC = 55665; +static const unsigned short DEF_LENIV = 4; +static const unsigned short DEF_R_CHARSTRING = 4330; + +static const unsigned char CH_STR_HSTEM = 1; +static const unsigned char CH_STR_VSTEM = 3; +static const unsigned char CH_STR_VMOVETO = 4; +static const unsigned char CH_STR_RLINETO = 5; +static const unsigned char CH_STR_HLINETO = 6; +static const unsigned char CH_STR_VLINETO = 7; +static const unsigned char CH_STR_RRCURVETO = 8; +static const unsigned char CH_STR_CLOSEPATH = 9; +static const unsigned char CH_STR_CALLSUBR = 10; +static const unsigned char CH_STR_RETURN = 11; +static const unsigned char CH_STR_ESCAPE = 12; +static const unsigned char CH_STR_HSBW = 13; +static const unsigned char CH_STR_ENDCHAR = 14; +static const unsigned char CH_STR_RMOVETO = 21; +static const unsigned char CH_STR_HMOVETO = 22; +static const unsigned char CH_STR_VHCURVETO = 30; +static const unsigned char CH_STR_HVCURVETO = 31; + +static const unsigned char CH_STR_ESCAPE_DOTSECTION = 0; +static const unsigned char CH_STR_ESCAPE_VSTEM3 = 1; +static const unsigned char CH_STR_ESCAPE_HSTEM3 = 2; +static const unsigned char CH_STR_ESCAPE_SEAC = 6; +static const unsigned char CH_STR_ESCAPE_SBW = 7; +static const unsigned char CH_STR_ESCAPE_DIV = 12; +static const unsigned char CH_STR_ESCAPE_CALLOTHERSUBR = 16; +static const unsigned char CH_STR_ESCAPE_POP = 17; +static const unsigned char CH_STR_ESCAPE_SETCURRENTPOINT = 33; + +//#define GLYPH_OUTLINE_CREATE_DEBUG + +#endif //__TYPE_1_STRUCTS_H Index: modules/awt/src/main/native/fontlib/shared/TTCurve.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/TTCurve.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/TTCurve.h (revision 0) @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev + * @version $Revision$ + */ +#ifndef __CURVE_H__ +#define __CURVE_H__ + +enum{OPEN_FLAG=1, FLAG_ONCURVE=2}; + +class TTCurve +{ +public: + + TTCurve(); + ~TTCurve(); + + float* _coords; + unsigned char* _flags; + unsigned short _len; + unsigned short _outlineCommandsNumb; + + int add(float x, float y, unsigned char flag); + +}; + +#endif Index: modules/awt/src/main/native/fontlib/shared/fljni.cpp =================================================================== --- modules/awt/src/main/native/fontlib/shared/fljni.cpp (revision 0) +++ modules/awt/src/main/native/fontlib/shared/fljni.cpp (revision 0) @@ -0,0 +1,336 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +#include "fljni.h" + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontManager + * Method: initManager + * Signature: (Ljava/lang/String;Ljava/lang/Class;)V + */ + +static jclass fontClass; +static jclass outlineClass; +static jmethodID setOutline; +static jmethodID fontConstructor; + +JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_initManager +(JNIEnv *env, jobject obj) { + +// jboolean iscopy; + + //printf("getting fonts...\n"); + Environment::getAllFonts(); + //printf("fonts added\n"); +#ifdef WIN32 + //char *nativePath = (char *)(env->GetStringUTFChars(path, &iscopy)); + + //Environment::addPath(nativePath); + + //env->ReleaseStringUTFChars(path, nativePath); +#endif + + + fontClass = env->FindClass("java/awt/Font"); + outlineClass = env->FindClass("org/apache/harmony/awt/gl/font/fontlib/FLOutline"); + fontConstructor = env->GetMethodID(fontClass, "", "(Ljava/lang/String;II)V"); + setOutline = env->GetMethodID(outlineClass, "setOutline", "([B[F)V"); +} + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontManager + * Method: getAllFontsNative + * Signature: ()[Ljava/awt/Font; + */ +JNIEXPORT jobjectArray JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_getAllFontsNative +(JNIEnv *env, jobject obj) { + + Environment::getAllFonts(); + + if (Environment::_length == 0) return NULL; + + fontClass = env->FindClass("java/awt/Font"); + + jobjectArray fonts = env->NewObjectArray(Environment::_length, fontClass, NULL ); + + FontHeader *fh = Environment::getAllFonts(); + + for (unsigned short i = 0; i < Environment::_length; i ++){ +#ifndef WIN32 + unsigned short fName[wcslen((wchar_t *)fh->_familyName)]; + for(unsigned short a = 0; a_familyName); a++){ + fName[a]=(unsigned short)(fh->_familyName[a]); + } +#endif + + env->SetObjectArrayElement(fonts, i, env->NewObject( + fontClass, + fontConstructor, +#ifdef WIN32 + env->NewString((jchar *)fh->_familyName, (jsize) wcslen((wchar_t *)fh->_familyName)), +#else + env->NewString((jchar*)fName, (jsize) wcslen((wchar_t *)fh->_familyName)), +#endif + (jint) (char) fh->_style, + (jint) 1 + )); + fh = fh->_nextHeader; + } + + return fonts; +} + +JNIEXPORT jobject JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_addFont +(JNIEnv *env, jobject obj, jstring fontPath, jint type) { + jboolean iscopy; + + fontClass = env->FindClass("java/awt/Font"); + + char *nativePath = (char *)(env->GetStringUTFChars(fontPath, &iscopy)); + + FontHeader *fh = Environment::addFile(nativePath, (FontType)type); + + env->ReleaseStringUTFChars(fontPath, nativePath); + + if (fh == NULL) return NULL; + + return env->NewObject( + fontClass, + fontConstructor, + env->NewString((jchar *)fh->_familyName, (jsize) wcslen((wchar_t *)fh->_familyName)), + (jint) (char) fh->_style, + (jint) 1 + ); +} + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontManager + * Method: dispose + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_dispose +(JNIEnv *env, jobject obj) { + delete Environment::getAllFonts(); +} + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: initFLFontPeer + * Signature: (Ljava/lang/String;I)J + */ +JNIEXPORT jlong JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_initFLFontPeer +(JNIEnv *env, jobject obj, jstring fontName, jint style) { + jboolean iscopy; + + //char *getenv( const char *name ); + + char *tName = (char *)(env->GetStringUTFChars(fontName, &iscopy)); + + Font *font = createFont(tName, (StyleName) style); + + env->ReleaseStringUTFChars(fontName, tName); + + //if(!font) { + // printf("File not found !!!\n"); + //} + + #ifdef WIN32 + return (jlong) font; + #else + return (jlong) (long) font; + #endif +} + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: getLineMetrics + * Signature: (J)[I + */ +JNIEXPORT jfloatArray JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getLineMetrics +(JNIEnv *env, jobject obj, jlong ptr) { + #ifdef WIN32 + Font *font = (Font *) ptr; + #else + Font *font = (Font *) (long)ptr; + #endif + + jfloatArray metrics = env->NewFloatArray((jsize) FONT_METRICS_QUANTITY); + float *buffer = (float *)env->GetPrimitiveArrayCritical(metrics, NULL); + +//printf("getting line metrics...\n"); + float *lineMetrics; + memcpy(buffer, lineMetrics = font->getLineMetrics(), FONT_METRICS_QUANTITY * sizeof(float)); +//printf("line metrics gotten"); + + delete[] lineMetrics; + + env->ReleasePrimitiveArrayCritical(metrics, buffer, 0); + + return metrics; +} + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: getPSName + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getPSName +(JNIEnv *env, jobject obj, jlong ptr) { + #ifdef WIN32 + Font *font = (Font *) ptr; + #else + Font *font = (Font *) (long)ptr; + #endif + + wchar_t *psName = font->getPSName(); + + return env->NewString((jchar *) psName, (jsize) wcslen(psName)); +} + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: getMissingGlyphCode + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getMissingGlyphCode +(JNIEnv *env, jobject obj, jlong ptr) { + #ifdef WIN32 + Font *font = (Font *) ptr; + #else + Font *font = (Font *) (long)ptr; + #endif + + return (jint) font->getMissingGlyphCode(); +} + +JNIEXPORT jchar JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getUnicodeByIndex +(JNIEnv *env, jobject obj, jint index, jlong ptr) { + #ifdef WIN32 + Font *font = (Font *) ptr; + #else + Font *font = (Font *) (long)ptr; + #endif + + return (jchar) font->getUnicodeByIndex((unsigned short) index); +} + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: dispose + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_dispose +(JNIEnv *env, jobject obj, jlong ptr) { + #ifdef WIN32 + delete (Font *) ptr; + #else + delete (Font *) (long) ptr; + #endif +} + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: canDisplay + * Signature: (CJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_canDisplay +(JNIEnv *env, jobject obj, jchar ch, jlong ptr) { + #ifdef WIN32 + Font *font = (Font *) ptr; + #else + Font *font = (Font *) (long)ptr; + #endif + + return font->canDisplay((unsigned short)ch); +} + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLGlyph + * Method: getGlyphMetrics + * Signature: (J)[I + */ +JNIEXPORT jfloatArray JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLGlyph_getGlyphMetrics +(JNIEnv *env, jobject obj, jlong ptr) { + #ifdef WIN32 + Glyph *glyph = (Glyph *) ptr; + #else + Glyph *glyph = (Glyph *) (long)ptr; + #endif + + + jfloatArray metrics = env->NewFloatArray((jsize) GLYPH_METRICS_QUANTITY); + float *buffer = (float *)env->GetPrimitiveArrayCritical(metrics, NULL); + + memcpy(buffer, glyph->getGlyphMetrics(), GLYPH_METRICS_QUANTITY * sizeof(float)); + + env->ReleasePrimitiveArrayCritical(metrics, buffer, 0); + + return metrics; +} + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLGlyph + * Method: initGlyph + * Signature: (CIJ)J + */ +JNIEXPORT jlong JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLGlyph_initGlyph +(JNIEnv *env, jobject obj, jchar ch, jint size, jlong ptr) { + #ifdef WIN32 + Font *font = (Font *) ptr; + return (jlong) font->getGlyph((unsigned short) ch, (unsigned short) size); + #else + Font *font = (Font *) (long)ptr; + return (jlong) (long) font->getGlyph((unsigned short) ch, (unsigned short) size); + #endif +} + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLPath + * Method: getShape + * Signature: ([B[FJ)J + */ +JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLPath_getShape +(JNIEnv * env, jobject obj, jobject outline, jlong ptr) { + #ifdef WIN32 + Glyph *glyph = (Glyph *) ptr; + #else + Glyph *glyph = (Glyph *) (long)ptr; + #endif + + Outline* out = glyph->getOutline(); + + out->trim(); + + jbyteArray commands = env->NewByteArray((jsize) out->getCommandLength()); + unsigned char *native_buffer = (unsigned char *)env->GetPrimitiveArrayCritical(commands, NULL); + + memcpy(native_buffer, out->_commands, out->getCommandLength()); + + env->ReleasePrimitiveArrayCritical(commands, native_buffer, 0); + + + jfloatArray points = env->NewFloatArray((jsize) out->getPointsLength()); + float *buffer = (float *)env->GetPrimitiveArrayCritical(points, NULL); + + memcpy(buffer, out->_points, out->getPointsLength() * sizeof(float)); + + env->ReleasePrimitiveArrayCritical(points, buffer, 0); + + env->CallVoidMethod(outline, setOutline, commands, points); + + delete out; +} Index: modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLFontPeer.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLFontPeer.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLFontPeer.h (revision 0) @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/* + * THE FILE HAS BEEN AUTOGENERATED BY INTEL IJH TOOL. + * Please be aware that all changes made to this file manually + * will be overwritten by the tool if it runs again. + */ +#include +/* Header for class org_apache_harmony_awt_gl_font_fontlib_FLFontPeer */ + +#ifndef _Included_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer +#define _Included_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: initFLFontPeer + * Signature: (Ljava/lang/String;I)J + */ +JNIEXPORT jlong JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_initFLFontPeer + (JNIEnv *, jobject, jstring, jint); + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: getLineMetrics + * Signature: (J)[I + */ +JNIEXPORT jfloatArray JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getLineMetrics + (JNIEnv *, jobject, jlong); + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: getPSName + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getPSName + (JNIEnv *, jobject, jlong); + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: getMissingGlyphCode + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getMissingGlyphCode + (JNIEnv *, jobject, jlong); + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: dispose + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_dispose + (JNIEnv *, jobject, jlong); + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: canDisplay + * Signature: (CJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_canDisplay + (JNIEnv *, jobject, jchar, jlong); + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontPeer + * Method: getUnicodeByIndex + * Signature: (CJ)Z + */ +JNIEXPORT jchar JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer_getUnicodeByIndex + (JNIEnv *, jobject, jint, jlong); + +#ifdef __cplusplus +} +#endif + +#endif /* _Included_org_apache_harmony_awt_gl_font_fontlib_FLFontPeer */ Index: modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLGlyph.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLGlyph.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLGlyph.h (revision 0) @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/* + * THE FILE HAS BEEN AUTOGENERATED BY INTEL IJH TOOL. + * Please be aware that all changes made to this file manually + * will be overwritten by the tool if it runs again. + */ +#include +/* Header for class org_apache_harmony_awt_gl_font_fontlib_FLGlyph */ + +#ifndef _Included_org_apache_harmony_awt_gl_font_fontlib_FLGlyph +#define _Included_org_apache_harmony_awt_gl_font_fontlib_FLGlyph +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLGlyph + * Method: getGlyphMetrics + * Signature: (J)[I + */ +JNIEXPORT jfloatArray JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLGlyph_getGlyphMetrics + (JNIEnv *, jobject, jlong); + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLGlyph + * Method: initGlyph + * Signature: (CIJ)J + */ +JNIEXPORT jlong JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLGlyph_initGlyph + (JNIEnv *, jobject, jchar, jint, jlong); + +#ifdef __cplusplus +} +#endif + +#endif /* _Included_org_apache_harmony_awt_gl_font_fontlib_FLGlyph */ Index: modules/awt/src/main/native/fontlib/shared/include/fljni.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/include/fljni.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/include/fljni.h (revision 0) @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +#ifndef __FONTLIB_JNI_H +#define __FONTLIB_JNI_H + +#include "org_apache_harmony_awt_gl_font_fontlib_FLFontManager.h" +#include "org_apache_harmony_awt_gl_font_fontlib_FLGlyph.h" +#include "org_apache_harmony_awt_gl_font_fontlib_FLPath.h" +#include "org_apache_harmony_awt_gl_font_fontlib_FLFontPeer.h" + +#include "Environment.h" +#include "Font.h" + +//#include + +#endif // __FONTLIB_JNI_H Index: modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLPath.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLPath.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLPath.h (revision 0) @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/* + * THE FILE HAS BEEN AUTOGENERATED BY INTEL IJH TOOL. + * Please be aware that all changes made to this file manually + * will be overwritten by the tool if it runs again. + */ +#include +/* Header for class org_apache_harmony_awt_gl_font_fontlib_FLPath */ + +#ifndef _Included_org_apache_harmony_awt_gl_font_fontlib_FLPath +#define _Included_org_apache_harmony_awt_gl_font_fontlib_FLPath +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLPath + * Method: getShape + * Signature: ([B[FJ)J + */ +JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLPath_getShape + (JNIEnv *, jobject, jobject, jlong); + +#ifdef __cplusplus +} +#endif + +#endif /* _Included_org_apache_harmony_awt_gl_font_fontlib_FLPath */ Index: modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLFontManager.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLFontManager.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/include/org_apache_harmony_awt_gl_font_fontlib_FLFontManager.h (revision 0) @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/* + * THE FILE HAS BEEN AUTOGENERATED BY INTEL IJH TOOL. + * Please be aware that all changes made to this file manually + * will be overwritten by the tool if it runs again. + */ +#include +/* Header for class org_apache_harmony_awt_gl_font_fontlib_FLFontManager */ + +#ifndef _Included_org_apache_harmony_awt_gl_font_fontlib_FLFontManager +#define _Included_org_apache_harmony_awt_gl_font_fontlib_FLFontManager +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontManager + * Method: initManager + * Signature: (Ljava/lang/String;Ljava/lang/Class;)V + */ +JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_initManager + (JNIEnv *, jobject); + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontManager + * Method: getAllFontsNative + * Signature: ()[Ljava/awt/Font; + */ +JNIEXPORT jobjectArray JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_getAllFontsNative + (JNIEnv *, jobject); + +/* + * Class: org_apache_harmony_awt_gl_font_fontlib_FLFontManager + * Method: dispose + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_dispose + (JNIEnv *, jobject); + +JNIEXPORT jobject JNICALL Java_org_apache_harmony_awt_gl_font_fontlib_FLFontManager_addFont + (JNIEnv *, jobject, jstring, jint); + +#ifdef __cplusplus +} +#endif + +#endif /* _Included_org_apache_harmony_awt_gl_font_fontlib_FLFontManager */ Index: modules/awt/src/main/native/fontlib/shared/EncodedValue.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/EncodedValue.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/EncodedValue.h (revision 0) @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Viskov Nikolay + * @version $Revision$ + */ +#ifndef __TYPE_1_ENCODED_VALUE_CLASS_H +#define __TYPE_1_ENCODED_VALUE_CLASS_H + +class EncodedValue { +public: + EncodedValue(void); + ~EncodedValue(void); + + unsigned short number; + unsigned short length; + char* text; +}; + +#endif //__TYPE_1_ENCODED_VALUE_CLASS_H Index: modules/awt/src/main/native/fontlib/shared/Environment.cpp =================================================================== --- modules/awt/src/main/native/fontlib/shared/Environment.cpp (revision 0) +++ modules/awt/src/main/native/fontlib/shared/Environment.cpp (revision 0) @@ -0,0 +1,372 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev, Viskov Nikolay + * @version $Revision$ + */ +#include +#include +#include + +/*#ifdef WIN32 +#include +#else +#include +#endif*/ + +#include "Tables.h" +#include "Environment.h" + +static FontHeader* fhArray = NULL; + +//#ifdef WIN32 +//static bool getFonts = false;//true; +//#endif + +int Environment::_length = 0; + +FontHeader::FontHeader() +{ + _familyName = NULL; + _filePath = NULL; + _font = NULL; + _nextHeader = NULL; + _head = NULL; +} + +FontHeader::FontHeader(char** filePath, FontType fType) +{ + _filePath = *filePath; + _familyName = NULL; + _fType = fType; + _font = NULL; + _nextHeader = NULL; + _head = NULL; +} + +FontHeader::~FontHeader() +{ + //printf("now = %s , %u \n", (char *)_filePath, _fType); + delete _familyName; + delete _filePath; + //delete _font; + delete _nextHeader; +} + +bool fntType(char* font, char* type) +{ + bool ret=0; + unsigned char j=0; + + int len = (int)strlen(font); + for (int i = 0; i<=len; i++) + { + if (tolower(font[i]) == tolower(type[j])) + { + ret = 1; + j++; + } + else + { + ret = 0; + j=0; + } + } + return ret; +} + +void static inline getNewLexeme(char* str, FILE* font) { + unsigned char ch; + unsigned short count = 0; + + while (!feof(font) && ((ch = getc(font)) == ' ' || ch == '\n' || ch == '\r')) { + } + + str[count ++] = ch; + while (!feof(font) && (ch = getc(font)) != ' ' && ch != '\n' && ch != '\r') { + str[count ++] = ch; + } + + str[count] = '\0'; +} + +int static inline getT1Name(char *pathToFile,wchar_t** fontFamilyName, StyleName* style) { + + FILE *font; + char curStr[1024]; + char *ptr; + unsigned char ch; + + if( font = fopen(pathToFile, "rb")) { + + ch = getc(font); + + if (ch == 0x80 && getc(font) == 0x01) { + //isASCII = false; + } else if (ch == '%' && getc(font) == '!') { + //isASCII = true; + } else { + fclose(font); + return -1; + } + + //printf("\nstart parsing %s\n", pathToFile); + + while (!feof(font)) { + getNewLexeme(curStr, font); + if (!strcmp(curStr, "/FontInfo")) { + break; + } + } + + while (!feof(font)) { + getNewLexeme(curStr, font); + if (!strcmp(curStr, "/FamilyName")) { + + unsigned short count = 0; + + while (!feof(font) && ((ch = getc(font)) == '(')) { + } + + curStr[count ++] = ch; + while (!feof(font) && (ch = getc(font)) != ')') { + curStr[count ++] = ch; + } + + curStr[count] = '\0'; + + ptr = curStr; + + //printf("fontFamilyName = "); + ch = 0; + *fontFamilyName = new wchar_t[count + 1]; + while (*ptr != '\0') { + (*fontFamilyName)[ch ++] = *ptr; + //printf("%c", *ptr); + ptr ++; + } + + (*fontFamilyName)[ch] = L'\0'; + + //strncpy(*fontFamilyName, ptr, strlen(ptr) - 1); + //printf("fontFamilyName = %s\n", curStr); + //printf("\n"); + + } else if (!strcmp(curStr, "/Weight")) { + + getNewLexeme(curStr, font); + ptr = curStr + 1; + if (!strncmp(ptr, "Regular",7)) { + *style = Regular; + } else if (!strncmp(ptr, "Bold",4)) { + if (*style == Italic) { + *style = BoldItalic; + } else { + *style = Bold; + } + } else if (!strncmp(ptr, "Normal",6)) { + *style = Regular; + } else { + *style = Regular; + } + //printf("style = %u\n", *style); + + } else if (!strcmp(curStr, "/ItalicAngle")) { + getNewLexeme(curStr, font); + double italicAngle = atof(curStr); + if (italicAngle) { + //printf("\n%f\n",italicAngle); + if (*style == Bold) { + *style = BoldItalic; + } else { + *style = Italic; + } + } + } else if (!strcmp(curStr, "end")) { + //getNewLexeme(curStr, font); + fclose(font); + return 0; + } + } + } + + fclose(font); + + return -1; +} + +FontHeader* addFontFile(char** file, FontType ft) +{ + FILE* ttfile; + StyleName* fStyle; + int result; + + FontHeader *fh = new FontHeader(file, ft); + + switch(ft) + { + case TrueType: + ttfile = fopen(fh->_filePath,"rb"); + if (ttfile == NULL) + { + delete fh; + return NULL; + } + fStyle = new StyleName; + result = parseNameTable(ttfile, &(fh->_familyName), NULL, fStyle); + fclose(ttfile); + + if (fStyle == NULL || result == -1) + { + delete[] fStyle; + delete fh; + return NULL; + }else { + fh->_style=*fStyle; + } + + break; + case Type1: + result = getT1Name(fh->_filePath,&(fh->_familyName), &(fh->_style)); + if (result == -1) + { + delete fh; + return NULL; + } + break; + default: + return NULL; + } + + Environment::_length++; + + if (fhArray != NULL) + { + fh->_head = fhArray->_head; + fhArray->_nextHeader = fh; + fhArray = fh; + } else + { + fh->_head = fh; + fhArray = fh; + } + + return fh; +} + +/*static inline FontHeader* add( char* name, char* dir, FontType ft) +{ + int len = (int)strlen(dir); + char* fontFile = new char[len+strlen(name)+1]; + strncpy(fontFile, dir, len+1); + strcat(fontFile, name); + return addFontFile(&fontFile, ft); +}*/ + +FontHeader* Environment::addFile(char* file, FontType ft) +{ + int len = (int)strlen(file); + char* filepath = new char[len+1]; + strcpy(filepath,file); + + return addFontFile(&filepath, ft); +} + +/*int Environment::addPath(char* argPath) +{ + char* tok; + char fDir[1024]; + + char deLimits[] = " ;"; + char currentDir[1024]; + long hFile; + + char path[1024]; + strcpy(path,argPath); + + tok = strtok(path, deLimits); + while (tok != NULL) + { + strcpy(fDir,tok); + strcpy(currentDir,tok); + strcat(currentDir, "*.*"); +//printf("%s\n",currentDir); + +#ifdef WIN32 + struct _finddata_t font_file; + if( (hFile = (long)_findfirst( currentDir, &font_file )) != -1L ) +// printf("No available fonts in %s\n", currentDir); +// else + { + do { + if (fntType(font_file.name,".ttf")) + add(font_file.name, fDir, TrueType); + else if (fntType(font_file.name,".pfa")) + add(font_file.name, fDir, Type1); + else if (fntType(font_file.name,".pfb")) + add(font_file.name, fDir, Type1); + + }while( _findnext( hFile, &font_file ) == 0 ); + } + + _findclose( hFile ); +#else + glob_t globbuf; + + globbuf.gl_offs = 5; + glob(currentDir, GLOB_NOSORT, NULL, &globbuf); + + for(char** filesList = globbuf.gl_pathv; *filesList != NULL; filesList++) + { + if (fntType(*filesList,".ttf")) + addFontFile(filesList, TrueType); + else if (fntType(*filesList,".pfa")) + addFontFile(filesList, Type1); + else if (fntType(*filesList,".pfb")) + addFontFile(filesList, Type1); + } +#endif + + tok = strtok(NULL,deLimits); + } + + return 0; +}*/ + +/* Getting all installed fonts from windows and user's defined directories */ +FontHeader* Environment::getAllFonts() +{ + + /*if (getFonts) + { +#ifdef WIN32 + char* WINFONTS = "\\Fonts\\"; + char winDir[256]; + strcpy(winDir,getenv("windir")); + strcat(winDir,WINFONTS); + addPath(winDir); + +#else + //printf("adding paths...\n"); + addPath("/usr/X11R6/lib/X11/fonts/truetype/;/usr/X11R6/lib/X11/fonts/Type1/"); + //printf("paths added\n"); +#endif + getFonts = false; + } */ + + return fhArray == NULL ? NULL : fhArray->_head; +} Index: modules/awt/src/main/native/fontlib/shared/Font.cpp =================================================================== --- modules/awt/src/main/native/fontlib/shared/Font.cpp (revision 0) +++ modules/awt/src/main/native/fontlib/shared/Font.cpp (revision 0) @@ -0,0 +1,170 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev, Viskov Nikolay + * @version $Revision$ + */ +#include "Font.h" +#include "Environment.h" +#include "TTFont.h" +#include "T1Font.h" + +Font::Font() { + _famName = NULL; +} + +Font::~Font() { + for( std::map::iterator iter = _glyphMap.begin(); iter != _glyphMap.end(); iter++ ) { + delete iter->second; + } + + delete[] _famName; + + /*unsigned short famLength = wcslen((wchar_t *)_famName); + char *family = new char[famLength+1]; + + unsigned short i; + for (i = 0;i < famLength;i++) { + (family)[i] = _famName[i]; + } + (family)[i] = '\0'; + + FontHeader* fh = GraphicsEnvironment::getAllFonts()->_head; + //printf("\nfaund = -%s-\n", family); + for(int i=0; i_familyName); + if (strcmp(fh->_familyName,family)==0 && fh->_style == _style) { + fh->_font = NULL; + break; + } + + fh=fh->_nextHeader; + } + + delete[] family;*/ +} + +Glyph* Font::createGlyph(unsigned short unicode, unsigned short size){ + return NULL; +} + +wchar_t* Font::getPSName() +{ + return NULL; +} + +float* Font::getLineMetrics() +{ + return NULL; +} + +int Font::getMissingGlyphCode() +{ + return 0; +} + +bool Font::canDisplay(unsigned short c) +{ + return NULL; +} + +unsigned short Font::getUnicodeByIndex(unsigned short ind) +{ + return NULL; +} + +//unicode = 0 - default glyph +Glyph* Font::getGlyph(unsigned short unicode, unsigned short size) { + unsigned long id; + + //printf("unicode = %lu, size = %lu\n", unicode,size); + + if (!canDisplay(unicode)) { + id = (unsigned long)(size << 16); + unicode = 0; + } else { + id = (unsigned long)(size << 16) + unicode; + } + + //printf("unicode = %lu, size = %lu, id = %lu\n", unicode,size,id); + + std::map::iterator iter = _glyphMap.find(id); + if (iter != _glyphMap.end()) { +//printf("return the glyph"); + return (Glyph *)(*iter).second; + } +//printf("creation of the glyph"); + Glyph *glyph = createGlyph(unicode, size); + + _glyphMap[id] = glyph; + + return glyph; +} + +// Creation of font depending on font type +Font* createFont(char* family, StyleName sn) { + int nLen = (int) strlen(family); + wchar_t* name = new wchar_t[nLen+1]; + for (int i = 0; i <= nLen; i++) + name[i] = family[i]; + + Font* retFont = createFont(name, sn); + + delete[] name; + + return retFont; +} + +// Creation of font depending on font type +Font* createFont(wchar_t* family, StyleName sn) +{ + Font* retFont; + bool isFound = false; + + if (Environment::getAllFonts() == NULL) return NULL; + + for(FontHeader* fh = Environment::getAllFonts(); + fh != NULL; fh=fh->_nextHeader) + { + + if (wcscmp(fh->_familyName,family)==0 && fh->_style == sn) + { + + switch(fh->_fType) + { + case TrueType: + retFont = new TTFont(fh->_filePath); + fh->_font=retFont; + + break; + case Type1: + retFont = new T1Font(family,sn,fh->_filePath); + fh->_font=retFont; + + break; + } + isFound = true; + break; + } + } + if (!isFound) + { +// printf("Font not found"); + return 0; // çäåñü ïîñòàâèòü çíà÷åíèÿ ïî óìîë÷àíèþ + } + return retFont; +} Index: modules/awt/src/main/native/fontlib/shared/AGL.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/AGL.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/AGL.h (revision 0) @@ -0,0 +1,4079 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +#ifndef __TYPE_1_FL_TREE_H +#define __TYPE_1_FL_TREE_H + +static const unsigned short FONT_NOT_FOUND_UNICODE_VALUE = 0xffff; + +static const unsigned char GLYPH_LIST[64323] = { +193, 0, 65, 0, 7,248,220,194, 0, 66, 0, 14,248, 61,195, 0, + 67, 0, 21,246,122,196, 0, 68, 0, 28,244,196,197, 0, 69, 0, + 35,241,128,198, 0, 70, 0, 42,240,246,199, 0, 71, 0, 49,239, +112,200, 0, 72, 0, 56,238, 36,201, 0, 73, 0, 63,235,211,202, + 0, 74, 0, 70,235,110,203, 0, 75, 0, 77,233,199,204, 0, 76, + 0, 84,232,199,205, 0, 77, 0, 91,232, 51,206, 0, 78, 0, 98, +231, 50,207, 0, 79, 0,105,227,232,208, 0, 80, 0,112,227, 49, +209, 0, 81, 0,119,227, 11,210, 0, 82, 0,126,225,250,211, 0, + 83, 0,133,222, 57,212, 0, 84, 0,140,220,117,213, 0, 85, 0, +147,217,155,214, 0, 86, 0,154,217, 36,215, 0, 87, 0,161,216, +173,216, 0, 88, 0,168,216, 83,217, 0, 89, 0,175,214,219,218, + 0, 90, 0,182,213,141,225, 0, 97, 0,189,187,166,226, 0, 98, + 0,196,180, 60,227, 0, 99, 0,203,170,237,228, 0,100, 0,210, +161, 88,229, 0,101, 0,217,152,162,230, 0,102, 0,224,147, 56, +231, 0,103, 0,231,141, 75,232, 0,104, 0,238,132, 50,233, 0, +105, 0,245,121,161,234, 0,106, 0,252,120, 8,235, 0,107, 1, + 3,112,122,236, 0,108, 1, 10,105,224,237, 0,109, 1, 17, 97, + 63,238, 0,110, 1, 24, 88,105,239, 0,111, 1, 31, 81,145,240, + 0,112, 1, 38, 72, 21,241, 0,113, 1, 45, 67,199,242, 0,114, + 1, 52, 58, 80,243, 0,115, 1, 59, 41, 94,244, 0,116, 1, 66, + 25, 36,245, 0,117, 1, 73, 20,102,246, 0,118, 1, 80, 17,113, +247, 0,119, 1, 87, 12,104,248, 0,120, 1, 94, 11,228,249, 0, +121, 1,101, 5, 91,250, 0,122, 0, 0, 1,108, 97, 97,114,109, +101,110,105, 97,238, 5,102, 1,123, 0, 0, 97, 99,117,116,229, + 1,122, 1,134, 0, 0, 97,100,101,118,225, 9, 91, 1,145, 0, + 0, 97,103,117,114,109,117,107,104,233, 10, 91, 1,160, 0, 0, + 97,104, 97,114, 97, 98,105,227, 6, 56, 1,174, 0, 0, 97,104, +102,105,110, 97,108, 97,114, 97, 98,105,227,254,198, 1,193, 0, + 0, 97,104,105,110,105,116,105, 97,108, 97,114, 97, 98,105,227, +254,199, 1,214, 0, 0, 97,104,105,114, 97,103, 97,110,225, 48, + 86, 1,229, 0, 0, 97,104,109,101,100,105, 97,108, 97,114, 97, + 98,105,227,254,200, 1,249, 0, 0, 97,105,110, 97,114, 97, 98, +105,227, 6, 50, 2, 8, 0, 0, 97,105,110,102,105,110, 97,108, + 97,114, 97, 98,105,227,254,176, 2, 28, 0, 0, 97,107, 97,116, + 97,107, 97,110,225, 48,182, 2, 43, 0, 0, 97,113,101,102,103, + 97,100,111,108,104,101, 98,114,101,247, 5,149, 2, 64, 0, 0, + 97,113,101,102,113, 97,116, 97,110,104,101, 98,114,101,247, 5, +148, 2, 85, 0, 0, 97,114,113, 97,104,101, 98,114,101,247, 5, +152, 2,101, 0, 0, 97,121,105,238, 5,214, 2,111, 5, 55, 98, +111,112,111,109,111,102,239, 49, 23, 2,125, 0, 0, 99, 97,114, +111,238, 1,126, 2,136, 0, 0, 99,105,114, 99,108,229, 36,233, + 2,148, 0, 0, 99,105,114, 99,117,109,102,108,101,248, 30,145, + 2,164, 0, 0, 99,117,114,236, 2,145, 2,174, 0, 0,100,111, +244, 1,124, 2,183, 5, 32,101, 99,121,114,105,108,108,105,227, + 4, 55, 2,198, 0, 0,101,100,101,115, 99,101,110,100,101,114, + 99,121,114,105,108,108,105,227, 4,153, 2,222, 0, 0,101,100, +105,101,114,101,115,105,115, 99,121,114,105,108,108,105,227, 4, +223, 2,245, 0, 0,101,104,105,114, 97,103, 97,110,225, 48, 92, + 3, 4, 0, 0,101,107, 97,116, 97,107, 97,110,225, 48,188, 3, + 19, 0, 0,101,114,239, 0, 48, 3, 28, 4, 76,101,116,225, 3, +182, 3, 37, 0, 0,104, 98,111,112,111,109,111,102,239, 49, 19, + 3, 52, 0, 0,104,101, 97,114,109,101,110,105, 97,238, 5,106, + 3, 68, 0, 0,104,101, 98,114,101,118,101, 99,121,114,105,108, +108,105,227, 4,194, 3, 89, 0, 0,104,101, 99,121,114,105,108, +108,105,227, 4, 54, 3,105, 0, 0,104,101,100,101,115, 99,101, +110,100,101,114, 99,121,114,105,108,108,105,227, 4,151, 3,130, + 0, 0,104,101,100,105,101,114,101,115,105,115, 99,121,114,105, +108,108,105,227, 4,221, 3,154, 0, 0,105,104,105,114, 97,103, + 97,110,225, 48, 88, 3,169, 0, 0,105,107, 97,116, 97,107, 97, +110,225, 48,184, 3,184, 0, 0,105,110,111,114,104,101, 98,114, +101,247, 5,174, 3,200, 0, 0,108,105,110,101, 98,101,108,111, +247, 30,149, 3,215, 0, 0,109,111,110,111,115,112, 97, 99,229, +255, 90, 3,230, 0, 0,111,104,105,114, 97,103, 97,110,225, 48, + 94, 3,245, 0, 0,111,107, 97,116, 97,107, 97,110,225, 48,190, + 4, 4, 0, 0,112, 97,114,101,238, 36,181, 4, 15, 0, 0,114, +101,116,114,111,102,108,101,120,104,111,111,235, 2,144, 4, 34, + 0, 0,115,116,114,111,107,229, 1,182, 4, 46, 0, 0,117,104, +105,114, 97,103, 97,110,225, 48, 90, 4, 61, 0, 0,117,107, 97, +116, 97,107, 97,110,225, 48,186, 0, 0, 0, 0, 97,114, 97, 98, +105,227, 6, 96, 4, 88, 0, 0, 98,101,110,103, 97,108,233, 9, +230, 4,101, 0, 0,100,101,118,225, 9,102, 4,111, 0, 0,103, +117,106, 97,114, 97,116,233, 10,230, 4,125, 0, 0,103,117,114, +109,117,107,104,233, 10,102, 4,139, 0, 0,104, 97, 99,107, 97, +114, 97, 98,105,227, 6, 96, 4,155, 0, 0,105,110,102,101,114, +105,111,242, 32,128, 4,169, 0, 0,109,111,110,111,115,112, 97, + 99,229,255, 16, 4,184, 0, 0,111,108,100,115,116,121,108,229, +247, 48, 4,198, 0, 0,112,101,114,115,105, 97,238, 6,240, 4, +211, 0, 0,115,117,112,101,114,105,111,242, 32,112, 4,225, 0, + 0,116,104, 97,233, 14, 80, 4,235, 0, 0,119,105,100,116,104, +106,111,105,110,101,242,254,255, 4,252, 0, 0,119,105,100,116, +104,110,111,110,106,111,105,110,101,242, 32, 12, 5, 16, 0, 0, +119,105,100,116,104,115,112, 97, 99,229, 32, 11, 0, 0, 0, 0, + 97, 99, 99,101,110,244, 1,124, 5, 44, 0, 0, 98,101,108,111, +247, 30,147, 0, 0, 0, 0,100, 97,103,101,115,232,251, 54, 5, + 67, 5, 79,104,101, 98,114,101,247, 5,214, 0, 0, 0, 0,104, +101, 98,114,101,247,251, 54, 0, 0, 0, 0, 97, 97,100,111,115, +113,117, 97,114,229, 51, 78, 5,107, 0, 0, 97, 98,101,110,103, + 97,108,233, 9,175, 5,121, 0, 0, 97, 99,117,116,229, 0,253, + 5,132, 0, 0, 97,100,101,118,225, 9, 47, 5,143, 0, 0, 97, +101,107,111,114,101, 97,238, 49, 82, 5,157, 0, 0, 97,103,117, +106, 97,114, 97,116,233, 10,175, 5,172, 0, 0, 97,103,117,114, +109,117,107,104,233, 10, 47, 5,187, 0, 0, 97,104,105,114, 97, +103, 97,110,225, 48,132, 5,202, 0, 0, 97,107, 97,116, 97,107, + 97,110,225, 48,228, 5,217, 11,213, 97,107,111,114,101, 97,238, + 49, 81, 5,230, 0, 0, 97,109, 97,107,107, 97,110,116,104, 97, +233, 14, 78, 5,247, 0, 0, 97,115,109, 97,108,108,104,105,114, + 97,103, 97,110,225, 48,131, 6, 11, 0, 0, 97,115,109, 97,108, +108,107, 97,116, 97,107, 97,110,225, 48,227, 6, 31, 11,198, 97, +116, 99,121,114,105,108,108,105,227, 4, 99, 6, 47, 0, 0, 99, +105,114, 99,108,229, 36,232, 6, 59, 0, 0, 99,105,114, 99,117, +109,102,108,101,248, 1,119, 6, 75, 0, 0,100,105,101,114,101, +115,105,243, 0,255, 6, 89, 0, 0,100,111,116, 97, 99, 99,101, +110,244, 30,143, 6,104, 0, 0,100,111,116, 98,101,108,111,247, + 30,245, 6,118, 0, 0,101,104, 97,114, 97, 98,105,227, 6, 74, + 6,132, 0, 0,101,104, 98, 97,114,114,101,101, 97,114, 97, 98, +105,227, 6,210, 6,152, 0, 0,101,104, 98, 97,114,114,101,101, +102,105,110, 97,108, 97,114, 97, 98,105,227,251,175, 6,177, 0, + 0,101,104,102,105,110, 97,108, 97,114, 97, 98,105,227,254,242, + 6,196, 0, 0,101,104,104, 97,109,122, 97, 97, 98,111,118,101, + 97,114, 97, 98,105,227, 6, 38, 6,220, 0, 0,101,104,104, 97, +109,122, 97, 97, 98,111,118,101,102,105,110, 97,108, 97,114, 97, + 98,105,227,254,138, 6,249, 0, 0,101,104,104, 97,109,122, 97, + 97, 98,111,118,101,105,110,105,116,105, 97,108, 97,114, 97, 98, +105,227,254,139, 7, 24, 0, 0,101,104,104, 97,109,122, 97, 97, + 98,111,118,101,109,101,100,105, 97,108, 97,114, 97, 98,105,227, +254,140, 7, 54, 0, 0,101,104,105,110,105,116,105, 97,108, 97, +114, 97, 98,105,227,254,243, 7, 75, 0, 0,101,104,109,101,100, +105, 97,108, 97,114, 97, 98,105,227,254,244, 7, 95, 0, 0,101, +104,109,101,101,109,105,110,105,116,105, 97,108, 97,114, 97, 98, +105,227,252,221, 7,120, 0, 0,101,104,109,101,101,109,105,115, +111,108, 97,116,101,100, 97,114, 97, 98,105,227,252, 88, 7,146, + 0, 0,101,104,110,111,111,110,102,105,110, 97,108, 97,114, 97, + 98,105,227,252,148, 7,169, 0, 0,101,104,116,104,114,101,101, +100,111,116,115, 98,101,108,111,119, 97,114, 97, 98,105,227, 6, +209, 7,197, 0, 0,101,107,111,114,101, 97,238, 49, 86, 7,210, + 0, 0,101,238, 0,165, 7,218, 11,183,101,111,107,111,114,101, + 97,238, 49, 85, 7,232, 0, 0,101,111,114,105,110,104,105,101, +117,104,107,111,114,101, 97,238, 49,134, 7,254, 0, 0,101,114, + 97,104, 98,101,110,121,111,109,111,104,101, 98,114,101,247, 5, +170, 8, 21, 0, 0,101,114, 97,104, 98,101,110,121,111,109,111, +108,101,102,116,104,101, 98,114,101,247, 5,170, 8, 48, 0, 0, +101,114,105, 99,121,114,105,108,108,105,227, 4, 75, 8, 65, 0, + 0,101,114,117,100,105,101,114,101,115,105,115, 99,121,114,105, +108,108,105,227, 4,249, 8, 90, 0, 0,101,115,105,101,117,110, +103,107,111,114,101, 97,238, 49,129, 8,109, 0, 0,101,115,105, +101,117,110,103,112, 97,110,115,105,111,115,107,111,114,101, 97, +238, 49,131, 8,135, 0, 0,101,115,105,101,117,110,103,115,105, +111,115,107,111,114,101, 97,238, 49,130, 8,158, 0, 0,101,116, +105,118,104,101, 98,114,101,247, 5,154, 8,174, 0, 0,103,114, + 97,118,229, 30,243, 8,185, 0, 0,104,111,111,235, 1,180, 8, +195, 11,172,105, 97,114,109,101,110,105, 97,238, 5,117, 8,210, + 0, 0,105, 99,121,114,105,108,108,105,227, 4, 87, 8,225, 0, + 0,105,107,111,114,101, 97,238, 49, 98, 8,238, 0, 0,105,110, +121, 97,110,231, 38, 47, 8,250, 0, 0,105,119,110, 97,114,109, +101,110,105, 97,238, 5,130, 9, 11, 0, 0,109,111,110,111,115, +112, 97, 99,229,255, 89, 9, 26, 0, 0,111,228, 5,217, 9, 34, + 11,101,111,104,105,114, 97,103, 97,110,225, 48,136, 9, 49, 0, + 0,111,105,107,111,114,101, 97,238, 49,137, 9, 63, 0, 0,111, +107, 97,116, 97,107, 97,110,225, 48,232, 9, 78, 11, 86,111,107, +111,114,101, 97,238, 49, 91, 9, 91, 0, 0,111,115,109, 97,108, +108,104,105,114, 97,103, 97,110,225, 48,135, 9,111, 0, 0,111, +115,109, 97,108,108,107, 97,116, 97,107, 97,110,225, 48,231, 9, +131, 11, 71,111,116,103,114,101,101,235, 3,243, 9,144, 0, 0, +111,121, 97,101,107,111,114,101, 97,238, 49,136, 9,160, 0, 0, +111,121, 97,107,111,114,101, 97,238, 49,135, 9,175, 0, 0,111, +121, 97,107,116,104, 97,233, 14, 34, 9,189, 0, 0,111,121,105, +110,103,116,104, 97,233, 14, 13, 9,204, 0, 0,112, 97,114,101, +238, 36,180, 9,215, 0, 0,112,111,103,101,103,114, 97,109,109, +101,110,233, 3,122, 9,233, 11, 57,242, 1,166, 9,240, 11, 48, +115,117,112,101,114,105,111,242, 2,184, 9,254, 0, 0,116,105, +108,100,229, 30,249, 10, 9, 0, 0,116,117,114,110,101,228, 2, +142, 10, 21, 0, 0,117,104,105,114, 97,103, 97,110,225, 48,134, + 10, 36, 0, 0,117,105,107,111,114,101, 97,238, 49,140, 10, 50, + 0, 0,117,107, 97,116, 97,107, 97,110,225, 48,230, 10, 65, 11, + 33,117,107,111,114,101, 97,238, 49, 96, 10, 78, 0, 0,117,115, + 98,105,103, 99,121,114,105,108,108,105,227, 4,107, 10, 97, 0, + 0,117,115, 98,105,103,105,111,116,105,102,105,101,100, 99,121, +114,105,108,108,105,227, 4,109, 10,124, 0, 0,117,115,108,105, +116,116,108,101, 99,121,114,105,108,108,105,227, 4,103, 10,146, + 0, 0,117,115,108,105,116,116,108,101,105,111,116,105,102,105, +101,100, 99,121,114,105,108,108,105,227, 4,105, 10,176, 0, 0, +117,115,109, 97,108,108,104,105,114, 97,103, 97,110,225, 48,133, + 10,196, 0, 0,117,115,109, 97,108,108,107, 97,116, 97,107, 97, +110,225, 48,229, 10,216, 11, 18,117,121,101,107,111,114,101, 97, +238, 49,139, 10,231, 0, 0,117,121,101,111,107,111,114,101, 97, +238, 49,138, 10,247, 0, 0,121, 97, 98,101,110,103, 97,108,233, + 9,223, 11, 6, 0, 0,121, 97,100,101,118,225, 9, 95, 0, 0, + 0, 0,104, 97,108,102,119,105,100,116,232,255,109, 0, 0, 0, + 0,104, 97,108,102,119,105,100,116,232,255,149, 0, 0, 0, 0, +105,110,231, 30,153, 0, 0, 0, 0,103,114,101,101,107, 99,109, +226, 3, 69, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232, +255,110, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255, +150, 0, 0, 0, 0,100, 97,103,101,115,232,251, 57, 11,113, 11, +160,104,101, 98,114,101,247, 5,217, 11,125, 0, 0,121,111,100, +104,101, 98,114,101,247, 5,242, 11,140, 0, 0,121,111,100,112, + 97,116, 97,104,104,101, 98,114,101,247,251, 31, 0, 0, 0, 0, +104,101, 98,114,101,247,251, 57, 0, 0, 0, 0, 97, 98,111,118, +229, 30,247, 0, 0, 0, 0,109,111,110,111,115,112, 97, 99,229, +255,229, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255, +108, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255,148, + 0, 0, 0, 0, 97, 98,111,118,101, 99,109,226, 3, 61, 11,242, + 0, 0, 98,111,112,111,109,111,102,239, 49, 18, 12, 0, 0, 0, + 99,105,114, 99,108,229, 36,231, 12, 12, 0, 0,100,105,101,114, +101,115,105,243, 30,141, 12, 26, 0, 0,100,111,116, 97, 99, 99, +101,110,244, 30,139, 12, 41, 0, 0,101,104, 97,114,109,101,110, +105, 97,238, 5,109, 12, 57, 0, 0,233, 3,190, 12, 64, 0, 0, +109,111,110,111,115,112, 97, 99,229,255, 88, 12, 79, 0, 0,112, + 97,114,101,238, 36,179, 12, 90, 0, 0,115,117,112,101,114,105, +111,242, 2,227, 0, 0, 0, 0, 97, 99,117,116,229, 30,131, 12, +115, 0, 0, 97,101,107,111,114,101, 97,238, 49, 89, 12,129, 0, + 0, 97,104,105,114, 97,103, 97,110,225, 48,143, 12,144, 0, 0, + 97,107, 97,116, 97,107, 97,110,225, 48,239, 12,159, 17, 98, 97, +107,111,114,101, 97,238, 49, 88, 12,172, 0, 0, 97,115,109, 97, +108,108,104,105,114, 97,103, 97,110,225, 48,142, 12,192, 0, 0, + 97,115,109, 97,108,108,107, 97,116, 97,107, 97,110,225, 48,238, + 12,212, 0, 0, 97,116,116,111,115,113,117, 97,114,229, 51, 87, + 12,228, 0, 0, 97,118,101,100, 97,115,232, 48, 28, 12,241, 0, + 0, 97,118,121,117,110,100,101,114,115, 99,111,114,101,118,101, +114,116,105, 99, 97,236,254, 52, 13, 12, 0, 0, 97,119, 97,114, + 97, 98,105,227, 6, 72, 13, 26, 0, 0, 97,119,102,105,110, 97, +108, 97,114, 97, 98,105,227,254,238, 13, 45, 0, 0, 97,119,104, + 97,109,122, 97, 97, 98,111,118,101, 97,114, 97, 98,105,227, 6, + 36, 13, 69, 0, 0, 97,119,104, 97,109,122, 97, 97, 98,111,118, +101,102,105,110, 97,108, 97,114, 97, 98,105,227,254,134, 13, 98, + 0, 0, 98,115,113,117, 97,114,229, 51,221, 13,111, 0, 0, 99, +105,114, 99,108,229, 36,230, 13,123, 0, 0, 99,105,114, 99,117, +109,102,108,101,248, 1,117, 13,139, 0, 0,100,105,101,114,101, +115,105,243, 30,133, 13,153, 0, 0,100,111,116, 97, 99, 99,101, +110,244, 30,135, 13,168, 0, 0,100,111,116, 98,101,108,111,247, + 30,137, 13,182, 0, 0,101,104,105,114, 97,103, 97,110,225, 48, +145, 13,197, 0, 0,101,105,101,114,115,116,114, 97,115,243, 33, + 24, 13,213, 0, 0,101,107, 97,116, 97,107, 97,110,225, 48,241, + 13,228, 0, 0,101,107,111,114,101, 97,238, 49, 94, 13,241, 0, + 0,101,111,107,111,114,101, 97,238, 49, 93, 13,255, 0, 0,103, +114, 97,118,229, 30,129, 14, 10, 0, 0,104,105,116,101, 98,117, +108,108,101,244, 37,230, 14, 26, 0, 0,104,105,116,101, 99,105, +114, 99,108,229, 37,203, 14, 42, 17, 85,104,105,116,101, 99,111, +114,110,101,114, 98,114, 97, 99,107,101,116,108,101,102,244, 48, + 14, 14, 69, 17, 71,104,105,116,101, 99,111,114,110,101,114, 98, +114, 97, 99,107,101,116,114,105,103,104,244, 48, 15, 14, 97, 17, + 57,104,105,116,101,100,105, 97,109,111,110,228, 37,199, 14,114, + 17, 24,104,105,116,101,100,111,119,110,112,111,105,110,116,105, +110,103,115,109, 97,108,108,116,114,105, 97,110,103,108,229, 37, +191, 14,149, 0, 0,104,105,116,101,100,111,119,110,112,111,105, +110,116,105,110,103,116,114,105, 97,110,103,108,229, 37,189, 14, +179, 0, 0,104,105,116,101,108,101,102,116,112,111,105,110,116, +105,110,103,115,109, 97,108,108,116,114,105, 97,110,103,108,229, + 37,195, 14,214, 0, 0,104,105,116,101,108,101,102,116,112,111, +105,110,116,105,110,103,116,114,105, 97,110,103,108,229, 37,193, + 14,244, 0, 0,104,105,116,101,108,101,110,116,105, 99,117,108, + 97,114, 98,114, 97, 99,107,101,116,108,101,102,244, 48, 22, 15, + 19, 0, 0,104,105,116,101,108,101,110,116,105, 99,117,108, 97, +114, 98,114, 97, 99,107,101,116,114,105,103,104,244, 48, 23, 15, + 51, 0, 0,104,105,116,101,114,105,103,104,116,112,111,105,110, +116,105,110,103,115,109, 97,108,108,116,114,105, 97,110,103,108, +229, 37,185, 15, 87, 0, 0,104,105,116,101,114,105,103,104,116, +112,111,105,110,116,105,110,103,116,114,105, 97,110,103,108,229, + 37,183, 15,118, 0, 0,104,105,116,101,115,109, 97,108,108,115, +113,117, 97,114,229, 37,171, 15,139, 0, 0,104,105,116,101,115, +109,105,108,105,110,103,102, 97, 99,229, 38, 58, 15,160, 0, 0, +104,105,116,101,115,113,117, 97,114,229, 37,161, 15,176, 0, 0, +104,105,116,101,115,116, 97,242, 38, 6, 15,190, 0, 0,104,105, +116,101,116,101,108,101,112,104,111,110,229, 38, 15, 15,209, 0, + 0,104,105,116,101,116,111,114,116,111,105,115,101,115,104,101, +108,108, 98,114, 97, 99,107,101,116,108,101,102,244, 48, 24, 15, +243, 0, 0,104,105,116,101,116,111,114,116,111,105,115,101,115, +104,101,108,108, 98,114, 97, 99,107,101,116,114,105,103,104,244, + 48, 25, 16, 22, 0, 0,104,105,116,101,117,112,112,111,105,110, +116,105,110,103,115,109, 97,108,108,116,114,105, 97,110,103,108, +229, 37,181, 16, 55, 0, 0,104,105,116,101,117,112,112,111,105, +110,116,105,110,103,116,114,105, 97,110,103,108,229, 37,179, 16, + 83, 0, 0,105,104,105,114, 97,103, 97,110,225, 48,144, 16, 98, + 0, 0,105,107, 97,116, 97,107, 97,110,225, 48,240, 16,113, 0, + 0,105,107,111,114,101, 97,238, 49, 95, 16,126, 0, 0,109,111, +110,111,115,112, 97, 99,229,255, 87, 16,141, 0, 0,111,104,105, +114, 97,103, 97,110,225, 48,146, 16,156, 0, 0,111,107, 97,116, + 97,107, 97,110,225, 48,242, 16,171, 17, 9,111,238, 32,169, 16, +179, 16,250,111,119, 97,101,110,116,104, 97,233, 14, 39, 16,194, + 0, 0,112, 97,114,101,238, 36,178, 16,205, 0, 0,114,105,110, +231, 30,152, 16,215, 0, 0,115,117,112,101,114,105,111,242, 2, +183, 16,229, 0, 0,116,117,114,110,101,228, 2,141, 16,241, 0, + 0,121,110,238, 1,191, 0, 0, 0, 0,109,111,110,111,115,112, + 97, 99,229,255,230, 0, 0, 0, 0,104, 97,108,102,119,105,100, +116,232,255,102, 0, 0, 0, 0, 99,111,110,116, 97,105,110,105, +110,103, 98,108, 97, 99,107,115,109, 97,108,108,100,105, 97,109, +111,110,228, 37,200, 0, 0, 0, 0,118,101,114,116,105, 99, 97, +236,254, 68, 0, 0, 0, 0,118,101,114,116,105, 99, 97,236,254, + 67, 0, 0, 0, 0,105,110,118,101,114,115,229, 37,217, 0, 0, + 0, 0,104, 97,108,102,119,105,100,116,232,255,156, 0, 0, 0, + 0, 97,100,101,118,225, 9, 53, 17,124, 0, 0, 97,103,117,106, + 97,114, 97,116,233, 10,181, 17,139, 0, 0, 97,103,117,114,109, +117,107,104,233, 10, 53, 17,154, 0, 0, 97,107, 97,116, 97,107, + 97,110,225, 48,247, 17,169, 0, 0, 97,246, 5,213, 17,177, 20, + 5, 99,105,114, 99,108,229, 36,229, 17,189, 0, 0,100,111,116, + 98,101,108,111,247, 30,127, 17,203, 0, 0,101, 99,121,114,105, +108,108,105,227, 4, 50, 17,218, 0, 0,101,104, 97,114, 97, 98, +105,227, 6,164, 17,232, 0, 0,101,104,102,105,110, 97,108, 97, +114, 97, 98,105,227,251,107, 17,251, 0, 0,101,104,105,110,105, +116,105, 97,108, 97,114, 97, 98,105,227,251,108, 18, 16, 0, 0, +101,104,109,101,100,105, 97,108, 97,114, 97, 98,105,227,251,109, + 18, 36, 0, 0,101,107, 97,116, 97,107, 97,110,225, 48,249, 18, + 51, 0, 0,101,110,117,243, 38, 64, 18, 61, 0, 0,101,114,116, +105, 99, 97,108, 98, 97,242, 0,124, 18, 77, 0, 0,101,114,116, +105, 99, 97,108,108,105,110,101, 97, 98,111,118,101, 99,109,226, + 3, 13, 18,102, 0, 0,101,114,116,105, 99, 97,108,108,105,110, +101, 98,101,108,111,119, 99,109,226, 3, 41, 18,127, 0, 0,101, +114,116,105, 99, 97,108,108,105,110,101,108,111,119,109,111,228, + 2,204, 18,150, 0, 0,101,114,116,105, 99, 97,108,108,105,110, +101,109,111,228, 2,200, 18,170, 0, 0,101,119, 97,114,109,101, +110,105, 97,238, 5,126, 18,186, 0, 0,104,111,111,235, 2,139, + 18,196, 0, 0,105,107, 97,116, 97,107, 97,110,225, 48,248, 18, +211, 0, 0,105,114, 97,109, 97, 98,101,110,103, 97,108,233, 9, +205, 18,229, 0, 0,105,114, 97,109, 97,100,101,118,225, 9, 77, + 18,244, 0, 0,105,114, 97,109, 97,103,117,106, 97,114, 97,116, +233, 10,205, 19, 7, 0, 0,105,115, 97,114,103, 97, 98,101,110, +103, 97,108,233, 9,131, 19, 26, 0, 0,105,115, 97,114,103, 97, +100,101,118,225, 9, 3, 19, 42, 0, 0,105,115, 97,114,103, 97, +103,117,106, 97,114, 97,116,233, 10,131, 19, 62, 0, 0,109,111, +110,111,115,112, 97, 99,229,255, 86, 19, 77, 0, 0,111, 97,114, +109,101,110,105, 97,238, 5,120, 19, 92, 0, 0,111,105, 99,101, +100,105,116,101,114, 97,116,105,111,110,104,105,114, 97,103, 97, +110,225, 48,158, 19,120, 0, 0,111,105, 99,101,100,105,116,101, +114, 97,116,105,111,110,107, 97,116, 97,107, 97,110,225, 48,254, + 19,148, 0, 0,111,105, 99,101,100,109, 97,114,107,107, 97,110, +225, 48,155, 19,167, 19,246,111,107, 97,116, 97,107, 97,110,225, + 48,250, 19,182, 0, 0,112, 97,114,101,238, 36,177, 19,193, 0, + 0,116,105,108,100,229, 30,125, 19,204, 0, 0,116,117,114,110, +101,228, 2,140, 19,216, 0, 0,117,104,105,114, 97,103, 97,110, +225, 48,148, 19,231, 0, 0,117,107, 97,116, 97,107, 97,110,225, + 48,244, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255, +158, 0, 0, 0, 0,100, 97,103,101,115,232,251, 53, 20, 17, 20, + 82,104,101, 98,114,101,247, 5,213, 20, 29, 0, 0,104,111,108, + 97,237,251, 75, 20, 40, 20, 70,118, 97,118,104,101, 98,114,101, +247, 5,240, 20, 55, 0, 0,121,111,100,104,101, 98,114,101,247, + 5,241, 0, 0, 0, 0,104,101, 98,114,101,247,251, 75, 0, 0, + 0, 0, 54,181,251, 53, 20, 90, 0, 0,104,101, 98,114,101,247, +251, 53, 0, 0, 0, 0, 97, 99,117,116,229, 0,250, 20,113, 0, + 0, 98, 97,242, 2,137, 20,122, 0, 0, 98,101,110,103, 97,108, +233, 9,137, 20,135, 0, 0, 98,111,112,111,109,111,102,239, 49, + 40, 20,149, 0, 0, 98,114,101,118,229, 1,109, 20,160, 0, 0, + 99, 97,114,111,238, 1,212, 20,171, 0, 0, 99,105,114, 99,108, +229, 36,228, 20,183, 0, 0, 99,105,114, 99,117,109,102,108,101, +248, 0,251, 20,199, 25, 25, 99,121,114,105,108,108,105,227, 4, + 67, 20,213, 0, 0,100, 97,116,116, 97,100,101,118,225, 9, 81, + 20,228, 0, 0,100, 98,108, 97, 99,117,116,229, 1,113, 20,242, + 0, 0,100, 98,108,103,114, 97,118,229, 2, 21, 21, 0, 0, 0, +100,101,118,225, 9, 9, 21, 10, 0, 0,100,105,101,114,101,115, +105,243, 0,252, 21, 24, 24,211,100,111,116, 98,101,108,111,247, + 30,229, 21, 38, 0, 0,103,114, 97,118,229, 0,249, 21, 49, 0, + 0,103,117,106, 97,114, 97,116,233, 10,137, 21, 63, 0, 0,103, +117,114,109,117,107,104,233, 10, 9, 21, 77, 0, 0,104,105,114, + 97,103, 97,110,225, 48, 70, 21, 91, 0, 0,104,111,111,107, 97, + 98,111,118,229, 30,231, 21,106, 0, 0,104,111,114,238, 1,176, + 21,116, 24,149,104,117,110,103, 97,114,117,109,108, 97,117,244, + 1,113, 21,134, 24,135,105,110,118,101,114,116,101,100, 98,114, +101,118,229, 2, 23, 21,153, 0, 0,107, 97,116, 97,107, 97,110, +225, 48,166, 21,167, 24,120,107, 99,121,114,105,108,108,105,227, + 4,121, 21,182, 0, 0,107,111,114,101, 97,238, 49, 92, 21,194, + 0, 0,109, 97, 99,114,111,238, 1,107, 21,206, 24, 92,109, 97, +116,114, 97,103,117,114,109,117,107,104,233, 10, 65, 21,225, 0, + 0,109,111,110,111,115,112, 97, 99,229,255, 85, 21,240, 0, 0, +110,100,101,114,115, 99,111,114,229, 0, 95, 21,255, 24, 44,110, +105,111,238, 34, 42, 22, 9, 0, 0,110,105,118,101,114,115, 97, +236, 34, 0, 22, 23, 0, 0,111,103,111,110,101,235, 1,115, 22, + 35, 0, 0,112, 97,114,101,238, 36,176, 22, 46, 0, 0,112, 98, +108,111, 99,235, 37,128, 22, 58, 0, 0,112,112,101,114,100,111, +116,104,101, 98,114,101,247, 5,196, 22, 77, 0, 0,112,115,105, +108,111,238, 3,197, 22, 89, 23,253,112,116, 97, 99,107, 98,101, +108,111,119, 99,109,226, 3, 29, 22,108, 0, 0,112,116, 97, 99, +107,109,111,228, 2,212, 22,122, 0, 0,114, 97,103,117,114,109, +117,107,104,233, 10,115, 22,138, 0, 0,114,105,110,231, 1,111, + 22,148, 0, 0,115,104,111,114,116, 99,121,114,105,108,108,105, +227, 4, 94, 22,167, 0, 0,115,109, 97,108,108,104,105,114, 97, +103, 97,110,225, 48, 69, 22,186, 0, 0,115,109, 97,108,108,107, + 97,116, 97,107, 97,110,225, 48,165, 22,205, 23,238,115,116,114, + 97,105,103,104,116, 99,121,114,105,108,108,105,227, 4,175, 22, +227, 0, 0,115,116,114, 97,105,103,104,116,115,116,114,111,107, +101, 99,121,114,105,108,108,105,227, 4,177, 22,255, 0, 0,116, +105,108,100,229, 1,105, 23, 10, 23,216,117, 98,101,110,103, 97, +108,233, 9,138, 23, 24, 0, 0,117,100,101,118,225, 9, 10, 23, + 35, 0, 0,117,103,117,106, 97,114, 97,116,233, 10,138, 23, 50, + 0, 0,117,103,117,114,109,117,107,104,233, 10, 10, 23, 65, 0, + 0,117,109, 97,116,114, 97,103,117,114,109,117,107,104,233, 10, + 66, 23, 85, 0, 0,117,118,111,119,101,108,115,105,103,110, 98, +101,110,103, 97,108,233, 9,194, 23,108, 0, 0,117,118,111,119, +101,108,115,105,103,110,100,101,118,225, 9, 66, 23,128, 0, 0, +117,118,111,119,101,108,115,105,103,110,103,117,106, 97,114, 97, +116,233, 10,194, 23,152, 0, 0,118,111,119,101,108,115,105,103, +110, 98,101,110,103, 97,108,233, 9,193, 23,174, 0, 0,118,111, +119,101,108,115,105,103,110,100,101,118,225, 9, 65, 23,193, 0, + 0,118,111,119,101,108,115,105,103,110,103,117,106, 97,114, 97, +116,233, 10,193, 0, 0, 0, 0, 97, 99,117,116,229, 30,121, 23, +227, 0, 0, 98,101,108,111,247, 30,117, 0, 0, 0, 0,104, 97, +108,102,119,105,100,116,232,255,105, 0, 0, 0, 0,100,105,101, +114,101,115,105,243, 3,203, 24, 11, 24, 33,108, 97,116,105,238, + 2,138, 24, 22, 0, 0,116,111,110,111,243, 3,205, 0, 0, 0, + 0,116,111,110,111,243, 3,176, 0, 0, 0, 0,100, 98,236, 32, + 23, 24, 53, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 63, + 24, 68, 0, 0,118,101,114,116,105, 99, 97,236,254, 51, 24, 82, + 0, 0,119, 97,118,249,254, 79, 0, 0, 0, 0, 99,121,114,105, +108,108,105,227, 4,239, 24,106, 0, 0,100,105,101,114,101,115, +105,243, 30,123, 0, 0, 0, 0,104, 97,108,102,119,105,100,116, +232,255,115, 0, 0, 0, 0, 99,121,114,105,108,108,105,227, 4, +243, 0, 0, 0, 0, 97, 99,117,116,229, 30,233, 24,160, 0, 0, +100,111,116, 98,101,108,111,247, 30,241, 24,174, 0, 0,103,114, + 97,118,229, 30,235, 24,185, 0, 0,104,111,111,107, 97, 98,111, +118,229, 30,237, 24,200, 0, 0,116,105,108,100,229, 30,239, 0, + 0, 0, 0, 97, 99,117,116,229, 1,216, 24,222, 0, 0, 98,101, +108,111,247, 30,115, 24,233, 0, 0, 99, 97,114,111,238, 1,218, + 24,244, 0, 0, 99,121,114,105,108,108,105,227, 4,241, 25, 2, + 0, 0,103,114, 97,118,229, 1,220, 25, 13, 0, 0,109, 97, 99, +114,111,238, 1,214, 0, 0, 0, 0, 98,101,108,111,247, 30,119, + 0, 0, 0, 0, 97, 98,101,110,103, 97,108,233, 9,164, 25, 50, + 0, 0, 97, 99,107,100,111,119,238, 34,164, 25, 63, 0, 0, 97, + 99,107,108,101,102,244, 34,163, 25, 76, 0, 0, 97,100,101,118, +225, 9, 36, 25, 87, 0, 0, 97,103,117,106, 97,114, 97,116,233, + 10,164, 25,102, 0, 0, 97,103,117,114,109,117,107,104,233, 10, + 36, 25,117, 0, 0, 97,104, 97,114, 97, 98,105,227, 6, 55, 25, +131, 0, 0, 97,104,102,105,110, 97,108, 97,114, 97, 98,105,227, +254,194, 25,150, 0, 0, 97,104,105,110,105,116,105, 97,108, 97, +114, 97, 98,105,227,254,195, 25,171, 0, 0, 97,104,105,114, 97, +103, 97,110,225, 48, 95, 25,186, 0, 0, 97,104,109,101,100,105, + 97,108, 97,114, 97, 98,105,227,254,196, 25,206, 0, 0, 97,105, +115,121,111,117,101,114, 97,115,113,117, 97,114,229, 51,125, 25, +227, 0, 0, 97,107, 97,116, 97,107, 97,110,225, 48,191, 25,242, + 41, 79, 97,116,119,101,101,108, 97,114, 97, 98,105,227, 6, 64, + 26, 4, 0, 0, 97,245, 3,196, 26, 12, 0, 0, 97,246, 5,234, + 26, 20, 41, 37, 98, 97,242, 1,103, 26, 29, 0, 0, 98,111,112, +111,109,111,102,239, 49, 10, 26, 43, 0, 0, 99, 97,114,111,238, + 1,101, 26, 54, 0, 0, 99, 99,117,114,236, 2,168, 26, 65, 0, + 0, 99,101,100,105,108,108,225, 1, 99, 26, 78, 0, 0, 99,104, +101,104, 97,114, 97, 98,105,227, 6,134, 26, 94, 0, 0, 99,104, +101,104,102,105,110, 97,108, 97,114, 97, 98,105,227,251,123, 26, +115, 0, 0, 99,104,101,104,105,110,105,116,105, 97,108, 97,114, + 97, 98,105,227,251,124, 26,138, 0, 0, 99,104,101,104,109,101, +100,105, 97,108, 97,114, 97, 98,105,227,251,125, 26,160, 0, 0, + 99,104,101,104,109,101,101,109,105,110,105,116,105, 97,108, 97, +114, 97, 98,105,227,251,124, 26,187, 0, 0, 99,105,114, 99,108, +229, 36,227, 26,199, 0, 0, 99,105,114, 99,117,109,102,108,101, +120, 98,101,108,111,247, 30,113, 26,220, 0, 0, 99,111,109,109, + 97, 97, 99, 99,101,110,244, 1, 99, 26,237, 0, 0,100,105,101, +114,101,115,105,243, 30,151, 26,251, 0, 0,100,111,116, 97, 99, + 99,101,110,244, 30,107, 27, 10, 0, 0,100,111,116, 98,101,108, +111,247, 30,109, 27, 24, 0, 0,101, 99,121,114,105,108,108,105, +227, 4, 66, 27, 39, 0, 0,101,100,101,115, 99,101,110,100,101, +114, 99,121,114,105,108,108,105,227, 4,173, 27, 63, 0, 0,101, +104, 97,114, 97, 98,105,227, 6, 42, 27, 77, 0, 0,101,104,102, +105,110, 97,108, 97,114, 97, 98,105,227,254,150, 27, 96, 0, 0, +101,104,104, 97,104,105,110,105,116,105, 97,108, 97,114, 97, 98, +105,227,252,162, 27,120, 0, 0,101,104,104, 97,104,105,115,111, +108, 97,116,101,100, 97,114, 97, 98,105,227,252, 12, 27,145, 0, + 0,101,104,105,110,105,116,105, 97,108, 97,114, 97, 98,105,227, +254,151, 27,166, 0, 0,101,104,105,114, 97,103, 97,110,225, 48, +102, 27,181, 0, 0,101,104,106,101,101,109,105,110,105,116,105, + 97,108, 97,114, 97, 98,105,227,252,161, 27,206, 0, 0,101,104, +106,101,101,109,105,115,111,108, 97,116,101,100, 97,114, 97, 98, +105,227,252, 11, 27,232, 0, 0,101,104,109, 97,114, 98,117,116, + 97, 97,114, 97, 98,105,227, 6, 41, 27,253, 0, 0,101,104,109, + 97,114, 98,117,116, 97,102,105,110, 97,108, 97,114, 97, 98,105, +227,254,148, 28, 23, 0, 0,101,104,109,101,100,105, 97,108, 97, +114, 97, 98,105,227,254,152, 28, 43, 0, 0,101,104,109,101,101, +109,105,110,105,116,105, 97,108, 97,114, 97, 98,105,227,252,164, + 28, 68, 0, 0,101,104,109,101,101,109,105,115,111,108, 97,116, +101,100, 97,114, 97, 98,105,227,252, 14, 28, 94, 0, 0,101,104, +110,111,111,110,102,105,110, 97,108, 97,114, 97, 98,105,227,252, +115, 28,117, 0, 0,101,107, 97,116, 97,107, 97,110,225, 48,198, + 28,132, 41, 22,101,108,101,112,104,111,110,229, 33, 33, 28,146, + 41, 11,101,108,105,115,104, 97,103,101,100,111,108, 97,104,101, + 98,114,101,247, 5,160, 28,170, 0, 0,101,108,105,115,104, 97, +113,101,116, 97,110, 97,104,101, 98,114,101,247, 5,169, 28,194, + 0, 0,101,110, 99,105,114, 99,108,229, 36,105, 28,208, 0, 0, +101,110,105,100,101,111,103,114, 97,112,104,105, 99,112, 97,114, +101,238, 50, 41, 28,232, 0, 0,101,110,112, 97,114,101,238, 36, +125, 28,245, 0, 0,101,110,112,101,114,105,111,228, 36,145, 29, + 3, 0, 0,101,110,114,111,109, 97,238, 33,121, 29, 16, 0, 0, +101,115,232, 2,167, 29, 25, 0, 0,101,244, 5,216, 29, 33, 40, +215,101,118,105,114,104,101, 98,114,101,247, 5,155, 29, 49, 0, + 0,101,118,105,114,108,101,102,116,104,101, 98,114,101,247, 5, +155, 29, 69, 0, 0,104, 97, 98,101,110,103, 97,108,233, 9,165, + 29, 84, 0, 0,104, 97,100,101,118,225, 9, 37, 29, 96, 0, 0, +104, 97,103,117,106, 97,114, 97,116,233, 10,165, 29,112, 0, 0, +104, 97,103,117,114,109,117,107,104,233, 10, 37, 29,128, 0, 0, +104, 97,108, 97,114, 97, 98,105,227, 6, 48, 29,143, 0, 0,104, + 97,108,102,105,110, 97,108, 97,114, 97, 98,105,227,254,172, 29, +163, 0, 0,104, 97,110,116,104, 97,107,104, 97,116,108,111,119, +108,101,102,116,116,104, 97,233,248,152, 29,190, 0, 0,104, 97, +110,116,104, 97,107,104, 97,116,108,111,119,114,105,103,104,116, +116,104, 97,233,248,151, 29,218, 0, 0,104, 97,110,116,104, 97, +107,104, 97,116,116,104, 97,233, 14, 76, 29,238, 0, 0,104, 97, +110,116,104, 97,107,104, 97,116,117,112,112,101,114,108,101,102, +116,116,104, 97,233,248,150, 30, 11, 0, 0,104,101,104, 97,114, + 97, 98,105,227, 6, 43, 30, 26, 0, 0,104,101,104,102,105,110, + 97,108, 97,114, 97, 98,105,227,254,154, 30, 46, 0, 0,104,101, +104,105,110,105,116,105, 97,108, 97,114, 97, 98,105,227,254,155, + 30, 68, 0, 0,104,101,104,109,101,100,105, 97,108, 97,114, 97, + 98,105,227,254,156, 30, 89, 0, 0,104,101,114,101,101,120,105, +115,116,243, 34, 3, 30,105, 0, 0,104,101,114,101,102,111,114, +229, 34, 52, 30,119, 0, 0,104,101,116,225, 3,184, 30,129, 40, +191,104,105,101,117,116,104, 97, 99,105,114, 99,108,101,107,111, +114,101, 97,238, 50,121, 30,154, 0, 0,104,105,101,117,116,104, + 97,112, 97,114,101,110,107,111,114,101, 97,238, 50, 25, 30,178, + 0, 0,104,105,101,117,116,104, 99,105,114, 99,108,101,107,111, +114,101, 97,238, 50,107, 30,202, 0, 0,104,105,101,117,116,104, +107,111,114,101, 97,238, 49, 76, 30,220, 0, 0,104,105,101,117, +116,104,112, 97,114,101,110,107,111,114,101, 97,238, 50, 11, 30, +243, 0, 0,104,105,114,116,101,101,110, 99,105,114, 99,108,229, + 36,108, 31, 6, 0, 0,104,105,114,116,101,101,110,112, 97,114, +101,238, 36,128, 31, 24, 0, 0,104,105,114,116,101,101,110,112, +101,114,105,111,228, 36,148, 31, 43, 0, 0,104,111,110, 97,110, +103,109,111,110,116,104,111,116,104, 97,233, 14, 17, 31, 65, 0, + 0,104,111,111,235, 1,173, 31, 75, 0, 0,104,111,112,104,117, +116,104, 97,111,116,104, 97,233, 14, 18, 31, 94, 0, 0,104,111, +114,238, 0,254, 31,104, 0, 0,104,111,116,104, 97,104, 97,110, +116,104, 97,233, 14, 23, 31,122, 0, 0,104,111,116,104, 97,110, +116,104, 97,233, 14, 16, 31,138, 0, 0,104,111,116,104,111,110, +103,116,104, 97,233, 14, 24, 31,155, 0, 0,104,111,116,104,117, +110,103,116,104, 97,233, 14, 22, 31,172, 0, 0,104,111,117,115, + 97,110,100, 99,121,114,105,108,108,105,227, 4,130, 31,193, 0, + 0,104,111,117,115, 97,110,100,115,115,101,112, 97,114, 97,116, +111,114, 97,114, 97, 98,105,227, 6,108, 31,222, 0, 0,104,111, +117,115, 97,110,100,115,115,101,112, 97,114, 97,116,111,114,112, +101,114,115,105, 97,238, 6,108, 31,252, 0, 0,104,114,101,229, + 0, 51, 32, 6, 39,123,104,122,115,113,117, 97,114,229, 51,148, + 32, 20, 0, 0,105,104,105,114, 97,103, 97,110,225, 48, 97, 32, + 35, 0, 0,105,107, 97,116, 97,107, 97,110,225, 48,193, 32, 50, + 39,108,105,107,101,117,116, 97, 99,105,114, 99,108,101,107,111, +114,101, 97,238, 50,112, 32, 74, 0, 0,105,107,101,117,116, 97, +112, 97,114,101,110,107,111,114,101, 97,238, 50, 16, 32, 97, 0, + 0,105,107,101,117,116, 99,105,114, 99,108,101,107,111,114,101, + 97,238, 50, 98, 32,120, 0, 0,105,107,101,117,116,107,111,114, +101, 97,238, 49, 55, 32,137, 0, 0,105,107,101,117,116,112, 97, +114,101,110,107,111,114,101, 97,238, 50, 2, 32,159, 0, 0,105, +108,100,229, 2,220, 32,169, 39, 13,105,109,101,115, 99,105,114, + 99,108,229, 34,151, 32,185, 0, 0,105,112,101,104, 97,104,101, + 98,114,101,247, 5,150, 32,202, 0, 0,105,112,101,104, 97,108, +101,102,116,104,101, 98,114,101,247, 5,150, 32,223, 0, 0,105, +112,112,105,103,117,114,109,117,107,104,233, 10,112, 32,241, 0, + 0,105,116,108,111, 99,121,114,105,108,108,105, 99, 99,109,226, + 4,131, 33, 6, 0, 0,105,119,110, 97,114,109,101,110,105, 97, +238, 5,127, 33, 23, 0, 0,108,105,110,101, 98,101,108,111,247, + 30,111, 33, 38, 0, 0,109,111,110,111,115,112, 97, 99,229,255, + 84, 33, 53, 0, 0,111, 97,114,109,101,110,105, 97,238, 5,105, + 33, 68, 0, 0,111,104,105,114, 97,103, 97,110,225, 48,104, 33, + 83, 0, 0,111,107, 97,116, 97,107, 97,110,225, 48,200, 33, 98, + 38,254,111,110,101, 98, 97,114,101,120,116,114, 97,104,105,103, +104,109,111,228, 2,229, 33,122, 0, 0,111,110,101, 98, 97,114, +101,120,116,114, 97,108,111,119,109,111,228, 2,233, 33,145, 0, + 0,111,110,101, 98, 97,114,104,105,103,104,109,111,228, 2,230, + 33,164, 0, 0,111,110,101, 98, 97,114,108,111,119,109,111,228, + 2,232, 33,182, 0, 0,111,110,101, 98, 97,114,109,105,100,109, +111,228, 2,231, 33,200, 0, 0,111,110,101,102,105,118,229, 1, +189, 33,213, 0, 0,111,110,101,115,105,248, 1,133, 33,225, 0, + 0,111,110,101,116,119,239, 1,168, 33,237, 0, 0,111,110,111, +243, 3,132, 33,247, 0, 0,111,110,115,113,117, 97,114,229, 51, + 39, 34, 5, 0, 0,111,112, 97,116, 97,107,116,104, 97,233, 14, + 15, 34, 21, 0, 0,111,114,116,111,105,115,101,115,104,101,108, +108, 98,114, 97, 99,107,101,116,108,101,102,244, 48, 20, 34, 50, + 38,229,111,114,116,111,105,115,101,115,104,101,108,108, 98,114, + 97, 99,107,101,116,114,105,103,104,244, 48, 21, 34, 80, 38,204, +111,116, 97,111,116,104, 97,233, 14, 21, 34, 94, 0, 0,112, 97, +108, 97,116, 97,108,104,111,111,235, 1,171, 34,111, 0, 0,112, + 97,114,101,238, 36,175, 34,122, 0, 0,114, 97,100,101,109, 97, +114,235, 33, 34, 34,136, 38,183,114,101,116,114,111,102,108,101, +120,104,111,111,235, 2,136, 34,155, 0, 0,114,105, 97,103,100, +238, 37,188, 34,167, 0, 0,114,105, 97,103,108,230, 37,196, 34, +179, 0, 0,114,105, 97,103,114,244, 37,186, 34,191, 0, 0,114, +105, 97,103,117,240, 37,178, 34,203, 0, 0,243, 2,166, 34,210, + 37,252,116, 97, 98,101,110,103, 97,108,233, 9,159, 34,225, 0, + 0,116, 97,100,101,118,225, 9, 31, 34,237, 0, 0,116, 97,103, +117,106, 97,114, 97,116,233, 10,159, 34,253, 0, 0,116, 97,103, +117,114,109,117,107,104,233, 10, 31, 35, 13, 0, 0,116,101,104, + 97,114, 97, 98,105,227, 6,121, 35, 28, 0, 0,116,101,104,102, +105,110, 97,108, 97,114, 97, 98,105,227,251,103, 35, 48, 0, 0, +116,101,104,105,110,105,116,105, 97,108, 97,114, 97, 98,105,227, +251,104, 35, 70, 0, 0,116,101,104,109,101,100,105, 97,108, 97, +114, 97, 98,105,227,251,105, 35, 91, 0, 0,116,104, 97, 98,101, +110,103, 97,108,233, 9,160, 35,107, 0, 0,116,104, 97,100,101, +118,225, 9, 32, 35,120, 0, 0,116,104, 97,103,117,106, 97,114, + 97,116,233, 10,160, 35,137, 0, 0,116,104, 97,103,117,114,109, +117,107,104,233, 10, 32, 35,154, 0, 0,116,117,114,110,101,228, + 2,135, 35,166, 0, 0,117,104,105,114, 97,103, 97,110,225, 48, +100, 35,181, 0, 0,117,107, 97,116, 97,107, 97,110,225, 48,196, + 35,196, 37,237,117,115,109, 97,108,108,104,105,114, 97,103, 97, +110,225, 48, 99, 35,216, 0, 0,117,115,109, 97,108,108,107, 97, +116, 97,107, 97,110,225, 48,195, 35,236, 37,222,119,101,108,118, +101, 99,105,114, 99,108,229, 36,107, 35,253, 0, 0,119,101,108, +118,101,112, 97,114,101,238, 36,127, 36, 13, 0, 0,119,101,108, +118,101,112,101,114,105,111,228, 36,147, 36, 30, 0, 0,119,101, +108,118,101,114,111,109, 97,238, 33,123, 36, 46, 0, 0,119,101, +110,116,121, 99,105,114, 99,108,229, 36,115, 36, 63, 0, 0,119, +101,110,116,121,104, 97,110,103,122,104,111,245, 83, 68, 36, 82, + 0, 0,119,101,110,116,121,112, 97,114,101,238, 36,135, 36, 98, + 0, 0,119,101,110,116,121,112,101,114,105,111,228, 36,155, 36, +115, 0, 0,119,239, 0, 50, 0, 0, 36,123, 97,114, 97, 98,105, +227, 6, 98, 36,135, 0, 0, 98,101,110,103, 97,108,233, 9,232, + 36,148, 0, 0, 99,105,114, 99,108,229, 36, 97, 36,160, 37,200, +100,101,118,225, 9,104, 36,170, 0, 0,100,111,116,101,110,108, +101, 97,100,101,242, 32, 37, 36,187, 0, 0,100,111,116,108,101, + 97,100,101,242, 32, 37, 36,202, 37,186,103,117,106, 97,114, 97, +116,233, 10,232, 36,216, 0, 0,103,117,114,109,117,107,104,233, + 10,104, 36,230, 0, 0,104, 97, 99,107, 97,114, 97, 98,105,227, + 6, 98, 36,246, 0, 0,104, 97,110,103,122,104,111,245, 48, 34, + 37, 4, 0, 0,105,100,101,111,103,114, 97,112,104,105, 99,112, + 97,114,101,238, 50, 33, 37, 26, 0, 0,105,110,102,101,114,105, +111,242, 32,130, 37, 40, 0, 0,109,111,110,111,115,112, 97, 99, +229,255, 18, 37, 55, 0, 0,110,117,109,101,114, 97,116,111,114, + 98,101,110,103, 97,108,233, 9,245, 37, 77, 0, 0,111,108,100, +115,116,121,108,229,247, 50, 37, 91, 0, 0,112, 97,114,101,238, + 36,117, 37,102, 0, 0,112,101,114,105,111,228, 36,137, 37,114, + 0, 0,112,101,114,115,105, 97,238, 6,242, 37,127, 0, 0,114, +111,109, 97,238, 33,113, 37,138, 0, 0,115,116,114,111,107,229, + 1,187, 37,150, 0, 0,115,117,112,101,114,105,111,242, 0,178, + 37,164, 0, 0,116,104, 97,233, 14, 82, 37,174, 0, 0,116,104, +105,114,100,243, 33, 84, 0, 0, 0, 0,118,101,114,116,105, 99, + 97,236,254, 48, 0, 0, 0, 0,105,110,118,101,114,115,101,115, + 97,110,115,115,101,114,105,230, 39,139, 0, 0, 0, 0,104, 97, +108,102,119,105,100,116,232,255,111, 0, 0, 0, 0,104, 97,108, +102,119,105,100,116,232,255,130, 0, 0, 0, 0, 97,100,233, 5, +230, 38, 5, 38,147,101, 99,121,114,105,108,108,105,227, 4, 70, + 38, 20, 0, 0,101,114,229, 5,181, 38, 29, 38, 58,104,101, 99, +121,114,105,108,108,105,227, 4, 91, 38, 45, 0, 0,117,112,101, +114,105,111,242,246,243, 0, 0, 0, 0, 49,178, 5,181, 38, 66, + 0, 0, 49,229, 5,181, 38, 74, 0, 0, 50,226, 5,181, 38, 82, + 0, 0,104,101, 98,114,101,247, 5,181, 38, 94, 0, 0,110, 97, +114,114,111,119,104,101, 98,114,101,247, 5,181, 38,112, 0, 0, +113,117, 97,114,116,101,114,104,101, 98,114,101,247, 5,181, 38, +131, 0, 0,119,105,100,101,104,101, 98,114,101,247, 5,181, 0, + 0, 0, 0,100, 97,103,101,115,232,251, 70, 38,159, 38,171,104, +101, 98,114,101,247, 5,230, 0, 0, 0, 0,104,101, 98,114,101, +247,251, 70, 0, 0, 0, 0,115, 97,110,243,248,234, 38,193, 0, + 0,115,101,114,105,230,246,219, 0, 0, 0, 0,115,109, 97,108, +236,254, 94, 38,215, 0, 0,118,101,114,116,105, 99, 97,236,254, + 58, 0, 0, 0, 0,115,109, 97,108,236,254, 93, 38,240, 0, 0, +118,101,114,116,105, 99, 97,236,254, 57, 0, 0, 0, 0,104, 97, +108,102,119,105,100,116,232,255,132, 0, 0, 0, 0, 98,101,108, +111,119, 99,109,226, 3, 48, 39, 27, 0, 0, 99,109,226, 3, 3, + 39, 36, 0, 0, 99,111,109,226, 3, 3, 39, 46, 0, 0,100,111, +117, 98,108,101, 99,109,226, 3, 96, 39, 61, 0, 0,111,112,101, +114, 97,116,111,242, 34, 60, 39, 75, 0, 0,111,118,101,114,108, + 97,121, 99,109,226, 3, 52, 39, 91, 0, 0,118,101,114,116,105, + 99, 97,108, 99,109,226, 3, 62, 0, 0, 0, 0,104, 97,108,102, +119,105,100,116,232,255,129, 0, 0, 0, 0, 97,114, 97, 98,105, +227, 6, 99, 39,135, 0, 0, 98,101,110,103, 97,108,233, 9,233, + 39,148, 0, 0, 99,105,114, 99,108,229, 36, 98, 39,160, 40,169, +100,101,118,225, 9,105, 39,170, 0, 0,101,105,103,104,116,104, +243, 33, 92, 39,183, 0, 0,103,117,106, 97,114, 97,116,233, 10, +233, 39,197, 0, 0,103,117,114,109,117,107,104,233, 10,105, 39, +211, 0, 0,104, 97, 99,107, 97,114, 97, 98,105,227, 6, 99, 39, +227, 0, 0,104, 97,110,103,122,104,111,245, 48, 35, 39,241, 0, + 0,105,100,101,111,103,114, 97,112,104,105, 99,112, 97,114,101, +238, 50, 34, 40, 7, 0, 0,105,110,102,101,114,105,111,242, 32, +131, 40, 21, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 19, + 40, 36, 0, 0,110,117,109,101,114, 97,116,111,114, 98,101,110, +103, 97,108,233, 9,246, 40, 58, 0, 0,111,108,100,115,116,121, +108,229,247, 51, 40, 72, 0, 0,112, 97,114,101,238, 36,118, 40, + 83, 0, 0,112,101,114,105,111,228, 36,138, 40, 95, 0, 0,112, +101,114,115,105, 97,238, 6,243, 40,108, 0, 0,113,117, 97,114, +116,101,114,243, 0,190, 40,122, 40,157,114,111,109, 97,238, 33, +114, 40,133, 0, 0,115,117,112,101,114,105,111,242, 0,179, 40, +147, 0, 0,116,104, 97,233, 14, 83, 0, 0, 0, 0,101,109,100, + 97,115,232,246,222, 0, 0, 0, 0,105,110,118,101,114,115,101, +115, 97,110,115,115,101,114,105,230, 39,140, 0, 0, 0, 0,177, + 3,209, 40,198, 0, 0,115,121,109, 98,111,108,103,114,101,101, +235, 3,209, 0, 0, 0, 0,100, 97,103,101,115,232,251, 56, 40, +227, 40,255,104,101, 98,114,101,247, 5,216, 40,239, 0, 0,115, +101, 99,121,114,105,108,108,105,227, 4,181, 0, 0, 0, 0,104, +101, 98,114,101,247,251, 56, 0, 0, 0, 0, 98,108, 97, 99,235, + 38, 14, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255, +131, 0, 0, 0, 0,100, 97,103,101,243,251, 74, 41, 48, 41, 60, +104,101, 98,114,101,247, 5,234, 0, 0, 0, 0,232,251, 74, 0, + 0, 41, 67,104,101, 98,114,101,247,251, 74, 0, 0, 0, 0,104, + 97,108,102,119,105,100,116,232,255,128, 0, 0, 0, 0, 97, 98, +101,110,103, 97,108,233, 9,184, 41,108, 0, 0, 97, 99,117,116, +229, 1, 91, 41,119, 58, 65, 97,100, 97,114, 97, 98,105,227, 6, + 53, 41,133, 0, 0, 97,100,101,118,225, 9, 56, 41,144, 0, 0, + 97,100,102,105,110, 97,108, 97,114, 97, 98,105,227,254,186, 41, +163, 0, 0, 97,100,105,110,105,116,105, 97,108, 97,114, 97, 98, +105,227,254,187, 41,184, 0, 0, 97,100,109,101,100,105, 97,108, + 97,114, 97, 98,105,227,254,188, 41,204, 0, 0, 97,103,117,106, + 97,114, 97,116,233, 10,184, 41,219, 0, 0, 97,103,117,114,109, +117,107,104,233, 10, 56, 41,234, 0, 0, 97,104,105,114, 97,103, + 97,110,225, 48, 85, 41,249, 0, 0, 97,107, 97,116, 97,107, 97, +110,225, 48,181, 42, 8, 58, 50, 97,108,108, 97,108,108, 97,104, +111,117, 97,108, 97,121,104,101,119, 97,115, 97,108,108, 97,109, + 97,114, 97, 98,105,227,253,250, 42, 44, 0, 0, 97,109,101,107, +232, 5,225, 42, 55, 58, 14, 97,114, 97, 97, 97,116,104, 97,233, + 14, 50, 42, 70, 0, 0, 97,114, 97, 97,101,116,104, 97,233, 14, + 65, 42, 85, 0, 0, 97,114, 97, 97,105,109, 97,105,109, 97,108, + 97,105,116,104, 97,233, 14, 68, 42,108, 0, 0, 97,114, 97, 97, +105,109, 97,105,109,117, 97,110,116,104, 97,233, 14, 67, 42,130, + 0, 0, 97,114, 97, 97,109,116,104, 97,233, 14, 51, 42,145, 0, + 0, 97,114, 97, 97,116,104, 97,233, 14, 48, 42,159, 0, 0, 97, +114, 97,101,116,104, 97,233, 14, 64, 42,173, 0, 0, 97,114, 97, +105,105,108,101,102,116,116,104, 97,233,248,134, 42,192, 0, 0, + 97,114, 97,105,105,116,104, 97,233, 14, 53, 42,207, 0, 0, 97, +114, 97,105,108,101,102,116,116,104, 97,233,248,133, 42,225, 0, + 0, 97,114, 97,105,116,104, 97,233, 14, 52, 42,239, 0, 0, 97, +114, 97,111,116,104, 97,233, 14, 66, 42,253, 0, 0, 97,114, 97, +117,101,101,108,101,102,116,116,104, 97,233,248,136, 43, 17, 0, + 0, 97,114, 97,117,101,101,116,104, 97,233, 14, 55, 43, 33, 0, + 0, 97,114, 97,117,101,108,101,102,116,116,104, 97,233,248,135, + 43, 52, 0, 0, 97,114, 97,117,101,116,104, 97,233, 14, 54, 43, + 67, 0, 0, 97,114, 97,117,116,104, 97,233, 14, 56, 43, 81, 0, + 0, 97,114, 97,117,117,116,104, 97,233, 14, 57, 43, 96, 0, 0, + 98,111,112,111,109,111,102,239, 49, 25, 43,110, 0, 0, 99, 97, +114,111,238, 1, 97, 43,121, 57,255, 99,101,100,105,108,108,225, + 1, 95, 43,134, 0, 0, 99,104,119,225, 2, 89, 43,144, 57,209, + 99,105,114, 99,108,229, 36,226, 43,156, 0, 0, 99,105,114, 99, +117,109,102,108,101,248, 1, 93, 43,172, 0, 0, 99,111,109,109, + 97, 97, 99, 99,101,110,244, 2, 25, 43,189, 0, 0,100,111,116, + 97, 99, 99,101,110,244, 30, 97, 43,204, 0, 0,100,111,116, 98, +101,108,111,247, 30, 99, 43,218, 57,194,101, 97,103,117,108,108, + 98,101,108,111,119, 99,109,226, 3, 60, 43,238, 0, 0,101, 99, +111,110,228, 32, 51, 43,249, 57,177,101, 99,116,105,111,238, 0, +167, 44, 5, 0, 0,101,101,110, 97,114, 97, 98,105,227, 6, 51, + 44, 20, 0, 0,101,101,110,102,105,110, 97,108, 97,114, 97, 98, +105,227,254,178, 44, 40, 0, 0,101,101,110,105,110,105,116,105, + 97,108, 97,114, 97, 98,105,227,254,179, 44, 62, 0, 0,101,101, +110,109,101,100,105, 97,108, 97,114, 97, 98,105,227,254,180, 44, + 83, 0, 0,101,103,111,236, 5,182, 44, 93, 57, 74,101,104, 97, +114,109,101,110,105, 97,238, 5,125, 44,109, 0, 0,101,104,105, +114, 97,103, 97,110,225, 48, 91, 44,124, 0, 0,101,107, 97,116, + 97,107, 97,110,225, 48,187, 44,139, 57, 59,101,109,105, 99,111, +108,111,238, 0, 59, 44,153, 57, 21,101,109,105,118,111,105, 99, +101,100,109, 97,114,107,107, 97,110,225, 48,156, 44,176, 57, 6, +101,110,116,105,115,113,117, 97,114,229, 51, 34, 44,192, 0, 0, +101,110,116,111,115,113,117, 97,114,229, 51, 35, 44,208, 0, 0, +101,118,101,238, 0, 55, 44,218, 55,195,102,116,104,121,112,104, +101,238, 0,173, 44,232, 0, 0,104, 97, 97,114,109,101,110,105, + 97,238, 5,119, 44,248, 0, 0,104, 97, 98,101,110,103, 97,108, +233, 9,182, 45, 7, 0, 0,104, 97, 99,121,114,105,108,108,105, +227, 4, 72, 45, 23, 0, 0,104, 97,100,100, 97, 97,114, 97, 98, +105,227, 6, 81, 45, 40, 0, 0,104, 97,100,100, 97,100, 97,109, +109, 97, 97,114, 97, 98,105,227,252, 97, 45, 62, 0, 0,104, 97, +100,100, 97,100, 97,109,109, 97,116, 97,110, 97,114, 97, 98,105, +227,252, 94, 45, 87, 0, 0,104, 97,100,100, 97,102, 97,116,104, + 97, 97,114, 97, 98,105,227,252, 96, 45,109, 0, 0,104, 97,100, +100, 97,102, 97,116,104, 97,116, 97,110, 97,114, 97, 98,105,227, + 6, 81, 45,134, 0, 0,104, 97,100,100, 97,107, 97,115,114, 97, + 97,114, 97, 98,105,227,252, 98, 45,156, 0, 0,104, 97,100,100, + 97,107, 97,115,114, 97,116, 97,110, 97,114, 97, 98,105,227,252, + 95, 45,181, 0, 0,104, 97,100,229, 37,146, 45,191, 55,154,104, + 97,103,117,106, 97,114, 97,116,233, 10,182, 45,207, 0, 0,104, + 97,103,117,114,109,117,107,104,233, 10, 54, 45,223, 0, 0,104, + 97,108,115,104,101,108,101,116,104,101, 98,114,101,247, 5,147, + 45,244, 0, 0,104, 98,111,112,111,109,111,102,239, 49, 21, 46, + 3, 0, 0,104, 99,104, 97, 99,121,114,105,108,108,105,227, 4, + 73, 46, 21, 0, 0,104,101,101,110, 97,114, 97, 98,105,227, 6, + 52, 46, 37, 0, 0,104,101,101,110,102,105,110, 97,108, 97,114, + 97, 98,105,227,254,182, 46, 58, 0, 0,104,101,101,110,105,110, +105,116,105, 97,108, 97,114, 97, 98,105,227,254,183, 46, 81, 0, + 0,104,101,101,110,109,101,100,105, 97,108, 97,114, 97, 98,105, +227,254,184, 46,103, 0, 0,104,101,105, 99,111,112,116,105,227, + 3,227, 46,118, 0, 0,104,101,113,101,236, 32,170, 46,129, 55, +142,104,101,118,225, 5,176, 46,139, 55, 44,104,104, 97, 99,121, +114,105,108,108,105,227, 4,187, 46,156, 0, 0,104,105,109, 97, + 99,111,112,116,105,227, 3,237, 46,172, 0, 0,104,105,238, 5, +233, 46,181, 54,151,104,111,111,235, 2,130, 46,191, 0, 0,105, +103,109,225, 3,195, 46,201, 54,110,105,104,105,114, 97,103, 97, +110,225, 48, 87, 46,216, 0, 0,105,107, 97,116, 97,107, 97,110, +225, 48,183, 46,231, 54, 95,105,108,117,113,104,101, 98,114,101, +247, 5,189, 46,247, 0, 0,105,108,117,113,108,101,102,116,104, +101, 98,114,101,247, 5,189, 47, 11, 0, 0,105,109,105,108, 97, +242, 34, 60, 47, 23, 0, 0,105,110,100,111,116,104,101, 98,114, +101,247, 5,194, 47, 40, 0, 0,105,111,115, 97, 99,105,114, 99, +108,101,107,111,114,101, 97,238, 50,116, 47, 62, 0, 0,105,111, +115, 97,112, 97,114,101,110,107,111,114,101, 97,238, 50, 20, 47, + 83, 0, 0,105,111,115, 99,105,101,117, 99,107,111,114,101, 97, +238, 49,126, 47,103, 0, 0,105,111,115, 99,105,114, 99,108,101, +107,111,114,101, 97,238, 50,102, 47,124, 0, 0,105,111,115,107, +105,121,101,111,107,107,111,114,101, 97,238, 49,122, 47,145, 0, + 0,105,111,115,107,111,114,101, 97,238, 49, 69, 47,160, 0, 0, +105,111,115,110,105,101,117,110,107,111,114,101, 97,238, 49,123, + 47,180, 0, 0,105,111,115,112, 97,114,101,110,107,111,114,101, + 97,238, 50, 6, 47,200, 0, 0,105,111,115,112,105,101,117,112, +107,111,114,101, 97,238, 49,125, 47,220, 0, 0,105,111,115,116, +105,107,101,117,116,107,111,114,101, 97,238, 49,124, 47,241, 0, + 0,105,248, 0, 54, 47,249, 53, 5,108, 97,115,232, 0, 47, 48, + 3, 52,246,108,111,110,231, 1,127, 48, 13, 52,231,109,105,108, +101,102, 97, 99,229, 38, 58, 48, 27, 0, 0,109,111,110,111,115, +112, 97, 99,229,255, 83, 48, 42, 0, 0,111,102,112, 97,115,117, +113,104,101, 98,114,101,247, 5,195, 48, 61, 0, 0,111,102,116, +104,121,112,104,101,238, 0,173, 48, 76, 0, 0,111,102,116,115, +105,103,110, 99,121,114,105,108,108,105,227, 4, 76, 48, 97, 0, + 0,111,104,105,114, 97,103, 97,110,225, 48, 93, 48,112, 0, 0, +111,107, 97,116, 97,107, 97,110,225, 48,189, 48,127, 52,216,111, +108,105,100,117,115,108,111,110,103,111,118,101,114,108, 97,121, + 99,109,226, 3, 56, 48,153, 0, 0,111,108,105,100,117,115,115, +104,111,114,116,111,118,101,114,108, 97,121, 99,109,226, 3, 55, + 48,180, 0, 0,111,114,117,115,105,116,104, 97,233, 14, 41, 48, +195, 0, 0,111,115, 97,108, 97,116,104, 97,233, 14, 40, 48,210, + 0, 0,111,115,111,116,104, 97,233, 14, 11, 48,223, 0, 0,111, +115,117, 97,116,104, 97,233, 14, 42, 48,237, 0, 0,112, 97, 99, +229, 0, 32, 48,247, 52,200,112, 97,100,229, 38, 96, 49, 1, 52, +170,112, 97,114,101,238, 36,174, 49, 12, 0, 0,113,117, 97,114, +101, 98,101,108,111,119, 99,109,226, 3, 59, 49, 31, 0, 0,113, +117, 97,114,101, 99,227, 51,196, 49, 44, 0, 0,113,117, 97,114, +101, 99,237, 51,157, 49, 57, 0, 0,113,117, 97,114,101,100,105, + 97,103,111,110, 97,108, 99,114,111,115,115,104, 97,116, 99,104, +102,105,108,236, 37,169, 49, 90, 0, 0,113,117, 97,114,101,104, +111,114,105,122,111,110,116, 97,108,102,105,108,236, 37,164, 49, +115, 0, 0,113,117, 97,114,101,107,231, 51,143, 49,128, 0, 0, +113,117, 97,114,101,107,237, 51,158, 49,141, 52,157,113,117, 97, +114,101,108,238, 51,209, 49,154, 0, 0,113,117, 97,114,101,108, +111,231, 51,210, 49,168, 0, 0,113,117, 97,114,101,109,231, 51, +142, 49,181, 0, 0,113,117, 97,114,101,109,105,236, 51,213, 49, +195, 0, 0,113,117, 97,114,101,109,237, 51,156, 49,208, 0, 0, +113,117, 97,114,101,109,115,113,117, 97,114,101,228, 51,161, 49, +227, 0, 0,113,117, 97,114,101,111,114,116,104,111,103,111,110, + 97,108, 99,114,111,115,115,104, 97,116, 99,104,102,105,108,236, + 37,166, 50, 6, 0, 0,113,117, 97,114,101,117,112,112,101,114, +108,101,102,116,116,111,108,111,119,101,114,114,105,103,104,116, +102,105,108,236, 37,167, 50, 42, 0, 0,113,117, 97,114,101,117, +112,112,101,114,114,105,103,104,116,116,111,108,111,119,101,114, +108,101,102,116,102,105,108,236, 37,168, 50, 78, 0, 0,113,117, + 97,114,101,118,101,114,116,105, 99, 97,108,102,105,108,236, 37, +165, 50,101, 0, 0,113,117, 97,114,101,119,104,105,116,101,119, +105,116,104,115,109, 97,108,108, 98,108, 97, 99,235, 37,163, 50, +131, 0, 0,114,115,113,117, 97,114,229, 51,219, 50,144, 0, 0, +115, 97, 98,101,110,103, 97,108,233, 9,183, 50,159, 0, 0,115, + 97,100,101,118,225, 9, 55, 50,171, 0, 0,115, 97,103,117,106, + 97,114, 97,116,233, 10,183, 50,187, 0, 0,115, 97,110,103, 99, +105,101,117, 99,107,111,114,101, 97,238, 49, 73, 50,208, 0, 0, +115, 97,110,103,104,105,101,117,104,107,111,114,101, 97,238, 49, +133, 50,229, 0, 0,115, 97,110,103,105,101,117,110,103,107,111, +114,101, 97,238, 49,128, 50,250, 0, 0,115, 97,110,103,107,105, +121,101,111,107,107,111,114,101, 97,238, 49, 50, 51, 16, 0, 0, +115, 97,110,103,110,105,101,117,110,107,111,114,101, 97,238, 49, +101, 51, 37, 0, 0,115, 97,110,103,112,105,101,117,112,107,111, +114,101, 97,238, 49, 67, 51, 58, 0, 0,115, 97,110,103,115,105, +111,115,107,111,114,101, 97,238, 49, 70, 51, 78, 0, 0,115, 97, +110,103,116,105,107,101,117,116,107,111,114,101, 97,238, 49, 56, + 51,100, 0, 0,115,117,112,101,114,105,111,242,246,242, 51,114, + 0, 0,116,101,114,108,105,110,231, 0,163, 51,127, 52,142,116, +114,111,107,101,108,111,110,103,111,118,101,114,108, 97,121, 99, +109,226, 3, 54, 51,152, 0, 0,116,114,111,107,101,115,104,111, +114,116,111,118,101,114,108, 97,121, 99,109,226, 3, 53, 51,178, + 0, 0,117, 98,115,101,244, 34,130, 51,189, 52,115,117, 99, 99, +101,101,100,243, 34,123, 51,202, 0, 0,117, 99,104,116,104, 97, +244, 34, 11, 51,215, 0, 0,117,104,105,114, 97,103, 97,110,225, + 48, 89, 51,230, 0, 0,117,107, 97,116, 97,107, 97,110,225, 48, +185, 51,245, 52,100,117,107,117,110, 97,114, 97, 98,105,227, 6, + 82, 52, 5, 0, 0,117,109,109, 97,116,105,111,238, 34, 17, 52, + 19, 0, 0,117,238, 38, 60, 52, 27, 0, 0,117,112,101,114,115, +101,244, 34,131, 52, 40, 52, 73,118,115,113,117, 97,114,229, 51, +220, 52, 53, 0, 0,121,111,117,119, 97,101,114, 97,115,113,117, + 97,114,229, 51,124, 0, 0, 0, 0,110,111,116,101,113,117, 97, +236, 34,139, 52, 87, 0, 0,111,114,101,113,117, 97,236, 34,135, + 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255,125, 0, + 0, 0, 0,110,111,116,101,113,117, 97,236, 34,138, 52,129, 0, + 0,111,114,101,113,117, 97,236, 34,134, 0, 0, 0, 0,109,111, +110,111,115,112, 97, 99,229,255,225, 0, 0, 0, 0, 99, 97,112, +105,116, 97,236, 51,206, 0, 0, 0, 0,115,117,105,116, 98,108, + 97, 99,235, 38, 96, 52,185, 0, 0,115,117,105,116,119,104,105, +116,229, 38,100, 0, 0, 0, 0,104, 97, 99,107, 97,114, 97, 98, +105,227, 0, 32, 0, 0, 0, 0,104, 97,108,102,119,105,100,116, +232,255,127, 0, 0, 0, 0,100,111,116, 97, 99, 99,101,110,244, + 30,155, 0, 0, 0, 0,109,111,110,111,115,112, 97, 99,229,255, + 15, 0, 0, 0, 0, 97,114, 97, 98,105,227, 6,102, 53, 17, 0, + 0, 98,101,110,103, 97,108,233, 9,236, 53, 30, 0, 0, 99,105, +114, 99,108,229, 36,101, 53, 42, 54, 73,100,101,118,225, 9,108, + 53, 52, 0, 0,103,117,106, 97,114, 97,116,233, 10,236, 53, 66, + 0, 0,103,117,114,109,117,107,104,233, 10,108, 53, 80, 0, 0, +104, 97, 99,107, 97,114, 97, 98,105,227, 6,102, 53, 96, 0, 0, +104, 97,110,103,122,104,111,245, 48, 38, 53,110, 0, 0,105,100, +101,111,103,114, 97,112,104,105, 99,112, 97,114,101,238, 50, 37, + 53,132, 0, 0,105,110,102,101,114,105,111,242, 32,134, 53,146, + 0, 0,109,111,110,111,115,112, 97, 99,229,255, 22, 53,161, 0, + 0,111,108,100,115,116,121,108,229,247, 54, 53,175, 0, 0,112, + 97,114,101,238, 36,121, 53,186, 0, 0,112,101,114,105,111,228, + 36,141, 53,198, 0, 0,112,101,114,115,105, 97,238, 6,246, 53, +211, 0, 0,114,111,109, 97,238, 33,117, 53,222, 0, 0,115,117, +112,101,114,105,111,242, 32,118, 53,236, 0, 0,116,101,101,110, + 99,105,114, 99,108,229, 36,111, 53,252, 0, 0,116,101,101,110, + 99,117,114,114,101,110, 99,121,100,101,110,111,109,105,110, 97, +116,111,114, 98,101,110,103, 97,108,233, 9,249, 54, 32, 0, 0, +116,101,101,110,112, 97,114,101,238, 36,131, 54, 47, 0, 0,116, +101,101,110,112,101,114,105,111,228, 36,151, 54, 63, 0, 0,116, +104, 97,233, 14, 86, 0, 0, 0, 0,105,110,118,101,114,115,101, +115, 97,110,115,115,101,114,105,230, 39,143, 0, 0, 0, 0,104, + 97,108,102,119,105,100,116,232,255,124, 0, 0, 0, 0,177, 3, +194, 54,117, 0, 0,102,105,110, 97,236, 3,194, 54,128, 0, 0, +108,117,110, 97,116,101,115,121,109, 98,111,108,103,114,101,101, +235, 3,242, 0, 0, 0, 0,100, 97,103,101,115,232,251, 73, 54, +163, 54,239,100,111,116,104,101, 98,114,101,247, 5,193, 54,178, + 0, 0,104,101, 98,114,101,247, 5,233, 54,190, 0, 0,115,104, +105,110,100,111,244,251, 42, 54,203, 54,227,115,105,110,100,111, +244,251, 43, 0, 0, 54,215,104,101, 98,114,101,247,251, 43, 0, + 0, 0, 0,104,101, 98,114,101,247,251, 42, 0, 0, 0, 0,104, +101, 98,114,101,247,251, 73, 54,251, 0, 0,115,104,105,110,100, +111,244,251, 44, 55, 8, 55, 32,115,105,110,100,111,244,251, 45, + 0, 0, 55, 20,104,101, 98,114,101,247,251, 45, 0, 0, 0, 0, +104,101, 98,114,101,247,251, 44, 0, 0, 0, 0, 49, 49,181, 5, +176, 55, 53, 0, 0, 49,181, 5,176, 55, 61, 0, 0, 50,178, 5, +176, 55, 69, 0, 0, 50,229, 5,176, 55, 77, 0, 0,104,101, 98, +114,101,247, 5,176, 55, 89, 0, 0,110, 97,114,114,111,119,104, +101, 98,114,101,247, 5,176, 55,107, 0, 0,113,117, 97,114,116, +101,114,104,101, 98,114,101,247, 5,176, 55,126, 0, 0,119,105, +100,101,104,101, 98,114,101,247, 5,176, 0, 0, 0, 0,104,101, + 98,114,101,247, 32,170, 0, 0, 0, 0,100, 97,114,235, 37,147, + 55,164, 0, 0,108,105,103,104,244, 37,145, 55,175, 0, 0,109, +101,100,105,117,237, 37,146, 55,187, 0, 0,118,225, 9, 54, 0, + 0, 0, 0, 97,114, 97, 98,105,227, 6,103, 55,207, 0, 0, 98, +101,110,103, 97,108,233, 9,237, 55,220, 0, 0, 99,105,114, 99, +108,229, 36,102, 55,232, 56,240,100,101,118,225, 9,109, 55,242, + 0, 0,101,105,103,104,116,104,243, 33, 94, 55,255, 0, 0,103, +117,106, 97,114, 97,116,233, 10,237, 56, 13, 0, 0,103,117,114, +109,117,107,104,233, 10,109, 56, 27, 0, 0,104, 97, 99,107, 97, +114, 97, 98,105,227, 6,103, 56, 43, 0, 0,104, 97,110,103,122, +104,111,245, 48, 39, 56, 57, 0, 0,105,100,101,111,103,114, 97, +112,104,105, 99,112, 97,114,101,238, 50, 38, 56, 79, 0, 0,105, +110,102,101,114,105,111,242, 32,135, 56, 93, 0, 0,109,111,110, +111,115,112, 97, 99,229,255, 23, 56,108, 0, 0,111,108,100,115, +116,121,108,229,247, 55, 56,122, 0, 0,112, 97,114,101,238, 36, +122, 56,133, 0, 0,112,101,114,105,111,228, 36,142, 56,145, 0, + 0,112,101,114,115,105, 97,238, 6,247, 56,158, 0, 0,114,111, +109, 97,238, 33,118, 56,169, 0, 0,115,117,112,101,114,105,111, +242, 32,119, 56,183, 0, 0,116,101,101,110, 99,105,114, 99,108, +229, 36,112, 56,199, 0, 0,116,101,101,110,112, 97,114,101,238, + 36,132, 56,214, 0, 0,116,101,101,110,112,101,114,105,111,228, + 36,152, 56,230, 0, 0,116,104, 97,233, 14, 87, 0, 0, 0, 0, +105,110,118,101,114,115,101,115, 97,110,115,115,101,114,105,230, + 39,144, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255, +159, 0, 0, 0, 0, 97,114, 97, 98,105,227, 6, 27, 57, 33, 0, + 0,109,111,110,111,115,112, 97, 99,229,255, 27, 57, 48, 0, 0, +115,109, 97,108,236,254, 84, 0, 0, 0, 0,104, 97,108,102,119, +105,100,116,232,255,126, 0, 0, 0, 0, 49,179, 5,182, 57, 82, + 0, 0, 49,230, 5,182, 57, 90, 0, 0, 50,227, 5,182, 57, 98, + 0, 0,104,101, 98,114,101,247, 5,182, 57,110, 0, 0,110, 97, +114,114,111,119,104,101, 98,114,101,247, 5,182, 57,128, 0, 0, +113,117, 97,114,116,101,114,104,101, 98,114,101,247, 5,182, 57, +147, 0, 0,116, 97,104,101, 98,114,101,247, 5,146, 57,161, 0, + 0,119,105,100,101,104,101, 98,114,101,247, 5,182, 0, 0, 0, + 0,116,111,110,101, 99,104,105,110,101,115,229, 2,202, 0, 0, + 0, 0,100,111,116, 97, 99, 99,101,110,244, 30,105, 0, 0, 0, + 0, 99,121,114,105,108,108,105,227, 4,217, 57,223, 0, 0,100, +105,101,114,101,115,105,115, 99,121,114,105,108,108,105,227, 4, +219, 57,245, 0, 0,104,111,111,235, 2, 90, 0, 0, 0, 0,100, +111,116, 97, 99, 99,101,110,244, 30,103, 0, 0, 0, 0,100, 97, +103,101,115,232,251, 65, 58, 26, 58, 38,104,101, 98,114,101,247, + 5,225, 0, 0, 0, 0,104,101, 98,114,101,247,251, 65, 0, 0, + 0, 0,104, 97,108,102,119,105,100,116,232,255,123, 0, 0, 0, + 0,100,111,116, 97, 99, 99,101,110,244, 30,101, 0, 0, 0, 0, + 97, 97,114,109,101,110,105, 97,238, 5,124, 58, 95, 0, 0, 97, + 98,101,110,103, 97,108,233, 9,176, 58,109, 0, 0, 97, 99,117, +116,229, 1, 85, 58,120, 0, 0, 97,100,101,118,225, 9, 48, 58, +131, 0, 0, 97,100,105, 99, 97,236, 34, 26, 58,143, 67,191, 97, +100,111,118,101,114,115,115,113,117, 97,114,229, 51,174, 58,162, + 67,178, 97,100,115,113,117, 97,114,229, 51,173, 58,176, 0, 0, + 97,102,229, 5,191, 58,185, 67,166, 97,103,117,106, 97,114, 97, +116,233, 10,176, 58,200, 0, 0, 97,103,117,114,109,117,107,104, +233, 10, 48, 58,215, 0, 0, 97,104,105,114, 97,103, 97,110,225, + 48,137, 58,230, 0, 0, 97,107, 97,116, 97,107, 97,110,225, 48, +233, 58,245, 67,151, 97,108,111,119,101,114,100,105, 97,103,111, +110, 97,108, 98,101,110,103, 97,108,233, 9,241, 59, 16, 0, 0, + 97,109,105,100,100,108,101,100,105, 97,103,111,110, 97,108, 98, +101,110,103, 97,108,233, 9,240, 59, 44, 0, 0, 97,109,115,104, +111,114,238, 2,100, 59, 57, 0, 0, 97,116,105,239, 34, 54, 59, + 67, 0, 0, 98,111,112,111,109,111,102,239, 49, 22, 59, 81, 0, + 0, 99, 97,114,111,238, 1, 89, 59, 92, 0, 0, 99,101,100,105, +108,108,225, 1, 87, 59,105, 0, 0, 99,105,114, 99,108,229, 36, +225, 59,117, 0, 0, 99,111,109,109, 97, 97, 99, 99,101,110,244, + 1, 87, 59,134, 0, 0,100, 98,108,103,114, 97,118,229, 2, 17, + 59,148, 0, 0,100,111,116, 97, 99, 99,101,110,244, 30, 89, 59, +163, 0, 0,100,111,116, 98,101,108,111,247, 30, 91, 59,177, 67, +139,101,102,101,114,101,110, 99,101,109, 97,114,235, 32, 59, 59, +195, 0, 0,101,102,108,101,120,115,117, 98,115,101,244, 34,134, + 59,212, 0, 0,101,102,108,101,120,115,117,112,101,114,115,101, +244, 34,135, 59,231, 0, 0,101,103,105,115,116,101,114,101,228, + 0,174, 59,246, 0, 0,101,103,105,115,116,101,114,115, 97,110, +243,248,232, 60, 7, 0, 0,101,103,105,115,116,101,114,115,101, +114,105,230,246,218, 60, 25, 0, 0,101,104, 97,114, 97, 98,105, +227, 6, 49, 60, 39, 0, 0,101,104, 97,114,109,101,110,105, 97, +238, 5,128, 60, 55, 0, 0,101,104,102,105,110, 97,108, 97,114, + 97, 98,105,227,254,174, 60, 74, 0, 0,101,104,105,114, 97,103, + 97,110,225, 48,140, 60, 89, 0, 0,101,104,121,101,104, 97,108, +101,102,108, 97,109, 97,114, 97, 98,105,227, 6, 49, 60,113, 0, + 0,101,107, 97,116, 97,107, 97,110,225, 48,236, 60,128, 67,124, +101,115,232, 5,232, 60,137, 66,108,101,118,101,114,115,101,100, +116,105,108,100,229, 34, 61, 60,155, 0, 0,101,118,105, 97,104, +101, 98,114,101,247, 5,151, 60,171, 0, 0,101,118,105, 97,109, +117,103,114, 97,115,104,104,101, 98,114,101,247, 5,151, 60,194, + 0, 0,101,118,108,111,103,105, 99, 97,108,110,111,244, 35, 16, + 60,212, 0, 0,102,105,115,104,104,111,111,235, 2,126, 60,226, + 66, 94,104, 97, 98,101,110,103, 97,108,233, 9,221, 60,241, 0, + 0,104, 97,100,101,118,225, 9, 93, 60,253, 0, 0,104,239, 3, +193, 61, 5, 66, 27,105,101,117,108, 97, 99,105,114, 99,108,101, +107,111,114,101, 97,238, 50,113, 61, 28, 0, 0,105,101,117,108, + 97,112, 97,114,101,110,107,111,114,101, 97,238, 50, 17, 61, 50, + 0, 0,105,101,117,108, 99,105,114, 99,108,101,107,111,114,101, + 97,238, 50, 99, 61, 72, 0, 0,105,101,117,108,104,105,101,117, +104,107,111,114,101, 97,238, 49, 64, 61, 93, 0, 0,105,101,117, +108,107,105,121,101,111,107,107,111,114,101, 97,238, 49, 58, 61, +115, 0, 0,105,101,117,108,107,105,121,101,111,107,115,105,111, +115,107,111,114,101, 97,238, 49,105, 61,141, 0, 0,105,101,117, +108,107,111,114,101, 97,238, 49, 57, 61,157, 0, 0,105,101,117, +108,109,105,101,117,109,107,111,114,101, 97,238, 49, 59, 61,178, + 0, 0,105,101,117,108,112, 97,110,115,105,111,115,107,111,114, +101, 97,238, 49,108, 61,201, 0, 0,105,101,117,108,112, 97,114, +101,110,107,111,114,101, 97,238, 50, 3, 61,222, 0, 0,105,101, +117,108,112,104,105,101,117,112,104,107,111,114,101, 97,238, 49, + 63, 61,245, 0, 0,105,101,117,108,112,105,101,117,112,107,111, +114,101, 97,238, 49, 60, 62, 10, 0, 0,105,101,117,108,112,105, +101,117,112,115,105,111,115,107,111,114,101, 97,238, 49,107, 62, + 35, 0, 0,105,101,117,108,115,105,111,115,107,111,114,101, 97, +238, 49, 61, 62, 55, 0, 0,105,101,117,108,116,104,105,101,117, +116,104,107,111,114,101, 97,238, 49, 62, 62, 78, 0, 0,105,101, +117,108,116,105,107,101,117,116,107,111,114,101, 97,238, 49,106, + 62,100, 0, 0,105,101,117,108,121,101,111,114,105,110,104,105, +101,117,104,107,111,114,101, 97,238, 49,109, 62,127, 0, 0,105, +103,104,116, 97,110,103,108,229, 34, 31, 62,142, 0, 0,105,103, +104,116,116, 97, 99,107, 98,101,108,111,119, 99,109,226, 3, 25, + 62,164, 0, 0,105,103,104,116,116,114,105, 97,110,103,108,229, + 34,191, 62,182, 0, 0,105,104,105,114, 97,103, 97,110,225, 48, +138, 62,197, 0, 0,105,107, 97,116, 97,107, 97,110,225, 48,234, + 62,212, 66, 12,105,110,231, 2,218, 62,221, 65,146,105,110,118, +101,114,116,101,100, 98,114,101,118,229, 2, 19, 62,240, 0, 0, +105,116,116,111,114,117,115,113,117, 97,114,229, 51, 81, 63, 2, + 0, 0,108,105,110,101, 98,101,108,111,247, 30, 95, 63, 17, 0, + 0,108,111,110,103,108,101,231, 2,124, 63, 30, 65,134,109,111, +110,111,115,112, 97, 99,229,255, 82, 63, 45, 0, 0,111,104,105, +114, 97,103, 97,110,225, 48,141, 63, 60, 0, 0,111,107, 97,116, + 97,107, 97,110,225, 48,237, 63, 75, 65,119,111,114,117, 97,116, +104, 97,233, 14, 35, 63, 89, 0, 0,112, 97,114,101,238, 36,173, + 63,100, 0, 0,114, 97, 98,101,110,103, 97,108,233, 9,220, 63, +115, 0, 0,114, 97,100,101,118,225, 9, 49, 63,127, 0, 0,114, + 97,103,117,114,109,117,107,104,233, 10, 92, 63,143, 0, 0,114, +101,104, 97,114, 97, 98,105,227, 6,145, 63,158, 0, 0,114,101, +104,102,105,110, 97,108, 97,114, 97, 98,105,227,251,141, 63,178, + 0, 0,114,118,111, 99, 97,108,105, 99, 98,101,110,103, 97,108, +233, 9,224, 63,199, 0, 0,114,118,111, 99, 97,108,105, 99,100, +101,118,225, 9, 96, 63,217, 0, 0,114,118,111, 99, 97,108,105, + 99,103,117,106, 97,114, 97,116,233, 10,224, 63,239, 0, 0,114, +118,111, 99, 97,108,105, 99,118,111,119,101,108,115,105,103,110, + 98,101,110,103, 97,108,233, 9,196, 64, 13, 0, 0,114,118,111, + 99, 97,108,105, 99,118,111,119,101,108,115,105,103,110,100,101, +118,225, 9, 68, 64, 40, 0, 0,114,118,111, 99, 97,108,105, 99, +118,111,119,101,108,115,105,103,110,103,117,106, 97,114, 97,116, +233, 10,196, 64, 71, 0, 0,115,117,112,101,114,105,111,242,246, +241, 64, 85, 0, 0,116, 98,108,111, 99,235, 37,144, 64, 97, 0, + 0,116,117,114,110,101,228, 2,121, 64,109, 65,105,117,104,105, +114, 97,103, 97,110,225, 48,139, 64,124, 0, 0,117,107, 97,116, + 97,107, 97,110,225, 48,235, 64,139, 65, 90,117,112,101,101,109, + 97,114,107, 98,101,110,103, 97,108,233, 9,242, 64,160, 0, 0, +117,112,101,101,115,105,103,110, 98,101,110,103, 97,108,233, 9, +243, 64,181, 0, 0,117,112,105, 97,232,246,221, 64,192, 0, 0, +117,116,104, 97,233, 14, 36, 64,203, 0, 0,118,111, 99, 97,108, +105, 99, 98,101,110,103, 97,108,233, 9,139, 64,223, 0, 0,118, +111, 99, 97,108,105, 99,100,101,118,225, 9, 11, 64,240, 0, 0, +118,111, 99, 97,108,105, 99,103,117,106, 97,114, 97,116,233, 10, +139, 65, 5, 0, 0,118,111, 99, 97,108,105, 99,118,111,119,101, +108,115,105,103,110, 98,101,110,103, 97,108,233, 9,195, 65, 34, + 0, 0,118,111, 99, 97,108,105, 99,118,111,119,101,108,115,105, +103,110,100,101,118,225, 9, 67, 65, 60, 0, 0,118,111, 99, 97, +108,105, 99,118,111,119,101,108,115,105,103,110,103,117,106, 97, +114, 97,116,233, 10,195, 0, 0, 0, 0,104, 97,108,102,119,105, +100,116,232,255,153, 0, 0, 0, 0,115,117,112,101,114,105,111, +242, 2,180, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232, +255,155, 0, 0, 0, 0,116,117,114,110,101,228, 2,122, 0, 0, + 0, 0, 98,101,108,111,119, 99,109,226, 3, 37, 65,160, 0, 0, + 99,109,226, 3, 10, 65,169, 0, 0,104, 97,108,102,108,101,102, +244, 2,191, 65,183, 65,226,104, 97,108,102,114,105,103,104,244, + 2,190, 0, 0, 65,198, 98,101,108,111,119, 99,109,226, 3, 57, + 65,212, 0, 0, 99,101,110,116,101,114,101,228, 2,210, 0, 0, + 0, 0, 97,114,109,101,110,105, 97,238, 5, 89, 65,240, 0, 0, + 98,101,108,111,119, 99,109,226, 3, 28, 65,254, 0, 0, 99,101, +110,116,101,114,101,228, 2,211, 0, 0, 0, 0,104, 97,108,102, +119,105,100,116,232,255,152, 0, 0, 0, 0,111,235, 2,125, 66, + 35, 66, 68,115,121,109, 98,111,108,103,114,101,101,235, 3,241, + 66, 52, 0, 0,116,105, 99,104,111,111,107,109,111,228, 2,222, + 0, 0, 0, 0,116,117,114,110,101,228, 2,123, 0, 0, 66, 80, +115,117,112,101,114,105,111,242, 2,181, 0, 0, 0, 0,114,101, +118,101,114,115,101,228, 2,127, 0, 0, 0, 0,100, 97,103,101, +115,104,104,101, 98,114,101,247,251, 72, 66,126, 0, 0,104, 97, +116, 97,102,112, 97,116, 97,232, 5,232, 66,142, 67,112,104, 97, +116, 97,102,115,101,103,111,236, 5,232, 66,158, 67,100,104,101, + 98,114,101,247, 5,232, 66,170, 0, 0,104,105,114,105,241, 5, +232, 66,181, 67, 88,104,111,108, 97,237, 5,232, 66,192, 67, 76, +112, 97,116, 97,232, 5,232, 66,203, 67, 64,113, 97,109, 97,116, +243, 5,232, 66,215, 67, 52,113,117, 98,117,116,243, 5,232, 66, +227, 67, 40,115,101,103,111,236, 5,232, 66,238, 67, 28,115,104, +101,118,225, 5,232, 66,249, 67, 16,116,115,101,114,229, 5,232, + 0, 0, 67, 4,104,101, 98,114,101,247, 5,232, 0, 0, 0, 0, +104,101, 98,114,101,247, 5,232, 0, 0, 0, 0,104,101, 98,114, +101,247, 5,232, 0, 0, 0, 0,104,101, 98,114,101,247, 5,232, + 0, 0, 0, 0,104,101, 98,114,101,247, 5,232, 0, 0, 0, 0, +104,101, 98,114,101,247, 5,232, 0, 0, 0, 0,104,101, 98,114, +101,247, 5,232, 0, 0, 0, 0,104,101, 98,114,101,247, 5,232, + 0, 0, 0, 0,104,101, 98,114,101,247, 5,232, 0, 0, 0, 0, +104,101, 98,114,101,247, 5,232, 0, 0, 0, 0,104, 97,108,102, +119,105,100,116,232,255,154, 0, 0, 0, 0,109, 97, 99,114,111, +238, 30, 93, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232, +255,151, 0, 0, 0, 0,104,101, 98,114,101,247, 5,191, 0, 0, + 0, 0,100,115,113,117, 97,114,229, 51,175, 0, 0, 0, 0,101, +248,248,229, 0, 0, 0, 0, 97,100,101,118,225, 9, 88, 67,210, + 0, 0, 97,100,109, 97,104,101, 98,114,101,247, 5,168, 67,226, + 0, 0, 97,102, 97,114, 97, 98,105,227, 6, 66, 67,240, 0, 0, + 97,102,102,105,110, 97,108, 97,114, 97, 98,105,227,254,214, 68, + 3, 0, 0, 97,102,105,110,105,116,105, 97,108, 97,114, 97, 98, +105,227,254,215, 68, 24, 0, 0, 97,102,109,101,100,105, 97,108, + 97,114, 97, 98,105,227,254,216, 68, 44, 0, 0, 97,109, 97,116, +243, 5,184, 68, 55, 71, 71, 97,114,110,101,121,112, 97,114, 97, +104,101, 98,114,101,247, 5,159, 68, 76, 0, 0, 98,111,112,111, +109,111,102,239, 49, 17, 68, 90, 0, 0, 99,105,114, 99,108,229, + 36,224, 68,102, 0, 0,104,111,111,235, 2,160, 68,112, 0, 0, +109,111,110,111,115,112, 97, 99,229,255, 81, 68,127, 0, 0,111, +230, 5,231, 68,135, 70, 49,112, 97,114,101,238, 36,172, 68,146, + 0, 0,117, 97,114,116,101,114,110,111,116,229, 38,105, 68,162, + 0, 0,117, 98,117,116,243, 5,187, 68,173, 69,216,117,101,115, +116,105,111,238, 0, 63, 68,186, 69,132,117,111,116,101,100, 98, +236, 0, 34, 68,199, 69, 61,117,111,116,101,108,101,102,244, 32, + 24, 68,213, 69, 47,117,111,116,101,114,101,118,101,114,115,101, +228, 32, 27, 68,231, 0, 0,117,111,116,101,114,105,103,104,244, + 32, 25, 68,246, 69, 40,117,111,116,101,115,105,110,103,108, 98, + 97,115,229, 32, 26, 69, 9, 0, 0,117,111,116,101,115,105,110, +103,108,229, 0, 39, 0, 0, 69, 25,109,111,110,111,115,112, 97, + 99,229,255, 7, 0, 0, 0, 0,238, 1, 73, 0, 0, 0, 0,114, +101,118,101,114,115,101,228, 32, 27, 0, 0, 0, 0, 98, 97,115, +229, 32, 30, 69, 71, 0, 0,108,101,102,244, 32, 28, 69, 81, 0, + 0,109,111,110,111,115,112, 97, 99,229,255, 2, 69, 96, 0, 0, +112,114,105,109,229, 48, 30, 69,107, 69,118,114,105,103,104,244, + 32, 29, 0, 0, 0, 0,114,101,118,101,114,115,101,228, 48, 29, + 0, 0, 0, 0, 97,114, 97, 98,105,227, 6, 31, 69,144, 0, 0, + 97,114,109,101,110,105, 97,238, 5, 94, 69,158, 0, 0,100,111, +119,238, 0,191, 69,168, 69,205,103,114,101,101,235, 3,126, 69, +179, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 31, 69,194, + 0, 0,115,109, 97,108,236,247, 63, 0, 0, 0, 0,115,109, 97, +108,236,247,191, 0, 0, 0, 0, 49,184, 5,187, 69,224, 0, 0, + 50,181, 5,187, 69,232, 0, 0, 51,177, 5,187, 69,240, 0, 0, +104,101, 98,114,101,247, 5,187, 69,252, 0, 0,110, 97,114,114, +111,119,104,101, 98,114,101,247, 5,187, 70, 14, 0, 0,113,117, + 97,114,116,101,114,104,101, 98,114,101,247, 5,187, 70, 33, 0, + 0,119,105,100,101,104,101, 98,114,101,247, 5,187, 0, 0, 0, + 0,100, 97,103,101,115,232,251, 71, 70, 61, 71, 59,104, 97,116, + 97,102,112, 97,116, 97,232, 5,231, 70, 77, 71, 47,104, 97,116, + 97,102,115,101,103,111,236, 5,231, 70, 93, 71, 35,104,101, 98, +114,101,247, 5,231, 70,105, 0, 0,104,105,114,105,241, 5,231, + 70,116, 71, 23,104,111,108, 97,237, 5,231, 70,127, 71, 11,112, + 97,116, 97,232, 5,231, 70,138, 70,255,113, 97,109, 97,116,243, + 5,231, 70,150, 70,243,113,117, 98,117,116,243, 5,231, 70,162, + 70,231,115,101,103,111,236, 5,231, 70,173, 70,219,115,104,101, +118,225, 5,231, 70,184, 70,207,116,115,101,114,229, 5,231, 0, + 0, 70,195,104,101, 98,114,101,247, 5,231, 0, 0, 0, 0,104, +101, 98,114,101,247, 5,231, 0, 0, 0, 0,104,101, 98,114,101, +247, 5,231, 0, 0, 0, 0,104,101, 98,114,101,247, 5,231, 0, + 0, 0, 0,104,101, 98,114,101,247, 5,231, 0, 0, 0, 0,104, +101, 98,114,101,247, 5,231, 0, 0, 0, 0,104,101, 98,114,101, +247, 5,231, 0, 0, 0, 0,104,101, 98,114,101,247, 5,231, 0, + 0, 0, 0,104,101, 98,114,101,247, 5,231, 0, 0, 0, 0,104, +101, 98,114,101,247, 5,231, 0, 0, 0, 0,104,101, 98,114,101, +247,251, 71, 0, 0, 0, 0, 49,176, 5,184, 71, 79, 0, 0, 49, +225, 5,184, 71, 87, 0, 0, 49,227, 5,184, 71, 95, 0, 0, 50, +183, 5,184, 71,103, 0, 0, 50,185, 5,184, 71,111, 0, 0, 51, +179, 5,184, 71,119, 0, 0,100,229, 5,184, 71,127, 0, 0,104, +101, 98,114,101,247, 5,184, 71,139, 0, 0,110, 97,114,114,111, +119,104,101, 98,114,101,247, 5,184, 71,157, 0, 0,113, 97,116, + 97,110,104,101, 98,114,101,247, 5,184, 71,174, 0, 0,113, 97, +116, 97,110,110, 97,114,114,111,119,104,101, 98,114,101,247, 5, +184, 71,197, 0, 0,113, 97,116, 97,110,113,117, 97,114,116,101, +114,104,101, 98,114,101,247, 5,184, 71,221, 0, 0,113, 97,116, + 97,110,119,105,100,101,104,101, 98,114,101,247, 5,184, 71,242, + 0, 0,113,117, 97,114,116,101,114,104,101, 98,114,101,247, 5, +184, 72, 5, 0, 0,119,105,100,101,104,101, 98,114,101,247, 5, +184, 0, 0, 0, 0, 97, 97,109,112,115,115,113,117, 97,114,229, + 51,128, 72, 38, 0, 0, 97, 97,115,101,110,116,111,115,113,117, + 97,114,229, 51, 43, 72, 57, 0, 0, 97, 98,101,110,103, 97,108, +233, 9,170, 72, 71, 0, 0, 97, 99,117,116,229, 30, 85, 72, 82, + 0, 0, 97,100,101,118,225, 9, 42, 72, 93, 0, 0, 97,103,101, +100,111,119,238, 33,223, 72,106, 0, 0, 97,103,101,117,240, 33, +222, 72,117, 0, 0, 97,103,117,106, 97,114, 97,116,233, 10,170, + 72,132, 0, 0, 97,103,117,114,109,117,107,104,233, 10, 42, 72, +147, 0, 0, 97,104,105,114, 97,103, 97,110,225, 48,113, 72,162, + 0, 0, 97,105,121, 97,110,110,111,105,116,104, 97,233, 14, 47, + 72,180, 0, 0, 97,107, 97,116, 97,107, 97,110,225, 48,209, 72, +195, 0, 0, 97,108, 97,116, 97,108,105,122, 97,116,105,111,110, + 99,121,114,105,108,108,105, 99, 99,109,226, 4,132, 72,225, 0, + 0, 97,108,111, 99,104,107, 97, 99,121,114,105,108,108,105,227, + 4,192, 72,246, 0, 0, 97,110,115,105,111,115,107,111,114,101, + 97,238, 49,127, 73, 8, 0, 0, 97,114, 97,103,114, 97,112,232, + 0,182, 73, 22, 0, 0, 97,114, 97,108,108,101,236, 34, 37, 73, + 35, 0, 0, 97,114,101,110,108,101,102,244, 0, 40, 73, 49, 81, + 35, 97,114,101,110,114,105,103,104,244, 0, 41, 73, 64, 80,181, + 97,114,116,105, 97,108,100,105,102,230, 34, 2, 73, 80, 0, 0, + 97,115,101,113,104,101, 98,114,101,247, 5,192, 73, 96, 0, 0, + 97,115,104,116, 97,104,101, 98,114,101,247, 5,153, 73,113, 0, + 0, 97,115,113,117, 97,114,229, 51,169, 73,126, 0, 0, 97,116, + 97,232, 5,183, 73,136, 80, 92, 97,122,101,114,104,101, 98,114, +101,247, 5,161, 73,152, 0, 0, 98,111,112,111,109,111,102,239, + 49, 6, 73,166, 0, 0, 99,105,114, 99,108,229, 36,223, 73,178, + 0, 0,100,111,116, 97, 99, 99,101,110,244, 30, 87, 73,193, 0, + 0,229, 5,228, 73,200, 78,142,102,115,113,117, 97,114,229, 51, +138, 73,213, 0, 0,104, 97, 98,101,110,103, 97,108,233, 9,171, + 73,228, 0, 0,104, 97,100,101,118,225, 9, 43, 73,240, 0, 0, +104, 97,103,117,106, 97,114, 97,116,233, 10,171, 74, 0, 0, 0, +104, 97,103,117,114,109,117,107,104,233, 10, 43, 74, 16, 0, 0, +104,233, 3,198, 74, 24, 77,245,104,111,111,235, 1,165, 74, 34, + 0, 0,104,111,112,104, 97,110,116,104, 97,233, 14, 30, 74, 50, + 0, 0,104,111,112,104,117,110,103,116,104, 97,233, 14, 28, 74, + 67, 0, 0,104,111,115, 97,109,112,104, 97,111,116,104, 97,233, + 14, 32, 74, 86, 0, 0,233, 3,192, 74, 93, 76,188,108,117,243, + 0, 43, 74,102, 76,102,109,111,110,111,115,112, 97, 99,229,255, + 80, 74,117, 0, 0,109,115,113,117, 97,114,229, 51,216, 74,130, + 0, 0,111,104,105,114, 97,103, 97,110,225, 48,125, 74,145, 0, + 0,111,105,110,116,105,110,103,105,110,100,101,120,100,111,119, +110,119,104,105,116,229, 38, 31, 74,172, 0, 0,111,105,110,116, +105,110,103,105,110,100,101,120,108,101,102,116,119,104,105,116, +229, 38, 28, 74,199, 0, 0,111,105,110,116,105,110,103,105,110, +100,101,120,114,105,103,104,116,119,104,105,116,229, 38, 30, 74, +227, 0, 0,111,105,110,116,105,110,103,105,110,100,101,120,117, +112,119,104,105,116,229, 38, 29, 74,252, 0, 0,111,107, 97,116, + 97,107, 97,110,225, 48,221, 75, 11, 0, 0,111,112,108, 97,116, +104, 97,233, 14, 27, 75, 25, 0, 0,111,115,116, 97,108,109, 97, +114,235, 48, 18, 75, 40, 76, 92,112, 97,114,101,238, 36,171, 75, + 51, 0, 0,114,101, 99,101,100,101,243, 34,122, 75, 64, 0, 0, +114,101,115, 99,114,105,112,116,105,111,238, 33, 30, 75, 81, 0, + 0,114,105,109,101,109,111,228, 2,185, 75, 94, 0, 0,114,105, +109,101,114,101,118,101,114,115,101,228, 32, 53, 75,112, 0, 0, +114,111,100,117, 99,244, 34, 15, 75,124, 0, 0,114,111,106,101, + 99,116,105,118,229, 35, 5, 75,139, 0, 0,114,111,108,111,110, +103,101,100,107, 97,110,225, 48,252, 75,157, 0, 0,114,111,112, +101,108,108,111,242, 35, 24, 75,171, 0, 0,114,111,112,101,114, +115,117, 98,115,101,244, 34,130, 75,188, 0, 0,114,111,112,101, +114,115,117,112,101,114,115,101,244, 34,131, 75,207, 0, 0,114, +111,112,111,114,116,105,111,238, 34, 55, 75,222, 76, 84,115,233, + 3,200, 75,230, 76, 43,115,115,113,117, 97,114,229, 51,176, 75, +243, 0, 0,117,104,105,114, 97,103, 97,110,225, 48,119, 76, 2, + 0, 0,117,107, 97,116, 97,107, 97,110,225, 48,215, 76, 17, 0, + 0,118,115,113,117, 97,114,229, 51,180, 76, 30, 0, 0,119,115, +113,117, 97,114,229, 51,186, 0, 0, 0, 0, 99,121,114,105,108, +108,105,227, 4,113, 76, 57, 0, 0,108,105,112,110,101,117,109, + 97,116, 97, 99,121,114,105,108,108,105, 99, 99,109,226, 4,134, + 0, 0, 0, 0, 97,236, 34, 29, 0, 0, 0, 0,102, 97, 99,229, + 48, 32, 0, 0, 0, 0, 98,101,108,111,119, 99,109,226, 3, 31, + 76,116, 0, 0, 99,105,114, 99,108,229, 34,149, 76,128, 0, 0, +109,105,110,117,243, 0,177, 76,139, 0, 0,109,111,228, 2,214, + 76,148, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 11, 76, +163, 0, 0,115,109, 97,108,236,254, 98, 76,174, 0, 0,115,117, +112,101,114,105,111,242, 32,122, 0, 0, 0, 0,101,117,112, 97, + 99,105,114, 99,108,101,107,111,114,101, 97,238, 50,115, 76,210, + 0, 0,101,117,112, 97,112, 97,114,101,110,107,111,114,101, 97, +238, 50, 19, 76,231, 0, 0,101,117,112, 99,105,101,117, 99,107, +111,114,101, 97,238, 49,118, 76,251, 0, 0,101,117,112, 99,105, +114, 99,108,101,107,111,114,101, 97,238, 50,101, 77, 16, 0, 0, +101,117,112,107,105,121,101,111,107,107,111,114,101, 97,238, 49, +114, 77, 37, 0, 0,101,117,112,107,111,114,101, 97,238, 49, 66, + 77, 52, 0, 0,101,117,112,112, 97,114,101,110,107,111,114,101, + 97,238, 50, 5, 77, 72, 0, 0,101,117,112,115,105,111,115,107, +105,121,101,111,107,107,111,114,101, 97,238, 49,116, 77, 97, 0, + 0,101,117,112,115,105,111,115,107,111,114,101, 97,238, 49, 68, + 77,116, 0, 0,101,117,112,115,105,111,115,116,105,107,101,117, +116,107,111,114,101, 97,238, 49,117, 77,141, 0, 0,101,117,112, +116,104,105,101,117,116,104,107,111,114,101, 97,238, 49,119, 77, +163, 0, 0,101,117,112,116,105,107,101,117,116,107,111,114,101, + 97,238, 49,115, 77,184, 0, 0,104,105,114, 97,103, 97,110,225, + 48,116, 77,198, 0, 0,107, 97,116, 97,107, 97,110,225, 48,212, + 77,212, 0, 0,115,121,109, 98,111,108,103,114,101,101,235, 3, +214, 77,229, 0, 0,119,114, 97,114,109,101,110,105, 97,238, 5, +131, 0, 0, 0, 0,177, 3,213, 77,252, 0, 0,101,117,112,104, + 97, 99,105,114, 99,108,101,107,111,114,101, 97,238, 50,122, 78, + 19, 0, 0,101,117,112,104, 97,112, 97,114,101,110,107,111,114, +101, 97,238, 50, 26, 78, 41, 0, 0,101,117,112,104, 99,105,114, + 99,108,101,107,111,114,101, 97,238, 50,108, 78, 63, 0, 0,101, +117,112,104,107,111,114,101, 97,238, 49, 77, 78, 79, 0, 0,101, +117,112,104,112, 97,114,101,110,107,111,114,101, 97,238, 50, 12, + 78,100, 0, 0,108, 97,116,105,238, 2,120, 78,111, 0, 0,110, +116,104,117,116,104, 97,233, 14, 58, 78,125, 0, 0,115,121,109, + 98,111,108,103,114,101,101,235, 3,213, 0, 0, 0, 0, 99,121, +114,105,108,108,105,227, 4, 63, 78,156, 0, 0,100, 97,103,101, +115,232,251, 68, 78,168, 80, 80,101,122,105,115,113,117, 97,114, +229, 51, 59, 78,183, 0, 0,102,105,110, 97,108,100, 97,103,101, +115,104,104,101, 98,114,101,247,251, 67, 78,206, 0, 0,104, 97, +114, 97, 98,105,227, 6,126, 78,219, 0, 0,104, 97,114,109,101, +110,105, 97,238, 5,122, 78,234, 0, 0,104,101, 98,114,101,247, + 5,228, 78,246, 0, 0,104,102,105,110, 97,108, 97,114, 97, 98, +105,227,251, 87, 79, 8, 0, 0,104,105,110,105,116,105, 97,108, + 97,114, 97, 98,105,227,251, 88, 79, 28, 0, 0,104,105,114, 97, +103, 97,110,225, 48,122, 79, 42, 0, 0,104,109,101,100,105, 97, +108, 97,114, 97, 98,105,227,251, 89, 79, 61, 0, 0,107, 97,116, + 97,107, 97,110,225, 48,218, 79, 75, 0, 0,109,105,100,100,108, +101,104,111,111,107, 99,121,114,105,108,108,105,227, 4,167, 79, + 99, 0, 0,114, 97,102,101,104,101, 98,114,101,247,251, 78, 79, +115, 0, 0,114, 99,101,110,244, 0, 37, 79,126, 80, 42,114,105, +111,228, 0, 46, 79,136, 79,201,114,105,115,112,111,109,101,110, +105,103,114,101,101,107, 99,109,226, 3, 66, 79,159, 0, 0,114, +112,101,110,100,105, 99,117,108, 97,242, 34,165, 79,176, 0, 0, +114,116,104,111,117,115, 97,110,228, 32, 48, 79,191, 0, 0,115, +101,116,225, 32,167, 0, 0, 0, 0, 97,114,109,101,110,105, 97, +238, 5,137, 79,215, 0, 0, 99,101,110,116,101,114,101,228, 0, +183, 79,229, 0, 0,104, 97,108,102,119,105,100,116,232,255, 97, + 79,244, 0, 0,105,110,102,101,114,105,111,242,246,231, 80, 2, + 0, 0,109,111,110,111,115,112, 97, 99,229,255, 14, 80, 17, 0, + 0,115,109, 97,108,236,254, 82, 80, 28, 0, 0,115,117,112,101, +114,105,111,242,246,232, 0, 0, 0, 0, 97,114, 97, 98,105,227, + 6,106, 80, 54, 0, 0,109,111,110,111,115,112, 97, 99,229,255, + 5, 80, 69, 0, 0,115,109, 97,108,236,254,106, 0, 0, 0, 0, +104,101, 98,114,101,247,251, 68, 0, 0, 0, 0, 49,177, 5,183, + 80,100, 0, 0, 49,228, 5,183, 80,108, 0, 0, 50,225, 5,183, + 80,116, 0, 0,104,101, 98,114,101,247, 5,183, 80,128, 0, 0, +110, 97,114,114,111,119,104,101, 98,114,101,247, 5,183, 80,146, + 0, 0,113,117, 97,114,116,101,114,104,101, 98,114,101,247, 5, +183, 80,165, 0, 0,119,105,100,101,104,101, 98,114,101,247, 5, +183, 0, 0, 0, 0, 97,108,116,111,110,101, 97,114, 97, 98,105, +227,253, 63, 80,199, 0, 0, 98,244,248,248, 80,207, 0, 0,101, +248,248,247, 80,215, 0, 0,105,110,102,101,114,105,111,242, 32, +142, 80,229, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 9, + 80,244, 0, 0,115,109, 97,108,236,254, 90, 80,255, 0, 0,115, +117,112,101,114,105,111,242, 32,126, 81, 13, 0, 0,116,240,248, +246, 81, 21, 0, 0,118,101,114,116,105, 99, 97,236,254, 54, 0, + 0, 0, 0, 97,108,116,111,110,101, 97,114, 97, 98,105,227,253, + 62, 81, 53, 0, 0, 98,244,248,237, 81, 61, 0, 0,101,248,248, +236, 81, 69, 0, 0,105,110,102,101,114,105,111,242, 32,141, 81, + 83, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 8, 81, 98, + 0, 0,115,109, 97,108,236,254, 89, 81,109, 0, 0,115,117,112, +101,114,105,111,242, 32,125, 81,123, 0, 0,116,240,248,235, 81, +131, 0, 0,118,101,114,116,105, 99, 97,236,254, 53, 0, 0, 0, + 0, 97, 99,117,116,229, 0,243, 81,156, 0, 0, 97,110,103,116, +104, 97,233, 14, 45, 81,169, 0, 0, 98, 97,114,114,101,228, 2, +117, 81,181, 88, 69, 98,101,110,103, 97,108,233, 9,147, 81,194, + 0, 0, 98,111,112,111,109,111,102,239, 49, 27, 81,208, 0, 0, + 98,114,101,118,229, 1, 79, 81,219, 0, 0, 99, 97,110,100,114, + 97,100,101,118,225, 9, 17, 81,235, 0, 0, 99, 97,110,100,114, + 97,103,117,106, 97,114, 97,116,233, 10,145, 81,255, 0, 0, 99, + 97,110,100,114, 97,118,111,119,101,108,115,105,103,110,100,101, +118,225, 9, 73, 82, 24, 0, 0, 99, 97,110,100,114, 97,118,111, +119,101,108,115,105,103,110,103,117,106, 97,114, 97,116,233, 10, +201, 82, 53, 0, 0, 99, 97,114,111,238, 1,210, 82, 64, 0, 0, + 99,105,114, 99,108,229, 36,222, 82, 76, 0, 0, 99,105,114, 99, +117,109,102,108,101,248, 0,244, 82, 92, 88, 7, 99,121,114,105, +108,108,105,227, 4, 62, 82,106, 0, 0,100, 98,108, 97, 99,117, +116,229, 1, 81, 82,120, 0, 0,100, 98,108,103,114, 97,118,229, + 2, 13, 82,134, 0, 0,100,101,118,225, 9, 19, 82,144, 0, 0, +100,105,101,114,101,115,105,243, 0,246, 82,158, 87,249,100,111, +116, 98,101,108,111,247, 30,205, 82,172, 0, 0,229, 1, 83, 82, +179, 87,237,103,111,110,101,235, 2,219, 82,190, 87,228,103,114, + 97,118,229, 0,242, 82,201, 0, 0,103,117,106, 97,114, 97,116, +233, 10,147, 82,215, 0, 0,104, 97,114,109,101,110,105, 97,238, + 5,133, 82,230, 0, 0,104,105,114, 97,103, 97,110,225, 48, 74, + 82,244, 0, 0,104,111,111,107, 97, 98,111,118,229, 30,207, 83, + 3, 0, 0,104,111,114,238, 1,161, 83, 13, 87,166,104,117,110, +103, 97,114,117,109,108, 97,117,244, 1, 81, 83, 31, 0, 0,233, + 1,163, 83, 38, 87,148,107, 97,116, 97,107, 97,110,225, 48,170, + 83, 52, 87,133,107,111,114,101, 97,238, 49, 87, 83, 64, 0, 0, +108,101,104,101, 98,114,101,247, 5,171, 83, 78, 0, 0,109, 97, + 99,114,111,238, 1, 77, 83, 90, 87,111,109,100,101,118,225, 9, + 80, 83,101, 0, 0,109,101,103,225, 3,201, 83,111, 87, 24,109, +103,117,106, 97,114, 97,116,233, 10,208, 83,126, 0, 0,109,105, + 99,114,111,238, 3,191, 83,138, 87, 13,109,111,110,111,115,112, + 97, 99,229,255, 79, 83,153, 0, 0,110,229, 0, 49, 83,161, 85, +165,111,103,111,110,101,235, 1,235, 83,173, 85,153,111,103,117, +114,109,117,107,104,233, 10, 19, 83,188, 0, 0,111,109, 97,116, +114, 97,103,117,114,109,117,107,104,233, 10, 75, 83,208, 0, 0, +111,112,101,238, 2, 84, 83,218, 0, 0,112, 97,114,101,238, 36, +170, 83,229, 0, 0,112,101,110, 98,117,108,108,101,244, 37,230, + 83,244, 0, 0,112,116,105,111,238, 35, 37, 83,255, 0, 0,114, +100,102,101,109,105,110,105,110,229, 0,170, 84, 15, 0, 0,114, +100,109, 97,115, 99,117,108,105,110,229, 0,186, 84, 32, 0, 0, +114,116,104,111,103,111,110, 97,236, 34, 31, 84, 47, 0, 0,115, +104,111,114,116,100,101,118,225, 9, 18, 84, 62, 0, 0,115,104, +111,114,116,118,111,119,101,108,115,105,103,110,100,101,118,225, + 9, 74, 84, 86, 0, 0,115,108, 97,115,232, 0,248, 84, 97, 85, +142,115,109, 97,108,108,104,105,114, 97,103, 97,110,225, 48, 73, + 84,116, 0, 0,115,109, 97,108,108,107, 97,116, 97,107, 97,110, +225, 48,169, 84,135, 85,127,115,116,114,111,107,101, 97, 99,117, +116,229, 1,255, 84,152, 0, 0,115,117,112,101,114,105,111,242, +246,240, 84,166, 0, 0,116, 99,121,114,105,108,108,105,227, 4, +127, 84,181, 0, 0,116,105,108,100,229, 0,245, 84,192, 85,102, +117, 98,111,112,111,109,111,102,239, 49, 33, 84,207, 0, 0,118, +101,114,108,105,110,229, 32, 62, 84,220, 85, 42,118,101,114,115, + 99,111,114,229, 0,175, 84,234, 0, 0,118,111,119,101,108,115, +105,103,110, 98,101,110,103, 97,108,233, 9,203, 85, 0, 0, 0, +118,111,119,101,108,115,105,103,110,100,101,118,225, 9, 75, 85, + 19, 0, 0,118,111,119,101,108,115,105,103,110,103,117,106, 97, +114, 97,116,233, 10,203, 0, 0, 0, 0, 99,101,110,116,101,114, +108,105,110,229,254, 74, 85, 58, 0, 0, 99,109,226, 3, 5, 85, + 67, 0, 0,100, 97,115,104,101,228,254, 73, 85, 79, 0, 0,100, + 98,108,119, 97,118,249,254, 76, 85, 92, 0, 0,119, 97,118,249, +254, 75, 0, 0, 0, 0, 97, 99,117,116,229, 30, 77, 85,113, 0, + 0,100,105,101,114,101,115,105,243, 30, 79, 0, 0, 0, 0,104, + 97,108,102,119,105,100,116,232,255,107, 0, 0, 0, 0, 97, 99, +117,116,229, 1,255, 0, 0, 0, 0,109, 97, 99,114,111,238, 1, +237, 0, 0, 0, 0, 97,114, 97, 98,105,227, 6, 97, 85,177, 0, + 0, 98,101,110,103, 97,108,233, 9,231, 85,190, 0, 0, 99,105, +114, 99,108,229, 36, 96, 85,202, 86,247,100,101,118,225, 9,103, + 85,212, 0, 0,100,111,116,101,110,108,101, 97,100,101,242, 32, + 36, 85,229, 0, 0,101,105,103,104,116,232, 33, 91, 85,241, 0, + 0,102,105,116,116,101,228,246,220, 85,253, 0, 0,103,117,106, + 97,114, 97,116,233, 10,231, 86, 11, 0, 0,103,117,114,109,117, +107,104,233, 10,103, 86, 25, 0, 0,104, 97, 99,107, 97,114, 97, + 98,105,227, 6, 97, 86, 41, 0, 0,104, 97,108,230, 0,189, 86, + 51, 0, 0,104, 97,110,103,122,104,111,245, 48, 33, 86, 65, 0, + 0,105,100,101,111,103,114, 97,112,104,105, 99,112, 97,114,101, +238, 50, 32, 86, 87, 0, 0,105,110,102,101,114,105,111,242, 32, +129, 86,101, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 17, + 86,116, 0, 0,110,117,109,101,114, 97,116,111,114, 98,101,110, +103, 97,108,233, 9,244, 86,138, 0, 0,111,108,100,115,116,121, +108,229,247, 49, 86,152, 0, 0,112, 97,114,101,238, 36,116, 86, +163, 0, 0,112,101,114,105,111,228, 36,136, 86,175, 0, 0,112, +101,114,115,105, 97,238, 6,241, 86,188, 0, 0,113,117, 97,114, +116,101,242, 0,188, 86,201, 0, 0,114,111,109, 97,238, 33,112, + 86,212, 0, 0,115,117,112,101,114,105,111,242, 0,185, 86,226, + 0, 0,116,104, 97,233, 14, 81, 86,236, 0, 0,116,104,105,114, +228, 33, 83, 0, 0, 0, 0,105,110,118,101,114,115,101,115, 97, +110,115,115,101,114,105,230, 39,138, 0, 0, 0, 0,116,111,110, +111,243, 3,204, 0, 0, 0, 0,177, 3,214, 87, 31, 0, 0, 99, +121,114,105,108,108,105,227, 4, 97, 87, 45, 0, 0,108, 97,116, +105,110, 99,108,111,115,101,228, 2,119, 87, 62, 0, 0,114,111, +117,110,100, 99,121,114,105,108,108,105,227, 4,123, 87, 81, 0, + 0,116,105,116,108,111, 99,121,114,105,108,108,105,227, 4,125, + 87,100, 0, 0,116,111,110,111,243, 3,206, 0, 0, 0, 0, 97, + 99,117,116,229, 30, 83, 87,122, 0, 0,103,114, 97,118,229, 30, + 81, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255,117, + 0, 0, 0, 0,110,118,101,114,116,101,100, 98,114,101,118,229, + 2, 15, 0, 0, 0, 0, 97, 99,117,116,229, 30,219, 87,177, 0, + 0,100,111,116, 98,101,108,111,247, 30,227, 87,191, 0, 0,103, +114, 97,118,229, 30,221, 87,202, 0, 0,104,111,111,107, 97, 98, +111,118,229, 30,223, 87,217, 0, 0,116,105,108,100,229, 30,225, + 0, 0, 0, 0, 99,109,226, 3, 40, 0, 0, 0, 0,107,111,114, +101, 97,238, 49, 90, 0, 0, 0, 0, 99,121,114,105,108,108,105, +227, 4,231, 0, 0, 0, 0, 97, 99,117,116,229, 30,209, 88, 18, + 0, 0,100,111,116, 98,101,108,111,247, 30,217, 88, 32, 0, 0, +103,114, 97,118,229, 30,211, 88, 43, 0, 0,104,111,111,107, 97, + 98,111,118,229, 30,213, 88, 58, 0, 0,116,105,108,100,229, 30, +215, 0, 0, 0, 0, 99,121,114,105,108,108,105,227, 4,233, 88, + 83, 0, 0,100,105,101,114,101,115,105,115, 99,121,114,105,108, +108,105,227, 4,235, 0, 0, 0, 0, 97, 98,101,110,103, 97,108, +233, 9,168, 88,119, 0, 0, 97, 98,108,225, 34, 7, 88,129, 0, + 0, 97, 99,117,116,229, 1, 68, 88,140, 0, 0, 97,100,101,118, +225, 9, 40, 88,151, 0, 0, 97,103,117,106, 97,114, 97,116,233, + 10,168, 88,166, 0, 0, 97,103,117,114,109,117,107,104,233, 10, + 40, 88,181, 0, 0, 97,104,105,114, 97,103, 97,110,225, 48,106, + 88,196, 0, 0, 97,107, 97,116, 97,107, 97,110,225, 48,202, 88, +211, 97, 48, 97,112,111,115,116,114,111,112,104,229, 1, 73, 88, +227, 0, 0, 97,115,113,117, 97,114,229, 51,129, 88,240, 0, 0, + 98,111,112,111,109,111,102,239, 49, 11, 88,254, 0, 0, 98,115, +112, 97, 99,229, 0,160, 89, 10, 0, 0, 99, 97,114,111,238, 1, + 72, 89, 21, 0, 0, 99,101,100,105,108,108,225, 1, 70, 89, 34, + 0, 0, 99,105,114, 99,108,229, 36,221, 89, 46, 0, 0, 99,105, +114, 99,117,109,102,108,101,120, 98,101,108,111,247, 30, 75, 89, + 67, 0, 0, 99,111,109,109, 97, 97, 99, 99,101,110,244, 1, 70, + 89, 84, 0, 0,100,111,116, 97, 99, 99,101,110,244, 30, 69, 89, + 99, 0, 0,100,111,116, 98,101,108,111,247, 30, 71, 89,113, 0, + 0,101,104,105,114, 97,103, 97,110,225, 48,109, 89,128, 0, 0, +101,107, 97,116, 97,107, 97,110,225, 48,205, 89,143, 97, 33,101, +119,115,104,101,113,101,108,115,105,103,238, 32,170, 89,161, 0, + 0,102,115,113,117, 97,114,229, 51,139, 89,174, 0, 0,103, 97, + 98,101,110,103, 97,108,233, 9,153, 89,189, 0, 0,103, 97,100, +101,118,225, 9, 25, 89,201, 0, 0,103, 97,103,117,106, 97,114, + 97,116,233, 10,153, 89,217, 0, 0,103, 97,103,117,114,109,117, +107,104,233, 10, 25, 89,233, 0, 0,103,111,110,103,117,116,104, + 97,233, 14, 7, 89,248, 0, 0,104,105,114, 97,103, 97,110,225, + 48,147, 90, 6, 0, 0,104,111,111,107,108,101,102,244, 2,114, + 90, 20, 0, 0,104,111,111,107,114,101,116,114,111,102,108,101, +248, 2,115, 90, 39, 0, 0,105,101,117,110, 97, 99,105,114, 99, +108,101,107,111,114,101, 97,238, 50,111, 90, 62, 0, 0,105,101, +117,110, 97,112, 97,114,101,110,107,111,114,101, 97,238, 50, 15, + 90, 84, 0, 0,105,101,117,110, 99,105,101,117, 99,107,111,114, +101, 97,238, 49, 53, 90,105, 0, 0,105,101,117,110, 99,105,114, + 99,108,101,107,111,114,101, 97,238, 50, 97, 90,127, 0, 0,105, +101,117,110,104,105,101,117,104,107,111,114,101, 97,238, 49, 54, + 90,148, 0, 0,105,101,117,110,107,111,114,101, 97,238, 49, 52, + 90,164, 0, 0,105,101,117,110,112, 97,110,115,105,111,115,107, +111,114,101, 97,238, 49,104, 90,187, 0, 0,105,101,117,110,112, + 97,114,101,110,107,111,114,101, 97,238, 50, 1, 90,208, 0, 0, +105,101,117,110,115,105,111,115,107,111,114,101, 97,238, 49,103, + 90,228, 0, 0,105,101,117,110,116,105,107,101,117,116,107,111, +114,101, 97,238, 49,102, 90,250, 0, 0,105,104,105,114, 97,103, + 97,110,225, 48,107, 91, 9, 0, 0,105,107, 97,116, 97,107, 97, +110,225, 48,203, 91, 24, 97, 18,105,107,104, 97,104,105,116,108, +101,102,116,116,104, 97,233,248,153, 91, 45, 0, 0,105,107,104, + 97,104,105,116,116,104, 97,233, 14, 77, 91, 62, 0, 0,105,110, +229, 0, 57, 91, 71, 95,220,234, 1,204, 91, 78, 95,205,107, 97, +116, 97,107, 97,110,225, 48,243, 91, 92, 95,190,108,101,103,114, +105,103,104,116,108,111,110,231, 1,158, 91,110, 0, 0,108,105, +110,101, 98,101,108,111,247, 30, 73, 91,125, 0, 0,109,111,110, +111,115,112, 97, 99,229,255, 78, 91,140, 0, 0,109,115,113,117, + 97,114,229, 51,154, 91,153, 0, 0,110, 97, 98,101,110,103, 97, +108,233, 9,163, 91,168, 0, 0,110, 97,100,101,118,225, 9, 35, + 91,180, 0, 0,110, 97,103,117,106, 97,114, 97,116,233, 10,163, + 91,196, 0, 0,110, 97,103,117,114,109,117,107,104,233, 10, 35, + 91,212, 0, 0,110,110, 97,100,101,118,225, 9, 41, 91,225, 0, + 0,111,104,105,114, 97,103, 97,110,225, 48,110, 91,240, 0, 0, +111,107, 97,116, 97,107, 97,110,225, 48,206, 91,255, 95,175,111, +110, 98,114,101, 97,107,105,110,103,115,112, 97, 99,229, 0,160, + 92, 20, 0, 0,111,110,101,110,116,104, 97,233, 14, 19, 92, 34, + 0, 0,111,110,117,116,104, 97,233, 14, 25, 92, 47, 0, 0,111, +111,110, 97,114, 97, 98,105,227, 6, 70, 92, 62, 0, 0,111,111, +110,102,105,110, 97,108, 97,114, 97, 98,105,227,254,230, 92, 82, + 0, 0,111,111,110,103,104,117,110,110, 97, 97,114, 97, 98,105, +227, 6,186, 92,103, 0, 0,111,111,110,103,104,117,110,110, 97, +102,105,110, 97,108, 97,114, 97, 98,105,227,251,159, 92,129, 0, + 0,111,111,110,104,101,104,105,110,105,116,105, 97,108, 97,114, + 97, 98,105,227,254,231, 92,154, 0, 0,111,111,110,105,110,105, +116,105, 97,108, 97,114, 97, 98,105,227,254,231, 92,176, 0, 0, +111,111,110,106,101,101,109,105,110,105,116,105, 97,108, 97,114, + 97, 98,105,227,252,210, 92,202, 0, 0,111,111,110,106,101,101, +109,105,115,111,108, 97,116,101,100, 97,114, 97, 98,105,227,252, + 75, 92,229, 0, 0,111,111,110,109,101,100,105, 97,108, 97,114, + 97, 98,105,227,254,232, 92,250, 0, 0,111,111,110,109,101,101, +109,105,110,105,116,105, 97,108, 97,114, 97, 98,105,227,252,213, + 93, 20, 0, 0,111,111,110,109,101,101,109,105,115,111,108, 97, +116,101,100, 97,114, 97, 98,105,227,252, 78, 93, 47, 0, 0,111, +111,110,110,111,111,110,102,105,110, 97,108, 97,114, 97, 98,105, +227,252,141, 93, 71, 0, 0,111,116, 99,111,110,116, 97,105,110, +243, 34, 12, 93, 87, 0, 0,111,116,101,108,101,109,101,110,244, + 34, 9, 93,102, 95,167,111,116,101,113,117, 97,236, 34, 96, 93, +115, 0, 0,111,116,103,114,101, 97,116,101,242, 34,111, 93,130, + 95,140,111,116,105,100,101,110,116,105, 99, 97,236, 34, 98, 93, +147, 0, 0,111,116,108,101,115,243, 34,110, 93,159, 95,126,111, +116,112, 97,114, 97,108,108,101,236, 34, 38, 93,175, 0, 0,111, +116,112,114,101, 99,101,100,101,243, 34,128, 93,191, 0, 0,111, +116,115,117, 98,115,101,244, 34,132, 93,205, 0, 0,111,116,115, +117, 99, 99,101,101,100,243, 34,129, 93,221, 0, 0,111,116,115, +117,112,101,114,115,101,244, 34,133, 93,237, 0, 0,111,119, 97, +114,109,101,110,105, 97,238, 5,118, 93,253, 0, 0,112, 97,114, +101,238, 36,169, 94, 8, 0, 0,115,115,113,117, 97,114,229, 51, +177, 94, 21, 0, 0,115,117,112,101,114,105,111,242, 32,127, 94, + 35, 0, 0,116,105,108,100,229, 0,241, 94, 46, 0, 0,245, 3, +189, 94, 53, 94,138,118,115,113,117, 97,114,229, 51,181, 94, 66, + 0, 0,119,115,113,117, 97,114,229, 51,187, 94, 79, 0, 0,121, + 97, 98,101,110,103, 97,108,233, 9,158, 94, 94, 0, 0,121, 97, +100,101,118,225, 9, 30, 94,106, 0, 0,121, 97,103,117,106, 97, +114, 97,116,233, 10,158, 94,122, 0, 0,121, 97,103,117,114,109, +117,107,104,233, 10, 30, 0, 0, 0, 0,104,105,114, 97,103, 97, +110,225, 48,108, 94,152, 0, 0,107, 97,116, 97,107, 97,110,225, + 48,204, 94,166, 95,111,107,116, 97, 98,101,110,103, 97,108,233, + 9,188, 94,182, 0, 0,107,116, 97,100,101,118,225, 9, 60, 94, +195, 0, 0,107,116, 97,103,117,106, 97,114, 97,116,233, 10,188, + 94,212, 0, 0,107,116, 97,103,117,114,109,117,107,104,233, 10, + 60, 94,229, 0, 0,109, 98,101,114,115,105,103,238, 0, 35, 94, +243, 95, 85,109,101,114, 97,108,115,105,103,110,103,114,101,101, +235, 3,116, 95, 7, 0, 0,109,101,114, 97,108,115,105,103,110, +108,111,119,101,114,103,114,101,101,235, 3,117, 95, 32, 0, 0, +109,101,114,239, 33, 22, 95, 42, 0, 0,238, 5,224, 0, 0, 95, + 49,100, 97,103,101,115,232,251, 64, 95, 61, 95, 73,104,101, 98, +114,101,247, 5,224, 0, 0, 0, 0,104,101, 98,114,101,247,251, + 64, 0, 0, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 3, + 95,100, 0, 0,115,109, 97,108,236,254, 95, 0, 0, 0, 0,104, + 97,108,102,119,105,100,116,232,255,135, 0, 0, 0, 0,110,111, +114,101,113,117, 97,236, 34,112, 0, 0, 0, 0,110,111,114,101, +113,117, 97,236, 34,113, 95,154, 0, 0,110,111,114,108,101,115, +243, 34,121, 0, 0, 0, 0,111,230, 34, 9, 0, 0, 0, 0,104, + 97,108,102,119,105,100,116,232,255,137, 0, 0, 0, 0,104, 97, +108,102,119,105,100,116,232,255,157, 0, 0, 0, 0,101, 99,121, +114,105,108,108,105,227, 4, 90, 0, 0, 0, 0, 97,114, 97, 98, +105,227, 6,105, 95,232, 0, 0, 98,101,110,103, 97,108,233, 9, +239, 95,245, 0, 0, 99,105,114, 99,108,229, 36,104, 96, 1, 96, +252,100,101,118,225, 9,111, 96, 11, 0, 0,103,117,106, 97,114, + 97,116,233, 10,239, 96, 25, 0, 0,103,117,114,109,117,107,104, +233, 10,111, 96, 39, 0, 0,104, 97, 99,107, 97,114, 97, 98,105, +227, 6,105, 96, 55, 0, 0,104, 97,110,103,122,104,111,245, 48, + 41, 96, 69, 0, 0,105,100,101,111,103,114, 97,112,104,105, 99, +112, 97,114,101,238, 50, 40, 96, 91, 0, 0,105,110,102,101,114, +105,111,242, 32,137, 96,105, 0, 0,109,111,110,111,115,112, 97, + 99,229,255, 25, 96,120, 0, 0,111,108,100,115,116,121,108,229, +247, 57, 96,134, 0, 0,112, 97,114,101,238, 36,124, 96,145, 0, + 0,112,101,114,105,111,228, 36,144, 96,157, 0, 0,112,101,114, +115,105, 97,238, 6,249, 96,170, 0, 0,114,111,109, 97,238, 33, +120, 96,181, 0, 0,115,117,112,101,114,105,111,242, 32,121, 96, +195, 0, 0,116,101,101,110, 99,105,114, 99,108,229, 36,114, 96, +211, 0, 0,116,101,101,110,112, 97,114,101,238, 36,134, 96,226, + 0, 0,116,101,101,110,112,101,114,105,111,228, 36,154, 96,242, + 0, 0,116,104, 97,233, 14, 89, 0, 0, 0, 0,105,110,118,101, +114,115,101,115, 97,110,115,115,101,114,105,230, 39,146, 0, 0, + 0, 0,104, 97,108,102,119,105,100,116,232,255,134, 0, 0, 0, + 0,104, 97,108,102,119,105,100,116,232,255,136, 0, 0, 0, 0, +104, 97,108,102,119,105,100,116,232,255,133, 0, 0, 0, 0, 97, + 98,101,110,103, 97,108,233, 9,174, 97, 77, 0, 0, 97, 99,114, +111,238, 0,175, 97, 88,105,174, 97, 99,117,116,229, 30, 63, 97, + 99, 0, 0, 97,100,101,118,225, 9, 46, 97,110, 0, 0, 97,103, +117,106, 97,114, 97,116,233, 10,174, 97,125, 0, 0, 97,103,117, +114,109,117,107,104,233, 10, 46, 97,140, 0, 0, 97,104, 97,112, + 97,107,104,104,101, 98,114,101,247, 5,164, 97,159, 0, 0, 97, +104, 97,112, 97,107,104,108,101,102,116,104,101, 98,114,101,247, + 5,164, 97,182, 0, 0, 97,104,105,114, 97,103, 97,110,225, 48, +126, 97,197, 0, 0, 97,105, 99,104, 97,116,116, 97,119, 97,108, +111,119,108,101,102,116,116,104, 97,233,248,149, 97,224, 0, 0, + 97,105, 99,104, 97,116,116, 97,119, 97,108,111,119,114,105,103, +104,116,116,104, 97,233,248,148, 97,252, 0, 0, 97,105, 99,104, + 97,116,116, 97,119, 97,116,104, 97,233, 14, 75, 98, 16, 0, 0, + 97,105, 99,104, 97,116,116, 97,119, 97,117,112,112,101,114,108, +101,102,116,116,104, 97,233,248,147, 98, 45, 0, 0, 97,105,101, +107,108,111,119,108,101,102,116,116,104, 97,233,248,140, 98, 66, + 0, 0, 97,105,101,107,108,111,119,114,105,103,104,116,116,104, + 97,233,248,139, 98, 88, 0, 0, 97,105,101,107,116,104, 97,233, + 14, 72, 98,102, 0, 0, 97,105,101,107,117,112,112,101,114,108, +101,102,116,116,104, 97,233,248,138, 98,125, 0, 0, 97,105,104, + 97,110, 97,107, 97,116,108,101,102,116,116,104, 97,233,248,132, + 98,148, 0, 0, 97,105,104, 97,110, 97,107, 97,116,116,104, 97, +233, 14, 49, 98,167, 0, 0, 97,105,116, 97,105,107,104,117,108, +101,102,116,116,104, 97,233,248,137, 98,189, 0, 0, 97,105,116, + 97,105,107,104,117,116,104, 97,233, 14, 71, 98,207, 0, 0, 97, +105,116,104,111,108,111,119,108,101,102,116,116,104, 97,233,248, +143, 98,229, 0, 0, 97,105,116,104,111,108,111,119,114,105,103, +104,116,116,104, 97,233,248,142, 98,252, 0, 0, 97,105,116,104, +111,116,104, 97,233, 14, 73, 99, 11, 0, 0, 97,105,116,104,111, +117,112,112,101,114,108,101,102,116,116,104, 97,233,248,141, 99, + 35, 0, 0, 97,105,116,114,105,108,111,119,108,101,102,116,116, +104, 97,233,248,146, 99, 57, 0, 0, 97,105,116,114,105,108,111, +119,114,105,103,104,116,116,104, 97,233,248,145, 99, 80, 0, 0, + 97,105,116,114,105,116,104, 97,233, 14, 74, 99, 95, 0, 0, 97, +105,116,114,105,117,112,112,101,114,108,101,102,116,116,104, 97, +233,248,144, 99,119, 0, 0, 97,105,121, 97,109,111,107,116,104, + 97,233, 14, 70, 99,136, 0, 0, 97,107, 97,116, 97,107, 97,110, +225, 48,222, 99,151,105,159, 97,108,229, 38, 66, 99,160, 0, 0, + 97,110,115,121,111,110,115,113,117, 97,114,229, 51, 71, 99,178, + 0, 0, 97,113, 97,102,104,101, 98,114,101,247, 5,190, 99,194, + 0, 0, 97,114,243, 38, 66, 99,203, 0, 0, 97,115,111,114, 97, + 99,105,114, 99,108,101,104,101, 98,114,101,247, 5,175, 99,226, + 0, 0, 97,115,113,117, 97,114,229, 51,131, 99,239, 0, 0, 98, +111,112,111,109,111,102,239, 49, 7, 99,253, 0, 0, 98,115,113, +117, 97,114,229, 51,212,100, 10, 0, 0, 99,105,114, 99,108,229, + 36,220,100, 22, 0, 0, 99,117, 98,101,100,115,113,117, 97,114, +229, 51,165,100, 39, 0, 0,100,111,116, 97, 99, 99,101,110,244, + 30, 65,100, 54, 0, 0,100,111,116, 98,101,108,111,247, 30, 67, +100, 68, 0, 0,101,101,109, 97,114, 97, 98,105,227, 6, 69,100, + 83, 0, 0,101,101,109,102,105,110, 97,108, 97,114, 97, 98,105, +227,254,226,100,103, 0, 0,101,101,109,105,110,105,116,105, 97, +108, 97,114, 97, 98,105,227,254,227,100,125, 0, 0,101,101,109, +109,101,100,105, 97,108, 97,114, 97, 98,105,227,254,228,100,146, + 0, 0,101,101,109,109,101,101,109,105,110,105,116,105, 97,108, + 97,114, 97, 98,105,227,252,209,100,172, 0, 0,101,101,109,109, +101,101,109,105,115,111,108, 97,116,101,100, 97,114, 97, 98,105, +227,252, 72,100,199, 0, 0,101,101,116,111,114,117,115,113,117, + 97,114,229, 51, 77,100,217, 0, 0,101,104,105,114, 97,103, 97, +110,225, 48,129,100,232, 0, 0,101,105,122,105,101,114, 97,115, +113,117, 97,114,229, 51,126,100,251, 0, 0,101,107, 97,116, 97, +107, 97,110,225, 48,225,101, 10,105,144,101,237, 5,222,101, 18, +105,108,101,110, 97,114,109,101,110,105, 97,238, 5,116,101, 34, + 0, 0,101,114,107,104, 97,104,101, 98,114,101,247, 5,165,101, + 51, 0, 0,101,114,107,104, 97,107,101,102,117,108, 97,104,101, + 98,114,101,247, 5,166,101, 74, 0, 0,101,114,107,104, 97,107, +101,102,117,108, 97,108,101,102,116,104,101, 98,114,101,247, 5, +166,101,101, 0, 0,101,114,107,104, 97,108,101,102,116,104,101, + 98,114,101,247, 5,165,101,122, 0, 0,104,111,111,235, 2,113, +101,132, 0, 0,104,122,115,113,117, 97,114,229, 51,146,101,146, + 0, 0,105,100,100,108,101,100,111,116,107, 97,116, 97,107, 97, +110, 97,104, 97,108,102,119,105,100,116,232,255,101,101,177, 0, + 0,105,100,100,111,244, 0,183,101,188, 0, 0,105,101,117,109, + 97, 99,105,114, 99,108,101,107,111,114,101, 97,238, 50,114,101, +211, 0, 0,105,101,117,109, 97,112, 97,114,101,110,107,111,114, +101, 97,238, 50, 18,101,233, 0, 0,105,101,117,109, 99,105,114, + 99,108,101,107,111,114,101, 97,238, 50,100,101,255, 0, 0,105, +101,117,109,107,111,114,101, 97,238, 49, 65,102, 15, 0, 0,105, +101,117,109,112, 97,110,115,105,111,115,107,111,114,101, 97,238, + 49,112,102, 38, 0, 0,105,101,117,109,112, 97,114,101,110,107, +111,114,101, 97,238, 50, 4,102, 59, 0, 0,105,101,117,109,112, +105,101,117,112,107,111,114,101, 97,238, 49,110,102, 80, 0, 0, +105,101,117,109,115,105,111,115,107,111,114,101, 97,238, 49,111, +102,100, 0, 0,105,104,105,114, 97,103, 97,110,225, 48,127,102, +115, 0, 0,105,107, 97,116, 97,107, 97,110,225, 48,223,102,130, +105, 93,105,110,117,243, 34, 18,102,140,105, 48,105,110,117,116, +229, 32, 50,102,151, 0, 0,105,114,105, 98, 97, 97,114,117,115, +113,117, 97,114,229, 51, 74,102,171, 0, 0,105,114,105,115,113, +117, 97,114,229, 51, 73,102,186, 0, 0,108,111,110,103,108,101, +103,116,117,114,110,101,228, 2,112,102,205, 0, 0,108,115,113, +117, 97,114,229, 51,150,102,218, 0, 0,109, 99,117, 98,101,100, +115,113,117, 97,114,229, 51,163,102,236, 0, 0,109,111,110,111, +115,112, 97, 99,229,255, 77,102,251, 0, 0,109,115,113,117, 97, +114,101,100,115,113,117, 97,114,229, 51,159,103, 15, 0, 0,111, +104,105,114, 97,103, 97,110,225, 48,130,103, 30, 0, 0,111,104, +109,115,113,117, 97,114,229, 51,193,103, 45, 0, 0,111,107, 97, +116, 97,107, 97,110,225, 48,226,103, 60,105, 33,111,108,115,113, +117, 97,114,229, 51,214,103, 74, 0, 0,111,109, 97,116,104, 97, +233, 14, 33,103, 87, 0, 0,111,118,101,114,115,115,113,117, 97, +114,229, 51,167,103,104,105, 20,112, 97,114,101,238, 36,168,103, +115, 0, 0,112, 97,115,113,117, 97,114,229, 51,171,103,129, 0, + 0,115,115,113,117, 97,114,229, 51,179,103,142, 0, 0,115,117, +112,101,114,105,111,242,246,239,103,156, 0, 0,116,117,114,110, +101,228, 2,111,103,168, 0, 0,245, 0,181,103,175,103,235,118, +109,101,103, 97,115,113,117, 97,114,229, 51,185,103,192, 0, 0, +118,115,113,117, 97,114,229, 51,183,103,205, 0, 0,119,109,101, +103, 97,115,113,117, 97,114,229, 51,191,103,222, 0, 0,119,115, +113,117, 97,114,229, 51,189, 0, 0, 0, 0,177, 0,181,103,242, + 0, 0, 97,115,113,117, 97,114,229, 51,130,103,255, 0, 0, 99, +104,103,114,101, 97,116,101,242, 34,107,104, 14, 0, 0, 99,104, +108,101,115,243, 34,106,104, 26, 0, 0,102,115,113,117, 97,114, +229, 51,140,104, 39, 0, 0,103,114,101,101,235, 3,188,104, 50, + 0, 0,103,115,113,117, 97,114,229, 51,141,104, 63, 0, 0,104, +105,114, 97,103, 97,110,225, 48,128,104, 77, 0, 0,107, 97,116, + 97,107, 97,110,225, 48,224,104, 91,105, 5,108,115,113,117, 97, +114,229, 51,149,104,104, 0, 0,108,116,105,112,108,249, 0,215, +104,116, 0, 0,109,115,113,117, 97,114,229, 51,155,104,129, 0, + 0,110, 97,104,104,101, 98,114,101,247, 5,163,104,144, 0, 0, +110, 97,104,108,101,102,116,104,101, 98,114,101,247, 5,163,104, +163, 0, 0,115,105, 99, 97,108,110,111,116,229, 38,106,104,178, +104,252,115,105, 99,102,108, 97,116,115,105,103,238, 38,109,104, +195, 0, 0,115,105, 99,115,104, 97,114,112,115,105,103,238, 38, +111,104,213, 0, 0,115,115,113,117, 97,114,229, 51,178,104,226, + 0, 0,118,115,113,117, 97,114,229, 51,182,104,239, 0, 0,119, +115,113,117, 97,114,229, 51,188, 0, 0, 0, 0,100, 98,236, 38, +107, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255,145, + 0, 0, 0, 0,100,115,113,117, 97,114,229, 51,168, 0, 0, 0, + 0,104, 97,108,102,119,105,100,116,232,255,147, 0, 0, 0, 0, + 98,101,108,111,119, 99,109,226, 3, 32,105, 62, 0, 0, 99,105, +114, 99,108,229, 34,150,105, 74, 0, 0,109,111,228, 2,215,105, + 83, 0, 0,112,108,117,243, 34, 19, 0, 0, 0, 0,104, 97,108, +102,119,105,100,116,232,255,144, 0, 0, 0, 0,100, 97,103,101, +115,232,251, 62,105,120,105,132,104,101, 98,114,101,247, 5,222, + 0, 0, 0, 0,104,101, 98,114,101,247,251, 62, 0, 0, 0, 0, +104, 97,108,102,119,105,100,116,232,255,146, 0, 0, 0, 0,104, + 97,108,102,119,105,100,116,232,255,143, 0, 0, 0, 0, 98,101, +108,111,119, 99,109,226, 3, 49,105,188, 0, 0, 99,109,226, 3, + 4,105,197, 0, 0,108,111,119,109,111,228, 2,205,105,209, 0, + 0,109,111,110,111,115,112, 97, 99,229,255,227, 0, 0, 0, 0, + 97, 98,101,110,103, 97,108,233, 9,178,105,238, 0, 0, 97, 99, +117,116,229, 1, 58,105,249, 0, 0, 97,100,101,118,225, 9, 50, +106, 4, 0, 0, 97,103,117,106, 97,114, 97,116,233, 10,178,106, + 19, 0, 0, 97,103,117,114,109,117,107,104,233, 10, 50,106, 34, + 0, 0, 97,107,107,104, 97,110,103,121, 97,111,116,104, 97,233, + 14, 69,106, 54, 0, 0, 97,109, 97,108,101,102,102,105,110, 97, +108, 97,114, 97, 98,105,227,254,252,106, 77, 0, 0, 97,109, 97, +108,101,102,104, 97,109,122, 97, 97, 98,111,118,101,102,105,110, + 97,108, 97,114, 97, 98,105,227,254,248,106,110, 0, 0, 97,109, + 97,108,101,102,104, 97,109,122, 97, 97, 98,111,118,101,105,115, +111,108, 97,116,101,100, 97,114, 97, 98,105,227,254,247,106,146, + 0, 0, 97,109, 97,108,101,102,104, 97,109,122, 97, 98,101,108, +111,119,102,105,110, 97,108, 97,114, 97, 98,105,227,254,250,106, +179, 0, 0, 97,109, 97,108,101,102,104, 97,109,122, 97, 98,101, +108,111,119,105,115,111,108, 97,116,101,100, 97,114, 97, 98,105, +227,254,249,106,215, 0, 0, 97,109, 97,108,101,102,105,115,111, +108, 97,116,101,100, 97,114, 97, 98,105,227,254,251,106,241, 0, + 0, 97,109, 97,108,101,102,109, 97,100,100, 97, 97, 98,111,118, +101,102,105,110, 97,108, 97,114, 97, 98,105,227,254,246,107, 18, + 0, 0, 97,109, 97,108,101,102,109, 97,100,100, 97, 97, 98,111, +118,101,105,115,111,108, 97,116,101,100, 97,114, 97, 98,105,227, +254,245,107, 54, 0, 0, 97,109, 97,114, 97, 98,105,227, 6, 68, +107, 68, 0, 0, 97,109, 98,100,225, 3,187,107, 79,112,110, 97, +109,101,228, 5,220,107, 89,112, 27, 97,109,102,105,110, 97,108, + 97,114, 97, 98,105,227,254,222,107,108, 0, 0, 97,109,104, 97, +104,105,110,105,116,105, 97,108, 97,114, 97, 98,105,227,252,202, +107,132, 0, 0, 97,109,105,110,105,116,105, 97,108, 97,114, 97, + 98,105,227,254,223,107,153, 0, 0, 97,109,106,101,101,109,105, +110,105,116,105, 97,108, 97,114, 97, 98,105,227,252,201,107,178, + 0, 0, 97,109,107,104, 97,104,105,110,105,116,105, 97,108, 97, +114, 97, 98,105,227,252,203,107,203, 0, 0, 97,109,108, 97,109, +104,101,104,105,115,111,108, 97,116,101,100, 97,114, 97, 98,105, +227,253,242,107,231, 0, 0, 97,109,109,101,100,105, 97,108, 97, +114, 97, 98,105,227,254,224,107,251, 0, 0, 97,109,109,101,101, +109,104, 97,104,105,110,105,116,105, 97,108, 97,114, 97, 98,105, +227,253,136,108, 23, 0, 0, 97,109,109,101,101,109,105,110,105, +116,105, 97,108, 97,114, 97, 98,105,227,252,204,108, 48, 0, 0, + 97,109,109,101,101,109,106,101,101,109,105,110,105,116,105, 97, +108, 97,114, 97, 98,105,227,254,223,108, 77, 0, 0, 97,109,109, +101,101,109,107,104, 97,104,105,110,105,116,105, 97,108, 97,114, + 97, 98,105,227,254,223,108,106, 0, 0, 97,114,103,101, 99,105, +114, 99,108,229, 37,239,108,122, 0, 0, 98, 97,242, 1,154,108, +131, 0, 0, 98,101,108,244, 2,108,108,141, 0, 0, 98,111,112, +111,109,111,102,239, 49, 12,108,155, 0, 0, 99, 97,114,111,238, + 1, 62,108,166, 0, 0, 99,101,100,105,108,108,225, 1, 60,108, +179, 0, 0, 99,105,114, 99,108,229, 36,219,108,191, 0, 0, 99, +105,114, 99,117,109,102,108,101,120, 98,101,108,111,247, 30, 61, +108,212, 0, 0, 99,111,109,109, 97, 97, 99, 99,101,110,244, 1, + 60,108,229, 0, 0,100,111,244, 1, 64,108,238,111,248,101,102, +116, 97,110,103,108,101, 97, 98,111,118,101, 99,109,226, 3, 26, +109, 4, 0, 0,101,102,116,116, 97, 99,107, 98,101,108,111,119, + 99,109,226, 3, 24,109, 25, 0, 0,101,115,243, 0, 60,109, 34, +111,148,101,122,232, 2,110,109, 43, 0, 0,102, 98,108,111, 99, +235, 37,140,109, 55, 0, 0,104,111,111,107,114,101,116,114,111, +102,108,101,248, 2,109,109, 74, 0, 0,105,114,225, 32,164,109, + 83, 0, 0,105,119,110, 97,114,109,101,110,105, 97,238, 5,108, +109,100, 0, 0,234, 1,201,109,107,111,133,236,246,192,109,114, +110,245,109,105,100,100,108,101,116,105,108,100,229, 2,107,109, +131, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 76,109,146, + 0, 0,109,115,113,117, 97,114,229, 51,208,109,159, 0, 0,111, + 99,104,117,108, 97,116,104, 97,233, 14, 44,109,175, 0, 0,111, +103,105, 99, 97,108, 97,110,228, 34, 39,109,190, 0, 0,111,103, +105, 99, 97,108,110,111,244, 0,172,109,205,110,231,111,103,105, + 99, 97,108,111,242, 34, 40,109,219, 0, 0,111,108,105,110,103, +116,104, 97,233, 14, 37,109,234, 0, 0,111,110,103,243, 1,127, +109,244, 0, 0,111,119,108,105,110,101, 99,101,110,116,101,114, +108,105,110,229,254, 78,110, 10, 0, 0,111,119,108,105,110,101, + 99,109,226, 3, 50,110, 25, 0, 0,111,119,108,105,110,101,100, + 97,115,104,101,228,254, 77,110, 43, 0, 0,111,122,101,110,103, +229, 37,202,110, 55, 0, 0,112, 97,114,101,238, 36,167,110, 66, + 0, 0,115,108, 97,115,232, 1, 66,110, 77, 0, 0,115,113,117, + 97,114,229, 33, 19,110, 89, 0, 0,115,117,112,101,114,105,111, +242,246,238,110,103, 0, 0,116,115,104, 97,100,229, 37,145,110, +115, 0, 0,117,116,104, 97,233, 14, 38,110,126, 0, 0,118,111, + 99, 97,108,105, 99, 98,101,110,103, 97,108,233, 9,140,110,146, + 0, 0,118,111, 99, 97,108,105, 99,100,101,118,225, 9, 12,110, +163, 0, 0,118,111, 99, 97,108,105, 99,118,111,119,101,108,115, +105,103,110, 98,101,110,103, 97,108,233, 9,226,110,192, 0, 0, +118,111, 99, 97,108,105, 99,118,111,119,101,108,115,105,103,110, +100,101,118,225, 9, 98,110,218, 0, 0,120,115,113,117, 97,114, +229, 51,211, 0, 0, 0, 0,114,101,118,101,114,115,101,228, 35, + 16, 0, 0, 0, 0, 97,100,101,118,225, 9, 51,111, 0, 0, 0, + 97,103,117,106, 97,114, 97,116,233, 10,179,111, 15, 0, 0,105, +110,101, 98,101,108,111,247, 30, 59,111, 29, 0, 0,108, 97,100, +101,118,225, 9, 52,111, 41, 0, 0,118,111, 99, 97,108,105, 99, + 98,101,110,103, 97,108,233, 9,225,111, 61, 0, 0,118,111, 99, + 97,108,105, 99,100,101,118,225, 9, 97,111, 78, 0, 0,118,111, + 99, 97,108,105, 99,118,111,119,101,108,115,105,103,110, 98,101, +110,103, 97,108,233, 9,227,111,107, 0, 0,118,111, 99, 97,108, +105, 99,118,111,119,101,108,115,105,103,110,100,101,118,225, 9, + 99, 0, 0, 0, 0,101, 99,121,114,105,108,108,105,227, 4, 89, + 0, 0, 0, 0,101,113,117, 97,236, 34,100,111,159,111,233,109, +111,110,111,115,112, 97, 99,229,255, 28,111,174, 0, 0,111,114, +101,113,117,105,118, 97,108,101,110,244, 34,114,111,192, 0, 0, +111,114,103,114,101, 97,116,101,242, 34,118,111,207, 0, 0,111, +118,101,114,101,113,117, 97,236, 34,102,111,222, 0, 0,115,109, + 97,108,236,254,100, 0, 0, 0, 0,111,114,103,114,101, 97,116, +101,242, 34,218, 0, 0, 0, 0, 97, 99, 99,101,110,244, 1, 64, +112, 4, 0, 0, 98,101,108,111,247, 30, 55, 0, 0,112, 15,109, + 97, 99,114,111,238, 30, 57, 0, 0, 0, 0,100, 97,103,101,115, +232,251, 60,112, 39,112, 98,104,101, 98,114,101,247, 5,220,112, + 51, 0, 0,104,111,108, 97,237, 5,220, 0, 0,112, 62,100, 97, +103,101,115,232, 5,220,112, 74,112, 86,104,101, 98,114,101,247, + 5,220, 0, 0, 0, 0,104,101, 98,114,101,247, 5,220, 0, 0, + 0, 0,104,101, 98,114,101,247,251, 60, 0, 0, 0, 0,115,116, +114,111,107,229, 1,155, 0, 0, 0, 0, 97, 98, 97,115,104,107, +105,114, 99,121,114,105,108,108,105,227, 4,161,112,144, 0, 0, + 97, 98,101,110,103, 97,108,233, 9,149,112,158, 0, 0, 97, 99, +117,116,229, 30, 49,112,169, 0, 0, 97, 99,121,114,105,108,108, +105,227, 4, 58,112,184, 0, 0, 97,100,101,115, 99,101,110,100, +101,114, 99,121,114,105,108,108,105,227, 4,155,112,208, 0, 0, + 97,100,101,118,225, 9, 21,112,219, 0, 0, 97,230, 5,219,112, +227,119,146, 97,103,117,106, 97,114, 97,116,233, 10,149,112,242, + 0, 0, 97,103,117,114,109,117,107,104,233, 10, 21,113, 1, 0, + 0, 97,104,105,114, 97,103, 97,110,225, 48, 75,113, 16, 0, 0, + 97,104,111,111,107, 99,121,114,105,108,108,105,227, 4,196,113, + 35, 0, 0, 97,107, 97,116, 97,107, 97,110,225, 48,171,113, 50, +119,131, 97,112,112,225, 3,186,113, 60,119,114, 97,112,121,101, +111,117,110,109,105,101,117,109,107,111,114,101, 97,238, 49,113, +113, 84, 0, 0, 97,112,121,101,111,117,110,112,104,105,101,117, +112,104,107,111,114,101, 97,238, 49,132,113,110, 0, 0, 97,112, +121,101,111,117,110,112,105,101,117,112,107,111,114,101, 97,238, + 49,120,113,134, 0, 0, 97,112,121,101,111,117,110,115,115, 97, +110,103,112,105,101,117,112,107,111,114,101, 97,238, 49,121,113, +163, 0, 0, 97,114,111,114,105,105,115,113,117, 97,114,229, 51, + 13,113,181, 0, 0, 97,115,104,105,100, 97, 97,117,116,111, 97, +114, 97, 98,105,227, 6, 64,113,203, 0, 0, 97,115,104,105,100, + 97, 97,117,116,111,110,111,115,105,100,101, 98,101, 97,114,105, +110,103, 97,114, 97, 98,105,227, 6, 64,113,238, 0, 0, 97,115, +109, 97,108,108,107, 97,116, 97,107, 97,110,225, 48,245,114, 2, + 0, 0, 97,115,113,117, 97,114,229, 51,132,114, 15, 0, 0, 97, +115,114, 97, 97,114, 97, 98,105,227, 6, 80,114, 31, 0, 0, 97, +115,114, 97,116, 97,110, 97,114, 97, 98,105,227, 6, 77,114, 50, + 0, 0, 97,115,116,114,111,107,101, 99,121,114,105,108,108,105, +227, 4,159,114, 71, 0, 0, 97,116, 97,104,105,114, 97,112,114, +111,108,111,110,103,109, 97,114,107,104, 97,108,102,119,105,100, +116,232,255,112,114,104, 0, 0, 97,118,101,114,116,105, 99, 97, +108,115,116,114,111,107,101, 99,121,114,105,108,108,105,227, 4, +157,114,133, 0, 0, 98,111,112,111,109,111,102,239, 49, 14,114, +147, 0, 0, 99, 97,108,115,113,117, 97,114,229, 51,137,114,162, + 0, 0, 99, 97,114,111,238, 1,233,114,173, 0, 0, 99,101,100, +105,108,108,225, 1, 55,114,186, 0, 0, 99,105,114, 99,108,229, + 36,218,114,198, 0, 0, 99,111,109,109, 97, 97, 99, 99,101,110, +244, 1, 55,114,215, 0, 0,100,111,116, 98,101,108,111,247, 30, + 51,114,229, 0, 0,101,104, 97,114,109,101,110,105, 97,238, 5, +132,114,245, 0, 0,101,104,105,114, 97,103, 97,110,225, 48, 81, +115, 4, 0, 0,101,107, 97,116, 97,107, 97,110,225, 48,177,115, + 19,119, 99,101,110, 97,114,109,101,110,105, 97,238, 5,111,115, + 35, 0, 0,101,115,109, 97,108,108,107, 97,116, 97,107, 97,110, +225, 48,246,115, 55, 0, 0,103,114,101,101,110,108, 97,110,100, +105,227, 1, 56,115, 72, 0, 0,104, 97, 98,101,110,103, 97,108, +233, 9,150,115, 87, 0, 0,104, 97, 99,121,114,105,108,108,105, +227, 4, 69,115,103, 0, 0,104, 97,100,101,118,225, 9, 22,115, +115, 0, 0,104, 97,103,117,106, 97,114, 97,116,233, 10,150,115, +131, 0, 0,104, 97,103,117,114,109,117,107,104,233, 10, 22,115, +147, 0, 0,104, 97,104, 97,114, 97, 98,105,227, 6, 46,115,162, + 0, 0,104, 97,104,102,105,110, 97,108, 97,114, 97, 98,105,227, +254,166,115,182, 0, 0,104, 97,104,105,110,105,116,105, 97,108, + 97,114, 97, 98,105,227,254,167,115,204, 0, 0,104, 97,104,109, +101,100,105, 97,108, 97,114, 97, 98,105,227,254,168,115,225, 0, + 0,104,101,105, 99,111,112,116,105,227, 3,231,115,240, 0, 0, +104,104, 97,100,101,118,225, 9, 89,115,253, 0, 0,104,104, 97, +103,117,114,109,117,107,104,233, 10, 89,116, 14, 0, 0,104,105, +101,117,107,104, 97, 99,105,114, 99,108,101,107,111,114,101, 97, +238, 50,120,116, 39, 0, 0,104,105,101,117,107,104, 97,112, 97, +114,101,110,107,111,114,101, 97,238, 50, 24,116, 63, 0, 0,104, +105,101,117,107,104, 99,105,114, 99,108,101,107,111,114,101, 97, +238, 50,106,116, 87, 0, 0,104,105,101,117,107,104,107,111,114, +101, 97,238, 49, 75,116,105, 0, 0,104,105,101,117,107,104,112, + 97,114,101,110,107,111,114,101, 97,238, 50, 10,116,128, 0, 0, +104,111,107,104, 97,105,116,104, 97,233, 14, 2,116,144, 0, 0, +104,111,107,104,111,110,116,104, 97,233, 14, 5,116,160, 0, 0, +104,111,107,104,117, 97,116,116,104, 97,233, 14, 3,116,177, 0, + 0,104,111,107,104,119, 97,105,116,104, 97,233, 14, 4,116,194, + 0, 0,104,111,109,117,116,116,104, 97,233, 14, 91,116,209, 0, + 0,104,111,111,235, 1,153,116,219, 0, 0,104,111,114, 97,107, +104, 97,110,103,116,104, 97,233, 14, 6,116,238, 0, 0,104,122, +115,113,117, 97,114,229, 51,145,116,252, 0, 0,105,104,105,114, + 97,103, 97,110,225, 48, 77,117, 11, 0, 0,105,107, 97,116, 97, +107, 97,110,225, 48,173,117, 26,119, 84,105,114,111,103,117,114, + 97,109,117,115,113,117, 97,114,229, 51, 21,117, 47, 0, 0,105, +114,111,109,101,101,116,111,114,117,115,113,117, 97,114,229, 51, + 22,117, 69, 0, 0,105,114,111,115,113,117, 97,114,229, 51, 20, +117, 84, 0, 0,105,121,101,111,107, 97, 99,105,114, 99,108,101, +107,111,114,101, 97,238, 50,110,117,108, 0, 0,105,121,101,111, +107, 97,112, 97,114,101,110,107,111,114,101, 97,238, 50, 14,117, +131, 0, 0,105,121,101,111,107, 99,105,114, 99,108,101,107,111, +114,101, 97,238, 50, 96,117,154, 0, 0,105,121,101,111,107,107, +111,114,101, 97,238, 49, 49,117,171, 0, 0,105,121,101,111,107, +112, 97,114,101,110,107,111,114,101, 97,238, 50, 0,117,193, 0, + 0,105,121,101,111,107,115,105,111,115,107,111,114,101, 97,238, + 49, 51,117,214, 0, 0,106,101, 99,121,114,105,108,108,105,227, + 4, 92,117,230, 0, 0,108,105,110,101, 98,101,108,111,247, 30, + 53,117,245, 0, 0,108,115,113,117, 97,114,229, 51,152,118, 2, + 0, 0,109, 99,117, 98,101,100,115,113,117, 97,114,229, 51,166, +118, 20, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 75,118, + 35, 0, 0,109,115,113,117, 97,114,101,100,115,113,117, 97,114, +229, 51,162,118, 55, 0, 0,111,104,105,114, 97,103, 97,110,225, + 48, 83,118, 70, 0, 0,111,104,109,115,113,117, 97,114,229, 51, +192,118, 85, 0, 0,111,107, 97,105,116,104, 97,233, 14, 1,118, + 99, 0, 0,111,107, 97,116, 97,107, 97,110,225, 48,179,118,114, +119, 69,111,111,112,111,115,113,117, 97,114,229, 51, 30,118,130, + 0, 0,111,112,112, 97, 99,121,114,105,108,108,105,227, 4,129, +118,148, 0, 0,111,114,101, 97,110,115,116, 97,110,100, 97,114, +100,115,121,109, 98,111,236, 50,127,118,173, 0, 0,111,114,111, +110,105,115, 99,109,226, 3, 67,118,188, 0, 0,112, 97,114,101, +238, 36,166,118,199, 0, 0,112, 97,115,113,117, 97,114,229, 51, +170,118,213, 0, 0,115,105, 99,121,114,105,108,108,105,227, 4, +111,118,229, 0, 0,116,115,113,117, 97,114,229, 51,207,118,242, + 0, 0,116,117,114,110,101,228, 2,158,118,254, 0, 0,117,104, +105,114, 97,103, 97,110,225, 48, 79,119, 13, 0, 0,117,107, 97, +116, 97,107, 97,110,225, 48,175,119, 28,119, 54,118,115,113,117, + 97,114,229, 51,184,119, 41, 0, 0,119,115,113,117, 97,114,229, + 51,190, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255, +120, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255,122, + 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255,119, 0, + 0, 0, 0,104, 97,108,102,119,105,100,116,232,255,121, 0, 0, + 0, 0,115,121,109, 98,111,108,103,114,101,101,235, 3,240, 0, + 0, 0, 0,104, 97,108,102,119,105,100,116,232,255,118, 0, 0, + 0, 0, 97,114, 97, 98,105,227, 6, 67,119,158, 0, 0,100, 97, +103,101,115,232,251, 59,119,170,119,252,102,105,110, 97,108, 97, +114, 97, 98,105,227,254,218,119,187, 0, 0,104,101, 98,114,101, +247, 5,219,119,199, 0, 0,105,110,105,116,105, 97,108, 97,114, + 97, 98,105,227,254,219,119,218, 0, 0,109,101,100,105, 97,108, + 97,114, 97, 98,105,227,254,220,119,236, 0, 0,114, 97,102,101, +104,101, 98,114,101,247,251, 77, 0, 0, 0, 0,104,101, 98,114, +101,247,251, 59, 0, 0, 0, 0, 97, 97,114,109,101,110,105, 97, +238, 5,113,120, 23, 0, 0, 97, 98,101,110,103, 97,108,233, 9, +156,120, 37, 0, 0, 97,100,101,118,225, 9, 28,120, 48, 0, 0, + 97,103,117,106, 97,114, 97,116,233, 10,156,120, 63, 0, 0, 97, +103,117,114,109,117,107,104,233, 10, 28,120, 78, 0, 0, 98,111, +112,111,109,111,102,239, 49, 16,120, 92, 0, 0, 99, 97,114,111, +238, 1,240,120,103, 0, 0, 99,105,114, 99,108,229, 36,217,120, +115, 0, 0, 99,105,114, 99,117,109,102,108,101,248, 1, 53,120, +131, 0, 0, 99,114,111,115,115,101,100,116, 97,105,236, 2,157, +120,148, 0, 0,100,111,116,108,101,115,115,115,116,114,111,107, +229, 2, 95,120,167, 0, 0,101, 99,121,114,105,108,108,105,227, + 4, 88,120,182, 0, 0,101,101,109, 97,114, 97, 98,105,227, 6, + 44,120,197, 0, 0,101,101,109,102,105,110, 97,108, 97,114, 97, + 98,105,227,254,158,120,217, 0, 0,101,101,109,105,110,105,116, +105, 97,108, 97,114, 97, 98,105,227,254,159,120,239, 0, 0,101, +101,109,109,101,100,105, 97,108, 97,114, 97, 98,105,227,254,160, +121, 4, 0, 0,101,104, 97,114, 97, 98,105,227, 6,152,121, 18, + 0, 0,101,104,102,105,110, 97,108, 97,114, 97, 98,105,227,251, +139,121, 37, 0, 0,104, 97, 98,101,110,103, 97,108,233, 9,157, +121, 52, 0, 0,104, 97,100,101,118,225, 9, 29,121, 64, 0, 0, +104, 97,103,117,106, 97,114, 97,116,233, 10,157,121, 80, 0, 0, +104, 97,103,117,114,109,117,107,104,233, 10, 29,121, 96, 0, 0, +104,101,104, 97,114,109,101,110,105, 97,238, 5,123,121,113, 0, + 0,105,243, 48, 4,121,121, 0, 0,109,111,110,111,115,112, 97, + 99,229,255, 74,121,136, 0, 0,112, 97,114,101,238, 36,165,121, +147, 0, 0,115,117,112,101,114,105,111,242, 2,178, 0, 0, 0, + 0, 97, 99,117,116,229, 0,237,121,172, 0, 0, 97, 99,121,114, +105,108,108,105,227, 4, 79,121,187, 0, 0, 98,101,110,103, 97, +108,233, 9,135,121,200, 0, 0, 98,111,112,111,109,111,102,239, + 49, 39,121,214, 0, 0, 98,114,101,118,229, 1, 45,121,225, 0, + 0, 99, 97,114,111,238, 1,208,121,236, 0, 0, 99,105,114, 99, +108,229, 36,216,121,248, 0, 0, 99,105,114, 99,117,109,102,108, +101,248, 0,238,122, 8, 0, 0, 99,121,114,105,108,108,105,227, + 4, 86,122, 22, 0, 0,100, 98,108,103,114, 97,118,229, 2, 9, +122, 36, 0, 0,100,101,111,103,114, 97,112,104,101, 97,114,116, +104, 99,105,114, 99,108,229, 50,143,122, 61, 0, 0,100,101,111, +103,114, 97,112,104,102,105,114,101, 99,105,114, 99,108,229, 50, +139,122, 85, 0, 0,100,101,111,103,114, 97,112,104,105, 99, 97, +108,108,105, 97,110, 99,101,112, 97,114,101,238, 50, 63,122,114, + 0, 0,100,101,111,103,114, 97,112,104,105, 99, 99, 97,108,108, +112, 97,114,101,238, 50, 58,122,139, 0, 0,100,101,111,103,114, + 97,112,104,105, 99, 99,101,110,116,114,101, 99,105,114, 99,108, +229, 50,165,122,167, 0, 0,100,101,111,103,114, 97,112,104,105, + 99, 99,108,111,115,229, 48, 6,122,188, 0, 0,100,101,111,103, +114, 97,112,104,105, 99, 99,111,109,109,225, 48, 1,122,209,132, + 40,100,101,111,103,114, 97,112,104,105, 99, 99,111,110,103,114, + 97,116,117,108, 97,116,105,111,110,112, 97,114,101,238, 50, 55, +122,244, 0, 0,100,101,111,103,114, 97,112,104,105, 99, 99,111, +114,114,101, 99,116, 99,105,114, 99,108,229, 50,163,123, 17, 0, + 0,100,101,111,103,114, 97,112,104,105, 99,101, 97,114,116,104, +112, 97,114,101,238, 50, 47,123, 43, 0, 0,100,101,111,103,114, + 97,112,104,105, 99,101,110,116,101,114,112,114,105,115,101,112, + 97,114,101,238, 50, 61,123, 74, 0, 0,100,101,111,103,114, 97, +112,104,105, 99,101,120, 99,101,108,108,101,110,116, 99,105,114, + 99,108,229, 50,157,123,105, 0, 0,100,101,111,103,114, 97,112, +104,105, 99,102,101,115,116,105,118, 97,108,112, 97,114,101,238, + 50, 64,123,134, 0, 0,100,101,111,103,114, 97,112,104,105, 99, +102,105,110, 97,110, 99,105, 97,108, 99,105,114, 99,108,229, 50, +150,123,165, 0, 0,100,101,111,103,114, 97,112,104,105, 99,102, +105,110, 97,110, 99,105, 97,108,112, 97,114,101,238, 50, 54,123, +195, 0, 0,100,101,111,103,114, 97,112,104,105, 99,102,105,114, +101,112, 97,114,101,238, 50, 43,123,220, 0, 0,100,101,111,103, +114, 97,112,104,105, 99,104, 97,118,101,112, 97,114,101,238, 50, + 50,123,245, 0, 0,100,101,111,103,114, 97,112,104,105, 99,104, +105,103,104, 99,105,114, 99,108,229, 50,164,124, 15, 0, 0,100, +101,111,103,114, 97,112,104,105, 99,105,116,101,114, 97,116,105, +111,110,109, 97,114,235, 48, 5,124, 44, 0, 0,100,101,111,103, +114, 97,112,104,105, 99,108, 97, 98,111,114, 99,105,114, 99,108, +229, 50,152,124, 71, 0, 0,100,101,111,103,114, 97,112,104,105, + 99,108, 97, 98,111,114,112, 97,114,101,238, 50, 56,124, 97, 0, + 0,100,101,111,103,114, 97,112,104,105, 99,108,101,102,116, 99, +105,114, 99,108,229, 50,167,124,123, 0, 0,100,101,111,103,114, + 97,112,104,105, 99,108,111,119, 99,105,114, 99,108,229, 50,166, +124,148, 0, 0,100,101,111,103,114, 97,112,104,105, 99,109,101, +100,105, 99,105,110,101, 99,105,114, 99,108,229, 50,169,124,178, + 0, 0,100,101,111,103,114, 97,112,104,105, 99,109,101,116, 97, +108,112, 97,114,101,238, 50, 46,124,204, 0, 0,100,101,111,103, +114, 97,112,104,105, 99,109,111,111,110,112, 97,114,101,238, 50, + 42,124,229, 0, 0,100,101,111,103,114, 97,112,104,105, 99,110, + 97,109,101,112, 97,114,101,238, 50, 52,124,254, 0, 0,100,101, +111,103,114, 97,112,104,105, 99,112,101,114,105,111,228, 48, 2, +125, 20, 0, 0,100,101,111,103,114, 97,112,104,105, 99,112,114, +105,110,116, 99,105,114, 99,108,229, 50,158,125, 47, 0, 0,100, +101,111,103,114, 97,112,104,105, 99,114,101, 97, 99,104,112, 97, +114,101,238, 50, 67,125, 73, 0, 0,100,101,111,103,114, 97,112, +104,105, 99,114,101,112,114,101,115,101,110,116,112, 97,114,101, +238, 50, 57,125,103, 0, 0,100,101,111,103,114, 97,112,104,105, + 99,114,101,115,111,117,114, 99,101,112, 97,114,101,238, 50, 62, +125,132, 0, 0,100,101,111,103,114, 97,112,104,105, 99,114,105, +103,104,116, 99,105,114, 99,108,229, 50,168,125,159, 0, 0,100, +101,111,103,114, 97,112,104,105, 99,115,101, 99,114,101,116, 99, +105,114, 99,108,229, 50,153,125,187, 0, 0,100,101,111,103,114, + 97,112,104,105, 99,115,101,108,102,112, 97,114,101,238, 50, 66, +125,212, 0, 0,100,101,111,103,114, 97,112,104,105, 99,115,111, + 99,105,101,116,121,112, 97,114,101,238, 50, 51,125,240, 0, 0, +100,101,111,103,114, 97,112,104,105, 99,115,112, 97, 99,229, 48, + 0,126, 5, 0, 0,100,101,111,103,114, 97,112,104,105, 99,115, +112,101, 99,105, 97,108,112, 97,114,101,238, 50, 53,126, 33, 0, + 0,100,101,111,103,114, 97,112,104,105, 99,115,116,111, 99,107, +112, 97,114,101,238, 50, 49,126, 59, 0, 0,100,101,111,103,114, + 97,112,104,105, 99,115,116,117,100,121,112, 97,114,101,238, 50, + 59,126, 85, 0, 0,100,101,111,103,114, 97,112,104,105, 99,115, +117,110,112, 97,114,101,238, 50, 48,126,109, 0, 0,100,101,111, +103,114, 97,112,104,105, 99,115,117,112,101,114,118,105,115,101, +112, 97,114,101,238, 50, 60,126,139, 0, 0,100,101,111,103,114, + 97,112,104,105, 99,119, 97,116,101,114,112, 97,114,101,238, 50, + 44,126,165, 0, 0,100,101,111,103,114, 97,112,104,105, 99,119, +111,111,100,112, 97,114,101,238, 50, 45,126,190, 0, 0,100,101, +111,103,114, 97,112,104,105, 99,122,101,114,239, 48, 7,126,210, + 0, 0,100,101,111,103,114, 97,112,104,109,101,116, 97,108, 99, +105,114, 99,108,229, 50,142,126,235, 0, 0,100,101,111,103,114, + 97,112,104,109,111,111,110, 99,105,114, 99,108,229, 50,138,127, + 3, 0, 0,100,101,111,103,114, 97,112,104,110, 97,109,101, 99, +105,114, 99,108,229, 50,148,127, 27, 0, 0,100,101,111,103,114, + 97,112,104,115,117,110, 99,105,114, 99,108,229, 50,144,127, 50, + 0, 0,100,101,111,103,114, 97,112,104,119, 97,116,101,114, 99, +105,114, 99,108,229, 50,140,127, 75, 0, 0,100,101,111,103,114, + 97,112,104,119,111,111,100, 99,105,114, 99,108,229, 50,141,127, + 99, 0, 0,100,101,118,225, 9, 7,127,109, 0, 0,100,105,101, +114,101,115,105,243, 0,239,127,123,132, 15,100,111,116, 98,101, +108,111,247, 30,203,127,137, 0, 0,101, 98,114,101,118,101, 99, +121,114,105,108,108,105,227, 4,215,127,157, 0, 0,101, 99,121, +114,105,108,108,105,227, 4, 53,127,172, 0, 0,101,117,110,103, + 97, 99,105,114, 99,108,101,107,111,114,101, 97,238, 50,117,127, +195, 0, 0,101,117,110,103, 97,112, 97,114,101,110,107,111,114, +101, 97,238, 50, 21,127,217, 0, 0,101,117,110,103, 99,105,114, + 99,108,101,107,111,114,101, 97,238, 50,103,127,239, 0, 0,101, +117,110,103,107,111,114,101, 97,238, 49, 71,127,255, 0, 0,101, +117,110,103,112, 97,114,101,110,107,111,114,101, 97,238, 50, 7, +128, 20, 0, 0,103,114, 97,118,229, 0,236,128, 31, 0, 0,103, +117,106, 97,114, 97,116,233, 10,135,128, 45, 0, 0,103,117,114, +109,117,107,104,233, 10, 7,128, 59, 0, 0,104,105,114, 97,103, + 97,110,225, 48, 68,128, 73, 0, 0,104,111,111,107, 97, 98,111, +118,229, 30,201,128, 88, 0, 0,105, 98,101,110,103, 97,108,233, + 9,136,128,102, 0, 0,105, 99,121,114,105,108,108,105,227, 4, + 56,128,117, 0, 0,105,100,101,118,225, 9, 8,128,128, 0, 0, +105,103,117,106, 97,114, 97,116,233, 10,136,128,143, 0, 0,105, +103,117,114,109,117,107,104,233, 10, 8,128,158, 0, 0,105,109, + 97,116,114, 97,103,117,114,109,117,107,104,233, 10, 64,128,178, + 0, 0,105,110,118,101,114,116,101,100, 98,114,101,118,229, 2, + 11,128,197, 0, 0,105,115,104,111,114,116, 99,121,114,105,108, +108,105,227, 4, 57,128,217, 0, 0,105,118,111,119,101,108,115, +105,103,110, 98,101,110,103, 97,108,233, 9,192,128,240, 0, 0, +105,118,111,119,101,108,115,105,103,110,100,101,118,225, 9, 64, +129, 4, 0, 0,105,118,111,119,101,108,115,105,103,110,103,117, +106, 97,114, 97,116,233, 10,192,129, 28, 0, 0,234, 1, 51,129, + 35, 0, 0,107, 97,116, 97,107, 97,110,225, 48,164,129, 49,132, + 0,107,111,114,101, 97,238, 49, 99,129, 61, 0, 0,108,100,229, + 2,220,129, 70, 0, 0,108,117,121,104,101, 98,114,101,247, 5, +172,129, 85, 0, 0,109, 97, 99,114,111,238, 1, 43,129, 97,131, +242,109, 97,103,101,111,114, 97,112,112,114,111,120,105,109, 97, +116,101,108,121,101,113,117, 97,236, 34, 83,129,127, 0, 0,109, + 97,116,114, 97,103,117,114,109,117,107,104,233, 10, 63,129,146, + 0, 0,109,111,110,111,115,112, 97, 99,229,255, 73,129,161, 0, + 0,110, 99,114,101,109,101,110,244, 34, 6,129,175, 0, 0,110, +102,105,110,105,116,249, 34, 30,129,188, 0, 0,110,105, 97,114, +109,101,110,105, 97,238, 5,107,129,204, 0, 0,110,116,101,103, +114, 97,236, 34, 43,129,217,131,197,110,116,101,114,115,101, 99, +116,105,111,238, 34, 41,129,234, 0, 0,110,116,105,115,113,117, + 97,114,229, 51, 5,129,249, 0, 0,110,118, 98,117,108,108,101, +244, 37,216,130, 7, 0, 0,110,118, 99,105,114, 99,108,229, 37, +217,130, 21, 0, 0,110,118,115,109,105,108,101,102, 97, 99,229, + 38, 59,130, 38, 0, 0,111, 99,121,114,105,108,108,105,227, 4, + 81,130, 53, 0, 0,111,103,111,110,101,235, 1, 47,130, 65, 0, + 0,111,116,225, 3,185,130, 74,131,150,112, 97,114,101,238, 36, +164,130, 85, 0, 0,114,105,103,117,114,109,117,107,104,233, 10, +114,130,101, 0, 0,115,109, 97,108,108,104,105,114, 97,103, 97, +110,225, 48, 67,130,120, 0, 0,115,109, 97,108,108,107, 97,116, + 97,107, 97,110,225, 48,163,130,139,131,135,115,115,104, 97,114, + 98,101,110,103, 97,108,233, 9,250,130,157, 0, 0,115,116,114, +111,107,229, 2,104,130,169, 0, 0,115,117,112,101,114,105,111, +242,246,237,130,183, 0, 0,116,101,114, 97,116,105,111,110,104, +105,114, 97,103, 97,110,225, 48,157,130,205, 0, 0,116,101,114, + 97,116,105,111,110,107, 97,116, 97,107, 97,110,225, 48,253,130, +227, 0, 0,116,105,108,100,229, 1, 41,130,238,131,124,117, 98, +111,112,111,109,111,102,239, 49, 41,130,253, 0, 0,117, 99,121, +114,105,108,108,105,227, 4, 78,131, 12, 0, 0,118,111,119,101, +108,115,105,103,110, 98,101,110,103, 97,108,233, 9,191,131, 34, + 0, 0,118,111,119,101,108,115,105,103,110,100,101,118,225, 9, + 63,131, 53, 0, 0,118,111,119,101,108,115,105,103,110,103,117, +106, 97,114, 97,116,233, 10,191,131, 76, 0, 0,122,104,105,116, +115, 97, 99,121,114,105,108,108,105,227, 4,117,131, 96, 0, 0, +122,104,105,116,115, 97,100, 98,108,103,114, 97,118,101, 99,121, +114,105,108,108,105,227, 4,119, 0, 0, 0, 0, 98,101,108,111, +247, 30, 45, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232, +255,104, 0, 0, 0, 0,100,105,101,114,101,115,105,243, 3,202, +131,164,131,186,108, 97,116,105,238, 2,105,131,175, 0, 0,116, +111,110,111,243, 3,175, 0, 0, 0, 0,116,111,110,111,243, 3, +144, 0, 0, 0, 0, 98,111,116,116,111,237, 35, 33,131,209, 0, + 0, 98,244, 35, 33,131,217, 0, 0,101,248,248,245,131,225, 0, + 0,116,111,240, 35, 32,131,234, 0, 0,116,240, 35, 32, 0, 0, + 0, 0, 99,121,114,105,108,108,105,227, 4,227, 0, 0, 0, 0, +104, 97,108,102,119,105,100,116,232,255,114, 0, 0, 0, 0, 97, + 99,117,116,229, 30, 47,132, 26, 0, 0, 99,121,114,105,108,108, +105,227, 4,229, 0, 0, 0, 0,108,101,102,244,255,100, 0, 0, + 0, 0, 97, 97, 98,107,104, 97,115,105, 97,110, 99,121,114,105, +108,108,105,227, 4,169,132, 74, 0, 0, 97, 97,108,116,111,110, +101, 97,114, 97, 98,105,227, 6,193,132, 93, 0, 0, 97, 98,101, +110,103, 97,108,233, 9,185,132,107, 0, 0, 97,100,101,115, 99, +101,110,100,101,114, 99,121,114,105,108,108,105,227, 4,179,132, +131, 0, 0, 97,100,101,118,225, 9, 57,132,142, 0, 0, 97,103, +117,106, 97,114, 97,116,233, 10,185,132,157, 0, 0, 97,103,117, +114,109,117,107,104,233, 10, 57,132,172, 0, 0, 97,104, 97,114, + 97, 98,105,227, 6, 45,132,186, 0, 0, 97,104,102,105,110, 97, +108, 97,114, 97, 98,105,227,254,162,132,205, 0, 0, 97,104,105, +110,105,116,105, 97,108, 97,114, 97, 98,105,227,254,163,132,226, + 0, 0, 97,104,105,114, 97,103, 97,110,225, 48,111,132,241, 0, + 0, 97,104,109,101,100,105, 97,108, 97,114, 97, 98,105,227,254, +164,133, 5, 0, 0, 97,105,116,117,115,113,117, 97,114,229, 51, + 42,133, 21, 0, 0, 97,107, 97,116, 97,107, 97,110,225, 48,207, +133, 36,141, 60, 97,108, 97,110,116,103,117,114,109,117,107,104, +233, 10, 77,133, 55, 0, 0, 97,109,122, 97, 97,114, 97, 98,105, +227, 6, 33,133, 71, 0, 0, 97,109,122, 97,100, 97,109,109, 97, + 97,114, 97, 98,105,227, 6, 33,133, 92, 0, 0, 97,109,122, 97, +100, 97,109,109, 97,116, 97,110, 97,114, 97, 98,105,227, 6, 33, +133,116, 0, 0, 97,109,122, 97,102, 97,116,104, 97, 97,114, 97, + 98,105,227, 6, 33,133,137, 0, 0, 97,109,122, 97,102, 97,116, +104, 97,116, 97,110, 97,114, 97, 98,105,227, 6, 33,133,161, 0, + 0, 97,109,122, 97,108,111,119, 97,114, 97, 98,105,227, 6, 33, +133,180, 0, 0, 97,109,122, 97,108,111,119,107, 97,115,114, 97, + 97,114, 97, 98,105,227, 6, 33,133,204, 0, 0, 97,109,122, 97, +108,111,119,107, 97,115,114, 97,116, 97,110, 97,114, 97, 98,105, +227, 6, 33,133,231, 0, 0, 97,109,122, 97,115,117,107,117,110, + 97,114, 97, 98,105,227, 6, 33,133,252, 0, 0, 97,110,103,117, +108,102,105,108,108,101,242, 49,100,134, 13, 0, 0, 97,114,100, +115,105,103,110, 99,121,114,105,108,108,105,227, 4, 74,134, 34, + 0, 0, 97,114,112,111,111,110,108,101,102,116, 98, 97,114, 98, +117,240, 33,188,134, 56, 0, 0, 97,114,112,111,111,110,114,105, +103,104,116, 98, 97,114, 98,117,240, 33,192,134, 79, 0, 0, 97, +115,113,117, 97,114,229, 51,202,134, 92, 0, 0, 97,116, 97,102, +112, 97,116, 97,232, 5,178,134,107,140,227, 97,116, 97,102,113, + 97,109, 97,116,243, 5,179,134,123,140,138, 97,116, 97,102,115, +101,103,111,236, 5,177,134,138,140, 49, 98, 97,242, 1, 39,134, +147, 0, 0, 98,111,112,111,109,111,102,239, 49, 15,134,161, 0, + 0, 98,114,101,118,101, 98,101,108,111,247, 30, 43,134,177, 0, + 0, 99,101,100,105,108,108,225, 30, 41,134,190, 0, 0, 99,105, +114, 99,108,229, 36,215,134,202, 0, 0, 99,105,114, 99,117,109, +102,108,101,248, 1, 37,134,218, 0, 0,100,105,101,114,101,115, +105,243, 30, 39,134,232, 0, 0,100,111,116, 97, 99, 99,101,110, +244, 30, 35,134,247, 0, 0,100,111,116, 98,101,108,111,247, 30, + 37,135, 5, 0, 0,229, 5,212,135, 12,138,111,104,111,111,235, + 2,102,135, 22,138, 97,105,101,117,104, 97, 99,105,114, 99,108, +101,107,111,114,101, 97,238, 50,123,135, 45, 0, 0,105,101,117, +104, 97,112, 97,114,101,110,107,111,114,101, 97,238, 50, 27,135, + 67, 0, 0,105,101,117,104, 99,105,114, 99,108,101,107,111,114, +101, 97,238, 50,109,135, 89, 0, 0,105,101,117,104,107,111,114, +101, 97,238, 49, 78,135,105, 0, 0,105,101,117,104,112, 97,114, +101,110,107,111,114,101, 97,238, 50, 13,135,126, 0, 0,105,104, +105,114, 97,103, 97,110,225, 48,114,135,141, 0, 0,105,107, 97, +116, 97,107, 97,110,225, 48,210,135,156,138, 82,105,114,105,241, + 5,180,135,166,137,249,108,105,110,101, 98,101,108,111,247, 30, +150,135,181, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 72, +135,196, 0, 0,111, 97,114,109,101,110,105, 97,238, 5,112,135, +211, 0, 0,111,104,105,112,116,104, 97,233, 14, 43,135,225, 0, + 0,111,104,105,114, 97,103, 97,110,225, 48,123,135,240, 0, 0, +111,107, 97,116, 97,107, 97,110,225, 48,219,135,255,137,234,111, +108, 97,237, 5,185,136, 9,137,145,111,110,111,107,104,117,107, +116,104, 97,233, 14, 46,136, 26, 0, 0,111,111,107, 97, 98,111, +118,101, 99,111,109,226, 3, 9,136, 44, 0, 0,111,111,107, 99, +109,226, 3, 9,136, 56, 0, 0,111,111,107,112, 97,108, 97,116, + 97,108,105,122,101,100, 98,101,108,111,119, 99,109,226, 3, 33, +136, 84, 0, 0,111,111,107,114,101,116,114,111,102,108,101,120, + 98,101,108,111,119, 99,109,226, 3, 34,136,110, 0, 0,111,111, +110,115,113,117, 97,114,229, 51, 66,136,125, 0, 0,111,114,105, + 99,111,112,116,105,227, 3,233,136,140, 0, 0,111,114,105,122, +111,110,116, 97,108, 98, 97,242, 32, 21,136,158, 0, 0,111,114, +110, 99,109,226, 3, 27,136,170, 0, 0,111,116,115,112,114,105, +110,103,243, 38,104,136,185, 0, 0,111,117,115,229, 35, 2,136, +195, 0, 0,112, 97,114,101,238, 36,163,136,206, 0, 0,115,117, +112,101,114,105,111,242, 2,176,136,220, 0, 0,116,117,114,110, +101,228, 2,101,136,232, 0, 0,117,104,105,114, 97,103, 97,110, +225, 48,117,136,247, 0, 0,117,105,105,116,111,115,113,117, 97, +114,229, 51, 51,137, 8, 0, 0,117,107, 97,116, 97,107, 97,110, +225, 48,213,137, 23,137,130,117,110,103, 97,114,117,109,108, 97, +117,244, 2,221,137, 40,137,121,246, 1,149,137, 47, 0, 0,121, +112,104,101,238, 0, 45, 0, 0,137, 58,105,110,102,101,114,105, +111,242,246,229,137, 72, 0, 0,109,111,110,111,115,112, 97, 99, +229,255, 13,137, 87, 0, 0,115,109, 97,108,236,254, 99,137, 98, + 0, 0,115,117,112,101,114,105,111,242,246,230,137,112, 0, 0, +116,119,239, 32, 16, 0, 0, 0, 0, 99,109,226, 3, 11, 0, 0, + 0, 0,104, 97,108,102,119,105,100,116,232,255,140, 0, 0, 0, + 0, 49,185, 5,185,137,153, 0, 0, 50,182, 5,185,137,161, 0, + 0, 51,178, 5,185,137,169, 0, 0,104,101, 98,114,101,247, 5, +185,137,181, 0, 0,110, 97,114,114,111,119,104,101, 98,114,101, +247, 5,185,137,199, 0, 0,113,117, 97,114,116,101,114,104,101, + 98,114,101,247, 5,185,137,218, 0, 0,119,105,100,101,104,101, + 98,114,101,247, 5,185, 0, 0, 0, 0,104, 97,108,102,119,105, +100,116,232,255,142, 0, 0, 0, 0, 49,180, 5,180,138, 1, 0, + 0, 50,177, 5,180,138, 9, 0, 0, 50,228, 5,180,138, 17, 0, + 0,104,101, 98,114,101,247, 5,180,138, 29, 0, 0,110, 97,114, +114,111,119,104,101, 98,114,101,247, 5,180,138, 47, 0, 0,113, +117, 97,114,116,101,114,104,101, 98,114,101,247, 5,180,138, 66, + 0, 0,119,105,100,101,104,101, 98,114,101,247, 5,180, 0, 0, + 0, 0,104, 97,108,102,119,105,100,116,232,255,139, 0, 0, 0, + 0,115,117,112,101,114,105,111,242, 2,177, 0, 0, 0, 0, 97, +114,244, 38,101,138,120,140, 19,100, 97,103,101,115,232,251, 52, +138,132,140, 7,104, 97,108,116,111,110,101, 97,114, 97, 98,105, +227, 6,193,138,151, 0, 0,104, 97,114, 97, 98,105,227, 6, 71, +138,164, 0, 0,104,101, 98,114,101,247, 5,212,138,176, 0, 0, +104,102,105,110, 97,108, 97,108,116,111,110,101, 97,114, 97, 98, +105,227,251,167,138,200, 0, 0,104,102,105,110, 97,108, 97,108, +116,116,119,111, 97,114, 97, 98,105,227,254,234,138,224, 0, 0, +104,102,105,110, 97,108, 97,114, 97, 98,105,227,254,234,138,242, + 0, 0,104,104, 97,109,122, 97, 97, 98,111,118,101,102,105,110, + 97,108, 97,114, 97, 98,105,227,251,165,139, 14, 0, 0,104,104, + 97,109,122, 97, 97, 98,111,118,101,105,115,111,108, 97,116,101, +100, 97,114, 97, 98,105,227,251,164,139, 45, 0, 0,104,105,110, +105,116,105, 97,108, 97,108,116,111,110,101, 97,114, 97, 98,105, +227,251,168,139, 71, 0, 0,104,105,110,105,116,105, 97,108, 97, +114, 97, 98,105,227,254,235,139, 91, 0, 0,104,105,114, 97,103, + 97,110,225, 48,120,139,105, 0, 0,104,109,101,100,105, 97,108, + 97,108,116,111,110,101, 97,114, 97, 98,105,227,251,169,139,130, + 0, 0,104,109,101,100,105, 97,108, 97,114, 97, 98,105,227,254, +236,139,149, 0, 0,105,115,101,105,101,114, 97,115,113,117, 97, +114,229, 51,123,139,168, 0, 0,107, 97,116, 97,107, 97,110,225, + 48,216,139,182,139,248,107,117,116, 97, 97,114,117,115,113,117, + 97,114,229, 51, 54,139,201, 0, 0,110,103,104,111,111,235, 2, +103,139,213, 0, 0,114,117,116,117,115,113,117, 97,114,229, 51, + 57,139,229, 0, 0,244, 5,215, 0, 0,139,236,104,101, 98,114, +101,247, 5,215, 0, 0, 0, 0,104, 97,108,102,119,105,100,116, +232,255,141, 0, 0, 0, 0,104,101, 98,114,101,247,251, 52, 0, + 0, 0, 0,115,117,105,116, 98,108, 97, 99,235, 38,101,140, 34, + 0, 0,115,117,105,116,119,104,105,116,229, 38, 97, 0, 0, 0, + 0, 49,183, 5,177,140, 57, 0, 0, 50,180, 5,177,140, 65, 0, + 0, 51,176, 5,177,140, 73, 0, 0,104,101, 98,114,101,247, 5, +177,140, 85, 0, 0,110, 97,114,114,111,119,104,101, 98,114,101, +247, 5,177,140,103, 0, 0,113,117, 97,114,116,101,114,104,101, + 98,114,101,247, 5,177,140,122, 0, 0,119,105,100,101,104,101, + 98,114,101,247, 5,177, 0, 0, 0, 0, 49,226, 5,179,140,146, + 0, 0, 50,184, 5,179,140,154, 0, 0, 51,180, 5,179,140,162, + 0, 0,104,101, 98,114,101,247, 5,179,140,174, 0, 0,110, 97, +114,114,111,119,104,101, 98,114,101,247, 5,179,140,192, 0, 0, +113,117, 97,114,116,101,114,104,101, 98,114,101,247, 5,179,140, +211, 0, 0,119,105,100,101,104,101, 98,114,101,247, 5,179, 0, + 0, 0, 0, 49,182, 5,178,140,235, 0, 0, 50,179, 5,178,140, +243, 0, 0, 50,230, 5,178,140,251, 0, 0,104,101, 98,114,101, +247, 5,178,141, 7, 0, 0,110, 97,114,114,111,119,104,101, 98, +114,101,247, 5,178,141, 25, 0, 0,113,117, 97,114,116,101,114, +104,101, 98,114,101,247, 5,178,141, 44, 0, 0,119,105,100,101, +104,101, 98,114,101,247, 5,178, 0, 0, 0, 0,104, 97,108,102, +119,105,100,116,232,255,138, 0, 0, 0, 0, 97, 98,101,110,103, + 97,108,233, 9,151,141, 89, 0, 0, 97, 99,117,116,229, 1,245, +141,100, 0, 0, 97,100,101,118,225, 9, 23,141,111, 0, 0, 97, +102, 97,114, 97, 98,105,227, 6,175,141,125, 0, 0, 97,102,102, +105,110, 97,108, 97,114, 97, 98,105,227,251,147,141,144, 0, 0, + 97,102,105,110,105,116,105, 97,108, 97,114, 97, 98,105,227,251, +148,141,165, 0, 0, 97,102,109,101,100,105, 97,108, 97,114, 97, + 98,105,227,251,149,141,185, 0, 0, 97,103,117,106, 97,114, 97, +116,233, 10,151,141,200, 0, 0, 97,103,117,114,109,117,107,104, +233, 10, 23,141,215, 0, 0, 97,104,105,114, 97,103, 97,110,225, + 48, 76,141,230, 0, 0, 97,107, 97,116, 97,107, 97,110,225, 48, +172,141,245, 0, 0, 97,109,109,225, 3,179,141,255,147, 26, 97, +110,103,105, 97, 99,111,112,116,105,227, 3,235,142, 16, 0, 0, + 98,111,112,111,109,111,102,239, 49, 13,142, 30, 0, 0, 98,114, +101,118,229, 1, 31,142, 41, 0, 0, 99, 97,114,111,238, 1,231, +142, 52, 0, 0, 99,101,100,105,108,108,225, 1, 35,142, 65, 0, + 0, 99,105,114, 99,108,229, 36,214,142, 77, 0, 0, 99,105,114, + 99,117,109,102,108,101,248, 1, 29,142, 93, 0, 0, 99,111,109, +109, 97, 97, 99, 99,101,110,244, 1, 35,142,110, 0, 0,100,111, +244, 1, 33,142,119,147, 14,101, 99,121,114,105,108,108,105,227, + 4, 51,142,134, 0, 0,101,104,105,114, 97,103, 97,110,225, 48, + 82,142,149, 0, 0,101,107, 97,116, 97,107, 97,110,225, 48,178, +142,164, 0, 0,101,111,109,101,116,114,105, 99, 97,108,108,121, +101,113,117, 97,236, 34, 81,142,187, 0, 0,101,114,101,115,104, + 97, 99, 99,101,110,116,104,101, 98,114,101,247, 5,156,142,210, + 0, 0,101,114,101,115,104,104,101, 98,114,101,247, 5,243,142, +227, 0, 0,101,114,101,115,104,109,117,113,100, 97,109,104,101, + 98,114,101,247, 5,157,142,250, 0, 0,101,114,109, 97,110,100, + 98,108,243, 0,223,143, 9, 0, 0,101,114,115,104, 97,121,105, +109, 97, 99, 99,101,110,116,104,101, 98,114,101,247, 5,158,143, + 35, 0, 0,101,114,115,104, 97,121,105,109,104,101, 98,114,101, +247, 5,244,143, 55, 0, 0,101,116, 97,109, 97,114,235, 48, 19, +143, 68, 0, 0,104, 97, 98,101,110,103, 97,108,233, 9,152,143, + 83, 0, 0,104, 97,100, 97,114,109,101,110,105, 97,238, 5,114, +143,100, 0, 0,104, 97,100,101,118,225, 9, 24,143,112, 0, 0, +104, 97,103,117,106, 97,114, 97,116,233, 10,152,143,128, 0, 0, +104, 97,103,117,114,109,117,107,104,233, 10, 24,143,144, 0, 0, +104, 97,105,110, 97,114, 97, 98,105,227, 6, 58,143,160, 0, 0, +104, 97,105,110,102,105,110, 97,108, 97,114, 97, 98,105,227,254, +206,143,181, 0, 0,104, 97,105,110,105,110,105,116,105, 97,108, + 97,114, 97, 98,105,227,254,207,143,204, 0, 0,104, 97,105,110, +109,101,100,105, 97,108, 97,114, 97, 98,105,227,254,208,143,226, + 0, 0,104,101,109,105,100,100,108,101,104,111,111,107, 99,121, +114,105,108,108,105,227, 4,149,143,252, 0, 0,104,101,115,116, +114,111,107,101, 99,121,114,105,108,108,105,227, 4,147,144, 18, + 0, 0,104,101,117,112,116,117,114,110, 99,121,114,105,108,108, +105,227, 4,145,144, 40, 0, 0,104,104, 97,100,101,118,225, 9, + 90,144, 53, 0, 0,104,104, 97,103,117,114,109,117,107,104,233, + 10, 90,144, 70, 0, 0,104,111,111,235, 2, 96,144, 80, 0, 0, +104,122,115,113,117, 97,114,229, 51,147,144, 94, 0, 0,105,104, +105,114, 97,103, 97,110,225, 48, 78,144,109, 0, 0,105,107, 97, +116, 97,107, 97,110,225, 48,174,144,124, 0, 0,105,109, 97,114, +109,101,110,105, 97,238, 5, 99,144,140, 0, 0,105,109,101,236, + 5,210,144,150,146,234,106,101, 99,121,114,105,108,108,105,227, + 4, 83,144,166, 0, 0,108,111,116,116, 97,108,105,110,118,101, +114,116,101,100,115,116,114,111,107,229, 1,190,144,192, 0, 0, +108,111,116,116, 97,108,115,116,111,240, 2,148,144,208,146,148, +109, 97, 99,114,111,238, 30, 33,144,220, 0, 0,109,111,110,111, +115,112, 97, 99,229,255, 71,144,235, 0, 0,111,104,105,114, 97, +103, 97,110,225, 48, 84,144,250, 0, 0,111,107, 97,116, 97,107, + 97,110,225, 48,180,145, 9, 0, 0,112, 97,114,101,238, 36,162, +145, 20, 0, 0,112, 97,115,113,117, 97,114,229, 51,172,145, 34, + 0, 0,114, 97,100,105,101,110,244, 34, 7,145, 47, 0, 0,114, + 97,118,229, 0, 96,145, 57,146, 65,114,101, 97,116,101,242, 0, + 62,145, 69,145,227,115, 99,114,105,112,244, 2, 97,145, 81, 0, + 0,115,116,114,111,107,229, 1,229,145, 93, 0, 0,117,104,105, +114, 97,103, 97,110,225, 48, 80,145,108, 0, 0,117,105,108,108, +101,109,111,116,108,101,102,244, 0,171,145,126, 0, 0,117,105, +108,108,101,109,111,116,114,105,103,104,244, 0,187,145,145, 0, + 0,117,105,108,115,105,110,103,108,108,101,102,244, 32, 57,145, +163, 0, 0,117,105,108,115,105,110,103,108,114,105,103,104,244, + 32, 58,145,182, 0, 0,117,107, 97,116, 97,107, 97,110,225, 48, +176,145,197, 0, 0,117,114, 97,109,117,115,113,117, 97,114,229, + 51, 24,145,214, 0, 0,121,115,113,117, 97,114,229, 51,201, 0, + 0, 0, 0,101,113,117, 97,236, 34,101,145,238,146, 53,109,111, +110,111,115,112, 97, 99,229,255, 30,145,253, 0, 0,111,114,101, +113,117,105,118, 97,108,101,110,244, 34,115,146, 15, 0, 0,111, +114,108,101,115,243, 34,119,146, 27, 0, 0,111,118,101,114,101, +113,117, 97,236, 34,103,146, 42, 0, 0,115,109, 97,108,236,254, +101, 0, 0, 0, 0,111,114,108,101,115,243, 34,219, 0, 0, 0, + 0, 98,101,108,111,119, 99,109,226, 3, 22,146, 79, 0, 0, 99, +109,226, 3, 0,146, 88, 0, 0, 99,111,109,226, 3, 0,146, 98, + 0, 0,100,101,118,225, 9, 83,146,108, 0, 0,108,111,119,109, +111,228, 2,206,146,120, 0, 0,109,111,110,111,115,112, 97, 99, +229,255, 64,146,135, 0, 0,116,111,110,101, 99,109,226, 3, 64, + 0, 0, 0, 0,105,110,118,101,114,116,101,228, 2,150,146,162, + 0, 0,109,111,228, 2,192,146,171, 0, 0,114,101,118,101,114, +115,101,228, 2,149,146,185,146,211,115,116,114,111,107,229, 2, +161, 0, 0,146,197,114,101,118,101,114,115,101,228, 2,162, 0, + 0, 0, 0,109,111,228, 2,193,146,220, 0, 0,115,117,112,101, +114,105,111,242, 2,228, 0, 0, 0, 0,100, 97,103,101,115,232, +251, 50,146,246,147, 2,104,101, 98,114,101,247, 5,210, 0, 0, + 0, 0,104,101, 98,114,101,247,251, 50, 0, 0, 0, 0, 97, 99, + 99,101,110,244, 1, 33, 0, 0, 0, 0,108, 97,116,105,110,115, +109, 97,108,236, 2, 99,147, 42, 0, 0,115,117,112,101,114,105, +111,242, 2,224, 0, 0, 0, 0, 97,100,101,118,225, 9, 94,147, + 67, 0, 0, 97,103,117,114,109,117,107,104,233, 10, 94,147, 82, + 0, 0, 97,104,114,101,110,104,101,105,244, 33, 9,147, 97, 0, + 0, 97,116,104, 97, 97,114, 97, 98,105,227, 6, 78,147,113, 0, + 0, 97,116,104, 97,108,111,119, 97,114, 97, 98,105,227, 6, 78, +147,132, 0, 0, 97,116,104, 97,116, 97,110, 97,114, 97, 98,105, +227, 6, 75,147,151, 0, 0, 98,111,112,111,109,111,102,239, 49, + 8,147,165, 0, 0, 99,105,114, 99,108,229, 36,213,147,177, 0, + 0,100,111,116, 97, 99, 99,101,110,244, 30, 31,147,192, 0, 0, +101,104, 97,114, 97, 98,105,227, 6, 65,147,206, 0, 0,101,104, + 97,114,109,101,110,105, 97,238, 5,134,147,222, 0, 0,101,104, +102,105,110, 97,108, 97,114, 97, 98,105,227,254,210,147,241, 0, + 0,101,104,105,110,105,116,105, 97,108, 97,114, 97, 98,105,227, +254,211,148, 6, 0, 0,101,104,109,101,100,105, 97,108, 97,114, + 97, 98,105,227,254,212,148, 26, 0, 0,101,105, 99,111,112,116, +105,227, 3,229,148, 40, 0, 0,101,109, 97,108,229, 38, 64,148, + 51, 0, 0,230,251, 0,148, 58,152,148,233,251, 1,148, 65,150, + 46,236,251, 2,148, 72,150, 36,109,111,110,111,115,112, 97, 99, +229,255, 70,148, 87, 0, 0,109,115,113,117, 97,114,229, 51,153, +148,100, 0, 0,111,102, 97,110,116,104, 97,233, 14, 31,148,114, + 0, 0,111,102, 97,116,104, 97,233, 14, 29,148,127, 0, 0,111, +110,103,109, 97,110,116,104, 97,233, 14, 79,148,143, 0, 0,111, +114, 97,108,236, 34, 0,148,154, 0, 0,111,117,242, 0, 52,148, +163,148,197,112, 97,114,101,238, 36,161,148,174, 0, 0,114, 97, + 99,116,105,111,238, 32, 68,148,187, 0, 0,114, 97,110,227, 32, +163, 0, 0, 0, 0, 97,114, 97, 98,105,227, 6,100,148,209, 0, + 0, 98,101,110,103, 97,108,233, 9,234,148,222, 0, 0, 99,105, +114, 99,108,229, 36, 99,148,234,150, 14,100,101,118,225, 9,106, +148,244, 0, 0,103,117,106, 97,114, 97,116,233, 10,234,149, 2, + 0, 0,103,117,114,109,117,107,104,233, 10,106,149, 16, 0, 0, +104, 97, 99,107, 97,114, 97, 98,105,227, 6,100,149, 32, 0, 0, +104, 97,110,103,122,104,111,245, 48, 36,149, 46, 0, 0,105,100, +101,111,103,114, 97,112,104,105, 99,112, 97,114,101,238, 50, 35, +149, 68, 0, 0,105,110,102,101,114,105,111,242, 32,132,149, 82, + 0, 0,109,111,110,111,115,112, 97, 99,229,255, 20,149, 97, 0, + 0,110,117,109,101,114, 97,116,111,114, 98,101,110,103, 97,108, +233, 9,247,149,119, 0, 0,111,108,100,115,116,121,108,229,247, + 52,149,133, 0, 0,112, 97,114,101,238, 36,119,149,144, 0, 0, +112,101,114,105,111,228, 36,139,149,156, 0, 0,112,101,114,115, +105, 97,238, 6,244,149,169, 0, 0,114,111,109, 97,238, 33,115, +149,180, 0, 0,115,117,112,101,114,105,111,242, 32,116,149,194, + 0, 0,116,101,101,110, 99,105,114, 99,108,229, 36,109,149,210, + 0, 0,116,101,101,110,112, 97,114,101,238, 36,129,149,225, 0, + 0,116,101,101,110,112,101,114,105,111,228, 36,149,149,241, 0, + 0,116,104, 97,233, 14, 84,149,251, 0, 0,116,104,116,111,110, +101, 99,104,105,110,101,115,229, 2,203, 0, 0, 0, 0,105,110, +118,101,114,115,101,115, 97,110,115,115,101,114,105,230, 39,141, + 0, 0, 0, 0,111,114,105,238, 1,146, 0, 0, 0, 0,102,116, +101,101,110, 99,105,114, 99,108,229, 36,110,150, 63, 0, 0,102, +116,101,101,110,112, 97,114,101,238, 36,130,150, 79, 0, 0,102, +116,101,101,110,112,101,114,105,111,228, 36,150,150, 96, 0, 0, +103,117,114,101,100, 97,115,232, 32, 18,150,110, 0, 0,108,108, +101,100, 98,111,248, 37,160,150,123, 0, 0,108,108,101,100,114, +101, 99,244, 37,172,150,137, 0, 0,110, 97,108,107, 97,230, 5, +218,150,149,152, 65,110, 97,108,109,101,237, 5,221,150,161,152, + 53,110, 97,108,110,117,238, 5,223,150,173,152, 41,110, 97,108, +112,229, 5,227,150,184,152, 29,110, 97,108,116,115, 97,100,233, + 5,229,150,198,152, 17,114,115,116,116,111,110,101, 99,104,105, +110,101,115,229, 2,201,150,218, 0, 0,115,104,101,121,229, 37, +201,150,229, 0, 0,116, 97, 99,121,114,105,108,108,105,227, 4, +115,150,245, 0, 0,118,229, 0, 53, 0, 0,150,253, 97,114, 97, + 98,105,227, 6,101,151, 9, 0, 0, 98,101,110,103, 97,108,233, + 9,235,151, 22, 0, 0, 99,105,114, 99,108,229, 36,100,151, 34, +151,251,100,101,118,225, 9,107,151, 44, 0, 0,101,105,103,104, +116,104,243, 33, 93,151, 57, 0, 0,103,117,106, 97,114, 97,116, +233, 10,235,151, 71, 0, 0,103,117,114,109,117,107,104,233, 10, +107,151, 85, 0, 0,104, 97, 99,107, 97,114, 97, 98,105,227, 6, +101,151,101, 0, 0,104, 97,110,103,122,104,111,245, 48, 37,151, +115, 0, 0,105,100,101,111,103,114, 97,112,104,105, 99,112, 97, +114,101,238, 50, 36,151,137, 0, 0,105,110,102,101,114,105,111, +242, 32,133,151,151, 0, 0,109,111,110,111,115,112, 97, 99,229, +255, 21,151,166, 0, 0,111,108,100,115,116,121,108,229,247, 53, +151,180, 0, 0,112, 97,114,101,238, 36,120,151,191, 0, 0,112, +101,114,105,111,228, 36,140,151,203, 0, 0,112,101,114,115,105, + 97,238, 6,245,151,216, 0, 0,114,111,109, 97,238, 33,116,151, +227, 0, 0,115,117,112,101,114,105,111,242, 32,117,151,241, 0, + 0,116,104, 97,233, 14, 85, 0, 0, 0, 0,105,110,118,101,114, +115,101,115, 97,110,115,115,101,114,105,230, 39,142, 0, 0, 0, + 0,104,101, 98,114,101,247, 5,229, 0, 0, 0, 0,104,101, 98, +114,101,247, 5,227, 0, 0, 0, 0,104,101, 98,114,101,247, 5, +223, 0, 0, 0, 0,104,101, 98,114,101,247, 5,221, 0, 0, 0, + 0,100, 97,103,101,115,232,251, 58,152, 77,152,136,104,101, 98, +114,101,247, 5,218,152, 89, 0, 0,113, 97,109, 97,116,243, 5, +218,152,101,152,124,115,104,101,118,225, 5,218, 0, 0,152,112, +104,101, 98,114,101,247, 5,218, 0, 0, 0, 0,104,101, 98,114, +101,247, 5,218, 0, 0, 0, 0,104,101, 98,114,101,247,251, 58, + 0, 0, 0, 0,233,251, 3,152,155, 0, 0,236,251, 4, 0, 0, + 0, 0, 97, 99,117,116,229, 0,233,152,173, 0, 0, 97,114,116, +232, 38, 65,152,183, 0, 0, 98,101,110,103, 97,108,233, 9,143, +152,196, 0, 0, 98,111,112,111,109,111,102,239, 49, 28,152,210, + 0, 0, 98,114,101,118,229, 1, 21,152,221, 0, 0, 99, 97,110, +100,114, 97,100,101,118,225, 9, 13,152,237, 0, 0, 99, 97,110, +100,114, 97,103,117,106, 97,114, 97,116,233, 10,141,153, 1, 0, + 0, 99, 97,110,100,114, 97,118,111,119,101,108,115,105,103,110, +100,101,118,225, 9, 69,153, 26, 0, 0, 99, 97,110,100,114, 97, +118,111,119,101,108,115,105,103,110,103,117,106, 97,114, 97,116, +233, 10,197,153, 55, 0, 0, 99, 97,114,111,238, 1, 27,153, 66, + 0, 0, 99,101,100,105,108,108, 97, 98,114,101,118,229, 30, 29, +153, 84, 0, 0, 99,104, 97,114,109,101,110,105, 97,238, 5,101, +153,100, 0, 0, 99,104,121,105,119,110, 97,114,109,101,110,105, + 97,238, 5,135,153,120, 0, 0, 99,105,114, 99,108,229, 36,212, +153,132, 0, 0, 99,105,114, 99,117,109,102,108,101,248, 0,234, +153,148,161, 15, 99,121,114,105,108,108,105,227, 4, 84,153,162, + 0, 0,100, 98,108,103,114, 97,118,229, 2, 5,153,176, 0, 0, +100,101,118,225, 9, 15,153,186, 0, 0,100,105,101,114,101,115, +105,243, 0,235,153,200, 0, 0,100,111,244, 1, 23,153,209,160, +248,101,103,117,114,109,117,107,104,233, 10, 15,153,224, 0, 0, +101,109, 97,116,114, 97,103,117,114,109,117,107,104,233, 10, 71, +153,244, 0, 0,102, 99,121,114,105,108,108,105,227, 4, 68,154, + 3, 0, 0,103,114, 97,118,229, 0,232,154, 14, 0, 0,103,117, +106, 97,114, 97,116,233, 10,143,154, 28, 0, 0,104, 97,114,109, +101,110,105, 97,238, 5,103,154, 43, 0, 0,104, 98,111,112,111, +109,111,102,239, 49, 29,154, 58, 0, 0,104,105,114, 97,103, 97, +110,225, 48, 72,154, 72, 0, 0,104,111,111,107, 97, 98,111,118, +229, 30,187,154, 87, 0, 0,105, 98,111,112,111,109,111,102,239, + 49, 31,154,102, 0, 0,105,103,104,244, 0, 56,154,112,159,180, +105,110,118,101,114,116,101,100, 98,114,101,118,229, 2, 7,154, +131, 0, 0,105,111,116,105,102,105,101,100, 99,121,114,105,108, +108,105,227, 4,101,154,153, 0, 0,107, 97,116, 97,107, 97,110, +225, 48,168,154,167,159,165,107,111,110,107, 97,114,103,117,114, +109,117,107,104,233, 10,116,154,187, 0, 0,107,111,114,101, 97, +238, 49, 84,154,199, 0, 0,108, 99,121,114,105,108,108,105,227, + 4, 59,154,214, 0, 0,108,101,109,101,110,244, 34, 8,154,226, + 0, 0,108,101,118,101,110, 99,105,114, 99,108,229, 36,106,154, +243, 0, 0,108,101,118,101,110,112, 97,114,101,238, 36,126,155, + 3, 0, 0,108,101,118,101,110,112,101,114,105,111,228, 36,146, +155, 20, 0, 0,108,101,118,101,110,114,111,109, 97,238, 33,122, +155, 36, 0, 0,108,108,105,112,115,105,243, 32, 38,155, 49,159, +151,109, 97, 99,114,111,238, 1, 19,155, 61,159,129,109, 99,121, +114,105,108,108,105,227, 4, 60,155, 76, 0, 0,109,100, 97,115, +232, 32, 20,155, 87,159,115,109,111,110,111,115,112, 97, 99,229, +255, 69,155,102, 0, 0,109,112,104, 97,115,105,115,109, 97,114, +107, 97,114,109,101,110,105, 97,238, 5, 91,155,127, 0, 0,109, +112,116,121,115,101,244, 34, 5,155,140, 0, 0,110, 98,111,112, +111,109,111,102,239, 49, 35,155,155, 0, 0,110, 99,121,114,105, +108,108,105,227, 4, 61,155,170, 0, 0,110,100, 97,115,232, 32, + 19,155,181,159,101,110,100,101,115, 99,101,110,100,101,114, 99, +121,114,105,108,108,105,227, 4,163,155,205, 0, 0,110,231, 1, + 75,155,213,159, 71,110,104,111,111,107, 99,121,114,105,108,108, +105,227, 4,200,155,232, 0, 0,110,115,112, 97, 99,229, 32, 2, +155,244, 0, 0,111,103,111,110,101,235, 1, 25,156, 0, 0, 0, +111,107,111,114,101, 97,238, 49, 83,156, 13, 0, 0,111,112,101, +238, 2, 91,156, 23,159, 23,112, 97,114,101,238, 36,160,156, 34, + 0, 0,112,115,105,108,111,238, 3,181,156, 46,159, 12,113,117, + 97,236, 0, 61,156, 56,158,228,113,117,105,118, 97,108,101,110, + 99,229, 34, 97,156, 72, 0, 0,114, 98,111,112,111,109,111,102, +239, 49, 38,156, 87, 0, 0,114, 99,121,114,105,108,108,105,227, + 4, 64,156,102, 0, 0,114,101,118,101,114,115,101,228, 2, 88, +156,116,158,214,115, 99,121,114,105,108,108,105,227, 4, 65,156, +131, 0, 0,115,100,101,115, 99,101,110,100,101,114, 99,121,114, +105,108,108,105,227, 4,171,156,155, 0, 0,115,232, 2,131,156, +163,158,132,115,109, 97,108,108,104,105,114, 97,103, 97,110,225, + 48, 71,156,182, 0, 0,115,109, 97,108,108,107, 97,116, 97,107, + 97,110,225, 48,167,156,201,158,117,115,116,105,109, 97,116,101, +228, 33, 46,156,215, 0, 0,115,117,112,101,114,105,111,242,246, +236,156,229, 0, 0,116,225, 3,183,156,237,158, 93,116,232, 0, +240,156,245, 0, 0,116,105,108,100,229, 30,189,157, 0,158, 82, +116,110, 97,104,116, 97,102,111,117,107,104,104,101, 98,114,101, +247, 5,145,157, 23, 0, 0,116,110, 97,104,116, 97,102,111,117, +107,104,108,101,102,116,104,101, 98,114,101,247, 5,145,157, 50, + 0, 0,116,110, 97,104,116, 97,104,101, 98,114,101,247, 5,145, +157, 68, 0, 0,116,110, 97,104,116, 97,108,101,102,116,104,101, + 98,114,101,247, 5,145,157, 90, 0, 0,116,117,114,110,101,228, + 1,221,157,102, 0, 0,117,107,111,114,101, 97,238, 49, 97,157, +115, 0, 0,117,114,239, 32,172,157,124, 0, 0,118,111,119,101, +108,115,105,103,110, 98,101,110,103, 97,108,233, 9,199,157,146, + 0, 0,118,111,119,101,108,115,105,103,110,100,101,118,225, 9, + 71,157,165, 0, 0,118,111,119,101,108,115,105,103,110,103,117, +106, 97,114, 97,116,233, 10,199,157,188, 0, 0,120, 99,108, 97, +237, 0, 33,157,199,158, 12,120,105,115,116,101,110,116,105, 97, +236, 34, 3,157,215, 0, 0,122,232, 2,146, 0, 0,157,223, 99, + 97,114,111,238, 1,239,157,234, 0, 0, 99,117,114,236, 2,147, +157,244, 0, 0,114,101,118,101,114,115,101,228, 1,185,158, 2, + 0, 0,116, 97,105,236, 1,186, 0, 0, 0, 0, 97,114,109,101, +110,105, 97,238, 5, 92,158, 26, 0, 0,100, 98,236, 32, 60,158, + 35, 0, 0,100,111,119,238, 0,161,158, 45,158, 71,109,111,110, +111,115,112, 97, 99,229,255, 1,158, 60, 0, 0,115,109, 97,108, +236,247, 33, 0, 0, 0, 0,115,109, 97,108,236,247,161, 0, 0, + 0, 0, 98,101,108,111,247, 30, 27, 0, 0, 0, 0,114,109,101, +110,105, 97,238, 5,104,158,106, 0, 0,116,111,110,111,243, 3, +174, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255,106, + 0, 0, 0, 0, 99,117,114,236, 2,134,158,142, 0, 0,111,114, +116,100,101,118,225, 9, 14,158,155, 0, 0,111,114,116,118,111, +119,101,108,115,105,103,110,100,101,118,225, 9, 70,158,177, 0, + 0,114,101,118,101,114,115,101,100,108,111,111,240, 1,170,158, +195, 0, 0,115,113,117, 97,116,114,101,118,101,114,115,101,228, + 2,133, 0, 0, 0, 0, 99,121,114,105,108,108,105,227, 4, 77, + 0, 0, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 29,158, +243, 0, 0,115,109, 97,108,236,254,102,158,254, 0, 0,115,117, +112,101,114,105,111,242, 32,124, 0, 0, 0, 0,116,111,110,111, +243, 3,173, 0, 0, 0, 0, 99,108,111,115,101,228, 2,154,159, + 35, 0, 0,114,101,118,101,114,115,101,228, 2, 92, 0, 0,159, + 49, 99,108,111,115,101,228, 2, 94,159, 61, 0, 0,104,111,111, +235, 2, 93, 0, 0, 0, 0, 98,111,112,111,109,111,102,239, 49, + 37,159, 85, 0, 0,104,101, 99,121,114,105,108,108,105,227, 4, +165, 0, 0, 0, 0,118,101,114,116,105, 99, 97,236,254, 50, 0, + 0, 0, 0,118,101,114,116,105, 99, 97,236,254, 49, 0, 0, 0, + 0, 97, 99,117,116,229, 30, 23,159,140, 0, 0,103,114, 97,118, +229, 30, 21, 0, 0, 0, 0,118,101,114,116,105, 99, 97,236, 34, +238, 0, 0, 0, 0,104, 97,108,102,119,105,100,116,232,255,116, + 0, 0, 0, 0, 97,114, 97, 98,105,227, 6,104,159,192, 0, 0, + 98,101,110,103, 97,108,233, 9,238,159,205, 0, 0, 99,105,114, + 99,108,229, 36,103,159,217,160,226,100,101,118,225, 9,110,159, +227, 0, 0,101,101,110, 99,105,114, 99,108,229, 36,113,159,242, + 0, 0,101,101,110,112, 97,114,101,238, 36,133,160, 0, 0, 0, +101,101,110,112,101,114,105,111,228, 36,153,160, 15, 0, 0,103, +117,106, 97,114, 97,116,233, 10,238,160, 29, 0, 0,103,117,114, +109,117,107,104,233, 10,110,160, 43, 0, 0,104, 97, 99,107, 97, +114, 97, 98,105,227, 6,104,160, 59, 0, 0,104, 97,110,103,122, +104,111,245, 48, 40,160, 73, 0, 0,104,110,111,116,101, 98,101, + 97,109,101,228, 38,107,160, 90, 0, 0,105,100,101,111,103,114, + 97,112,104,105, 99,112, 97,114,101,238, 50, 39,160,112, 0, 0, +105,110,102,101,114,105,111,242, 32,136,160,126, 0, 0,109,111, +110,111,115,112, 97, 99,229,255, 24,160,141, 0, 0,111,108,100, +115,116,121,108,229,247, 56,160,155, 0, 0,112, 97,114,101,238, + 36,123,160,166, 0, 0,112,101,114,105,111,228, 36,143,160,178, + 0, 0,112,101,114,115,105, 97,238, 6,248,160,191, 0, 0,114, +111,109, 97,238, 33,119,160,202, 0, 0,115,117,112,101,114,105, +111,242, 32,120,160,216, 0, 0,116,104, 97,233, 14, 88, 0, 0, + 0, 0,105,110,118,101,114,115,101,115, 97,110,115,115,101,114, +105,230, 39,145, 0, 0, 0, 0, 97, 99, 99,101,110,244, 1, 23, +161, 4, 0, 0, 98,101,108,111,247, 30,185, 0, 0, 0, 0, 97, + 99,117,116,229, 30,191,161, 26, 0, 0, 98,101,108,111,247, 30, + 25,161, 37, 0, 0,100,111,116, 98,101,108,111,247, 30,199,161, + 51, 0, 0,103,114, 97,118,229, 30,193,161, 62, 0, 0,104,111, +111,107, 97, 98,111,118,229, 30,195,161, 77, 0, 0,116,105,108, +100,229, 30,197, 0, 0, 0, 0, 97, 97,114,109,101,110,105, 97, +238, 5,100,161,103, 0, 0, 97, 98,101,110,103, 97,108,233, 9, +166,161,117, 0, 0, 97,100, 97,114, 97, 98,105,227, 6, 54,161, +131, 0, 0, 97,100,101,118,225, 9, 38,161,142, 0, 0, 97,100, +102,105,110, 97,108, 97,114, 97, 98,105,227,254,190,161,161, 0, + 0, 97,100,105,110,105,116,105, 97,108, 97,114, 97, 98,105,227, +254,191,161,182, 0, 0, 97,100,109,101,100,105, 97,108, 97,114, + 97, 98,105,227,254,192,161,202, 0, 0, 97,103,101,115,232, 5, +188,161,213,170,225, 97,103,103,101,242, 32, 32,161,224,170,216, + 97,103,117,106, 97,114, 97,116,233, 10,166,161,239, 0, 0, 97, +103,117,114,109,117,107,104,233, 10, 38,161,254, 0, 0, 97,104, +105,114, 97,103, 97,110,225, 48, 96,162, 13, 0, 0, 97,107, 97, +116, 97,107, 97,110,225, 48,192,162, 28, 0, 0, 97,108, 97,114, + 97, 98,105,227, 6, 47,162, 42, 0, 0, 97,108,101,244, 5,211, +162, 52,169,194, 97,108,102,105,110, 97,108, 97,114, 97, 98,105, +227,254,170,162, 71, 0, 0, 97,109,109, 97, 97,114, 97, 98,105, +227, 6, 79,162, 87, 0, 0, 97,109,109, 97,108,111,119, 97,114, + 97, 98,105,227, 6, 79,162,106, 0, 0, 97,109,109, 97,116, 97, +110, 97,108,116,111,110,101, 97,114, 97, 98,105,227, 6, 76,162, +131, 0, 0, 97,109,109, 97,116, 97,110, 97,114, 97, 98,105,227, + 6, 76,162,150, 0, 0, 97,110,100,225, 9,100,162,160, 0, 0, + 97,114,103, 97,104,101, 98,114,101,247, 5,167,162,176, 0, 0, + 97,114,103, 97,108,101,102,116,104,101, 98,114,101,247, 5,167, +162,196, 0, 0, 97,115,105, 97,112,110,101,117,109, 97,116, 97, + 99,121,114,105,108,108,105, 99, 99,109,226, 4,133,162,225, 0, + 0, 98,108, 71,114, 97,118,229,246,211,162,238, 0, 0, 98,108, + 97,110,103,108,101, 98,114, 97, 99,107,101,116,108,101,102,244, + 48, 10,163, 6,169,180, 98,108, 97,110,103,108,101, 98,114, 97, + 99,107,101,116,114,105,103,104,244, 48, 11,163, 31,169,166, 98, +108, 97,114, 99,104,105,110,118,101,114,116,101,100, 98,101,108, +111,119, 99,109,226, 3, 43,163, 59, 0, 0, 98,108, 97,114,114, +111,119,108,101,102,244, 33,212,163, 76, 0, 0, 98,108, 97,114, +114,111,119,114,105,103,104,244, 33,210,163, 94, 0, 0, 98,108, +100, 97,110,100,225, 9,101,163,107, 0, 0, 98,108,103,114, 97, +118,229,246,214,163,120,169,157, 98,108,105,110,116,101,103,114, + 97,236, 34, 44,163,136, 0, 0, 98,108,108,111,119,108,105,110, +229, 32, 23,163,151,169,148, 98,108,111,118,101,114,108,105,110, +101, 99,109,226, 3, 63,163,170, 0, 0, 98,108,112,114,105,109, +101,109,111,228, 2,186,163,186, 0, 0, 98,108,118,101,114,116, +105, 99, 97,108, 98, 97,242, 32, 22,163,205, 0, 0, 98,108,118, +101,114,116,105, 99, 97,108,108,105,110,101, 97, 98,111,118,101, + 99,109,226, 3, 14,163,233, 0, 0, 98,111,112,111,109,111,102, +239, 49, 9,163,247, 0, 0, 98,115,113,117, 97,114,229, 51,200, +164, 4, 0, 0, 99, 97,114,111,238, 1, 15,164, 15, 0, 0, 99, +101,100,105,108,108,225, 30, 17,164, 28, 0, 0, 99,105,114, 99, +108,229, 36,211,164, 40, 0, 0, 99,105,114, 99,117,109,102,108, +101,120, 98,101,108,111,247, 30, 19,164, 61, 0, 0, 99,114,111, + 97,244, 1, 17,164, 72, 0, 0,100, 97, 98,101,110,103, 97,108, +233, 9,161,164, 87, 0, 0,100, 97,100,101,118,225, 9, 33,164, + 99, 0, 0,100, 97,103,117,106, 97,114, 97,116,233, 10,161,164, +115, 0, 0,100, 97,103,117,114,109,117,107,104,233, 10, 33,164, +131, 0, 0,100, 97,108, 97,114, 97, 98,105,227, 6,136,164,146, + 0, 0,100, 97,108,102,105,110, 97,108, 97,114, 97, 98,105,227, +251,137,164,166, 0, 0,100,100,104, 97,100,101,118,225, 9, 92, +164,180, 0, 0,100,104, 97, 98,101,110,103, 97,108,233, 9,162, +164,196, 0, 0,100,104, 97,100,101,118,225, 9, 34,164,209, 0, + 0,100,104, 97,103,117,106, 97,114, 97,116,233, 10,162,164,226, + 0, 0,100,104, 97,103,117,114,109,117,107,104,233, 10, 34,164, +243, 0, 0,100,111,116, 97, 99, 99,101,110,244, 30, 11,165, 2, + 0, 0,100,111,116, 98,101,108,111,247, 30, 13,165, 16, 0, 0, +101, 99,105,109, 97,108,115,101,112, 97,114, 97,116,111,114, 97, +114, 97, 98,105,227, 6,107,165, 43, 0, 0,101, 99,105,109, 97, +108,115,101,112, 97,114, 97,116,111,114,112,101,114,115,105, 97, +238, 6,107,165, 71, 0, 0,101, 99,121,114,105,108,108,105,227, + 4, 52,165, 86, 0, 0,101,103,114,101,229, 0,176,165, 97, 0, + 0,101,104,105,104,101, 98,114,101,247, 5,173,165,112, 0, 0, +101,104,105,114, 97,103, 97,110,225, 48,103,165,127, 0, 0,101, +105, 99,111,112,116,105,227, 3,239,165,141, 0, 0,101,107, 97, +116, 97,107, 97,110,225, 48,199,165,156, 0, 0,101,108,101,116, +101,108,101,102,244, 35, 43,165,171, 0, 0,101,108,101,116,101, +114,105,103,104,244, 35, 38,165,187, 0, 0,101,108,116,225, 3, +180,165,197,169,136,101,110,111,109,105,110, 97,116,111,114,109, +105,110,117,115,111,110,101,110,117,109,101,114, 97,116,111,114, + 98,101,110,103, 97,108,233, 9,248,165,237, 0, 0,101,122,232, + 2,164,165,246, 0, 0,104, 97, 98,101,110,103, 97,108,233, 9, +167,166, 5, 0, 0,104, 97,100,101,118,225, 9, 39,166, 17, 0, + 0,104, 97,103,117,106, 97,114, 97,116,233, 10,167,166, 33, 0, + 0,104, 97,103,117,114,109,117,107,104,233, 10, 39,166, 49, 0, + 0,104,111,111,235, 2, 87,166, 59, 0, 0,105, 97,108,121,116, +105,107, 97,116,111,110,111,243, 3,133,166, 78,169,127,105, 97, +109,111,110,228, 38,102,166, 90,169,112,105,101,114,101,115,105, +243, 0,168,166,103,169, 56,105,104,105,114, 97,103, 97,110,225, + 48, 98,166,118, 0, 0,105,107, 97,116, 97,107, 97,110,225, 48, +194,166,133, 0, 0,105,116,116,111,109, 97,114,235, 48, 3,166, +147, 0, 0,105,118,105,100,229, 0,247,166,158,169, 49,105,118, +105,115,105,111,110,115,108, 97,115,232, 34, 21,166,176, 0, 0, +106,101, 99,121,114,105,108,108,105,227, 4, 82,166,192, 0, 0, +107,115,104, 97,100,229, 37,147,166,204, 0, 0,108,105,110,101, + 98,101,108,111,247, 30, 15,166,219, 0, 0,108,115,113,117, 97, +114,229, 51,151,166,232, 0, 0,109, 97, 99,114,111,238, 1, 17, +166,244, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 68,167, + 3, 0, 0,110, 98,108,111, 99,235, 37,132,167, 15, 0, 0,111, + 99,104, 97,100, 97,116,104, 97,233, 14, 14,167, 31, 0, 0,111, +100,101,107,116,104, 97,233, 14, 20,167, 45, 0, 0,111,104,105, +114, 97,103, 97,110,225, 48,105,167, 60, 0, 0,111,107, 97,116, + 97,107, 97,110,225, 48,201,167, 75, 0, 0,111,108,108, 97,242, + 0, 36,167, 86,168,237,111,110,231, 32,171,167, 95, 0, 0,111, +114,117,115,113,117, 97,114,229, 51, 38,167,110, 0, 0,111,116, + 97, 99, 99,101,110,244, 2,217,167,124,168,228,111,116, 98,101, +108,111,119, 99,109,226, 3, 35,167,140, 0, 0,111,116, 98,101, +108,111,119, 99,111,109,226, 3, 35,167,157, 0, 0,111,116,107, + 97,116, 97,107, 97,110,225, 48,251,167,173, 0, 0,111,116,108, +101,115,115,233, 1, 49,167,186, 0, 0,111,116,108,101,115,115, +234,246,190,167,199,168,212,111,116,109, 97,116,232, 34,197,167, +211, 0, 0,111,116,116,101,100, 99,105,114, 99,108,229, 37,204, +167,228, 0, 0,111,117, 98,108,101,121,111,100,112, 97,116, 97, +232,251, 31,167,247,168,200,111,119,110,116, 97, 99,107, 98,101, +108,111,119, 99,109,226, 3, 30,168, 12, 0, 0,111,119,110,116, + 97, 99,107,109,111,228, 2,213,168, 28, 0, 0,112, 97,114,101, +238, 36,159,168, 39, 0, 0,115,117,112,101,114,105,111,242,246, +235,168, 53, 0, 0,116, 97,105,236, 2, 86,168, 63, 0, 0,116, +111,112, 98, 97,242, 1,140,168, 75, 0, 0,117,104,105,114, 97, +103, 97,110,225, 48,101,168, 90, 0, 0,117,107, 97,116, 97,107, + 97,110,225, 48,197,168,105, 0, 0,250, 1,243, 0, 0,168,112, + 97,108,116,111,110,229, 2,163,168,124, 0, 0, 99, 97,114,111, +238, 1,198,168,135, 0, 0, 99,117,114,236, 2,165,168,145, 0, + 0,101, 97, 98,107,104, 97,115,105, 97,110, 99,121,114,105,108, +108,105,227, 4,225,168,169, 0, 0,101, 99,121,114,105,108,108, +105,227, 4, 85,168,184, 0, 0,104,101, 99,121,114,105,108,108, +105,227, 4, 95, 0, 0, 0, 0,104,101, 98,114,101,247,251, 31, + 0, 0, 0, 0,115,116,114,111,107,101,104,111,111,235, 2,132, + 0, 0, 0, 0, 99,109,226, 3, 7, 0, 0, 0, 0,105,110,102, +101,114,105,111,242,246,227,168,251, 0, 0,109,111,110,111,115, +112, 97, 99,229,255, 4,169, 10, 0, 0,111,108,100,115,116,121, +108,229,247, 36,169, 24, 0, 0,115,109, 97,108,236,254,105,169, + 35, 0, 0,115,117,112,101,114,105,111,242,246,228, 0, 0, 0, + 0,243, 34, 35, 0, 0, 0, 0, 97, 99,117,116,229,246,215,169, + 67, 0, 0, 98,101,108,111,119, 99,109,226, 3, 36,169, 81, 0, + 0, 99,109,226, 3, 8,169, 90, 0, 0,103,114, 97,118,229,246, +216,169,101, 0, 0,116,111,110,111,243, 3,133, 0, 0, 0, 0, +115,117,105,116,119,104,105,116,229, 38, 98, 0, 0, 0, 0, 99, +109,226, 3, 68, 0, 0, 0, 0,116,117,114,110,101,228, 1,141, + 0, 0, 0, 0, 99,109,226, 3, 51, 0, 0, 0, 0, 99,109,226, + 3, 15, 0, 0, 0, 0,118,101,114,116,105, 99, 97,236,254, 62, + 0, 0, 0, 0,118,101,114,116,105, 99, 97,236,254, 61, 0, 0, + 0, 0,100, 97,103,101,115,232,251, 51,169,206,170,204,104, 97, +116, 97,102,112, 97,116, 97,232, 5,211,169,222,170,192,104, 97, +116, 97,102,115,101,103,111,236, 5,211,169,238,170,180,104,101, + 98,114,101,247, 5,211,169,250, 0, 0,104,105,114,105,241, 5, +211,170, 5,170,168,104,111,108, 97,237, 5,211,170, 16,170,156, +112, 97,116, 97,232, 5,211,170, 27,170,144,113, 97,109, 97,116, +243, 5,211,170, 39,170,132,113,117, 98,117,116,243, 5,211,170, + 51,170,120,115,101,103,111,236, 5,211,170, 62,170,108,115,104, +101,118,225, 5,211,170, 73,170, 96,116,115,101,114,229, 5,211, + 0, 0,170, 84,104,101, 98,114,101,247, 5,211, 0, 0, 0, 0, +104,101, 98,114,101,247, 5,211, 0, 0, 0, 0,104,101, 98,114, +101,247, 5,211, 0, 0, 0, 0,104,101, 98,114,101,247, 5,211, + 0, 0, 0, 0,104,101, 98,114,101,247, 5,211, 0, 0, 0, 0, +104,101, 98,114,101,247, 5,211, 0, 0, 0, 0,104,101, 98,114, +101,247, 5,211, 0, 0, 0, 0,104,101, 98,114,101,247, 5,211, + 0, 0, 0, 0,104,101, 98,114,101,247, 5,211, 0, 0, 0, 0, +104,101, 98,114,101,247, 5,211, 0, 0, 0, 0,104,101, 98,114, +101,247,251, 51, 0, 0, 0, 0,100, 98,236, 32, 33, 0, 0, 0, + 0,104,101, 98,114,101,247, 5,188, 0, 0, 0, 0, 97, 97,114, +109,101,110,105, 97,238, 5,110,170,252, 0, 0, 97, 98,101,110, +103, 97,108,233, 9,154,171, 10, 0, 0, 97, 99,117,116,229, 1, + 7,171, 21, 0, 0, 97,100,101,118,225, 9, 26,171, 32, 0, 0, + 97,103,117,106, 97,114, 97,116,233, 10,154,171, 47, 0, 0, 97, +103,117,114,109,117,107,104,233, 10, 26,171, 62, 0, 0, 97,108, +115,113,117, 97,114,229, 51,136,171, 76, 0, 0, 97,110,100,114, + 97, 98,105,110,100,117, 98,101,110,103, 97,108,233, 9,129,171, + 99, 0, 0, 97,110,100,114, 97, 98,105,110,100,117, 99,109,226, + 3, 16,171,118, 0, 0, 97,110,100,114, 97, 98,105,110,100,117, +100,101,118,225, 9, 1,171,138, 0, 0, 97,110,100,114, 97, 98, +105,110,100,117,103,117,106, 97,114, 97,116,233, 10,129,171,162, + 0, 0, 97,112,115,108,111, 99,235, 33,234,171,175, 0, 0, 97, +114,101,111,230, 33, 5,171,186, 0, 0, 97,114,111,238, 2,199, +171,196,180, 37, 97,114,114,105, 97,103,101,114,101,116,117,114, +238, 33,181,171,215, 0, 0, 98,111,112,111,109,111,102,239, 49, + 24,171,229, 0, 0, 99, 97,114,111,238, 1, 13,171,240, 0, 0, + 99,101,100,105,108,108,225, 0,231,171,253,180, 26, 99,105,114, + 99,108,229, 36,210,172, 9, 0, 0, 99,105,114, 99,117,109,102, +108,101,248, 1, 9,172, 25, 0, 0, 99,117,114,236, 2, 85,172, + 35, 0, 0,100,111,244, 1, 11,172, 44,180, 14,100,115,113,117, + 97,114,229, 51,197,172, 57, 0, 0,101,100,105,108,108,225, 0, +184,172, 69,180, 5,101,110,244, 0,162,172, 78,179,192,104, 97, + 97,114,109,101,110,105, 97,238, 5,121,172, 94, 0, 0,104, 97, + 98,101,110,103, 97,108,233, 9,155,172,109, 0, 0,104, 97,100, +101,118,225, 9, 27,172,121, 0, 0,104, 97,103,117,106, 97,114, + 97,116,233, 10,155,172,137, 0, 0,104, 97,103,117,114,109,117, +107,104,233, 10, 27,172,153, 0, 0,104, 98,111,112,111,109,111, +102,239, 49, 20,172,168, 0, 0,104,101, 97, 98,107,104, 97,115, +105, 97,110, 99,121,114,105,108,108,105,227, 4,189,172,193, 0, + 0,104,101, 99,107,109, 97,114,235, 39, 19,172,207, 0, 0,104, +101, 99,121,114,105,108,108,105,227, 4, 71,172,223, 0, 0,104, +101,100,101,115, 99,101,110,100,101,114, 97, 98,107,104, 97,115, +105, 97,110, 99,121,114,105,108,108,105,227, 4,191,173, 1, 0, + 0,104,101,100,101,115, 99,101,110,100,101,114, 99,121,114,105, +108,108,105,227, 4,183,173, 26, 0, 0,104,101,100,105,101,114, +101,115,105,115, 99,121,114,105,108,108,105,227, 4,245,173, 50, + 0, 0,104,101,104, 97,114,109,101,110,105, 97,238, 5,115,173, + 67, 0, 0,104,101,107,104, 97,107, 97,115,115,105, 97,110, 99, +121,114,105,108,108,105,227, 4,204,173, 93, 0, 0,104,101,118, +101,114,116,105, 99, 97,108,115,116,114,111,107,101, 99,121,114, +105,108,108,105,227, 4,185,173,123, 0, 0,104,233, 3,199,173, +131,179, 88,104,111, 99,104, 97,110,103,116,104, 97,233, 14, 10, +173,148, 0, 0,104,111, 99,104, 97,110,116,104, 97,233, 14, 8, +173,164, 0, 0,104,111, 99,104,105,110,103,116,104, 97,233, 14, + 9,173,181, 0, 0,104,111, 99,104,111,101,116,104, 97,233, 14, + 12,173,197, 0, 0,104,111,111,235, 1,136,173,207, 0, 0,105, +101,117, 99, 97, 99,105,114, 99,108,101,107,111,114,101, 97,238, + 50,118,173,230, 0, 0,105,101,117, 99, 97,112, 97,114,101,110, +107,111,114,101, 97,238, 50, 22,173,252, 0, 0,105,101,117, 99, + 99,105,114, 99,108,101,107,111,114,101, 97,238, 50,104,174, 18, + 0, 0,105,101,117, 99,107,111,114,101, 97,238, 49, 72,174, 34, + 0, 0,105,101,117, 99,112, 97,114,101,110,107,111,114,101, 97, +238, 50, 8,174, 55, 0, 0,105,101,117, 99,117,112, 97,114,101, +110,107,111,114,101, 97,238, 50, 28,174, 77, 0, 0,105,114, 99, +108,229, 37,203,174, 88,178,249,105,114, 99,117,109,102,108,101, +248, 2,198,174,103,178,226,108,101, 97,242, 35, 39,174,113, 0, + 0,108,105, 99,107, 97,108,118,101,111,108, 97,242, 1,194,174, +131, 0, 0,108,105, 99,107,100,101,110,116, 97,236, 1,192,174, +147, 0, 0,108,105, 99,107,108, 97,116,101,114, 97,236, 1,193, +174,164, 0, 0,108,105, 99,107,114,101,116,114,111,102,108,101, +248, 1,195,174,183, 0, 0,108,117,226, 38, 99,174,192,178,196, +109, 99,117, 98,101,100,115,113,117, 97,114,229, 51,164,174,210, + 0, 0,109,111,110,111,115,112, 97, 99,229,255, 67,174,225, 0, + 0,109,115,113,117, 97,114,101,100,115,113,117, 97,114,229, 51, +160,174,245, 0, 0,111, 97,114,109,101,110,105, 97,238, 5,129, +175, 4, 0, 0,111,108,111,238, 0, 58,175, 14,178,104,111,109, +109,225, 0, 44,175, 24,177,161,111,109,112, 97,115,243, 38, 60, +175, 36, 0, 0,111,110,103,114,117,101,110,244, 34, 69,175, 50, + 0, 0,111,110,116,111,117,114,105,110,116,101,103,114, 97,236, + 34, 46,175, 70, 0, 0,111,110,116,114,111,236, 35, 3,175, 82, +176,144,111,112,121,114,105,103,104,244, 0,169,175, 96,176,123, +111,114,110,101,114, 98,114, 97, 99,107,101,116,108,101,102,244, + 48, 12,175,118,176, 94,111,114,110,101,114, 98,114, 97, 99,107, +101,116,114,105,103,104,244, 48, 13,175,141,176, 65,111,114,112, +111,114, 97,116,105,111,110,115,113,117, 97,114,229, 51,127,175, +163, 0, 0,111,115,113,117, 97,114,229, 51,199,175,176, 0, 0, +111,118,101,114,107,103,115,113,117, 97,114,229, 51,198,175,194, + 0, 0,112, 97,114,101,238, 36,158,175,205, 0, 0,114,117,122, +101,105,114,239, 32,162,175,218, 0, 0,115,116,114,101,116, 99, +104,101,228, 2,151,175,233, 0, 0,117,114,108,121, 97,110,228, + 34,207,175,246, 0, 0,117,114,108,121,111,242, 34,206,176, 2, + 0, 0,117,114,114,101,110, 99,249, 0,164,176, 15, 0, 0,121, +114, 66,114,101,118,229,246,209,176, 28, 0, 0,121,114, 70,108, +101,248,246,210,176, 40, 0, 0,121,114, 98,114,101,118,229,246, +212,176, 53, 0, 0,121,114,102,108,101,248,246,213, 0, 0, 0, + 0,104, 97,108,102,119,105,100,116,232,255, 99,176, 80, 0, 0, +118,101,114,116,105, 99, 97,236,254, 66, 0, 0, 0, 0,104, 97, +108,102,119,105,100,116,232,255, 98,176,109, 0, 0,118,101,114, +116,105, 99, 97,236,254, 65, 0, 0, 0, 0,115, 97,110,243,248, +233,176,133, 0, 0,115,101,114,105,230,246,217, 0, 0, 0, 0, + 65, 67,203, 0, 6,176,153, 0, 0, 66, 69,204, 0, 7,176,162, + 0, 0, 66,211, 0, 8,176,170, 0, 0, 67, 65,206, 0, 24,176, +179, 0, 0, 67,210, 0, 13,176,187, 0, 0, 68, 67,177, 0, 17, +176,196, 0, 0, 68, 67,178, 0, 18,176,205, 0, 0, 68, 67,179, + 0, 19,176,214, 0, 0, 68, 67,180, 0, 20,176,223, 0, 0, 68, + 69,204, 0,127,176,232, 0, 0, 68, 76,197, 0, 16,176,241, 0, + 0, 69,205, 0, 25,176,249, 0, 0, 69, 78,209, 0, 5,177, 2, + 0, 0, 69, 79,212, 0, 4,177, 11, 0, 0, 69, 83,195, 0, 27, +177, 20, 0, 0, 69, 84,194, 0, 23,177, 29, 0, 0, 69, 84,216, + 0, 3,177, 38, 0, 0, 70,198, 0, 12,177, 46, 0, 0, 70,211, + 0, 28,177, 54, 0, 0, 71,211, 0, 29,177, 62, 0, 0, 72,212, + 0, 9,177, 70, 0, 0, 76,198, 0, 10,177, 78, 0, 0, 78, 65, +203, 0, 21,177, 87, 0, 0, 82,211, 0, 30,177, 95, 0, 0, 83, +201, 0, 15,177,103, 0, 0, 83,207, 0, 14,177,111,177,154, 83, + 84,216, 0, 1,177,120, 0, 0, 83, 85,194, 0, 26,177,129, 0, + 0, 83, 89,206, 0, 22,177,138, 0, 0, 85,211, 0, 31,177,146, + 0, 0, 86,212, 0, 11, 0, 0, 0, 0,212, 0, 2, 0, 0, 0, + 0, 97, 98,111,118,101, 99,109,226, 3, 19,177,175, 0, 0, 97, + 98,111,118,101,114,105,103,104,116, 99,109,226, 3, 21,177,194, + 0, 0, 97, 99, 99,101,110,244,246,195,177,206, 0, 0, 97,114, + 97, 98,105,227, 6, 12,177,218, 0, 0, 97,114,109,101,110,105, + 97,238, 5, 93,177,232, 0, 0,105,110,102,101,114,105,111,242, +246,225,177,246, 0, 0,109,111,110,111,115,112, 97, 99,229,255, + 12,178, 5, 0, 0,114,101,118,101,114,115,101,100, 97, 98,111, +118,101, 99,109,226, 3, 20,178, 27, 0, 0,114,101,118,101,114, +115,101,100,109,111,228, 2,189,178, 44, 0, 0,115,109, 97,108, +236,254, 80,178, 55, 0, 0,115,117,112,101,114,105,111,242,246, +226,178, 69, 0, 0,116,117,114,110,101,100, 97, 98,111,118,101, + 99,109,226, 3, 18,178, 89, 0, 0,116,117,114,110,101,100,109, +111,228, 2,187, 0, 0, 0, 0,109,111,110,101,116, 97,114,249, + 32,161,178,118, 0, 0,109,111,110,111,115,112, 97, 99,229,255, + 26,178,133, 0, 0,115,105,103,238, 32,161,178,143, 0, 0,115, +109, 97,108,236,254, 85,178,154, 0, 0,116,114,105, 97,110,103, +117,108, 97,114,104, 97,108,102,109,111,228, 2,209,178,177, 0, + 0,116,114,105, 97,110,103,117,108, 97,114,109,111,228, 2,208, + 0, 0, 0, 0,115,117,105,116, 98,108, 97, 99,235, 38, 99,178, +211, 0, 0,115,117,105,116,119,104,105,116,229, 38,103, 0, 0, + 0, 0, 98,101,108,111,119, 99,109,226, 3, 45,178,240, 0, 0, + 99,109,226, 3, 2, 0, 0, 0, 0,109,117,108,116,105,112,108, +249, 34,151,179, 7, 0, 0,111,244, 34,153,179, 15, 0, 0,112, +108,117,243, 34,149,179, 25, 0, 0,112,111,115,116, 97,108,109, + 97,114,235, 48, 54,179, 41, 0, 0,119,105,116,104,108,101,102, +116,104, 97,108,102, 98,108, 97, 99,235, 37,208,179, 64, 0, 0, +119,105,116,104,114,105,103,104,116,104, 97,108,102, 98,108, 97, + 99,235, 37,209, 0, 0, 0, 0,101,117, 99,104, 97, 99,105,114, + 99,108,101,107,111,114,101, 97,238, 50,119,179,111, 0, 0,101, +117, 99,104, 97,112, 97,114,101,110,107,111,114,101, 97,238, 50, + 23,179,133, 0, 0,101,117, 99,104, 99,105,114, 99,108,101,107, +111,114,101, 97,238, 50,105,179,155, 0, 0,101,117, 99,104,107, +111,114,101, 97,238, 49, 74,179,171, 0, 0,101,117, 99,104,112, + 97,114,101,110,107,111,114,101, 97,238, 50, 9, 0, 0, 0, 0, +105,103,114, 97,100,229, 33, 3,179,204, 0, 0,105,110,102,101, +114,105,111,242,246,223,179,218, 0, 0,109,111,110,111,115,112, + 97, 99,229,255,224,179,233, 0, 0,111,108,100,115,116,121,108, +229,247,162,179,247, 0, 0,115,117,112,101,114,105,111,242,246, +224, 0, 0, 0, 0, 99,109,226, 3, 39, 0, 0, 0, 0, 97, 99, + 99,101,110,244, 1, 11, 0, 0, 0, 0, 97, 99,117,116,229, 30, + 9, 0, 0, 0, 0, 98,101,108,111,119, 99,109,226, 3, 44,180, + 51, 0, 0, 99,109,226, 3, 12, 0, 0, 0, 0, 97, 98,101,110, +103, 97,108,233, 9,172,180, 74, 0, 0, 97, 99,107,115,108, 97, +115,232, 0, 92,180, 88,187,151, 97,100,101,118,225, 9, 44,180, + 99, 0, 0, 97,103,117,106, 97,114, 97,116,233, 10,172,180,114, + 0, 0, 97,103,117,114,109,117,107,104,233, 10, 44,180,129, 0, + 0, 97,104,105,114, 97,103, 97,110,225, 48,112,180,144, 0, 0, + 97,104,116,116,104, 97,233, 14, 63,180,157, 0, 0, 97,107, 97, +116, 97,107, 97,110,225, 48,208,180,172, 0, 0, 97,242, 0,124, +180,180,187,136, 98,111,112,111,109,111,102,239, 49, 5,180,194, + 0, 0, 99,105,114, 99,108,229, 36,209,180,206, 0, 0,100,111, +116, 97, 99, 99,101,110,244, 30, 3,180,221, 0, 0,100,111,116, + 98,101,108,111,247, 30, 5,180,235, 0, 0,101, 97,109,101,100, +115,105,120,116,101,101,110,116,104,110,111,116,101,243, 38,108, +181, 4, 0, 0,101, 99, 97,117,115,229, 34, 53,181, 16, 0, 0, +101, 99,121,114,105,108,108,105,227, 4, 49,181, 31, 0, 0,101, +104, 97,114, 97, 98,105,227, 6, 40,181, 45, 0, 0,101,104,102, +105,110, 97,108, 97,114, 97, 98,105,227,254,144,181, 64, 0, 0, +101,104,105,110,105,116,105, 97,108, 97,114, 97, 98,105,227,254, +145,181, 85, 0, 0,101,104,105,114, 97,103, 97,110,225, 48,121, +181,100, 0, 0,101,104,109,101,100,105, 97,108, 97,114, 97, 98, +105,227,254,146,181,120, 0, 0,101,104,109,101,101,109,105,110, +105,116,105, 97,108, 97,114, 97, 98,105,227,252,159,181,145, 0, + 0,101,104,109,101,101,109,105,115,111,108, 97,116,101,100, 97, +114, 97, 98,105,227,252, 8,181,171, 0, 0,101,104,110,111,111, +110,102,105,110, 97,108, 97,114, 97, 98,105,227,252,109,181,194, + 0, 0,101,107, 97,116, 97,107, 97,110,225, 48,217,181,209, 0, + 0,101,110, 97,114,109,101,110,105, 97,238, 5, 98,181,225, 0, + 0,101,244, 5,209,181,233,187, 60,104, 97, 98,101,110,103, 97, +108,233, 9,173,181,248, 0, 0,104, 97,100,101,118,225, 9, 45, +182, 4, 0, 0,104, 97,103,117,106, 97,114, 97,116,233, 10,173, +182, 20, 0, 0,104, 97,103,117,114,109,117,107,104,233, 10, 45, +182, 36, 0, 0,104,111,111,235, 2, 83,182, 46, 0, 0,105,104, +105,114, 97,103, 97,110,225, 48,115,182, 61, 0, 0,105,107, 97, +116, 97,107, 97,110,225, 48,211,182, 76, 0, 0,105,108, 97, 98, +105, 97,108, 99,108,105, 99,235, 2,152,182, 94, 0, 0,105,110, +100,105,103,117,114,109,117,107,104,233, 10, 2,182,112, 0, 0, +105,114,117,115,113,117, 97,114,229, 51, 49,182,127, 0, 0,108, + 97, 99,107, 99,105,114, 99,108,229, 37,207,182,143, 0, 0,108, + 97, 99,107,100,105, 97,109,111,110,228, 37,198,182,160, 0, 0, +108, 97, 99,107,100,111,119,110,112,111,105,110,116,105,110,103, +116,114,105, 97,110,103,108,229, 37,188,182,190, 0, 0,108, 97, + 99,107,108,101,102,116,112,111,105,110,116,105,110,103,112,111, +105,110,116,101,242, 37,196,182,219, 0, 0,108, 97, 99,107,108, +101,102,116,112,111,105,110,116,105,110,103,116,114,105, 97,110, +103,108,229, 37,192,182,249, 0, 0,108, 97, 99,107,108,101,110, +116,105, 99,117,108, 97,114, 98,114, 97, 99,107,101,116,108,101, +102,244, 48, 16,183, 24,187, 46,108, 97, 99,107,108,101,110,116, +105, 99,117,108, 97,114, 98,114, 97, 99,107,101,116,114,105,103, +104,244, 48, 17,183, 56,187, 32,108, 97, 99,107,108,111,119,101, +114,108,101,102,116,116,114,105, 97,110,103,108,229, 37,227,183, + 83, 0, 0,108, 97, 99,107,108,111,119,101,114,114,105,103,104, +116,116,114,105, 97,110,103,108,229, 37,226,183,111, 0, 0,108, + 97, 99,107,114,101, 99,116, 97,110,103,108,229, 37,172,183,130, + 0, 0,108, 97, 99,107,114,105,103,104,116,112,111,105,110,116, +105,110,103,112,111,105,110,116,101,242, 37,186,183,160, 0, 0, +108, 97, 99,107,114,105,103,104,116,112,111,105,110,116,105,110, +103,116,114,105, 97,110,103,108,229, 37,182,183,191, 0, 0,108, + 97, 99,107,115,109, 97,108,108,115,113,117, 97,114,229, 37,170, +183,212, 0, 0,108, 97, 99,107,115,109,105,108,105,110,103,102, + 97, 99,229, 38, 59,183,233, 0, 0,108, 97, 99,107,115,113,117, + 97,114,229, 37,160,183,249, 0, 0,108, 97, 99,107,115,116, 97, +242, 38, 5,184, 7, 0, 0,108, 97, 99,107,117,112,112,101,114, +108,101,102,116,116,114,105, 97,110,103,108,229, 37,228,184, 34, + 0, 0,108, 97, 99,107,117,112,112,101,114,114,105,103,104,116, +116,114,105, 97,110,103,108,229, 37,229,184, 62, 0, 0,108, 97, + 99,107,117,112,112,111,105,110,116,105,110,103,115,109, 97,108, +108,116,114,105, 97,110,103,108,229, 37,180,184, 95, 0, 0,108, + 97, 99,107,117,112,112,111,105,110,116,105,110,103,116,114,105, + 97,110,103,108,229, 37,178,184,123, 0, 0,108, 97,110,235, 36, + 35,184,133, 0, 0,108,105,110,101, 98,101,108,111,247, 30, 7, +184,148, 0, 0,108,111, 99,235, 37,136,184,158, 0, 0,109,111, +110,111,115,112, 97, 99,229,255, 66,184,173, 0, 0,111, 98, 97, +105,109, 97,105,116,104, 97,233, 14, 26,184,190, 0, 0,111,104, +105,114, 97,103, 97,110,225, 48,124,184,205, 0, 0,111,107, 97, +116, 97,107, 97,110,225, 48,220,184,220, 0, 0,112, 97,114,101, +238, 36,157,184,231, 0, 0,113,115,113,117, 97,114,229, 51,195, +184,244, 0, 0,114, 97, 99,101,101,248,248,244,185, 0, 0, 0, +114, 97, 99,101,108,101,102,244, 0,123,185, 14,186,223,114, 97, + 99,101,114,105,103,104,244, 0,125,185, 29,186,158,114, 97, 99, +107,101,116,108,101,102,244, 0, 91,185, 45,186,119,114, 97, 99, +107,101,116,114,105,103,104,244, 0, 93,185, 62,186, 80,114,101, +118,229, 2,216,185, 72,185,251,114,105,100,103,101, 98,101,108, +111,119, 99,109,226, 3, 42,185, 91, 0, 0,114,105,100,103,101, +105,110,118,101,114,116,101,100, 98,101,108,111,119, 99,109,226, + 3, 58,185,118, 0, 0,114,111,107,101,110, 98, 97,242, 0,166, +185,132, 0, 0,115,116,114,111,107,229, 1,128,185,144, 0, 0, +115,117,112,101,114,105,111,242,246,234,185,158, 0, 0,116,111, +112, 98, 97,242, 1,131,185,170, 0, 0,117,104,105,114, 97,103, + 97,110,225, 48,118,185,185, 0, 0,117,107, 97,116, 97,107, 97, +110,225, 48,214,185,200, 0, 0,117,108,108,101,244, 32, 34,185, +211,185,224,117,108,108,115,101,121,229, 37,206, 0, 0, 0, 0, +105,110,118,101,114,115,229, 37,216,185,237, 0, 0,111,112,101, +114, 97,116,111,242, 34, 25, 0, 0, 0, 0, 98,101,108,111,119, + 99,109,226, 3, 46,186, 9, 0, 0, 99,109,226, 3, 6,186, 18, + 0, 0,105,110,118,101,114,116,101,100, 98,101,108,111,119, 99, +109,226, 3, 47,186, 40, 0, 0,105,110,118,101,114,116,101,100, + 99,109,226, 3, 17,186, 57, 0, 0,105,110,118,101,114,116,101, +100,100,111,117, 98,108,101, 99,109,226, 3, 97, 0, 0, 0, 0, + 98,244,248,251,186, 88, 0, 0,101,248,248,250,186, 96, 0, 0, +109,111,110,111,115,112, 97, 99,229,255, 61,186,111, 0, 0,116, +240,248,249, 0, 0, 0, 0, 98,244,248,240,186,127, 0, 0,101, +248,248,239,186,135, 0, 0,109,111,110,111,115,112, 97, 99,229, +255, 59,186,150, 0, 0,116,240,248,238, 0, 0, 0, 0, 98,244, +248,254,186,166, 0, 0,109,105,228,248,253,186,175, 0, 0,109, +111,110,111,115,112, 97, 99,229,255, 93,186,190, 0, 0,115,109, + 97,108,236,254, 92,186,201, 0, 0,116,240,248,252,186,209, 0, + 0,118,101,114,116,105, 99, 97,236,254, 56, 0, 0, 0, 0, 98, +244,248,243,186,231, 0, 0,109,105,228,248,242,186,240, 0, 0, +109,111,110,111,115,112, 97, 99,229,255, 91,186,255, 0, 0,115, +109, 97,108,236,254, 91,187, 10, 0, 0,116,240,248,241,187, 18, + 0, 0,118,101,114,116,105, 99, 97,236,254, 55, 0, 0, 0, 0, +118,101,114,116,105, 99, 97,236,254, 60, 0, 0, 0, 0,118,101, +114,116,105, 99, 97,236,254, 59, 0, 0, 0, 0,225, 3,178,187, + 67,187,119,100, 97,103,101,115,232,251, 49,187, 79,187,107,104, +101, 98,114,101,247, 5,209,187, 91, 0, 0,114, 97,102,101,104, +101, 98,114,101,247,251, 76, 0, 0, 0, 0,104,101, 98,114,101, +247,251, 49, 0, 0, 0, 0,115,121,109, 98,111,108,103,114,101, +101,235, 3,208, 0, 0, 0, 0,109,111,110,111,115,112, 97, 99, +229,255, 92, 0, 0, 0, 0,109,111,110,111,115,112, 97, 99,229, +255, 60, 0, 0, 0, 0, 97, 98,101,110,103, 97,108,233, 9,134, +187,180, 0, 0, 97, 99,117,116,229, 0,225,187,191, 0, 0, 97, +100,101,118,225, 9, 6,187,202, 0, 0, 97,103,117,106, 97,114, + 97,116,233, 10,134,187,217, 0, 0, 97,103,117,114,109,117,107, +104,233, 10, 6,187,232, 0, 0, 97,109, 97,116,114, 97,103,117, +114,109,117,107,104,233, 10, 62,187,252, 0, 0, 97,114,117,115, +113,117, 97,114,229, 51, 3,188, 11, 0, 0, 97,118,111,119,101, +108,115,105,103,110, 98,101,110,103, 97,108,233, 9,190,188, 34, + 0, 0, 97,118,111,119,101,108,115,105,103,110,100,101,118,225, + 9, 62,188, 54, 0, 0, 97,118,111,119,101,108,115,105,103,110, +103,117,106, 97,114, 97,116,233, 10,190,188, 78, 0, 0, 98, 98, +114,101,118,105, 97,116,105,111,110,109, 97,114,107, 97,114,109, +101,110,105, 97,238, 5, 95,188,107, 0, 0, 98, 98,114,101,118, +105, 97,116,105,111,110,115,105,103,110,100,101,118,225, 9,112, +188,132, 0, 0, 98,101,110,103, 97,108,233, 9,133,188,145, 0, + 0, 98,111,112,111,109,111,102,239, 49, 26,188,159, 0, 0, 98, +114,101,118,229, 1, 3,188,170,213, 65, 99, 97,114,111,238, 1, +206,188,181, 0, 0, 99,105,114, 99,108,229, 36,208,188,193, 0, + 0, 99,105,114, 99,117,109,102,108,101,248, 0,226,188,209,213, + 3, 99,117,116,229, 0,180,188,219,212,191, 99,121,114,105,108, +108,105,227, 4, 48,188,233, 0, 0,100, 98,108,103,114, 97,118, +229, 2, 1,188,247, 0, 0,100,100, 97,107,103,117,114,109,117, +107,104,233, 10,113,189, 9, 0, 0,100,101,118,225, 9, 5,189, + 19, 0, 0,100,105,101,114,101,115,105,243, 0,228,189, 33,212, +165,100,111,116, 98,101,108,111,247, 30,161,189, 47, 0, 0,100, +111,116,109, 97, 99,114,111,238, 1,225,189, 62, 0, 0,229, 0, +230,189, 69,212,130,102,105,105, 48, 48, 50, 48,184, 32, 21,189, + 83, 0, 0,102,105,105, 48, 56, 57, 52,177, 32,164,189, 97, 0, + 0,102,105,105, 49, 48, 48, 49,183, 4, 16,189,111, 0, 0,102, +105,105, 49, 48, 48, 49,184, 4, 17,189,125, 0, 0,102,105,105, + 49, 48, 48, 49,185, 4, 18,189,139, 0, 0,102,105,105, 49, 48, + 48, 50,176, 4, 19,189,153, 0, 0,102,105,105, 49, 48, 48, 50, +177, 4, 20,189,167, 0, 0,102,105,105, 49, 48, 48, 50,178, 4, + 21,189,181, 0, 0,102,105,105, 49, 48, 48, 50,179, 4, 1,189, +195, 0, 0,102,105,105, 49, 48, 48, 50,180, 4, 22,189,209, 0, + 0,102,105,105, 49, 48, 48, 50,181, 4, 23,189,223, 0, 0,102, +105,105, 49, 48, 48, 50,182, 4, 24,189,237, 0, 0,102,105,105, + 49, 48, 48, 50,183, 4, 25,189,251, 0, 0,102,105,105, 49, 48, + 48, 50,184, 4, 26,190, 9, 0, 0,102,105,105, 49, 48, 48, 50, +185, 4, 27,190, 23, 0, 0,102,105,105, 49, 48, 48, 51,176, 4, + 28,190, 37, 0, 0,102,105,105, 49, 48, 48, 51,177, 4, 29,190, + 51, 0, 0,102,105,105, 49, 48, 48, 51,178, 4, 30,190, 65, 0, + 0,102,105,105, 49, 48, 48, 51,179, 4, 31,190, 79, 0, 0,102, +105,105, 49, 48, 48, 51,180, 4, 32,190, 93, 0, 0,102,105,105, + 49, 48, 48, 51,181, 4, 33,190,107, 0, 0,102,105,105, 49, 48, + 48, 51,182, 4, 34,190,121, 0, 0,102,105,105, 49, 48, 48, 51, +183, 4, 35,190,135, 0, 0,102,105,105, 49, 48, 48, 51,184, 4, + 36,190,149, 0, 0,102,105,105, 49, 48, 48, 51,185, 4, 37,190, +163, 0, 0,102,105,105, 49, 48, 48, 52,176, 4, 38,190,177, 0, + 0,102,105,105, 49, 48, 48, 52,177, 4, 39,190,191, 0, 0,102, +105,105, 49, 48, 48, 52,178, 4, 40,190,205, 0, 0,102,105,105, + 49, 48, 48, 52,179, 4, 41,190,219, 0, 0,102,105,105, 49, 48, + 48, 52,180, 4, 42,190,233, 0, 0,102,105,105, 49, 48, 48, 52, +181, 4, 43,190,247, 0, 0,102,105,105, 49, 48, 48, 52,182, 4, + 44,191, 5, 0, 0,102,105,105, 49, 48, 48, 52,183, 4, 45,191, + 19, 0, 0,102,105,105, 49, 48, 48, 52,184, 4, 46,191, 33, 0, + 0,102,105,105, 49, 48, 48, 52,185, 4, 47,191, 47, 0, 0,102, +105,105, 49, 48, 48, 53,176, 4,144,191, 61, 0, 0,102,105,105, + 49, 48, 48, 53,177, 4, 2,191, 75, 0, 0,102,105,105, 49, 48, + 48, 53,178, 4, 3,191, 89, 0, 0,102,105,105, 49, 48, 48, 53, +179, 4, 4,191,103, 0, 0,102,105,105, 49, 48, 48, 53,180, 4, + 5,191,117, 0, 0,102,105,105, 49, 48, 48, 53,181, 4, 6,191, +131, 0, 0,102,105,105, 49, 48, 48, 53,182, 4, 7,191,145, 0, + 0,102,105,105, 49, 48, 48, 53,183, 4, 8,191,159, 0, 0,102, +105,105, 49, 48, 48, 53,184, 4, 9,191,173, 0, 0,102,105,105, + 49, 48, 48, 53,185, 4, 10,191,187, 0, 0,102,105,105, 49, 48, + 48, 54,176, 4, 11,191,201, 0, 0,102,105,105, 49, 48, 48, 54, +177, 4, 12,191,215, 0, 0,102,105,105, 49, 48, 48, 54,178, 4, + 14,191,229, 0, 0,102,105,105, 49, 48, 48, 54,179,246,196,191, +243, 0, 0,102,105,105, 49, 48, 48, 54,180,246,197,192, 1, 0, + 0,102,105,105, 49, 48, 48, 54,181, 4, 48,192, 15, 0, 0,102, +105,105, 49, 48, 48, 54,182, 4, 49,192, 29, 0, 0,102,105,105, + 49, 48, 48, 54,183, 4, 50,192, 43, 0, 0,102,105,105, 49, 48, + 48, 54,184, 4, 51,192, 57, 0, 0,102,105,105, 49, 48, 48, 54, +185, 4, 52,192, 71, 0, 0,102,105,105, 49, 48, 48, 55,176, 4, + 53,192, 85, 0, 0,102,105,105, 49, 48, 48, 55,177, 4, 81,192, + 99, 0, 0,102,105,105, 49, 48, 48, 55,178, 4, 54,192,113, 0, + 0,102,105,105, 49, 48, 48, 55,179, 4, 55,192,127, 0, 0,102, +105,105, 49, 48, 48, 55,180, 4, 56,192,141, 0, 0,102,105,105, + 49, 48, 48, 55,181, 4, 57,192,155, 0, 0,102,105,105, 49, 48, + 48, 55,182, 4, 58,192,169, 0, 0,102,105,105, 49, 48, 48, 55, +183, 4, 59,192,183, 0, 0,102,105,105, 49, 48, 48, 55,184, 4, + 60,192,197, 0, 0,102,105,105, 49, 48, 48, 55,185, 4, 61,192, +211, 0, 0,102,105,105, 49, 48, 48, 56,176, 4, 62,192,225, 0, + 0,102,105,105, 49, 48, 48, 56,177, 4, 63,192,239, 0, 0,102, +105,105, 49, 48, 48, 56,178, 4, 64,192,253, 0, 0,102,105,105, + 49, 48, 48, 56,179, 4, 65,193, 11, 0, 0,102,105,105, 49, 48, + 48, 56,180, 4, 66,193, 25, 0, 0,102,105,105, 49, 48, 48, 56, +181, 4, 67,193, 39, 0, 0,102,105,105, 49, 48, 48, 56,182, 4, + 68,193, 53, 0, 0,102,105,105, 49, 48, 48, 56,183, 4, 69,193, + 67, 0, 0,102,105,105, 49, 48, 48, 56,184, 4, 70,193, 81, 0, + 0,102,105,105, 49, 48, 48, 56,185, 4, 71,193, 95, 0, 0,102, +105,105, 49, 48, 48, 57,176, 4, 72,193,109, 0, 0,102,105,105, + 49, 48, 48, 57,177, 4, 73,193,123, 0, 0,102,105,105, 49, 48, + 48, 57,178, 4, 74,193,137, 0, 0,102,105,105, 49, 48, 48, 57, +179, 4, 75,193,151, 0, 0,102,105,105, 49, 48, 48, 57,180, 4, + 76,193,165, 0, 0,102,105,105, 49, 48, 48, 57,181, 4, 77,193, +179, 0, 0,102,105,105, 49, 48, 48, 57,182, 4, 78,193,193, 0, + 0,102,105,105, 49, 48, 48, 57,183, 4, 79,193,207, 0, 0,102, +105,105, 49, 48, 48, 57,184, 4,145,193,221, 0, 0,102,105,105, + 49, 48, 48, 57,185, 4, 82,193,235, 0, 0,102,105,105, 49, 48, + 49, 48,176, 4, 83,193,249, 0, 0,102,105,105, 49, 48, 49, 48, +177, 4, 84,194, 7, 0, 0,102,105,105, 49, 48, 49, 48,178, 4, + 85,194, 21, 0, 0,102,105,105, 49, 48, 49, 48,179, 4, 86,194, + 35, 0, 0,102,105,105, 49, 48, 49, 48,180, 4, 87,194, 49, 0, + 0,102,105,105, 49, 48, 49, 48,181, 4, 88,194, 63, 0, 0,102, +105,105, 49, 48, 49, 48,182, 4, 89,194, 77, 0, 0,102,105,105, + 49, 48, 49, 48,183, 4, 90,194, 91, 0, 0,102,105,105, 49, 48, + 49, 48,184, 4, 91,194,105, 0, 0,102,105,105, 49, 48, 49, 48, +185, 4, 92,194,119, 0, 0,102,105,105, 49, 48, 49, 49,176, 4, + 94,194,133, 0, 0,102,105,105, 49, 48, 49, 52,181, 4, 15,194, +147, 0, 0,102,105,105, 49, 48, 49, 52,182, 4, 98,194,161, 0, + 0,102,105,105, 49, 48, 49, 52,183, 4,114,194,175, 0, 0,102, +105,105, 49, 48, 49, 52,184, 4,116,194,189, 0, 0,102,105,105, + 49, 48, 49, 57,178,246,198,194,203, 0, 0,102,105,105, 49, 48, + 49, 57,179, 4, 95,194,217, 0, 0,102,105,105, 49, 48, 49, 57, +180, 4, 99,194,231, 0, 0,102,105,105, 49, 48, 49, 57,181, 4, +115,194,245, 0, 0,102,105,105, 49, 48, 49, 57,182, 4,117,195, + 3, 0, 0,102,105,105, 49, 48, 56, 51,177,246,199,195, 17, 0, + 0,102,105,105, 49, 48, 56, 51,178,246,200,195, 31, 0, 0,102, +105,105, 49, 48, 56, 52,182, 4,217,195, 45, 0, 0,102,105,105, + 50, 57,185, 32, 14,195, 57, 0, 0,102,105,105, 51, 48,176, 32, + 15,195, 69, 0, 0,102,105,105, 51, 48,177, 32, 13,195, 81, 0, + 0,102,105,105, 53, 55, 51, 56,177, 6,106,195, 95, 0, 0,102, +105,105, 53, 55, 51, 56,184, 6, 12,195,109, 0, 0,102,105,105, + 53, 55, 51, 57,178, 6, 96,195,123, 0, 0,102,105,105, 53, 55, + 51, 57,179, 6, 97,195,137, 0, 0,102,105,105, 53, 55, 51, 57, +180, 6, 98,195,151, 0, 0,102,105,105, 53, 55, 51, 57,181, 6, + 99,195,165, 0, 0,102,105,105, 53, 55, 51, 57,182, 6,100,195, +179, 0, 0,102,105,105, 53, 55, 51, 57,183, 6,101,195,193, 0, + 0,102,105,105, 53, 55, 51, 57,184, 6,102,195,207, 0, 0,102, +105,105, 53, 55, 51, 57,185, 6,103,195,221, 0, 0,102,105,105, + 53, 55, 52, 48,176, 6,104,195,235, 0, 0,102,105,105, 53, 55, + 52, 48,177, 6,105,195,249, 0, 0,102,105,105, 53, 55, 52, 48, +179, 6, 27,196, 7, 0, 0,102,105,105, 53, 55, 52, 48,183, 6, + 31,196, 21, 0, 0,102,105,105, 53, 55, 52, 48,185, 6, 33,196, + 35, 0, 0,102,105,105, 53, 55, 52, 49,176, 6, 34,196, 49, 0, + 0,102,105,105, 53, 55, 52, 49,177, 6, 35,196, 63, 0, 0,102, +105,105, 53, 55, 52, 49,178, 6, 36,196, 77, 0, 0,102,105,105, + 53, 55, 52, 49,179, 6, 37,196, 91, 0, 0,102,105,105, 53, 55, + 52, 49,180, 6, 38,196,105, 0, 0,102,105,105, 53, 55, 52, 49, +181, 6, 39,196,119, 0, 0,102,105,105, 53, 55, 52, 49,182, 6, + 40,196,133, 0, 0,102,105,105, 53, 55, 52, 49,183, 6, 41,196, +147, 0, 0,102,105,105, 53, 55, 52, 49,184, 6, 42,196,161, 0, + 0,102,105,105, 53, 55, 52, 49,185, 6, 43,196,175, 0, 0,102, +105,105, 53, 55, 52, 50,176, 6, 44,196,189, 0, 0,102,105,105, + 53, 55, 52, 50,177, 6, 45,196,203, 0, 0,102,105,105, 53, 55, + 52, 50,178, 6, 46,196,217, 0, 0,102,105,105, 53, 55, 52, 50, +179, 6, 47,196,231, 0, 0,102,105,105, 53, 55, 52, 50,180, 6, + 48,196,245, 0, 0,102,105,105, 53, 55, 52, 50,181, 6, 49,197, + 3, 0, 0,102,105,105, 53, 55, 52, 50,182, 6, 50,197, 17, 0, + 0,102,105,105, 53, 55, 52, 50,183, 6, 51,197, 31, 0, 0,102, +105,105, 53, 55, 52, 50,184, 6, 52,197, 45, 0, 0,102,105,105, + 53, 55, 52, 50,185, 6, 53,197, 59, 0, 0,102,105,105, 53, 55, + 52, 51,176, 6, 54,197, 73, 0, 0,102,105,105, 53, 55, 52, 51, +177, 6, 55,197, 87, 0, 0,102,105,105, 53, 55, 52, 51,178, 6, + 56,197,101, 0, 0,102,105,105, 53, 55, 52, 51,179, 6, 57,197, +115, 0, 0,102,105,105, 53, 55, 52, 51,180, 6, 58,197,129, 0, + 0,102,105,105, 53, 55, 52, 52,176, 6, 64,197,143, 0, 0,102, +105,105, 53, 55, 52, 52,177, 6, 65,197,157, 0, 0,102,105,105, + 53, 55, 52, 52,178, 6, 66,197,171, 0, 0,102,105,105, 53, 55, + 52, 52,179, 6, 67,197,185, 0, 0,102,105,105, 53, 55, 52, 52, +180, 6, 68,197,199, 0, 0,102,105,105, 53, 55, 52, 52,181, 6, + 69,197,213, 0, 0,102,105,105, 53, 55, 52, 52,182, 6, 70,197, +227, 0, 0,102,105,105, 53, 55, 52, 52,184, 6, 72,197,241, 0, + 0,102,105,105, 53, 55, 52, 52,185, 6, 73,197,255, 0, 0,102, +105,105, 53, 55, 52, 53,176, 6, 74,198, 13, 0, 0,102,105,105, + 53, 55, 52, 53,177, 6, 75,198, 27, 0, 0,102,105,105, 53, 55, + 52, 53,178, 6, 76,198, 41, 0, 0,102,105,105, 53, 55, 52, 53, +179, 6, 77,198, 55, 0, 0,102,105,105, 53, 55, 52, 53,180, 6, + 78,198, 69, 0, 0,102,105,105, 53, 55, 52, 53,181, 6, 79,198, + 83, 0, 0,102,105,105, 53, 55, 52, 53,182, 6, 80,198, 97, 0, + 0,102,105,105, 53, 55, 52, 53,183, 6, 81,198,111, 0, 0,102, +105,105, 53, 55, 52, 53,184, 6, 82,198,125, 0, 0,102,105,105, + 53, 55, 52, 55,176, 6, 71,198,139, 0, 0,102,105,105, 53, 55, + 53, 48,181, 6,164,198,153, 0, 0,102,105,105, 53, 55, 53, 48, +182, 6,126,198,167, 0, 0,102,105,105, 53, 55, 53, 48,183, 6, +134,198,181, 0, 0,102,105,105, 53, 55, 53, 48,184, 6,152,198, +195, 0, 0,102,105,105, 53, 55, 53, 48,185, 6,175,198,209, 0, + 0,102,105,105, 53, 55, 53, 49,177, 6,121,198,223, 0, 0,102, +105,105, 53, 55, 53, 49,178, 6,136,198,237, 0, 0,102,105,105, + 53, 55, 53, 49,179, 6,145,198,251, 0, 0,102,105,105, 53, 55, + 53, 49,180, 6,186,199, 9, 0, 0,102,105,105, 53, 55, 53, 49, +185, 6,210,199, 23, 0, 0,102,105,105, 53, 55, 53, 51,180, 6, +213,199, 37, 0, 0,102,105,105, 53, 55, 54, 51,182, 32,170,199, + 51, 0, 0,102,105,105, 53, 55, 54, 52,181, 5,190,199, 65, 0, + 0,102,105,105, 53, 55, 54, 53,184, 5,195,199, 79, 0, 0,102, +105,105, 53, 55, 54, 54,180, 5,208,199, 93, 0, 0,102,105,105, + 53, 55, 54, 54,181, 5,209,199,107, 0, 0,102,105,105, 53, 55, + 54, 54,182, 5,210,199,121, 0, 0,102,105,105, 53, 55, 54, 54, +183, 5,211,199,135, 0, 0,102,105,105, 53, 55, 54, 54,184, 5, +212,199,149, 0, 0,102,105,105, 53, 55, 54, 54,185, 5,213,199, +163, 0, 0,102,105,105, 53, 55, 54, 55,176, 5,214,199,177, 0, + 0,102,105,105, 53, 55, 54, 55,177, 5,215,199,191, 0, 0,102, +105,105, 53, 55, 54, 55,178, 5,216,199,205, 0, 0,102,105,105, + 53, 55, 54, 55,179, 5,217,199,219, 0, 0,102,105,105, 53, 55, + 54, 55,180, 5,218,199,233, 0, 0,102,105,105, 53, 55, 54, 55, +181, 5,219,199,247, 0, 0,102,105,105, 53, 55, 54, 55,182, 5, +220,200, 5, 0, 0,102,105,105, 53, 55, 54, 55,183, 5,221,200, + 19, 0, 0,102,105,105, 53, 55, 54, 55,184, 5,222,200, 33, 0, + 0,102,105,105, 53, 55, 54, 55,185, 5,223,200, 47, 0, 0,102, +105,105, 53, 55, 54, 56,176, 5,224,200, 61, 0, 0,102,105,105, + 53, 55, 54, 56,177, 5,225,200, 75, 0, 0,102,105,105, 53, 55, + 54, 56,178, 5,226,200, 89, 0, 0,102,105,105, 53, 55, 54, 56, +179, 5,227,200,103, 0, 0,102,105,105, 53, 55, 54, 56,180, 5, +228,200,117, 0, 0,102,105,105, 53, 55, 54, 56,181, 5,229,200, +131, 0, 0,102,105,105, 53, 55, 54, 56,182, 5,230,200,145, 0, + 0,102,105,105, 53, 55, 54, 56,183, 5,231,200,159, 0, 0,102, +105,105, 53, 55, 54, 56,184, 5,232,200,173, 0, 0,102,105,105, + 53, 55, 54, 56,185, 5,233,200,187, 0, 0,102,105,105, 53, 55, + 54, 57,176, 5,234,200,201, 0, 0,102,105,105, 53, 55, 54, 57, +180,251, 42,200,215, 0, 0,102,105,105, 53, 55, 54, 57,181,251, + 43,200,229, 0, 0,102,105,105, 53, 55, 55, 48,176,251, 75,200, +243, 0, 0,102,105,105, 53, 55, 55, 48,181,251, 31,201, 1, 0, + 0,102,105,105, 53, 55, 55, 49,182, 5,240,201, 15, 0, 0,102, +105,105, 53, 55, 55, 49,183, 5,241,201, 29, 0, 0,102,105,105, + 53, 55, 55, 49,184, 5,242,201, 43, 0, 0,102,105,105, 53, 55, + 55, 50,179,251, 53,201, 57, 0, 0,102,105,105, 53, 55, 55, 57, +179, 5,180,201, 71, 0, 0,102,105,105, 53, 55, 55, 57,180, 5, +181,201, 85, 0, 0,102,105,105, 53, 55, 55, 57,181, 5,182,201, + 99, 0, 0,102,105,105, 53, 55, 55, 57,182, 5,187,201,113, 0, + 0,102,105,105, 53, 55, 55, 57,183, 5,184,201,127, 0, 0,102, +105,105, 53, 55, 55, 57,184, 5,183,201,141, 0, 0,102,105,105, + 53, 55, 55, 57,185, 5,176,201,155, 0, 0,102,105,105, 53, 55, + 56, 48,176, 5,178,201,169, 0, 0,102,105,105, 53, 55, 56, 48, +177, 5,177,201,183, 0, 0,102,105,105, 53, 55, 56, 48,178, 5, +179,201,197, 0, 0,102,105,105, 53, 55, 56, 48,179, 5,194,201, +211, 0, 0,102,105,105, 53, 55, 56, 48,180, 5,193,201,225, 0, + 0,102,105,105, 53, 55, 56, 48,182, 5,185,201,239, 0, 0,102, +105,105, 53, 55, 56, 48,183, 5,188,201,253, 0, 0,102,105,105, + 53, 55, 56, 51,185, 5,189,202, 11, 0, 0,102,105,105, 53, 55, + 56, 52,177, 5,191,202, 25, 0, 0,102,105,105, 53, 55, 56, 52, +178, 5,192,202, 39, 0, 0,102,105,105, 53, 55, 57, 50,185, 2, +188,202, 53, 0, 0,102,105,105, 54, 49, 50, 52,184, 33, 5,202, + 67, 0, 0,102,105,105, 54, 49, 50, 56,185, 33, 19,202, 81, 0, + 0,102,105,105, 54, 49, 51, 53,178, 33, 22,202, 95, 0, 0,102, +105,105, 54, 49, 53, 55,179, 32, 44,202,109, 0, 0,102,105,105, + 54, 49, 53, 55,180, 32, 45,202,123, 0, 0,102,105,105, 54, 49, + 53, 55,181, 32, 46,202,137, 0, 0,102,105,105, 54, 49, 54, 54, +180, 32, 12,202,151, 0, 0,102,105,105, 54, 51, 49, 54,183, 6, +109,202,165, 0, 0,102,105,105, 54, 52, 57, 51,183, 2,189,202, +179, 0, 0,103,114, 97,118,229, 0,224,202,190, 0, 0,103,117, +106, 97,114, 97,116,233, 10,133,202,204, 0, 0,103,117,114,109, +117,107,104,233, 10, 5,202,218, 0, 0,104,105,114, 97,103, 97, +110,225, 48, 66,202,232, 0, 0,104,111,111,107, 97, 98,111,118, +229, 30,163,202,247, 0, 0,105, 98,101,110,103, 97,108,233, 9, +144,203, 5, 0, 0,105, 98,111,112,111,109,111,102,239, 49, 30, +203, 20, 0, 0,105,100,101,118,225, 9, 16,203, 31, 0, 0,105, +101, 99,121,114,105,108,108,105,227, 4,213,203, 47, 0, 0,105, +103,117,106, 97,114, 97,116,233, 10,144,203, 62, 0, 0,105,103, +117,114,109,117,107,104,233, 10, 16,203, 77, 0, 0,105,109, 97, +116,114, 97,103,117,114,109,117,107,104,233, 10, 72,203, 97, 0, + 0,105,110, 97,114, 97, 98,105,227, 6, 57,203,111, 0, 0,105, +110,102,105,110, 97,108, 97,114, 97, 98,105,227,254,202,203,130, + 0, 0,105,110,105,110,105,116,105, 97,108, 97,114, 97, 98,105, +227,254,203,203,151, 0, 0,105,110,109,101,100,105, 97,108, 97, +114, 97, 98,105,227,254,204,203,171, 0, 0,105,110,118,101,114, +116,101,100, 98,114,101,118,229, 2, 3,203,190, 0, 0,105,118, +111,119,101,108,115,105,103,110, 98,101,110,103, 97,108,233, 9, +200,203,213, 0, 0,105,118,111,119,101,108,115,105,103,110,100, +101,118,225, 9, 72,203,233, 0, 0,105,118,111,119,101,108,115, +105,103,110,103,117,106, 97,114, 97,116,233, 10,200,204, 1, 0, + 0,107, 97,116, 97,107, 97,110,225, 48,162,204, 15,212,115,107, +111,114,101, 97,238, 49, 79,204, 27, 0, 0,108,101,230, 5,208, +204, 36,211, 19,108,101,112,232, 33, 53,204, 46, 0, 0,108,108, +101,113,117, 97,236, 34, 76,204, 59, 0, 0,108,112,104,225, 3, +177,204, 69,211, 8,109, 97, 99,114,111,238, 1, 1,204, 81, 0, + 0,109,111,110,111,115,112, 97, 99,229,255, 65,204, 96, 0, 0, +109,112,101,114,115, 97,110,228, 0, 38,204,110,210,238,109,115, +113,117, 97,114,229, 51,194,204,123, 0, 0,110, 98,111,112,111, +109,111,102,239, 49, 34,204,138, 0, 0,110,103, 98,111,112,111, +109,111,102,239, 49, 36,204,154, 0, 0,110,103,107,104, 97,110, +107,104,117,116,104, 97,233, 14, 90,204,173, 0, 0,110,103,108, +229, 34, 32,204,183,210,154,110,103,115,116,114,111,237, 33, 43, +204,196, 0, 0,110,111,116,101,108,101,105,225, 3,135,204,210, + 0, 0,110,117,100, 97,116,116, 97,100,101,118,225, 9, 82,204, +227, 0, 0,110,117,115,118, 97,114, 97, 98,101,110,103, 97,108, +233, 9,130,204,247, 0, 0,110,117,115,118, 97,114, 97,100,101, +118,225, 9, 2,205, 8, 0, 0,110,117,115,118, 97,114, 97,103, +117,106, 97,114, 97,116,233, 10,130,205, 29, 0, 0,111,103,111, +110,101,235, 1, 5,205, 41, 0, 0,112, 97, 97,116,111,115,113, +117, 97,114,229, 51, 0,205, 58, 0, 0,112, 97,114,101,238, 36, +156,205, 69, 0, 0,112,111,115,116,114,111,112,104,101, 97,114, +109,101,110,105, 97,238, 5, 90,205, 92, 0, 0,112,111,115,116, +114,111,112,104,101,109,111,228, 2,188,205,110, 0, 0,112,112, +108,229,248,255,205,120, 0, 0,112,112,114,111, 97, 99,104,101, +243, 34, 80,205,135, 0, 0,112,112,114,111,120,101,113,117, 97, +236, 34, 72,205,151,210,141,112,112,114,111,120,105,109, 97,116, +101,108,121,101,113,117, 97,236, 34, 69,205,174, 0, 0,114, 97, +101, 97,101,107,111,114,101, 97,238, 49,142,205,191, 0, 0,114, + 97,101, 97,107,111,114,101, 97,238, 49,141,205,207, 0, 0,114, +227, 35, 18,205,215, 0, 0,114,105,103,104,116,104, 97,108,102, +114,105,110,231, 30,154,205,234, 0, 0,114,105,110,231, 0,229, +205,244,210,119,114,114,111,119, 98,111,116,232, 33,148,206, 2, + 0, 0,114,114,111,119,100, 97,115,104,100,111,119,238, 33,227, +206, 20, 0, 0,114,114,111,119,100, 97,115,104,108,101,102,244, + 33,224,206, 38, 0, 0,114,114,111,119,100, 97,115,104,114,105, +103,104,244, 33,226,206, 57, 0, 0,114,114,111,119,100, 97,115, +104,117,240, 33,225,206, 73, 0, 0,114,114,111,119,100, 98,108, + 98,111,116,232, 33,212,206, 90, 0, 0,114,114,111,119,100, 98, +108,100,111,119,238, 33,211,206,107, 0, 0,114,114,111,119,100, + 98,108,108,101,102,244, 33,208,206,124, 0, 0,114,114,111,119, +100, 98,108,114,105,103,104,244, 33,210,206,142, 0, 0,114,114, +111,119,100, 98,108,117,240, 33,209,206,157, 0, 0,114,114,111, +119,100,111,119,238, 33,147,206,171,210, 87,114,114,111,119,104, +101, 97,100,100,111,119,110,109,111,228, 2,197,206,192, 0, 0, +114,114,111,119,104,101, 97,100,108,101,102,116,109,111,228, 2, +194,206,213, 0, 0,114,114,111,119,104,101, 97,100,114,105,103, +104,116,109,111,228, 2,195,206,235, 0, 0,114,114,111,119,104, +101, 97,100,117,112,109,111,228, 2,196,206,254, 0, 0,114,114, +111,119,104,111,114,105,122,101,248,248,231,207, 15, 0, 0,114, +114,111,119,108,101,102,244, 33,144,207, 29,210, 40,114,114,111, +119,114,105,103,104,244, 33,146,207, 44,209,245,114,114,111,119, +116, 97, 98,108,101,102,244, 33,228,207, 61, 0, 0,114,114,111, +119,116, 97, 98,114,105,103,104,244, 33,229,207, 79, 0, 0,114, +114,111,119,117,240, 33,145,207, 91,209,170,114,114,111,119,118, +101,114,116,101,248,248,230,207,107, 0, 0,115, 99,105,105, 99, +105,114, 99,117,237, 0, 94,207,123,209,155,115, 99,105,105,116, +105,108,100,229, 0,126,207,138,209,140,115, 99,114,105,112,244, + 2, 81,207,150,209,128,115,109, 97,108,108,104,105,114, 97,103, + 97,110,225, 48, 65,207,169, 0, 0,115,109, 97,108,108,107, 97, +116, 97,107, 97,110,225, 48,161,207,188,209,113,115,116,101,114, +105,115,235, 0, 42,207,201,209, 47,115,116,101,114,105,115,237, + 32, 66,207,214, 0, 0,115,117,112,101,114,105,111,242,246,233, +207,228, 0, 0,115,121,109,112,116,111,116,105, 99, 97,108,108, +121,101,113,117, 97,236, 34, 67,207,252, 0, 0,244, 0, 64,208, + 3,209, 0,117, 98,101,110,103, 97,108,233, 9,148,208, 17, 0, + 0,117, 98,111,112,111,109,111,102,239, 49, 32,208, 32, 0, 0, +117,100,101,118,225, 9, 20,208, 43, 0, 0,117,103,117,106, 97, +114, 97,116,233, 10,148,208, 58, 0, 0,117,103,117,114,109,117, +107,104,233, 10, 20,208, 73, 0, 0,117,108,101,110,103,116,104, +109, 97,114,107, 98,101,110,103, 97,108,233, 9,215,208, 97, 0, + 0,117,109, 97,116,114, 97,103,117,114,109,117,107,104,233, 10, + 76,208,117, 0, 0,117,118,111,119,101,108,115,105,103,110, 98, +101,110,103, 97,108,233, 9,204,208,140, 0, 0,117,118,111,119, +101,108,115,105,103,110,100,101,118,225, 9, 76,208,160, 0, 0, +117,118,111,119,101,108,115,105,103,110,103,117,106, 97,114, 97, +116,233, 10,204,208,184, 0, 0,118, 97,103,114, 97,104, 97,100, +101,118,225, 9, 61,208,201, 0, 0,121, 98, 97,114,109,101,110, +105, 97,238, 5, 97,208,217, 0, 0,121,105,238, 5,226, 0, 0, +208,226, 97,108,116,111,110,101,104,101, 98,114,101,247,251, 32, +208,244, 0, 0,104,101, 98,114,101,247, 5,226, 0, 0, 0, 0, +105,108,100,229, 0,227,209, 10, 0, 0,109,111,110,111,115,112, + 97, 99,229,255, 32,209, 25, 0, 0,115,109, 97,108,236,254,107, +209, 36, 0, 0,117,114,110,101,228, 2, 80, 0, 0, 0, 0, 97, +108,116,111,110,101, 97,114, 97, 98,105,227, 6,109,209, 65, 0, + 0, 97,114, 97, 98,105,227, 6,109,209, 77, 0, 0,109, 97,116, +232, 34, 23,209, 87, 0, 0,109,111,110,111,115,112, 97, 99,229, +255, 10,209,102, 0, 0,115,109, 97,108,236,254, 97, 0, 0, 0, + 0,104, 97,108,102,119,105,100,116,232,255,103, 0, 0, 0, 0, +116,117,114,110,101,228, 2, 82, 0, 0, 0, 0,109,111,110,111, +115,112, 97, 99,229,255, 94, 0, 0, 0, 0,109,111,110,111,115, +112, 97, 99,229,255, 62, 0, 0, 0, 0,100,238, 33,149,209,178, +209,236,100,111,119,110, 98, 97,115,229, 33,168,209,192, 0, 0, +108,101,102,244, 33,150,209,202,209,224,114,105,103,104,244, 33, +151,209,213, 0, 0,119,104,105,116,229, 33,231, 0, 0, 0, 0, +111,102,100,111,119,238, 33,197, 0, 0, 0, 0, 98,115,229, 33, +168, 0, 0, 0, 0,100, 98,108,115,116,114,111,107,229, 33,207, +210, 4, 0, 0,104,101, 97,118,249, 39,158,210, 15, 0, 0,111, +118,101,114,108,101,102,244, 33,196,210, 29, 0, 0,119,104,105, +116,229, 33,232, 0, 0, 0, 0,100, 98,236, 33,208,210, 49,210, + 75,111,118,101,114,114,105,103,104,244, 33,198,210, 64, 0, 0, +119,104,105,116,229, 33,230, 0, 0, 0, 0,115,116,114,111,107, +229, 33,205, 0, 0, 0, 0,108,101,102,244, 33,153,210, 97, 0, + 0,114,105,103,104,244, 33,152,210,108, 0, 0,119,104,105,116, +229, 33,233, 0, 0, 0, 0, 97, 99,117,116,229, 1,251,210,130, + 0, 0, 98,101,108,111,247, 30, 1, 0, 0, 0, 0,111,114,105, +109, 97,103,229, 34, 82, 0, 0, 0, 0, 98,114, 97, 99,107,101, +116,108,101,102,244, 48, 8,210,171,210,224, 98,114, 97, 99,107, +101,116,114,105,103,104,244, 48, 9,210,189,210,210,108,101,102, +244, 35, 41,210,199, 0, 0,114,105,103,104,244, 35, 42, 0, 0, + 0, 0,118,101,114,116,105, 99, 97,236,254, 64, 0, 0, 0, 0, +118,101,114,116,105, 99, 97,236,254, 63, 0, 0, 0, 0,109,111, +110,111,115,112, 97, 99,229,255, 6,210,253, 0, 0,115,109, 97, +108,236,247, 38, 0, 0, 0, 0,116,111,110,111,243, 3,172, 0, + 0, 0, 0, 97,114, 97, 98,105,227, 6, 39,211, 31, 0, 0,100, + 97,103,101,115,104,104,101, 98,114,101,247,251, 48,211, 49, 0, + 0,102,105,110, 97,108, 97,114, 97, 98,105,227,254,142,211, 66, + 0, 0,104, 97,109,122, 97, 97, 98,111,118,101, 97,114, 97, 98, +105,227, 6, 35,211, 88, 0, 0,104, 97,109,122, 97, 97, 98,111, +118,101,102,105,110, 97,108, 97,114, 97, 98,105,227,254,132,211, +115, 0, 0,104, 97,109,122, 97, 98,101,108,111,119, 97,114, 97, + 98,105,227, 6, 37,211,137, 0, 0,104, 97,109,122, 97, 98,101, +108,111,119,102,105,110, 97,108, 97,114, 97, 98,105,227,254,136, +211,164, 0, 0,104,101, 98,114,101,247, 5,208,211,176, 0, 0, +108, 97,109,101,100,104,101, 98,114,101,247,251, 79,211,193, 0, + 0,109, 97,100,100, 97, 97, 98,111,118,101, 97,114, 97, 98,105, +227, 6, 34,211,215, 0, 0,109, 97,100,100, 97, 97, 98,111,118, +101,102,105,110, 97,108, 97,114, 97, 98,105,227,254,130,211,242, + 0, 0,109, 97,107,115,117,114, 97, 97,114, 97, 98,105,227, 6, + 73,212, 5, 0, 0,109, 97,107,115,117,114, 97,102,105,110, 97, +108, 97,114, 97, 98,105,227,254,240,212, 29, 0, 0,109, 97,107, +115,117,114, 97,105,110,105,116,105, 97,108, 97,114, 97, 98,105, +227,254,243,212, 55, 0, 0,109, 97,107,115,117,114, 97,109,101, +100,105, 97,108, 97,114, 97, 98,105,227,254,244,212, 80, 0, 0, +112, 97,116, 97,104,104,101, 98,114,101,247,251, 46,212, 97, 0, + 0,113, 97,109, 97,116,115,104,101, 98,114,101,247,251, 47, 0, + 0, 0, 0,104, 97,108,102,119,105,100,116,232,255,113, 0, 0, + 0, 0, 97, 99,117,116,229, 1,253,212,141, 0, 0,107,111,114, +101, 97,238, 49, 80,212,153, 0, 0,109, 97, 99,114,111,238, 1, +227, 0, 0, 0, 0, 99,121,114,105,108,108,105,227, 4,211,212, +179, 0, 0,109, 97, 99,114,111,238, 1,223, 0, 0, 0, 0, 98, +101,108,111,119, 99,109,226, 3, 23,212,205, 0, 0, 99,109,226, + 3, 1,212,214, 0, 0, 99,111,109,226, 3, 1,212,224, 0, 0, +100,101,118,225, 9, 84,212,234, 0, 0,108,111,119,109,111,228, + 2,207,212,246, 0, 0,116,111,110,101, 99,109,226, 3, 65, 0, + 0, 0, 0, 97, 99,117,116,229, 30,165,213, 14, 0, 0,100,111, +116, 98,101,108,111,247, 30,173,213, 28, 0, 0,103,114, 97,118, +229, 30,167,213, 39, 0, 0,104,111,111,107, 97, 98,111,118,229, + 30,169,213, 54, 0, 0,116,105,108,100,229, 30,171, 0, 0, 0, + 0, 97, 99,117,116,229, 30,175,213, 76, 0, 0, 99,121,114,105, +108,108,105,227, 4,209,213, 90, 0, 0,100,111,116, 98,101,108, +111,247, 30,183,213,104, 0, 0,103,114, 97,118,229, 30,177,213, +115, 0, 0,104,111,111,107, 97, 98,111,118,229, 30,179,213,130, + 0, 0,116,105,108,100,229, 30,181, 0, 0, 0, 0, 97, 97,114, +109,101,110,105, 97,238, 5, 54,213,156, 0, 0, 97, 99,117,116, +229, 1,121,213,167, 0, 0, 99, 97,114,111,238, 1,125,213,178, +214,208, 99,105,114, 99,108,229, 36,207,213,190, 0, 0, 99,105, +114, 99,117,109,102,108,101,248, 30,144,213,206, 0, 0,100,111, +244, 1,123,213,215,214,185,101, 99,121,114,105,108,108,105,227, + 4, 23,213,230, 0, 0,101,100,101,115, 99,101,110,100,101,114, + 99,121,114,105,108,108,105,227, 4,152,213,254, 0, 0,101,100, +105,101,114,101,115,105,115, 99,121,114,105,108,108,105,227, 4, +222,214, 21, 0, 0,101,116,225, 3,150,214, 30, 0, 0,104,101, + 97,114,109,101,110,105, 97,238, 5, 58,214, 46, 0, 0,104,101, + 98,114,101,118,101, 99,121,114,105,108,108,105,227, 4,193,214, + 67, 0, 0,104,101, 99,121,114,105,108,108,105,227, 4, 22,214, + 83, 0, 0,104,101,100,101,115, 99,101,110,100,101,114, 99,121, +114,105,108,108,105,227, 4,150,214,108, 0, 0,104,101,100,105, +101,114,101,115,105,115, 99,121,114,105,108,108,105,227, 4,220, +214,132, 0, 0,108,105,110,101, 98,101,108,111,247, 30,148,214, +147, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 58,214,162, + 0, 0,115,109, 97,108,236,247,122,214,173, 0, 0,115,116,114, +111,107,229, 1,181, 0, 0, 0, 0, 97, 99, 99,101,110,244, 1, +123,214,197, 0, 0, 98,101,108,111,247, 30,146, 0, 0, 0, 0, +115,109, 97,108,236,246,255, 0, 0, 0, 0, 97, 99,117,116,229, + 0,221,214,230,216, 72, 97,116, 99,121,114,105,108,108,105,227, + 4, 98,214,246, 0, 0, 99,105,114, 99,108,229, 36,206,215, 2, + 0, 0, 99,105,114, 99,117,109,102,108,101,248, 1,118,215, 18, + 0, 0,100,105,101,114,101,115,105,243, 1,120,215, 32,216, 61, +100,111,116, 97, 99, 99,101,110,244, 30,142,215, 47, 0, 0,100, +111,116, 98,101,108,111,247, 30,244,215, 61, 0, 0,101,114,105, + 99,121,114,105,108,108,105,227, 4, 43,215, 78, 0, 0,101,114, +117,100,105,101,114,101,115,105,115, 99,121,114,105,108,108,105, +227, 4,248,215,103, 0, 0,103,114, 97,118,229, 30,242,215,114, + 0, 0,104,111,111,235, 1,179,215,124,216, 50,105, 97,114,109, +101,110,105, 97,238, 5, 69,215,139, 0, 0,105, 99,121,114,105, +108,108,105,227, 4, 7,215,154, 0, 0,105,119,110, 97,114,109, +101,110,105, 97,238, 5, 82,215,171, 0, 0,109,111,110,111,115, +112, 97, 99,229,255, 57,215,186, 0, 0,115,109, 97,108,236,247, +121,215,197, 0, 0,116,105,108,100,229, 30,248,215,208, 0, 0, +117,115, 98,105,103, 99,121,114,105,108,108,105,227, 4,106,215, +227, 0, 0,117,115, 98,105,103,105,111,116,105,102,105,101,100, + 99,121,114,105,108,108,105,227, 4,108,215,254, 0, 0,117,115, +108,105,116,116,108,101, 99,121,114,105,108,108,105,227, 4,102, +216, 20, 0, 0,117,115,108,105,116,116,108,101,105,111,116,105, +102,105,101,100, 99,121,114,105,108,108,105,227, 4,104, 0, 0, + 0, 0, 97, 98,111,118,229, 30,246, 0, 0, 0, 0,115,109, 97, +108,236,247,255, 0, 0, 0, 0,115,109, 97,108,236,247,253, 0, + 0, 0, 0, 99,105,114, 99,108,229, 36,205,216, 95, 0, 0,100, +105,101,114,101,115,105,243, 30,140,216,109, 0, 0,100,111,116, + 97, 99, 99,101,110,244, 30,138,216,124, 0, 0,101,104, 97,114, +109,101,110,105, 97,238, 5, 61,216,140, 0, 0,233, 3,158,216, +147, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 56,216,162, + 0, 0,115,109, 97,108,236,247,120, 0, 0, 0, 0, 97, 99,117, +116,229, 30,130,216,184, 0, 0, 99,105,114, 99,108,229, 36,204, +216,196, 0, 0, 99,105,114, 99,117,109,102,108,101,248, 1,116, +216,212, 0, 0,100,105,101,114,101,115,105,243, 30,132,216,226, + 0, 0,100,111,116, 97, 99, 99,101,110,244, 30,134,216,241, 0, + 0,100,111,116, 98,101,108,111,247, 30,136,216,255, 0, 0,103, +114, 97,118,229, 30,128,217, 10, 0, 0,109,111,110,111,115,112, + 97, 99,229,255, 55,217, 25, 0, 0,115,109, 97,108,236,247,119, + 0, 0, 0, 0, 99,105,114, 99,108,229, 36,203,217, 48, 0, 0, +100,111,116, 98,101,108,111,247, 30,126,217, 62, 0, 0,101, 99, +121,114,105,108,108,105,227, 4, 18,217, 77, 0, 0,101,119, 97, +114,109,101,110,105, 97,238, 5, 78,217, 93, 0, 0,104,111,111, +235, 1,178,217,103, 0, 0,109,111,110,111,115,112, 97, 99,229, +255, 54,217,118, 0, 0,111, 97,114,109,101,110,105, 97,238, 5, + 72,217,133, 0, 0,115,109, 97,108,236,247,118,217,144, 0, 0, +116,105,108,100,229, 30,124, 0, 0, 0, 0, 97, 99,117,116,229, + 0,218,217,166,220,106, 98,114,101,118,229, 1,108,217,177, 0, + 0, 99, 97,114,111,238, 1,211,217,188, 0, 0, 99,105,114, 99, +108,229, 36,202,217,200, 0, 0, 99,105,114, 99,117,109,102,108, +101,248, 0,219,217,216,220, 84, 99,121,114,105,108,108,105,227, + 4, 35,217,230, 0, 0,100, 98,108, 97, 99,117,116,229, 1,112, +217,244, 0, 0,100, 98,108,103,114, 97,118,229, 2, 20,218, 2, + 0, 0,100,105,101,114,101,115,105,243, 0,220,218, 16,220, 3, +100,111,116, 98,101,108,111,247, 30,228,218, 30, 0, 0,103,114, + 97,118,229, 0,217,218, 41,219,248,104,111,111,107, 97, 98,111, +118,229, 30,230,218, 56, 0, 0,104,111,114,238, 1,175,218, 66, +219,186,104,117,110,103, 97,114,117,109,108, 97,117,244, 1,112, +218, 84,219,172,105,110,118,101,114,116,101,100, 98,114,101,118, +229, 2, 22,218,103, 0, 0,107, 99,121,114,105,108,108,105,227, + 4,120,218,118, 0, 0,109, 97, 99,114,111,238, 1,106,218,130, +219,144,109,111,110,111,115,112, 97, 99,229,255, 53,218,145, 0, + 0,111,103,111,110,101,235, 1,114,218,157, 0, 0,112,115,105, +108,111,238, 3,165,218,169,219, 36,114,105,110,231, 1,110,218, +179, 0, 0,115,104,111,114,116, 99,121,114,105,108,108,105,227, + 4, 14,218,198, 0, 0,115,109, 97,108,236,247,117,218,209, 0, + 0,115,116,114, 97,105,103,104,116, 99,121,114,105,108,108,105, +227, 4,174,218,231, 0, 0,115,116,114, 97,105,103,104,116,115, +116,114,111,107,101, 99,121,114,105,108,108,105,227, 4,176,219, + 3, 0, 0,116,105,108,100,229, 1,104, 0, 0,219, 14, 97, 99, +117,116,229, 30,120,219, 25, 0, 0, 98,101,108,111,247, 30,116, + 0, 0, 0, 0,177, 3,210,219, 43, 0, 0, 97, 99,117,116,101, +104,111,111,107,115,121,109, 98,111,108,103,114,101,101,235, 3, +211,219, 69, 0, 0, 97,102,114,105, 99, 97,238, 1,177,219, 82, + 0, 0,100,105,101,114,101,115,105,243, 3,171,219, 96,219,123, +104,111,111,107,115,121,109, 98,111,236, 3,210,219,112, 0, 0, +116,111,110,111,243, 3,142, 0, 0, 0, 0,104,111,111,107,115, +121,109, 98,111,108,103,114,101,101,235, 3,212, 0, 0, 0, 0, + 99,121,114,105,108,108,105,227, 4,238,219,158, 0, 0,100,105, +101,114,101,115,105,243, 30,122, 0, 0, 0, 0, 99,121,114,105, +108,108,105,227, 4,242, 0, 0, 0, 0, 97, 99,117,116,229, 30, +232,219,197, 0, 0,100,111,116, 98,101,108,111,247, 30,240,219, +211, 0, 0,103,114, 97,118,229, 30,234,219,222, 0, 0,104,111, +111,107, 97, 98,111,118,229, 30,236,219,237, 0, 0,116,105,108, +100,229, 30,238, 0, 0, 0, 0,115,109, 97,108,236,247,249, 0, + 0, 0, 0, 97, 99,117,116,229, 1,215,220, 14, 0, 0, 98,101, +108,111,247, 30,114,220, 25, 0, 0, 99, 97,114,111,238, 1,217, +220, 36, 0, 0, 99,121,114,105,108,108,105,227, 4,240,220, 50, + 0, 0,103,114, 97,118,229, 1,219,220, 61, 0, 0,109, 97, 99, +114,111,238, 1,213,220, 73, 0, 0,115,109, 97,108,236,247,252, + 0, 0, 0, 0, 98,101,108,111,247, 30,118,220, 95, 0, 0,115, +109, 97,108,236,247,251, 0, 0, 0, 0,115,109, 97,108,236,247, +250, 0, 0, 0, 0, 97,245, 3,164,220,125, 0, 0, 98, 97,242, + 1,102,220,134, 0, 0, 99, 97,114,111,238, 1,100,220,145, 0, + 0, 99,101,100,105,108,108,225, 1, 98,220,158, 0, 0, 99,105, +114, 99,108,229, 36,201,220,170, 0, 0, 99,105,114, 99,117,109, +102,108,101,120, 98,101,108,111,247, 30,112,220,191, 0, 0, 99, +111,109,109, 97, 97, 99, 99,101,110,244, 1, 98,220,208, 0, 0, +100,111,116, 97, 99, 99,101,110,244, 30,106,220,223, 0, 0,100, +111,116, 98,101,108,111,247, 30,108,220,237, 0, 0,101, 99,121, +114,105,108,108,105,227, 4, 34,220,252, 0, 0,101,100,101,115, + 99,101,110,100,101,114, 99,121,114,105,108,108,105,227, 4,172, +221, 20, 0, 0,101,110,114,111,109, 97,238, 33,105,221, 33, 0, + 0,101,116,115,101, 99,121,114,105,108,108,105,227, 4,180,221, + 51, 0, 0,104,101,116,225, 3,152,221, 61, 0, 0,104,111,111, +235, 1,172,221, 71, 0, 0,104,111,114,238, 0,222,221, 81,222, + 46,104,114,101,101,114,111,109, 97,238, 33, 98,221, 96, 0, 0, +105,108,100,101,115,109, 97,108,236,246,254,221,111, 0, 0,105, +119,110, 97,114,109,101,110,105, 97,238, 5, 79,221,128, 0, 0, +108,105,110,101, 98,101,108,111,247, 30,110,221,143, 0, 0,109, +111,110,111,115,112, 97, 99,229,255, 52,221,158, 0, 0,111, 97, +114,109,101,110,105, 97,238, 5, 57,221,173, 0, 0,111,110,101, +102,105,118,229, 1,188,221,186, 0, 0,111,110,101,115,105,248, + 1,132,221,198, 0, 0,111,110,101,116,119,239, 1,167,221,210, + 0, 0,114,101,116,114,111,102,108,101,120,104,111,111,235, 1, +174,221,229, 0, 0,115,101, 99,121,114,105,108,108,105,227, 4, + 38,221,245, 0, 0,115,104,101, 99,121,114,105,108,108,105,227, + 4, 11,222, 6, 0, 0,115,109, 97,108,236,247,116,222, 17, 0, + 0,119,101,108,118,101,114,111,109, 97,238, 33,107,222, 33, 0, + 0,119,111,114,111,109, 97,238, 33, 97, 0, 0, 0, 0,115,109, + 97,108,236,247,254, 0, 0, 0, 0, 70, 48, 49, 48, 48, 48,176, + 37, 12,222, 70, 0, 0, 70, 48, 50, 48, 48, 48,176, 37, 20,222, + 83, 0, 0, 70, 48, 51, 48, 48, 48,176, 37, 16,222, 96, 0, 0, + 70, 48, 52, 48, 48, 48,176, 37, 24,222,109, 0, 0, 70, 48, 53, + 48, 48, 48,176, 37, 60,222,122, 0, 0, 70, 48, 54, 48, 48, 48, +176, 37, 44,222,135, 0, 0, 70, 48, 55, 48, 48, 48,176, 37, 52, +222,148, 0, 0, 70, 48, 56, 48, 48, 48,176, 37, 28,222,161, 0, + 0, 70, 48, 57, 48, 48, 48,176, 37, 36,222,174, 0, 0, 70, 49, + 48, 48, 48, 48,176, 37, 0,222,187, 0, 0, 70, 49, 49, 48, 48, + 48,176, 37, 2,222,200, 0, 0, 70, 49, 57, 48, 48, 48,176, 37, + 97,222,213, 0, 0, 70, 50, 48, 48, 48, 48,176, 37, 98,222,226, + 0, 0, 70, 50, 49, 48, 48, 48,176, 37, 86,222,239, 0, 0, 70, + 50, 50, 48, 48, 48,176, 37, 85,222,252, 0, 0, 70, 50, 51, 48, + 48, 48,176, 37, 99,223, 9, 0, 0, 70, 50, 52, 48, 48, 48,176, + 37, 81,223, 22, 0, 0, 70, 50, 53, 48, 48, 48,176, 37, 87,223, + 35, 0, 0, 70, 50, 54, 48, 48, 48,176, 37, 93,223, 48, 0, 0, + 70, 50, 55, 48, 48, 48,176, 37, 92,223, 61, 0, 0, 70, 50, 56, + 48, 48, 48,176, 37, 91,223, 74, 0, 0, 70, 51, 54, 48, 48, 48, +176, 37, 94,223, 87, 0, 0, 70, 51, 55, 48, 48, 48,176, 37, 95, +223,100, 0, 0, 70, 51, 56, 48, 48, 48,176, 37, 90,223,113, 0, + 0, 70, 51, 57, 48, 48, 48,176, 37, 84,223,126, 0, 0, 70, 52, + 48, 48, 48, 48,176, 37,105,223,139, 0, 0, 70, 52, 49, 48, 48, + 48,176, 37,102,223,152, 0, 0, 70, 52, 50, 48, 48, 48,176, 37, + 96,223,165, 0, 0, 70, 52, 51, 48, 48, 48,176, 37, 80,223,178, + 0, 0, 70, 52, 52, 48, 48, 48,176, 37,108,223,191, 0, 0, 70, + 52, 53, 48, 48, 48,176, 37,103,223,204, 0, 0, 70, 52, 54, 48, + 48, 48,176, 37,104,223,217, 0, 0, 70, 52, 55, 48, 48, 48,176, + 37,100,223,230, 0, 0, 70, 52, 56, 48, 48, 48,176, 37,101,223, +243, 0, 0, 70, 52, 57, 48, 48, 48,176, 37, 89,224, 0, 0, 0, + 70, 53, 48, 48, 48, 48,176, 37, 88,224, 13, 0, 0, 70, 53, 49, + 48, 48, 48,176, 37, 82,224, 26, 0, 0, 70, 53, 50, 48, 48, 48, +176, 37, 83,224, 39, 0, 0, 70, 53, 51, 48, 48, 48,176, 37,107, +224, 52, 0, 0, 70, 53, 52, 48, 48, 48,176, 37,106,224, 65, 0, + 0, 97, 99,117,116,229, 1, 90,224, 76,225,235, 97,109,112,105, +103,114,101,101,235, 3,224,224, 91, 0, 0, 99, 97,114,111,238, + 1, 96,224,102,225,209, 99,101,100,105,108,108,225, 1, 94,224, +115, 0, 0, 99,104,119,225, 1,143,224,125,225,173, 99,105,114, + 99,108,229, 36,200,224,137, 0, 0, 99,105,114, 99,117,109,102, +108,101,248, 1, 92,224,153, 0, 0, 99,111,109,109, 97, 97, 99, + 99,101,110,244, 2, 24,224,170, 0, 0,100,111,116, 97, 99, 99, +101,110,244, 30, 96,224,185, 0, 0,100,111,116, 98,101,108,111, +247, 30, 98,224,199,225,158,101,104, 97,114,109,101,110,105, 97, +238, 5, 77,224,215, 0, 0,101,118,101,110,114,111,109, 97,238, + 33,102,224,230, 0, 0,104, 97, 97,114,109,101,110,105, 97,238, + 5, 71,224,246, 0, 0,104, 97, 99,121,114,105,108,108,105,227, + 4, 40,225, 6, 0, 0,104, 99,104, 97, 99,121,114,105,108,108, +105,227, 4, 41,225, 24, 0, 0,104,101,105, 99,111,112,116,105, +227, 3,226,225, 39, 0, 0,104,104, 97, 99,121,114,105,108,108, +105,227, 4,186,225, 56, 0, 0,104,105,109, 97, 99,111,112,116, +105,227, 3,236,225, 72, 0, 0,105,103,109,225, 3,163,225, 82, + 0, 0,105,120,114,111,109, 97,238, 33,101,225, 95, 0, 0,109, +111,110,111,115,112, 97, 99,229,255, 51,225,110, 0, 0,111,102, +116,115,105,103,110, 99,121,114,105,108,108,105,227, 4, 44,225, +131, 0, 0,115,109, 97,108,236,247,115,225,142, 0, 0,116,105, +103,109, 97,103,114,101,101,235, 3,218, 0, 0, 0, 0,100,111, +116, 97, 99, 99,101,110,244, 30,104, 0, 0, 0, 0, 99,121,114, +105,108,108,105,227, 4,216,225,187, 0, 0,100,105,101,114,101, +115,105,115, 99,121,114,105,108,108,105,227, 4,218, 0, 0, 0, + 0,100,111,116, 97, 99, 99,101,110,244, 30,102,225,224, 0, 0, +115,109, 97,108,236,246,253, 0, 0, 0, 0,100,111,116, 97, 99, + 99,101,110,244, 30,100, 0, 0, 0, 0, 97, 97,114,109,101,110, +105, 97,238, 5, 76,226, 9, 0, 0, 97, 99,117,116,229, 1, 84, +226, 20, 0, 0, 99, 97,114,111,238, 1, 88,226, 31, 0, 0, 99, +101,100,105,108,108,225, 1, 86,226, 44, 0, 0, 99,105,114, 99, +108,229, 36,199,226, 56, 0, 0, 99,111,109,109, 97, 97, 99, 99, +101,110,244, 1, 86,226, 73, 0, 0,100, 98,108,103,114, 97,118, +229, 2, 16,226, 87, 0, 0,100,111,116, 97, 99, 99,101,110,244, + 30, 88,226,102, 0, 0,100,111,116, 98,101,108,111,247, 30, 90, +226,116,226,255,101,104, 97,114,109,101,110,105, 97,238, 5, 80, +226,132, 0, 0,102,114, 97,107,116,117,242, 33, 28,226,145, 0, + 0,104,239, 3,161,226,153, 0, 0,105,110,103,115,109, 97,108, +236,246,252,226,167, 0, 0,105,110,118,101,114,116,101,100, 98, +114,101,118,229, 2, 18,226,186, 0, 0,108,105,110,101, 98,101, +108,111,247, 30, 94,226,201, 0, 0,109,111,110,111,115,112, 97, + 99,229,255, 50,226,216, 0, 0,115,109, 97,108,236,247,114, 0, + 0,226,227,105,110,118,101,114,116,101,228, 2,129, 0, 0,226, +241,115,117,112,101,114,105,111,242, 2,182, 0, 0, 0, 0,109, + 97, 99,114,111,238, 30, 92, 0, 0, 0, 0, 99,105,114, 99,108, +229, 36,198,227, 23, 0, 0,109,111,110,111,115,112, 97, 99,229, +255, 49,227, 38, 0, 0,115,109, 97,108,236,247,113, 0, 0, 0, + 0, 97, 99,117,116,229, 30, 84,227, 60, 0, 0, 99,105,114, 99, +108,229, 36,197,227, 72, 0, 0,100,111,116, 97, 99, 99,101,110, +244, 30, 86,227, 87, 0, 0,101, 99,121,114,105,108,108,105,227, + 4, 31,227,102, 0, 0,101,104, 97,114,109,101,110,105, 97,238, + 5, 74,227,118, 0, 0,101,109,105,100,100,108,101,104,111,111, +107, 99,121,114,105,108,108,105,227, 4,166,227,143, 0, 0,104, +233, 3,166,227,151, 0, 0,104,111,111,235, 1,164,227,161, 0, + 0,233, 3,160,227,168,227,216,109,111,110,111,115,112, 97, 99, +229,255, 48,227,183, 0, 0,115,233, 3,168,227,191,227,202,115, +109, 97,108,236,247,112, 0, 0, 0, 0, 99,121,114,105,108,108, +105,227, 4,112, 0, 0, 0, 0,119,114, 97,114,109,101,110,105, + 97,238, 5, 83, 0, 0, 0, 0,197, 1, 82,227,239,231, 39, 97, + 99,117,116,229, 0,211,227,250,231, 28, 98, 97,114,114,101,100, + 99,121,114,105,108,108,105,227, 4,232,228, 14, 0, 0, 98, 97, +114,114,101,100,100,105,101,114,101,115,105,115, 99,121,114,105, +108,108,105,227, 4,234,228, 42, 0, 0, 98,114,101,118,229, 1, + 78,228, 53, 0, 0, 99, 97,114,111,238, 1,209,228, 64, 0, 0, + 99,101,110,116,101,114,101,100,116,105,108,100,229, 1,159,228, + 83, 0, 0, 99,105,114, 99,108,229, 36,196,228, 95, 0, 0, 99, +105,114, 99,117,109,102,108,101,248, 0,212,228,111,230,211, 99, +121,114,105,108,108,105,227, 4, 30,228,125, 0, 0,100, 98,108, + 97, 99,117,116,229, 1, 80,228,139, 0, 0,100, 98,108,103,114, + 97,118,229, 2, 12,228,153, 0, 0,100,105,101,114,101,115,105, +243, 0,214,228,167,230,186,100,111,116, 98,101,108,111,247, 30, +204,228,181, 0, 0,103,111,110,101,107,115,109, 97,108,236,246, +251,228,197, 0, 0,103,114, 97,118,229, 0,210,228,208,230,175, +104, 97,114,109,101,110,105, 97,238, 5, 85,228,223, 0, 0,104, +237, 33, 38,228,231, 0, 0,104,111,111,107, 97, 98,111,118,229, + 30,206,228,246, 0, 0,104,111,114,238, 1,160,229, 0,230,113, +104,117,110,103, 97,114,117,109,108, 97,117,244, 1, 80,229, 18, + 0, 0,233, 1,162,229, 25,230, 95,109, 97, 99,114,111,238, 1, + 76,229, 37,230, 73,109,101,103,225, 33, 38,229, 47,229,255,109, +105, 99,114,111,238, 3,159,229, 59,229,244,109,111,110,111,115, +112, 97, 99,229,255, 47,229, 74, 0, 0,110,101,114,111,109, 97, +238, 33, 96,229, 87, 0, 0,111,103,111,110,101,235, 1,234,229, + 99,229,232,111,112,101,238, 1,134,229,109, 0, 0,115,108, 97, +115,232, 0,216,229,120,229,210,115,109, 97,108,236,247,111,229, +131, 0, 0,115,116,114,111,107,101, 97, 99,117,116,229, 1,254, +229,148, 0, 0,116, 99,121,114,105,108,108,105,227, 4,126,229, +163, 0, 0,116,105,108,100,229, 0,213, 0, 0,229,174, 97, 99, +117,116,229, 30, 76,229,185, 0, 0,100,105,101,114,101,115,105, +243, 30, 78,229,199, 0, 0,115,109, 97,108,236,247,245, 0, 0, + 0, 0, 97, 99,117,116,229, 1,254,229,221, 0, 0,115,109, 97, +108,236,247,248, 0, 0, 0, 0,109, 97, 99,114,111,238, 1,236, + 0, 0, 0, 0,116,111,110,111,243, 3,140, 0, 0, 0, 0, 99, +121,114,105,108,108,105,227, 4, 96,230, 13, 0, 0,103,114,101, +101,235, 3,169,230, 24, 0, 0,114,111,117,110,100, 99,121,114, +105,108,108,105,227, 4,122,230, 43, 0, 0,116,105,116,108,111, + 99,121,114,105,108,108,105,227, 4,124,230, 62, 0, 0,116,111, +110,111,243, 3,143, 0, 0, 0, 0, 97, 99,117,116,229, 30, 82, +230, 84, 0, 0,103,114, 97,118,229, 30, 80, 0, 0, 0, 0,110, +118,101,114,116,101,100, 98,114,101,118,229, 2, 14, 0, 0, 0, + 0, 97, 99,117,116,229, 30,218,230,124, 0, 0,100,111,116, 98, +101,108,111,247, 30,226,230,138, 0, 0,103,114, 97,118,229, 30, +220,230,149, 0, 0,104,111,111,107, 97, 98,111,118,229, 30,222, +230,164, 0, 0,116,105,108,100,229, 30,224, 0, 0, 0, 0,115, +109, 97,108,236,247,242, 0, 0, 0, 0, 99,121,114,105,108,108, +105,227, 4,230,230,200, 0, 0,115,109, 97,108,236,247,246, 0, + 0, 0, 0, 97, 99,117,116,229, 30,208,230,222, 0, 0,100,111, +116, 98,101,108,111,247, 30,216,230,236, 0, 0,103,114, 97,118, +229, 30,210,230,247, 0, 0,104,111,111,107, 97, 98,111,118,229, + 30,212,231, 6, 0, 0,115,109, 97,108,236,247,244,231, 17, 0, + 0,116,105,108,100,229, 30,214, 0, 0, 0, 0,115,109, 97,108, +236,247,243, 0, 0, 0, 0,115,109, 97,108,236,246,250, 0, 0, + 0, 0,202, 1,202,231, 57, 0, 0, 97, 99,117,116,229, 1, 67, +231, 68, 0, 0, 99, 97,114,111,238, 1, 71,231, 79, 0, 0, 99, +101,100,105,108,108,225, 1, 69,231, 92, 0, 0, 99,105,114, 99, +108,229, 36,195,231,104, 0, 0, 99,105,114, 99,117,109,102,108, +101,120, 98,101,108,111,247, 30, 74,231,125, 0, 0, 99,111,109, +109, 97, 97, 99, 99,101,110,244, 1, 69,231,142, 0, 0,100,111, +116, 97, 99, 99,101,110,244, 30, 68,231,157, 0, 0,100,111,116, + 98,101,108,111,247, 30, 70,231,171, 0, 0,104,111,111,107,108, +101,102,244, 1,157,231,185, 0, 0,105,110,101,114,111,109, 97, +238, 33,104,231,199, 0, 0,234, 1,203,231,206,232, 36,108,105, +110,101, 98,101,108,111,247, 30, 72,231,221, 0, 0,109,111,110, +111,115,112, 97, 99,229,255, 46,231,236, 0, 0,111,119, 97,114, +109,101,110,105, 97,238, 5, 70,231,252, 0, 0,115,109, 97,108, +236,247,110,232, 7, 0, 0,116,105,108,100,229, 0,209,232, 18, +232, 25,245, 3,157, 0, 0, 0, 0,115,109, 97,108,236,247,241, + 0, 0, 0, 0,101, 99,121,114,105,108,108,105,227, 4, 10, 0, + 0, 0, 0, 66,115,113,117, 97,114,229, 51,134,232, 64, 0, 0, + 97, 99,114,111,238,246,208,232, 75,232,188, 97, 99,117,116,229, + 30, 62,232, 86, 0, 0, 99,105,114, 99,108,229, 36,194,232, 98, + 0, 0,100,111,116, 97, 99, 99,101,110,244, 30, 64,232,113, 0, + 0,100,111,116, 98,101,108,111,247, 30, 66,232,127, 0, 0,101, +110, 97,114,109,101,110,105, 97,238, 5, 68,232,143, 0, 0,109, +111,110,111,115,112, 97, 99,229,255, 45,232,158, 0, 0,115,109, + 97,108,236,247,109,232,169, 0, 0,116,117,114,110,101,228, 1, +156,232,181, 0, 0,245, 3,156, 0, 0, 0, 0,115,109, 97,108, +236,247,175, 0, 0, 0, 0,202, 1,199,232,206, 0, 0,204,246, +191,232,213, 0, 0, 97, 99,117,116,229, 1, 57,232,224, 0, 0, + 97,109, 98,100,225, 3,155,232,235, 0, 0, 99, 97,114,111,238, + 1, 61,232,246, 0, 0, 99,101,100,105,108,108,225, 1, 59,233, + 3, 0, 0, 99,105,114, 99,108,229, 36,193,233, 15, 0, 0, 99, +105,114, 99,117,109,102,108,101,120, 98,101,108,111,247, 30, 60, +233, 36, 0, 0, 99,111,109,109, 97, 97, 99, 99,101,110,244, 1, + 59,233, 53, 0, 0,100,111,244, 1, 63,233, 62,233,164,105,119, +110, 97,114,109,101,110,105, 97,238, 5, 60,233, 79, 0, 0,234, + 1,200,233, 86,233,149,108,105,110,101, 98,101,108,111,247, 30, + 58,233,101, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 44, +233,116, 0, 0,115,108, 97,115,232, 1, 65,233,127,233,138,115, +109, 97,108,236,247,108, 0, 0, 0, 0,115,109, 97,108,236,246, +249, 0, 0, 0, 0,101, 99,121,114,105,108,108,105,227, 4, 9, + 0, 0, 0, 0, 97, 99, 99,101,110,244, 1, 63,233,176, 0, 0, + 98,101,108,111,247, 30, 54, 0, 0,233,187,109, 97, 99,114,111, +238, 30, 56, 0, 0, 0, 0, 66,115,113,117, 97,114,229, 51,133, +233,212, 0, 0, 75,115,113,117, 97,114,229, 51,205,233,225, 0, + 0, 97, 98, 97,115,104,107,105,114, 99,121,114,105,108,108,105, +227, 4,160,233,247, 0, 0, 97, 99,117,116,229, 30, 48,234, 2, + 0, 0, 97, 99,121,114,105,108,108,105,227, 4, 26,234, 17, 0, + 0, 97,100,101,115, 99,101,110,100,101,114, 99,121,114,105,108, +108,105,227, 4,154,234, 41, 0, 0, 97,104,111,111,107, 99,121, +114,105,108,108,105,227, 4,195,234, 60, 0, 0, 97,112,112,225, + 3,154,234, 70, 0, 0, 97,115,116,114,111,107,101, 99,121,114, +105,108,108,105,227, 4,158,234, 91, 0, 0, 97,118,101,114,116, +105, 99, 97,108,115,116,114,111,107,101, 99,121,114,105,108,108, +105,227, 4,156,234,120, 0, 0, 99, 97,114,111,238, 1,232,234, +131, 0, 0, 99,101,100,105,108,108,225, 1, 54,234,144, 0, 0, + 99,105,114, 99,108,229, 36,192,234,156, 0, 0, 99,111,109,109, + 97, 97, 99, 99,101,110,244, 1, 54,234,173, 0, 0,100,111,116, + 98,101,108,111,247, 30, 50,234,187, 0, 0,101,104, 97,114,109, +101,110,105, 97,238, 5, 84,234,203, 0, 0,101,110, 97,114,109, +101,110,105, 97,238, 5, 63,234,219, 0, 0,104, 97, 99,121,114, +105,108,108,105,227, 4, 37,234,235, 0, 0,104,101,105, 99,111, +112,116,105,227, 3,230,234,250, 0, 0,104,111,111,235, 1,152, +235, 4, 0, 0,106,101, 99,121,114,105,108,108,105,227, 4, 12, +235, 20, 0, 0,108,105,110,101, 98,101,108,111,247, 30, 52,235, + 35, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 43,235, 50, + 0, 0,111,112,112, 97, 99,121,114,105,108,108,105,227, 4,128, +235, 68, 0, 0,111,112,112, 97,103,114,101,101,235, 3,222,235, + 83, 0, 0,115,105, 99,121,114,105,108,108,105,227, 4,110,235, + 99, 0, 0,115,109, 97,108,236,247,107, 0, 0, 0, 0, 97, 97, +114,109,101,110,105, 97,238, 5, 65,235,125, 0, 0, 99,105,114, + 99,108,229, 36,191,235,137, 0, 0, 99,105,114, 99,117,109,102, +108,101,248, 1, 52,235,153, 0, 0,101, 99,121,114,105,108,108, +105,227, 4, 8,235,168, 0, 0,104,101,104, 97,114,109,101,110, +105, 97,238, 5, 75,235,185, 0, 0,109,111,110,111,115,112, 97, + 99,229,255, 42,235,200, 0, 0,115,109, 97,108,236,247,106, 0, + 0, 0, 0, 65, 99,121,114,105,108,108,105,227, 4, 47,235,226, + 0, 0,202, 1, 50,235,233, 0, 0, 85, 99,121,114,105,108,108, +105,227, 4, 46,235,248, 0, 0, 97, 99,117,116,229, 0,205,236, + 3,238, 25, 98,114,101,118,229, 1, 44,236, 14, 0, 0, 99, 97, +114,111,238, 1,207,236, 25, 0, 0, 99,105,114, 99,108,229, 36, +190,236, 37, 0, 0, 99,105,114, 99,117,109,102,108,101,248, 0, +206,236, 53,238, 14, 99,121,114,105,108,108,105,227, 4, 6,236, + 67, 0, 0,100, 98,108,103,114, 97,118,229, 2, 8,236, 81, 0, + 0,100,105,101,114,101,115,105,243, 0,207,236, 95,237,234,100, +111,244, 1, 48,236,104,237,211,101, 98,114,101,118,101, 99,121, +114,105,108,108,105,227, 4,214,236,124, 0, 0,101, 99,121,114, +105,108,108,105,227, 4, 21,236,139, 0, 0,102,114, 97,107,116, +117,242, 33, 17,236,152, 0, 0,103,114, 97,118,229, 0,204,236, +163,237,200,104,111,111,107, 97, 98,111,118,229, 30,200,236,178, + 0, 0,105, 99,121,114,105,108,108,105,227, 4, 24,236,193, 0, + 0,105,110,118,101,114,116,101,100, 98,114,101,118,229, 2, 10, +236,212, 0, 0,105,115,104,111,114,116, 99,121,114,105,108,108, +105,227, 4, 25,236,232, 0, 0,109, 97, 99,114,111,238, 1, 42, +236,244,237,186,109,111,110,111,115,112, 97, 99,229,255, 41,237, + 3, 0, 0,110,105, 97,114,109,101,110,105, 97,238, 5, 59,237, + 19, 0, 0,111, 99,121,114,105,108,108,105,227, 4, 1,237, 34, + 0, 0,111,103,111,110,101,235, 1, 46,237, 46, 0, 0,111,116, +225, 3,153,237, 55,237,148,115,109, 97,108,236,247,105,237, 66, + 0, 0,115,116,114,111,107,229, 1,151,237, 78, 0, 0,116,105, +108,100,229, 1, 40,237, 89,237,137,122,104,105,116,115, 97, 99, +121,114,105,108,108,105,227, 4,116,237,109, 0, 0,122,104,105, +116,115, 97,100, 98,108,103,114, 97,118,101, 99,121,114,105,108, +108,105,227, 4,118, 0, 0, 0, 0, 98,101,108,111,247, 30, 44, + 0, 0, 0, 0, 97,102,114,105, 99, 97,238, 1,150,237,161, 0, + 0,100,105,101,114,101,115,105,243, 3,170,237,175, 0, 0,116, +111,110,111,243, 3,138, 0, 0, 0, 0, 99,121,114,105,108,108, +105,227, 4,226, 0, 0, 0, 0,115,109, 97,108,236,247,236, 0, + 0, 0, 0, 97, 99, 99,101,110,244, 1, 48,237,223, 0, 0, 98, +101,108,111,247, 30,202, 0, 0, 0, 0, 97, 99,117,116,229, 30, + 46,237,245, 0, 0, 99,121,114,105,108,108,105,227, 4,228,238, + 3, 0, 0,115,109, 97,108,236,247,239, 0, 0, 0, 0,115,109, + 97,108,236,247,238, 0, 0, 0, 0,115,109, 97,108,236,247,237, + 0, 0, 0, 0, 49, 56, 53, 51,179, 37,207,238, 47, 0, 0, 49, + 56, 53, 52,179, 37,170,238, 58, 0, 0, 49, 56, 53, 53,177, 37, +171,238, 69, 0, 0, 50, 50, 48, 55,179, 37,161,238, 80, 0, 0, + 80,115,113,117, 97,114,229, 51,203,238, 93, 0, 0, 97, 97, 98, +107,104, 97,115,105, 97,110, 99,121,114,105,108,108,105,227, 4, +168,238,117, 0, 0, 97,100,101,115, 99,101,110,100,101,114, 99, +121,114,105,108,108,105,227, 4,178,238,141, 0, 0, 97,114,100, +115,105,103,110, 99,121,114,105,108,108,105,227, 4, 42,238,162, + 0, 0, 98, 97,242, 1, 38,238,171, 0, 0, 98,114,101,118,101, + 98,101,108,111,247, 30, 42,238,187, 0, 0, 99,101,100,105,108, +108,225, 30, 40,238,200, 0, 0, 99,105,114, 99,108,229, 36,189, +238,212, 0, 0, 99,105,114, 99,117,109,102,108,101,248, 1, 36, +238,228, 0, 0,100,105,101,114,101,115,105,243, 30, 38,238,242, + 0, 0,100,111,116, 97, 99, 99,101,110,244, 30, 34,239, 1, 0, + 0,100,111,116, 98,101,108,111,247, 30, 36,239, 15, 0, 0,109, +111,110,111,115,112, 97, 99,229,255, 40,239, 30, 0, 0,111, 97, +114,109,101,110,105, 97,238, 5, 64,239, 45, 0, 0,111,114,105, + 99,111,112,116,105,227, 3,232,239, 60, 0, 0,115,109, 97,108, +236,247,104,239, 71, 0, 0,117,110,103, 97,114,117,109,108, 97, +117,244,246,207,239, 88,239,101,122,115,113,117, 97,114,229, 51, +144, 0, 0, 0, 0,115,109, 97,108,236,246,248, 0, 0, 0, 0, + 66,115,113,117, 97,114,229, 51,135,239,125, 0, 0, 97, 99,117, +116,229, 1,244,239,136, 0, 0, 97,109,109,225, 3,147,239,146, +240,233, 97,110,103,105, 97, 99,111,112,116,105,227, 3,234,239, +163, 0, 0, 98,114,101,118,229, 1, 30,239,174, 0, 0, 99, 97, +114,111,238, 1,230,239,185, 0, 0, 99,101,100,105,108,108,225, + 1, 34,239,198, 0, 0, 99,105,114, 99,108,229, 36,188,239,210, + 0, 0, 99,105,114, 99,117,109,102,108,101,248, 1, 28,239,226, + 0, 0, 99,111,109,109, 97, 97, 99, 99,101,110,244, 1, 34,239, +243, 0, 0,100,111,244, 1, 32,239,252,240,221,101, 99,121,114, +105,108,108,105,227, 4, 19,240, 11, 0, 0,104, 97,100, 97,114, +109,101,110,105, 97,238, 5, 66,240, 28, 0, 0,104,101,109,105, +100,100,108,101,104,111,111,107, 99,121,114,105,108,108,105,227, + 4,148,240, 54, 0, 0,104,101,115,116,114,111,107,101, 99,121, +114,105,108,108,105,227, 4,146,240, 76, 0, 0,104,101,117,112, +116,117,114,110, 99,121,114,105,108,108,105,227, 4,144,240, 98, + 0, 0,104,111,111,235, 1,147,240,108, 0, 0,105,109, 97,114, +109,101,110,105, 97,238, 5, 51,240,124, 0, 0,106,101, 99,121, +114,105,108,108,105,227, 4, 3,240,140, 0, 0,109, 97, 99,114, +111,238, 30, 32,240,152, 0, 0,109,111,110,111,115,112, 97, 99, +229,255, 39,240,167, 0, 0,114, 97,118,229,246,206,240,177,240, +210,115,109, 97,108,236,247,103,240,188,240,200,115,116,114,111, +107,229, 1,228, 0, 0, 0, 0,104,111,111,235, 2,155, 0, 0, + 0, 0,115,109, 97,108,236,247, 96, 0, 0, 0, 0, 97, 99, 99, +101,110,244, 1, 32, 0, 0, 0, 0, 97,102,114,105, 99, 97,238, + 1,148, 0, 0, 0, 0, 99,105,114, 99,108,229, 36,187,241, 2, + 0, 0,100,111,116, 97, 99, 99,101,110,244, 30, 30,241, 17, 0, + 0,101,104, 97,114,109,101,110,105, 97,238, 5, 86,241, 33, 0, + 0,101,105, 99,111,112,116,105,227, 3,228,241, 47, 0, 0,104, +111,111,235, 1,145,241, 57, 0, 0,105,116, 97, 99,121,114,105, +108,108,105,227, 4,114,241, 74, 0, 0,105,118,101,114,111,109, + 97,238, 33,100,241, 88, 0, 0,109,111,110,111,115,112, 97, 99, +229,255, 38,241,103, 0, 0,111,117,114,114,111,109, 97,238, 33, + 99,241,117, 0, 0,115,109, 97,108,236,247,102, 0, 0, 0, 0, + 97, 99,117,116,229, 0,201,241,139,244,185, 98,114,101,118,229, + 1, 20,241,150, 0, 0, 99, 97,114,111,238, 1, 26,241,161, 0, + 0, 99,101,100,105,108,108, 97, 98,114,101,118,229, 30, 28,241, +179, 0, 0, 99,104, 97,114,109,101,110,105, 97,238, 5, 53,241, +195, 0, 0, 99,105,114, 99,108,229, 36,186,241,207, 0, 0, 99, +105,114, 99,117,109,102,108,101,248, 0,202,241,223,244,101, 99, +121,114,105,108,108,105,227, 4, 4,241,237, 0, 0,100, 98,108, +103,114, 97,118,229, 2, 4,241,251, 0, 0,100,105,101,114,101, +115,105,243, 0,203,242, 9,244, 90,100,111,244, 1, 22,242, 18, +244, 67,102, 99,121,114,105,108,108,105,227, 4, 36,242, 33, 0, + 0,103,114, 97,118,229, 0,200,242, 44,244, 56,104, 97,114,109, +101,110,105, 97,238, 5, 55,242, 59, 0, 0,104,111,111,107, 97, + 98,111,118,229, 30,186,242, 74, 0, 0,105,103,104,116,114,111, +109, 97,238, 33,103,242, 89, 0, 0,105,110,118,101,114,116,101, +100, 98,114,101,118,229, 2, 6,242,108, 0, 0,105,111,116,105, +102,105,101,100, 99,121,114,105,108,108,105,227, 4,100,242,130, + 0, 0,108, 99,121,114,105,108,108,105,227, 4, 27,242,145, 0, + 0,108,101,118,101,110,114,111,109, 97,238, 33,106,242,161, 0, + 0,109, 97, 99,114,111,238, 1, 18,242,173,244, 34,109, 99,121, +114,105,108,108,105,227, 4, 28,242,188, 0, 0,109,111,110,111, +115,112, 97, 99,229,255, 37,242,203, 0, 0,110, 99,121,114,105, +108,108,105,227, 4, 29,242,218, 0, 0,110,100,101,115, 99,101, +110,100,101,114, 99,121,114,105,108,108,105,227, 4,162,242,242, + 0, 0,110,231, 1, 74,242,250,244, 18,110,104,111,111,107, 99, +121,114,105,108,108,105,227, 4,199,243, 13, 0, 0,111,103,111, +110,101,235, 1, 24,243, 25, 0, 0,111,112,101,238, 1,144,243, + 35, 0, 0,112,115,105,108,111,238, 3,149,243, 47,244, 7,114, + 99,121,114,105,108,108,105,227, 4, 32,243, 62, 0, 0,114,101, +118,101,114,115,101,228, 1,142,243, 76,243,249,115, 99,121,114, +105,108,108,105,227, 4, 33,243, 91, 0, 0,115,100,101,115, 99, +101,110,100,101,114, 99,121,114,105,108,108,105,227, 4,170,243, +115, 0, 0,115,232, 1,169,243,123, 0, 0,115,109, 97,108,236, +247,101,243,134, 0, 0,116,225, 3,151,243,142,243,225,116,232, + 0,208,243,150,243,214,116,105,108,100,229, 30,188,243,161,243, +203,117,114,239, 32,172,243,170, 0, 0,122,232, 1,183, 0, 0, +243,178, 99, 97,114,111,238, 1,238,243,189, 0, 0,114,101,118, +101,114,115,101,228, 1,184, 0, 0, 0, 0, 98,101,108,111,247, + 30, 26, 0, 0, 0, 0,115,109, 97,108,236,247,240, 0, 0, 0, + 0,114,109,101,110,105, 97,238, 5, 56,243,238, 0, 0,116,111, +110,111,243, 3,137, 0, 0, 0, 0, 99,121,114,105,108,108,105, +227, 4, 45, 0, 0, 0, 0,116,111,110,111,243, 3,136, 0, 0, + 0, 0,104,101, 99,121,114,105,108,108,105,227, 4,164, 0, 0, + 0, 0, 97, 99,117,116,229, 30, 22,244, 45, 0, 0,103,114, 97, +118,229, 30, 20, 0, 0, 0, 0,115,109, 97,108,236,247,232, 0, + 0, 0, 0, 97, 99, 99,101,110,244, 1, 22,244, 79, 0, 0, 98, +101,108,111,247, 30,184, 0, 0, 0, 0,115,109, 97,108,236,247, +235, 0, 0, 0, 0, 97, 99,117,116,229, 30,190,244,112, 0, 0, + 98,101,108,111,247, 30, 24,244,123, 0, 0,100,111,116, 98,101, +108,111,247, 30,198,244,137, 0, 0,103,114, 97,118,229, 30,192, +244,148, 0, 0,104,111,111,107, 97, 98,111,118,229, 30,194,244, +163, 0, 0,115,109, 97,108,236,247,234,244,174, 0, 0,116,105, +108,100,229, 30,196, 0, 0, 0, 0,115,109, 97,108,236,247,233, + 0, 0, 0, 0,218, 1,241,244,203,246,111, 97, 97,114,109,101, +110,105, 97,238, 5, 52,244,218, 0, 0, 97,102,114,105, 99, 97, +238, 1,137,244,231, 0, 0, 99, 97,114,111,238, 1, 14,244,242, + 0, 0, 99,101,100,105,108,108,225, 30, 16,244,255, 0, 0, 99, +105,114, 99,108,229, 36,185,245, 11, 0, 0, 99,105,114, 99,117, +109,102,108,101,120, 98,101,108,111,247, 30, 18,245, 32, 0, 0, + 99,114,111, 97,244, 1, 16,245, 43, 0, 0,100,111,116, 97, 99, + 99,101,110,244, 30, 10,245, 58, 0, 0,100,111,116, 98,101,108, +111,247, 30, 12,245, 72, 0, 0,101, 99,121,114,105,108,108,105, +227, 4, 20,245, 87, 0, 0,101,105, 99,111,112,116,105,227, 3, +238,245,101, 0, 0,101,108,116,225, 34, 6,245,111,246,100,104, +111,111,235, 1,138,245,121, 0, 0,105,101,114,101,115,105,243, +246,203,245,134,246, 67,105,103, 97,109,109, 97,103,114,101,101, +235, 3,220,245,151, 0, 0,106,101, 99,121,114,105,108,108,105, +227, 4, 2,245,167, 0, 0,108,105,110,101, 98,101,108,111,247, + 30, 14,245,182, 0, 0,109,111,110,111,115,112, 97, 99,229,255, + 36,245,197, 0, 0,111,116, 97, 99, 99,101,110,116,115,109, 97, +108,236,246,247,245,216, 0, 0,115,108, 97,115,232, 1, 16,245, +227, 0, 0,115,109, 97,108,236,247,100,245,238, 0, 0,116,111, +112, 98, 97,242, 1,139,245,250, 0, 0,250, 1,242, 0, 0,246, + 1, 99, 97,114,111,238, 1,197,246, 12, 0, 0,101, 97, 98,107, +104, 97,115,105, 97,110, 99,121,114,105,108,108,105,227, 4,224, +246, 36, 0, 0,101, 99,121,114,105,108,108,105,227, 4, 5,246, + 51, 0, 0,104,101, 99,121,114,105,108,108,105,227, 4, 15, 0, + 0, 0, 0, 65, 99,117,116,229,246,204,246, 78, 0, 0, 71,114, + 97,118,229,246,205,246, 89, 0, 0,115,109, 97,108,236,247,168, + 0, 0, 0, 0,103,114,101,101,235, 3,148, 0, 0, 0, 0, 99, + 97,114,111,238, 1,196, 0, 0, 0, 0, 97, 97,114,109,101,110, +105, 97,238, 5, 62,246,137, 0, 0, 97, 99,117,116,229, 1, 6, +246,148, 0, 0, 97,114,111,238,246,202,246,158,248, 50, 99, 97, +114,111,238, 1, 12,246,169, 0, 0, 99,101,100,105,108,108,225, + 0,199,246,182,248, 28, 99,105,114, 99,108,229, 36,184,246,194, + 0, 0, 99,105,114, 99,117,109,102,108,101,248, 1, 8,246,210, + 0, 0,100,111,244, 1, 10,246,219,248, 16,101,100,105,108,108, + 97,115,109, 97,108,236,247,184,246,236, 0, 0,104, 97, 97,114, +109,101,110,105, 97,238, 5, 73,246,252, 0, 0,104,101, 97, 98, +107,104, 97,115,105, 97,110, 99,121,114,105,108,108,105,227, 4, +188,247, 21, 0, 0,104,101, 99,121,114,105,108,108,105,227, 4, + 39,247, 37, 0, 0,104,101,100,101,115, 99,101,110,100,101,114, + 97, 98,107,104, 97,115,105, 97,110, 99,121,114,105,108,108,105, +227, 4,190,247, 71, 0, 0,104,101,100,101,115, 99,101,110,100, +101,114, 99,121,114,105,108,108,105,227, 4,182,247, 96, 0, 0, +104,101,100,105,101,114,101,115,105,115, 99,121,114,105,108,108, +105,227, 4,244,247,120, 0, 0,104,101,104, 97,114,109,101,110, +105, 97,238, 5, 67,247,137, 0, 0,104,101,107,104, 97,107, 97, +115,115,105, 97,110, 99,121,114,105,108,108,105,227, 4,203,247, +163, 0, 0,104,101,118,101,114,116,105, 99, 97,108,115,116,114, +111,107,101, 99,121,114,105,108,108,105,227, 4,184,247,193, 0, + 0,104,233, 3,167,247,201, 0, 0,104,111,111,235, 1,135,247, +211, 0, 0,105,114, 99,117,109,102,108,101,120,115,109, 97,108, +236,246,246,247,231, 0, 0,109,111,110,111,115,112, 97, 99,229, +255, 35,247,246, 0, 0,111, 97,114,109,101,110,105, 97,238, 5, + 81,248, 5, 0, 0,115,109, 97,108,236,247, 99, 0, 0, 0, 0, + 97, 99, 99,101,110,244, 1, 10, 0, 0, 0, 0, 97, 99,117,116, +229, 30, 8,248, 39, 0, 0,115,109, 97,108,236,247,231, 0, 0, + 0, 0,115,109, 97,108,236,246,245, 0, 0, 0, 0, 99,105,114, + 99,108,229, 36,183,248, 73, 0, 0,100,111,116, 97, 99, 99,101, +110,244, 30, 2,248, 88, 0, 0,100,111,116, 98,101,108,111,247, + 30, 4,248,102, 0, 0,101, 99,121,114,105,108,108,105,227, 4, + 17,248,117, 0, 0,101,110, 97,114,109,101,110,105, 97,238, 5, + 50,248,133, 0, 0,101,116,225, 3,146,248,142, 0, 0,104,111, +111,235, 1,129,248,152, 0, 0,108,105,110,101, 98,101,108,111, +247, 30, 6,248,167, 0, 0,109,111,110,111,115,112, 97, 99,229, +255, 34,248,182, 0, 0,114,101,118,101,115,109, 97,108,236,246, +244,248,197, 0, 0,115,109, 97,108,236,247, 98,248,208, 0, 0, +116,111,112, 98, 97,242, 1,130, 0, 0, 0, 0,197, 0,198,248, +227,251, 33, 97, 99,117,116,229, 0,193,248,238,251, 22, 98,114, +101,118,229, 1, 2,248,249,250,202, 99, 97,114,111,238, 1,205, +249, 4, 0, 0, 99,105,114, 99,108,229, 36,182,249, 16, 0, 0, + 99,105,114, 99,117,109,102,108,101,248, 0,194,249, 32,250,129, + 99,117,116,229,246,201,249, 42,250,118, 99,121,114,105,108,108, +105,227, 4, 16,249, 56, 0, 0,100, 98,108,103,114, 97,118,229, + 2, 0,249, 70, 0, 0,100,105,101,114,101,115,105,243, 0,196, +249, 84,250, 81,100,111,116, 98,101,108,111,247, 30,160,249, 98, + 0, 0,100,111,116,109, 97, 99,114,111,238, 1,224,249,113, 0, + 0,103,114, 97,118,229, 0,192,249,124,250, 70,104,111,111,107, + 97, 98,111,118,229, 30,162,249,139, 0, 0,105,101, 99,121,114, +105,108,108,105,227, 4,212,249,155, 0, 0,105,110,118,101,114, +116,101,100, 98,114,101,118,229, 2, 2,249,174, 0, 0,108,112, +104,225, 3,145,249,184,250, 59,109, 97, 99,114,111,238, 1, 0, +249,196, 0, 0,109,111,110,111,115,112, 97, 99,229,255, 33,249, +211, 0, 0,111,103,111,110,101,235, 1, 4,249,223, 0, 0,114, +105,110,231, 0,197,249,233,250, 26,115,109, 97,108,236,247, 97, +249,244, 0, 0,116,105,108,100,229, 0,195,249,255,250, 15,121, + 98, 97,114,109,101,110,105, 97,238, 5, 49, 0, 0, 0, 0,115, +109, 97,108,236,247,227, 0, 0, 0, 0, 97, 99,117,116,229, 1, +250,250, 37, 0, 0, 98,101,108,111,247, 30, 0,250, 48, 0, 0, +115,109, 97,108,236,247,229, 0, 0, 0, 0,116,111,110,111,243, + 3,134, 0, 0, 0, 0,115,109, 97,108,236,247,224, 0, 0, 0, + 0, 99,121,114,105,108,108,105,227, 4,210,250, 95, 0, 0,109, + 97, 99,114,111,238, 1,222,250,107, 0, 0,115,109, 97,108,236, +247,228, 0, 0, 0, 0,115,109, 97,108,236,247,180, 0, 0, 0, + 0, 97, 99,117,116,229, 30,164,250,140, 0, 0,100,111,116, 98, +101,108,111,247, 30,172,250,154, 0, 0,103,114, 97,118,229, 30, +166,250,165, 0, 0,104,111,111,107, 97, 98,111,118,229, 30,168, +250,180, 0, 0,115,109, 97,108,236,247,226,250,191, 0, 0,116, +105,108,100,229, 30,170, 0, 0, 0, 0, 97, 99,117,116,229, 30, +174,250,213, 0, 0, 99,121,114,105,108,108,105,227, 4,208,250, +227, 0, 0,100,111,116, 98,101,108,111,247, 30,182,250,241, 0, + 0,103,114, 97,118,229, 30,176,250,252, 0, 0,104,111,111,107, + 97, 98,111,118,229, 30,178,251, 11, 0, 0,116,105,108,100,229, + 30,180, 0, 0, 0, 0,115,109, 97,108,236,247,225, 0, 0, 0, + 0, 97, 99,117,116,229, 1,252,251, 44, 0, 0,109, 97, 99,114, +111,238, 1,226,251, 56, 0, 0,115,109, 97,108,236,247,230, 0, + 0, 0, 0}; + +static const unsigned short STANDART_ENCODING[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 32, 33, 34, 35, 36, 37, 38, 8217, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 8216, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 161, 162, 163, 8260, 165, 402, 167, + 164, 39, 8220, 171, 8249, 8250,64257,64258, + 0, 8211, 8224, 8225, 183, 0, 182, 8226, + 8218, 8222, 8221, 187, 8230, 8240, 0, 191, + 0, 96, 180, 710, 732, 175, 728, 729, + 168, 0, 730, 184, 0, 733, 731, 711, + 8212, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 198, 0, 170, 0, 0, 0, 0, + 321, 216, 338, 186, 0, 0, 0, 0, + 0, 230, 0, 0, 0, 305, 0, 0, + 322, 248, 339, 223, 0, 0, 0, 0}; + +#endif //__TYPE_1_FL_TREE_H Index: modules/awt/src/main/native/fontlib/shared/Environment.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/Environment.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/Environment.h (revision 0) @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev, Viskov Nikolay + * @version $Revision$ + */ +#ifndef __GRAPHICS_ENVIRONMENT_H__ +#define __GRAPHICS_ENVIRONMENT_H__ + +#include "Font.h" + +typedef enum FontTypeTag { + TrueType = 0, + Type1 = 1} FontType; + +class FontHeader +{ +public: + wchar_t *_familyName; + char* _filePath; + StyleName _style; + Font* _font; + FontType _fType; + FontHeader* _nextHeader; + FontHeader* _head; + + FontHeader(); + FontHeader(char** filePath, FontType fType); + + ~FontHeader(); +}; + +class Environment +{ +public: + static int _length; //length of list + static int addPath(char* argPath); + static FontHeader* addFile(char* argPath, FontType ft); + static FontHeader* getAllFonts(); +}; + +#endif // __GRAPHICS_ENVIRONMENT_H__ Index: modules/awt/src/main/native/fontlib/shared/T1Font.cpp =================================================================== --- modules/awt/src/main/native/fontlib/shared/T1Font.cpp (revision 0) +++ modules/awt/src/main/native/fontlib/shared/T1Font.cpp (revision 0) @@ -0,0 +1,684 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Viskov Nikolay + * @version $Revision$ + */ + +#include + +#include "T1Font.h" +#include "T1Glyph.h" + +T1Font::T1Font(wchar_t *family, StyleName sn, char* pathToFile):Font() { + //this->_famName = family; + _style = sn; + + fullName = NULL; + + FILE *inputFile; + + if( inputFile = fopen(pathToFile, "rb")) { + + try { + initFont(inputFile); + } catch (char*) { + //printf("%s", str); + } + + fclose(inputFile); + + //set default ascent and descent + _ascent = 649; + _descent = 195; + + + char path[MAX_STR_LENGHT]; + size_t length = strlen(pathToFile) - 3; + + strncpy(path, pathToFile, length); + strcpy(path + length, "afm"); + + if( inputFile = fopen(path, "rb")) { + + try { + parseAFM(inputFile); + } catch (...) { + //printf("%s", str); + } + + fclose(inputFile); + } + + } + +} + +T1Font::~T1Font(void) { + + for( Type1Map::iterator iter = subrsMap.begin(); iter != subrsMap.end(); iter++ ) { + delete iter->second; + } + + for( Type1Map::iterator iter = charStringMap.begin(); iter != charStringMap.end(); iter++ ) { + delete iter->second; + } + + /*for( Type1AFMMap::iterator iter = afmMap.begin(); iter != afmMap.end(); iter++ ) { + delete[] iter->second; + }*/ + + delete fullName; +} + +Glyph* T1Font::createGlyph(unsigned short unicode, unsigned short size) { + + /*float floatMas[4]; + + Type1AFMMap::iterator iter = afmMap.find(unicode); + + //return iter == glyphCodeMap.end()? NULL : (unsigned short)iter->second; + + memcpy(floatMas, _boundingBox, 4 * sizeof(float)); + + if (iter != afmMap.end()) { + //printf("%s\n", iter->second); + char* curValue = strstr( iter->second, " B "); + if (curValue != NULL) { + + curValue += 3; + + floatMas[0] = (float) atof(curValue); + //printf("0 = %f\n", floatMas[0]); + + while (*(++curValue) != ' ') { + } + + floatMas[1] = (float) atof(curValue); + //printf("1 = %f\n", floatMas[1]); + + while (*(++curValue) != ' ') { + } + + floatMas[2] = (float) atof(curValue); + //printf("2 = %f\n", floatMas[2]); + + while (*(++curValue) != ' ') { + } + + floatMas[3] = (float) atof(curValue); + //printf("3 = %f\n", floatMas[3]); + } + }*/ + + Glyph *glyph = new T1Glyph(&(this->charStringMap), &(this->subrsMap), unicode, size, size / matrixScale, _boundingBox); + + return glyph; +} + +//TODO: owerwrite this: +wchar_t* T1Font::getPSName() { + return fullName; +} + +float* T1Font::getLineMetrics() { + /* + * metrics[0] - ascent

+ * metrics[1] - descent

+ * metrics[2] - external leading

+ * metrics[3] - underline thickness

+ * metrics[4] - underline offset

+ * metrics[5] - strikethrough thickness

+ * metrics[6] - strikethrough offset

+ * metrics[7] - maximum char width

*/ + + float* floatMas = new float[FONT_METRICS_QUANTITY]; + + floatMas[0] = _ascent / matrixScale; //ascent + floatMas[1] = _descent / matrixScale; //descent + floatMas[2] = (_height - _ascent - _descent) / matrixScale;//_externalLeading; + + floatMas[3] = _underlineThickness / matrixScale; + floatMas[4] = _underlineOffset / matrixScale; + + floatMas[5] = _underlineThickness / matrixScale;//_strikeOutSize; + floatMas[6] = -_ascent/(2 * matrixScale);//_strikeOutOffset; + + floatMas[7] = ((float)(_boundingBox[3] - _boundingBox[1])) / matrixScale; + + return floatMas; +} + +bool T1Font::canDisplay(unsigned short ch) { + return this->charStringMap.find(ch) != this->charStringMap.end(); +} + +unsigned short T1Font::getUnicodeByIndex(unsigned short index) { + Type1GlyphCodeMap::iterator iter = glyphCodeMap.find(index); + + return iter == glyphCodeMap.end()? 0 : (unsigned short)iter->second; +} + +void error(){ + //printf("invalidfont"); + throw "invalidfont"; +} + +unsigned inline short hexCharToUShort(char ch){ + return ch >= '0' && ch <= '9' ? ch - '0' : + ch >= 'A' && ch <= 'F' ? ch - 'A' + 10 : + ch >= 'a' && ch <= 'f' ? ch - 'a' + 10 : + 0; +} + +void static getNextLine(char* str, FILE* font) { + unsigned short count = 0; + unsigned char ch = ' '; + + while (!feof(font) && (ch == ' ' || ch == '\n' || ch == '\r')) { + ch = getc(font); + } + + str[count] = ch; + while (!feof(font) && ch != '\r' && ch != '\n') { + str[++count] = (ch = getc(font)); + } + + str[count] = '\0'; +} + +unsigned static char getNextChar(FILE* font) { + unsigned char ch; + do { + ch = getc(font); + } while (ch == '\r' || ch == '\n'); + + return ch; +} + +unsigned static char decryptNextSimbol(FILE* font, unsigned short* r, bool isASCII) { + unsigned char clipher = (unsigned char)( + isASCII ? + (unsigned char) ((hexCharToUShort(getNextChar(font)) << 4 ) + (hexCharToUShort(getNextChar(font)))) : + getc(font) + ); + + unsigned char plain = (unsigned char)(clipher ^ (*r >> 8)); + *r = ( (unsigned char)clipher + *r ) * C1 + C2; + return plain; +} + +void static decodeASCIILine(char* str, unsigned short* r, unsigned short n, unsigned short length) { + char* p = str; + unsigned char plain; + unsigned char clipher; + unsigned short count = 0; + length /= 2; + + while(count < length) { + clipher = (unsigned char)((hexCharToUShort(*p) << 4 ) + (hexCharToUShort(*(p + 1)))); + + plain = (unsigned char)(clipher ^ (*r >> 8)); + *r = ( (unsigned char)clipher + *r ) * C1 + C2; + + if (count >= n) { + str[count - n] = plain; + } + + count ++; + + p+= 2; + } + str[count - n] = '\0'; +} + +void static decodeBinaryLine(char* str, unsigned short* r, unsigned short n, unsigned short length) { + char* p = str; + unsigned char plain; + unsigned char clipher; + unsigned short count = 0; + while(count < length) { + clipher = (unsigned char)*p; + + plain = (unsigned char)(clipher ^ (*r >> 8)); + *r = ( (unsigned char)clipher + *r ) * C1 + C2; + + if (count >= n) { + str[count - n] = plain; + } + + count ++; + + p ++; + } + str[count - n] = '\0'; +} + +void static decodeLine(char* str, unsigned short* r, unsigned short n, bool isASCII, unsigned short length) { + + if (isASCII) { + decodeASCIILine(str,r,n,length); + } else { + decodeBinaryLine(str,r,n,length); + } + return; + /*char* p = str; + unsigned char plain; + unsigned char clipher; + unsigned short count = 0; + if (isASCII) { + length /= 2; + } + while(count < length) { + clipher = (unsigned char)(isASCII ? ((hexCharToUShort(*p) << 4 ) + (hexCharToUShort(*(p + 1)))) : *p); + + plain = (unsigned char)(clipher ^ (*r >> 8)); + *r = ( (unsigned char)clipher + *r ) * C1 + C2; + + //printf("%u ---- %u,%u\n", clipher, plain, *r); + if (count >= n) { + str[count - n] = plain; + } + + count ++; + + p+= isASCII ? 2 : 1; + } + str[count - n] = '\0';//*/ +} + +void static getNextDecodeLine(char* str, FILE* font, unsigned short* r, bool isASCII) { + unsigned short count = 0; + unsigned char plain; + while(!feof(font)) { + plain = decryptNextSimbol(font, r, isASCII); + + str[count ++] = plain; + + if (plain == '\r' || plain == '\n') { + break; + } + } + + str[count] = '\0'; +} + +void static getNextDecodeLexeme(char* str, FILE* font, unsigned short* r, bool isASCII) { + unsigned char ch; + unsigned short count = 0; + + while (!feof(font) && ((ch = decryptNextSimbol(font, r, isASCII)) == ' ' || ch == '\n' || ch == '\r')) { + } + + str[count ++] = ch; + while (!feof(font) && (ch = decryptNextSimbol(font, r, isASCII)) != ' ' && ch != '\n' && ch != '\r') { + str[count ++] = ch; + } + + str[count] = '\0'; +} + +void static getNextLexeme(char* str, FILE* font) { + unsigned char ch; + unsigned short count = 0; + + while (!feof(font) && ((ch = getc(font)) == ' ' || ch == '\n' || ch == '\r' && ch != '{')) { + } + + str[count ++] = ch; + while (!feof(font) && (ch = getc(font)) != ' ' && ch != '\n' && ch != '\r' && ch != '{') { + str[count ++] = ch; + } + + str[count] = '\0'; +} + +unsigned short static findUnicode(const char *str) { + + unsigned short count = 0; + unsigned short strCount = 0; + unsigned short lastStrCount = 0; + + while(true) { + if (GLYPH_LIST[count] == str[strCount]) { + count ++; + strCount ++; + //next iteration + } else if ((GLYPH_LIST[count] ^ (1 << 7)) == str[strCount]) { + strCount ++; + if (str[strCount] == '\0') { + return (unsigned short)((GLYPH_LIST[count + 1] << 8) + GLYPH_LIST[count + 2]); + } + + count = ((GLYPH_LIST[count + 5] << 8) + GLYPH_LIST[count + 6]); + + lastStrCount = strCount; + + if (!count) { + return FONT_NOT_FOUND_UNICODE_VALUE; + } + + //on next level + } else { + strCount = lastStrCount; + + for (;!(GLYPH_LIST[count] & (1 << 7)) ; ) { + count ++; + } + + count = ((GLYPH_LIST[count + 3] << 8) + GLYPH_LIST[count + 4]); + + if (!count) { + return FONT_NOT_FOUND_UNICODE_VALUE; + } + + //next on this level + } + } +} + +unsigned short static getUnicode(char *name) { + if (!strncmp(name, ".notdef", 7)) { + return 0; + } + + return findUnicode(name); +} + +void T1Font::parseAFM(FILE *font) { + char curStr[MAX_STR_LENGHT]; + + while (!feof(font)) { + getNextLexeme(curStr, font); + //printf("%s\n",curStr); + + if (!strcmp(curStr, "EndFontMetrics") || !strcmp(curStr, "StartCharMetrics")) { + + return; + } else if (!strcmp(curStr, "Ascender")) { + getNextLexeme(curStr, font); + _ascent = (float) fabs(atof(curStr)); + //printf("ascend = %f\n", _ascent); + + } else if (!strcmp(curStr, "Descender")) { + getNextLexeme(curStr, font); + _descent = (float) fabs(atof(curStr)); + //printf("descent = %f\n", _descent); + + } /*else if (!strcmp(curStr, "StartCharMetrics")) { + getNextLexeme(curStr, font); + char* curValue; + char psName[MAX_STR_LENGHT]; + unsigned short count = (unsigned short) atoi(curStr); + for (unsigned short i = 0; i < count; i ++) { + getNextLine(curStr, font); + + //printf("%s\n",curStr); + curValue = strstr( curStr, " N "); + if (curValue != NULL) { + + curValue += 3; + + //printf("%s\n", curValue); + + unsigned short i; + for (i = 0; curValue[i] != ' ' && curValue[i] != '\0'; i ++) { + psName[i] = curValue[i]; + } + psName[i] = '\0'; + + curValue = new char[strlen(curStr) + 1]; + + strcpy(curValue, curStr); + + //printf("%u = %s = %s\n",findUnicode(psName),curValue,psName); + + afmMap[getUnicode(psName)] = curValue; + } + } + + }*/ else { + getNextLine(curStr, font); + } + } +} + + +void T1Font::initFont(FILE *font) { + char curStr[MAX_STR_LENGHT]; + + DecodeState state = HEADER; + + unsigned short r = DEF_R_EXEC; + unsigned short n = 4; + + unsigned short lenIV = DEF_LENIV; + unsigned short charStringR; + + unsigned short count = 0; + unsigned short tempShort = 0; + unsigned short length = 0; + unsigned short valueLength = 0; + + matrixScale = 1000; + + bool isASCII = true; + + unsigned char ch; + EncodedValue *curValue; + + ch = getc(font); + + if (ch == 0x80 && getc(font) == 0x01) { + isASCII = false; + } else if (ch == '%' && getc(font) == '!') { + isASCII = true; + } else { + error(); + } + + while (!feof(font)) { + switch (state) { + case HEADER: { + getNextLexeme(curStr, font); + + if (!strcmp(curStr, "/UnderlinePosition")) { + getNextLexeme(curStr, font); + _underlineOffset = (float) - atof(curStr); + } else if (!strcmp(curStr, "/UnderlineThickness")) { + getNextLexeme(curStr, font); + _underlineThickness = (float) atof(curStr); + } else if (strstr(curStr, "/FontBBox") != NULL) { + //getNextLexeme(curStr, font); + + while (!feof(font) && ((ch = getc(font)) == '{')) { + } + + ungetc(ch, font); + + getNextLexeme(curStr, font); + _boundingBox[0] = (float) atof(curStr); + + getNextLexeme(curStr, font); + _boundingBox[1] = (float) atof(curStr); + + getNextLexeme(curStr, font); + _boundingBox[2] = (float) atof(curStr); + + getNextLexeme(curStr, font); + _boundingBox[3] = (float) atof(curStr); + + _height = ((float)(_boundingBox[2] -_boundingBox[0])); + + } else if (!strcmp(curStr, "/FullName")) { + //getNextLexeme(curStr, font); + + while (!feof(font) && ((ch = getc(font)) == '(')) { + } + + curStr[count ++] = ch; + while (!feof(font) && (ch = getc(font)) != ')') { + curStr[count ++] = ch; + } + + curStr[count] = '\0'; + + char *ptr = curStr; + + ch = 0; + fullName = new wchar_t[count + 1]; + while (*ptr != '\0') { + fullName[ch ++] = *ptr; + ptr ++; + } + + fullName[ch] = L'\0'; + } else if (!strcmp(curStr, "eexec")) { + state = PRIVATE_DIR; + + if (isASCII) { + for (count = 0; count < lenIV * 2; count ++) { + if (!isascii(ch = getc(font))) { + error(); + } + curStr[count] = ch; + } + decodeASCIILine(curStr, &r, n, count); + } else { + for (count = 0; count < 6; count ++) { + curStr[count] = getc(font); + } + + if (curStr[0] != (char)0x80 || curStr[1] != 0x02) { + error(); + } + for (count = 0; count < lenIV; count ++) { + curStr[count] = getc(font); + } + decodeBinaryLine(curStr, &r, n, count); + } + } + break; + } + case PRIVATE_DIR: { + getNextDecodeLexeme(curStr, font, &r, isASCII); + + if (!strcmp(curStr, "/Subrs")) { + + getNextDecodeLexeme(curStr, font, &r, isASCII); + valueLength = atoi(curStr); + + count = 0; + state = SUBRS_MASSIVE; + getNextDecodeLine(curStr, font, &r, isASCII); + } else if (!strcmp(curStr, "/CharStrings")) { + + getNextDecodeLexeme(curStr, font, &r, isASCII); + valueLength = atoi(curStr); + + count = 0; + state = CHAR_STRING; + getNextDecodeLine(curStr, font, &r, isASCII); + } + break; + } + case SUBRS_MASSIVE: { + curValue = new EncodedValue(); + getNextDecodeLexeme(curStr, font, &r, isASCII); + + getNextDecodeLexeme(curStr, font, &r, isASCII); + curValue->number = (unsigned short) atoi(curStr); + + getNextDecodeLexeme(curStr, font, &r, isASCII); + length = (unsigned short) atoi(curStr); + curValue->length = length - lenIV; + + getNextDecodeLexeme(curStr, font, &r, isASCII); + + for (tempShort = 0; tempShort - length < 0; tempShort ++) { + curStr[tempShort] = decryptNextSimbol(font, &r, isASCII); + } + + charStringR = DEF_R_CHARSTRING; + decodeBinaryLine(curStr, &charStringR, lenIV, length); + + curValue->text = new char[curValue->length]; + for (tempShort = 0; tempShort - curValue->length < 0; tempShort ++) { + curValue->text[tempShort] = curStr[tempShort]; + } + + subrsMap[curValue->number] = curValue; + + getNextDecodeLine(curStr, font, &r, isASCII); + + if (++count >= valueLength) { + state = PRIVATE_DIR; + count = 0; + } + + break; + } + case CHAR_STRING: { + getNextDecodeLexeme(curStr, font, &r, isASCII); + tempShort = getUnicode(curStr + 1); + + if (tempShort != FONT_NOT_FOUND_UNICODE_VALUE) { + + glyphCodeMap[count] = tempShort; + + curValue = new EncodedValue(); + + curValue->number = tempShort; + + getNextDecodeLexeme(curStr, font, &r, isASCII); + length = (unsigned short) atoi(curStr); + curValue->length = length - lenIV; + + getNextDecodeLexeme(curStr, font, &r, isASCII); + for (tempShort = 0; tempShort - length < 0; tempShort ++) { + curStr[tempShort] = decryptNextSimbol(font, &r, isASCII); + } + + charStringR = DEF_R_CHARSTRING; + decodeBinaryLine(curStr, &charStringR, lenIV, length); + + curValue->text = new char[curValue->length]; + for (tempShort = 0; tempShort - curValue->length < 0; tempShort ++) { + curValue->text[tempShort] = curStr[tempShort]; + } + charStringMap[curValue->number] = curValue; + } else { + getNextDecodeLexeme(curStr, font, &r, isASCII); + length = (unsigned short) atoi(curStr); + + getNextDecodeLexeme(curStr, font, &r, isASCII); + for (tempShort = 0; tempShort - length < 0; tempShort ++) { + decryptNextSimbol(font, &r, isASCII); + } + } + + getNextDecodeLine(curStr, font, &r, isASCII); + + if (++count >= valueLength) { + return; + } + + break; + } + } + } +} Index: modules/awt/src/main/native/fontlib/shared/Font.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/Font.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/Font.h (revision 0) @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev, Viskov Nikolay + * @version $Revision$ + */ +#ifndef __FONT_H__ +#define __FONT_H__ + +#include +#include "Glyph.h" + +typedef enum StyleNameTag { + Regular = 0, + Bold = 1, + Italic = 2, + BoldItalic = 3 +} StyleName; + +typedef enum FlagsTag {ANGLE, IS_FIXED_PITCH, BOLD} Flags; + +static const unsigned char FONT_METRICS_QUANTITY = 8; +static const unsigned char GLYPH_METRICS_QUANTITY = 6; + +/* +typedef struct +{ + int numChars; + int baselineIndex; + float underlineThickness; + float underlineOffset; + float strikethroughThickness; + float strikethroughOffset; + float leading; + float height; + float descent; + float ascent; + float baseLineOffsets[1]; +}LineMetrics; +*/ + +class Font { +public: + Font(); + virtual ~Font(); + + Glyph* getGlyph(unsigned short unicode, unsigned short size); + Glyph* getDefaultGlyph(); + int getMissingGlyphCode(); + + virtual Glyph* createGlyph(unsigned short unicode, unsigned short size); + virtual float* getLineMetrics(); + virtual wchar_t* getPSName(); + virtual bool canDisplay(unsigned short c); + virtual unsigned short getUnicodeByIndex(unsigned short ind); + + +//protected: + unsigned short _numGlyphs; // Number of available glyphs + wchar_t *_famName; // (unsigned short*) Family name + StyleName _style; // Font style + //short *_bitmaps; // - (?) + float _boundingBox[4]; // Glyphs bounding box - array of 4 shorts + float _ascent; + float _descent; + float _externalLeading; //lineGap in TrueType + float _height; + float _strikeOutSize; + float _strikeOutOffset; + float _underlineOffset; + float _underlineThickness; + unsigned short _size; + std::map _glyphMap;//(size << 16 + unicode) -- Glyph + Flags _flags; + +// virtual unsigned short* getBitmap(); +// virtual unsigned short* getOutline(); +// virtual unsigned short* getGlyph(); +private: + inline Glyph* findGlyph(unsigned short unicode, unsigned short size, unsigned long id); +}; + +Font* createFont(wchar_t* family, StyleName sn); +Font* createFont(char* family, StyleName sn); + +#endif //__FONT_H__ Index: modules/awt/src/main/native/fontlib/shared/TTFont.cpp =================================================================== --- modules/awt/src/main/native/fontlib/shared/TTFont.cpp (revision 0) +++ modules/awt/src/main/native/fontlib/shared/TTFont.cpp (revision 0) @@ -0,0 +1,286 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev + * @version $Revision$ + */ +#include "TTFont.h" +#include "Tables.h" + +TTFont::TTFont(char* pathToFile):Font() +{ + _pathToFile=pathToFile; + _glyphOffsets.offsets = NULL; + _tableEncode.TableEncode = NULL; + _famName = NULL; + _ttfile = NULL; + _hMetrics = NULL; + _psName = NULL; + + _ttfile = fopen(_pathToFile,"rb"); + parseNameTable(_ttfile, &_famName, &_psName, NULL); + parseCmapTable(_ttfile, &_tableEncode); + parseMaxpTable(_ttfile, &_numGlyphs); + parseHeadTable(_ttfile, _boundingBox, &(_glyphOffsets.format), &_unitsPerEm); + for (int i=0; i<4; i++) + _boundingBox[i]/=(float)(_unitsPerEm); + parseLocaTable(_ttfile, &(_glyphOffsets), _numGlyphs); + parseHheaTable(_ttfile, &_numOfHMetrics, &_ascent, &_descent, &_externalLeading); + + _ascent/=(float)(_unitsPerEm); + _descent = ((_descent>0)?_descent:(-_descent))/_unitsPerEm; + _externalLeading/=(float)(_unitsPerEm); + + parseHmtxTable(_ttfile, _numOfHMetrics, &_hMetrics); + fclose(_ttfile); +} + +TTFont::~TTFont(void) +{ + delete[] _glyphOffsets.offsets; + delete[] (int*)(_tableEncode.TableEncode); + delete[] _psName; + delete[] _hMetrics; +} + +Glyph* TTFont::createGlyph(unsigned short unicode, unsigned short size) +{ + TTGlyph *gl = new TTGlyph(this, unicode, size); + if (gl->_index < _numOfHMetrics) + gl->_advanceX = _hMetrics[gl->_index].adwance_width*(float)(size)/(float)(_unitsPerEm); + else + gl->_advanceX = _hMetrics[_numOfHMetrics-1].adwance_width*(float)(size)/(float)(_unitsPerEm); + gl->_advanceY = 0; + return gl; +} + +unsigned short TTFont::getGlyphIndex(unsigned short symb) +{ + unsigned short index = 0; + + if (_tableEncode.format == 0) + { + unsigned char* te = (unsigned char*)_tableEncode.TableEncode; + index = te[symb]; + + }else if (_tableEncode.format == 4) + { + unsigned short segCountX2; + unsigned short segCount; +// unsigned short search_range; +// unsigned short entry_selector; +// unsigned short range_shift; + unsigned short* end_count; + unsigned short* start_count; + unsigned short* idDelta; + unsigned short* idRangeOffset; + unsigned short reservedPad; + unsigned short* te = (unsigned short*)(_tableEncode.TableEncode); + int i; + + segCountX2 = te[0]; + segCount = segCountX2/2; + end_count = te+4; + reservedPad = te[segCount+4]; + start_count = te+segCount+5; + idDelta = te+2*segCount+5; + idRangeOffset = te+3*segCount+5; + + for (i=0;i=start_count[i]) + { + break; + } + } + + if (idRangeOffset[i] != 0) + index = (*(idRangeOffset[i]/2 + (symb - start_count[i]) + &idRangeOffset[i]) + idDelta[i]) % 65536; + else + index = (symb + idDelta[i]) % 65536; + + } + return index; +} + +unsigned short TTFont::getUnicodeByIndex(unsigned short ind) +{ + unsigned short symb = 0; + + if (_tableEncode.format == 0) + { + unsigned char* te = (unsigned char*)_tableEncode.TableEncode; + for (unsigned short i = 0; i<=_numGlyphs; i++) + { + if (ind = te[i]) + { + symb = i; + break; + } + } + }else + if (_tableEncode.format == 4) + { + unsigned short segCountX2; + unsigned short segCount; + unsigned short* end_count; + unsigned short* start_count; + unsigned short* idDelta; + unsigned short* idRangeOffset; + unsigned short reservedPad; + unsigned short* te = (unsigned short*)(_tableEncode.TableEncode); + int i; + + segCountX2 = te[0]; + segCount = segCountX2/2; + end_count = te+4; + reservedPad = te[segCount+4]; + start_count = te+segCount+5; + idDelta = te+2*segCount+5; + idRangeOffset = te+3*segCount+5; + + for (i=0;i=start_count[i]) + { + break; + } + } + } + return symb; +} + +wchar_t* TTFont::getPSName() +{ + return _psName; +} + +float* TTFont::getLineMetrics() +{ +//printf("reading file...\n"); + _ttfile = fopen(_pathToFile,"rb"); + + float* ret = new float[8]; + ret[0] = _ascent; + ret[1] = _descent; + ret[2] = _externalLeading; + + short uOffset, uThickness; + +//printf("parsing POST table...\n"); + parsePostTable(_ttfile, &uOffset, &uThickness); + ret[3] = (float)uThickness/(float)(_unitsPerEm); + ret[4] = (float)uOffset/(float)(_unitsPerEm); + +//printf("parsing OS2 table...\n"); + parseOs2Table(_ttfile, &_strikeOutSize, &_strikeOutOffset); + + ret[5] = _strikeOutSize; + ret[6] = _strikeOutOffset; + + float width = _boundingBox[3]-_boundingBox[1]; + ret[7] = (width>0)?width:(-width); + + fclose(_ttfile); + + return ret; +} + +bool TTFont::canDisplay(unsigned short c) +{ + unsigned short index = getGlyphIndex(c); +#ifdef WIN32 + bool isComposite = isCompositeGlyph(_ttfile, _glyphOffsets, _numGlyphs, index); + if (index == 0 || index >= _numGlyphs || isComposite) + return false; +#else + if (index == 0 || index >= _numGlyphs) + return false; +#endif + return true; +} + +/* *************** */ +/* TTGlyph methods */ +/* *************** */ +TTGlyph::TTGlyph(TTFont* font, unsigned short unicode, unsigned short size):Glyph() +{ + _ttfont = font; + _unicode = unicode; + _size = size; + _curve = new TTCurve(); + _boundingRect[0]=0; + _boundingRect[1]=0; + _boundingRect[2]=0; + _boundingRect[3]=0; + + _ttfont->_ttfile = fopen(_ttfont->_pathToFile,"rb"); + _index = _ttfont->getGlyphIndex(_unicode); + parseGlyphData(_ttfont->_ttfile, _ttfont->_glyphOffsets,_ttfont->_numGlyphs,_index, _curve, _boundingRect, (float)_size/(float)(_ttfont->_unitsPerEm)); + fclose(_ttfont->_ttfile); +} + +TTGlyph::~TTGlyph() +{ + delete _curve; +} + +float* TTGlyph::getGlyphMetrics(void){ + float* gMetrics = new float[6]; + + gMetrics[0]=_advanceX; + gMetrics[1]=_advanceY; + gMetrics[2]=_boundingRect[0]; + gMetrics[3]=_boundingRect[1]; + gMetrics[4]=_boundingRect[2]; + gMetrics[5]=_boundingRect[3]; + + return gMetrics; +} + +Outline* TTGlyph::getOutline(void) +{ + Outline* outline = new Outline(_curve->_len,_curve->_outlineCommandsNumb); + + for (int i = 0; i<_curve->_len; i+=2) + { + switch(_curve->_flags[i/2]) + { + case OPEN_FLAG: + if (i!=0) outline->closePath(); + outline->moveTo(_curve->_coords[i],_curve->_coords[i+1]); + break; + case FLAG_ONCURVE: + if (_curve->_flags[i/2-1] & FLAG_ONCURVE || _curve->_flags[i/2-1] & OPEN_FLAG) + outline->lineTo(_curve->_coords[i],_curve->_coords[i+1]); + else + outline->quadTo(_curve->_coords[i-2],_curve->_coords[i-1],_curve->_coords[i],_curve->_coords[i+1]); + } + } + outline->closePath(); + + return outline; +} Index: modules/awt/src/main/native/fontlib/shared/Tables.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/Tables.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/Tables.h (revision 0) @@ -0,0 +1,314 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev + * @version $Revision$ + */ +#ifndef __TABLES_H__ +#define __TABLES_H__ + + +#include "TTCurve.h" +#include "TTFont.h" + +#define CMAP_TABLE "cmap" /* character to glyph mapping */ +#define GLYF_TABLE "glyf" /* glyph data */ +#define HEAD_TABLE "head" /* font header */ +#define HHEA_TABLE "hhea" /* horizontal header */ +#define HMTX_TABLE "hmtx" /* horizontal metrics */ +#define LOCA_TABLE "loca" /* index to location */ +#define MAXP_TABLE "maxp" /* maximum profile */ +#define NAME_TABLE "name" /* naming */ +#define POST_TABLE "post" /* PostScript */ +#define TTCF_TABLE "ttcf" /* TrueType font collection */ +#define KERN_TABLE "kern" /* Kerning table */ +#define BASE_TABLE "BASE" /* Baseline table */ +#define OS2_TABLE "OS/2" /* OS-metrics table */ + +#define WINDOWS_PLATFORM_ID 3 /* Windows platform identifier */ +#define FAMILY_NAME_ID 1 /* Family name identifier */ +#define SUBFAMILY_NAME_ID 2 /* Family name identifier */ +#define FULL_NAME_ID 4 /* Family name identifier */ +#define POSTSCRIPT_NAME_ID 6 /* Family name identifier */ + +#define SYMBOL_ENCODING 0 +#define UNICODE_ENCODING 1 +#define SHIFT_JIS_ENCODING 2 +#define BIG5_ENCODING 3 +#define PRC_ENCODING 4 + +typedef long Fixed; +typedef long long LONGDT; + +typedef enum +{ + ON_CURVE = 0x01, // on curve or not + REPEAT = 0x08, // next byte specifies the number of + //additional times this set of flags is to be repeated + X_POSITIVE = 0x12, // positive x-value + X_NEGATIVE = 0x02, // negative x-value + X_SAME = 0x10, // x is same + X_DWORD = 0x00, + + Y_POSITIVE = 0x24, // positive y-value + Y_NEGATIVE = 0x04, // negative y-value + Y_SAME = 0x20, // y is same + Y_DWORD = 0x00, +}; + +/* From Win GDI +typedef struct { + unsigned char bFamilyType; + unsigned char bSerifStyle; + unsigned char bWeight; + unsigned char bProportion; + unsigned char bContrast; + unsigned char bStrokeVariation; + unsigned char bArmStyle; + unsigned char bLetterform; + unsigned char bMidline; + unsigned char bXHeight; +} PANOSE; */ + +typedef struct +{ + Fixed version; + unsigned short num_tables; + unsigned short search_range; + unsigned short entry_selector; + unsigned short range_shift; +} Table_Offset; + +typedef struct +{ + char tag[4]; + unsigned long checkSum; + unsigned long offset; + unsigned long length; +} Table_Directory; + +typedef struct +{ + unsigned short platformID; + unsigned short encodingID; + unsigned short languageID; + unsigned short nameID; + unsigned short string_length; + unsigned short string_offset; +} Name_Entry; + +typedef struct +{ + unsigned short format; + unsigned short num_name_records; + unsigned short storage_offset; + Name_Entry name_record[1]; +} Table_name; + +/* TrueType 'maxp' table */ +typedef struct +{ + Fixed version; + unsigned short numGlyphs; // number of Glyphs + unsigned short maxPoints; + unsigned short maxContours; + unsigned short maxCompositePoints; + unsigned short maxCompositeContours; + unsigned short maxZones; + unsigned short maxTwilightPoints; + unsigned short maxStorage; + unsigned short maxFunctionDefs; + unsigned short maxInstructionDefs; + unsigned short maxStackElements; + unsigned short maxSizeOfInstructions; + unsigned short maxComponentElements; + unsigned short maxComponentDepth; +} Table_maxp; + +/* TrueType Font Header table */ +typedef struct +{ + Fixed table_version; + Fixed font_revision; + unsigned long checksum_adjust; + unsigned long magic_number; + unsigned short flags; + unsigned short units_per_EM; + LONGDT created; + LONGDT modified; + short xMin; + short yMin; + short xMax; + short yMax; + unsigned short mac_style; + unsigned short lowest_rec_PPEM; + short font_direction; + short index_to_loc_format; // format of 'loca' table + short glyph_data_format; +} Table_head; + +typedef struct +{ + Fixed table_version; + short ascender; /* typographic ascent */ + short descender; /* typographic descent */ + short line_gap; /* typographic line gap */ + unsigned short advance_width_max; /* Maximum advance width value in ‘hmtx’ table */ + short min_left_sidebearing; + short min_right_sidebearing; /* Min(aw - lsb - (xMax - xMin)) */ + short xMaxExtent; /* Max(lsb + (xMax - xMin)) */ + short caret_slope_rise; + short caret_slope_run; + short first_reserved; + short second_reserved; + short third_reserved; + short fourth_reserved; + short fifth_reserved; + short metric_data_format; + unsigned short number_of_hMetrics; +} Table_hhea; + +typedef struct +{ + unsigned short table_version; + short xAvgCharWidth; + unsigned short usWeightClass; + unsigned short usWidthClass; + short fsType; + short ySubscriptXSize; + short ySubscriptYSize; + short ySubscriptXOffset; + short ySubscriptYOffset; + short ySuperscriptXSize; + short ySuperscriptYSize; + short ySuperscriptXOffset; + short ySuperscriptYOffset; + short yStrikeoutSize; + short yStrikeoutPosition; + short sFamilyClass; +// PANOSE panose; + unsigned char panose[10]; + unsigned long ulUnicodeRange1; + unsigned long ulUnicodeRange2; + unsigned long ulUnicodeRange3; + unsigned long ulUnicodeRange4; + unsigned char achVendID[4]; + unsigned short fsSelection; + unsigned short usFirstCharIndex; + unsigned short usLastCharIndex; + unsigned short sTypoAscender; + unsigned short sTypoDescender; + unsigned short sTypoLineGap; + unsigned short sWinAscent; + unsigned short sWinDescent; + unsigned long ulCodePageRange1; + unsigned long ulCodePageRange2; +} Table_os2; + +typedef struct +{ + unsigned short platform; //identifier of platform + unsigned short encodingID; //identifier fo encoding + unsigned long table_offset; //offset of the encoding table +} Cmap_Entry; + +typedef struct +{ + unsigned short table_version; // =0 + unsigned short numSubTables; //number subtables + Cmap_Entry tableHeaders[1]; //headers of subtables +} Table_cmap; + +typedef struct +{ + Fixed format; //format type + Fixed italic_angle; + short underlineOffset; + short underlineThickness; + unsigned long isFixedPitch; + unsigned long minMemType42; + unsigned long maxMemType42; + unsigned long minMemType1; + unsigned long maxMemType1; +} Table_post; + +/* first part of the encoding table identical for all format of them */ +typedef struct +{ + unsigned short format; + unsigned short length; //length in bytes + unsigned short version; +} Table_encode_header; + +/* +typedef struct +{ + unsigned short format; // =0,2,4,6 + unsigned short length; // size + unsigned short version; + unsigned char map[256]; +} Table_encode_0; + + +typedef struct +{ +// unsigned short segCountX2; // 2 x segCount + unsigned short search_range; // 2 x (2**floor(log_2(segCount))) + unsigned short entry_selector; // log_2(search_range/2) + unsigned short range_shift; // 2 x segCount - search_range + unsigned short end_count[1]; // end characterCode for each segment, last =0xFFFF, length = segCount + unsigned short reservedPad; // = 0 + unsigned short start_count[1]; // Start character code for each segment, length = segCount + unsigned short idDelta[1]; // Delta for all character codes in segment, length = segCount + unsigned short idRangeOffset[1]; // Offsets into glyphIdArray or 0, length = segCount + unsigned short glyphIdArray[]; // Glyph index array (arbitrary length) +} Table_encode_4; +*/ + +typedef struct +{ + short number_of_contours; // <0 for composite glyph + short xMin; + short yMin; + short xMax; + short yMax; +} Glyph_header; + +template // n = number_of_contours from Glyph_header +struct SimpleGlyphDescription +{ + unsigned short endPtsOfContours[n]; + unsigned short instruction_length; +// unsigned char instructions[instruction_length]; +// unsigned char flags[n]; +// unsigned char(short) xCoordinates[n]; +// unsigned char(short) yCoordinates[n]; +}; + +int parseCmapTable(FILE* tt_file, TableEncode* te); +int parseNameTable(FILE* tt_file, wchar_t** familyName, wchar_t** psName, StyleName* fontStyle); +int parseHeadTable(FILE* tt_file, float* bbox, short* format, unsigned short* unitsPerEm); +int parseHheaTable(FILE* tt_file, unsigned short* numOfHMetrics, float* ascent, float* descent, float* lineGap); +int parseMaxpTable(FILE* tt_file, unsigned short *numGlyphs); +int parseLocaTable(FILE* tt_file, GlyphOffsets* gOffsets, unsigned short numGlyphs); +int parseOs2Table(FILE* tt_file, float* strikeOutSize, float* strikeOutOffset); +int parsePostTable(FILE* tt_file, short* uOffset, short* uThickness); +int parseGlyphData(FILE* tt_file, const GlyphOffsets gO, unsigned short numGlyphs, unsigned short glyphIndex, TTCurve *curve, short* bRect, float transform); +int parseHmtxTable(FILE* tt_file, unsigned short numOfHMetrics, HMetrics** hm); +bool isCompositeGlyph(FILE* tt_file, const GlyphOffsets gO, unsigned short numGlyphs, unsigned short glyphIndex); + +#endif Index: modules/awt/src/main/native/fontlib/shared/Outline.cpp =================================================================== --- modules/awt/src/main/native/fontlib/shared/Outline.cpp (revision 0) +++ modules/awt/src/main/native/fontlib/shared/Outline.cpp (revision 0) @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev, Viskov Nikolay + * @version $Revision$ + */ +#include "Outline.h" + +Outline::Outline(unsigned short pointsNumber, unsigned short commandNumber) { + pointsCount = 0; + commandsCount = 0; + + _points = new float[_pointsLength = pointsNumber]; + _commands = new unsigned char[_commandLenght = commandNumber]; + + /*for (commandsCount = 0 ; commandsCount < commandNumber; commandsCount ++) { + this->_commands[commandsCount] = SEG_CLOSE; + } + + commandsCount = 0;*/ +} + +Outline::~Outline() { + delete[] _points; + delete[] _commands; +} + +void Outline::trim() { + if (_commandLenght == commandsCount) { + return; + } + + //printf("_length = %u, commandsCount = %u\n", _commandLenght, commandsCount); + + unsigned char *commandMas = new unsigned char[commandsCount]; + float *pointsMas = new float[pointsCount]; + + memcpy(commandMas, _commands, commandsCount); + memcpy(pointsMas, _points, pointsCount * sizeof(float)); + + delete[] _points; + delete[] _commands; + + _points = pointsMas; + _commands = commandMas; + + _commandLenght = commandsCount; + _pointsLength = pointsCount; +} + +void Outline::lineTo(float x, float y) { + _points[pointsCount ++] = x; + _points[pointsCount ++] = -y; + _commands[commandsCount ++] = SEG_LINETO; + //printf("SEG_LINETO "); +} + +void Outline::moveTo(float x, float y) { + _commands[commandsCount ++] = SEG_MOVETO; + _points[pointsCount ++] = x; + _points[pointsCount ++] = -y; +// printf("SEG_MOVETO "); +} + +void Outline::quadTo(float x1, float y1, float x2, float y2) { + _points[pointsCount ++] = x1; + _points[pointsCount ++] = -y1; + _points[pointsCount ++] = x2; + _points[pointsCount ++] = -y2; + _commands[commandsCount ++] = SEG_QUADTO; + //printf("SEG_QUADTO "); +} + +void Outline::curveTo(float x1, float y1, float x2, float y2, float x3, float y3) { + _points[pointsCount ++] = x1; + _points[pointsCount ++] = -y1; + _points[pointsCount ++] = x2; + _points[pointsCount ++] = -y2; + _points[pointsCount ++] = x3; + _points[pointsCount ++] = -y3; + _commands[commandsCount ++] = SEG_CUBICTO; + //printf("SEG_CUBICTO "); +} + +void Outline::closePath(void) { + //if (_commands[commandsCount - 1] != SEG_CLOSE) { + _commands[commandsCount ++] = SEG_CLOSE; + //} + /*else { + printf("two close path\n"); + }*/ + //printf("SEG_CLOSE\n"); +} + +unsigned short Outline::getPointsLength(void) { + return _pointsLength; +} + +unsigned short Outline::getCommandLength(void) { + return _commandLenght; +} Index: modules/awt/src/main/native/fontlib/shared/T1Font.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/T1Font.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/T1Font.h (revision 0) @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Viskov Nikolay + * @version $Revision$ + */ +#ifndef __TYPE_1_FONT_CLASS_H +#define __TYPE_1_FONT_CLASS_H + +#include +#include + +#include "Font.h" +#include "Type1Structs.h" + +class T1Font : public Font { +public: + T1Font(wchar_t *family, StyleName sn, char* pathToFile); + ~T1Font(void); + Glyph* createGlyph(unsigned short unicode, unsigned short size); + wchar_t* getPSName(); + float* getLineMetrics(); + bool canDisplay(unsigned short c); + + unsigned short getUnicodeByIndex(unsigned short ind); + +// float* GetExtraMetrics(); + + +private: + void initFont(FILE *font); + void parseAFM(FILE *font); + Type1Map subrsMap;//number -- subrutine + Type1Map charStringMap;//unicode -- info + + //Type1AFMMap afmMap;//unicode -- afm string + + Type1GlyphCodeMap glyphCodeMap;//glyphCode -- unicode + + wchar_t *fullName; + + float matrixScale; +}; + +#endif //__TYPE_1_FONT_CLASS_H Index: modules/awt/src/main/native/fontlib/shared/TTFont.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/TTFont.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/TTFont.h (revision 0) @@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev + * @version $Revision$ + */ +#ifndef __TTFONT_H__ +#define __TTFONT_H__ + +#include "Font.h" +#include "Glyph.h" +#include "Outline.h" +#include "TTCurve.h" + +typedef struct +{ + short format; //format of the 'loca' table + unsigned long* offsets; +} GlyphOffsets; + +typedef struct +{ + short format; + void* TableEncode; +} TableEncode; + +typedef struct +{ + unsigned short adwance_width; + short lsb; +}HMetrics; + +class TTGlyph; + +class TTFont:public Font +{ +friend class TTGlyph; +private: + char* _pathToFile; // path to font file + wchar_t *_psName; // postscript name of font + GlyphOffsets _glyphOffsets; //glyphs offsets in font file + TableEncode _tableEncode; // table with indexes of glyphs + unsigned short _unitsPerEm; //size of em-square + unsigned short _numOfHMetrics; // for 'hmtx' table + HMetrics* _hMetrics; // horizontal metrics for all glyphs + FILE* _ttfile; + + unsigned short getGlyphIndex(unsigned short symb); + unsigned short getUnicodeByIndex(unsigned short ind); +// friend unsigned short TTGlyph::getGlyphIndex(unsigned short symb); +// friend int TTGlyph::initialize(); + +public: + TTFont(char* pathToFile); + ~TTFont(void); + + Glyph* createGlyph(unsigned short unicode, unsigned short size); + wchar_t* getPSName(); + float* getLineMetrics(); + bool canDisplay(unsigned short c); + +// float* GetExtraMetrics(); +}; + + +class TTGlyph : public Glyph { +private: + TTFont* _ttfont; + unsigned short _index; + TTCurve* _curve; + short _boundingRect[4]; + + + friend Glyph* TTFont::createGlyph(unsigned short unicode, unsigned short size); + +public: + TTGlyph(TTFont *font, unsigned short unicode, unsigned short size); + ~TTGlyph(); + Outline* getOutline(void); + float* getGlyphMetrics(void); +}; + +#endif //__TTFONT_H__ Index: modules/awt/src/main/native/fontlib/shared/Glyph.cpp =================================================================== --- modules/awt/src/main/native/fontlib/shared/Glyph.cpp (revision 0) +++ modules/awt/src/main/native/fontlib/shared/Glyph.cpp (revision 0) @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev, Viskov Nikolay + * @version $Revision$ + */ +#include "Glyph.h" + +Glyph::Glyph() { +} + +Glyph::~Glyph(void) { +} + +Outline* Glyph::getOutline(void){ + return NULL; +} + +float* Glyph::getGlyphMetrics(void){ + return NULL; +} Index: modules/awt/src/main/native/fontlib/shared/Outline.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/Outline.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/Outline.h (revision 0) @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev, Viskov Nikolay + * @version $Revision$ + */ +#ifndef __SHARED_OUTLINE_CLASS_H +#define __SHARED_OUTLINE_CLASS_H + +#include + +/*typedef enum { + SEG_CLOSE = 0, + SEG_LINETO = 1, + SEG_MOVETO = 2, + SEG_CUBICTO = 3, + SEG_QUADTO = 4 +} SegmentType;*/ + +/*typedef enum SegmentTypeTag { + SEG_MOVETO = 0, + SEG_LINETO = 1, + SEG_QUADTO = 2, + SEG_CUBICTO = 3, + SEG_CLOSE = 4 +} SegmentType;*/ + +static const unsigned char SEG_MOVETO = 0; +static const unsigned char SEG_LINETO = 1; +static const unsigned char SEG_QUADTO = 2; +static const unsigned char SEG_CUBICTO = 3; +static const unsigned char SEG_CLOSE = 4; + +class Outline { +public: + + Outline(unsigned short pointsNumber, unsigned short commandNumber); + + ~Outline(); + + void lineTo(float x, float y); + + void moveTo(float x, float y); + + void quadTo(float x1, float y1, float x2, float y2); + + void curveTo(float x1, float y1, float x2, float y2, float x3, float y3); + + void closePath(void); + + unsigned short getPointsLength(void); + unsigned short getCommandLength(void); + + void trim(void); + + float *_points; + unsigned char *_commands; + +private: + unsigned short _pointsLength; + unsigned short _commandLenght; + + unsigned short pointsCount; + unsigned short commandsCount; +}; + +#endif //__SHARED_OUTLINE_CLASS_H Index: modules/awt/src/main/native/fontlib/shared/T1Glyph.cpp =================================================================== --- modules/awt/src/main/native/fontlib/shared/T1Glyph.cpp (revision 0) +++ modules/awt/src/main/native/fontlib/shared/T1Glyph.cpp (revision 0) @@ -0,0 +1,494 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Viskov Nikolay + * @version $Revision$ + */ +#include "T1Glyph.h" + +T1Glyph::T1Glyph(Type1Map *charStringMap, Type1Map *subrsMap, unsigned short unicode, unsigned short size, float relativeSize, float* fontBB):Glyph() { + _charStringMap = charStringMap; + _subrsMap = subrsMap; + _unicode = unicode; + _size = size; + _relativeSize = relativeSize; + + _advanceX = 0; + _advanceY = 0; + + _glyphBB[0] = fontBB[0] * relativeSize; + _glyphBB[1] = fontBB[1] * relativeSize; + _glyphBB[2] = fontBB[2] * relativeSize; + _glyphBB[3] = fontBB[3] * relativeSize; +} + +T1Glyph::~T1Glyph() { +} + +void T1Glyph::parseValueToOutline(EncodedValue *value, std::stack *stack, Outline *out, float *curX, float *curY, float relativeSize){ + float x1, y1, x2, y2, x3, y3; + + unsigned char curChar; + + for (unsigned short count = 0; count < value->length; count ++) { + + curChar = value->text[count]; + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("\nchar = %u, ", curChar); + #endif + + if (curChar > 31) { + if (curChar > 31 && curChar < 247) { // -107 to 107 + stack->push((float) (curChar - 139)); + } else if (curChar > 246 && curChar < 251) { // 108 to 1131 + stack->push((float) ((curChar - 247) * 256 + 108 + (unsigned char)(value->text[++count]))); + } else if (curChar > 250 && curChar < 255) { // -1131 to -108 + stack->push((float) ((curChar - 251) * (-256) - 108 - (unsigned char)(value->text[++count]))); + } else if (curChar == 255) { // int + stack->push((float) ((curChar << 24) + (unsigned char)((value->text[++count]) << 16) + + (unsigned char)((value->text[++count]) << 8) + (unsigned char)(value->text[++count]))); + } + } else { + switch (curChar) { + case CH_STR_VMOVETO: {// vmoveto + *curY += stack->top() * relativeSize; + stack->pop(); + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("moveTo( %f, %f), ",*curX, *curY); + #endif + out->moveTo(*curX, *curY); + break; + } + case CH_STR_RLINETO : {// rlineto + *curY += (float) stack->top() * relativeSize; + stack->pop(); + *curX += (float) stack->top() * relativeSize; + stack->pop(); + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("lineTo( %f, %f), ",*curX, *curY); + #endif + out->lineTo(*curX, *curY); + break; + } + case CH_STR_HLINETO : {// hlineto + *curX += (float) stack->top() * relativeSize; + stack->pop(); + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("lineTo( %f, %f), ",*curX, *curY); + #endif + out->lineTo(*curX, *curY); + break; + } + case CH_STR_VLINETO : {// vlineto + *curY += (float) stack->top() * relativeSize; + stack->pop(); + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("lineTo( %f, %f), ",*curX, *curY); + #endif + out->lineTo(*curX, *curY); + break; + } + case CH_STR_RRCURVETO : {// rrcurveto equivalent to dx1 dy1 (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) (dy1+dy2+dy3) rcurveto. + y3 = (float) stack->top() * relativeSize; + stack->pop(); + x3 = (float) stack->top() * relativeSize; + stack->pop(); + y2 = (float) stack->top() * relativeSize; + stack->pop(); + x2 = (float) stack->top() * relativeSize; + stack->pop(); + y1 = (float) stack->top() * relativeSize; + stack->pop(); + x1 = (float) stack->top() * relativeSize; + stack->pop(); + + x1 += *curX; + y1 += *curY; + x2 += x1; + y2 += y1; + x3 += x2; + y3 += y2; + *curX = x3; + *curY = y3; + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("curveTo( %f, %f, %f, %f, %f, %f), ",x1, y1, x2, y2, x3, y3); + #endif + out->curveTo(x1, y1, x2, y2, x3, y3); + break; + } + //case CH_STR_ENDCHAR : + case CH_STR_CLOSEPATH : {// closePath + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("closePath"); + #endif + out->closePath(); + break; + } + case CH_STR_CALLSUBR : {// callsubr + x1 = (float) stack->top(); + stack->pop(); + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("call subr = %f, ", x1); + #endif + + parseValueToOutline((*_subrsMap)[(const unsigned short)x1], stack, out, curX, curY, relativeSize); + break; + } + case CH_STR_HSBW : {// hsbw + y1 = (float) stack->top() * relativeSize; + stack->pop(); + x1 = (float) stack->top() * relativeSize; + stack->pop(); + + _advanceX = y1; + _advanceY = 0; + + _glyphBB[0] = x1; + _glyphBB[2] = y1; + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("hsbw = %f,%f ; ", x1, y1); + #endif + + *curX = x1; + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("moveTo( %f, %f), ",*curX, *curY); + #endif + + out->moveTo(*curX, *curY); + break; + } + case CH_STR_RMOVETO : {// rmoveto + *curY += (float) stack->top() * relativeSize; + stack->pop(); + *curX += (float) stack->top() * relativeSize; + stack->pop(); + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("moveTo( %f, %f), ",*curX, *curY); + #endif + out->moveTo(*curX, *curY); + break; + } + case CH_STR_HMOVETO : {// hmoveto + *curX += (float) stack->top() * relativeSize; + stack->pop(); + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("moveTo( %f, %f), ",*curX, *curY); + #endif + out->moveTo(*curX, *curY); + break; + } + case CH_STR_VHCURVETO : {// vhcurveto + y3 = 0; + x3 = (float) stack->top() * relativeSize; + stack->pop(); + y2 = (float) stack->top() * relativeSize; + stack->pop(); + x2 = (float) stack->top() * relativeSize; + stack->pop(); + y1 = (float) stack->top() * relativeSize; + stack->pop(); + x1 = 0; + + x1 += *curX; + y1 += *curY; + x2 += x1; + y2 += y1; + x3 += x2; + y3 += y2; + *curX = x3; + *curY = y3; + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("curveTo( %f, %f, %f, %f, %f, %f), ",x1, y1, x2, y2, x3, y3); + #endif + out->curveTo(x1, y1, x2, y2, x3, y3); + break; + } + case CH_STR_HVCURVETO : {// hvcurveto + y3 = (float) stack->top() * relativeSize; + stack->pop(); + x3 = 0; + y2 = (float) stack->top() * relativeSize; + stack->pop(); + x2 = (float) stack->top() * relativeSize; + stack->pop(); + y1 = 0; + x1 = (float) stack->top() * relativeSize; + stack->pop(); + + x1 += *curX; + y1 += *curY; + x2 += x1; + y2 += y1; + x3 += x2; + y3 += y2; + *curX = x3; + *curY = y3; + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("curveTo( %f, %f, %f, %f, %f, %f), ",x1, y1, x2, y2, x3, y3); + #endif + out->curveTo(x1, y1, x2, y2, x3, y3); + break; + } + case CH_STR_ESCAPE : {// escape command + curChar = value->text[++count]; + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("escape command = %u, ", curChar); + #endif + if (curChar == CH_STR_ESCAPE_SEAC) {//seak + x3 = (float) stack->top(); + stack->pop(); + y2 = (float) stack->top(); + stack->pop(); + x2 = (float) stack->top() * relativeSize; + stack->pop(); + y1 = (float) stack->top() * relativeSize; + stack->pop(); + x1 = (float) stack->top() * relativeSize; + stack->pop(); + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("seak = %f,%f,%f,%f,%f ; ", x1, y1, x2, y2, x3); + #endif + + unsigned short aX = (unsigned short) _advanceX; + unsigned short aY = (unsigned short) _advanceY; + + float tempGlyphBB[4]; + + memcpy(tempGlyphBB, _glyphBB, 4 * sizeof(float)); + + parseValueToOutline((*_charStringMap)[STANDART_ENCODING[(unsigned short)y2]], stack, out, curX, curY, relativeSize); + + *curY = x2; + *curX = y1; + out->moveTo(*curX, *curY); + + parseValueToOutline((*_charStringMap)[STANDART_ENCODING[(unsigned short)x3]], stack, out, curX, curY, relativeSize); + + _advanceX = aX; + _advanceY = aY; + + memcpy(_glyphBB, tempGlyphBB, 4 * sizeof(float)); + + break; + } else if (curChar == CH_STR_ESCAPE_SBW) { //sbw + y2 = (float) stack->top() * relativeSize; + stack->pop(); + x2 = (float) stack->top() * relativeSize; + stack->pop(); + y1 = (float) stack->top() * relativeSize; + stack->pop(); + x1 = (float) stack->top() * relativeSize; + stack->pop(); + + _advanceX = x1; + _advanceY = y1; + + _glyphBB[0] = x1; + _glyphBB[1] = y1; + _glyphBB[2] = x2; + _glyphBB[3] = y2; + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("sbw = %f,%f,%f,%f ; ", x1, y1, x2, y2); + #endif + + *curX = x2; + *curY = y2; + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("moveTo( %f, %f), ",*curX, *curY); + #endif + out->moveTo(*curX, *curY); + break; + } else if (curChar == CH_STR_ESCAPE_DIV) {//div + y1 = (float) stack->top(); + stack->pop(); + x1 = (float) stack->top(); + stack->pop(); + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("div (%f/%f) ", x1, y1); + #endif + stack->push(x1 / y1); + break; + } else { + } + } + } + } + } +} + +void T1Glyph::countPoints(std::stack *stack, EncodedValue *value, unsigned short *point, unsigned short *command) { + unsigned char curChar; + + for (unsigned short count = 0; count < value->length; count ++) { + + curChar = value->text[count]; + + if (curChar > 31) { + if (curChar > 31 && curChar < 247) { // -107 to 107 + stack->push((float) (curChar - 139)); + } else if (curChar > 246 && curChar < 251) { // 108 to 1131 + stack->push((float) ((curChar - 247) * 256 + 108 + (unsigned char)(value->text[++count]))); + } else if (curChar > 250 && curChar < 255) { // -1131 to -108 + stack->push((float) ((curChar - 251) * (-256) - 108 - (unsigned char)(value->text[++count]))); + } else if (curChar == 255) { // int + stack->push((float) ((curChar << 24) + (unsigned char)((value->text[++count]) << 16) + + (unsigned char)((value->text[++count]) << 8) + (unsigned char)(value->text[++count]))); + } + } else { + switch (curChar) { + case CH_STR_RLINETO: + case CH_STR_HLINETO: + case CH_STR_VLINETO: + case CH_STR_VMOVETO: + case CH_STR_RMOVETO: + case CH_STR_HMOVETO: + case CH_STR_HSBW: {// HSBW + *point += 2; + *command += 1; + break; + } + case CH_STR_RRCURVETO: + case CH_STR_VHCURVETO: + case CH_STR_HVCURVETO: {// rrcurveto equivalent to dx1 dy1 (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) (dy1+dy2+dy3) rcurveto. + *point += 6; + *command += 1; + break; + } + //case CH_STR_ENDCHAR : + case CH_STR_CLOSEPATH : {// closePath + *command += 1; + break; + } + case CH_STR_CALLSUBR : {// callsubr + unsigned short com = (unsigned short) stack->top(); + stack->pop(); + + countPoints(stack, (*_subrsMap)[com], point, command); + break; + } + case CH_STR_ESCAPE : {// escape command + curChar = value->text[++count]; + if (curChar == CH_STR_ESCAPE_DIV) {//div + break; + } else if (curChar == CH_STR_ESCAPE_SEAC) {//seac + unsigned short achar = (unsigned short) stack->top(); + stack->pop(); + unsigned short bchar = (unsigned short) stack->top(); + stack->pop(); + + *point += 2; + *command += 1; + + countPoints(stack, (*_charStringMap)[STANDART_ENCODING[bchar]], point, command); + countPoints(stack, (*_charStringMap)[STANDART_ENCODING[achar]], point, command); + + break; + } else if (curChar == CH_STR_ESCAPE_SBW) { //sbw + *point += 2; + *command += 1; + break; + } + break; + } + } + } + } +} + +float* T1Glyph::getGlyphMetrics(void){ + if ((_advanceX == 0) && (_advanceY == 0)) { + getOutline(); + } + + float* gMetrics = new float[6]; + + gMetrics[0] = _advanceX; + gMetrics[1] = _advanceY; + gMetrics[2] = _glyphBB[0]; + gMetrics[3] = _glyphBB[1]; + gMetrics[4] = _glyphBB[2]; + gMetrics[5] = _glyphBB[3]; + + return gMetrics; +} + +Outline* T1Glyph::getOutline(void){ + float curX, curY; + curX = curY = 0; + unsigned short point, command; + point = command = 0; + Outline *out;// = new Outline((unsigned short)200,(unsigned short)200); + std::stack *stack = new std::stack(); + EncodedValue *value; + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("\n"); + #endif + Type1Map::iterator iter = _charStringMap->find(_unicode); + if (iter == _charStringMap->end()) { + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("default\n"); + #endif + value = (*_charStringMap)[0]; + } else { + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("found value\n"); + #endif + value = (EncodedValue *)iter->second; + } + + if (!value) { + delete stack; + return NULL; + } + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("_unicode = %u\n",_unicode); + #endif + + countPoints( stack, value, &point, &command); + + #ifdef GLYPH_OUTLINE_CREATE_DEBUG + printf("final point = %u, command = %u\n", point, command); + #endif + + out = new Outline(point, command); + + parseValueToOutline(value, stack, out, &curX, &curY, _relativeSize); + + delete stack; + + //out->trim(); + + return out; +} Index: modules/awt/src/main/native/fontlib/shared/Glyph.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/Glyph.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/Glyph.h (revision 0) @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev, Viskov Nikolay + * @version $Revision$ + */ +#ifndef __SHARED_GLYPH_CLASS_H +#define __SHARED_GLYPH_CLASS_H + +#include "Outline.h" + +class Glyph { +public: + Glyph(); + virtual ~Glyph(void); + virtual Outline* getOutline(void); + virtual float* getGlyphMetrics(void); + +//protected: + unsigned short _size; + unsigned short _unicode; + float _advanceX; + float _advanceY; +}; + +#endif //__SHARED_GLYPH_CLASS_H Index: modules/awt/src/main/native/fontlib/shared/TTCurve.cpp =================================================================== --- modules/awt/src/main/native/fontlib/shared/TTCurve.cpp (revision 0) +++ modules/awt/src/main/native/fontlib/shared/TTCurve.cpp (revision 0) @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Dmitriy S. Matveev + * @version $Revision$ + */ +#include "TTCurve.h" +#include "memory.h" + +TTCurve::TTCurve() +{ + _len = 0; + _outlineCommandsNumb = 1; // for last closePath(); + _coords = 0; + _flags = 0; +} + +TTCurve::~TTCurve() +{ + delete[] _coords; + delete[] _flags; +} + +int TTCurve::add(float x, float y, unsigned char flag) +{ + _len +=2; + + if (flag == OPEN_FLAG && _outlineCommandsNumb) + _outlineCommandsNumb+=2; + else if (flag != 0) + _outlineCommandsNumb++; + + float* tmpC = _coords; + unsigned char* tmpF = _flags; + + _coords = new float[_len]; + _flags = new unsigned char[(_len+1)/2]; + + memcpy(_coords,tmpC,(_len-2)*sizeof(float)); + _coords[_len-2] = x; + _coords[_len-1] = y; + + memcpy(_flags,tmpF,(_len-1)/2); + _flags[(_len-1)/2] = flag; + + delete[] tmpC; + delete[] tmpF; + return 0; +} Index: modules/awt/src/main/native/fontlib/shared/T1Glyph.h =================================================================== --- modules/awt/src/main/native/fontlib/shared/T1Glyph.h (revision 0) +++ modules/awt/src/main/native/fontlib/shared/T1Glyph.h (revision 0) @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +/** + * @author Viskov Nikolay + * @version $Revision$ + */ +#ifndef __TYPE_1_GLYPH_CLASS_H +#define __TYPE_1_GLYPH_CLASS_H + +#include +#include "Glyph.h" +#include "Outline.h" +#include "Type1Structs.h" + +class T1Glyph : public Glyph { +private: + Type1Map *_charStringMap; + Type1Map *_subrsMap; + + float _relativeSize; + float _glyphBB[4]; + + void parseValueToOutline(EncodedValue *value, std::stack *stack, Outline *out, float *curX, float *curY, float relativeSize); + void countPoints(std::stack *stack, EncodedValue *value, unsigned short *point, unsigned short *command); + +public: + T1Glyph(Type1Map *charStringMap, Type1Map *subrsMap, unsigned short unicode, unsigned short size, float relativeSize, float* fontBB); + ~T1Glyph(); + Outline* getOutline(void); + float* getGlyphMetrics(void); +}; + +#endif //__TYPE_1_GLYPH_CLASS_H Index: modules/awt/src/main/native/fontlib/windows/fl.rc =================================================================== --- modules/awt/src/main/native/fontlib/windows/fl.rc (revision 0) +++ modules/awt/src/main/native/fontlib/windows/fl.rc (revision 0) @@ -0,0 +1,48 @@ +; +; Licensed to the Apache Software Foundation (ASF) under one or more +; contributor license agreements. See the NOTICE file distributed with +; this work for additional information regarding copyright ownership. +; The ASF licenses this file to You 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. +; + +#include +#include + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,1,0,0 + PRODUCTVERSION 0,1,0,0 + FILEFLAGSMASK 0x3fL + FILEFLAGS 0x0L + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "The Apache Software Foundation.\0" + VALUE "FileDescription", "FontLib native code\0" + VALUE "FileVersion", "0.1\0" + VALUE "InternalName", "FL\0" + VALUE "LegalCopyright", "(c) Copyright 2007 The Apache Software Foundation or its licensors, as applicable.\0" + VALUE "OriginalFilename", "FL.dll\0" + VALUE "ProductName", "Apache Harmony\0" + VALUE "ProductVersion", "0.1\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1200 + END +END Index: modules/awt/src/main/native/fontlib/windows/makefile =================================================================== --- modules/awt/src/main/native/fontlib/windows/makefile (revision 0) +++ modules/awt/src/main/native/fontlib/windows/makefile (revision 0) @@ -0,0 +1,49 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +!include <$(HY_HDK)\build\make\defines.mak> + +LIBBASE=FL +DLLNAME=..\$(LIBBASE).dll +LIBNAME=$(LIBPATH)$(LIBBASE).lib +HYLDFLAGS = $(HYLDFLAGS) -def:$(LIBBASE).def + +HYCFLAGS = $(HYCFLAGS) /I$(SHAREDSUB)include /I$(SHAREDSUB) \ + /EHsc + +BUILDFILES = \ + $(SHAREDSUB)fljni.obj \ + $(SHAREDSUB)EncodedValue.obj \ + $(SHAREDSUB)Environment.obj \ + $(SHAREDSUB)Font.obj \ + $(SHAREDSUB)Glyph.obj \ + $(SHAREDSUB)Outline.obj \ + $(SHAREDSUB)ParsingTables.obj \ + $(SHAREDSUB)T1Font.obj \ + $(SHAREDSUB)T1Glyph.obj \ + $(SHAREDSUB)TTCurve.obj \ + $(SHAREDSUB)TTFont.obj + +VIRTFILES = $(LIBBASE).res +SYSLIBFILES = ws2_32.lib Iphlpapi.lib + +MDLLIBFILES = $(MDLLIBFILES) \ + $(LIBPATH)hypool.lib $(LIBPATH)vmi.lib \ + $(LIBPATH)hyzlib.lib + +DLLBASE=0x13300000 +COMMENT=/comment:"FontLib native code. (c) Copyright 2005 - 2007 The Apache Software Foundation or its licensors, as applicable." + +!include <$(HY_HDK)\build\make\rules.mak> Index: modules/awt/src/main/native/fontlib/windows/fl.def =================================================================== --- modules/awt/src/main/native/fontlib/windows/fl.def (revision 0) +++ modules/awt/src/main/native/fontlib/windows/fl.def (revision 0) @@ -0,0 +1,7 @@ +LIBRARY FL + +SECTIONS + .data READ WRITE + .text EXECUTE READ + +EXPORTS Index: modules/awt/build.xml =================================================================== --- modules/awt/build.xml (revision 545729) +++ modules/awt/build.xml (working copy) @@ -178,6 +178,16 @@ + + + + + + + + + +