diff --git a/build.gradle b/build.gradle index 8e2e8b627b..671e64fb95 100644 --- a/build.gradle +++ b/build.gradle @@ -67,10 +67,10 @@ allprojects { implementation 'com.fr.third:jxbrowser:6.23' implementation 'com.fr.third:jxbrowser-mac:6.23' implementation 'com.fr.third:jxbrowser-win64:6.23' - implementation 'com.fr.third:jxbrowser-v7:7.15' - implementation 'com.fr.third:jxbrowser-mac-v7:7.15' - implementation 'com.fr.third:jxbrowser-win64-v7:7.15' - implementation 'com.fr.third:jxbrowser-swing-v7:7.15' + implementation 'com.fr.third:jxbrowser-v7:7.22' + implementation 'com.fr.third:jxbrowser-mac-v7:7.22' + implementation 'com.fr.third:jxbrowser-win64-v7:7.22' + implementation 'com.fr.third:jxbrowser-swing-v7:7.22' implementation 'com.fr.third.server:servlet-api:3.0' implementation 'org.swingexplorer:swexpl:2.0.1' implementation 'org.swingexplorer:swag:1.0' diff --git a/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java b/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java index 3eb3b78579..013c703fb2 100644 --- a/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java +++ b/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java @@ -4,6 +4,7 @@ import com.fr.base.Parameter; import com.fr.base.ParameterConfig; import com.fr.base.TableData; import com.fr.base.io.BaseBook; +import com.fr.base.param.ParameterSource; import com.fr.data.TableDataSource; import com.fr.data.operator.DataOperator; import com.fr.design.file.HistoryTemplateListCache; @@ -19,8 +20,8 @@ import com.fr.stable.Filter; import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; import com.fr.stable.js.WidgetName; - import com.fr.util.ParameterApplyHelper; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -283,9 +284,9 @@ public abstract class DesignModelAdapter map, ParameterProvider[] parameterProviders, Filter filter) { if (filter != null) { - ParameterApplyHelper.addPara2Map(map, parameterProviders, filter); + ParameterApplyHelper.addPara2Map(map, parameterProviders, filter, null, ParameterSource.DEFAULT_SOURCE); } else { - ParameterApplyHelper.addPara2Map(map, parameterProviders); + ParameterApplyHelper.addPara2Map(map, parameterProviders, null, ParameterSource.DEFAULT_SOURCE); } } @@ -378,7 +379,7 @@ public abstract class DesignModelAdapter map) { // 添加全局参数 Parameter[] glbParas = ParameterConfig.getInstance().getGlobalParameters(); - ParameterApplyHelper.addPara2Map(map, glbParas); + ParameterApplyHelper.addPara2Map(map, glbParas, null, ParameterSource.GLOBAL_SOURCE); } diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index b57ad6c7af..1905a6c5d8 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -214,6 +214,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { private boolean useOptimizedUPM4Adapter; + private boolean propertiesUsable; + /** * DesignerEnvManager. */ @@ -442,12 +444,35 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { private static File envFile = null; private File getEnvFile() { + checkDebugStart(); if (envFile == null) { envFile = new File(ProductConstants.getEnvHome() + File.separator + ProductConstants.APP_NAME + "Env.xml"); } return envFile; } + /** + * 在VM options里加入-Ddebug=true激活 + */ + private static void checkDebugStart() { + + if (ComparatorUtils.equals("true", System.getProperty("debug"))) { + setDebugEnv(); + } + } + + /** + * 端口改一下,环境配置文件改一下。便于启动两个设计器,进行对比调试 + */ + private static void setDebugEnv() { + + DesignUtils.setPort(DesignerPort.getInstance().getDebugMessagePort()); + DesignerEnvManager.setEnvFile(new File(StableUtils.pathJoin( + ProductConstants.getEnvHome(), + ProductConstants.APP_NAME + "Env_debug.xml" + ))); + } + /** * 是否启用了https * @@ -676,6 +701,14 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { this.useOptimizedUPM4Adapter = useOptimizedUPM4Adapter; } + public boolean isPropertiesUsable() { + return this.propertiesUsable; + } + + public void setPropertiesUsable(boolean propertiesUsable) { + this.propertiesUsable = propertiesUsable; + } + /** * 知否自动备份 * @@ -1900,6 +1933,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { this.setEmbedServerLazyStartup(reader.getAttrAsBoolean("embedServerLazyStartup", false)); this.setShowTemplateMissingPlugin(reader.getAttrAsBoolean("showTemplateMissingPlugin", true)); this.setUseOptimizedUPM4Adapter(reader.getAttrAsBoolean("useOptimizedUPM4Adapter", SupportOSImpl.MACOS_12_VERSION_ADAPTER.support())); + this.setPropertiesUsable(reader.getAttrAsBoolean("propertiesUsable", false)); this.setShowServerDatasetAuthTip(reader.getAttrAsBoolean("showServerDatasetAuthTip", true)); this.setLayoutTemplateStyle(reader.getAttrAsInt("layoutTemplateStyle", LAYOUT_TEMPLATE_SIMPLE_STYLE)); } @@ -2178,6 +2212,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { writer.attr("layoutTemplateStyle", this.getLayoutTemplateStyle()); writer.attr("showServerDatasetAuthTip", this.isShowServerDatasetAuthTip()); writer.attr("useOptimizedUPM4Adapter", this.isUseOptimizedUPM4Adapter()); + writer.attr("propertiesUsable", this.isPropertiesUsable()); writer.end(); } diff --git a/designer-base/src/main/java/com/fr/design/RestartHelper.java b/designer-base/src/main/java/com/fr/design/RestartHelper.java index 64fdda7baa..9c14fd4157 100644 --- a/designer-base/src/main/java/com/fr/design/RestartHelper.java +++ b/designer-base/src/main/java/com/fr/design/RestartHelper.java @@ -57,10 +57,8 @@ public class RestartHelper { properties.setProperty((i + size) + "", files[i]); } } - try { - FileOutputStream file2DeleteOutputStream = new FileOutputStream(file); + try (FileOutputStream file2DeleteOutputStream = new FileOutputStream(file)) { properties.store(file2DeleteOutputStream, "save"); - file2DeleteOutputStream.close(); } catch (IOException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } diff --git a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java index 530b466930..f45e84f205 100644 --- a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java @@ -378,9 +378,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp } protected boolean isDsNameRepeaded(String name) { - if (allDSNames == null) { - allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook()); - } + allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook()); for (int i = 0; i < allDSNames.length; i++) { if (ComparatorUtils.equals(name, allDSNames[i])) { return true; diff --git a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java index f7eb9bacc4..468982d96f 100644 --- a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java +++ b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java @@ -308,6 +308,17 @@ public abstract class DesignTableDataManager { return resMap; } + /** + * 不根据过滤设置,返回当前模板数据集,是有顺序的 + */ + public static java.util.Map getTemplateDataSet(TableDataSource source) { + java.util.Map resMap = new java.util.LinkedHashMap(); + // 模板数据集 + addTemplateData(resMap, source); + + return resMap; + } + public static java.util.Map getAllDataSetIncludingProcedure(java.util.Map resMap) { java.util.LinkedHashMap dsMap = new java.util.LinkedHashMap(); Iterator> entryIt = resMap.entrySet().iterator(); diff --git a/designer-base/src/main/java/com/fr/design/data/MapCompareUtils.java b/designer-base/src/main/java/com/fr/design/data/MapCompareUtils.java new file mode 100644 index 0000000000..f7492aefcc --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/MapCompareUtils.java @@ -0,0 +1,53 @@ +package com.fr.design.data; + +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author rinoux + * @version 10.0 + * Created by rinoux on 2022/3/28 + */ +public final class MapCompareUtils { + + + /** + * 对比两个map 查找出相比orig,other中有哪些是新增的、删除的或者被修改的,并分别进行处理 + * + * @param orig 原始map + * @param other 参考的新map + * @param eventHandler 有区别时的事件处理器 + * @param K + * @param V + */ + public static void contrastMapEntries(@NotNull Map orig, @NotNull Map other, @NotNull EventHandler eventHandler) { + + Map copiedOrig = new LinkedHashMap<>(orig); + + other.forEach((k, v) -> { + V existedV = copiedOrig.remove(k); + if (existedV != null) { + if (!v.equals(existedV)) { + eventHandler.on(EntryEventKind.UPDATED, k, v); + } + } else { + eventHandler.on(EntryEventKind.ADDED, k, v); + } + }); + + copiedOrig.forEach((k, v) -> eventHandler.on(EntryEventKind.REMOVED, k, v)); + } + + + public interface EventHandler { + void on(EntryEventKind entryEventKind, K k, V v); + } + + public enum EntryEventKind { + ADDED, + REMOVED, + UPDATED; + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java index 80471b9e65..0c000f5af7 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java @@ -1,7 +1,10 @@ package com.fr.design.data.datapane; import com.fr.base.BaseUtils; +import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.design.constants.UIConstants; +import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; +import com.fr.design.data.tabledata.wrapper.AbstractTableDataWrapper; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.gui.itree.refreshabletree.UserObjectRefreshJTree; @@ -17,6 +20,10 @@ import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import java.awt.Color; import java.awt.Component; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * TableData Tree @@ -24,6 +31,10 @@ import java.awt.Component; public class TableDataTree extends UserObjectRefreshJTree { private static final long serialVersionUID = 1L; + private static final String TABLE_DATA_NODE = "tableData"; + + private static final String COLUMN_NODE = "column"; + /** * Constructor. */ @@ -84,12 +95,13 @@ public class TableDataTree extends UserObjectRefreshJTree { this.tableDataTreeCellRenderer = tableDataTreeCellRenderer; } + @Override protected void refreshTreeNode(ExpandMutableTreeNode eTreeNode, String childName) { if (interceptRefresh(eTreeNode)) { return; } boolean refreshall = childName.isEmpty(); - ExpandMutableTreeNode[] new_nodes = loadChildTreeNodes(eTreeNode); + ExpandMutableTreeNode[] newNodes = loadChildTreeNodes(eTreeNode); java.util.List childTreeNodeList = new java.util.ArrayList(); for (int i = 0, len = eTreeNode.getChildCount(); i < len; i++) { @@ -102,30 +114,30 @@ public class TableDataTree extends UserObjectRefreshJTree { eTreeNode.removeAllChildren(); - for (int ci = 0; ci < new_nodes.length; ci++) { - Object cUserObject = new_nodes[ci].getUserObject(); + for (int ci = 0; ci < newNodes.length; ci++) { + Object cUserObject = newNodes[ci].getUserObject(); ExpandMutableTreeNode cTreeNode = null; for (int ni = 0, nlen = childTreeNodeList.size(); ni < nlen; ni++) { cTreeNode = (ExpandMutableTreeNode) childTreeNodeList.get(ni); if (ComparatorUtils.equals(cTreeNode.getUserObject(), cUserObject)) { if (!refreshall && !ComparatorUtils.equals(childName, ((NameObject) cUserObject).getName())) { - new_nodes[ci] = cTreeNode; + newNodes[ci] = cTreeNode; break; } - new_nodes[ci].setExpanded(cTreeNode.isExpanded()); + newNodes[ci].setExpanded(cTreeNode.isExpanded()); // REPORT-41299 如果建立的是错误的数据集(没有Child的情况)且这个错误数据集处于isExpanded状态,会在后面的if语句中调用getFirstChild()产生异常,因此这里判断一下 - if (cTreeNode.isExpanded() && cTreeNode.getChildCount() == 0) { - new_nodes[ci].setExpanded(false); + if (cTreeNode.getChildCount() == 0) { + newNodes[ci].setExpanded(false); break; } if (cTreeNode.getFirstChild() instanceof ExpandMutableTreeNode && cTreeNode.isExpanded()) { - checkChildNodes(cTreeNode, new_nodes[ci]); + checkChildNodes(cTreeNode, newNodes[ci]); } break; } } - eTreeNode.add(new_nodes[ci]); + eTreeNode.add(newNodes[ci]); } } @@ -140,9 +152,7 @@ public class TableDataTree extends UserObjectRefreshJTree { for (int k = 0; k < nodes.length; k++) { newChild.add(nodes[k]); } - if (newChild.getChildCount() > 1 && ((ExpandMutableTreeNode) newChild.getFirstChild()).getUserObject() == PENDING) { - newChild.remove(0); - } + removePending(newChild); if (ComparatorUtils.equals(oldChild.getUserObject(), newChild.getUserObject())) { newChild.setExpanded(oldChild.isExpanded()); } @@ -150,9 +160,100 @@ public class TableDataTree extends UserObjectRefreshJTree { } } + private void removePending(ExpandMutableTreeNode treeNode) { + if (treeNode.getChildCount() > 1 && ((ExpandMutableTreeNode) treeNode.getFirstChild()).getUserObject() == PENDING) { + treeNode.remove(0); + } + } + + @Override + public void refresh4TreeSearch() { + ExpandMutableTreeNode root = (ExpandMutableTreeNode) this.getModel().getRoot(); + refreshTreeNode4TreeSearch(root); + ((DefaultTreeModel) this.getModel()).reload(root); + root.expandCurrentTreeNode(this); + } + + /** + * 主要是处理节点是否应该添加为搜索结果,以及节点是否需要展开 + * + * @param root + */ + private void refreshTreeNode4TreeSearch(ExpandMutableTreeNode root) { + if (interceptRefresh(root)) { + return; + } + // 获取数据集子节点 + ExpandMutableTreeNode[] dsTreeNodes = loadChildTreeNodes(root); + root.removeAllChildren(); + for (ExpandMutableTreeNode dsTreeNode : dsTreeNodes) { + if (TableDataTreeSearchManager.getInstance().nodeNameMatches(dsTreeNode.getUserObject().toString())) { + // 加载数据列节点 + loadAndAddChildTreeChild(dsTreeNode); + // 处理子节点的展开 + dealWithNodeExpand(dsTreeNode); + // 添加数据集子节点 + root.add(dsTreeNode); + } + } + } + + /** + * 加载所有子节点,并添加到父节点中 + * + * @param treeNode + * @return + */ + private ExpandMutableTreeNode loadAndAddChildTreeChild(ExpandMutableTreeNode treeNode) { + if (isTreeNodeStoreProcedure(treeNode)) { + // 如果是存储过程,则再加载一次其子表节点,这里比较坑的就是存储过程不能使用loadChildTreeNodes + int tableChildCounts = treeNode.getChildCount(); + ExpandMutableTreeNode[] childs = new ExpandMutableTreeNode[tableChildCounts]; + for (int i = 0; i < tableChildCounts; i++) { + ExpandMutableTreeNode tableChild = (ExpandMutableTreeNode) treeNode.getChildAt(i); + loadAndAddChildTreeChild(tableChild); + childs[i] = tableChild; + removePending(tableChild); + } + treeNode.addChildTreeNodes(childs); + } else { + ExpandMutableTreeNode[] expandMutableTreeNodes = loadChildTreeNodes(treeNode); + treeNode.addChildTreeNodes(expandMutableTreeNodes); + } + removePending(treeNode); + return treeNode; + } + + /** + * 处理节点的展开,如果此节点是存储过程,还会处理其子表节点的展开 + * 只针对数据集节点 + * + * @param treeNode + * @return + */ + public ExpandMutableTreeNode dealWithNodeExpand(ExpandMutableTreeNode treeNode) { + String tableDataName = treeNode.getUserObject().toString(); + // 主要还是处理存储过程 + if (isTreeNodeStoreProcedure(treeNode)) { + int childCount = treeNode.getChildCount(); + for (int i = 0; i < childCount; i++) { + ExpandMutableTreeNode child = (ExpandMutableTreeNode) treeNode.getChildAt(i); + String nodeName = tableDataName + "_" + child.getUserObject().toString(); + if (TableDataTreeSearchManager.getInstance().nodeCanExpand(nodeName)) { + child.setExpanded(true); + } + } + } + if (TableDataTreeSearchManager.getInstance().nodeCanExpand(treeNode.getUserObject().toString())) { + treeNode.setExpanded(true); + } + return treeNode; + } + /* * p:获得选中的NameObject = name + tabledata. */ + @Override public NameObject getSelectedNameObject() { TreePath selectedTreePath = this.getSelectionPath(); if (selectedTreePath == null) { @@ -182,6 +283,108 @@ public class TableDataTree extends UserObjectRefreshJTree { } + /** + * 获得选中的数据集节点的NameObject的数组,只会返回数据集节点的NameObject + * 当多选了数据集或数据列时,也只返回选中的数据集 + */ + public NameObject[] getSelectedTableDataNameObjects() { + Map> tableDataNodesAndColumnNodes = getSelectedTableDataNodesAndColumnNodes(); + List tableDataNodes = tableDataNodesAndColumnNodes.get(TABLE_DATA_NODE); + if (tableDataNodes == null) { + return new NameObject[0]; + } + return tableDataNodes.stream().map(node -> (NameObject) node.getUserObject()).toArray(NameObject[]::new); + } + + /** + * 获取选中的数据集节点和列名节点 + * 其中存储过程的子表节点不计入数据集节点中,仅存储过程节点本身计入数据集节点 + * @return + */ + private Map> getSelectedTableDataNodesAndColumnNodes() { + TreePath[] selectedTreePaths = this.getSelectionPaths(); + if (selectedTreePaths == null) { + return new HashMap<>(); + } + Map> resultMap = new HashMap<>(); + List tableDataNodes = new ArrayList<>(); + List columnNodes = new ArrayList<>(); + resultMap.put(TABLE_DATA_NODE, tableDataNodes); + resultMap.put(COLUMN_NODE, columnNodes); + for (TreePath selectedTreePath : selectedTreePaths) { + if (selectedTreePath == null) { + continue; + } + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + if (isTableDataNodes(selectedTreeNode)) { + // 数据集节点 + tableDataNodes.add(selectedTreeNode); + } else { + // 列名节点 + columnNodes.add(selectedTreeNode); + } + } + return resultMap; + } + + /** + * 获取选中的数据集数量,选中数据列则不计入 + * + * @return + */ + public int getSelectedTableDataCounts() { + return getSelectedTableDataNameObjects().length; + } + + /** + * 是否存在单独选了数据列节点,但没选其对应数据集的情况 + * @return + */ + public boolean hasSelectedIndependentColumns() { + Map> tableDataNodesAndColumnNodes = getSelectedTableDataNodesAndColumnNodes(); + List tableDataNodes = tableDataNodesAndColumnNodes.get(TABLE_DATA_NODE); + List columnNodes = tableDataNodesAndColumnNodes.get(COLUMN_NODE); + if (columnNodes == null || columnNodes.size() == 0) { + // 未选中数据列 + return false; + } + if (tableDataNodes == null || tableDataNodes.size() == 0) { + // 选中数据列而未选中数据集 + return true; + } + boolean result = false; + for (ExpandMutableTreeNode columnNode : columnNodes) { + ExpandMutableTreeNode tableDataNode = getBelongedTableDataNodes(columnNode); + if (!tableDataNodes.contains(tableDataNode)) { + result = true; + } + } + return result; + } + + /** + * 获取一个节点归属的数据集层级父节点 + * @param treeNode + * @return + */ + private ExpandMutableTreeNode getBelongedTableDataNodes(ExpandMutableTreeNode treeNode) { + if (isTableDataNodes(treeNode)) { + return treeNode; + } + return getBelongedTableDataNodes((ExpandMutableTreeNode) treeNode.getParent()); + } + + private boolean isTableDataNodes(ExpandMutableTreeNode treeNode) { + if (treeNode == null) { + return false; + } + Object userObject = treeNode.getUserObject(); + if (userObject instanceof NameObject && ((NameObject) userObject).getObject() instanceof AbstractTableDataWrapper) { + return true; + } + return false; + } + public TableDataWrapper[] getSelectedDatas() { TreePath[] selectedTreePaths = this.getSelectionPaths(); if (selectedTreePaths == null || selectedTreePaths.length == 0) { @@ -247,4 +450,20 @@ public class TableDataTree extends UserObjectRefreshJTree { treeModel.reload(root); } + + /** + * 判断此节点是否为存储过程 + * + * @param treeNode + * @return + */ + public boolean isTreeNodeStoreProcedure(ExpandMutableTreeNode treeNode) { + Object userObject = treeNode.getUserObject(); + if (userObject instanceof NameObject) { + NameObject nameObject = (NameObject) userObject; + TableDataWrapper tableDataWrapper = (TableDataWrapper) nameObject.getObject(); + return tableDataWrapper.getTableData() instanceof StoreProcedure; + } + return false; + } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 5a63666023..06d086aeff 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -13,6 +13,11 @@ import com.fr.design.data.BasicTableDataTreePane; import com.fr.design.data.BasicTableDataUtils; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.StrategyConfigAttrUtils; +import com.fr.design.data.datapane.management.clip.TableDataTreeClipboard; +import com.fr.design.data.datapane.management.search.pane.TableDataSearchRemindPane; +import com.fr.design.data.datapane.management.search.pane.TreeSearchToolbarPane; +import com.fr.design.data.datapane.management.search.searcher.TableDataSearchMode; +import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; import com.fr.design.data.tabledata.StoreProcedureWorkerListener; import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; import com.fr.design.data.tabledata.tabledatapane.DBTableDataPane; @@ -20,12 +25,14 @@ import com.fr.design.data.tabledata.wrapper.AbstractTableDataWrapper; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; -import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.fun.TableDataPaneProcessor; import com.fr.design.gui.ibutton.UIHeadGroup; import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilist.CheckBoxList; +import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; @@ -37,6 +44,7 @@ import com.fr.design.menu.LineSeparator; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ToolBarDef; +import com.fr.design.utils.gui.GUICoreUtils; import com.fr.esd.core.strategy.config.StrategyConfig; import com.fr.esd.core.strategy.config.StrategyConfigHelper; import com.fr.esd.event.DSMapping; @@ -61,7 +69,6 @@ import org.jetbrains.annotations.NotNull; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JLabel; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; @@ -69,9 +76,12 @@ import javax.swing.ToolTipManager; import javax.swing.tree.TreePath; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Dimension; import java.awt.GridLayout; import java.awt.dnd.DnDConstants; import java.awt.event.ActionEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; @@ -107,13 +117,20 @@ public class TableDataTreePane extends BasicTableDataTreePane { private TableDataSourceOP op; private TableDataTree tableDataTree; + private UIPopupMenu popupMenu; private EditAction editAction; private RemoveAction removeAction; + private CopyAction copyAction; + private PasteAction pasteAction; private EsdOnAction esdAction; private EsdOffAction esdOffAction; + private SwitchAction switchAction; private PreviewTableDataAction previewTableDataAction; private JPanel serverDatasetAuthTipJPanel = new JPanel(); + private TableDataSearchRemindPane remindPane; + private TreeSearchToolbarPane toolbarPane; + private TableDataTreePane() { initPane(); } @@ -122,13 +139,76 @@ public class TableDataTreePane extends BasicTableDataTreePane { this.setLayout(new BorderLayout(4, 0)); this.setBorder(null); - //TableDataTree - tableDataTree = new TableDataTree(); + initTableDataTree(); + toolbarPane = initToolBarPane(); + JPanel treePane = initTreePane(); + dealWithTableDataTree(); + this.add(toolbarPane, BorderLayout.NORTH); + this.add(treePane, BorderLayout.CENTER); + checkButtonEnabled(); + } + + /** + * 处理TableDataTree的监听等 + */ + private void dealWithTableDataTree() { + // tooltip ToolTipManager.sharedInstance().registerComponent(tableDataTree); ToolTipManager.sharedInstance().setDismissDelay(3000); ToolTipManager.sharedInstance().setInitialDelay(0); + // 右键菜单 + popupMenu = new UIPopupMenu(); + popupMenu.add(editAction.createMenuItem()); + popupMenu.add(previewTableDataAction.createMenuItem()); + popupMenu.addSeparator(); + popupMenu.add(copyAction.createMenuItem()); + popupMenu.add(pasteAction.createMenuItem()); + popupMenu.add(removeAction.createMenuItem()); + popupMenu.addSeparator(); + // 监听 + tableDataTree.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + // 服务器暂不支持右键菜单 + if (SwingUtilities.isRightMouseButton(e) && op.getDataMode() != TableDataSourceOP.SERVER_TABLE_DATA) { + GUICoreUtils.showPopupMenu(popupMenu, e.getComponent(), e.getX(), e.getY()); + } + checkButtonEnabled(); + } + }); + tableDataTree.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + //F2重命名先屏蔽了, 有bug没时间弄 + if (e.getKeyCode() == KeyEvent.VK_F2) { + return; + } + + super.keyPressed(e); + checkButtonEnabled(); + } + @Override + public void keyReleased(KeyEvent e) { + super.keyReleased(e); + checkButtonEnabled(); + } + }); + // TreeCellEditor + tableDataTree.setEditable(true); + TableDataTreeCellEditor treeCellEditor = new TableDataTreeCellEditor(new UITextField(), tableDataTree, this); + treeCellEditor.addCellEditorListener(treeCellEditor); + tableDataTree.setCellEditor(treeCellEditor); + new TableDataTreeDragSource(tableDataTree, DnDConstants.ACTION_COPY); + } + /** + * 工具栏面板 + * + * @return + */ + private TreeSearchToolbarPane initToolBarPane() { + // toolbar addMenuDef = new MenuDef(Toolkit.i18nText("Fine-Design_Basic_Action_Add")); addMenuDef.setIconPath(IconPathConstants.ADD_POPMENU_ICON_PATH); createAddMenuDef(); @@ -136,49 +216,54 @@ public class TableDataTreePane extends BasicTableDataTreePane { createPluginListener(); editAction = new EditAction(); + copyAction = new CopyAction(); + pasteAction = new PasteAction(); removeAction = new RemoveAction(); previewTableDataAction = new PreviewTableDataAction(tableDataTree); connectionTableAction = new ConnectionTableAction(); esdAction = new EsdOnAction(); esdOffAction = new EsdOffAction(); - + switchAction = new SwitchAction(); toolbarDef = new ToolBarDef(); - toolbarDef.addShortCut(addMenuDef, SeparatorDef.DEFAULT, editAction, removeAction, SeparatorDef.DEFAULT, previewTableDataAction, connectionTableAction, esdAction, esdOffAction); + toolbarDef.addShortCut(addMenuDef, SeparatorDef.DEFAULT, editAction, removeAction, SeparatorDef.DEFAULT, previewTableDataAction, connectionTableAction, esdAction, esdOffAction, switchAction); UIToolbar toolBar = ToolBarDef.createJToolBar(); toolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.TOOLBAR_BORDER_COLOR)); toolBar.setBorderPainted(true); toolbarDef.updateToolBar(toolBar); - JPanel toolbarPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - toolbarPane.add(toolBar, BorderLayout.CENTER); - this.add(toolbarPane, BorderLayout.NORTH); + TreeSearchToolbarPane searchLayerdPane = new TreeSearchToolbarPane(toolBar); + searchLayerdPane.setPreferredSize(new Dimension(this.getWidth(), 23)); + + return searchLayerdPane; + } - UIScrollPane scrollPane = new UIScrollPane(tableDataTree); - scrollPane.setBorder(null); + /** + * 数据集树面板 + * + * @return + */ + private JPanel initTreePane() { + JPanel treePane = new JPanel(new BorderLayout(0, 6)); + // north + JPanel northPane = new JPanel(FRGUIPaneFactory.createBorderLayout()); initServerDatasetAuthTipJPanel(); initButtonGroup(); - JPanel jPanel = new JPanel(new BorderLayout(0, 0)); - JPanel buttonPane = new JPanel(FRGUIPaneFactory.createBorderLayout()); - buttonPane.add(buttonGroup, BorderLayout.CENTER); - buttonPane.add(serverDatasetAuthTipJPanel, BorderLayout.SOUTH); - jPanel.add(buttonPane, BorderLayout.NORTH); - jPanel.add(scrollPane, BorderLayout.CENTER); - this.add(jPanel, BorderLayout.CENTER); - tableDataTree.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - checkButtonEnabled(); - } - }); - tableDataTree.addKeyListener(getTableTreeNodeListener(editAction, previewTableDataAction, removeAction, op, tableDataTree)); - // TreeCellEditor - tableDataTree.setEditable(true); - TableDataTreeCellEditor treeCellEditor = new TableDataTreeCellEditor(new UITextField(), tableDataTree, this); - treeCellEditor.addCellEditorListener(treeCellEditor); - tableDataTree.setCellEditor(treeCellEditor); - new TableDataTreeDragSource(tableDataTree, DnDConstants.ACTION_COPY); - checkButtonEnabled(); + northPane.add(buttonGroup, BorderLayout.CENTER); + northPane.add(serverDatasetAuthTipJPanel, BorderLayout.SOUTH); + // center + remindPane = new TableDataSearchRemindPane(getDataTree()); + + treePane.add(northPane, BorderLayout.NORTH); + treePane.add(remindPane, BorderLayout.CENTER); + return treePane; + } + + /** + * 初始化 TableDataTree + */ + private void initTableDataTree() { + tableDataTree = new TableDataTree(); } private void initServerDatasetAuthTipJPanel() { @@ -300,6 +385,10 @@ public class TableDataTreePane extends BasicTableDataTreePane { */ @Override public void dgEdit(final AbstractTableDataPane tableDataPane, String originalName, boolean isUpdate) { + // 编辑时如果正在搜索,跳回原树 + if (TableDataTreeSearchManager.getInstance().isInSearchMode()) { + TableDataTreeSearchManager.getInstance().outOfSearchMode(); + } tableDataPane.addStoreProcedureWorkerListener(new StoreProcedureWorkerListener() { public void fireDoneAction() { if (tableDataTree.getSelectionPath() == null) { @@ -471,6 +560,17 @@ public class TableDataTreePane extends BasicTableDataTreePane { ((TableDataSourceDependent) td).setTableDataSource(tds); } String tdName = nPanel.getObjectName(); + + //处理缓存策略配置 + if (uPanel instanceof DBTableDataPane) { + StrategyConfig editingConfig = ((DBTableDataPane) uPanel).updateStrategyConfig(); + if (editingConfig != null) { + editingConfig.setDsName(tdName); + StrategyConfigAttrUtils.addStrategyConfig(editingConfig); + } + ((DBTableData) td).setDsName(tdName); + } + tds.putTableData(tdName, td); Map map = new HashMap(); if (!ComparatorUtils.equals(paneName, tdName)) { @@ -501,11 +601,61 @@ public class TableDataTreePane extends BasicTableDataTreePane { this.createAddMenuDef(); } + /** + * 感觉这里,把一堆Action和Op之类的送到抽象类里去检查,很奇怪,抽象类本身定义的Action只有add和connection + * 另外因为改动了数据集树节点的选中逻辑,所以这边改成自己类内部实现 + * 不直接改抽象类是怕影响到部分插件兼容 + */ private void checkButtonEnabled() { - super.checkButtonEnabled(editAction, previewTableDataAction, removeAction, op, tableDataTree); + // 检查添加与定义数据连接操作 + this.checkAddAndConnectionEnabled(); + // 检查编辑、预览、复制、粘贴、删除等基本操作 + this.checkBasicButtonEnabled(); + // 检查esd相关操作 this.checkESDComponentsEnabled(); } + private void checkAddAndConnectionEnabled() { + connectionTableAction.setEnabled(WorkContext.getCurrent() != null && WorkContext.getCurrent().isRoot()); + addMenuDef.setEnabled(!(op == null || op.interceptButtonEnabled() || op.getDataMode() == SERVER_TABLE_DATA)); + } + + private void checkBasicButtonEnabled() { + // 设置下各个button的基本状态,避免代码重复 + editAction.setEnabled(false); + copyAction.setEnabled(false); + pasteAction.setEnabled(false); + removeAction.setEnabled(false); + previewTableDataAction.setEnabled(false); + if (op == null || op.interceptButtonEnabled()) { + // 保持false状态 + return; + } + // 获取选中的数据集数量 + int selectioncount = getDataTree().getSelectedTableDataCounts(); + if (op.getDataMode() == SERVER_TABLE_DATA) { + // 服务器数据集下,选中数据集数量为1时,可以预览 + if (selectioncount == 1 && !getDataTree().hasSelectedIndependentColumns()) { + previewTableDataAction.setEnabled(true); + } + // 其它保持false状态 + return; + } + // 模板数据集时,粘贴可用 + pasteAction.setEnabled(true); + if (selectioncount == 0 || getDataTree().hasSelectedIndependentColumns()) { + // 未选中数据集,或存在单独选中的数据列时,其它保持false状态 + return; + } + if (selectioncount == 1) { + // 仅选中单个数据集时,才可以编译、预览 + editAction.setEnabled(true); + previewTableDataAction.setEnabled(true); + } + removeAction.setEnabled(true); + copyAction.setEnabled(true); + } + private void checkESDComponentsEnabled() { if (buttonGroup.getSelectedIndex() == 1) { @@ -594,6 +744,9 @@ public class TableDataTreePane extends BasicTableDataTreePane { if (op != null) { op.setDataMode(modeArray[buttonGroup.getSelectedIndex()]); addMenuDef.setEnabled(modeArray[buttonGroup.getSelectedIndex()] == TEMPLATE_TABLE_DATA); + if (TableDataTreeSearchManager.getInstance().isInSearchMode()) { + TableDataTreeSearchManager.getInstance().outOfSearchMode(); + } refreshDockingView(); } @@ -863,34 +1016,125 @@ public class TableDataTreePane extends BasicTableDataTreePane { @Override public void actionPerformed(ActionEvent e) { - NameObject selectedNO = tableDataTree.getSelectedNameObject(); - - if (selectedNO == null) { + NameObject[] selectedNameObjects = tableDataTree.getSelectedTableDataNameObjects(); + if (selectedNameObjects == null || selectedNameObjects.length == 0) { + FineLoggerFactory.getLogger().error("Table Data to remove is null or not selected"); return; } + CheckBoxList checkBoxList = new CheckBoxList(selectedNameObjects, CheckBoxList.SelectedState.ALL, Toolkit.i18nText("Fine-Design_Basic_Remove_All_Selected")); + UIScrollPane scrollPane = new UIScrollPane(checkBoxList); + BasicPane basicPane = new BasicPane() { + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Fine-Design_Basic_Remove"); + } + }; + basicPane.setLayout(new BorderLayout()); + basicPane.add(scrollPane, BorderLayout.CENTER); + BasicDialog basicDialog = basicPane.showSmallWindow(SwingUtilities.getWindowAncestor(TableDataTreePane.this), new DialogActionAdapter() { + @Override + public void doOk() { + Object[] selectedValues = checkBoxList.getSelectedValues(); + // 删除时如果正在搜索,跳回原树 + if (TableDataTreeSearchManager.getInstance().isInSearchMode()) { + TableDataTreeSearchManager.getInstance().outOfSearchMode(); + } + for (Object toRemove : selectedValues) { + doRemove((NameObject) toRemove); + } + } - int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + ":" + selectedNO.getName() + "?", - Toolkit.i18nText("Fine-Design_Basic_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - if (returnVal == JOptionPane.OK_OPTION) { - // richer:这个地方为什么要在DataSourceTree里面去remove呢?多此一举吧 - op.removeAction(selectedNO.getName()); - tableDataTree.refresh(); - // Richie:默认最后一行获得焦点. - tableDataTree.requestFocus(); - tableDataTree.setSelectionRow(tableDataTree.getRowCount() - 1); - fireDSChanged(); - checkButtonEnabled(); + @Override + public void doCancel() { + super.doCancel(); + } + }); + basicDialog.setVisible(true); + } + + private void doRemove(NameObject selectedNO) { + // richer:这个地方为什么要在DataSourceTree里面去remove呢?多此一举吧 + op.removeAction(selectedNO.getName()); + tableDataTree.refresh(); + // Richie:默认最后一行获得焦点. + tableDataTree.requestFocus(); + tableDataTree.setSelectionRow(tableDataTree.getRowCount() - 1); + fireDSChanged(); + checkButtonEnabled(); + + //删掉缓存配置 + StrategyConfigAttrUtils.removeStrategyConfig(selectedNO.getName()); + + // 如果一个模版是平台开启,这个数据集的配置不会存xml,预览模版时直接从全局配置copy,这样 + // 导致删除的时候StrategyConfigsAttrSavedHook没有通过前后配置比较感知数据集被删除,因此不会发出事件让其失效 + // 这里额外发出一次数据集修改事件 + StrategyEventsNotifier.modifyDataSet(new DSMapping(getTplPath(), new DsNameTarget(selectedNO.getName()))); + DesignTableDataManager.removeSelectedColumnNames(selectedNO.getName()); + DesignModelAdapter.getCurrentModelAdapter().removeTableDataParameters(selectedNO.getName()); + } + } + + private class CopyAction extends UpdateAction { + + public CopyAction() { + this.setName(Toolkit.i18nText("Fine-Design_Basic_Copy")); + this.setMnemonic('C'); + this.setSmallIcon("/com/fr/design/images/m_edit/copy"); + } - //删掉缓存配置 - StrategyConfigAttrUtils.removeStrategyConfig(selectedNO.getName()); + @Override + public void actionPerformed(ActionEvent e) { + NameObject[] selectedNameObjects = tableDataTree.getSelectedTableDataNameObjects(); + Map dataWrapperMap = TableDataTreeClipboard.getInstance().transferNameObjectArray2Map(selectedNameObjects); + TableDataTreeClipboard.getInstance().addToClip(dataWrapperMap); + } + } + + private class PasteAction extends UpdateAction { + + public PasteAction() { + this.setName(Toolkit.i18nText("Fine-Design_Basic_Action_Paste_Name")); + this.setMnemonic('P'); + this.setSmallIcon("/com/fr/design/images/m_edit/paste"); + } - // 如果一个模版是平台开启,这个数据集的配置不会存xml,预览模版时直接从全局配置copy,这样 - // 导致删除的时候StrategyConfigsAttrSavedHook没有通过前后配置比较感知数据集被删除,因此不会发出事件让其失效 - // 这里额外发出一次数据集修改事件 - StrategyEventsNotifier.modifyDataSet(new DSMapping(getTplPath(), new DsNameTarget(selectedNO.getName()))); - DesignTableDataManager.removeSelectedColumnNames(selectedNO.getName()); - DesignModelAdapter.getCurrentModelAdapter().removeTableDataParameters(selectedNO.getName()); + @Override + public void actionPerformed(ActionEvent e) { + // 粘贴时如果正在搜索,跳回原树 + if (TableDataTreeSearchManager.getInstance().isInSearchMode()) { + TableDataTreeSearchManager.getInstance().outOfSearchMode(); } + Map dataWrapperMap = TableDataTreeClipboard.getInstance().takeFromClip(); + for (Map.Entry dataWrapperEntry : dataWrapperMap.entrySet()) { + // 处理数据集名称 + String dsName = getNoRepeatedDsName4Paste(dataWrapperEntry.getKey()); + AbstractTableDataWrapper wrapper = dataWrapperEntry.getValue(); + AbstractTableDataPane tableDataPane = wrapper.creatTableDataPane(); + addDataPane(tableDataPane, dsName); + } + } + } + + public String getNoRepeatedDsName4Paste(String oldName) { + while (isDsNameRepeaded(oldName)) { + oldName = oldName + Toolkit.i18nText("Fine-Design_Table_Data_Copy_Of_Table_Data"); + } + return oldName; + } + + private class SwitchAction extends UpdateAction { + + public SwitchAction() { + this.setName(Toolkit.i18nText("Fine-Design_Basic_Search")); + this.setMnemonic('S'); + this.setSmallIcon("/com/fr/design/images/data/search"); + } + + @Override + public void actionPerformed(ActionEvent e) { + // 交换层级 + toolbarPane.switchPane(TreeSearchToolbarPane.SEARCH_PANE); + TableDataTreeSearchManager.getInstance().switchToSearch(TableDataSearchMode.match(buttonGroup.getSelectedIndex()), DesignTableDataManager.getEditingTableDataSource()); } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java index 1566395edb..12c62b4350 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java @@ -6,6 +6,7 @@ import com.fr.data.impl.ConnectionBean; import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.impl.JNDIDatabaseConnection; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.data.MapCompareUtils; import com.fr.design.dialog.BasicDialog; import com.fr.design.fun.ConnectionProvider; import com.fr.design.gui.controlpane.JListControlPane; @@ -16,21 +17,21 @@ import com.fr.design.i18n.Toolkit; import com.fr.event.EventDispatcher; import com.fr.file.ConnectionConfig; import com.fr.file.ConnectionOperator; -import com.fr.file.ConnectionOperatorImpl; import com.fr.general.NameObject; import com.fr.log.FineLoggerFactory; -import com.fr.rpc.ExceptionHandler; -import com.fr.rpc.RPCInvokerExceptionInfo; import com.fr.stable.ArrayUtils; import com.fr.stable.Nameable; import com.fr.stable.StringUtils; import com.fr.stable.core.PropertyChangeAdapter; -import com.fr.third.org.apache.commons.collections4.MapUtils; +import com.fr.transaction.Configurations; +import com.fr.transaction.WorkerFacade; import com.fr.workspace.WorkContext; import java.awt.Window; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -42,7 +43,8 @@ import java.util.UUID; public class ConnectionListPane extends JListControlPane implements ConnectionShowPane { public static final String TITLE_NAME = Toolkit.i18nText("Fine-Design_Basic_Server_Define_Data_Connection"); private boolean isNamePermitted = true; - private HashMap renameMap = new HashMap(); + private final HashMap renameMap = new HashMap<>(); + private final Map populatedConnectionsSnapshot = new LinkedHashMap<>(); public ConnectionListPane() { renameMap.clear(); @@ -149,11 +151,16 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh */ public void populate(ConnectionConfig connectionConfig) { List nameObjectList = new ArrayList(); + populatedConnectionsSnapshot.clear(); for (Map.Entry entry : connectionConfig.getConnections().entrySet()) { nameObjectList.add(new NameObject(entry.getKey(), entry.getValue())); + try { + populatedConnectionsSnapshot.put(entry.getKey(), (Connection) entry.getValue().clone()); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } } this.populate(nameObjectList.toArray(new NameObject[nameObjectList.size()])); - } /** @@ -162,23 +169,36 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh public void update(ConnectionConfig connectionConfig) { // Nameable[]居然不能强转成NameObject[],一定要这么写... Nameable[] res = this.update(); - List connectionBeans = new ArrayList<>(); - Map map = MapUtils.invertMap(getRenameMap()); - for (int i = 0; i < res.length; i++) { - NameObject nameObject = (NameObject) res[i]; - String oldName = map.get(nameObject.getName()); - if (oldName == null) { - oldName = StringUtils.EMPTY; + Map updatedMap = new LinkedHashMap<>(); + Arrays.stream(res).map(n -> (NameObject) n).forEach(no -> updatedMap.put(no.getName(), (Connection) no.getObject())); + + List removedConnNames = new ArrayList<>(); + List addedOrUpdatedConnections = new ArrayList<>(); + + MapCompareUtils.contrastMapEntries(populatedConnectionsSnapshot, updatedMap, (entryEventKind, s, connection) -> { + switch (entryEventKind) { + case REMOVED: + removedConnNames.add(s); + break; + case ADDED: + case UPDATED: + addedOrUpdatedConnections.add(new ConnectionBean(s, StringUtils.EMPTY, connection)); + default: + break; } - connectionBeans.add(new ConnectionBean(nameObject.getName(), oldName, (Connection) nameObject.getObject())); - } + }); + + + this.alterConnections(removedConnNames, addedOrUpdatedConnections); + } + + private void alterConnections(List removedConnNames, List addedOrUpdatedConnections) { + try { - WorkContext.getCurrent().get(ConnectionOperator.class, new ExceptionHandler() { - @Override - public Object callHandler(RPCInvokerExceptionInfo exceptionInfo) { - return saveByOldWay(connectionBeans); - } - }).saveConnection(new ArrayList<>(connectionConfig.getConnections().keySet()), connectionBeans); + WorkContext.getCurrent().get(ConnectionOperator.class, exceptionInfo -> saveByOldWay(removedConnNames, addedOrUpdatedConnections)) + .saveConnection(removedConnNames, addedOrUpdatedConnections); + + // hades:远程环境时,由于时直接RPC调用远程修改,因此设计器本地配置需要失效 if (!WorkContext.getCurrent().isLocal()) { EventDispatcher.fire(RemoteConfigEvent.EDIT, ConnectionConfig.getInstance().getNameSpace()); } @@ -187,13 +207,20 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh } } - private boolean saveByOldWay(List connectionBeans) { + private boolean saveByOldWay(List removedConnNames, List addedOrUpdatedConnections) { try { - return ConnectionOperatorImpl.getInstance().saveConnection(connectionBeans); + return Configurations.modify(new WorkerFacade(ConnectionConfig.class) { + @Override + public void run() { + removedConnNames.forEach(n -> ConnectionConfig.getInstance().removeConnection(n)); + addedOrUpdatedConnections.forEach(cb -> ConnectionConfig.getInstance().addConnection(cb.getName(), cb.getConnection())); + } + }); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); - return false; } + + return false; } public static void showDialog(Window parent) { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SshPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SshPane.java index 9a870d07d2..48f710dfbf 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SshPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SshPane.java @@ -7,6 +7,7 @@ import com.fr.data.security.ssh.SshException; import com.fr.data.security.ssh.SshType; import com.fr.data.security.ssh.impl.KeyVerifySsh; import com.fr.data.security.ssh.impl.NormalSsh; +import com.fr.data.security.ssl.SslUtils; import com.fr.design.border.UITitledBorder; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; @@ -25,7 +26,6 @@ import com.fr.file.FILE; import com.fr.file.FILEChooserPane; import com.fr.file.filter.ChooseFileFilter; import com.fr.stable.StringUtils; -import com.fr.stable.project.ProjectConstants; import com.fr.third.guava.collect.HashBiMap; import javax.swing.ImageIcon; @@ -131,7 +131,7 @@ public class SshPane extends BasicPane { fileChooserButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - FILEChooserPane fileChooser = FILEChooserPane.getInstanceWithDesignatePath(ProjectConstants.RESOURCES_NAME, new ChooseFileFilter(true)); + FILEChooserPane fileChooser = FILEChooserPane.getInstanceWithDesignatePath(SslUtils.PREFIX, new ChooseFileFilter(true), SslUtils.CERTIFICATES); int type = fileChooser.showOpenDialog(SshPane.this, StringUtils.EMPTY); if (type == FILEChooserPane.OK_OPTION) { final FILE file = fileChooser.getSelectedFILE(); @@ -142,6 +142,7 @@ public class SshPane extends BasicPane { } } fileChooser.removeAllFilter(); + fileChooser.removeTopPath(); } }); } @@ -241,7 +242,6 @@ public class SshPane extends BasicPane { public static class KeyFileUITextField extends UITextField { private static final Pattern ERROR_START = Pattern.compile("^([/\\\\.]+).*"); private static final Pattern MUTI_DOT = Pattern.compile("\\.+"); - private static final String PREFIX = ProjectConstants.RESOURCES_NAME + "/"; private static final String UPPER = ".."; public KeyFileUITextField(int columns) { @@ -283,7 +283,7 @@ public class SshPane extends BasicPane { public String getText() { // 获取的时候,不为空,给他加上前缀就好了,否则还是空 if (!StringUtils.isEmpty(super.getText())) { - return PREFIX + super.getText(); + return SslUtils.PREFIX + super.getText(); } return StringUtils.EMPTY; } @@ -291,8 +291,8 @@ public class SshPane extends BasicPane { @Override public void setText(String text) { // 设置的时候,不为空,说明文件指定了(文件需要是resource下),替换掉前缀 - if (!StringUtils.isEmpty(text) && text.startsWith(PREFIX)) { - super.setText(text.replaceFirst(PREFIX, "")); + if (!StringUtils.isEmpty(text) && text.startsWith(SslUtils.PREFIX)) { + super.setText(text.replaceFirst(SslUtils.PREFIX, "")); } else { super.setText(text); } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java index 2d9c26e235..c440079911 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/SslPane.java @@ -4,6 +4,7 @@ import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.security.ssl.Ssl; import com.fr.data.security.ssl.SslException; import com.fr.data.security.ssl.SslType; +import com.fr.data.security.ssl.SslUtils; import com.fr.data.security.ssl.impl.NormalSsl; import com.fr.design.border.UITitledBorder; import com.fr.design.constants.UIConstants; @@ -21,7 +22,6 @@ import com.fr.file.FILE; import com.fr.file.FILEChooserPane; import com.fr.file.filter.ChooseFileFilter; import com.fr.stable.StringUtils; -import com.fr.stable.project.ProjectConstants; import javax.swing.ImageIcon; import javax.swing.JPanel; @@ -148,7 +148,7 @@ public class SslPane extends BasicPane { @Override public void actionPerformed(ActionEvent e) { - FILEChooserPane fileChooser = FILEChooserPane.getInstanceWithDesignatePath(ProjectConstants.RESOURCES_NAME, new ChooseFileFilter(true)); + FILEChooserPane fileChooser = FILEChooserPane.getInstanceWithDesignatePath(SslUtils.PREFIX, new ChooseFileFilter(true), SslUtils.CERTIFICATES); int type = fileChooser.showOpenDialog(SslPane.this, StringUtils.EMPTY); if (type == FILEChooserPane.OK_OPTION) { final FILE file = fileChooser.getSelectedFILE(); @@ -159,6 +159,7 @@ public class SslPane extends BasicPane { } } fileChooser.removeAllFilter(); + fileChooser.removeTopPath(); } } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/clip/TableDataTreeClipboard.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/clip/TableDataTreeClipboard.java new file mode 100644 index 0000000000..44ae90b2cf --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/clip/TableDataTreeClipboard.java @@ -0,0 +1,68 @@ +package com.fr.design.data.datapane.management.clip; + +import com.fr.design.data.tabledata.wrapper.AbstractTableDataWrapper; +import com.fr.general.NameObject; + +import java.util.HashMap; +import java.util.Map; + +/** + * 用于数据集的复制粘贴 + * + * @author Yvan + */ +public class TableDataTreeClipboard { + + /** + * 数据集名称 - 数据集Wrapper + */ + private Map clip = new HashMap<>(); + + private static class Holder { + private static final TableDataTreeClipboard INSTANCE = new TableDataTreeClipboard(); + } + + private TableDataTreeClipboard() { + } + + public static TableDataTreeClipboard getInstance() { + return Holder.INSTANCE; + } + + /** + * 添加选中的数据集数据到剪切板,覆盖原本剪切板内数据 + * + * @param copyMap + * @return + */ + public void addToClip(Map copyMap) { + this.clip = copyMap; + } + + public Map transferNameObjectArray2Map(NameObject[] selectedNameObjects) { + Map resultMap = new HashMap<>(); + if (selectedNameObjects == null) { + return resultMap; + } + for (NameObject selectedNameObject : selectedNameObjects) { + resultMap.put(selectedNameObject.getName(), (AbstractTableDataWrapper) selectedNameObject.getObject()); + } + return resultMap; + } + + /** + * 取出剪切板内的所有数据集数据,剪切板不清空 + * + * @return + */ + public Map takeFromClip() { + return clip; + } + + /** + * 清空剪切板 + */ + public void reset() { + clip.clear(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/TableDataTreeSearchManager.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/TableDataTreeSearchManager.java new file mode 100644 index 0000000000..6fe79189c8 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/TableDataTreeSearchManager.java @@ -0,0 +1,238 @@ +package com.fr.design.data.datapane.management.search; + +import com.fr.data.TableDataSource; +import com.fr.design.DesignModelAdapter; +import com.fr.design.data.datapane.TableDataTree; +import com.fr.design.data.datapane.TableDataTreePane; +import com.fr.design.data.datapane.management.search.event.TreeSearchStatusChangeEvent; +import com.fr.design.data.datapane.management.search.event.TreeSearchStatusChangeListener; +import com.fr.design.data.datapane.management.search.searcher.TableDataSearchMode; +import com.fr.design.data.datapane.management.search.searcher.TableDataTreeSearcher; +import com.fr.design.data.datapane.management.search.searcher.TreeSearchStatus; +import com.fr.design.data.datapane.management.search.view.TreeSearchRendererHelper; +import com.fr.stable.StringUtils; + +import javax.swing.SwingUtilities; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 数据集树搜索管理器 + * + * @author Yvan + */ +public class TableDataTreeSearchManager { + + /** + * 数据集树搜索器 + */ + private TableDataTreeSearcher treeSearcher; + + /** + * 搜索任务的状态 + */ + private TreeSearchStatus treeSearchStatus; + + /** + * 缓存上次搜索文本,避免重复搜索 + */ + private String lastSearchText; + + /** + * 存储与复原 原本数据集树的UI + */ + private TreeSearchRendererHelper rendererHelper; + + /** + * 取数计数器 + */ + private AtomicInteger count; + + /** + * 搜索状态变化监听 + */ + private List listeners = new ArrayList<>(); + + private TableDataTreeSearchManager() { + init(); + } + + private void init() { + this.treeSearchStatus = TreeSearchStatus.NOT_IN_SEARCH_MODE; + } + + private static class Holder { + private static final TableDataTreeSearchManager INSTANCE = new TableDataTreeSearchManager(); + } + + public static TableDataTreeSearchManager getInstance() { + return Holder.INSTANCE; + } + + public TreeSearchStatus getTreeSearchStatus() { + return treeSearchStatus; + } + + public void setTreeSearchStatus(TreeSearchStatus treeSearchStatus) { + this.treeSearchStatus = treeSearchStatus; + // 每次设置搜索状态,都触发下监听,让页面跟随变化 + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + for (TreeSearchStatusChangeListener listener : listeners) { + listener.updateTreeSearchChange(new TreeSearchStatusChangeEvent(treeSearchStatus)); + } + } + }); + } + + public void registerTreeSearchStatusChangeListener(TreeSearchStatusChangeListener listener) { + listeners.add(listener); + } + + /** + * 工具栏处切换到搜索面板 + * + * @param searchMode + * @param tableDataSource + */ + public void switchToSearch(TableDataSearchMode searchMode, TableDataSource tableDataSource) { + setTreeSearchStatus(TreeSearchStatus.SEARCH_NOT_BEGIN); + rendererHelper = new TreeSearchRendererHelper(); + rendererHelper.save(getCurrentTableDataTree()); + treeSearcher = new TableDataTreeSearcher(); + treeSearcher.beforeSearch(searchMode, tableDataSource); + } + + /** + * 获取当前的tableDataTree + * + * @return + */ + private TableDataTree getCurrentTableDataTree() { + DesignModelAdapter currentModelAdapter = DesignModelAdapter.getCurrentModelAdapter(); + TableDataTreePane tableDataTreePane = (TableDataTreePane) TableDataTreePane.getInstance(currentModelAdapter); + return tableDataTreePane.getDataTree(); + } + + public boolean isMatchSetsEmpty() { + return treeSearcher.isMatchSetsEmpty(); + } + + /** + * 开始搜索 + * + * @param searchText + */ + public void startSearch(String searchText) { + if (isRepeatSearch(searchText) || StringUtils.isEmpty(searchText)) { + return; + } + setTreeSearchStatus(TreeSearchStatus.SEARCHING); + rendererHelper.replaceTreeRenderer(getCurrentTableDataTree(), searchText); + count = new AtomicInteger(treeSearcher.getAllWrappersSize()); + treeSearcher.startSearch(searchText); + } + + /** + * 计数-1 + */ + public void decreaseCount() { + if (count == null) { + return; + } + int cunrrentCount = count.decrementAndGet(); + // 减到0后判断状态 + if (cunrrentCount == 0 && getTreeSearchStatus() == TreeSearchStatus.SEARCHING) { + completeSearch(); + } + } + + private boolean isRepeatSearch(String searchText) { + if (StringUtils.isEmpty(lastSearchText)) { + lastSearchText = searchText; + return false; + } + return StringUtils.equals(lastSearchText, searchText); + } + + /** + * 刷新树,更新搜索的结果 + */ + public void updateTableDataTree() { + getCurrentTableDataTree().refresh4TreeSearch(); + } + + /** + * 中断搜索 + */ + public void stopSearch() { + setTreeSearchStatus(TreeSearchStatus.SEARCH_STOPPED); + count = null; + treeSearcher.stopSearch(); + } + + /** + * 搜索完成 + */ + public void completeSearch() { + setTreeSearchStatus(TreeSearchStatus.SEARCH_COMPLETED); + count = null; + treeSearcher.completeSearch(); + } + + /** + * 切换回工具栏,恢复数据集树UI + */ + public void restoreToolBarAndTreePane() { + setTreeSearchStatus(TreeSearchStatus.NOT_IN_SEARCH_MODE); + if (treeSearcher != null) { + treeSearcher.afterSearch(); + } + lastSearchText = null; + if (rendererHelper != null) { + rendererHelper.restore(getCurrentTableDataTree()); + } + } + + /** + * 恢复数据集树UI + */ + public void restoreTreePane() { + setTreeSearchStatus(TreeSearchStatus.SEARCH_NOT_BEGIN); + lastSearchText = null; + if (rendererHelper != null) { + rendererHelper.restore(getCurrentTableDataTree()); + } + } + + /** + * 节点是否应该添加到搜索结果树的根节点中 + * 只针对数据集节点 + * + * @param treeNodeName 数据集节点名称 + * @return + */ + public boolean nodeNameMatches(String treeNodeName) { + return treeSearcher.nodeMatches(treeNodeName); + } + + /** + * 节点是否应该展开 + * + * @param treeNodeName 节点名称 + * @return + */ + public boolean nodeCanExpand(String treeNodeName) { + return treeSearcher.nodeCanExpand(treeNodeName); + } + + public boolean isInSearchMode() { + return getTreeSearchStatus() != TreeSearchStatus.NOT_IN_SEARCH_MODE; + } + + public void outOfSearchMode() { + restoreToolBarAndTreePane(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/TreeSearchCallback.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/TreeSearchCallback.java new file mode 100644 index 0000000000..a3c8c5c98c --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/TreeSearchCallback.java @@ -0,0 +1,12 @@ +package com.fr.design.data.datapane.management.search.control; + + +/** + * 搜索任务回调 + * + * @author Yvan + */ +public interface TreeSearchCallback { + + void done(TreeSearchResult treeSearchResult); +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/TreeSearchResult.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/TreeSearchResult.java new file mode 100644 index 0000000000..320eca9470 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/TreeSearchResult.java @@ -0,0 +1,37 @@ +package com.fr.design.data.datapane.management.search.control; + +import java.util.List; + +/** + * @author Yvan + */ +public interface TreeSearchResult { + + /** + * 任务结果是否成功 + * + * @return + */ + boolean isSuccess(); + + /** + * 数据集名称匹配或者列名匹配时,需要将数据集名称添加到匹配结果集中 + * + * @return + */ + List getAddToMatch(); + + /** + * 数据集有列名匹配时,需要添加到展开结果集中 + * + * @return + */ + List getAddToExpand(); + + /** + * 数据集完成计算后,需要添加到完成结果集中 + * + * @return + */ + List getAddToCalculated(); +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/TreeSearchTask.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/TreeSearchTask.java new file mode 100644 index 0000000000..695c7d3c27 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/TreeSearchTask.java @@ -0,0 +1,10 @@ +package com.fr.design.data.datapane.management.search.control; + +/** + * @author Yvan + */ +public interface TreeSearchTask extends Runnable { + + @Override + void run(); +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/common/TableDataSearchCallBack.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/common/TableDataSearchCallBack.java new file mode 100644 index 0000000000..6b17f23a45 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/common/TableDataSearchCallBack.java @@ -0,0 +1,54 @@ +package com.fr.design.data.datapane.management.search.control.common; + +import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; +import com.fr.design.data.datapane.management.search.control.TreeSearchCallback; +import com.fr.design.data.datapane.management.search.control.TreeSearchResult; +import com.fr.design.data.datapane.management.search.searcher.TableDataTreeSearcher; +import com.fr.design.data.datapane.management.search.searcher.TreeSearchStatus; + +import javax.swing.SwingUtilities; + +/** + * @author Yvan + */ +public class TableDataSearchCallBack implements TreeSearchCallback { + + protected TableDataTreeSearcher treeSearcher; + + public TableDataSearchCallBack(TableDataTreeSearcher treeSearcher) { + this.treeSearcher = treeSearcher; + } + + @Override + public void done(TreeSearchResult treeSearchResult) { + if (TableDataTreeSearchManager.getInstance().getTreeSearchStatus() != TreeSearchStatus.SEARCHING) { + return; + } + // 搜索计数 + TableDataTreeSearchManager.getInstance().decreaseCount(); + if (treeSearchResult.isSuccess()) { + // 添加结果 + addToTreeSearcher(treeSearchResult); + // 处理UI + updateTableDataTree(); + } + } + + protected void updateTableDataTree() { + SwingUtilities.invokeLater(() -> { + if (TableDataTreeSearchManager.getInstance().getTreeSearchStatus() != TreeSearchStatus.SEARCHING) { + return; + } + TableDataTreeSearchManager.getInstance().updateTableDataTree(); + }); + } + + protected void addToTreeSearcher(TreeSearchResult treeSearchResult) { + // 添加到已计算结果集 + treeSearcher.addToCalculatedSets(treeSearchResult.getAddToCalculated()); + // 添加到匹配结果集 + treeSearcher.addToMatchSets(treeSearchResult.getAddToMatch()); + // 添加到展开结果集 + treeSearcher.addToCanExpandSets(treeSearchResult.getAddToExpand()); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/common/TableDataSearchResult.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/common/TableDataSearchResult.java new file mode 100644 index 0000000000..387933df53 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/common/TableDataSearchResult.java @@ -0,0 +1,105 @@ +package com.fr.design.data.datapane.management.search.control.common; + +import com.fr.design.data.datapane.management.search.control.TreeSearchResult; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Yvan + */ +public class TableDataSearchResult implements TreeSearchResult { + + private boolean success; + + private List addToMatch; + + private List addToExpand; + + private List addToCalculated; + + protected TableDataSearchResult(Builder builder) { + this.success = builder.success; + this.addToMatch = builder.addToMatch; + this.addToExpand = builder.addToExpand; + this.addToCalculated = builder.addToCalculated; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public void setAddToMatch(List addToMatch) { + this.addToMatch = addToMatch; + } + + public void setAddToExpand(List addToExpand) { + this.addToExpand = addToExpand; + } + + public void setAddToCalculated(List addToCalculated) { + this.addToCalculated = addToCalculated; + } + + @Override + public boolean isSuccess() { + return this.success; + } + + @Override + public List getAddToMatch() { + return this.addToMatch; + } + + @Override + public List getAddToExpand() { + return this.addToExpand; + } + + @Override + public List getAddToCalculated() { + return this.addToCalculated; + } + + public static class Builder { + + private boolean success; + + private List addToMatch; + + private List addToExpand; + + private List addToCalculated; + + public Builder() { + this.success = false; + this.addToMatch = new ArrayList<>(); + this.addToExpand = new ArrayList<>(); + this.addToCalculated = new ArrayList<>(); + } + + public Builder buildSuccess(boolean success) { + this.success = success; + return this; + } + + public Builder buildAddToMatch(List addToMatch) { + this.addToMatch = addToMatch; + return this; + } + + public Builder buildAddToExpand(List addToExpand) { + this.addToExpand = addToExpand; + return this; + } + + public Builder buildAddToCalculated(List addToCalculated) { + this.addToCalculated = addToCalculated; + return this; + } + + public TableDataSearchResult build() { + return new TableDataSearchResult(this); + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/common/TableDataSearchTask.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/common/TableDataSearchTask.java new file mode 100644 index 0000000000..2ab51f6a27 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/common/TableDataSearchTask.java @@ -0,0 +1,146 @@ +package com.fr.design.data.datapane.management.search.control.common; + +import com.fr.design.data.datapane.management.search.control.TreeSearchCallback; +import com.fr.design.data.datapane.management.search.control.TreeSearchResult; +import com.fr.design.data.datapane.management.search.control.TreeSearchTask; +import com.fr.design.data.tabledata.wrapper.StoreProcedureDataWrapper; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author Yvan + */ +public class TableDataSearchTask implements TreeSearchTask { + + /** + * 用户搜索的文本 + */ + private String searchText; + + private TableDataWrapper tableDataWrapper; + + private TreeSearchCallback callback; + + public TableDataSearchTask(String searchText, TableDataWrapper tableDataWrapper, TreeSearchCallback callback) { + this.searchText = searchText; + this.tableDataWrapper = tableDataWrapper; + this.callback = callback; + } + + @Override + public void run() { + TreeSearchResult result; + try { + if (isTableDataStoreProcedure(tableDataWrapper)) { + result = dealWithStoreProcedureTableDataWrapper((StoreProcedureDataWrapper) tableDataWrapper); + } else { + result = dealWithCommonTableDataWrapper(tableDataWrapper); + } + } catch (Throwable e) { + FineLoggerFactory.getLogger().error(e, e.getMessage()); + result = dealWithErrorTableDataWrapper(tableDataWrapper); + } + callback.done(result); + } + + /** + * 处理错误情况 + * + * @param tableDataWrapper + */ + private TreeSearchResult dealWithErrorTableDataWrapper(TableDataWrapper tableDataWrapper) { + return new TableDataSearchResult.Builder().buildSuccess(false).build(); + } + + /** + * 处理普通数据集的搜索与匹配 + * + * @param tableDataWrapper + */ + private TreeSearchResult dealWithCommonTableDataWrapper(TableDataWrapper tableDataWrapper) { + String tableDataName = tableDataWrapper.getTableDataName(); + boolean isTableDataNameMatch = isMatchSearch(tableDataName, searchText); + List columnNameList = tableDataWrapper.calculateColumnNameList(); + // 没取到列名的话,代表取数那边出错了,就不添加数据集了 + if (columnNameList.size() == 0) { + return new TableDataSearchResult.Builder().buildSuccess(false).build(); + } + boolean isColumnMatch = columnNameList.stream().anyMatch(columnName -> isMatchSearch(columnName, searchText)); + return new TableDataSearchResult.Builder() + .buildSuccess(true) + .buildAddToMatch(isTableDataNameMatch || isColumnMatch ? Arrays.asList(tableDataName) : new ArrayList<>()) + .buildAddToExpand(isColumnMatch ? Arrays.asList(tableDataName) : new ArrayList<>()) + .buildAddToCalculated(Arrays.asList(tableDataName)) + .build(); + } + + /** + * 处理存储过程的搜索与匹配 + * + * @param procedureDataWrapper + */ + private TreeSearchResult dealWithStoreProcedureTableDataWrapper(StoreProcedureDataWrapper procedureDataWrapper) { + // 存储过程数据集名称,例如 Proc1_Table1 + String tableDataName = procedureDataWrapper.getTableDataName(); + // 存储过程名称,例如 Proc1 + String storeProcedureName = procedureDataWrapper.getStoreprocedureName(); + // 存储过程子表名称,例如 Table1 + String tableName = tableDataName.replaceFirst(storeProcedureName, StringUtils.EMPTY).replaceFirst("_", StringUtils.EMPTY); + boolean isStoreProcedureNameMatch = isMatchSearch(storeProcedureName, searchText); + boolean isTableNameMatch = isMatchSearch(tableName, searchText); + // 再处理子表的columns + List columnNameList = tableDataWrapper.calculateColumnNameList(); + boolean isColumnMatch = columnNameList.stream().anyMatch(columnName -> isMatchSearch(columnName, searchText)); + Set addToMatch = new HashSet<>(); + Set addToExpand = new HashSet<>(); + Set addToCalculated = new HashSet<>(); + if (isStoreProcedureNameMatch) { + addToMatch.add(storeProcedureName); + } + if (isTableNameMatch) { + addToMatch.add(storeProcedureName); + addToExpand.add(storeProcedureName); + } + if (isColumnMatch) { + addToMatch.add(storeProcedureName); + addToExpand.add(storeProcedureName); + // 这里有重名风险,所以要添加 “Proc1_Table1”,在结果树展示的时候再去处理 + addToExpand.add(tableDataName); + } + addToCalculated.add(tableDataName); + return new TableDataSearchResult.Builder() + .buildSuccess(true) + .buildAddToMatch(new ArrayList<>(addToMatch)) + .buildAddToExpand(new ArrayList<>(addToExpand)) + .buildAddToCalculated(new ArrayList<>(addToCalculated)) + .build(); + + } + + /** + * 判断TableDataWrapper内的TableData是否为存储过程 + * + * @param tableDataWrapper + * @return + */ + private boolean isTableDataStoreProcedure(TableDataWrapper tableDataWrapper) { + return tableDataWrapper instanceof StoreProcedureDataWrapper; + } + + /** + * 判断是否匹配搜索文本,不区分大小写 + * + * @param str + * @return + */ + private boolean isMatchSearch(String str, String searchText) { + return str.toUpperCase().contains(searchText.toUpperCase()); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/pre/TableDataPreSearchCallBack.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/pre/TableDataPreSearchCallBack.java new file mode 100644 index 0000000000..929c81a12a --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/pre/TableDataPreSearchCallBack.java @@ -0,0 +1,23 @@ +package com.fr.design.data.datapane.management.search.control.pre; + +import com.fr.design.data.datapane.management.search.control.TreeSearchResult; +import com.fr.design.data.datapane.management.search.control.common.TableDataSearchCallBack; +import com.fr.design.data.datapane.management.search.searcher.TableDataTreeSearcher; + +/** + * 预取数任务回调 + * + * @author Yvan + */ +public class TableDataPreSearchCallBack extends TableDataSearchCallBack { + + + public TableDataPreSearchCallBack(TableDataTreeSearcher treeSearcher) { + super(treeSearcher); + } + + @Override + public void done(TreeSearchResult treeSearchResult) { + // do nothing + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/pre/TableDataPreSearchResult.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/pre/TableDataPreSearchResult.java new file mode 100644 index 0000000000..6ebdb33aba --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/pre/TableDataPreSearchResult.java @@ -0,0 +1,40 @@ +package com.fr.design.data.datapane.management.search.control.pre; + +import com.fr.design.data.datapane.management.search.control.TreeSearchResult; + +import java.util.ArrayList; +import java.util.List; + +/** + * 预取数任务结果,不需要回调,因此空实现即可 + * + * @author Yvan + */ +public class TableDataPreSearchResult implements TreeSearchResult { + + private boolean success; + + public TableDataPreSearchResult(boolean success) { + this.success = success; + } + + @Override + public boolean isSuccess() { + return this.success; + } + + @Override + public List getAddToMatch() { + return new ArrayList<>(); + } + + @Override + public List getAddToExpand() { + return new ArrayList<>(); + } + + @Override + public List getAddToCalculated() { + return new ArrayList<>(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/pre/TableDataPreSearchTask.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/pre/TableDataPreSearchTask.java new file mode 100644 index 0000000000..7047b5ac16 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/control/pre/TableDataPreSearchTask.java @@ -0,0 +1,44 @@ +package com.fr.design.data.datapane.management.search.control.pre; + +import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; +import com.fr.design.data.datapane.management.search.control.TreeSearchTask; +import com.fr.design.data.datapane.management.search.control.common.TableDataSearchResult; +import com.fr.design.data.datapane.management.search.control.TreeSearchCallback; +import com.fr.design.data.datapane.management.search.control.TreeSearchResult; +import com.fr.design.data.datapane.management.search.searcher.TreeSearchStatus; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.log.FineLoggerFactory; + +/** + * 预取数任务 + * + * @author Yvan + */ +public class TableDataPreSearchTask implements TreeSearchTask { + + private TreeSearchCallback callback; + + private TableDataWrapper tableDataWrapper; + + public TableDataPreSearchTask(TreeSearchCallback callback, TableDataWrapper tableDataWrapper) { + this.callback = callback; + this.tableDataWrapper = tableDataWrapper; + } + + @Override + public void run() { + TreeSearchResult result; + try { + tableDataWrapper.calculateColumnNameList(); + result = new TableDataSearchResult.Builder() + .buildSuccess(true) + .build(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e, "calculate table data {} failed", tableDataWrapper.getTableDataName()); + result = new TableDataSearchResult.Builder() + .buildSuccess(false) + .build(); + } + callback.done(result); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/event/TreeSearchStatusChangeEvent.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/event/TreeSearchStatusChangeEvent.java new file mode 100644 index 0000000000..9d28e2d73d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/event/TreeSearchStatusChangeEvent.java @@ -0,0 +1,22 @@ +package com.fr.design.data.datapane.management.search.event; + +import com.fr.design.data.datapane.management.search.searcher.TreeSearchStatus; + +import java.util.EventObject; + +/** + * @author Yvan + */ +public class TreeSearchStatusChangeEvent extends EventObject { + + private TreeSearchStatus status; + + public TreeSearchStatusChangeEvent(Object source) { + super(source); + this.status = (TreeSearchStatus) source; + } + + public TreeSearchStatus getTreeSearchStatus() { + return status; + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/event/TreeSearchStatusChangeListener.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/event/TreeSearchStatusChangeListener.java new file mode 100644 index 0000000000..63dc4e698c --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/event/TreeSearchStatusChangeListener.java @@ -0,0 +1,11 @@ +package com.fr.design.data.datapane.management.search.event; + +import java.util.EventListener; + +/** + * @author Yvan + */ +public interface TreeSearchStatusChangeListener extends EventListener { + + void updateTreeSearchChange(TreeSearchStatusChangeEvent event); +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TableDataSearchRemindPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TableDataSearchRemindPane.java new file mode 100644 index 0000000000..23738338b7 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TableDataSearchRemindPane.java @@ -0,0 +1,213 @@ +package com.fr.design.data.datapane.management.search.pane; + +import com.fr.base.svg.IconUtils; +import com.fr.design.constants.UIConstants; +import com.fr.design.data.datapane.TableDataTree; +import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; +import com.fr.design.data.datapane.management.search.event.TreeSearchStatusChangeEvent; +import com.fr.design.data.datapane.management.search.event.TreeSearchStatusChangeListener; +import com.fr.design.data.datapane.management.search.searcher.TreeSearchStatus; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +/** + * @author Yvan + */ +public class TableDataSearchRemindPane extends JPanel implements TreeSearchStatusChangeListener { + + private RemindPane remindPane; + private TreePane treePane; + + public TableDataSearchRemindPane(TableDataTree tableDataTree) { + this.setLayout(new BorderLayout()); + remindPane = new RemindPane(); + treePane = new TreePane(tableDataTree); + // 初始状态 + this.add(remindPane, BorderLayout.NORTH); + this.add(treePane, BorderLayout.CENTER); + TableDataTreeSearchManager.getInstance().registerTreeSearchStatusChangeListener(this); + } + + /** + * 根据搜索状态变化,来调整自身面板的显示 + * + * @param event + */ + @Override + public void updateTreeSearchChange(TreeSearchStatusChangeEvent event) { + TreeSearchStatus status = event.getTreeSearchStatus(); + if (status == TreeSearchStatus.SEARCH_NOT_BEGIN || status == TreeSearchStatus.NOT_IN_SEARCH_MODE) { + remindPane.onNotBegin(); + treePane.onNotBegin(); + } else if (status == TreeSearchStatus.SEARCHING) { + remindPane.onInSearching(); + treePane.onInSearching(); + } else if (status == TreeSearchStatus.SEARCH_STOPPED) { + remindPane.onStoppedSearching(); + treePane.onStoppedSearching(); + } else { + boolean matchSetsEmpty = TableDataTreeSearchManager.getInstance().isMatchSetsEmpty(); + // 代表是否搜索出结果 + remindPane.onDoneSearching(matchSetsEmpty); + treePane.onDoneSearching(matchSetsEmpty); + } + this.revalidate(); + } + + private interface TreeSearchStatusChange { + + void onNotBegin(); + + void onInSearching(); + + void onStoppedSearching(); + + void onDoneSearching(boolean matchSetsEmpty); + } + + private class TreePane extends JPanel implements TreeSearchStatusChange { + + private UIScrollPane scrollPane; + + private JPanel notFoundPane; + + private CardLayout cardLayout; + + private static final String SCROLL_PANE = "scrollPane"; + + private static final String NOT_FOUND_PANE = "notFoundPane"; + + public TreePane(TableDataTree tableDataTree) { + init(tableDataTree); + } + + private void init(TableDataTree tableDataTree) { + + scrollPane = new UIScrollPane(tableDataTree); + scrollPane.setBorder(null); + + notFoundPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 5); + UILabel emptyPicLabel = new UILabel(); + emptyPicLabel.setIcon(IconUtils.readIcon("com/fr/base/images/share/no_match_icon.png")); + emptyPicLabel.setHorizontalAlignment(SwingConstants.CENTER); + emptyPicLabel.setPreferredSize(new Dimension(240, 100)); + UILabel textLabel = new UILabel(Toolkit.i18nText("Fine-Design_Tree_Search_Not_Match"), SwingConstants.CENTER); + textLabel.setForeground(Color.gray); + textLabel.setHorizontalAlignment(SwingConstants.CENTER); + textLabel.setPreferredSize(new Dimension(240, 20)); + notFoundPane.add(emptyPicLabel); + notFoundPane.add(textLabel); + notFoundPane.setBorder(BorderFactory.createEmptyBorder(80, 0, 0, 0)); + + cardLayout = new CardLayout(); + this.setLayout(cardLayout); + this.add(scrollPane, SCROLL_PANE); + this.add(notFoundPane, NOT_FOUND_PANE); + cardLayout.show(this, SCROLL_PANE); + } + + @Override + public void onNotBegin() { + switchPane(SCROLL_PANE); + } + + @Override + public void onInSearching() { + switchPane(SCROLL_PANE); + } + + @Override + public void onStoppedSearching() { + switchPane(SCROLL_PANE); + } + + @Override + public void onDoneSearching(boolean matchSetsEmpty) { + if (matchSetsEmpty) { + switchPane(NOT_FOUND_PANE); + } + } + + private void switchPane(String paneName) { + cardLayout.show(this, paneName); + } + } + + private static class RemindPane extends JPanel implements TreeSearchStatusChange { + + private static final String IN_SEARCHING = Toolkit.i18nText("Fine-Design_Tree_Search_In_Searching"); + private static final String STOP_SEARCHING = Toolkit.i18nText("Fine-Design_Tree_Search_Stop_Search"); + private static final String SEARCHING_STOPPED = Toolkit.i18nText("Fine-Design_Tree_Search_Search_Stopped"); + private static final String DONE_SEARCHING = Toolkit.i18nText("Fine-Design_Tree_Search_Search_Completed"); + + private UILabel textLabel; + + private UILabel stopLabel; + + private MouseListener stopSearch; + + public RemindPane() { + init(); + } + + private void init() { + this.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0)); + // 初始情况下为Not_Begin + textLabel = new UILabel(); + textLabel.setForeground(Color.gray); + stopLabel = new UILabel(); + stopLabel.setForeground(UIConstants.NORMAL_BLUE); + stopSearch = new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + TableDataTreeSearchManager.getInstance().stopSearch(); + } + }; + stopLabel.addMouseListener(stopSearch); + this.add(textLabel); + this.add(stopLabel); + onNotBegin(); + } + + @Override + public void onNotBegin() { + this.setVisible(false); + } + + @Override + public void onInSearching() { + this.textLabel.setText(IN_SEARCHING); + this.stopLabel.setText(STOP_SEARCHING); + this.stopLabel.setVisible(true); + this.setVisible(true); + } + + @Override + public void onStoppedSearching() { + this.textLabel.setText(SEARCHING_STOPPED); + this.stopLabel.setVisible(false); + this.setVisible(true); + } + + @Override + public void onDoneSearching(boolean matchSetsEmpty) { + this.textLabel.setText(DONE_SEARCHING); + this.stopLabel.setVisible(false); + this.setVisible(true); + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java new file mode 100644 index 0000000000..2d37395b41 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java @@ -0,0 +1,199 @@ +package com.fr.design.data.datapane.management.search.pane; + +import com.fr.base.svg.IconUtils; +import com.fr.design.DesignModelAdapter; +import com.fr.design.constants.UIConstants; +import com.fr.design.data.datapane.TableDataTreePane; +import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; +import com.fr.design.data.datapane.management.search.event.TreeSearchStatusChangeEvent; +import com.fr.design.data.datapane.management.search.event.TreeSearchStatusChangeListener; +import com.fr.design.data.datapane.management.search.searcher.TreeSearchStatus; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.stable.StringUtils; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Panel; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * @author Yvan + */ +public class TreeSearchToolbarPane extends Panel implements TreeSearchStatusChangeListener { + + public static final String TOOLBAR_PANE = "toolbarPane"; + + public static final String SEARCH_PANE = "searchPane"; + + /** + * 工具栏 + */ + private UIToolbar toolbar; + + /** + * 工具栏面板 + */ + private JPanel toolbarPane; + + /** + * 搜索面板 + */ + private JPanel searchPane; + + /** + * 搜索输入框 + */ + private UITextField searchTextField; + + /** + * 内容面板 + */ + private JPanel contentPane; + + /** + * 卡片布局管理器 + */ + private CardLayout cardLayout; + + private final KeyAdapter enterPressed = new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + TableDataTreeSearchManager.getInstance().startSearch(searchTextField.getText()); + } + } + }; + + public TreeSearchToolbarPane(UIToolbar toolbar) { + this.toolbar = toolbar; + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + initToolbarPane(); + initSearchPane(); + initContentPane(); + add(contentPane, BorderLayout.CENTER); + setPreferredSize(new Dimension(240, 30)); + TableDataTreeSearchManager.getInstance().registerTreeSearchStatusChangeListener(this); + } + + private void initContentPane() { + cardLayout = new CardLayout(); + contentPane = new JPanel(cardLayout); + contentPane.add(searchPane, SEARCH_PANE); + contentPane.add(toolbarPane, TOOLBAR_PANE); + cardLayout.show(contentPane, TOOLBAR_PANE); + } + + private void initSearchPane() { + searchPane = new JPanel(FRGUIPaneFactory.createBorderLayout()); + searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); + searchPane.setBackground(Color.WHITE); + // 左侧搜索图标 + UILabel searchLabel = new UILabel(IconUtils.readIcon("/com/fr/design/images/data/search")); + searchLabel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 0)); + searchLabel.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + // do nothing + } + }); + // 中间输入框 + searchTextField = new UITextField(); + searchTextField.setBorderPainted(false); + searchTextField.setPlaceholder(Toolkit.i18nText("Fine-Design_Tree_Search_Press_Enter_For_Search")); + searchTextField.addFocusListener(new FocusListener() { + @Override + public void focusGained(FocusEvent e) { + searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.NORMAL_BLUE)); + searchPane.repaint(); + } + + @Override + public void focusLost(FocusEvent e) { + searchPane.setBorder(BorderFactory.createLineBorder(UIConstants.TOOLBAR_BORDER_COLOR)); + searchPane.repaint(); + } + }); + this.searchTextField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + } + + @Override + public void removeUpdate(DocumentEvent e) { + dealWithTextChange(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + } + }); + this.searchTextField.addKeyListener(enterPressed); + // 右侧返回图标 + UILabel returnLabel = new UILabel(IconUtils.readIcon("/com/fr/design/images/data/clear")); + returnLabel.setToolTipText(Toolkit.i18nText("Fine-Design_Tree_Search_Return")); + returnLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + returnLabel.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + searchTextField.setText(StringUtils.EMPTY); + TableDataTreeSearchManager.getInstance().outOfSearchMode(); + switchPane(TOOLBAR_PANE); + } + }); + + searchPane.add(searchLabel, BorderLayout.WEST); + searchPane.add(searchTextField, BorderLayout.CENTER); + searchPane.add(returnLabel, BorderLayout.EAST); + } + + private void dealWithTextChange() { + if (StringUtils.isEmpty(searchTextField.getText()) && TableDataTreeSearchManager.getInstance().isInSearchMode()) { + // 如果是搜索模式下,看作是用户删除输入框文字,仅复原TableDataTreePane + TableDataTreeSearchManager.getInstance().restoreTreePane(); + TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()).refreshDockingView(); + } + } + + private void initToolbarPane() { + toolbarPane = new JPanel(); + toolbarPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + toolbarPane.add(toolbar, BorderLayout.CENTER); + } + + /** + * 交换当前面板层级 + */ + public void switchPane(String name) { + cardLayout.show(contentPane, name); + } + + public void setPlaceHolder(String placeHolder) { + this.searchTextField.setPlaceholder(placeHolder); + } + + /** + * 根据搜索状态变化,来调整自身面板的显示 + * + * @param event + */ + @Override + public void updateTreeSearchChange(TreeSearchStatusChangeEvent event) { + TreeSearchStatus treeSearchStatus = event.getTreeSearchStatus(); + switchPane(treeSearchStatus == TreeSearchStatus.NOT_IN_SEARCH_MODE ? TOOLBAR_PANE : SEARCH_PANE); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TableDataSearchMode.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TableDataSearchMode.java new file mode 100644 index 0000000000..d68455db56 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TableDataSearchMode.java @@ -0,0 +1,38 @@ +package com.fr.design.data.datapane.management.search.searcher; + +/** + * 搜索模式 + * + * @author Yvan + */ +public enum TableDataSearchMode { + + /** + * 搜索模板数据集 + */ + TEMPLATE_TABLE_DATA(0), + + /** + * 搜索服务器数据集 + */ + SERVER_TABLE_DATA(1); + + private final int mode; + + TableDataSearchMode(int mode) { + this.mode = mode; + } + + public int getMode() { + return mode; + } + + public static TableDataSearchMode match(int mode) { + for (TableDataSearchMode searchMode : TableDataSearchMode.values()) { + if (searchMode.getMode() == mode) { + return searchMode; + } + } + return TEMPLATE_TABLE_DATA; + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TableDataTreeSearcher.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TableDataTreeSearcher.java new file mode 100644 index 0000000000..672ef1e38a --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TableDataTreeSearcher.java @@ -0,0 +1,148 @@ +package com.fr.design.data.datapane.management.search.searcher; + +import com.fr.concurrent.NamedThreadFactory; +import com.fr.data.TableDataSource; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; +import com.fr.design.data.datapane.management.search.control.common.TableDataSearchCallBack; +import com.fr.design.data.datapane.management.search.control.common.TableDataSearchTask; +import com.fr.design.data.datapane.management.search.control.pre.TableDataPreSearchCallBack; +import com.fr.design.data.datapane.management.search.control.pre.TableDataPreSearchTask; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * @author Yvan + */ +public class TableDataTreeSearcher implements TreeSearcher { + + private ExecutorService executorService; + + private Map allWrappers = new ConcurrentHashMap<>(); + + private final Set calculatedSets = new HashSet<>(); + + private final Set notCalculatedSets = new HashSet<>(); + + private final Set matchSets = new HashSet<>(); + + private final Set canExpandSets = new HashSet<>(); + + public TableDataTreeSearcher() { + } + + public boolean isMatchSetsEmpty() { + return matchSets.isEmpty(); + } + + public int getAllWrappersSize() { + return allWrappers.size(); + } + + public synchronized void addToCalculatedSets(List tableDataNames) { + for (String tableDataName : tableDataNames) { + TableDataWrapper tableDataWrapper = allWrappers.get(tableDataName); + if (tableDataWrapper == null) { + return; + } + calculatedSets.add(tableDataName); + } + } + + public synchronized void addToMatchSets(List matchNodeNames) { + matchSets.addAll(matchNodeNames); + } + + public synchronized void addToCanExpandSets(List canExpandNodeNames) { + canExpandSets.addAll(canExpandNodeNames); + } + + + /** + * 正式搜索前,预加载一下数据集列名 + * + * @param searchMode + * @param tableDataSource + */ + public void beforeSearch(TableDataSearchMode searchMode, TableDataSource tableDataSource) { + executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new NamedThreadFactory(TableDataTreeSearcher.class)); + collectTableDataWrappers(searchMode, tableDataSource); + preCalculateColumns(); + } + + /** + * 预先对数据集进行取列名的操作,提升用户搜索体验 + */ + private void preCalculateColumns() { + for (String notCalculatedSet : notCalculatedSets) { + TableDataWrapper tableDataWrapper = allWrappers.get(notCalculatedSet); + if (TableDataTreeSearchManager.getInstance().getTreeSearchStatus() == TreeSearchStatus.SEARCH_NOT_BEGIN) { + executorService.execute(new TableDataPreSearchTask(new TableDataPreSearchCallBack(this), tableDataWrapper)); + } + } + } + + /** + * 收集下此次搜索需要进行取数的TableDataWrapper + * + * @param searchSubject + * @param tableDataSource + */ + private void collectTableDataWrappers(TableDataSearchMode searchSubject, TableDataSource tableDataSource) { + Map dataSet = searchSubject == TableDataSearchMode.TEMPLATE_TABLE_DATA ? + DesignTableDataManager.getTemplateDataSet(tableDataSource) : + DesignTableDataManager.getGlobalDataSet(); + // 转化一下存储过程 + Map setIncludingProcedure = DesignTableDataManager.getAllDataSetIncludingProcedure(dataSet); + notCalculatedSets.addAll(setIncludingProcedure.keySet()); + allWrappers.putAll(setIncludingProcedure); + } + + @Override + public void startSearch(String searchText) { + reset(); + for (String notCalculatedSet : notCalculatedSets) { + TableDataWrapper tableDataWrapper = allWrappers.get(notCalculatedSet); + if (TableDataTreeSearchManager.getInstance().getTreeSearchStatus() == TreeSearchStatus.SEARCHING) { + executorService.execute(new TableDataSearchTask(searchText, tableDataWrapper, new TableDataSearchCallBack(this))); + } + } + } + + @Override + public void stopSearch() { + + } + + @Override + public void completeSearch() { + + } + + private void reset() { + matchSets.clear(); + canExpandSets.clear(); + calculatedSets.clear(); + notCalculatedSets.addAll(allWrappers.keySet()); + } + + public void afterSearch() { + allWrappers.clear(); + executorService.shutdownNow(); + } + + public boolean nodeMatches(String dsName) { + return matchSets.contains(dsName); + } + + public boolean nodeCanExpand(String dsName) { + return canExpandSets.contains(dsName); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TreeSearchStatus.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TreeSearchStatus.java new file mode 100644 index 0000000000..ff577995f2 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TreeSearchStatus.java @@ -0,0 +1,28 @@ +package com.fr.design.data.datapane.management.search.searcher; + +/** + * @author Yvan + */ +public enum TreeSearchStatus { + + /** + * 非搜索模式 + */ + NOT_IN_SEARCH_MODE, + /** + * 搜索未开始 + */ + SEARCH_NOT_BEGIN, + /** + * 搜索中 + */ + SEARCHING, + /** + * 搜索已停止 + */ + SEARCH_STOPPED, + /** + * 搜索已完成 + */ + SEARCH_COMPLETED; +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TreeSearcher.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TreeSearcher.java new file mode 100644 index 0000000000..b6f6944706 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/searcher/TreeSearcher.java @@ -0,0 +1,27 @@ +package com.fr.design.data.datapane.management.search.searcher; + + +/** + * 用于搜索RefreshableJTree数据的搜索器 + * + * @author Yvan + */ +public interface TreeSearcher { + + /** + * 开始搜索 + * + * @param text + */ + void startSearch(String text); + + /** + * 停止搜索 + */ + void stopSearch(); + + /** + * 搜索完成 + */ + void completeSearch(); +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/view/TreeSearchRendererHelper.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/view/TreeSearchRendererHelper.java new file mode 100644 index 0000000000..cf348f1286 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/view/TreeSearchRendererHelper.java @@ -0,0 +1,82 @@ +package com.fr.design.data.datapane.management.search.view; + +import com.fr.design.data.datapane.TableDataTree; + +import javax.swing.JTree; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.TreeCellRenderer; +import java.awt.Component; +import java.util.regex.Pattern; + +/** + * @author Yvan + */ +public class TreeSearchRendererHelper { + + /** + * 缓存下原来的渲染器 + */ + private TreeCellRenderer originTreeCellRenderer; + + public TreeSearchRendererHelper() { + } + + public TreeCellRenderer getOriginTreeCellRenderer() { + return originTreeCellRenderer; + } + + public void setOriginTreeCellRenderer(TreeCellRenderer originTreeCellRenderer) { + this.originTreeCellRenderer = originTreeCellRenderer; + } + + public void replaceTreeRenderer(TableDataTree tableDataTree, String searchText) { + tableDataTree.setCellRenderer(getNewTreeCellRenderer(searchText)); + } + + public void save(TableDataTree tableDataTree) { + if (getOriginTreeCellRenderer() == null) { + setOriginTreeCellRenderer(tableDataTree.getTableDataTreeCellRenderer()); + } + } + + public void restore(TableDataTree tableDataTree) { + if (getOriginTreeCellRenderer() != null) { + tableDataTree.setCellRenderer(getOriginTreeCellRenderer()); + } + } + + /** + * 获取新树渲染器,也就是搜索结果树的TreeCellRenderer,主要是为了文本高亮 + * + * @param searchText + * @return + */ + private TreeCellRenderer getNewTreeCellRenderer(String searchText) { + return new DefaultTreeCellRenderer() { + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + Component treeCellRendererComponent = getOriginTreeCellRenderer().getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + if (treeCellRendererComponent instanceof DefaultTreeCellRenderer) { + DefaultTreeCellRenderer defaultTreeCellRenderer = (DefaultTreeCellRenderer) treeCellRendererComponent; + String text = defaultTreeCellRenderer.getText(); + defaultTreeCellRenderer.setText(getHighlightText(text, searchText)); + } + return treeCellRendererComponent; + } + }; + } + + private String getHighlightText(String text, String textToHighlight) { + String highLightTemplate = "$1"; + if (textToHighlight.length() == 0) { + return text; + } + try { + text = text.replaceAll("(?i)(" + Pattern.quote(textToHighlight) + ")", highLightTemplate); + } catch (Exception e) { + return text; + } + text = "" + text + ""; + return text; + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/paste/TableDataFollowingPasteUtils.java b/designer-base/src/main/java/com/fr/design/data/tabledata/paste/TableDataFollowingPasteUtils.java new file mode 100644 index 0000000000..5884bcbbcf --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/paste/TableDataFollowingPasteUtils.java @@ -0,0 +1,340 @@ +package com.fr.design.data.tabledata.paste; + +import com.fr.base.TableData; +import com.fr.base.chart.BaseChartCollection; +import com.fr.data.TableDataSource; +import com.fr.design.DesignModelAdapter; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.datapane.TableDataTreePane; +import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; +import com.fr.design.data.tabledata.wrapper.AbstractTableDataWrapper; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; +import com.fr.form.FormElementCaseProvider; +import com.fr.form.data.DataBinding; +import com.fr.form.data.DataTableConfig; +import com.fr.form.main.Form; +import com.fr.form.main.WidgetGather; +import com.fr.form.ui.DataControl; +import com.fr.form.ui.DictionaryContainer; +import com.fr.form.ui.ElementCaseEditor; +import com.fr.form.ui.Widget; +import com.fr.form.ui.concept.data.ValueInitializer; +import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; +import com.fr.report.cell.FloatElement; +import com.fr.report.cell.tabledata.ElementUsedTableDataProvider; +import com.fr.report.worksheet.FormElementCase; +import com.fr.stable.StringUtils; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 数据集跟随复制粘贴的工具类 + * + * @author Yvan + */ +public class TableDataFollowingPasteUtils { + + private static final String UNDERLINE = "_"; + + /** + * 粘贴所有Map中的tabledata到当前模板 + * + * @param tableDataWrapperMap + */ + public static void paste(Map tableDataWrapperMap) { + if (tableDataWrapperMap == null) { + return; + } + // 获取当前的TableDataTreePane + DesignModelAdapter currentModelAdapter = DesignModelAdapter.getCurrentModelAdapter(); + TableDataTreePane tableDataTreePane = (TableDataTreePane) TableDataTreePane.getInstance(currentModelAdapter); + // 粘贴(添加)数据集 + for (Map.Entry dataWrapperEntry : tableDataWrapperMap.entrySet()) { + String dsName = dataWrapperEntry.getKey(); + // 处理名称重复情况 + if (isDsNameRepeated(dsName)) { + continue; + } + AbstractTableDataWrapper tableDataWrapper = new TemplateTableDataWrapper(dataWrapperEntry.getValue(), dsName); + AbstractTableDataPane tableDataPane = tableDataWrapper.creatTableDataPane(); + tableDataTreePane.addDataPane(tableDataPane, dsName); + } + } + + private static boolean isDsNameRepeated(String dsName) { + DesignModelAdapter currentModelAdapter = DesignModelAdapter.getCurrentModelAdapter(); + String[] allDSNames = DesignTableDataManager.getAllDSNames(currentModelAdapter.getBook()); + return Arrays.stream(allDSNames).anyMatch(name -> StringUtils.equals(name, dsName)); + } + + /** + * 处理 ElementUsedTableDataProvider,从中获取数据集名称 - 数据集Wrapper 的Map + * + * @param providers + * @return + */ + public static Map transferProvider2TableDataMap(ElementUsedTableDataProvider... providers) { + if (providers == null) { + return new HashMap<>(); + } + // 获取当前的所有模板数据集 + Map templateTableData = getCurrentTemplateTableDataWrapperIncludingProcedure(); + Map tempMap = new HashMap<>(); + try { + for (ElementUsedTableDataProvider tableDataProvider : providers) { + Set usedTableDataNames = tableDataProvider.getElementUsedTableDataNames(); + for (String usedTableDataName : usedTableDataNames) { + if (templateTableData.containsKey(usedTableDataName)) { + tempMap.put(usedTableDataName, templateTableData.get(usedTableDataName).getTableData()); + } + } + } + // 处理存储过程名称问题 + return dealWithStoreProcedure(tempMap); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("transfer widget tabledata failed", e); + } + return new HashMap<>(); + } + + /** + * 处理结果集,将结果集中的存储过程子表替换为原本的存储过程,否则跟随粘贴过去的存储过程名称有问题 + * + * @param tableDataMap + */ + public static Map dealWithStoreProcedure(Map tableDataMap) { + Map resultMap = new HashMap<>(); + if (tableDataMap == null) { + return resultMap; + } + for (Map.Entry result : tableDataMap.entrySet()) { + String tableDataName = result.getKey(); + TableData tableData = result.getValue(); + // 判断名称中存在"_"的 + if (tableDataName.contains(UNDERLINE)) { + String matchedName = matchTableDataName(tableDataName, tableData); + resultMap.put(matchedName, tableData); + } else { + resultMap.put(tableDataName, tableData); + } + } + return resultMap; + } + + /** + * 存储过程子表名称匹配其存储过程数据集名称,其余模板数据集名称不变 + * + * @param tableDataName 待匹配的数据集名称 + * @param tableData + * @return + */ + private static String matchTableDataName(String tableDataName, TableData tableData) { + if (tableDataName == null) { + return null; + } + // 获取不包括存储过程子表的所有TableDataMap + Map dataWrapperMap = getCurrentTemplateTableDataWrapper(); + // 名称匹配时,直接返回 + if (dataWrapperMap.containsKey(tableDataName)) { + return tableDataName; + } + // 名称不匹配时,判断TableData是否一致 + for (Map.Entry dataWrapperEntry : dataWrapperMap.entrySet()) { + String tdName = dataWrapperEntry.getKey(); + TableData td = dataWrapperEntry.getValue().getTableData(); + if (ComparatorUtils.equals(td, tableData)) { + return tdName; + } + } + return tableDataName; + } + + + /** + * 提取控件内使用的数据集,转化成Map返回 + * + * @param widgets + * @return + */ + public static Map transferWidgetArray2TableDataMap(Widget... widgets) { + if (widgets == null) { + return new HashMap<>(); + } + // 获取当前的所有模板数据集 + Map templateTableData = getCurrentTemplateTableDataWrapperIncludingProcedure(); + Map tempMap = new HashMap<>(); + try { + for (Widget widget : widgets) { + // widget这个接口太大了,布局和子控件互相嵌套,所以只能分情况一个个收集 + collectTableDataInDictionary(templateTableData, tempMap, widget); + collectTableDataInWidgetValue(templateTableData, tempMap, widget); + collectTableDataInChartCollection(templateTableData, tempMap, widget); + collectTableDataInElementCaseEditor(templateTableData, tempMap, widget); + } + // 处理存储过程名称问题 + return dealWithStoreProcedure(tempMap); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("transfer widget tabledata failed", e); + } + return new HashMap<>(); + } + + /** + * 收集控件-报表块中使用的数据集 + * + * @param templateTableData + * @param tempMap + * @param widget + */ + private static void collectTableDataInElementCaseEditor(Map templateTableData, Map tempMap, Widget widget) { + Form.traversalWidget(widget, new WidgetGather() { + @Override + public void dealWith(Widget widget) { + ElementCaseEditor elementCaseEditor = (ElementCaseEditor) widget; + FormElementCaseProvider elementCase = elementCaseEditor.getElementCase(); + if (elementCase != null) { + // 普通单元格 + Iterator cellIterator = elementCase.cellIterator(); + while (cellIterator.hasNext()) { + ElementUsedTableDataProvider cellElement = (ElementUsedTableDataProvider) cellIterator.next(); + collectElement(cellElement); + } + // 悬浮元素 + Iterator floatIterator = ((FormElementCase) elementCase).floatIterator(); + while (floatIterator.hasNext()) { + ElementUsedTableDataProvider floatElement = floatIterator.next(); + collectElement(floatElement); + } + } + } + + private void collectElement(ElementUsedTableDataProvider provider) { + Set usedTableDataNames = provider.getElementUsedTableDataNames(); + for (String usedTableDataName : usedTableDataNames) { + if (templateTableData.containsKey(usedTableDataName)) { + tempMap.put(usedTableDataName, templateTableData.get(usedTableDataName).getTableData()); + } + } + } + + @Override + public boolean dealWithAllCards() { + return true; + } + }, ElementCaseEditor.class); + } + + /** + * 收集控件-图表中的TableData + * + * @param templateTableData + * @param tempMap + * @param widget + */ + private static void collectTableDataInChartCollection(Map templateTableData, Map tempMap, Widget widget) { + List chartCollections = widget.getChartCollections(); + for (BaseChartCollection chartCollection : chartCollections) { + Set dataSetNames = chartCollection.getDataSetNames(); + for (String dataSetName : dataSetNames) { + if (templateTableData.containsKey(dataSetName)) { + tempMap.put(dataSetName, templateTableData.get(dataSetName).getTableData()); + } + } + } + } + + /** + * 收集控件值中的TableData + * + * @param templateTableData + * @param tempMap + * @param widget + */ + private static void collectTableDataInWidgetValue(Map templateTableData, Map tempMap, Widget widget) { + Form.traversalWidget(widget, new WidgetGather() { + @Override + public void dealWith(Widget widget) { + if (((DataControl) widget).getWidgetValue() != null) { + ValueInitializer widgetValue = ((DataControl) widget).getWidgetValue(); + Object value = widgetValue.getValue(); + if (value instanceof DataBinding) { + String dataSourceName = ((DataBinding) value).getDataSourceName(); + if (templateTableData.containsKey(dataSourceName)) { + tempMap.put(dataSourceName, templateTableData.get(dataSourceName).getTableData()); + } + } + if (value instanceof DataTableConfig) { + String tableDataName = ((DataTableConfig) value).getTableDataName(); + if (templateTableData.containsKey(tableDataName)) { + tempMap.put(tableDataName, templateTableData.get(tableDataName).getTableData()); + } + } + } + } + + @Override + public boolean dealWithAllCards() { + return true; + } + }, DataControl.class); + + } + + /** + * 收集控件-数据字典中的TableData + * + * @param templateTableData + * @param tempMap + * @param widget + */ + private static void collectTableDataInDictionary(Map templateTableData, Map tempMap, Widget widget) { + Form.traversalWidget(widget, new WidgetGather() { + @Override + public void dealWith(Widget widget) { + Set usedTableDataSets = ((DictionaryContainer) widget).getUsedTableDataSets(); + for (String usedTableDataSet : usedTableDataSets) { + if (templateTableData.containsKey(usedTableDataSet)) { + tempMap.put(usedTableDataSet, templateTableData.get(usedTableDataSet).getTableData()); + } + } + } + + @Override + public boolean dealWithAllCards() { + return true; + } + }, DictionaryContainer.class); + } + + /** + * 获取当前所有的模板数据集,包括存储过程 + * + * @return + */ + private static Map getCurrentTemplateTableDataWrapperIncludingProcedure() { + Map templateTableDataWrapper = getCurrentTemplateTableDataWrapper(); + // 处理存储过程 + Map dataWrapperMap = DesignTableDataManager.getAllDataSetIncludingProcedure(templateTableDataWrapper); + return dataWrapperMap; + } + + /** + * 获取当前所有的模板数据集,不包括存储过程 + * + * @return + */ + private static Map getCurrentTemplateTableDataWrapper() { + TableDataSource tableDataSource = DesignTableDataManager.getEditingTableDataSource(); + List> editingDataSet = DesignTableDataManager.getEditingDataSet(tableDataSource); + Map templeteDataSet = editingDataSet.get(0); + return templeteDataSet; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java index 08274fd71d..515bd8dd08 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java @@ -63,26 +63,27 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { public StoreProcedureDataWrapper(Component component, StoreProcedure storeProcedure, String storeprocedureName, String dsName) { this(component, storeProcedure, storeprocedureName, dsName, true); } - + /** - * @param: component loadingBar的父弹框(如果不设置父弹框的话,可能出现loadingBar隐藏在一个弹框后的情况) - * @param: storeProcedure 存储过程 - * @param: storeprocedureName 存储过程的名字(某些情况下可以为空) - * @param: dsName 存储过程一个返回数据集的名字 - * @param: needLoad 是否要加载 + * @param component loadingBar的父弹框(如果不设置父弹框的话,可能出现loadingBar隐藏在一个弹框后的情况) + * @param storeProcedure 存储过程 + * @param storeprocedureName 存储过程的名字(某些情况下可以为空) + * @param dsName 存储过程一个返回数据集的名字 + * @param needLoad 是否要加载 **/ public StoreProcedureDataWrapper(Component component, StoreProcedure storeProcedure, String storeprocedureName, String dsName, boolean needLoad) { this.dsName = dsName; this.storeProcedure = storeProcedure; this.storeProcedure.setCalculating(false); this.storeprocedureName = storeprocedureName; - if (needLoad) { - setWorker(); - } if (component == null) { component = new JFrame(); } + if (needLoad) { + setWorker(component); + } loadingBar = new AutoProgressBar(component, Toolkit.i18nText("Fine-Design_Basic_Loading_Data"), "", 0, 100) { + @Override public void doMonitorCanceled() { getWorker().cancel(true); } @@ -93,16 +94,17 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { * 数据集执行结果返回的所有字段 * * @return 数据集执行结果返回的所有字段 - * - * - * @date 2014-12-3-下午7:43:17 - * - */ + * @date 2014-12-3-下午7:43:17 + */ + @Override public List calculateColumnNameList() { if (columnNameList != null) { return columnNameList; } - if (!createStore(false)) { + + try { + createStore(false); + } catch (Exception e) { FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Engine_No_TableData")); return new ArrayList(); } @@ -114,11 +116,9 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { * 生成子节点 * * @return 节点数组 - * - * - * @date 2014-12-3-下午7:06:47 - * - */ + * @date 2014-12-3-下午7:06:47 + */ + @Override public ExpandMutableTreeNode[] load() { List namelist; if (storeProcedure.isCalculating()) { @@ -134,23 +134,16 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { return res; } - private boolean createStore(boolean needLoadingBar) { - try { - dataModels = DesignTableDataManager.createLazyDataModel(storeProcedure, needLoadingBar); - if (dataModels == null || dataModels.length == 0) { - return false; - } - for (int i = 0; i < dataModels.length; i++) { - if (ComparatorUtils.equals(this.dsName, storeprocedureName + "_" + dataModels[i].getName())) { - procedureDataModel = dataModels[i]; + private void createStore(boolean needLoadingBar) throws Exception { + dataModels = DesignTableDataManager.createLazyDataModel(storeProcedure, needLoadingBar); + if (dataModels != null && dataModels.length != 0) { + for (ProcedureDataModel dataModel : dataModels) { + if (ComparatorUtils.equals(this.dsName, storeprocedureName + "_" + dataModel.getName())) { + procedureDataModel = dataModel; break; } } - return true; - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); } - return false; } @Override @@ -159,17 +152,15 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { } /** - * 预览数据 - * - * @param previewModel 预览模式, 全部还是一个 - * - * - * @date 2014-12-3-下午7:05:50 - * - */ + * 预览数据 + * + * @param previewModel 预览模式, 全部还是一个 + * @date 2014-12-3-下午7:05:50 + */ public void previewData(final int previewModel) { this.previewModel = previewModel; connectionBar = new AutoProgressBar(new JFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Now_Create_Connection"), "", 0, 100) { + @Override public void doMonitorCanceled() { connectionBar.close(); worker.cancel(true); @@ -178,8 +169,9 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { worker.execute(); } - private void setWorker() { + private void setWorker(final Component parent) { worker = new SwingWorker() { + @Override protected Void doInBackground() throws Exception { loadingBar.close(); PreviewTablePane.resetPreviewTable(); @@ -195,6 +187,7 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { return null; } + @Override public void done() { try { get(); @@ -206,13 +199,15 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { case StoreProcedureDataWrapper.PREVIEW_ONE: previewData(); break; + default: + break; } } catch (Exception e) { + loadingBar.close(); if (!(e instanceof CancellationException)) { FineLoggerFactory.getLogger().error(e.getMessage(), e); - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage()); + FineJOptionPane.showMessageDialog(parent, e.getMessage()); } - loadingBar.close(); } } }; @@ -227,10 +222,9 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { /** * 预览返回的一个数据集 * - * - * @date 2014-12-3-下午7:42:53 - * - */ + * @date 2014-12-3-下午7:42:53 + */ + @Override public void previewData() { previewData(-1, -1); } @@ -240,13 +234,11 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { /** * 预览返回的一个数据集,带有显示值和实际值的标记结果 * - * @param keyIndex 实际值 - * @param valueIndex 显示值 - * - * - * @date 2014-12-3-下午7:42:27 - * - */ + * @param keyIndex 实际值 + * @param valueIndex 显示值 + * @date 2014-12-3-下午7:42:27 + */ + @Override public void previewData(final int keyIndex, final int valueIndex) { PreviewTablePane.previewStoreData(procedureDataModel, keyIndex, valueIndex); } @@ -257,7 +249,9 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { */ public void previewAllTable() { if (procedureDataModel == null) { - if (!createStore(true)) { + try { + createStore(true); + } catch (Exception e) { return; } } @@ -269,6 +263,7 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { return dsName; } + @Override public TableData getTableData() { return storeProcedure; } @@ -282,10 +277,12 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { * * @return 是否异常 */ + @Override public boolean isUnusual() { return false; } + @Override public boolean equals(Object obj) { return obj instanceof StoreProcedureDataWrapper && ComparatorUtils.equals(this.dsName, ((StoreProcedureDataWrapper) obj).getTableDataName()) diff --git a/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java b/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java index a7d6eb6c17..ec8d997c3c 100644 --- a/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java +++ b/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java @@ -1,8 +1,6 @@ package com.fr.design.env; import com.fr.general.ComparatorUtils; -import com.fr.general.GeneralUtils; -import com.fr.locale.InterProviderFactory; import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; @@ -10,8 +8,8 @@ import com.fr.stable.project.ProjectConstants; import com.fr.stable.xml.XMLPrintWriter; import com.fr.stable.xml.XMLableReader; import com.fr.workspace.connect.WorkspaceConnectionInfo; - import com.fr.workspace.engine.exception.MainVersionNotMatchException; + import java.io.File; import java.util.Properties; diff --git a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java index f35fbdf116..f671f220bf 100644 --- a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java @@ -1,6 +1,6 @@ package com.fr.design.extra; -import com.fr.base.FRContext; +import com.fr.decision.webservice.v10.plugin.helper.category.impl.PluginResourceLoader; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.UIDialog; @@ -15,12 +15,12 @@ import com.fr.general.IOUtils; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.PluginStoreConfig; import com.fr.plugin.PluginStoreConstants; import com.fr.stable.CommonUtils; import com.fr.stable.EnvChangedListener; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; -import com.fr.stable.StringUtils; import javax.swing.JOptionPane; import javax.swing.SwingWorker; @@ -44,15 +44,15 @@ public class WebViewDlgHelper { private static final String LATEST = "latest"; private static final String SHOP_SCRIPTS = "shop_scripts"; private static final int VERSION_8 = 8; - private static String installHome = FRContext.getCommonOperator().getWebRootPath(); + private static String installHome = PluginStoreConstants.getLocalInstallHome(); private static final String MAIN_JS_PATH = "/scripts/plugin.html"; - private static final String ENV_VERSION = "ENV_VERSION"; static { GeneralContext.addEnvChangedListener(new EnvChangedListener() { @Override public void envChanged() { - installHome = FRContext.getCommonOperator().getWebRootPath(); + installHome = PluginStoreConstants.getLocalInstallHome(); + PluginResourceLoader.INSTANCE.checkOldShopFile(); } }); } @@ -74,8 +74,11 @@ public class WebViewDlgHelper { } return; } - String jar_version = PluginStoreConstants.getProps(ENV_VERSION, StringUtils.EMPTY); - if (ComparatorUtils.equals(jar_version, ProductConstants.VERSION)) { + // 检测更新前先刷新一下版本号 + PluginStoreConstants.refreshProps(); + + String jarVersion = PluginStoreConfig.getInstance().getEnvVersion(); + if (ComparatorUtils.equals(jarVersion, ProductConstants.VERSION)) { updateShopScripts(SHOP_SCRIPTS); showPluginDlg(); } else { @@ -133,7 +136,7 @@ public class WebViewDlgHelper { * * @param filePath 待删除文件路径 */ - private static void deleteExtraFile(String filePath){ + private static void deleteExtraFile(String filePath) { CommonIOUtils.deleteFile(new File(filePath)); } @@ -259,7 +262,7 @@ public class WebViewDlgHelper { try { if (get()) { File scriptZip = new File(StableUtils.pathJoin(PluginConstants.DOWNLOAD_PATH, PluginConstants.TEMP_FILE)); - if(scriptZip.exists()){ + if (scriptZip.exists()) { IOUtils.unzip(scriptZip, installHome); CommonUtils.deleteFile(scriptZip); } @@ -283,7 +286,7 @@ public class WebViewDlgHelper { protected Void doInBackground() throws Exception { String url = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.update"); if (url != null) { - String text = HttpToolbox.get(url + "?" + PluginUtils.FR_VERSION + "=" + ProductConstants.VERSION + "&version=" + PluginStoreConstants.getProps("VERSION")); + String text = HttpToolbox.get(url + "?" + PluginUtils.FR_VERSION + "=" + ProductConstants.VERSION + "&version=" + PluginStoreConfig.getInstance().getVersion()); JSONObject resultJSONObject = new JSONObject(text); String isLatest = resultJSONObject.optString("result"); if (!ComparatorUtils.equals(isLatest, LATEST)) { diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index 443a55671d..d6b12efa62 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -24,7 +24,6 @@ import com.fr.stable.CoreConstants; import com.fr.stable.StringUtils; import com.fr.third.org.apache.commons.io.FilenameUtils; -import javax.swing.SwingWorker; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -44,7 +43,6 @@ public class HistoryTemplateListCache implements CallbackEvent { private static final int DEAD_LINE = DesignerEnvManager.getEnvManager().getCachingTemplateLimit(); private List> historyList; private JTemplate editingTemplate; - private SwingWorker stashWorker; public static HistoryTemplateListCache getInstance() { return Holder.INSTANCE; @@ -342,14 +340,7 @@ public class HistoryTemplateListCache implements CallbackEvent { * @see HistoryTemplateListCache#load() */ public void stash() { - stashWorker = new SwingWorker() { - @Override - protected Boolean doInBackground() throws Exception { - _stash(); - return true; - } - }; - stashWorker.execute(); + _stash(); } private void _stash() { @@ -370,16 +361,6 @@ public class HistoryTemplateListCache implements CallbackEvent { FineLoggerFactory.getLogger().info("Env Change Template Stashed."); } - - private boolean checkStash() { - try { - return stashWorker.get(); - } catch (Exception e) { - FineLoggerFactory.getLogger().debug(e.getMessage(), e); - return false; - } - } - /** * 切换环境前将正在编辑的模板暂存起来后,在新环境重新读取一遍 *

@@ -388,9 +369,6 @@ public class HistoryTemplateListCache implements CallbackEvent { * @see HistoryTemplateListCache#stash() */ public void load() { - if (!checkStash()) { - return; - } FineLoggerFactory.getLogger().info("Env Change Template Loading..."); if (stashFILEMap != null && stashFILEMap.size() != 0) { int size = historyList.size(); diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index a6346c4dde..6fdb5666c3 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -14,6 +14,7 @@ import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.dialog.DialogActionListener; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.autocomplete.AutoCompleteExtraRefreshComponent; @@ -63,6 +64,7 @@ import com.fr.stable.script.Node; import com.fr.stable.script.Tiny; import com.fr.stable.script.TinyHunter; +import java.awt.Window; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; @@ -736,6 +738,13 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Formula_Definition"); } + public BasicDialog showLargeWindow(Window window, DialogActionListener l) { + BasicDialog basicDialog = super.showWindowWithCustomSize(window, l, new Dimension(900, 600)); + basicDialog.setMinimumSize(new Dimension(900, 600)); + basicDialog.setResizable(true); + return basicDialog; + } + /** * Populate */ @@ -1102,6 +1111,7 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { private void initGroupTypeModel() { functionTypeListModel.addElement(FunctionConstants.COMMON); + functionTypeListModel.addElement(FunctionConstants.NEW); for (int i = 0; i < FunctionConstants.EMBFUNCTIONS.length; i++) { functionTypeListModel.addElement(FunctionConstants.EMBFUNCTIONS[i]); } @@ -1186,9 +1196,6 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { descriptionTextArea = new UITextArea(); descriptionTextArea.setPreferredSize(new Dimension(350, 200)); - UIScrollPane desScrollPane = new UIScrollPane(descriptionTextArea); - desScrollPane.setBorder(null); - this.add(this.createNamePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Formula_Description") + ":", desScrollPane), BorderLayout.EAST); descriptionTextArea.setBackground(Color.white); descriptionTextArea.setLineWrap(true); descriptionTextArea.setWrapStyleWord(true); @@ -1256,12 +1263,13 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { private void initVariablesTree() { + JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); // vairable. variablesTree = new JTree(); UIScrollPane variablesTreePane = new UIScrollPane(variablesTree); variablesTreePane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); - this.add(this.createNamePane( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Variables") + ":", variablesTreePane), BorderLayout.CENTER); + panel.add(this.createNamePane( + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Variables") + ":", variablesTreePane), BorderLayout.WEST); variablesTree.setRootVisible(false); variablesTree.setShowsRootHandles(true); variablesTree.addMouseListener(applyTextMouseListener); @@ -1269,7 +1277,11 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { initDescriptionTextArea(); + UIScrollPane desScrollPane = new UIScrollPane(descriptionTextArea); + desScrollPane.setBorder(null); + panel.add(this.createNamePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Formula_Description") + ":", desScrollPane), BorderLayout.CENTER); initVariablesTreeSelectionListener(); + this.add(panel,BorderLayout.CENTER); } private void initComponents() { diff --git a/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java b/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java index 28bb985552..6235551ec4 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java +++ b/designer-base/src/main/java/com/fr/design/formula/FunctionConstants.java @@ -5,10 +5,19 @@ import com.fr.function.AVERAGE; import com.fr.function.CHAR; import com.fr.function.COUNT; import com.fr.function.DATE; +import com.fr.function.ENBYSTRNUM; +import com.fr.function.ENDOFMONTH; +import com.fr.function.GCD; +import com.fr.function.GETCHARNUM; +import com.fr.function.ISWORKDAY; +import com.fr.function.LCM; import com.fr.function.MAX; +import com.fr.function.MIDCHAR; import com.fr.function.MIN; +import com.fr.function.NUMTOZH; import com.fr.function.RANGE; import com.fr.function.SUM; +import com.fr.function.TEXTGETNUM; import com.fr.function.TIME; import com.fr.general.ComparatorUtils; import com.fr.general.GeneralUtils; @@ -36,6 +45,7 @@ import java.util.Comparator; import java.util.Enumeration; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -46,6 +56,8 @@ public final class FunctionConstants { public static NameAndFunctionList COMMON = getCommonFunctionList(); public static NameAndTypeAndFunctionList[] EMBFUNCTIONS = getEmbededFunctionListArray(); public static FunctionGroup ALL = getAllFunctionGroup(); + public static List abandonFormulas = Arrays.asList("CIRCULAR", "CROSSLAYERTOTAL", "HIERARCHY", "LAYERTOTAL"); + public static NameAndFunctionList NEW = getNewFunctionList(); static { loadEmbededFunctions(); @@ -54,7 +66,8 @@ public final class FunctionConstants { /** * Don't let anyone instantiate this class. */ - private FunctionConstants() {} + private FunctionConstants() { + } private static void loadEmbededFunctions() { String pkgName = "com.fr.function"; @@ -88,7 +101,10 @@ public final class FunctionConstants { Class cls = Class.forName(pkgName + "." + fileName.substring(0, fileName.length() - 6)); if (StableUtils.classInstanceOf(cls, iface)) { Function inst; - inst = (Function)cls.newInstance(); + inst = (Function) cls.newInstance(); + if (abandonFormulas.contains(inst.getClass().getSimpleName())) { + continue; + } for (NameAndTypeAndFunctionList EMBFUNCTION : EMBFUNCTIONS) { if (EMBFUNCTION.test(inst)) { break; @@ -270,6 +286,13 @@ public final class FunctionConstants { }); } + private static NameAndFunctionList getNewFunctionList() { + return new NameAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_New"), new Function[]{ + new ENDOFMONTH(), new NUMTOZH(), new MIDCHAR(), new ISWORKDAY(), new ENBYSTRNUM(), new TEXTGETNUM(), + new GETCHARNUM(), new GCD(), new LCM() + }); + } + private static NameAndTypeAndFunctionList[] getEmbededFunctionListArray() { return new NameAndTypeAndFunctionList[] { new NameAndTypeAndFunctionList(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FormulaD_Math_&_Trig"), Function.MATH), @@ -300,11 +323,12 @@ public final class FunctionConstants { Collections.addAll(all, CUSTOM.getDescriptions()); //hugh:自定义函数分组 Set containers = ExtraClassManager.getInstance().getArray(FunctionDefContainer.MARK_STRING); - if(!containers.isEmpty()){ - for(Mutable container : containers){ - Collections.addAll(all,createFunctionGroup(((FunctionDefContainer)container)).getDescriptions()); + if (!containers.isEmpty()) { + for (Mutable container : containers) { + Collections.addAll(all, createFunctionGroup(((FunctionDefContainer) container)).getDescriptions()); } } + all = all.stream().filter(n -> !abandonFormulas.contains(n.getName())).collect(Collectors.toList()); Collections.sort(all, new Comparator() { @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java index 7ba536492a..034847a704 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIListControlPane.java @@ -34,6 +34,9 @@ public abstract class UIListControlPane extends UIControlPane implements ListCon private CommonShortCutHandlers commonHandlers; private ListControlPaneHelper helper; + // 目前被触发的事件 + private ListDataEvent currentEvent; + public UIListControlPane() { super(); @@ -96,7 +99,9 @@ public abstract class UIListControlPane extends UIControlPane implements ListCon nameableList.getModel().addListDataListener(new ListDataListener() { @Override public void intervalAdded(ListDataEvent e) { + setCurrentEvent(e); saveSettings(); + setCurrentEvent(null); } @Override @@ -321,4 +326,11 @@ public abstract class UIListControlPane extends UIControlPane implements ListCon } + public ListDataEvent getCurrentEvent() { + return currentEvent; + } + + public void setCurrentEvent(ListDataEvent currentEvent) { + this.currentEvent = currentEvent; + } } diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeControlPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeControlPane.java index 04e3626a4a..4c4785be01 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeControlPane.java @@ -42,14 +42,10 @@ public class JTreeControlPane extends ControlPane { private JTree tree; private DefaultTreeModel defaultTreeModel; - - boolean isEditor = false; - private UICheckBox isPerformanceFirst; - public JTreeControlPane(NameableCreator[] creators, BasicBeanPane updatePane, boolean isEditor) { + public JTreeControlPane(NameableCreator[] creators, BasicBeanPane updatePane) { this.initComponents(creators, updatePane); - this.isEditor = isEditor; } private void initComponents(NameableCreator[] creators, BasicBeanPane updatePane) { @@ -120,11 +116,7 @@ public class JTreeControlPane extends ControlPane { if (obj instanceof TreeNodeAttr[]) { treeNodeAttr = ((TreeNodeAttr[]) obj); isPerformanceFirst.setSelected(false); - } else if (obj instanceof TreeEditor) { - TreeEditor treeEditor = (TreeEditor) obj; - treeNodeAttr = treeEditor.getTreeNodeAttr(); - isPerformanceFirst.setSelected(treeEditor.isPerformanceFirst()); - } else if (obj instanceof TreeNodeWrapper) { + }else if (obj instanceof TreeNodeWrapper) { treeNodeAttr = ((TreeNodeWrapper) obj).getTreeNodeAttrs(); isPerformanceFirst.setSelected(((TreeNodeWrapper) obj).isPerformanceFirst()); } @@ -146,18 +138,8 @@ public class JTreeControlPane extends ControlPane { } public NameObject update() { - if (isEditor) { - TreeEditor treeEditor = new TreeEditor(); - - treeEditor.setTreeNodeAttr(updateTreeNodeAttr()); - - treeEditor.setPerformanceFirst(isPerformanceFirst.isSelected()); - - return new NameObject("tree", treeEditor); - } else { - TreeNodeWrapper treeNodeWrapper = new TreeNodeWrapper(isPerformanceFirst.isSelected(), updateTreeNodeAttr()); - return new NameObject("tree", treeNodeWrapper); - } + TreeNodeWrapper treeNodeWrapper = new TreeNodeWrapper(isPerformanceFirst.isSelected(), updateTreeNodeAttr()); + return new NameObject("tree", treeNodeWrapper); } public TreeNodeAttr[] updateTreeNodeAttr() { diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/TreeSettingPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/TreeSettingPane.java index db453c99f4..77d3aa583a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/TreeSettingPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/TreeSettingPane.java @@ -26,12 +26,18 @@ import java.awt.event.ItemListener; import java.util.Arrays; public class TreeSettingPane extends BasicPane implements DataCreatorUI { + /** + * 普通分层构建方式 + */ private JTreeControlPane controlPane; + /** + * 自动构建方式 + */ private JTreeAutoBuildPane autoBuildPane; /** - * 新的分层构建方式 + * 急速分层构建方式 */ private LayerDataControlPane layerDataControlPane; @@ -43,15 +49,15 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { private static final long serialVersionUID = 1762889323082827111L; private String[] buildWay = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DataTable_Build"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Auto_Build"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Layer_Build")}; + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Auto_Build"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Layer_Build")}; - public TreeSettingPane(boolean isEditor) { - this.initComponents(isEditor); + public TreeSettingPane() { + this.initComponents(); } - private void initComponents(boolean isEditor) { + private void initComponents() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel buildWayPanel= FRGUIPaneFactory.createMediumHGapFlowInnerContainer_M_Pane(); + JPanel buildWayPanel = FRGUIPaneFactory.createMediumHGapFlowInnerContainer_M_Pane(); buildWayPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); UILabel buildWayLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Build_Way") + " :"); buildWayPanel.add(buildWayLabel); @@ -65,8 +71,8 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { }); buildWayPanel.add(buildBox); - controlPane = new JTreeControlPane(new NameableCreator[] { treeNode }, - new TreeDataCardPane(), isEditor); + controlPane = new JTreeControlPane(new NameableCreator[]{treeNode}, + new TreeDataCardPane()); autoBuildPane = new JTreeAutoBuildPane(); layerDataControlPane = new LayerDataControlPane(); this.add(buildWayPanel, BorderLayout.NORTH); @@ -108,87 +114,14 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { } NameableCreator treeNode = new NameObjectCreator( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Gradation"), - "/com/fr/design/images/data/source/jdbcTableData.png", - TreeNodeAttr.class); - - /** - * - * @param treeEditor - */ - public void populate(TreeEditor treeEditor) { - boolean isAutoBuild = treeEditor.isAutoBuild(); - TreeAttr treeAttr = treeEditor.getTreeAttr(); - if (treeAttr != null) { - NameObject no = new NameObject("name", treeEditor); - controlPane.populate(no); - } - if (isAutoBuild) { - buildBox.setSelectedIndex(1); - TableDataDictionary dictionary = treeEditor.getDictionary(); - autoBuildPane.populate(dictionary); - } else if (treeEditor.isFastLayerBuild()) { - buildBox.setSelectedIndex(0); - java.util.List layerConfigList = treeEditor.getLayerConfigs(); - LayerConfig[] layerConfigs = new LayerConfig[layerConfigList.size()]; - int i = 0; - for (LayerConfig layerConfig : layerConfigList) { - layerConfigs[i++] = layerConfig; - } - this.layerDataControlPane.populate(new NameObject("Tree Layer Data", layerConfigs)); - } else { - buildBox.setSelectedIndex(2); - } - } + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Gradation"), + "/com/fr/design/images/data/source/jdbcTableData.png", + TreeNodeAttr.class); - /** - * 视图树的update - * @return - */ - public TreeEditor updateTreeEditor() { -// NameObject no = this.controlPane.update(); -// if (no != null) { -// return ((TreeEditor) no.getObject()); -// } -// -// return null; - TreeEditor te = new TreeEditor(); - if (buildBox.getSelectedIndex() == 1) { - TableDataDictionary dictionary = this.autoBuildPane.update(); - te.setAutoBuild(true); - te.setFastLayerBuild(false); - te.setDictionary(dictionary); - te.setNodeOrDict(dictionary); - } else if (buildBox.getSelectedIndex() == 2) { - te.setAutoBuild(false); - te.setFastLayerBuild(false); - NameObject no = this.controlPane.update(); - if (no != null) { - TreeEditor editor = (TreeEditor) no.getObject(); - te.setAllowBlank(editor.isAllowBlank()); - te.setEnabled(editor.isEnabled()); - te.setDirectEdit(editor.isDirectEdit()); - te.setErrorMessage(editor.getErrorMessage()); - te.setWidgetName(editor.getWidgetName()); - te.setVisible(editor.isVisible()); - te.setWaterMark(editor.getWaterMark()); - te.setRemoveRepeat(editor.isRemoveRepeat()); - te.setTreeAttr(editor.getTreeAttr()); - te.setTreeNodeAttr(editor.getTreeNodeAttr()); - te.setNodeOrDict(editor.getTreeNodeAttr()); - te.setPerformanceFirst(editor.isPerformanceFirst()); - } - } else { - LayerConfig[] configs = (LayerConfig[]) layerDataControlPane.update().getObject(); - te.setAutoBuild(false); - te.setFastLayerBuild(true); - te.setLayerConfigs(Arrays.asList(configs)); - } - return te; - } /** * 树节点属性的update + * * @return */ public Object updateTreeNodeAttrs() { @@ -207,64 +140,19 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { } /** - * 下拉树的update - * @return - */ - public TreeComboBoxEditor updateTreeComboBox() { - TreeComboBoxEditor tcb = new TreeComboBoxEditor(); - if (buildBox.getSelectedIndex() == 1) { - TableDataDictionary dictionary = this.autoBuildPane.update(); - tcb.setAutoBuild(true); - tcb.setFastLayerBuild(false); - tcb.setDictionary(dictionary); - tcb.setNodeOrDict(dictionary); - } else if (buildBox.getSelectedIndex() == 2) { - tcb.setAutoBuild(false); - tcb.setFastLayerBuild(false); - NameObject no = this.controlPane.update(); - if (no != null) { - if (no.getObject() instanceof TreeComboBoxEditor) { - return (TreeComboBoxEditor) no.getObject(); - } - - TreeEditor editor = (TreeEditor) no.getObject(); - tcb.setAllowBlank(editor.isAllowBlank()); - tcb.setEnabled(editor.isEnabled()); - tcb.setDirectEdit(editor.isDirectEdit()); - tcb.setErrorMessage(editor.getErrorMessage()); - tcb.setWidgetName(editor.getWidgetName()); - tcb.setVisible(editor.isVisible()); - tcb.setWaterMark(editor.getWaterMark()); - tcb.setRemoveRepeat(editor.isRemoveRepeat()); - tcb.setTreeAttr(editor.getTreeAttr()); - tcb.setTreeNodeAttr(editor.getTreeNodeAttr()); - tcb.setNodeOrDict(editor.getTreeNodeAttr()); - tcb.setPerformanceFirst(editor.isPerformanceFirst()); - } - }else { - LayerConfig[] configs = (LayerConfig[]) layerDataControlPane.update().getObject(); - tcb.setAutoBuild(false); - tcb.setFastLayerBuild(true); - tcb.setLayerConfigs(Arrays.asList(configs)); - } - return tcb; - } - - /** - * * @param nodeOrDict */ public void populate(Object nodeOrDict) { - if(nodeOrDict instanceof TreeNodeAttr[] || nodeOrDict instanceof TreeNodeWrapper) { + if (nodeOrDict instanceof TreeNodeAttr[] || nodeOrDict instanceof TreeNodeWrapper) { buildBox.setSelectedIndex(2); NameObject no = new NameObject("name", nodeOrDict); controlPane.populate(no); - } else if(nodeOrDict instanceof TableDataDictionary) { + } else if (nodeOrDict instanceof TableDataDictionary) { buildBox.setSelectedIndex(1); - autoBuildPane.populate((TableDataDictionary)nodeOrDict); - } else if (nodeOrDict instanceof NameObject) { + autoBuildPane.populate((TableDataDictionary) nodeOrDict); + } else if (nodeOrDict instanceof LayerConfig[]) { buildBox.setSelectedIndex(0); - layerDataControlPane.populate((NameObject) nodeOrDict); + layerDataControlPane.populate((LayerConfig[]) nodeOrDict); } } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java index 6d74e48015..eedc12058d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java @@ -179,7 +179,7 @@ public class LayerDataControlPane extends ControlPane { public void actionPerformed(ActionEvent e) { // TODO remove tree node int val = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?", - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (val != JOptionPane.OK_OPTION) { return; } @@ -193,36 +193,32 @@ public class LayerDataControlPane extends ControlPane { } } - public void populate(NameObject nameObject) { + public void populate(LayerConfig[] layerConfigs) { // 重新添加tree节点的时候需要remove掉原来的所有子节点 ((DefaultMutableTreeNode) defaultTreeModel.getRoot()).removeAllChildren(); - if (BEAN_NAME.equals(nameObject.getName())) { - Object obj = nameObject.getObject(); - LayerConfig[] layerConfigs = null; - if (obj instanceof LayerConfig[]) { - layerConfigs = ((LayerConfig[]) obj); - } + if (layerConfigs == null) { + return; + } - int count = layerConfigs == null ? 0 : layerConfigs.length; - //将树的层次一层一层的加上去 - DefaultMutableTreeNode node4root = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); - for (int i = 0; i < count; i++) { + int count = layerConfigs.length; + //将树的层次一层一层的加上去 + DefaultMutableTreeNode node4root = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); + for (int i = 0; i < count; i++) { - DefaultMutableTreeNode node4add = new DefaultMutableTreeNode( + DefaultMutableTreeNode node4add = new DefaultMutableTreeNode( new NameObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Gradation") + (i + 1), layerConfigs[i].clone())); - node4root.add(node4add); - node4root = node4add; - } - - defaultTreeModel.reload(); - expandAll(tree, true); - tree.setSelectionRow(0); + node4root.add(node4add); + node4root = node4add; } + + defaultTreeModel.reload(); + expandAll(tree, true); + tree.setSelectionRow(0); } - public NameObject update() { + public LayerConfig[] update() { - return new NameObject(BEAN_NAME, updateLayerDatas()); + return updateLayerDatas(); } private LayerConfig[] updateLayerDatas() { diff --git a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingFileChooser.java b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingFileChooser.java index 942c3430c1..47abaa8b67 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingFileChooser.java +++ b/designer-base/src/main/java/com/fr/design/gui/ifilechooser/SwingFileChooser.java @@ -32,7 +32,11 @@ class SwingFileChooser implements FileChooserProvider { @Override public File[] getSelectedFiles() { - return fileChooser.getSelectedFiles(); + if (ArrayUtils.isNotEmpty(fileChooser.getSelectedFiles())) { + return fileChooser.getSelectedFiles(); + } else { + return new File[]{fileChooser.getSelectedFile()}; + } } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java b/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java index 3106ebff70..2c1e6abf56 100644 --- a/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java +++ b/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java @@ -5,7 +5,6 @@ import com.fr.design.dialog.UIDialog; import com.fr.design.gui.ilable.UILabel; import com.fr.design.os.impl.SupportOSImpl; import com.fr.design.utils.DesignUtils; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.FRFont; import com.fr.stable.os.support.OSBasedAction; import com.fr.stable.os.support.OSSupportCenter; @@ -23,9 +22,15 @@ import java.awt.Frame; * 加载进度弹窗 */ public class ProgressDialog extends UIDialog { - private JProgressBar progressBar; + protected static final FRFont font = DesignUtils + .getDefaultGUIFont() + .applySize(14) + .applyForeground(new ColorUIResource(333334)); + + protected JProgressBar progressBar; private JDialog centerDialog; - private JLabel text; + protected JLabel text; + protected JPanel progressPanel; public ProgressDialog(Frame parent) { super(parent); @@ -42,30 +47,37 @@ public class ProgressDialog extends UIDialog { } private void initComponent(Frame parent) { + initProgressBar(); + initProgressPanel(); + initCenterDialog(parent); + } + protected void initCenterDialog(Frame parent) { centerDialog = new JDialog(this); centerDialog.setSize(new Dimension(482, 124)); centerDialog.setUndecorated(true); centerDialog.setLocationRelativeTo(parent); - JPanel panel = new JPanel(); - panel.setBorder(new UIProgressBorder(3, UIConstants.DEFAULT_BG_RULER, 14, 46, 47, 37, 47)); - panel.setLayout(new BorderLayout(4, 15)); + centerDialog.getContentPane().add(progressPanel); + } + + protected void initProgressBar() { progressBar = new JProgressBar(); progressBar.setUI(new ModernUIProgressBarUI()); progressBar.setBorderPainted(false); progressBar.setOpaque(false); progressBar.setBorder(null); progressBar.setMaximum(1000); - panel.add(progressBar, BorderLayout.CENTER); + } + + protected void initProgressPanel() { + progressPanel = new JPanel(); + progressPanel.setBorder(new UIProgressBorder(3, UIConstants.DEFAULT_BG_RULER, 14, 46, 47, 37, 47)); + progressPanel.setLayout(new BorderLayout(4, 15)); + progressPanel.add(progressBar, BorderLayout.CENTER); text = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_Project"), JLabel.CENTER); - FRFont font = DesignUtils - .getDefaultGUIFont() - .applySize(14) - .applyForeground(new ColorUIResource(333334)); text.setFont(font); - panel.add(text, BorderLayout.SOUTH); - panel.setVisible(true); - centerDialog.getContentPane().add(panel); + progressPanel.add(text, BorderLayout.SOUTH); + progressPanel.setVisible(true); } @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java index a22f2a302a..161c1c7c75 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java @@ -154,6 +154,13 @@ public abstract class RefreshableJTree extends CheckBoxTree { refresh((ExpandMutableTreeNode) this.getModel().getRoot(), childName); } + /** + * 刷新树,用于搜索结果的展示 + */ + public void refresh4TreeSearch() { + + } + /* * 刷新expandRoot节点下所有已打开的节点的UserObject,并打开isExpanded为true的TreeNode */ diff --git a/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java b/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java index 7e0db6051b..3e97743ff6 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/TextFormatPane.java @@ -58,8 +58,9 @@ public class TextFormatPane extends AbstractBasicStylePane implements GlobalName private static final Integer[] TYPES = new Integer[]{ FormatContents.NULL, FormatContents.NUMBER, FormatContents.CURRENCY, FormatContents.PERCENT, - FormatContents.SCIENTIFIC, FormatContents.DATE, - FormatContents.TIME, FormatContents.TEXT}; + FormatContents.THOUSANDTHS, FormatContents.SCIENTIFIC, + FormatContents.DATE, FormatContents.TIME, + FormatContents.TEXT}; private static final Integer[] DATE_TYPES = new Integer[]{FormatContents.NULL, FormatContents.DATE, FormatContents.TIME}; diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.java index 98b5265c39..d67cb22254 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.java @@ -13,12 +13,11 @@ import java.io.IOException; /** - * This class is a scanner generated by + * This class is a scanner generated by * JFlex 1.4.1 - * on 9/18/19 6:12 PM from the specification file - * /Users/3dot141/Downloads/FolxDownload/App/jflex-1.4.1/bin/FormulaTokenMaker.flex + * on 22-3-18 上午11:06 from the specification file + * /Users/hoky/Work/code/desiger-x/design/designer-base/src/main/resources/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex */ -@SuppressWarnings("squid:S1192") public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { /** This character denotes the end of file */ @@ -32,57 +31,57 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { public static final int YYINITIAL = 0; public static final int MLC = 1; - /** + /** * Translates characters to character classes */ - private static final String ZZ_CMAP_PACKED = - "\11\0\1\50\1\43\1\0\1\50\1\56\22\0\1\50\1\36\1\44"+ - "\1\57\1\60\1\65\1\132\1\33\1\31\1\31\1\51\1\7\1\64"+ - "\1\37\1\54\1\32\1\47\1\41\1\100\1\120\1\5\1\127\1\121"+ - "\1\5\1\126\1\3\1\70\1\63\1\34\1\30\1\35\1\27\1\61"+ - "\1\72\1\73\1\75\1\4\1\6\1\55\1\110\1\77\1\105\1\125"+ - "\1\116\1\53\1\112\1\104\1\76\1\111\1\113\1\101\1\74\1\106"+ - "\1\52\1\107\1\115\1\122\1\102\1\123\1\62\1\40\1\62\1\131"+ - "\1\2\1\0\1\24\1\46\1\21\1\10\1\11\1\12\1\25\1\66"+ - "\1\13\1\1\1\117\1\15\1\26\1\14\1\20\1\23\1\114\1\17"+ - "\1\16\1\67\1\22\1\45\1\71\1\42\1\103\1\124\1\130\1\133"+ - "\1\130\1\64\uff81\0"; - - /** + private static final String ZZ_CMAP_PACKED = + "\11\0\1\50\1\43\1\0\1\50\1\56\22\0\1\50\1\36\1\44" + + "\1\57\1\60\1\65\1\132\1\33\1\31\1\31\1\51\1\7\1\64" + + "\1\37\1\54\1\32\1\47\1\41\1\100\1\120\1\5\1\127\1\121" + + "\1\5\1\126\1\3\1\70\1\63\1\34\1\30\1\35\1\27\1\61" + + "\1\72\1\73\1\75\1\4\1\6\1\55\1\110\1\77\1\105\1\125" + + "\1\116\1\53\1\112\1\104\1\76\1\111\1\113\1\101\1\74\1\106" + + "\1\52\1\107\1\115\1\122\1\102\1\123\1\62\1\40\1\62\1\131" + + "\1\2\1\0\1\24\1\46\1\21\1\10\1\11\1\12\1\25\1\66" + + "\1\13\1\1\1\117\1\15\1\26\1\14\1\20\1\23\1\114\1\17" + + "\1\16\1\67\1\22\1\45\1\71\1\42\1\103\1\124\1\130\1\133" + + "\1\130\1\64\uff81\0"; + + /** * Translates characters to character classes */ private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); - /** + /** * Translates DFA states to action switch labels. */ private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\3\0\1\1\2\2\1\3\2\2\1\4\17\2\2\4"+ - "\1\5\1\4\1\6\4\4\1\2\1\7\1\10\2\2"+ - "\1\3\1\11\2\2\1\4\1\2\2\1\30\2\2\4"+ - "\2\12\1\13\5\12\1\14\2\12\1\2\2\15\2\3"+ - "\1\16\16\2\1\17\61\2\1\0\1\20\1\21\2\22"+ - "\1\23\1\6\2\10\1\24\2\2\1\15\13\2\6\1"+ - "\1\0\77\2\2\0\1\25\6\0\1\2\1\3\1\0"+ - "\1\3\1\15\1\16\2\2\1\17\11\2\1\17\16\2"+ - "\1\17\3\2\1\17\2\2\1\17\14\2\1\17\10\2"+ - "\1\17\17\2\1\17\1\2\1\17\1\6\1\26\1\6"+ - "\3\22\1\6\2\10\1\27\2\2\1\30\10\2\4\1"+ - "\1\31\4\1\6\0\26\2\1\17\2\2\1\17\10\2"+ - "\1\17\17\2\1\17\25\2\1\17\1\2\1\17\6\2"+ - "\10\0\1\2\1\16\1\0\4\2\1\17\6\2\1\17"+ - "\34\2\1\17\15\2\1\17\4\2\1\6\1\10\2\2"+ - "\2\30\5\2\7\1\4\0\1\31\4\0\12\2\1\17"+ - "\4\2\1\17\32\2\1\17\1\2\2\17\23\2\1\17"+ - "\2\2\2\0\1\32\2\0\1\33\27\2\1\17\7\2"+ - "\1\17\14\2\1\30\3\2\1\31\3\1\7\0\30\2"+ - "\1\17\2\2\1\17\12\2\4\0\36\2\2\1\1\31"+ - "\3\0\54\2\2\0\116\2"; + "\3\0\1\1\2\2\1\3\2\2\1\4\17\2\2\4" + + "\1\5\1\4\1\6\4\4\1\2\1\7\1\10\2\2" + + "\1\3\1\11\2\2\1\4\1\2\2\1\30\2\2\4" + + "\2\12\1\13\5\12\1\14\2\12\1\2\2\15\2\3" + + "\1\16\16\2\1\17\61\2\1\0\1\20\1\21\2\22" + + "\1\23\1\6\2\10\1\24\2\2\1\15\13\2\6\1" + + "\1\0\77\2\2\0\1\25\6\0\1\2\1\3\1\0" + + "\1\3\1\15\1\16\2\2\1\17\11\2\1\17\16\2" + + "\1\17\3\2\1\17\2\2\1\17\14\2\1\17\10\2" + + "\1\17\20\2\1\17\1\2\1\17\1\6\1\26\1\6" + + "\3\22\1\6\2\10\1\27\2\2\1\30\10\2\4\1" + + "\1\31\4\1\6\0\27\2\1\17\2\2\1\17\10\2" + + "\1\17\17\2\1\17\25\2\1\17\1\2\1\17\6\2" + + "\10\0\1\2\1\16\1\0\4\2\1\17\6\2\1\17" + + "\35\2\1\17\17\2\1\17\4\2\1\6\1\10\2\2" + + "\2\30\5\2\7\1\4\0\1\31\4\0\12\2\1\17" + + "\5\2\1\17\34\2\1\17\1\2\2\17\23\2\1\17" + + "\2\2\2\0\1\32\2\0\1\33\27\2\1\17\7\2" + + "\1\17\7\2\1\17\5\2\1\30\3\2\1\31\3\1" + + "\7\0\16\2\1\17\12\2\1\17\2\2\1\17\12\2" + + "\4\0\37\2\2\1\1\31\3\0\55\2\2\0\116\2"; private static int [] zzUnpackAction() { - int [] result = new int[887]; + int[] result = new int[899]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -101,126 +100,128 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { } - /** + /** * Translates a state to a row index in the transition table */ private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\134\0\270\0\u0114\0\u0170\0\u01cc\0\u0228\0\u0284"+ - "\0\u02e0\0\u033c\0\u0398\0\u03f4\0\u0450\0\u04ac\0\u0508\0\u0564"+ - "\0\u05c0\0\u061c\0\u0678\0\u06d4\0\u0730\0\u078c\0\u07e8\0\u0844"+ - "\0\u08a0\0\u08fc\0\u0958\0\u09b4\0\u0a10\0\u0a6c\0\u0ac8\0\u0b24"+ - "\0\u09b4\0\u0b80\0\u0114\0\u09b4\0\u0bdc\0\u0c38\0\u0c94\0\u0cf0"+ - "\0\u0d4c\0\u0da8\0\u0e04\0\u0e60\0\u0ebc\0\u09b4\0\u0f18\0\u09b4"+ - "\0\u0f74\0\u0fd0\0\u102c\0\u1088\0\u10e4\0\u1140\0\u119c\0\u11f8"+ - "\0\u1254\0\u12b0\0\u130c\0\u1368\0\u13c4\0\u1420\0\u147c\0\u14d8"+ - "\0\u1534\0\u1590\0\u15ec\0\u1648\0\u16a4\0\u1700\0\u175c\0\u17b8"+ - "\0\u1814\0\u1870\0\u18cc\0\u09b4\0\u1928\0\u1984\0\u19e0\0\u1a3c"+ - "\0\u1a98\0\u09b4\0\u1af4\0\u1b50\0\u1bac\0\u1c08\0\u1c64\0\u1cc0"+ - "\0\u1d1c\0\u1d78\0\u1dd4\0\u1e30\0\u1e8c\0\u1ee8\0\u1f44\0\u1fa0"+ - "\0\u1ffc\0\u2058\0\u20b4\0\u2110\0\u216c\0\u21c8\0\u2224\0\u2280"+ - "\0\u01cc\0\u22dc\0\u2338\0\u2394\0\u23f0\0\u244c\0\u24a8\0\u2504"+ - "\0\u2560\0\u25bc\0\u2618\0\u2674\0\u26d0\0\u272c\0\u2788\0\u27e4"+ - "\0\u2840\0\u289c\0\u28f8\0\u2954\0\u29b0\0\u2a0c\0\u2a68\0\u2ac4"+ - "\0\u2b20\0\u2b7c\0\u2bd8\0\u2c34\0\u2c90\0\u2cec\0\u2d48\0\u2da4"+ - "\0\u2e00\0\u2e5c\0\u2eb8\0\u2f14\0\u2f70\0\u2fcc\0\u3028\0\u3084"+ - "\0\u30e0\0\u313c\0\u3198\0\u31f4\0\u3250\0\u32ac\0\u3308\0\u3364"+ - "\0\u33c0\0\u341c\0\u3478\0\u09b4\0\u09b4\0\u34d4\0\u3530\0\u09b4"+ - "\0\u358c\0\u35e8\0\u3644\0\u09b4\0\u36a0\0\u36fc\0\u3758\0\u37b4"+ - "\0\u3810\0\u386c\0\u38c8\0\u3924\0\u3980\0\u39dc\0\u3a38\0\u3a94"+ - "\0\u3af0\0\u3b4c\0\u3ba8\0\u3c04\0\u3c60\0\u3cbc\0\u3d18\0\u3d74"+ - "\0\u3dd0\0\u3e2c\0\u3e88\0\u3ee4\0\u3f40\0\u3f9c\0\u3ff8\0\u4054"+ - "\0\u40b0\0\u410c\0\u4168\0\u41c4\0\u4220\0\u427c\0\u42d8\0\u4334"+ - "\0\u4390\0\u43ec\0\u4448\0\u44a4\0\u4500\0\u455c\0\u45b8\0\u4614"+ - "\0\u4670\0\u46cc\0\u4728\0\u4784\0\u47e0\0\u483c\0\u4898\0\u48f4"+ - "\0\u4950\0\u49ac\0\u4a08\0\u4a64\0\u4ac0\0\u4b1c\0\u4b78\0\u4bd4"+ - "\0\u4c30\0\u4c8c\0\u4ce8\0\u4d44\0\u4da0\0\u4dfc\0\u4e58\0\u4eb4"+ - "\0\u4f10\0\u4f6c\0\u4fc8\0\u5024\0\u5080\0\u50dc\0\u5138\0\u5194"+ - "\0\u51f0\0\u524c\0\u52a8\0\u5304\0\u5360\0\u53bc\0\u5418\0\u5474"+ - "\0\u54d0\0\u552c\0\u09b4\0\u5588\0\u55e4\0\u5640\0\u569c\0\u56f8"+ - "\0\u5754\0\u57b0\0\u580c\0\u5868\0\u1c08\0\u58c4\0\u1c08\0\u5920"+ - "\0\u597c\0\u59d8\0\u5a34\0\u5a90\0\u5aec\0\u5b48\0\u5ba4\0\u5c00"+ - "\0\u5c5c\0\u5cb8\0\u5d14\0\u5d70\0\u5dcc\0\u5e28\0\u5e84\0\u5ee0"+ - "\0\u5f3c\0\u5f98\0\u5ff4\0\u6050\0\u60ac\0\u6108\0\u6164\0\u61c0"+ - "\0\u621c\0\u6278\0\u62d4\0\u6330\0\u638c\0\u63e8\0\u6444\0\u64a0"+ - "\0\u64fc\0\u6558\0\u65b4\0\u6610\0\u666c\0\u66c8\0\u6724\0\u6780"+ - "\0\u67dc\0\u6838\0\u6894\0\u68f0\0\u694c\0\u69a8\0\u6a04\0\u6a60"+ - "\0\u6abc\0\u6b18\0\u6b74\0\u6bd0\0\u6c2c\0\u6c88\0\u6ce4\0\u6d40"+ - "\0\u6d9c\0\u6df8\0\u6e54\0\u6eb0\0\u6f0c\0\u6f68\0\u6fc4\0\u7020"+ - "\0\u707c\0\u70d8\0\u7134\0\u7190\0\u71ec\0\u7248\0\u72a4\0\u7300"+ - "\0\u735c\0\u73b8\0\u7414\0\u09b4\0\u7470\0\u74cc\0\u7528\0\u7584"+ - "\0\u75e0\0\u763c\0\u7698\0\u09b4\0\u76f4\0\u7750\0\u77ac\0\u7808"+ - "\0\u7864\0\u78c0\0\u791c\0\u7978\0\u79d4\0\u7a30\0\u7a8c\0\u7ae8"+ - "\0\u7b44\0\u7ba0\0\u7bfc\0\u7c58\0\u7cb4\0\u7d10\0\u7d6c\0\u7dc8"+ - "\0\u7e24\0\u7e80\0\u7edc\0\u7f38\0\u7f94\0\u7ff0\0\u804c\0\u80a8"+ - "\0\u8104\0\u8160\0\u81bc\0\u8218\0\u8274\0\u82d0\0\u832c\0\u8388"+ - "\0\u83e4\0\u8440\0\u849c\0\u84f8\0\u8554\0\u85b0\0\u860c\0\u8668"+ - "\0\u86c4\0\u8720\0\u877c\0\u87d8\0\u8834\0\u8890\0\u88ec\0\u8948"+ - "\0\u89a4\0\u8a00\0\u8a5c\0\u8ab8\0\u8b14\0\u8b70\0\u8bcc\0\u8c28"+ - "\0\u8c84\0\u8ce0\0\u8d3c\0\u8d98\0\u8df4\0\u8e50\0\u8eac\0\u8f08"+ - "\0\u8f64\0\u8fc0\0\u901c\0\u9078\0\u90d4\0\u9130\0\u918c\0\u91e8"+ - "\0\u9244\0\u92a0\0\u92fc\0\u9358\0\u93b4\0\u9410\0\u946c\0\u94c8"+ - "\0\u9524\0\u9580\0\u95dc\0\u9638\0\u9694\0\u96f0\0\u974c\0\u97a8"+ - "\0\u9804\0\u9860\0\u98bc\0\u9918\0\u9974\0\u99d0\0\u9a2c\0\u9a88"+ - "\0\u9ae4\0\u9b40\0\u9b9c\0\u9bf8\0\u9c54\0\u9cb0\0\u9d0c\0\u9d68"+ - "\0\u9dc4\0\u9e20\0\u9e7c\0\u9ed8\0\u9f34\0\u9f90\0\u9fec\0\u73b8"+ - "\0\ua048\0\ua0a4\0\ua100\0\ua15c\0\ua1b8\0\ua214\0\ua270\0\ua2cc"+ - "\0\ua328\0\ua384\0\ua3e0\0\ua43c\0\ua498\0\ua4f4\0\ua550\0\ua5ac"+ - "\0\ua608\0\ua664\0\ua6c0\0\ua71c\0\ua778\0\ua7d4\0\ua830\0\ua88c"+ - "\0\ua8e8\0\ua944\0\ua9a0\0\ua9fc\0\uaa58\0\uaab4\0\uab10\0\uab6c"+ - "\0\uabc8\0\uac24\0\uac80\0\uacdc\0\uad38\0\uad94\0\uadf0\0\uae4c"+ - "\0\uaea8\0\uaf04\0\uaf60\0\uafbc\0\ub018\0\ub074\0\ub0d0\0\ub12c"+ - "\0\ub188\0\ub1e4\0\ub240\0\ub29c\0\ub2f8\0\ub354\0\ub3b0\0\ub40c"+ - "\0\ub468\0\ub4c4\0\ub520\0\ub57c\0\ub5d8\0\ub634\0\ub690\0\ub6ec"+ - "\0\ub748\0\ub7a4\0\ub800\0\ub85c\0\ub8b8\0\ub914\0\ub970\0\ub9cc"+ - "\0\uba28\0\uba84\0\ubae0\0\ubb3c\0\ubb98\0\ubbf4\0\ubc50\0\ubcac"+ - "\0\ubd08\0\ubd64\0\ubdc0\0\ube1c\0\ube78\0\ubed4\0\ubf30\0\ubf8c"+ - "\0\ubfe8\0\uc044\0\uc0a0\0\uc0fc\0\uc158\0\uc1b4\0\uc210\0\uc26c"+ - "\0\uc2c8\0\uc324\0\uc380\0\uc3dc\0\uc438\0\u9a2c\0\uc494\0\uc4f0"+ - "\0\uc54c\0\uc5a8\0\uc604\0\uc660\0\uc6bc\0\uc718\0\uc774\0\uc7d0"+ - "\0\uc82c\0\uc888\0\uc8e4\0\uc940\0\uc99c\0\uc9f8\0\uca54\0\ucab0"+ - "\0\ucb0c\0\ucb68\0\ucbc4\0\ucc20\0\ucc7c\0\uccd8\0\ucd34\0\ucd90"+ - "\0\ucdec\0\uce48\0\ucea4\0\ucf00\0\ucf5c\0\ucfb8\0\ud014\0\ud070"+ - "\0\ud0cc\0\ud128\0\ud184\0\ud1e0\0\ud23c\0\ud298\0\ud2f4\0\ud350"+ - "\0\ud3ac\0\ud408\0\ud464\0\ud4c0\0\ud51c\0\ud578\0\ud5d4\0\ud630"+ - "\0\ud68c\0\ud6e8\0\ud744\0\ud7a0\0\ud7fc\0\ud858\0\ud8b4\0\ud910"+ - "\0\ud96c\0\ud9c8\0\uda24\0\uda80\0\udadc\0\udb38\0\udb94\0\udbf0"+ - "\0\udc4c\0\udca8\0\udd04\0\udd60\0\uddbc\0\ude18\0\ude74\0\uded0"+ - "\0\udf2c\0\udf88\0\udfe4\0\ue040\0\ue09c\0\ue0f8\0\ue154\0\ue1b0"+ - "\0\ue20c\0\ue268\0\ue2c4\0\ue320\0\ue37c\0\u6444\0\ue3d8\0\ue434"+ - "\0\ue490\0\ue4ec\0\ue548\0\ue5a4\0\ue600\0\ue65c\0\ue6b8\0\ue714"+ - "\0\ue770\0\ue7cc\0\ue828\0\ue884\0\ue8e0\0\ue93c\0\u1c08\0\ue998"+ - "\0\ue9f4\0\uea50\0\u0114\0\ueaac\0\ueb08\0\ueb64\0\uebc0\0\uec1c"+ - "\0\uec78\0\uecd4\0\ued30\0\ued8c\0\uede8\0\uee44\0\ueea0\0\ueefc"+ - "\0\uef58\0\uefb4\0\uf010\0\uf06c\0\uf0c8\0\uf124\0\uf180\0\uf1dc"+ - "\0\uf238\0\u8948\0\uf294\0\uf2f0\0\uf34c\0\uf3a8\0\uf404\0\uf460"+ - "\0\uf4bc\0\uf518\0\uf574\0\uf5d0\0\uf62c\0\uf688\0\uf6e4\0\uf740"+ - "\0\uf79c\0\uf7f8\0\uf854\0\uf8b0\0\uf90c\0\uf968\0\uf9c4\0\ufa20"+ - "\0\ufa7c\0\ufad8\0\ufb34\0\ufb90\0\ud8b4\0\ufbec\0\ud9c8\0\ufc48"+ - "\0\ufca4\0\ufd00\0\ufd5c\0\ufdb8\0\ufe14\0\ufe70\0\ufecc\0\uff28"+ - "\0\uff84\0\uffe0\1\74\1\230\1\364\1\u0150\1\u01ac\1\u0208"+ - "\1\u0264\1\u02c0\1\u031c\1\u0378\1\u03d4\1\u0430\1\u048c\1\u04e8"+ - "\1\u0544\1\u05a0\1\u05fc\1\u0658\1\u06b4\1\u0710\1\u076c\0\u09b4"+ - "\1\u07c8\1\u0824\1\u0880\1\u08dc\1\u0938\1\u0994\1\u09f0\1\u0a4c"+ - "\1\u0aa8\1\u0b04\1\u0b60\1\u0bbc\1\u0c18\1\u0c74\1\u0cd0\1\u0d2c"+ - "\1\u0d88\1\u0de4\1\u0e40\1\u0e9c\1\u0ef8\1\u0f54\1\u0fb0\1\u100c"+ - "\1\u1068\1\u10c4\1\u1120\1\u117c\1\u11d8\1\u1234\1\u1290\1\u12ec"+ - "\1\u1348\1\u13a4\1\u1400\1\u145c\1\u14b8\1\u1514\1\u1570\1\u15cc"+ - "\0\u7300\1\u1628\1\u1684\1\u16e0\1\u173c\1\u1798\1\u17f4\1\u1850"+ - "\1\u18ac\1\u1908\1\u1964\1\u19c0\1\u1a1c\0\u9ae4\1\u1a78\1\u1ad4"+ - "\1\u1b30\1\u1b8c\1\u1be8\1\u1c44\1\u1ca0\1\u1cfc\1\u1d58\1\u1db4"+ - "\1\u1e10\1\u1e6c\1\u1ec8\1\u1f24\1\u1f80\1\u1fdc\1\u2038\1\u2094"+ - "\1\u20f0\1\u214c\1\u21a8\1\u2204\1\u2260\1\u22bc\1\u2318\1\u2374"+ - "\1\u23d0\1\u242c\1\u2488\1\u24e4\1\u2540\1\u259c\1\u25f8\1\u2654"+ - "\1\u26b0\1\u270c\1\u2768\1\u27c4\1\u2820\1\u287c\1\u28d8\1\u2934"+ - "\1\u2990\1\u29ec\1\u2a48\1\u2aa4\1\u2b00\1\u2b5c\1\u2bb8\1\u2c14"+ - "\1\u2c70\1\u2ccc\1\u2d28\1\u2d84\1\u2de0\1\u2e3c\1\u2e98\1\u2ef4"+ - "\1\u2f50\1\u2fac\1\u3008\1\u3064\1\u30c0\1\u311c\1\u3178\1\u31d4"+ - "\1\u3230\1\u328c\1\u32e8\1\u3344\1\u33a0\1\u33fc\1\u3458"; + "\0\0\0\134\0\270\0\u0114\0\u0170\0\u01cc\0\u0228\0\u0284" + + "\0\u02e0\0\u033c\0\u0398\0\u03f4\0\u0450\0\u04ac\0\u0508\0\u0564" + + "\0\u05c0\0\u061c\0\u0678\0\u06d4\0\u0730\0\u078c\0\u07e8\0\u0844" + + "\0\u08a0\0\u08fc\0\u0958\0\u09b4\0\u0a10\0\u0a6c\0\u0ac8\0\u0b24" + + "\0\u09b4\0\u0b80\0\u0114\0\u09b4\0\u0bdc\0\u0c38\0\u0c94\0\u0cf0" + + "\0\u0d4c\0\u0da8\0\u0e04\0\u0e60\0\u0ebc\0\u09b4\0\u0f18\0\u09b4" + + "\0\u0f74\0\u0fd0\0\u102c\0\u1088\0\u10e4\0\u1140\0\u119c\0\u11f8" + + "\0\u1254\0\u12b0\0\u130c\0\u1368\0\u13c4\0\u1420\0\u147c\0\u14d8" + + "\0\u1534\0\u1590\0\u15ec\0\u1648\0\u16a4\0\u1700\0\u175c\0\u17b8" + + "\0\u1814\0\u1870\0\u18cc\0\u09b4\0\u1928\0\u1984\0\u19e0\0\u1a3c" + + "\0\u1a98\0\u09b4\0\u1af4\0\u1b50\0\u1bac\0\u1c08\0\u1c64\0\u1cc0" + + "\0\u1d1c\0\u1d78\0\u1dd4\0\u1e30\0\u1e8c\0\u1ee8\0\u1f44\0\u1fa0" + + "\0\u1ffc\0\u2058\0\u20b4\0\u2110\0\u216c\0\u21c8\0\u2224\0\u2280" + + "\0\u01cc\0\u22dc\0\u2338\0\u2394\0\u23f0\0\u244c\0\u24a8\0\u2504" + + "\0\u2560\0\u25bc\0\u2618\0\u2674\0\u26d0\0\u272c\0\u2788\0\u27e4" + + "\0\u2840\0\u289c\0\u28f8\0\u2954\0\u29b0\0\u2a0c\0\u2a68\0\u2ac4" + + "\0\u2b20\0\u2b7c\0\u2bd8\0\u2c34\0\u2c90\0\u2cec\0\u2d48\0\u2da4" + + "\0\u2e00\0\u2e5c\0\u2eb8\0\u2f14\0\u2f70\0\u2fcc\0\u3028\0\u3084" + + "\0\u30e0\0\u313c\0\u3198\0\u31f4\0\u3250\0\u32ac\0\u3308\0\u3364" + + "\0\u33c0\0\u341c\0\u3478\0\u09b4\0\u09b4\0\u34d4\0\u3530\0\u09b4" + + "\0\u358c\0\u35e8\0\u3644\0\u09b4\0\u36a0\0\u36fc\0\u3758\0\u37b4" + + "\0\u3810\0\u386c\0\u38c8\0\u3924\0\u3980\0\u39dc\0\u3a38\0\u3a94" + + "\0\u3af0\0\u3b4c\0\u3ba8\0\u3c04\0\u3c60\0\u3cbc\0\u3d18\0\u3d74" + + "\0\u3dd0\0\u3e2c\0\u3e88\0\u3ee4\0\u3f40\0\u3f9c\0\u3ff8\0\u4054" + + "\0\u40b0\0\u410c\0\u4168\0\u41c4\0\u4220\0\u427c\0\u42d8\0\u4334" + + "\0\u4390\0\u43ec\0\u4448\0\u44a4\0\u4500\0\u455c\0\u45b8\0\u4614" + + "\0\u4670\0\u46cc\0\u4728\0\u4784\0\u47e0\0\u483c\0\u4898\0\u48f4" + + "\0\u4950\0\u49ac\0\u4a08\0\u4a64\0\u4ac0\0\u4b1c\0\u4b78\0\u4bd4" + + "\0\u4c30\0\u4c8c\0\u4ce8\0\u4d44\0\u4da0\0\u4dfc\0\u4e58\0\u4eb4" + + "\0\u4f10\0\u4f6c\0\u4fc8\0\u5024\0\u5080\0\u50dc\0\u5138\0\u5194" + + "\0\u51f0\0\u524c\0\u52a8\0\u5304\0\u5360\0\u53bc\0\u5418\0\u5474" + + "\0\u54d0\0\u552c\0\u09b4\0\u5588\0\u55e4\0\u5640\0\u569c\0\u56f8" + + "\0\u5754\0\u57b0\0\u580c\0\u5868\0\u1c08\0\u58c4\0\u1c08\0\u5920" + + "\0\u597c\0\u59d8\0\u5a34\0\u5a90\0\u5aec\0\u5b48\0\u5ba4\0\u5c00" + + "\0\u5c5c\0\u5cb8\0\u5d14\0\u5d70\0\u5dcc\0\u5e28\0\u5e84\0\u5ee0" + + "\0\u5f3c\0\u5f98\0\u5ff4\0\u6050\0\u60ac\0\u6108\0\u6164\0\u61c0" + + "\0\u621c\0\u6278\0\u62d4\0\u6330\0\u638c\0\u63e8\0\u6444\0\u64a0" + + "\0\u64fc\0\u6558\0\u65b4\0\u6610\0\u666c\0\u66c8\0\u6724\0\u6780" + + "\0\u67dc\0\u6838\0\u6894\0\u68f0\0\u694c\0\u69a8\0\u6a04\0\u6a60" + + "\0\u6abc\0\u6b18\0\u6b74\0\u6bd0\0\u6c2c\0\u6c88\0\u6ce4\0\u6d40" + + "\0\u6d9c\0\u6df8\0\u6e54\0\u6eb0\0\u6f0c\0\u6f68\0\u6fc4\0\u7020" + + "\0\u707c\0\u70d8\0\u7134\0\u7190\0\u71ec\0\u7248\0\u72a4\0\u7300" + + "\0\u735c\0\u73b8\0\u7414\0\u7470\0\u09b4\0\u74cc\0\u7528\0\u7584" + + "\0\u75e0\0\u763c\0\u7698\0\u76f4\0\u09b4\0\u7750\0\u77ac\0\u7808" + + "\0\u7864\0\u78c0\0\u791c\0\u7978\0\u79d4\0\u7a30\0\u7a8c\0\u7ae8" + + "\0\u7b44\0\u7ba0\0\u7bfc\0\u7c58\0\u7cb4\0\u7d10\0\u7d6c\0\u7dc8" + + "\0\u7e24\0\u7e80\0\u7edc\0\u7f38\0\u7f94\0\u7ff0\0\u804c\0\u80a8" + + "\0\u8104\0\u8160\0\u81bc\0\u8218\0\u8274\0\u82d0\0\u832c\0\u8388" + + "\0\u83e4\0\u8440\0\u849c\0\u84f8\0\u8554\0\u85b0\0\u860c\0\u8668" + + "\0\u86c4\0\u8720\0\u877c\0\u87d8\0\u8834\0\u8890\0\u88ec\0\u8948" + + "\0\u89a4\0\u8a00\0\u8a5c\0\u8ab8\0\u8b14\0\u8b70\0\u8bcc\0\u8c28" + + "\0\u8c84\0\u8ce0\0\u8d3c\0\u8d98\0\u8df4\0\u8e50\0\u8eac\0\u8f08" + + "\0\u8f64\0\u8fc0\0\u901c\0\u9078\0\u90d4\0\u9130\0\u918c\0\u91e8" + + "\0\u9244\0\u92a0\0\u92fc\0\u9358\0\u93b4\0\u9410\0\u946c\0\u94c8" + + "\0\u9524\0\u9580\0\u95dc\0\u9638\0\u9694\0\u96f0\0\u974c\0\u97a8" + + "\0\u9804\0\u9860\0\u98bc\0\u9918\0\u9974\0\u99d0\0\u9a2c\0\u9a88" + + "\0\u9ae4\0\u9b40\0\u9b9c\0\u9bf8\0\u9c54\0\u9cb0\0\u9d0c\0\u9d68" + + "\0\u9dc4\0\u9e20\0\u9e7c\0\u9ed8\0\u9f34\0\u9f90\0\u9fec\0\ua048" + + "\0\ua0a4\0\u7414\0\ua100\0\ua15c\0\ua1b8\0\ua214\0\ua270\0\ua2cc" + + "\0\ua328\0\ua384\0\ua3e0\0\ua43c\0\ua498\0\ua4f4\0\ua550\0\ua5ac" + + "\0\ua608\0\ua664\0\ua6c0\0\ua71c\0\ua778\0\ua7d4\0\ua830\0\ua88c" + + "\0\ua8e8\0\ua944\0\ua9a0\0\ua9fc\0\uaa58\0\uaab4\0\uab10\0\uab6c" + + "\0\uabc8\0\uac24\0\uac80\0\uacdc\0\uad38\0\uad94\0\uadf0\0\uae4c" + + "\0\uaea8\0\uaf04\0\uaf60\0\uafbc\0\ub018\0\ub074\0\ub0d0\0\ub12c" + + "\0\ub188\0\ub1e4\0\ub240\0\ub29c\0\ub2f8\0\ub354\0\ub3b0\0\ub40c" + + "\0\ub468\0\ub4c4\0\ub520\0\ub57c\0\ub5d8\0\ub634\0\ub690\0\ub6ec" + + "\0\ub748\0\ub7a4\0\ub800\0\ub85c\0\ub8b8\0\ub914\0\ub970\0\ub9cc" + + "\0\uba28\0\uba84\0\ubae0\0\ubb3c\0\ubb98\0\ubbf4\0\ubc50\0\ubcac" + + "\0\ubd08\0\ubd64\0\ubdc0\0\ube1c\0\ube78\0\ubed4\0\ubf30\0\ubf8c" + + "\0\ubfe8\0\uc044\0\uc0a0\0\uc0fc\0\uc158\0\uc1b4\0\uc210\0\uc26c" + + "\0\uc2c8\0\uc324\0\uc380\0\uc3dc\0\uc438\0\uc494\0\uc4f0\0\uc54c" + + "\0\uc5a8\0\uc604\0\u9ae4\0\uc660\0\uc6bc\0\uc718\0\uc774\0\uc7d0" + + "\0\uc82c\0\uc888\0\uc8e4\0\uc940\0\uc99c\0\uc9f8\0\uca54\0\ucab0" + + "\0\ucb0c\0\ucb68\0\ucbc4\0\ucc20\0\ucc7c\0\uccd8\0\ucd34\0\ucd90" + + "\0\ucdec\0\uce48\0\ucea4\0\ucf00\0\ucf5c\0\ucfb8\0\ud014\0\ud070" + + "\0\ud0cc\0\ud128\0\ud184\0\ud1e0\0\ud23c\0\ud298\0\ud2f4\0\ud350" + + "\0\ud3ac\0\ud408\0\ud464\0\ud4c0\0\ud51c\0\ud578\0\ud5d4\0\ud630" + + "\0\ud68c\0\ud6e8\0\ud744\0\ud7a0\0\ud7fc\0\ud858\0\ud8b4\0\ud910" + + "\0\ud96c\0\ud9c8\0\uda24\0\uda80\0\udadc\0\udb38\0\udb94\0\udbf0" + + "\0\udc4c\0\udca8\0\udd04\0\udd60\0\uddbc\0\ude18\0\ude74\0\uded0" + + "\0\udf2c\0\udf88\0\udfe4\0\ue040\0\ue09c\0\ue0f8\0\ue154\0\ue1b0" + + "\0\ue20c\0\ue268\0\ue2c4\0\ue320\0\ue37c\0\ue3d8\0\ue434\0\ue490" + + "\0\ue4ec\0\ue548\0\ue5a4\0\ue600\0\ue65c\0\u6444\0\ue6b8\0\ue714" + + "\0\ue770\0\ue7cc\0\ue828\0\ue884\0\ue8e0\0\ue93c\0\ue998\0\ue9f4" + + "\0\uea50\0\ueaac\0\ueb08\0\ueb64\0\uebc0\0\uec1c\0\uec78\0\u1c08" + + "\0\uecd4\0\ued30\0\ued8c\0\u0114\0\uede8\0\uee44\0\ueea0\0\ueefc" + + "\0\uef58\0\uefb4\0\uf010\0\uf06c\0\uf0c8\0\uf124\0\uf180\0\uf1dc" + + "\0\uf238\0\uf294\0\uf2f0\0\uf34c\0\uf3a8\0\uf404\0\uf460\0\uf4bc" + + "\0\uf518\0\uf574\0\u8a00\0\uf5d0\0\uf62c\0\uf688\0\uf6e4\0\uf740" + + "\0\uf79c\0\uf7f8\0\uf854\0\uf8b0\0\uf90c\0\uf968\0\uf9c4\0\ufa20" + + "\0\ufa7c\0\ufad8\0\ufb34\0\ufb90\0\ufbec\0\ufc48\0\ufca4\0\ufd00" + + "\0\ufd5c\0\ufdb8\0\ufe14\0\ufe70\0\ufecc\0\uff28\0\udb94\0\uff84" + + "\0\udca8\0\uffe0\1\74\1\230\1\364\1\u0150\1\u01ac\1\u0208" + + "\1\u0264\1\u02c0\1\u031c\1\u0378\1\u03d4\1\u0430\1\u048c\1\u04e8" + + "\1\u0544\1\u05a0\1\u05fc\1\u0658\1\u06b4\1\u0710\1\u076c\1\u07c8" + + "\1\u0824\1\u0880\1\u08dc\1\u0938\1\u0994\1\u09f0\1\u0a4c\1\u0aa8" + + "\1\u0b04\1\u0b60\0\u09b4\1\u0bbc\1\u0c18\1\u0c74\1\u0cd0\1\u0d2c" + + "\1\u0d88\1\u0de4\1\u0e40\1\u0e9c\1\u0ef8\1\u0f54\1\u0fb0\1\u100c" + + "\1\u1068\1\u10c4\1\u1120\1\u117c\1\u11d8\1\u1234\1\u1290\1\u12ec" + + "\1\u1348\1\u13a4\1\u1400\1\u145c\1\u14b8\1\u1514\1\u1570\1\u15cc" + + "\1\u1628\1\u1684\1\u16e0\1\u173c\1\u1798\1\u17f4\1\u1850\1\u18ac" + + "\1\u1908\1\u1964\1\u19c0\1\u1a1c\0\u735c\1\u1a78\1\u1ad4\1\u1b30" + + "\1\u1b8c\1\u1be8\1\u1c44\1\u1ca0\1\u1cfc\1\u1d58\1\u1db4\1\u1e10" + + "\1\u1e6c\0\u9b9c\1\u1ec8\1\u1f24\1\u1f80\1\u1fdc\1\u2038\1\u2094" + + "\1\u20f0\1\u214c\1\u21a8\1\u2204\1\u2260\1\u22bc\1\u2318\1\u2374" + + "\1\u23d0\1\u242c\1\u2488\1\u24e4\1\u2540\1\u259c\1\u25f8\1\u2654" + + "\1\u26b0\1\u270c\1\u2768\1\u27c4\1\u2820\1\u287c\1\u28d8\1\u2934" + + "\1\u2990\1\u29ec\1\u2a48\1\u2aa4\1\u2b00\1\u2b5c\1\u2bb8\1\u2c14" + + "\1\u2c70\1\u2ccc\1\u2d28\1\u2d84\1\u2de0\1\u2e3c\1\u2e98\1\u2ef4" + + "\1\u2f50\1\u2fac\1\u3008\1\u3064\1\u30c0\1\u311c\1\u3178\1\u31d4" + + "\1\u3230\1\u328c\1\u32e8\1\u3344\1\u33a0\1\u33fc\1\u3458\1\u34b4" + + "\1\u3510\1\u356c\1\u35c8\1\u3624\1\u3680\1\u36dc\1\u3738\1\u3794" + + "\1\u37f0\1\u384c\1\u38a8"; private static int [] zzUnpackRowMap() { - int [] result = new int[887]; + int[] result = new int[899]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -237,2415 +238,2451 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { return j; } - /** + /** * The transition table of the DFA */ private static final int [] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = - "\1\4\1\5\1\6\1\7\1\10\1\7\1\11\1\12"+ - "\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22"+ - "\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32"+ - "\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42"+ - "\1\43\1\7\1\6\1\44\1\45\1\46\1\47\1\50"+ - "\1\51\1\33\1\52\1\53\1\54\1\55\1\56\1\57"+ - "\2\4\1\34\1\60\1\41\1\33\1\61\1\62\1\41"+ - "\1\63\1\64\1\65\1\66\1\67\1\70\1\71\1\7"+ - "\1\72\1\73\1\74\1\75\1\76\1\77\1\100\1\101"+ - "\1\102\1\103\1\104\1\105\1\106\2\6\2\7\3\6"+ - "\1\107\2\7\1\34\1\41\1\110\1\111\12\112\1\113"+ - "\30\112\1\114\5\112\1\115\14\112\1\116\2\112\1\117"+ - "\42\112\12\120\1\121\30\120\1\122\22\120\1\123\2\120"+ - "\1\124\42\120\7\4\1\0\17\4\11\0\3\4\2\0"+ - "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+ - "\2\4\1\0\37\4\4\0\1\4\6\6\1\0\10\6"+ - "\1\125\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\3\126\1\7\1\126\1\7\1\127\1\0"+ - "\1\126\1\127\3\126\1\130\4\126\1\131\4\126\11\0"+ - "\1\126\1\7\1\126\2\0\2\126\1\7\2\0\1\131"+ - "\1\130\1\132\1\126\1\0\3\126\4\0\2\126\1\0"+ - "\7\126\1\7\17\126\2\7\4\126\2\7\4\0\1\4"+ - "\5\6\1\133\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\134\35\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\13\6\1\135\2\6\1\136"+ - "\12\6\1\137\5\6\13\0\1\41\20\0\1\41\103\0"+ - "\1\4\6\6\1\0\1\6\1\140\12\6\1\141\2\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\4\6\1\142\12\6"+ - "\11\0\1\4\1\6\1\143\2\0\1\144\2\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ - "\1\145\1\6\1\146\2\6\1\147\3\6\1\150\2\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\2\6\1\151\1\6"+ - "\1\152\1\6\1\153\10\6\11\0\1\4\1\154\1\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\10\6\1\155\1\6\1\156\4\6\11\0"+ - "\1\4\2\6\2\0\1\157\2\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\160\2\6"+ - "\1\151\3\6\1\161\1\6\1\162\1\6\1\163\2\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\164\1\6"+ - "\1\165\1\6\1\166\2\6\1\167\1\6\1\170\1\171"+ - "\3\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\172\1\0\1\173\22\6\1\174\13\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\175\1\6\1\176\4\6\1\177"+ - "\3\6\1\200\2\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\201\6\6\1\151\7\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\202\1\6\1\203\1\204\1\205\1\6"+ - "\1\206\1\207\6\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\1\210\1\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\4\6\1\211\5\6\1\212\1\213\3\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\3\6\1\151\3\6\1\214"+ - "\1\215\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\216"+ - "\3\6\1\201\1\6\1\217\1\220\1\6\1\221\5\6"+ - "\11\0\1\4\2\6\2\0\1\222\1\223\1\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\6\1\224\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\225\5\6\1\226\7\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\227\1\6\1\230\4\6\1\231"+ - "\3\6\1\232\2\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\33\0\1\233\134\0\1\41"+ - "\267\0\1\41\1\0\1\234\16\0\1\235\62\0\27\236"+ - "\1\237\3\236\1\240\4\236\1\241\2\236\1\0\70\236"+ - "\34\0\1\33\134\0\1\33\126\0\1\41\6\0\1\41"+ - "\74\0\40\45\1\242\2\45\1\243\1\244\67\45\1\4"+ - "\6\6\1\0\14\6\1\245\2\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\3\6\1\246\13\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\3\126"+ - "\1\7\1\126\1\7\1\127\1\0\1\126\1\127\3\126"+ - "\1\130\4\126\1\131\4\126\11\0\1\126\1\7\1\247"+ - "\2\0\2\126\1\7\2\0\1\131\1\130\1\132\1\126"+ - "\1\0\3\126\4\0\2\126\1\0\7\126\1\7\17\126"+ - "\2\7\1\247\3\126\2\7\54\0\1\51\63\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\1\250\1\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\13\6\1\251\4\6\1\252"+ - "\16\6\4\0\1\4\5\6\1\253\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\1\254\1\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\1\6\1\255\3\6\1\256\5\6\1\151\23\6\7\0"+ - "\1\132\1\0\1\132\33\0\1\132\5\0\1\132\30\0"+ - "\1\132\17\0\2\132\4\0\2\132\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\6\1\257\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\6\1\260\3\6\1\261\6\6"+ - "\1\262\22\6\4\0\7\4\1\0\1\263\1\264\1\4"+ - "\1\265\1\4\1\266\4\4\1\267\1\270\3\4\11\0"+ - "\3\4\2\0\3\4\1\271\1\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\1\4"+ - "\6\6\1\0\3\6\1\272\4\6\1\273\6\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\3\6\1\274\3\6\1\275"+ - "\1\276\3\6\1\277\2\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\300\15\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\3\6"+ - "\1\301\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\2\6\1\302\1\303\1\304"+ - "\3\6\1\305\2\6\1\306\1\6\1\307\1\310\20\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\14\6\1\311\22\6"+ - "\4\0\1\4\5\6\1\312\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\1\313\1\314\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ - "\1\315\6\6\1\316\1\317\2\6\1\320\1\6\1\321"+ - "\1\6\1\322\12\6\4\0\1\4\5\6\1\323\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\6"+ - "\1\324\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\5\6\1\325\1\326\1\6\1\327\2\6"+ - "\1\330\1\331\22\6\4\0\1\4\3\6\1\306\2\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\10\6\1\151\26\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\5\6\1\332\6\6\1\333\22\6\4\0"+ - "\1\4\5\6\1\334\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\335\3\6"+ - "\1\336\6\6\1\337\22\6\4\0\1\4\5\6\1\340"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ - "\1\341\15\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\1\342\1\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\5\6\1\343\10\6\1\344\20\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\1\345\1\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\151\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\3\6\1\346\7\6\1\347"+ - "\23\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\350"+ - "\3\6\1\351\2\6\1\352\3\6\1\353\22\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\354\35\6\4\0"+ - "\1\4\5\6\1\355\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\10\6\1\356\26\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\5\6\1\357\2\6"+ - "\1\360\3\6\1\151\22\6\4\0\1\4\5\6\1\361"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\362\3\6\1\363\6\6\1\364"+ - "\22\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\1\365\1\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\12\6\1\366\4\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\5\6\1\367\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\370\31\6\136\0"+ - "\1\41\134\0\1\41\12\112\1\0\30\112\1\0\5\112"+ - "\1\0\14\112\1\0\2\112\1\0\42\112\13\0\1\371"+ - "\53\0\1\372\76\0\1\373\170\0\1\374\135\0\1\375"+ - "\42\0\12\120\1\0\30\120\1\0\22\120\1\0\2\120"+ - "\1\0\42\120\13\0\1\376\53\0\1\377\133\0\1\u0100"+ - "\135\0\1\u0101\42\0\1\4\6\6\1\0\3\6\1\u0102"+ - "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\7\126\1\0\17\126\11\0\3\126"+ - "\2\0\3\126\2\0\2\126\1\0\1\126\1\0\3\126"+ - "\4\0\2\126\1\0\37\126\4\0\3\126\1\u0103\1\126"+ - "\1\u0103\1\126\1\u0104\17\126\10\0\1\u0104\1\126\1\u0103"+ - "\1\126\2\0\2\126\1\u0103\2\0\2\126\1\0\1\126"+ - "\1\0\3\126\4\0\2\126\1\0\7\126\1\u0103\17\126"+ - "\2\u0103\4\126\2\u0103\4\0\7\126\1\0\12\126\1\u0105"+ - "\4\126\11\0\3\126\2\0\3\126\2\0\1\u0105\1\126"+ - "\1\0\1\126\1\0\3\126\4\0\2\126\1\0\37\126"+ - "\4\0\7\126\1\0\5\126\1\u0105\11\126\11\0\3\126"+ - "\2\0\3\126\2\0\1\126\1\u0105\1\0\1\126\1\0"+ - "\3\126\4\0\2\126\1\0\37\126\4\0\3\126\1\132"+ - "\1\126\1\132\1\u0106\1\0\1\126\1\u0106\1\u0107\2\126"+ - "\1\u0107\11\126\11\0\1\126\1\132\1\126\2\0\2\126"+ - "\1\132\2\0\1\126\1\u0107\1\0\1\u0107\1\0\3\126"+ - "\4\0\2\126\1\0\7\126\1\132\17\126\2\132\4\126"+ - "\2\132\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\4\6\1\u0108"+ - "\12\6\1\u0109\17\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\11\6\1\u010a\3\6\1\u010b\21\6\4\0\1\4\3\6"+ - "\1\u010c\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\4\6\1\u010d\6\6\1\u010e"+ - "\5\6\1\u010f\15\6\4\0\1\4\5\6\1\u0110\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\1\6\1\344\35\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\1\6\1\260\16\6\1\151\16\6\4\0\1\4"+ - "\6\6\1\0\11\6\1\u0111\3\6\1\u0112\1\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\6\1\u0113\1\0\12\6\1\u0114"+ - "\24\6\4\0\1\4\6\6\1\0\1\u0115\3\6\1\u0116"+ - "\4\6\1\u0117\4\6\1\u0118\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\13\6\1\151\1\150\2\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\u0119\12\6\1\157\2\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\u011a\2\6\1\201"+ - "\1\u011b\11\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\10\6"+ - "\1\u011c\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\7\6"+ - "\1\u011d\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\11\6"+ - "\1\u011e\5\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u011f"+ - "\13\6\1\u0120\2\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\1\6\1\151\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\4\6\1\u0121\12\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\35\6\1\u0119\1\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\151\36\6\4\0\1\4\6\6\1\0"+ - "\16\6\1\u0122\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\5\6"+ - "\1\151\11\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\2\6"+ - "\1\u011e\1\6\1\151\12\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\1\6\1\151\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\15\6\1\u0123\1\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\u0124\36\6\4\0"+ - "\1\4\6\6\1\0\4\6\1\210\12\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\12\6\1\u0125\24\6\4\0"+ - "\1\4\6\6\1\0\11\6\1\u0126\5\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\23\6\1\151"+ - "\13\6\4\0\1\4\6\6\1\0\4\6\1\u0127\10\6"+ - "\1\u0119\1\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ - "\1\u0128\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\7\6"+ - "\1\u0129\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\16\6"+ - "\1\u012a\11\0\1\4\2\6\2\0\1\6\1\u012b\1\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\5\6\1\u012c\11\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\u012d\13\6\1\u012e\2\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\3\6\1\u012f\13\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\5\6\1\151\1\6\1\u011e\7\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\11\6\1\u0130\1\6\1\u0131\1\6"+ - "\1\u0132\1\u0133\11\0\1\4\2\6\2\0\1\u0134\2\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\15\6\1\u0135\1\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\12\6\1\u0136\4\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\u0137\36\6\4\0\1\4\6\6"+ - "\1\0\1\u0138\3\6\1\u0139\12\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\151\16\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\3\6\1\u013a\13\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\7\6\1\u013b\7\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\16\6\1\u0118\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\14\6\1\u013c\2\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\10\6\1\u013d\6\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\u013e\3\6\1\u013f\1\u0140\1\u0127\1\u0141\2\6\1\u0142"+ - "\3\6\1\u0143\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ - "\1\u0144\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ - "\1\u0145\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ - "\1\201\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\13\6"+ - "\1\u0124\3\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\10\6"+ - "\1\u0146\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\1\u0124\36\6\4\0\1\4\6\6\1\0\1\u0147\16\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\3\6\1\u0148\13\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\7\6\1\u0149\7\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\10\6\1\u014a\6\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u014b\15\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\6\6\1\151\10\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\14\6\1\u014c\2\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\1\6\1\u014d\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\u014e\15\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\u014f\16\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\1\151\3\6\1\u0150\12\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\151\3\6\1\u0151\11\6"+ - "\1\151\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\13\6\1\u0152"+ - "\3\6\11\0\1\4\1\6\1\151\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\34\0\10\41\74\0\33\u0153\1\u0154"+ - "\7\u0153\1\0\117\u0153\1\u0155\3\u0153\1\u0154\7\u0153\1\0"+ - "\75\u0153\1\u0156\4\u0153\1\236\1\u0153\1\236\2\u0153\1\236"+ - "\4\u0153\1\236\2\u0153\1\236\3\u0153\1\u0157\4\u0153\1\236"+ - "\1\u0158\1\u0159\1\0\3\236\1\u0158\17\u0153\1\236\10\u0153"+ - "\1\u0158\17\u0153\1\u0158\1\u0156\1\u0159\4\u0153\1\u0156\4\u0153"+ - "\5\243\1\45\4\243\1\45\1\243\1\45\2\243\1\45"+ - "\4\243\1\45\2\243\1\45\3\243\1\45\4\243\2\45"+ - "\1\u015a\1\0\4\45\17\243\1\45\10\243\1\45\17\243"+ - "\2\45\1\u015a\4\243\1\45\44\243\1\u015b\3\243\1\u015c"+ - "\67\243\1\4\6\6\1\0\5\6\1\u015d\11\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\6\1\u015e\1\0\37\6\4\0"+ - "\3\126\4\u015f\1\0\3\u015f\6\126\1\u015f\2\126\1\u015f"+ - "\2\126\11\0\1\126\1\u015f\1\126\2\0\1\126\2\u015f"+ - "\2\0\2\126\1\0\1\u015f\1\0\3\126\4\0\2\126"+ - "\1\0\1\126\2\u015f\1\126\1\u015f\2\126\1\u015f\17\126"+ - "\2\u015f\4\126\2\u015f\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\14\6\1\306\22\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\14\6\1\u0160\22\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\20\6\1\u0161\16\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\u0162\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\13\6\1\151\1\6\1\151\21\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\13\6\1\326\23\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\11\6\1\u0163\25\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\17\6\1\u0123\4\6\1\u0161\12\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u0164\31\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\4\6\1\u0162\32\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\10\6\1\u0165\26\6\4\0"+ - "\1\4\5\6\1\u0166\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\6\1\u0167\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\306"+ - "\23\6\4\0\7\4\1\0\1\4\1\u0168\15\4\11\0"+ - "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ - "\3\4\4\0\2\4\1\0\37\4\4\0\7\4\1\0"+ - "\4\4\1\u0169\1\u016a\1\4\1\u016b\7\4\11\0\3\4"+ - "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+ - "\4\0\2\4\1\0\37\4\4\0\7\4\1\0\2\4"+ - "\1\u016c\1\4\1\u016d\12\4\11\0\3\4\2\0\3\4"+ - "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\4\0\7\4\1\0\3\4\1\u016e\13\4"+ - "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4"+ - "\1\0\4\4\1\u016f\12\4\11\0\3\4\2\0\3\4"+ - "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\4\0\7\4\1\0\7\4\1\u0170\7\4"+ - "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\14\0\1\u0171"+ - "\1\u0172\1\0\1\u0173\1\0\1\u0174\4\0\1\u0175\1\u0176"+ - "\24\0\1\271\63\0\1\4\6\6\1\0\1\6\1\u0177"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\12\6\1\u0144"+ - "\4\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\16\6\1\u013e"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u0178\1\6"+ - "\1\u0179\6\6\1\u017a\4\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\u017b\2\6\1\u017c\4\6\1\u017d\6\6\11\0"+ - "\1\4\2\6\2\0\1\6\1\u017e\1\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\u017f"+ - "\1\6\1\0\37\6\4\0\1\4\6\6\1\0\4\6"+ - "\1\u0127\12\6\11\0\1\4\2\6\2\0\1\6\1\u0180"+ - "\1\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\u0181\1\6\1\u0182\13\6\11\0\1\4"+ - "\2\6\2\0\1\6\1\u0183\1\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\3\6\1\u0184\2\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\3\6\1\151"+ - "\33\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\14\6\1\u0185"+ - "\22\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\5\6\1\u0186"+ - "\31\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\10\6\1\u0187"+ - "\26\6\4\0\1\4\3\6\1\151\2\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\u0188"+ - "\35\6\4\0\1\4\5\6\1\u0189\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\15\6\1\u018a\21\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\4\6\1\u018b\15\6"+ - "\1\151\14\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\2\6"+ - "\1\u018c\16\6\1\u018d\15\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\14\6\1\u018e\22\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\10\6\1\u018f\26\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\13\6\1\u0190\3\6\1\u0110\17\6\4\0\1\4"+ - "\3\6\1\u0191\2\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\u0192\35\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\6\1\u0193\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\1\6\1\151\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\10\6\1\u0162\26\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\14\6\1\u0194\22\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\14\6\1\u0195\22\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\u0196\35\6"+ - "\4\0\1\4\3\6\1\u0197\2\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\1\u0198\1\u0199\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\3\6\1\u0190\4\6\1\u019a\2\6\1\u019b\5\6\1\u019c"+ - "\15\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\u019d"+ - "\35\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\5\6\1\u019e"+ - "\31\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\21\6\1\u010f"+ - "\15\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\10\6\1\u019f"+ - "\26\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\1\u019d\1\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\5\6\1\u01a0\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\4\6\1\u01a1\11\6\1\u01a2"+ - "\1\u01a3\1\u01a4\1\u01a5\15\6\4\0\1\4\3\6\1\u01a6"+ - "\2\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\13\6\1\u01a7\23\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\1\u01a8\1\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\24\6\1\u01a9\12\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\17\6\1\u01aa\17\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\u01ab\35\6\4\0"+ - "\1\4\6\6\1\0\14\6\1\u01ac\2\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\21\6\1\u01ad\15\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\24\6\1\151\12\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\1\6\1\151\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\35\6\1\u0110\1\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\13\6\1\u01ae\23\6\4\0\1\4"+ - "\3\6\1\u01af\2\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\u01b0\13\6"+ - "\1\151\21\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\2\6"+ - "\1\u01b1\10\6\1\u0190\23\6\4\0\1\4\3\6\1\u01b2"+ - "\2\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\2\6\1\u01b3\2\6\1\u01b4\1\u01b5"+ - "\5\6\1\u01b6\22\6\4\0\1\4\5\6\1\u01b7\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u01b8"+ - "\1\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\14\6\1\u01b9\22\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\21\6\1\u0197\15\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\6\1\u01ba\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\15\6\1\u01bb\21\6\4\0\1\4\5\6\1\u01bc"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\24\6\1\u0161\12\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\5\6\1\u01bd\31\6\4\0\1\4\3\6\1\u01be\2\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\20\6\1\u01bf\10\6\1\151\5\6\4\0\1\4\3\6"+ - "\1\151\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\13\6\1\u01c0\5\6\1\151"+ - "\15\6\4\0\1\4\3\6\1\151\2\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\13\6\1\u01c1\23\6\4\0\1\4\5\6\1\u01c2\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u01c3"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\5\6\1\u01c4\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\2\6\1\u01c5\11\6\1\u01c6\22\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\14\6\1\u01c7\22\6\21\0\1\u01c8\141\0"+ - "\1\u01c9\177\0\1\u01ca\135\0\1\u01cb\57\0\1\u01cc\141\0"+ - "\1\u01cd\177\0\1\u01ce\135\0\1\u01cf\42\0\1\4\6\6"+ - "\1\0\4\6\1\u01d0\12\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\3\126\1\u0103"+ - "\1\126\1\u0103\1\126\1\0\5\126\1\130\4\126\1\131"+ - "\4\126\11\0\1\126\1\u0103\1\126\2\0\2\126\1\u0103"+ - "\2\0\1\131\1\130\1\0\1\126\1\0\3\126\4\0"+ - "\2\126\1\0\7\126\1\u0103\17\126\2\u0103\4\126\2\u0103"+ - "\7\0\1\u0103\1\0\1\u0103\33\0\1\u0103\5\0\1\u0103"+ - "\30\0\1\u0103\17\0\2\u0103\4\0\2\u0103\4\0\3\126"+ - "\1\u01d1\1\126\1\u01d1\1\126\1\u01d2\17\126\10\0\1\u01d2"+ - "\1\126\1\u01d1\1\126\2\0\2\126\1\u01d1\2\0\2\126"+ - "\1\0\1\126\1\0\3\126\4\0\2\126\1\0\7\126"+ - "\1\u01d1\17\126\2\u01d1\4\126\2\u01d1\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\5\6\1\u01d3\6\6\1\u01d4\22\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\10\6\1\u01d5\26\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\3\6\1\u01d6\12\6\1\100"+ - "\20\6\4\0\1\4\5\6\1\u01d7\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\24\6\1\u01d8\12\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\5\6\1\u01d3\31\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\u01d9\1\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u01da\31\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\13\6\1\151\23\6\4\0"+ - "\1\4\6\6\1\0\3\6\1\u01db\4\6\1\u01dc\6\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\7\6\1\u01dd\7\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u01de\15\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\6\6\1\u01df\10\6"+ - "\11\0\1\4\2\6\2\0\1\46\2\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\u01e0"+ - "\36\6\4\0\1\4\6\6\1\0\12\6\1\u01e1\4\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\10\6\1\u01dc\6\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\10\6\1\u01e2\6\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\4\6\1\151\12\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\5\6\1\u01e3\11\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u01e4\15\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\10\6\1\u0144\6\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\16\6\1\u01e5\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\6\1\151\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\1\6\1\u01e6\15\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\7\6\1\220\7\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\12\6\1\u01e7\4\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\1\6\1\u01e8\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\1\u01e9\1\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\u0144\15\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\u01ea\15\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\10\6\1\u01eb\6\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\151\1\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\11\6\1\u01ec\5\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u0152\1\0\37\6\4\0\1\4\6\6\1\0\6\6"+ - "\1\u01ed\4\6\1\u01ee\3\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\6\6\1\u01ef\10\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\3\6\1\u011e\13\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\u01f0\15\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\7\6\1\u01f1\7\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\6\1\u01f2\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\10\6\1\u01f3\6\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\u01e5\3\6\1\u01f4\11\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\u01f5\15\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\10\6\1\u01f6\6\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\u01f7\15\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\1\u011e\1\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\4\6\1\u01f8\12\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\11\6\1\u01f9\5\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\3\6\1\u01fa\13\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\u01fb\14\6\1\u013e\1\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\26\6\1\151\10\6"+ - "\4\0\1\4\6\6\1\0\5\6\1\u01fc\11\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\11\6\1\u01fd\5\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\6\6\1\223\10\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\6\6\1\u01fe\10\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\151\15\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\11\6\1\u01ff\5\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\4\6\1\u0200\4\6\1\u01f9"+ - "\5\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\7\6\1\u0201"+ - "\7\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\4\6\1\u011e"+ - "\12\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\1\6\1\u0202\1\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\7\6\1\151"+ - "\7\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\23\6"+ - "\1\u0203\13\6\4\0\1\4\6\6\1\0\1\u0204\12\6"+ - "\1\u0205\2\6\1\u0206\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\7\6\1\u01d0\27\6\4\0\1\4\6\6\1\0"+ - "\4\6\1\u0127\12\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\14\6\1\u0207\2\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\6\6\1\u0127\10\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\7\6\1\u0208\7\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\4\6\1\u0209\12\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\12\6\1\u020a\4\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\13\6\1\u01d0\3\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\3\6\1\u020b\13\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\12\6\1\u020c\4\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u020d\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ - "\1\u0120\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\33\u0153\1\240\7\u0153\1\0"+ - "\120\u0153\3\236\1\u0157\4\236\3\u0153\1\0\75\u0153\1\236"+ - "\25\u0153\1\u0154\5\u0153\1\236\1\u0153\1\0\3\u0153\1\236"+ - "\30\u0153\1\236\17\u0153\2\236\5\u0153\1\236\4\u0153\33\0"+ - "\1\u0154\100\0\5\u0153\1\u0156\25\u0153\1\u0154\5\u0153\1\u0156"+ - "\1\u0153\1\0\3\u0153\1\u0156\30\u0153\1\u0156\17\u0153\2\u0156"+ - "\5\u0153\1\u0156\7\u0153\4\u020e\1\u0153\3\u020e\6\u0153\1\u020e"+ - "\2\u0153\1\u020e\6\u0153\1\240\5\u0153\1\u020e\1\u0153\1\0"+ - "\2\u0153\2\u020e\5\u0153\1\u020e\14\u0153\2\u020e\1\u0153\1\u020e"+ - "\2\u0153\1\u020e\17\u0153\2\u020e\4\u0153\2\u020e\4\u0153\3\243"+ - "\4\u020f\1\243\3\u020f\6\243\1\u020f\2\243\1\u020f\13\243"+ - "\1\u015b\1\u020f\2\243\1\u015c\1\243\2\u020f\5\243\1\u020f"+ - "\14\243\2\u020f\1\243\1\u020f\2\243\1\u020f\17\243\2\u020f"+ - "\4\243\2\u020f\47\243\1\0\70\243\1\4\6\6\1\0"+ - "\12\6\1\u013e\4\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\4\6\1\u0210\3\6\1\u0211\6\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\3\126"+ - "\4\u015f\1\0\3\u015f\2\126\1\u0212\3\126\1\u015f\1\u0213"+ - "\1\126\1\u015f\2\126\11\0\1\126\1\u015f\1\126\2\0"+ - "\1\126\2\u015f\2\0\1\u0213\1\u0212\1\0\1\u015f\1\0"+ - "\3\126\4\0\2\126\1\0\1\126\2\u015f\1\126\1\u015f"+ - "\2\126\1\u015f\17\126\2\u015f\4\126\2\u015f\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\22\6\1\u0214\14\6\4\0\1\4"+ - "\5\6\1\u019d\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\15\6\1\151\21\6\4\0\1\4\5\6"+ - "\1\u0215\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\5\6\1\u019d\31\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\21\6\1\u0216\15\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\6"+ - "\1\u0217\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\5\6\1\u0218\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\7\4\1\0\2\4\1\266\14\4"+ - "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4"+ - "\1\0\1\u0219\16\4\11\0\3\4\2\0\3\4\2\0"+ - "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+ - "\37\4\4\0\7\4\1\0\3\4\1\u021a\2\4\1\u021b"+ - "\10\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+ - "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\4\0"+ - "\7\4\1\0\7\4\1\u021c\7\4\11\0\3\4\2\0"+ - "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+ - "\2\4\1\0\37\4\4\0\7\4\1\0\1\u021d\3\4"+ - "\1\u016f\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+ - "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\37\4"+ - "\4\0\7\4\1\0\11\4\1\u021e\5\4\11\0\3\4"+ - "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4"+ - "\4\0\2\4\1\0\37\4\4\0\7\4\1\0\4\4"+ - "\1\u021b\12\4\11\0\3\4\2\0\3\4\2\0\2\4"+ - "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\37\4"+ - "\4\0\7\4\1\0\1\u021d\16\4\11\0\3\4\2\0"+ - "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+ - "\2\4\1\0\37\4\4\0\7\4\1\0\14\4\1\u021f"+ - "\2\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+ - "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\15\0"+ - "\1\u0220\136\0\1\u0221\1\u0222\1\0\1\u0223\126\0\1\u0224"+ - "\1\0\1\u0225\132\0\1\u0226\134\0\1\u0227\136\0\1\u0228"+ - "\114\0\1\4\6\6\1\0\7\6\1\u0229\7\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\u022a\15\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\16\6\1\151\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\4\6\1\u022b\12\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\10\6\1\u022c\3\6\1\u022d\2\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\4\6\1\u022e\11\6"+ - "\1\u0208\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\11\6\1\u022f"+ - "\5\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u0230"+ - "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u0231"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\5\6\1\u0232"+ - "\11\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\26\6"+ - "\1\u0233\10\6\4\0\1\4\6\6\1\0\15\6\1\u0234"+ - "\1\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u0235"+ - "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\7\6"+ - "\1\u0236\27\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\13\6"+ - "\1\u0190\23\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\3\6"+ - "\1\u0190\33\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6"+ - "\1\u0237\35\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\13\6"+ - "\1\u0238\23\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\10\6"+ - "\1\u0239\26\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ - "\1\u023a\5\6\1\u023b\23\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\5\6\1\u023c\31\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\3\6\1\u023d\33\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\3\6\1\u023e\14\6\1\u023f\16\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\4\6\1\u0240\32\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\15\6\1\u01bf\21\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\6\6\1\151\30\6\4\0\1\4"+ - "\5\6\1\u0241\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\10\6\1\u0242\26\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\14\6\1\u0162\22\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\15\6\1\u0243\21\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\6\1\u0244\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\3\6\1\302\33\6\4\0\1\4\5\6\1\151"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\13\6\1\u0162\23\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\4\6\1\u0245\6\6\1\u0246\23\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\10\6\1\u0247\26\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\4\6\1\u0248\32\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\2\6\1\u0249\34\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\10\6\1\151\26\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\3\6\1\u024a\33\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\4\6\1\u024b\32\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\10\6\1\u024c\26\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\5\6\1\u024d\31\6\4\0\1\4\5\6"+ - "\1\u024e\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\5\6\1\u024f"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\5\6\1\u0216\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\6"+ - "\1\u0250\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\5\6\1\u0251\31\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\14\6\1\u0252\22\6\4\0\1\4\3\6\1\u0253\2\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\17\6\1\u0197\5\6\1\151\11\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\13\6\1\u0254\23\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\4\6\1\u0245\32\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\6\6\1\u0162\30\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\10\6\1\u0255\26\6\4\0"+ - "\1\4\6\6\1\0\7\6\1\u0256\7\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\15\6\1\u0257\21\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\1\u0258\1\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\5\6\1\u0259\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\10\6\1\305\26\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\6\1\u025a\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\1\6\1\u025b\3\6\1\u025c\31\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\14\6\1\u025d\22\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\4\6\1\u025e\32\6\4\0\1\4"+ - "\5\6\1\u025f\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\13\6\1\u0260\5\6\1\u0239\15\6\4\0"+ - "\1\4\5\6\1\u0261\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\13\6\1\u0262\23\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\21\6\1\151\15\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\1\u0197\1\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\u0263\1\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\20\6\1\u0236\16\6\4\0\1\4\3\6\1\u0264"+ - "\2\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\20\6\1\u0265\1\u0266\15\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\14\6\1\u0267\22\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\u01b0\35\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\15\6\1\u0268\21\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\1\u0269\1\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\10\6\1\u0237\26\6\4\0\1\4"+ - "\6\6\1\0\7\6\1\u0207\7\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\25\6\1\u026a\11\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\14\6\1\u026b\22\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\17\6\1\u026c\17\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\13\6\1\u0236\23\6\15\0\1\u01c9"+ - "\212\0\1\u026d\66\0\1\u026e\164\0\1\u026f\70\0\1\u01cd"+ - "\212\0\1\u0270\66\0\1\u0271\164\0\1\u0272\57\0\3\126"+ - "\1\u01d1\1\126\1\u01d1\1\126\1\0\2\126\1\u0107\2\126"+ - "\1\u0107\11\126\11\0\1\126\1\u01d1\1\126\2\0\2\126"+ - "\1\u01d1\2\0\1\126\1\u0107\1\0\1\u0107\1\0\3\126"+ - "\4\0\2\126\1\0\7\126\1\u01d1\17\126\2\u01d1\4\126"+ - "\2\u01d1\7\0\1\u01d1\1\0\1\u01d1\33\0\1\u01d1\5\0"+ - "\1\u01d1\30\0\1\u01d1\17\0\2\u01d1\4\0\2\u01d1\4\0"+ - "\1\4\3\6\1\u0197\2\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\21\6\1\u0273\15\6\4\0"+ - "\1\4\5\6\1\u0274\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\5\6\1\u0275\21\6\1\u0276\7\6"+ - "\4\0\1\4\3\6\1\u0277\2\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\3\6"+ - "\1\u0278\10\6\1\u0279\1\u027a\21\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\14\6\1\u027b\22\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\21\6\1\u027c\15\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\13\6\1\u027d\23\6\4\0\1\4\6\6"+ - "\1\0\16\6\1\u027e\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\u013e\16\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ - "\1\u027f\15\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u0280"+ - "\2\6\1\u0281\2\6\1\u0282\10\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\6\1\u0283\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\10\6\1\u0284\6\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\27\6\1\u0276"+ - "\7\6\4\0\1\4\6\6\1\0\3\6\1\u0285\13\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\16\6\1\u0286\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\4\6\1\u0287\12\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\223\16\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\4\6\1\u0200\1\6\1\u0288\10\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u0289"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\u011e"+ - "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\1\6\1\u028a\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\5\6\1\157\11\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\10\6\1\151\6\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\2\6\1\151\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\7\6\1\u028b\7\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\4\6\1\201\12\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\1\6\1\u01d0\15\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\23\6\1\151\13\6"+ - "\4\0\1\4\6\6\1\0\7\6\1\u028c\7\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\6\1\u028d\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\1\151\2\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\1\6\1\u0115\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\11\6\1\u028e\5\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\7\6\1\u01e3\7\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\14\6\1\u028f\2\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\1\6\1\u0290\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\1\u01ec\2\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\7\6"+ - "\1\u0291\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u0292"+ - "\16\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\10\6\1\u0293"+ - "\6\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\u0294"+ - "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\1\6\1\u0295\1\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u0296"+ - "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\12\6\1\u0297"+ - "\4\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\6\6\1\u0298"+ - "\10\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\u0299"+ - "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\274"+ - "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\157"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u0119"+ - "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\12\6\1\u01ec"+ - "\4\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\12\6\1\150"+ - "\4\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u0144"+ - "\6\6\1\u029a\6\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\10\6\1\u029b\6\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\12\6\1\151\24\6\4\0\1\4\6\6\1\0"+ - "\14\6\1\u029c\2\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\151"+ - "\1\6\1\0\7\6\1\151\27\6\4\0\1\4\6\6"+ - "\1\0\6\6\1\u029d\10\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\14\6\1\u0119\2\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\6\1\u013e\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\u0256"+ - "\1\6\1\0\37\6\4\0\3\u0153\4\236\1\u0153\3\236"+ - "\6\u0153\1\236\2\u0153\1\236\6\u0153\1\240\5\u0153\1\236"+ - "\1\u0153\1\0\2\u0153\2\236\5\u0153\1\236\14\u0153\2\236"+ - "\1\u0153\1\236\2\u0153\1\236\17\u0153\2\236\4\u0153\2\236"+ - "\4\u0153\3\243\4\45\1\243\3\45\6\243\1\45\2\243"+ - "\1\45\13\243\1\u015b\1\45\2\243\1\u015c\1\243\2\45"+ - "\5\243\1\45\14\243\2\45\1\243\1\45\2\243\1\45"+ - "\17\243\2\45\4\243\2\45\4\243\1\4\6\6\1\0"+ - "\10\6\1\u011e\6\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\13\6\1\u029e\3\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\7\126\1\0\12\126"+ - "\1\u029f\4\126\11\0\3\126\2\0\3\126\2\0\1\u029f"+ - "\1\126\1\0\1\126\1\0\3\126\4\0\2\126\1\0"+ - "\37\126\4\0\7\126\1\0\5\126\1\u029f\11\126\11\0"+ - "\3\126\2\0\3\126\2\0\1\126\1\u029f\1\0\1\126"+ - "\1\0\3\126\4\0\2\126\1\0\37\126\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\1\u0240\1\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\10\6\1\u02a0\26\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\u0162\35\6\4\0\1\4\3\6"+ - "\1\302\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\3\6\1\u02a1\7\6\1\u0246\1\6\1\u02a2"+ - "\21\6\4\0\7\4\1\0\3\4\1\u021a\13\4\11\0"+ - "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ - "\3\4\4\0\2\4\1\0\37\4\4\0\7\4\1\0"+ - "\2\4\1\u02a3\14\4\11\0\3\4\2\0\3\4\2\0"+ - "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+ - "\37\4\4\0\7\4\1\0\1\4\1\u02a3\15\4\11\0"+ - "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ - "\3\4\4\0\2\4\1\0\37\4\4\0\7\4\1\0"+ - "\10\4\1\u02a4\6\4\11\0\3\4\2\0\3\4\2\0"+ - "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+ - "\37\4\4\0\7\4\1\0\1\4\1\u021a\15\4\11\0"+ - "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ - "\3\4\4\0\2\4\1\0\37\4\4\0\7\4\1\0"+ - "\5\4\1\u02a5\11\4\11\0\3\4\2\0\3\4\2\0"+ - "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0"+ - "\37\4\4\0\7\4\1\0\15\4\1\u02a6\1\4\11\0"+ - "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ - "\3\4\4\0\2\4\1\0\37\4\16\0\1\u0174\131\0"+ - "\1\u02a7\136\0\1\u02a8\2\0\1\u02a9\134\0\1\u02aa\124\0"+ - "\1\u02ab\3\0\1\u0227\140\0\1\u02ac\126\0\1\u02a9\127\0"+ - "\1\u02ab\147\0\1\u02ad\107\0\1\4\6\6\1\0\14\6"+ - "\1\u02ae\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\5\6"+ - "\1\u02af\11\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\11\6"+ - "\1\151\5\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\12\6"+ - "\1\u02b0\4\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u013e"+ - "\1\0\12\6\1\151\24\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u02b1\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u027e"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\4\6\1\u02b2"+ - "\12\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\1\6\1\151\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u02b3\15\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\u02b4\16\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\u02b5\1\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\16\6\1\u0208\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\11\6\1\151\25\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\6\6\2\151\27\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\6\1\u02b6\35\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\20\6\1\u02b7\16\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\5\6\1\u0162\31\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\13\6\1\306\23\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\15\6\1\u02b8\21\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\22\6\1\151\14\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\10\6\1\u02b9\26\6\4\0\1\4"+ - "\5\6\1\u0236\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\16\6\1\151\20\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\15\6\1\u010c\21\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\4\6\1\u02ba\32\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\14\6\1\u02bb\22\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\5\6\1\u02bc\31\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\353\35\6\4\0\1\4\5\6"+ - "\1\344\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\1\6\1\u02bd\35\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\14\6\1\u0110\22\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\3\6\1\u02be\33\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u02bf"+ - "\1\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\1\6\1\u02c0\35\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\10\6\1\u0217\26\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\10\6\1\u02c1\26\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\31\6\1\u02c2\5\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\1\6\1\u02c3\35\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\16\6\1\u0240\20\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\1\6\1\u02c4\35\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\2\6\1\u02c5\34\6\4\0\1\4\3\6\1\u02c6\2\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\3\6\1\u02c7\2\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u02c8"+ - "\16\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ - "\1\151\31\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\1\6\1\344\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\31\6\1\u02c9"+ - "\5\6\4\0\1\4\5\6\1\u02ca\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\11\6\1\151\3\6"+ - "\1\u0197\21\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\1\u02cb\1\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\u02cc"+ - "\23\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u0273"+ - "\21\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\31\6\1\151"+ - "\5\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u02cd"+ - "\21\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\1\6\1\u02ce\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\4\6\1\151\32\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\3\6\1\u02cf\33\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\260\1\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\5\6\1\u019d\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\5\6\1\u02d0\31\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\5\6\1\u02d1\31\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\u0110\35\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\6\6\1\u0255\30\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\15\6\1\u0197\21\6"+ - "\4\0\1\4\3\6\1\u02d2\2\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\21\6\1\u0239\15\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\6\6\1\u02d3\30\6"+ - "\36\0\1\u02d4\117\0\1\u01c9\51\0\1\u026d\44\0\1\u026f"+ - "\1\u02d5\4\u026f\1\u02d5\17\u026f\3\u02d5\1\u026f\1\u02d5\2\0"+ - "\2\u02d5\1\0\2\u026f\2\0\3\u026f\1\0\1\u02d5\2\u026f"+ - "\1\u02d5\1\u026f\1\0\1\u02d5\1\u026f\5\u02d5\2\u026f\1\u02d5"+ - "\37\u026f\2\0\1\u02d5\33\0\1\u02d6\117\0\1\u01cd\51\0"+ - "\1\u0270\44\0\1\u0272\1\u02d7\4\u0272\1\u02d7\17\u0272\3\u02d7"+ - "\1\u0272\1\u02d7\2\0\2\u02d7\1\0\2\u0272\2\0\3\u0272"+ - "\1\0\1\u02d7\2\u0272\1\u02d7\1\u0272\1\0\1\u02d7\1\u0272"+ - "\5\u02d7\2\u0272\1\u02d7\37\u0272\2\0\1\u02d7\1\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\6\1\344\35\6\4\0\1\4"+ - "\5\6\1\302\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\u02d8\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\30\6\1\u01e9\6\6\4\0\1\4\5\6\1\u02d9\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\14\6\1\u02da\22\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u02db"+ - "\1\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\13\6\1\u02dc\23\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\5\6\1\u02dd\31\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\15\6\1\u02ba\21\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\2\6\1\u0161\34\6\4\0\1\4\5\6\1\u0237\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\157"+ - "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\223"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u02de"+ - "\1\6\1\u02df\13\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\4\6\1\u02e0\12\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\12\6\1\u02e1\4\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\10\6\1\u02e2\6\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\2\6\1\u02e3\14\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u028e\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\1\6\1\u0124\1\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ - "\1\u0207\15\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6"+ - "\1\u02e4\13\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\12\6\1\u02e5\24\6\4\0\1\4\6\6\1\0\10\6"+ - "\1\u02e6\6\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u02e7"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u02e8"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u02e9"+ - "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\11\6\1\u013e"+ - "\5\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\13\6\1\151"+ - "\3\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\6\6\1\u02ea"+ - "\10\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\u02eb\11\6"+ - "\1\u0290\4\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\36\6\1\151\4\0\1\4\6\6\1\0"+ - "\12\6\1\u0142\4\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\4\6\1\223\12\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\u02ec\15\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\4\6\1\u02ed\12\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\5\6\1\210\11\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\5\6\1\u02ee\11\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u02ef\1\0\37\6\4\0\1\4\6\6\1\0\7\6"+ - "\1\u029b\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u02f0"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\15\6\1\u013e"+ - "\1\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u02f1"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u02f2"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\15\6"+ - "\1\u02f3\21\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6"+ - "\1\u02f4\22\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\11\6"+ - "\1\u02f5\25\6\4\0\7\4\1\0\7\4\1\u02a3\7\4"+ - "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4"+ - "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4"+ - "\1\0\12\4\1\u02f6\4\4\11\0\3\4\2\0\3\4"+ - "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4"+ - "\1\0\37\4\4\0\7\4\1\0\16\4\1\u02f7\11\0"+ - "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0"+ - "\3\4\4\0\2\4\1\0\37\4\17\0\1\u02a8\132\0"+ - "\1\u02f8\132\0\1\u02f8\142\0\1\u02f9\124\0\1\u02a8\137\0"+ - "\1\u02fa\143\0\1\u02fb\106\0\1\4\6\6\1\0\7\6"+ - "\1\u02fc\7\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ - "\1\u02fd\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\1\6\1\u02fe\1\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6"+ - "\1\u02ff\15\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6"+ - "\1\u01c3\2\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u0300"+ - "\5\6\1\151\10\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\14\6\1\u022d\2\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u0301\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\17\6\1\u0197\17\6\4\0\1\4\5\6\1\u0302\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6"+ - "\1\u0303\22\6\4\0\1\4\5\6\1\u0304\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\u0305"+ - "\23\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\1\u0198\1\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\15\6\1\u0306\21\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\1\6\1\u0307\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\1\6\1\326\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\10\6\1\u0308\26\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\3\6\1\u0309\33\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\20\6\1\151\16\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\4\6\1\u0197\32\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\13\6\1\302\23\6\4\0\1\4"+ - "\5\6\1\u030a\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\3\6"+ - "\1\u030b\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\1\u02c2\1\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\36\6\1\151\4\0"+ - "\1\4\5\6\1\u02d9\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\u02de\15\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\5\6\1\u030c\31\6\4\0\1\4"+ - "\3\6\1\u030d\2\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\3\6\1\151\33\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\2\6\1\u030e\34\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\u01c2\35\6"+ - "\4\0\1\4\5\6\1\u030f\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\u0310\35\6\4\0"+ - "\1\4\5\6\1\u0311\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\10\6\1\u02d1\26\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\15\6\1\u0312\21\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\6\1\u025b\35\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\15\6\1\u0313\21\6\36\0\1\u026f"+ - "\133\0\1\u0272\101\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\11\6"+ - "\1\u0314\7\6\1\u0315\1\u0316\14\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\6\1\u0317\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\151\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\2\6"+ - "\1\u0318\34\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\11\6"+ - "\1\u0314\7\6\1\u0315\1\u0316\1\6\1\u0319\12\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\13\6\1\u010e\23\6\4\0"+ - "\1\4\6\6\1\0\5\6\1\u031a\11\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\2\6\1\151\14\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\16\6\1\u031b\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\u031c\11\6\1\u031d"+ - "\10\6\1\u031e\13\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\1\6\1\u031f\1\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\4\6"+ - "\1\u0116\12\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\16\6"+ - "\1\u031b\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\12\6\1\u031d\10\6\1\u031e\13\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\33\6\1\u013e\3\6\4\0\1\4"+ - "\6\6\1\0\13\6\1\u013e\3\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\2\6\1\u0152\14\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\10\6\1\u022f\6\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\11\6\1\u0320\5\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\1\6\1\u0321\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\u0152\15\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\10\6\1\u0322\6\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\1\6\1\u0323\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\15\6\1\151\1\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\14\6\1\163\2\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\u0324\15\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\3\6\1\u0325\13\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\7\6\1\u0326\7\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\7\6\1\u0327\7\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\5\6\1\u025e\31\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\32\6\1\u0197\4\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\20\6\1\u0197\16\6\4\0\7\4\1\0\1\u021b"+ - "\16\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0"+ - "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\4\0"+ - "\7\4\1\0\14\4\1\u02a3\2\4\11\0\3\4\2\0"+ - "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0"+ - "\2\4\1\0\37\4\23\0\1\u02f8\136\0\1\u0328\137\0"+ - "\1\u0329\105\0\1\4\6\6\1\0\11\6\1\u032a\5\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\12\6\1\u0124"+ - "\24\6\4\0\1\4\6\6\1\0\5\6\1\u013e\11\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\15\6\1\u0124\1\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\14\6\1\u032b\2\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\1\6\1\u032c\15\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\10\6\1\u032d"+ - "\26\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u032e"+ - "\21\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\4\6\1\u032f"+ - "\32\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\17\6\1\151"+ - "\17\6\4\0\1\4\5\6\1\u0330\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\1\6\1\255\35\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\4\6\1\u0331\32\6"+ - "\4\0\1\4\5\6\1\u01bf\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\15\6\1\u0332\21\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u0333\31\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\u01bf\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\u0334\35\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\1\6\1\u0197\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\17\6\1\u0161\17\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\11\6\1\u0161\25\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\10\6\1\u0335\26\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\14\6\1\u0336\22\6\4\0\1\4\5\6\1\u0337"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\37\6\4\0\1\4\5\6\1\326\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6"+ - "\1\u0338\31\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\1\u0339\1\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u033a"+ - "\21\6\4\0\1\4\3\6\1\u033b\2\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\5\6\1\u033c\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\6\1\u033d\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\10\6\1\u033e\6\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\1\6\1\u033f\15\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\1\6\1\210\15\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\12\6\1\u0340\4\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\1\u0341\16\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\3\6\1\u0342\13\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\1\u0119\36\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\u0343\36\6\4\0\1\4\6\6\1\0"+ - "\4\6\1\u0341\12\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\10\6\1\u0119\6\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\1\u0344\5\6"+ - "\1\0\1\u0345\16\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\14\6\1\u029b\2\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\14\0\1\u02a9\147\0\1\u02f8"+ - "\107\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\u0207\1\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\1\6\1\u0346\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\u0347\16\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\u02d1\35\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\14\6\1\u0348\22\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\13\6\1\u033b\23\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\6\6\1\u0237\30\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\24\6\1\u0349\12\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\24\6\1\u0110\12\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\15\6\1\u034a\21\6\4\0\1\4\3\6"+ - "\1\u034b\2\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\34\6\1\u034c\2\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\5\6\1\u0110\31\6\4\0"+ - "\1\4\3\6\1\u034d\2\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\13\6\1\u027b\23\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\u034e\35\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\151\35\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\1\6\1\u0269\35\6\4\0"+ - "\1\4\5\6\1\u034f\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\14\6\1\151\2\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\4\6\1\u0285\12\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\u0350\15\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\14\6\1\u0351\2\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\14\6\1\u020c\2\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\6\6\1\u013e\10\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\u0352\15\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\10\6\1\u0353\6\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\1\6\1\u0354\15\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\14\6\1\u0355\2\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\14\6\1\u0356\2\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\3\6\1\u0197\33\6\4\0\1\4"+ - "\5\6\1\u0357\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0"+ - "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0"+ - "\2\6\1\0\1\6\1\u0358\35\6\4\0\1\4\5\6"+ - "\1\u0359\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\5\6\1\u035a\31\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\1\6\1\u035b\35\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\10\6\1\u035c\26\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\25\6\1\151\11\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\26\6\1\151\10\6\4\0\1\4\6\6\1\0"+ - "\7\6\1\u035d\7\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\1\6\1\u0119\15\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\1\6\1\u035e\1\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\13\6\1\u035f\3\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\2\6\1\u0360\3\6\1\151\10\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\1\222"+ - "\2\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\5\6"+ - "\1\u0110\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\u0361\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\3\6\1\151\33\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\20\6\1\u0362\16\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\2\6\1\u0363\34\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\16\6\1\310\20\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\15\6\1\u0161\21\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\u0124\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u0364"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\u0365"+ - "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\3\6\1\u0366"+ - "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6"+ - "\1\u0367\22\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6"+ - "\1\u0368\35\6\4\0\1\4\6\6\1\0\17\6\11\0"+ - "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6"+ - "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\15\6"+ - "\1\u0369\21\6\4\0\1\4\6\6\1\0\3\6\1\u036a"+ - "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\7\6\1\u036b"+ - "\7\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u011a"+ - "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\37\6\4\0\1\4\5\6\1\u0166\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\10\6\1\u036c"+ - "\26\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\14\6\1\u036d"+ - "\22\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\1\6\1\u036e\1\0\37\6"+ - "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\1\6\1\u036f\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\15\6\1\u0370\21\6\4\0"+ - "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\15\6\1\u0371\21\6\4\0"+ - "\1\4\6\6\1\0\5\6\1\u027f\11\6\11\0\1\4"+ - "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0"+ - "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0"+ - "\1\4\6\6\1\0\16\6\1\u0372\11\0\1\4\2\6"+ - "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4"+ - "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\21\6\1\u0373\15\6\4\0\1\4"+ - "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\1\6\1\u0274\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6"+ - "\1\0\1\6\1\u0374\15\6\11\0\1\4\2\6\2\0"+ - "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6"+ - "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\5\6"+ - "\1\u0375\1\0\17\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\4\6\1\u0376\12\6\11\0\1\4\2\6\2\0\3\6"+ - "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4"+ - "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6"+ - "\1\0\13\6\1\u0377\23\6\4\0\1\4\6\6\1\0"+ - "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6"+ - "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6"+ - "\1\223\1\0\37\6\4\0\1\4\6\6\1\0\17\6"+ - "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0"+ - "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0"+ - "\15\6\1\302\21\6\4\0"; + "\1\4\1\5\1\6\1\7\1\10\1\7\1\11\1\12" + + "\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22" + + "\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32" + + "\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42" + + "\1\43\1\7\1\6\1\44\1\45\1\46\1\47\1\50" + + "\1\51\1\33\1\52\1\53\1\54\1\55\1\56\1\57" + + "\2\4\1\34\1\60\1\41\1\33\1\61\1\62\1\41" + + "\1\63\1\64\1\65\1\66\1\67\1\70\1\71\1\7" + + "\1\72\1\73\1\74\1\75\1\76\1\77\1\100\1\101" + + "\1\102\1\103\1\104\1\105\1\106\2\6\2\7\3\6" + + "\1\107\2\7\1\34\1\41\1\110\1\111\12\112\1\113" + + "\30\112\1\114\5\112\1\115\14\112\1\116\2\112\1\117" + + "\42\112\12\120\1\121\30\120\1\122\22\120\1\123\2\120" + + "\1\124\42\120\7\4\1\0\17\4\11\0\3\4\2\0" + + "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0" + + "\2\4\1\0\37\4\4\0\1\4\6\6\1\0\10\6" + + "\1\125\6\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\3\126\1\7\1\126\1\7\1\127\1\0" + + "\1\126\1\127\3\126\1\130\4\126\1\131\4\126\11\0" + + "\1\126\1\7\1\126\2\0\2\126\1\7\2\0\1\131" + + "\1\130\1\132\1\126\1\0\3\126\4\0\2\126\1\0" + + "\7\126\1\7\17\126\2\7\4\126\2\7\4\0\1\4" + + "\5\6\1\133\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\1\6\1\134\35\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\13\6\1\135\2\6\1\136" + + "\12\6\1\137\5\6\13\0\1\41\20\0\1\41\103\0" + + "\1\4\6\6\1\0\1\6\1\140\12\6\1\141\2\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\4\6\1\142\12\6" + + "\11\0\1\4\1\6\1\143\2\0\1\144\2\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6" + + "\1\145\1\6\1\146\2\6\1\147\3\6\1\150\2\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\2\6\1\151\1\6" + + "\1\152\1\6\1\153\10\6\11\0\1\4\1\154\1\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\10\6\1\155\1\6\1\156\4\6\11\0" + + "\1\4\2\6\2\0\1\157\2\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\6\1\160\2\6" + + "\1\151\3\6\1\161\1\6\1\162\1\6\1\163\2\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\6\1\164\1\6" + + "\1\165\1\6\1\166\2\6\1\167\1\6\1\170\1\171" + + "\3\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6" + + "\1\172\1\0\1\173\22\6\1\174\13\6\4\0\1\4" + + "\6\6\1\0\1\6\1\175\1\6\1\176\4\6\1\177" + + "\3\6\1\200\2\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\201\6\6\1\151\7\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\1\6\1\202\1\6\1\203\1\204\1\205\1\6" + + "\1\206\1\207\6\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\1\210\1\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\4\6\1\211\5\6\1\212\1\213\3\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\3\6\1\151\3\6\1\214" + + "\1\215\6\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\216" + + "\3\6\1\201\1\6\1\217\1\220\1\6\1\221\5\6" + + "\11\0\1\4\2\6\2\0\1\222\1\223\1\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\1\6\1\224\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\6\1\225\5\6\1\226\7\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\6\1\227\1\6\1\230\4\6\1\231" + + "\3\6\1\232\2\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\33\0\1\233\134\0\1\41" + + "\267\0\1\41\1\0\1\234\16\0\1\235\62\0\27\236" + + "\1\237\3\236\1\240\4\236\1\241\2\236\1\0\70\236" + + "\34\0\1\33\134\0\1\33\126\0\1\41\6\0\1\41" + + "\74\0\40\45\1\242\2\45\1\243\1\244\67\45\1\4" + + "\6\6\1\0\14\6\1\245\2\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\3\6\1\246\13\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\3\126" + + "\1\7\1\126\1\7\1\127\1\0\1\126\1\127\3\126" + + "\1\130\4\126\1\131\4\126\11\0\1\126\1\7\1\247" + + "\2\0\2\126\1\7\2\0\1\131\1\130\1\132\1\126" + + "\1\0\3\126\4\0\2\126\1\0\7\126\1\7\17\126" + + "\2\7\1\247\3\126\2\7\54\0\1\51\63\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\1\250\1\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\13\6\1\251\4\6\1\252" + + "\16\6\4\0\1\4\5\6\1\253\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\1\254\1\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\1\6\1\255\3\6\1\256\5\6\1\151\23\6\7\0" + + "\1\132\1\0\1\132\33\0\1\132\5\0\1\132\30\0" + + "\1\132\17\0\2\132\4\0\2\132\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\1\6\1\257\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\1\6\1\260\3\6\1\261\6\6" + + "\1\262\22\6\4\0\7\4\1\0\1\263\1\264\1\4" + + "\1\265\1\4\1\266\4\4\1\267\1\270\3\4\11\0" + + "\3\4\2\0\3\4\1\271\1\0\2\4\1\0\1\4" + + "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\1\4" + + "\6\6\1\0\3\6\1\272\4\6\1\273\6\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\3\6\1\274\3\6\1\275" + + "\1\276\3\6\1\277\2\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\1\6\1\300\15\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\3\6" + + "\1\301\2\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\2\6\1\302\1\303\1\304" + + "\3\6\1\305\2\6\1\306\1\6\1\307\1\310\20\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\14\6\1\311\22\6" + + "\4\0\1\4\5\6\1\312\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\1\313\1\314\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6" + + "\1\315\6\6\1\316\1\317\2\6\1\320\1\6\1\321" + + "\1\6\1\322\12\6\4\0\1\4\5\6\1\323\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\6" + + "\1\324\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\5\6\1\325\1\326\1\6\1\327\2\6" + + "\1\330\1\331\22\6\4\0\1\4\3\6\1\306\2\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\10\6\1\151\26\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\5\6\1\332\6\6\1\333\22\6\4\0" + + "\1\4\5\6\1\334\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\1\6\1\335\3\6" + + "\1\336\6\6\1\337\22\6\4\0\1\4\5\6\1\340" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6" + + "\1\341\15\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\1\342\1\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\5\6\1\343\10\6\1\344\20\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\1\345\1\6\2\0" + + "\3\6\2\0\2\6\1\0\1\151\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\3\6\1\346\7\6\1\347" + + "\23\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\350" + + "\3\6\1\351\2\6\1\352\3\6\1\353\22\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\1\6\1\354\35\6\4\0" + + "\1\4\5\6\1\355\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\10\6\1\356\26\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\5\6\1\357\2\6" + + "\1\360\3\6\1\151\22\6\4\0\1\4\5\6\1\361" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\1\6\1\362\3\6\1\363\6\6\1\364" + + "\22\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\1\365\1\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\12\6\1\366\4\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\5\6\1\367\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\5\6\1\370\31\6\136\0" + + "\1\41\134\0\1\41\12\112\1\0\30\112\1\0\5\112" + + "\1\0\14\112\1\0\2\112\1\0\42\112\13\0\1\371" + + "\53\0\1\372\76\0\1\373\170\0\1\374\135\0\1\375" + + "\42\0\12\120\1\0\30\120\1\0\22\120\1\0\2\120" + + "\1\0\42\120\13\0\1\376\53\0\1\377\133\0\1\u0100" + + "\135\0\1\u0101\42\0\1\4\6\6\1\0\3\6\1\u0102" + + "\13\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\7\126\1\0\17\126\11\0\3\126" + + "\2\0\3\126\2\0\2\126\1\0\1\126\1\0\3\126" + + "\4\0\2\126\1\0\37\126\4\0\3\126\1\u0103\1\126" + + "\1\u0103\1\126\1\u0104\17\126\10\0\1\u0104\1\126\1\u0103" + + "\1\126\2\0\2\126\1\u0103\2\0\2\126\1\0\1\126" + + "\1\0\3\126\4\0\2\126\1\0\7\126\1\u0103\17\126" + + "\2\u0103\4\126\2\u0103\4\0\7\126\1\0\12\126\1\u0105" + + "\4\126\11\0\3\126\2\0\3\126\2\0\1\u0105\1\126" + + "\1\0\1\126\1\0\3\126\4\0\2\126\1\0\37\126" + + "\4\0\7\126\1\0\5\126\1\u0105\11\126\11\0\3\126" + + "\2\0\3\126\2\0\1\126\1\u0105\1\0\1\126\1\0" + + "\3\126\4\0\2\126\1\0\37\126\4\0\3\126\1\132" + + "\1\126\1\132\1\u0106\1\0\1\126\1\u0106\1\u0107\2\126" + + "\1\u0107\11\126\11\0\1\126\1\132\1\126\2\0\2\126" + + "\1\132\2\0\1\126\1\u0107\1\0\1\u0107\1\0\3\126" + + "\4\0\2\126\1\0\7\126\1\132\17\126\2\132\4\126" + + "\2\132\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\4\6\1\u0108" + + "\12\6\1\u0109\17\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\11\6\1\u010a\3\6\1\u010b\21\6\4\0\1\4\3\6" + + "\1\u010c\2\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\4\6\1\u010d\6\6\1\u010e" + + "\5\6\1\u010f\15\6\4\0\1\4\5\6\1\u0110\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\1\6\1\344\35\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\1\6\1\260\16\6\1\151\16\6\4\0\1\4" + + "\6\6\1\0\11\6\1\u0111\3\6\1\u0112\1\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\1\6\1\u0113\1\0\12\6\1\u0114" + + "\24\6\4\0\1\4\6\6\1\0\1\u0115\3\6\1\u0116" + + "\4\6\1\u0117\4\6\1\u0118\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\13\6\1\151\1\150\2\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\6\1\u0119\12\6\1\157\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\1\6\1\u011a\2\6\1\201" + + "\1\u011b\11\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\10\6" + + "\1\u011c\6\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\7\6" + + "\1\u011d\7\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\11\6" + + "\1\u011e\5\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\u011f" + + "\13\6\1\u0120\2\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\1\6\1\151\1\0\37\6\4\0\1\4\6\6" + + "\1\0\4\6\1\u0121\12\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\35\6\1\u0119\1\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\1\151\36\6\4\0\1\4\6\6\1\0" + + "\16\6\1\u0122\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\5\6" + + "\1\151\11\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\2\6" + + "\1\u011e\1\6\1\151\12\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\1\6\1\151\1\0\37\6\4\0\1\4" + + "\6\6\1\0\15\6\1\u0123\1\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\1\u0124\36\6\4\0" + + "\1\4\6\6\1\0\4\6\1\210\12\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\12\6\1\u0125\24\6\4\0" + + "\1\4\6\6\1\0\11\6\1\u0126\5\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\23\6\1\151" + + "\13\6\4\0\1\4\6\6\1\0\4\6\1\u0127\10\6" + + "\1\u0119\1\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6" + + "\1\u0128\13\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\7\6" + + "\1\u0129\7\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\16\6" + + "\1\u012a\11\0\1\4\2\6\2\0\1\6\1\u012b\1\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\5\6\1\u012c\11\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\u012d\13\6\1\u012e\2\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\3\6\1\u012f\13\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\5\6\1\151\1\6\1\u011e\7\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\11\6\1\u0130\1\6\1\u0131\1\6" + + "\1\u0132\1\u0133\11\0\1\4\2\6\2\0\1\u0134\2\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\15\6\1\u0135\1\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\12\6\1\u0136\4\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\1\u0137\36\6\4\0\1\4\6\6" + + "\1\0\1\u0138\3\6\1\u0139\12\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\151\16\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\3\6\1\u013a\13\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\7\6\1\u013b\7\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\16\6\1\u0118\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\14\6\1\u013c\2\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\10\6\1\u013d\6\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\u013e\3\6\1\u013f\1\u0140\1\u0127\1\u0141\2\6\1\u0142" + + "\3\6\1\u0143\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6" + + "\1\u0144\2\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6" + + "\1\u0145\13\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\3\6" + + "\1\201\13\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\13\6" + + "\1\u0124\3\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\10\6" + + "\1\u0146\6\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\1\u0124\36\6\4\0\1\4\6\6\1\0\1\u0147\16\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\3\6\1\u0148\13\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\7\6\1\u0149\7\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\10\6\1\u014a\1\u014b" + + "\5\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u014c" + + "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\6\6\1\151" + + "\10\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\u014d" + + "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\1\6\1\u014e\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\6\1\u014f\15\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\u0150\16\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\1\151\3\6\1\u0151\12\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\151\3\6\1\u0152" + + "\11\6\1\151\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\13\6" + + "\1\u0153\3\6\11\0\1\4\1\6\1\151\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\34\0\10\41\74\0\33\u0154" + + "\1\u0155\7\u0154\1\0\117\u0154\1\u0156\3\u0154\1\u0155\7\u0154" + + "\1\0\75\u0154\1\u0157\4\u0154\1\236\1\u0154\1\236\2\u0154" + + "\1\236\4\u0154\1\236\2\u0154\1\236\3\u0154\1\u0158\4\u0154" + + "\1\236\1\u0159\1\u015a\1\0\3\236\1\u0159\17\u0154\1\236" + + "\10\u0154\1\u0159\17\u0154\1\u0159\1\u0157\1\u015a\4\u0154\1\u0157" + + "\4\u0154\5\243\1\45\4\243\1\45\1\243\1\45\2\243" + + "\1\45\4\243\1\45\2\243\1\45\3\243\1\45\4\243" + + "\2\45\1\u015b\1\0\4\45\17\243\1\45\10\243\1\45" + + "\17\243\2\45\1\u015b\4\243\1\45\44\243\1\u015c\3\243" + + "\1\u015d\67\243\1\4\6\6\1\0\5\6\1\u015e\11\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\1\6\1\u015f\1\0\37\6" + + "\4\0\3\126\4\u0160\1\0\3\u0160\6\126\1\u0160\2\126" + + "\1\u0160\2\126\11\0\1\126\1\u0160\1\126\2\0\1\126" + + "\2\u0160\2\0\2\126\1\0\1\u0160\1\0\3\126\4\0" + + "\2\126\1\0\1\126\2\u0160\1\126\1\u0160\2\126\1\u0160" + + "\17\126\2\u0160\4\126\2\u0160\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\14\6\1\306\22\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\14\6\1\u0161\22\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\20\6\1\u0162\16\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\u0163\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\13\6\1\151\1\6\1\151\21\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\13\6\1\326\23\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\11\6\1\u0164\25\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\17\6\1\u0123\4\6\1\u0162\12\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\5\6\1\u0165\31\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\4\6\1\u0163\32\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\10\6\1\u0166\26\6" + + "\4\0\1\4\5\6\1\u0167\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\1\6\1\u0168\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\13\6" + + "\1\306\23\6\4\0\7\4\1\0\1\4\1\u0169\15\4" + + "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4" + + "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4" + + "\1\0\4\4\1\u016a\1\u016b\1\4\1\u016c\7\4\11\0" + + "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0" + + "\3\4\4\0\2\4\1\0\37\4\4\0\7\4\1\0" + + "\2\4\1\u016d\1\4\1\u016e\12\4\11\0\3\4\2\0" + + "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0" + + "\2\4\1\0\37\4\4\0\7\4\1\0\3\4\1\u016f" + + "\13\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0" + + "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\4\0" + + "\7\4\1\0\4\4\1\u0170\12\4\11\0\3\4\2\0" + + "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0" + + "\2\4\1\0\37\4\4\0\7\4\1\0\7\4\1\u0171" + + "\7\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0" + + "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\14\0" + + "\1\u0172\1\u0173\1\0\1\u0174\1\0\1\u0175\4\0\1\u0176" + + "\1\u0177\24\0\1\271\63\0\1\4\6\6\1\0\1\6" + + "\1\u0178\15\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\12\6" + + "\1\u0144\4\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\16\6" + + "\1\u013e\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u0179" + + "\1\6\1\u017a\6\6\1\u017b\4\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\u017c\2\6\1\u017d\4\6\1\u017e\6\6" + + "\11\0\1\4\2\6\2\0\1\6\1\u017f\1\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\1\u0180\1\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\4\6\1\u0127\12\6\11\0\1\4\2\6\2\0\1\6" + + "\1\u0181\1\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\6\1\u0182\1\6\1\u0183\13\6\11\0" + + "\1\4\2\6\2\0\1\6\1\u0184\1\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\3\6\1\u0185\2\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\3\6" + + "\1\151\33\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6" + + "\1\u0186\22\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\4\6" + + "\1\u0187\1\u0188\31\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\10\6\1\u0189\26\6\4\0\1\4\3\6\1\151\2\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\1\6\1\u018a\35\6\4\0\1\4\5\6\1\u018b\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\15\6" + + "\1\u018c\21\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\4\6" + + "\1\u018d\15\6\1\151\14\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\2\6\1\u018e\16\6\1\u018f\15\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\14\6\1\u0190\22\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\10\6\1\u0191\26\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\13\6\1\u0192\3\6\1\u0110\17\6" + + "\4\0\1\4\3\6\1\u0193\2\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6" + + "\1\u0194\35\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\1\6\1\u0195\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\1\6\1\151\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\10\6" + + "\1\u0163\26\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6" + + "\1\u0196\22\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\14\6" + + "\1\u0197\22\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6" + + "\1\u0198\35\6\4\0\1\4\3\6\1\u0199\2\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u019a" + + "\1\u019b\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\3\6\1\u0192\4\6\1\u019c\2\6\1\u019d" + + "\5\6\1\u019e\15\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\1\6\1\u019f\35\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\5\6\1\u01a0\31\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\21\6\1\u010f\15\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\10\6\1\u01a1\26\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\1\u019f\1\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\5\6\1\u01a2\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\4\6\1\u01a3" + + "\11\6\1\u01a4\1\u01a5\1\u01a6\1\u01a7\15\6\4\0\1\4" + + "\3\6\1\u01a8\2\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\13\6\1\u01a9\23\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\1\u01aa\1\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\24\6\1\u01ab" + + "\12\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\17\6\1\u01ac" + + "\17\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\u01ad" + + "\35\6\4\0\1\4\6\6\1\0\14\6\1\u01ae\2\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\21\6\1\u01af" + + "\15\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\24\6\1\151" + + "\12\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\1\6\1\151\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\35\6\1\u0110\1\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\13\6\1\u01b0\23\6" + + "\4\0\1\4\3\6\1\u01b1\2\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6" + + "\1\u01b2\13\6\1\151\21\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\2\6\1\u01b3\10\6\1\u0192\23\6\4\0\1\4" + + "\3\6\1\u01b4\2\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\2\6\1\u01b5\2\6" + + "\1\u01b6\1\u01b7\5\6\1\u01b8\22\6\4\0\1\4\5\6" + + "\1\u01b9\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\1\u01ba\1\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\14\6\1\u01bb\22\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\21\6\1\u0199\15\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\1\6\1\u01bc\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\15\6\1\u01bd\21\6\4\0\1\4" + + "\5\6\1\u01be\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\24\6\1\u0162\12\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\5\6\1\u01bf\31\6\4\0\1\4\3\6" + + "\1\u01c0\2\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\20\6\1\u01c1\10\6\1\151\5\6\4\0" + + "\1\4\3\6\1\151\2\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\u01c2" + + "\5\6\1\151\15\6\4\0\1\4\3\6\1\151\2\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\13\6\1\u01c3\23\6\4\0\1\4\5\6" + + "\1\u01c4\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\6\1\u01c5\15\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\5\6\1\u01c6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\2\6\1\u01c7\11\6\1\u01c8\22\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\14\6\1\u01c9\22\6\21\0" + + "\1\u01ca\141\0\1\u01cb\177\0\1\u01cc\135\0\1\u01cd\57\0" + + "\1\u01ce\141\0\1\u01cf\177\0\1\u01d0\135\0\1\u01d1\42\0" + + "\1\4\6\6\1\0\4\6\1\u01d2\12\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\3\126\1\u0103\1\126\1\u0103\1\126\1\0\5\126\1\130" + + "\4\126\1\131\4\126\11\0\1\126\1\u0103\1\126\2\0" + + "\2\126\1\u0103\2\0\1\131\1\130\1\0\1\126\1\0" + + "\3\126\4\0\2\126\1\0\7\126\1\u0103\17\126\2\u0103" + + "\4\126\2\u0103\7\0\1\u0103\1\0\1\u0103\33\0\1\u0103" + + "\5\0\1\u0103\30\0\1\u0103\17\0\2\u0103\4\0\2\u0103" + + "\4\0\3\126\1\u01d3\1\126\1\u01d3\1\126\1\u01d4\17\126" + + "\10\0\1\u01d4\1\126\1\u01d3\1\126\2\0\2\126\1\u01d3" + + "\2\0\2\126\1\0\1\126\1\0\3\126\4\0\2\126" + + "\1\0\7\126\1\u01d3\17\126\2\u01d3\4\126\2\u01d3\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\5\6\1\u01d5\6\6\1\u01d6" + + "\22\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\10\6\1\u01d7" + + "\26\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\3\6\1\u01d8" + + "\12\6\1\100\20\6\4\0\1\4\5\6\1\u01d9\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\24\6" + + "\1\u01da\12\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6" + + "\1\u01d5\31\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\1\u01db\1\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\5\6\1\u01dc" + + "\31\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\151" + + "\23\6\4\0\1\4\6\6\1\0\3\6\1\u01dd\4\6" + + "\1\u01de\6\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\7\6" + + "\1\u01df\7\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6" + + "\1\u01e0\15\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\6\6" + + "\1\u01e1\10\6\11\0\1\4\2\6\2\0\1\46\2\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\1\u01e2\36\6\4\0\1\4\6\6\1\0\12\6" + + "\1\u01e3\4\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\10\6" + + "\1\u01de\6\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\10\6" + + "\1\u01e4\6\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\4\6" + + "\1\151\12\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\5\6" + + "\1\u01e5\11\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6" + + "\1\u01e6\15\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\10\6" + + "\1\u0144\6\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\16\6" + + "\1\u01e7\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\1\6\1\151\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\6\1\u01e8\15\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\7\6\1\220\7\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\12\6\1\u01e9\4\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\1\6\1\u01ea\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\1\u01eb" + + "\1\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\1\6\1\u0144\15\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\1\6\1\u01ec\15\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\10\6\1\u01ed\6\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\1\151\1\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\11\6\1\u01ee\5\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\1\6\1\u0153\1\0\37\6\4\0\1\4\6\6" + + "\1\0\3\6\1\u01ef\2\6\1\u01f0\4\6\1\u01f1\3\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\6\6\1\u01f2\10\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\3\6\1\u011e\13\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\6\1\u01f3\15\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\7\6\1\u01f4\7\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\1\6\1\u01f5\1\0\37\6" + + "\4\0\1\4\6\6\1\0\10\6\1\u01f6\6\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\1\6\1\u01e7\3\6\1\u01f7" + + "\11\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u01f8" + + "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\10\6\1\u01f9" + + "\6\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\1\6\1\u01fa" + + "\15\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\1\u011e\1\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\4\6\1\u01fb\12\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\11\6\1\u01fc\5\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\3\6\1\u01fd\13\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\u01fe\14\6\1\u013e" + + "\1\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\26\6\1\151\10\6\4\0\1\4\6\6\1\0" + + "\5\6\1\u01ff\11\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\11\6\1\u0200\5\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\6\6\1\223\10\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\6\6\1\u0201\10\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\6\1\151\15\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\11\6\1\u0202\5\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\4\6\1\u0203\4\6\1\u01fc\5\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\7\6\1\u0204\7\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\4\6\1\u0205\12\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\1\6" + + "\1\u0206\1\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\7\6\1\151\7\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\23\6\1\u0207\13\6\4\0\1\4" + + "\6\6\1\0\1\u0208\12\6\1\u0209\2\6\1\u020a\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\7\6\1\u01d2\27\6" + + "\4\0\1\4\6\6\1\0\4\6\1\u0127\12\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\14\6\1\u020b\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\6\6\1\u0127\10\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\6\6\1\u020c\10\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\7\6\1\u020d\7\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\4\6\1\u020e\12\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\12\6\1\u020f\4\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\13\6\1\u01d2\3\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\3\6\1\u0210\13\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\12\6\1\u0211\4\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\1\6\1\u0212\1\0\37\6\4\0" + + "\1\4\6\6\1\0\14\6\1\u0120\2\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\33\u0154\1\240\7\u0154\1\0\120\u0154\3\236\1\u0158\4\236" + + "\3\u0154\1\0\75\u0154\1\236\25\u0154\1\u0155\5\u0154\1\236" + + "\1\u0154\1\0\3\u0154\1\236\30\u0154\1\236\17\u0154\2\236" + + "\5\u0154\1\236\4\u0154\33\0\1\u0155\100\0\5\u0154\1\u0157" + + "\25\u0154\1\u0155\5\u0154\1\u0157\1\u0154\1\0\3\u0154\1\u0157" + + "\30\u0154\1\u0157\17\u0154\2\u0157\5\u0154\1\u0157\7\u0154\4\u0213" + + "\1\u0154\3\u0213\6\u0154\1\u0213\2\u0154\1\u0213\6\u0154\1\240" + + "\5\u0154\1\u0213\1\u0154\1\0\2\u0154\2\u0213\5\u0154\1\u0213" + + "\14\u0154\2\u0213\1\u0154\1\u0213\2\u0154\1\u0213\17\u0154\2\u0213" + + "\4\u0154\2\u0213\4\u0154\3\243\4\u0214\1\243\3\u0214\6\243" + + "\1\u0214\2\243\1\u0214\13\243\1\u015c\1\u0214\2\243\1\u015d" + + "\1\243\2\u0214\5\243\1\u0214\14\243\2\u0214\1\243\1\u0214" + + "\2\243\1\u0214\17\243\2\u0214\4\243\2\u0214\47\243\1\0" + + "\70\243\1\4\6\6\1\0\12\6\1\u013e\4\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\4\6\1\u0215\3\6\1\u0216" + + "\6\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\3\126\4\u0160\1\0\3\u0160\2\126" + + "\1\u0217\3\126\1\u0160\1\u0218\1\126\1\u0160\2\126\11\0" + + "\1\126\1\u0160\1\126\2\0\1\126\2\u0160\2\0\1\u0218" + + "\1\u0217\1\0\1\u0160\1\0\3\126\4\0\2\126\1\0" + + "\1\126\2\u0160\1\126\1\u0160\2\126\1\u0160\17\126\2\u0160" + + "\4\126\2\u0160\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\22\6" + + "\1\u0219\14\6\4\0\1\4\5\6\1\u019f\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\151" + + "\21\6\4\0\1\4\5\6\1\u021a\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\5\6\1\u019f\31\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\21\6\1\u021b\15\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\1\6\1\u021c\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\5\6\1\u021d\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\7\4" + + "\1\0\2\4\1\266\14\4\11\0\3\4\2\0\3\4" + + "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4" + + "\1\0\37\4\4\0\7\4\1\0\1\u021e\16\4\11\0" + + "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0" + + "\3\4\4\0\2\4\1\0\37\4\4\0\7\4\1\0" + + "\3\4\1\u021f\2\4\1\u0220\10\4\11\0\3\4\2\0" + + "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0" + + "\2\4\1\0\37\4\4\0\7\4\1\0\7\4\1\u0221" + + "\7\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0" + + "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\4\0" + + "\7\4\1\0\1\u0222\3\4\1\u0170\12\4\11\0\3\4" + + "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4" + + "\4\0\2\4\1\0\37\4\4\0\7\4\1\0\11\4" + + "\1\u0223\5\4\11\0\3\4\2\0\3\4\2\0\2\4" + + "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\37\4" + + "\4\0\7\4\1\0\4\4\1\u0220\12\4\11\0\3\4" + + "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4" + + "\4\0\2\4\1\0\37\4\4\0\7\4\1\0\1\u0222" + + "\16\4\11\0\3\4\2\0\3\4\2\0\2\4\1\0" + + "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\4\0" + + "\7\4\1\0\14\4\1\u0224\2\4\11\0\3\4\2\0" + + "\3\4\2\0\2\4\1\0\1\4\1\0\3\4\4\0" + + "\2\4\1\0\37\4\15\0\1\u0225\136\0\1\u0226\1\u0227" + + "\1\0\1\u0228\126\0\1\u0229\1\0\1\u022a\132\0\1\u022b" + + "\134\0\1\u022c\136\0\1\u022d\114\0\1\4\6\6\1\0" + + "\7\6\1\u022e\7\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\6\1\u022f\15\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\16\6\1\151\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\4\6" + + "\1\u0230\12\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\10\6" + + "\1\u0231\3\6\1\u0232\2\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\4\6\1\u0233\11\6\1\u020d\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\11\6\1\u0234\5\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\3\6\1\u0235\13\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\6\1\u0236\15\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\5\6\1\u0237\11\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\26\6\1\u0238\10\6\4\0\1\4" + + "\6\6\1\0\15\6\1\u0239\1\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\3\6\1\u023a\13\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\7\6\1\u023b\27\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\13\6\1\u0192\23\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\3\6\1\u023c\33\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\3\6\1\u0192\33\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\1\6\1\u023d\35\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\13\6\1\u023e\23\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\10\6\1\u023f\26\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\5\6\1\u0240\5\6\1\u0241\23\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\5\6\1\u0242\31\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\3\6\1\u0243\33\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\3\6\1\u0244\10\6" + + "\1\u0245\3\6\1\u0246\16\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\4\6\1\u0247\32\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\15\6\1\u01c1\21\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\6\6\1\151\30\6\4\0\1\4\5\6\1\u0248" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\10\6\1\u0249\26\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\14\6\1\u0163\22\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\15\6\1\u024a\21\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\1\6\1\u024b" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\3\6" + + "\1\302\33\6\4\0\1\4\5\6\1\151\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\u024c" + + "\23\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\4\6\1\u024d" + + "\6\6\1\u024e\23\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\10\6\1\u024f\26\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\4\6\1\u0250\32\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\2\6\1\u0251\34\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\10\6\1\151\26\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\3\6\1\u0252\33\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\4\6\1\u0253\32\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\10\6\1\u0254\26\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\5\6\1\u0255\31\6\4\0\1\4\5\6\1\u0256\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\5\6\1\u0257\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\5\6\1\u021b\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\1\6\1\u0258\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\5\6\1\u0259" + + "\31\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\14\6\1\u025a" + + "\22\6\4\0\1\4\3\6\1\u025b\2\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\17\6\1\u0199\5\6\1\151\11\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\13\6\1\u025c\23\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\4\6\1\u024d\32\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\6\6\1\u0163\30\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\10\6\1\u025d\26\6\4\0\1\4\6\6" + + "\1\0\7\6\1\u025e\7\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\15\6\1\u025f\21\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\1\u0260\1\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\5\6\1\u0261" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\10\6\1\305\26\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\1\6\1\u0262" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6" + + "\1\u0263\3\6\1\u0264\31\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\14\6\1\u0265\22\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\4\6\1\u0266\32\6\4\0\1\4\5\6\1\u0267" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\13\6\1\u0268\5\6\1\u023f\15\6\4\0\1\4\5\6" + + "\1\u0269\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\13\6\1\u026a\23\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\21\6\1\151\15\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u0199" + + "\1\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\1\u026b\1\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\20\6" + + "\1\u023b\16\6\4\0\1\4\3\6\1\u026c\2\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\20\6\1\u026d\1\u026e\15\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\14\6\1\u026f\22\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\1\6\1\u01b2\35\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\15\6\1\u0270\21\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\1\u0271\1\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\10\6\1\u023d\26\6\4\0\1\4\6\6\1\0" + + "\7\6\1\u020b\7\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\25\6\1\u0272\11\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\14\6\1\u0273\22\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\17\6\1\u0274\17\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\13\6\1\u023b\23\6\15\0\1\u01cb\212\0\1\u0275" + + "\66\0\1\u0276\164\0\1\u0277\70\0\1\u01cf\212\0\1\u0278" + + "\66\0\1\u0279\164\0\1\u027a\57\0\3\126\1\u01d3\1\126" + + "\1\u01d3\1\126\1\0\2\126\1\u0107\2\126\1\u0107\11\126" + + "\11\0\1\126\1\u01d3\1\126\2\0\2\126\1\u01d3\2\0" + + "\1\126\1\u0107\1\0\1\u0107\1\0\3\126\4\0\2\126" + + "\1\0\7\126\1\u01d3\17\126\2\u01d3\4\126\2\u01d3\7\0" + + "\1\u01d3\1\0\1\u01d3\33\0\1\u01d3\5\0\1\u01d3\30\0" + + "\1\u01d3\17\0\2\u01d3\4\0\2\u01d3\4\0\1\4\3\6" + + "\1\u0199\2\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\21\6\1\u027b\15\6\4\0\1\4\5\6" + + "\1\u027c\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\5\6\1\u027d\21\6\1\u027e\7\6\4\0\1\4" + + "\3\6\1\u027f\2\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\3\6\1\u0280\10\6" + + "\1\u0281\1\u0282\21\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\14\6\1\u0283\22\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\21\6\1\u0284\15\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\13\6\1\u0285\23\6\4\0\1\4\6\6\1\0\16\6" + + "\1\u0286\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\1\u013e\16\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\6\1\u0287\15\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\u0288\2\6\1\u0289" + + "\2\6\1\u028a\10\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\1\6\1\u028b\1\0\37\6\4\0\1\4\6\6" + + "\1\0\10\6\1\u028c\6\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\27\6\1\u027e\7\6\4\0" + + "\1\4\6\6\1\0\3\6\1\u028d\13\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\16\6\1\u028e\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\4\6\1\u028f\12\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\223\16\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\4\6\1\u0203\1\6\1\u0290\10\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\1\6\1\u0291\1\0\37\6" + + "\4\0\1\4\6\6\1\0\14\6\1\u011e\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\1\6" + + "\1\u0292\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\5\6\1\157\11\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\10\6\1\151\6\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\2\6\1\151\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\7\6\1\u0293\7\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\4\6\1\201\12\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\6\1\u01d2\15\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\2\6\1\223\14\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\23\6\1\151\13\6\4\0\1\4" + + "\6\6\1\0\7\6\1\u0294\7\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\1\6\1\u0295\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\1\151\2\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\1\6" + + "\1\u0115\1\0\37\6\4\0\1\4\6\6\1\0\11\6" + + "\1\u0296\5\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\7\6" + + "\1\u01e5\7\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6" + + "\1\u0297\2\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\1\6\1\u0298\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\1\u01ee\2\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\7\6\1\u0299\7\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\u029a\16\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\10\6\1\u029b\6\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\14\6\1\u029c\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\1\6\1\u029d\1\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\3\6\1\u029e\13\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\12\6\1\u029f\4\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\6\6\1\u02a0\10\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\14\6\1\u02a1\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\14\6\1\274\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\1\6\1\157\15\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\1\6\1\u02a2\1\0\37\6\4\0" + + "\1\4\6\6\1\0\3\6\1\u0119\13\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\12\6\1\u01ee\4\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\12\6\1\150\4\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\1\6\1\u0144\6\6\1\u02a3\6\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\10\6\1\u02a4\6\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\12\6\1\151" + + "\24\6\4\0\1\4\6\6\1\0\12\6\1\u017a\4\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\14\6\1\u02a5\2\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\1\151\1\6\1\0\7\6" + + "\1\151\27\6\4\0\1\4\6\6\1\0\6\6\1\u02a6" + + "\10\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\14\6\1\u0119" + + "\2\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\1\6\1\u013e\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\1\u025e\1\6\1\0\37\6" + + "\4\0\3\u0154\4\236\1\u0154\3\236\6\u0154\1\236\2\u0154" + + "\1\236\6\u0154\1\240\5\u0154\1\236\1\u0154\1\0\2\u0154" + + "\2\236\5\u0154\1\236\14\u0154\2\236\1\u0154\1\236\2\u0154" + + "\1\236\17\u0154\2\236\4\u0154\2\236\4\u0154\3\243\4\45" + + "\1\243\3\45\6\243\1\45\2\243\1\45\13\243\1\u015c" + + "\1\45\2\243\1\u015d\1\243\2\45\5\243\1\45\14\243" + + "\2\45\1\243\1\45\2\243\1\45\17\243\2\45\4\243" + + "\2\45\4\243\1\4\6\6\1\0\10\6\1\u011e\6\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\13\6\1\u02a7\3\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\7\126\1\0\12\126\1\u02a8\4\126\11\0" + + "\3\126\2\0\3\126\2\0\1\u02a8\1\126\1\0\1\126" + + "\1\0\3\126\4\0\2\126\1\0\37\126\4\0\7\126" + + "\1\0\5\126\1\u02a8\11\126\11\0\3\126\2\0\3\126" + + "\2\0\1\126\1\u02a8\1\0\1\126\1\0\3\126\4\0" + + "\2\126\1\0\37\126\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\1\u0247\1\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\10\6" + + "\1\u02a9\26\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6" + + "\1\u0163\35\6\4\0\1\4\3\6\1\302\2\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\3\6" + + "\1\u02aa\7\6\1\u024e\1\6\1\u02ab\21\6\4\0\7\4" + + "\1\0\3\4\1\u021f\13\4\11\0\3\4\2\0\3\4" + + "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4" + + "\1\0\37\4\4\0\7\4\1\0\2\4\1\u02ac\14\4" + + "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4" + + "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4" + + "\1\0\1\4\1\u02ac\15\4\11\0\3\4\2\0\3\4" + + "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4" + + "\1\0\37\4\4\0\7\4\1\0\10\4\1\u02ad\6\4" + + "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4" + + "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4" + + "\1\0\1\4\1\u021f\15\4\11\0\3\4\2\0\3\4" + + "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4" + + "\1\0\37\4\4\0\7\4\1\0\5\4\1\u02ae\11\4" + + "\11\0\3\4\2\0\3\4\2\0\2\4\1\0\1\4" + + "\1\0\3\4\4\0\2\4\1\0\37\4\4\0\7\4" + + "\1\0\15\4\1\u02af\1\4\11\0\3\4\2\0\3\4" + + "\2\0\2\4\1\0\1\4\1\0\3\4\4\0\2\4" + + "\1\0\37\4\16\0\1\u0175\131\0\1\u02b0\136\0\1\u02b1" + + "\2\0\1\u02b2\134\0\1\u02b3\124\0\1\u02b4\3\0\1\u022c" + + "\140\0\1\u02b5\126\0\1\u02b2\127\0\1\u02b4\147\0\1\u02b6" + + "\107\0\1\4\6\6\1\0\14\6\1\u02b7\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\5\6\1\u02b8\11\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\11\6\1\151\5\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\12\6\1\u02b9\4\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\1\6\1\u013e\1\0\12\6\1\151" + + "\24\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\1\6\1\u02ba\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\1\6\1\u0286\1\0\37\6\4\0" + + "\1\4\6\6\1\0\4\6\1\u02bb\12\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\1\6\1\151" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\6\1\u02bc\15\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\u02bd\16\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\1\u02be\1\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\16\6\1\u020d\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\1\u01bb\1\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\11\6" + + "\1\151\25\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\6\6" + + "\2\151\27\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6" + + "\1\u02bf\35\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\20\6" + + "\1\u02c0\16\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6" + + "\1\u0163\31\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\13\6" + + "\1\306\23\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\15\6" + + "\1\u02c1\21\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\22\6" + + "\1\151\14\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\302" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\10\6\1\u02c2\26\6" + + "\4\0\1\4\5\6\1\u023b\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\16\6\1\151\20\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\15\6\1\u010c\21\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\4\6\1\u02c3\32\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\14\6\1\u02c4\22\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\15\6\1\u02c5\21\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\5\6\1\u02c6\31\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\1\6\1\353\35\6\4\0" + + "\1\4\5\6\1\344\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\1\6\1\u02c7\35\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\14\6\1\u0110\22\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\3\6\1\u02c8\33\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\1\u02c9\1\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\1\6\1\u02ca\35\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\10\6\1\u021c\26\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\10\6\1\u02cb\26\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\31\6\1\u02cc\5\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\1\6\1\u02cd\35\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\16\6\1\u0247\20\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\1\6\1\u02ce\35\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\2\6\1\u02cf\34\6\4\0\1\4\3\6" + + "\1\u02d0\2\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\3\6" + + "\1\u02d1\2\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\1\u02d2\16\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\5\6\1\151\31\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\6" + + "\1\344\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\31\6\1\u02d3\5\6\4\0\1\4\5\6\1\u02d4\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\11\6" + + "\1\151\3\6\1\u0199\21\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u02d5" + + "\1\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\13\6\1\u02d6\23\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\15\6\1\u027b\21\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\31\6\1\151\5\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\15\6\1\u02d7\21\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\1\6\1\u02d8" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\4\6" + + "\1\151\32\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\3\6" + + "\1\u02d9\33\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\1\260\1\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\5\6\1\u019f\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6" + + "\1\u02da\31\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\5\6" + + "\1\u02db\31\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6" + + "\1\u0110\35\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\6\6" + + "\1\u025d\30\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\15\6" + + "\1\u0199\21\6\4\0\1\4\3\6\1\u02dc\2\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\21\6" + + "\1\u023f\15\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\6\6" + + "\1\u02dd\30\6\36\0\1\u02de\117\0\1\u01cb\51\0\1\u0275" + + "\44\0\1\u0277\1\u02df\4\u0277\1\u02df\17\u0277\3\u02df\1\u0277" + + "\1\u02df\2\0\2\u02df\1\0\2\u0277\2\0\3\u0277\1\0" + + "\1\u02df\2\u0277\1\u02df\1\u0277\1\0\1\u02df\1\u0277\5\u02df" + + "\2\u0277\1\u02df\37\u0277\2\0\1\u02df\33\0\1\u02e0\117\0" + + "\1\u01cf\51\0\1\u0278\44\0\1\u027a\1\u02e1\4\u027a\1\u02e1" + + "\17\u027a\3\u02e1\1\u027a\1\u02e1\2\0\2\u02e1\1\0\2\u027a" + + "\2\0\3\u027a\1\0\1\u02e1\2\u027a\1\u02e1\1\u027a\1\0" + + "\1\u02e1\1\u027a\5\u02e1\2\u027a\1\u02e1\37\u027a\2\0\1\u02e1" + + "\1\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\1\6\1\344\35\6" + + "\4\0\1\4\5\6\1\302\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\u02e2\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\30\6\1\u01eb\6\6\4\0\1\4\5\6" + + "\1\u02e3\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\14\6\1\u02e4\22\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\1\u02e5\1\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\13\6\1\u02e6\23\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\5\6\1\u02e7\31\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\15\6\1\u02c3\21\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\2\6\1\u0162\34\6\4\0\1\4\5\6" + + "\1\u023d\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\14\6\1\157\2\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\6\1\223\15\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\6\1\u02e8\1\6\1\u02e9\13\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\4\6\1\u02ea\12\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\12\6\1\u02eb\4\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\10\6\1\u02ec\6\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\2\6\1\u02ed\14\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\1\6\1\u0296\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\1\6\1\u0124" + + "\1\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\1\6\1\u020b\15\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\3\6\1\u02ee\13\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\12\6\1\u02ef\24\6\4\0\1\4\6\6" + + "\1\0\10\6\1\u02f0\6\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\1\6\1\u02f1\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\6\1\u02f2\15\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\3\6\1\u02f3\13\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\11\6\1\u013e\5\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\13\6\1\151\3\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\6\6\1\u02f4\10\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\u02f5\11\6\1\u0298\4\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\36\6\1\151\4\0\1\4" + + "\6\6\1\0\12\6\1\u02f6\4\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\4\6\1\223\12\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\6\1\u02f7\15\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\4\6\1\u02f8\12\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\5\6\1\210\11\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\5\6\1\u02f9\11\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\1\6\1\u02fa\1\0\37\6\4\0\1\4\6\6" + + "\1\0\3\6\1\u01ef\13\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\7\6\1\u02a4\7\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\1\6\1\u02fb\1\0\37\6\4\0\1\4\6\6\1\0" + + "\15\6\1\u013e\1\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\6\1\u02fc\15\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\6\1\u02fd\15\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\15\6\1\u02fe\21\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\14\6\1\u02ff\22\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\11\6\1\u0300\25\6\4\0\7\4\1\0\7\4" + + "\1\u02ac\7\4\11\0\3\4\2\0\3\4\2\0\2\4" + + "\1\0\1\4\1\0\3\4\4\0\2\4\1\0\37\4" + + "\4\0\7\4\1\0\12\4\1\u0301\4\4\11\0\3\4" + + "\2\0\3\4\2\0\2\4\1\0\1\4\1\0\3\4" + + "\4\0\2\4\1\0\37\4\4\0\7\4\1\0\16\4" + + "\1\u0302\11\0\3\4\2\0\3\4\2\0\2\4\1\0" + + "\1\4\1\0\3\4\4\0\2\4\1\0\37\4\17\0" + + "\1\u02b1\132\0\1\u0303\132\0\1\u0303\142\0\1\u0304\124\0" + + "\1\u02b1\137\0\1\u0305\143\0\1\u0306\106\0\1\4\6\6" + + "\1\0\7\6\1\u0307\7\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\14\6\1\u0308\2\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\1\6\1\u0309" + + "\1\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\1\6\1\u030a\15\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\14\6\1\u01c5\2\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\1\u030b\5\6\1\151\10\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\14\6\1\u0232\2\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\1\6\1\u030c\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\17\6\1\u0199\17\6\4\0\1\4\5\6" + + "\1\u030d\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\14\6\1\u030e\22\6\4\0\1\4\5\6\1\u030f" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\13\6\1\u0310\23\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\14\6\1\u0245\22\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\1\u0311\1\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\15\6" + + "\1\u0312\21\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\1\6\1\u0313\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\1\6\1\326\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\10\6\1\u0314\26\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\3\6\1\u0315\33\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\20\6\1\151\16\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\4\6\1\u0199\32\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\13\6\1\302\23\6" + + "\4\0\1\4\5\6\1\u0316\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\3\6\1\u0317\2\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\1\u02cc\1\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\36\6" + + "\1\151\4\0\1\4\5\6\1\u02e3\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\1\6\1\u02e8\15\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\5\6\1\u0318\31\6" + + "\4\0\1\4\3\6\1\u0319\2\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\3\6" + + "\1\151\33\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\2\6" + + "\1\u031a\34\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6" + + "\1\u01c4\35\6\4\0\1\4\5\6\1\u031b\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\u031c" + + "\35\6\4\0\1\4\5\6\1\u031d\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\10\6\1\u02db\26\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\15\6\1\u031e\21\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\1\6\1\u0263\35\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\15\6\1\u031f\21\6" + + "\36\0\1\u0277\133\0\1\u027a\101\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\11\6\1\u0320\7\6\1\u0321\1\u0322\14\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\1\6\1\u0323\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\151\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\2\6\1\u0324\34\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\11\6\1\u0320\7\6\1\u0321\1\u0322\1\6\1\u0325" + + "\12\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\u010e" + + "\23\6\4\0\1\4\6\6\1\0\5\6\1\u0326\11\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\2\6\1\151\14\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\16\6\1\u0327\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\u0328" + + "\11\6\1\u0329\10\6\1\u032a\13\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\1\6\1\u032b" + + "\1\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\4\6\1\u0116\12\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\6\6" + + "\1\0\16\6\1\u0327\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\12\6\1\u0329\10\6\1\u032a\13\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\33\6\1\u013e\3\6" + + "\4\0\1\4\6\6\1\0\13\6\1\u013e\3\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\2\6\1\u0153\14\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\10\6\1\u0234\6\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\11\6\1\u032c\5\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\1\6\1\u032d\1\0\37\6\4\0" + + "\1\4\6\6\1\0\1\6\1\u0153\15\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\10\6\1\u032e\6\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\4\6\1\u011e\12\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\1\6\1\u032f\1\0\37\6\4\0\1\4" + + "\6\6\1\0\15\6\1\151\1\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\14\6\1\163\2\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\6\1\u0330\15\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\3\6\1\u0331\13\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\7\6\1\u0332\7\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\7\6\1\u0333\7\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\5\6\1\u0266\31\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\32\6\1\u0199\4\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\20\6\1\u0199\16\6\4\0\7\4" + + "\1\0\1\u0220\16\4\11\0\3\4\2\0\3\4\2\0" + + "\2\4\1\0\1\4\1\0\3\4\4\0\2\4\1\0" + + "\37\4\4\0\7\4\1\0\14\4\1\u02ac\2\4\11\0" + + "\3\4\2\0\3\4\2\0\2\4\1\0\1\4\1\0" + + "\3\4\4\0\2\4\1\0\37\4\23\0\1\u0303\136\0" + + "\1\u0334\137\0\1\u0335\105\0\1\4\6\6\1\0\11\6" + + "\1\u0336\5\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\12\6\1\u0124\24\6\4\0\1\4\6\6\1\0\5\6" + + "\1\u013e\11\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\15\6" + + "\1\u0124\1\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\14\6" + + "\1\u0337\2\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\1\6" + + "\1\u0338\15\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\10\6\1\u0339\26\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\15\6\1\u033a\21\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\4\6\1\u033b\32\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\17\6\1\151\17\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\13\6\1\u0163\23\6\4\0\1\4\5\6\1\u033c\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\1\6" + + "\1\255\35\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\4\6" + + "\1\u033d\32\6\4\0\1\4\5\6\1\u01c1\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u033e" + + "\21\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\5\6\1\u033f" + + "\31\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\u01c1\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\1\6\1\u0340\35\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\1\6\1\u0199\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\17\6\1\u0162\17\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\11\6\1\u0162\25\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\10\6\1\u0341\26\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\14\6\1\u0342\22\6\4\0\1\4" + + "\5\6\1\u0343\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\37\6\4\0\1\4\5\6" + + "\1\326\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\5\6\1\u0344\31\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\1\u0345" + + "\1\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\15\6\1\u0346\21\6\4\0\1\4\3\6\1\u0347\2\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\5\6\1\u0348\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\1\6\1\u0349\1\0" + + "\37\6\4\0\1\4\6\6\1\0\10\6\1\u034a\6\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\6\1\u034b\15\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\6\1\210\15\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\12\6\1\u034c\4\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\1\u034d\16\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\3\6\1\u034e\13\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\1\u0119\36\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\1\u034f\36\6\4\0\1\4" + + "\6\6\1\0\4\6\1\u034d\12\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\10\6\1\u0119\6\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\1\u0350\5\6\1\0\1\u0351\16\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\14\6\1\u02a4\2\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\14\0\1\u02b2" + + "\147\0\1\u0303\107\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\1\u020b\1\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\1\6\1\u0352\1\0\37\6" + + "\4\0\1\4\6\6\1\0\1\u0353\16\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\1\6\1\u02db\35\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\14\6\1\u0354\22\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\13\6\1\u0347\23\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\6\6\1\u023d\30\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\24\6\1\u0355\12\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\24\6\1\u0110\12\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\15\6\1\u0356\21\6\4\0" + + "\1\4\3\6\1\u0357\2\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\34\6\1\u0358" + + "\2\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\5\6\1\u0110" + + "\31\6\4\0\1\4\3\6\1\u0359\2\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\13\6\1\u0283" + + "\23\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\u035a" + + "\35\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\151" + + "\35\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\1\6\1\u0271" + + "\35\6\4\0\1\4\5\6\1\u035b\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\14\6\1\151\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\4\6\1\u028d\12\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\1\6\1\u035c\15\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\14\6\1\u035d\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\14\6\1\u0211\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\6\6\1\u013e\10\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\1\6\1\u035e\15\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\10\6\1\u035f\6\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\1\6\1\u0360\15\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\14\6\1\u0361\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\14\6\1\u0362\2\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\3\6\1\u0199\33\6" + + "\4\0\1\4\5\6\1\u0363\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\17\6\11\0\1\4\2\6\2\0" + + "\3\6\2\0\2\6\1\0\1\6\1\0\1\4\1\6" + + "\1\4\4\0\2\6\1\0\1\6\1\u0364\35\6\4\0" + + "\1\4\5\6\1\u0365\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\5\6\1\u0366\31\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\1\6\1\u0367\35\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\10\6\1\u0368\26\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\25\6\1\151\11\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\26\6\1\151\10\6\4\0\1\4" + + "\6\6\1\0\7\6\1\u0369\7\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\1\6\1\u0119\15\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\1\6" + + "\1\u036a\1\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\13\6\1\u036b\3\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\2\6\1\u036c\3\6\1\151\10\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\1\222\2\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\5\6\1\u0110\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\u036d\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\3\6\1\151\33\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\20\6\1\u036e\16\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\2\6\1\u036f\34\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\16\6\1\310\20\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\15\6\1\u0162\21\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\1\6\1\u0124\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\1\6\1\u0370\1\0\37\6\4\0\1\4\6\6\1\0" + + "\14\6\1\u0371\2\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\3\6\1\u0372\13\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\14\6\1\u0373\22\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\1\6\1\u0374\35\6\4\0\1\4\6\6\1\0" + + "\17\6\11\0\1\4\2\6\2\0\3\6\2\0\2\6" + + "\1\0\1\6\1\0\1\4\1\6\1\4\4\0\2\6" + + "\1\0\15\6\1\u0375\21\6\4\0\1\4\6\6\1\0" + + "\3\6\1\u0376\13\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\7\6\1\u0377\7\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\6\6\1\0" + + "\1\6\1\u011a\15\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\37\6\4\0\1\4\5\6\1\u0167" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\37\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\10\6\1\u0378\26\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\14\6\1\u0379\22\6\4\0\1\4\6\6\1\0\17\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\1\6\1\u037a" + + "\1\0\37\6\4\0\1\4\6\6\1\0\17\6\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\1\6\1\u037b\1\0" + + "\37\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u037c" + + "\21\6\4\0\1\4\6\6\1\0\17\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\15\6\1\u037d" + + "\21\6\4\0\1\4\6\6\1\0\5\6\1\u0287\11\6" + + "\11\0\1\4\2\6\2\0\3\6\2\0\2\6\1\0" + + "\1\6\1\0\1\4\1\6\1\4\4\0\2\6\1\0" + + "\37\6\4\0\1\4\6\6\1\0\16\6\1\u037e\11\0" + + "\1\4\2\6\2\0\3\6\2\0\2\6\1\0\1\6" + + "\1\0\1\4\1\6\1\4\4\0\2\6\1\0\37\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\21\6\1\u037f\15\6" + + "\4\0\1\4\6\6\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\1\6\1\u027c\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\6\6\1\0\1\6\1\u0380\15\6\11\0\1\4" + + "\2\6\2\0\3\6\2\0\2\6\1\0\1\6\1\0" + + "\1\4\1\6\1\4\4\0\2\6\1\0\37\6\4\0" + + "\1\4\5\6\1\u0381\1\0\17\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\4\6\1\u0382\12\6\11\0\1\4\2\6" + + "\2\0\3\6\2\0\2\6\1\0\1\6\1\0\1\4" + + "\1\6\1\4\4\0\2\6\1\0\37\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\2\6\1\0\13\6\1\u0383\23\6\4\0\1\4" + + "\6\6\1\0\17\6\11\0\1\4\2\6\2\0\3\6" + + "\2\0\2\6\1\0\1\6\1\0\1\4\1\6\1\4" + + "\4\0\1\6\1\223\1\0\37\6\4\0\1\4\6\6" + + "\1\0\17\6\11\0\1\4\2\6\2\0\3\6\2\0" + + "\2\6\1\0\1\6\1\0\1\4\1\6\1\4\4\0" + + "\2\6\1\0\15\6\1\302\21\6\4\0"; private static int [] zzUnpackTrans() { - int [] result = new int[79028]; + int[] result = new int[80132]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -2672,9 +2709,9 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { /* error messages for the codes above */ private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" }; /** @@ -2683,17 +2720,17 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\3\0\30\1\1\11\4\1\1\11\2\1\1\11\11\1"+ - "\1\11\1\1\1\11\33\1\1\11\5\1\1\11\110\1"+ - "\1\0\2\11\2\1\1\11\3\1\1\11\24\1\1\0"+ - "\77\1\2\0\1\11\6\0\2\1\1\0\117\1\1\11"+ - "\7\1\1\11\24\1\6\0\121\1\10\0\2\1\1\0"+ - "\115\1\4\0\1\1\4\0\104\1\2\0\1\1\2\0"+ - "\65\1\7\0\46\1\4\0\40\1\1\11\3\0\54\1"+ - "\2\0\116\1"; + "\3\0\30\1\1\11\4\1\1\11\2\1\1\11\11\1" + + "\1\11\1\1\1\11\33\1\1\11\5\1\1\11\110\1" + + "\1\0\2\11\2\1\1\11\3\1\1\11\24\1\1\0" + + "\77\1\2\0\1\11\6\0\2\1\1\0\120\1\1\11" + + "\7\1\1\11\24\1\6\0\122\1\10\0\2\1\1\0" + + "\120\1\4\0\1\1\4\0\107\1\2\0\1\1\2\0" + + "\66\1\7\0\47\1\4\0\41\1\1\11\3\0\55\1" + + "\2\0\116\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[887]; + int[] result = new int[899]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -2721,7 +2758,7 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { private int zzLexicalState = YYINITIAL; /** this buffer contains the current text to be matched and is - the source of the yytext() string */ + the source of the yytext() string */ private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; /** the textposition at the last accepting state */ @@ -2737,7 +2774,7 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { private int zzStartRead; /** endRead marks the last character in the buffer, that has been read - from input */ + from input */ private int zzEndRead; /** number of newlines encountered up to the start of the matched text */ @@ -2747,181 +2784,181 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { private int yychar; /** - * the number of characters from the last newline up to the start of the + * the number of characters from the last newline up to the start of the * matched text */ private int yycolumn; - /** + /** * zzAtBOL == true <=> the scanner is currently at the beginning of a line */ private boolean zzAtBOL = true; - /** zzAtEOF == true <=> the scanner is at the EOF */ + /** + * zzAtEOF == true <=> the scanner is at the EOF + */ private boolean zzAtEOF; /* user code: */ - /** - * Constructor. This must be here because JFlex does not generate a - * no-parameter constructor. - */ - public FormulaTokenMaker() { - super(); - } - - - /** - * Adds the token specified to the current linked list of tokens. - * - * @param tokenType The token's type. - * @see #addToken(int, int, int) - */ - private void addHyperlinkToken(int start, int end, int tokenType) { - int so = start + offsetShift; - addToken(zzBuffer, start,end, tokenType, so, true); - } - - - /** - * Adds the token specified to the current linked list of tokens. - * - * @param tokenType The token's type. - */ - private void addToken(int tokenType) { - addToken(zzStartRead, zzMarkedPos-1, tokenType); - } - - - /** - * Adds the token specified to the current linked list of tokens. - * - * @param tokenType The token's type. - */ - private void addToken(int start, int end, int tokenType) { - int so = start + offsetShift; - addToken(zzBuffer, start,end, tokenType, so); - } - - - /** - * Adds the token specified to the current linked list of tokens. - * - * @param array The character array. - * @param start The starting offset in the array. - * @param end The ending offset in the array. - * @param tokenType The token's type. - * @param startOffset The offset in the document at which this token - * occurs. - */ - @Override - public void addToken(char[] array, int start, int end, int tokenType, int startOffset) { - super.addToken(array, start,end, tokenType, startOffset); - zzStartRead = zzMarkedPos; - } - - - /** - * Returns the text to place at the beginning and end of a - * line to "comment" it in a this programming language. - * - * @return The start and end strings to add to a line to "comment" - * it out. - */ - @Override - public String[] getLineCommentStartAndEnd() { - return new String[] { "//", null }; - } - - - /** - * Returns the first token in the linked list of tokens generated - * from text. This method must be implemented by - * subclasses so they can correctly implement syntax highlighting. - * - * @param text The text from which to get tokens. - * @param initialTokenType The token type we should start with. - * @param startOffset The offset into the document at which - * text starts. - * @return The first Token in a linked list representing - * the syntax highlighted text. - */ - public Token getTokenList(Segment text, int initialTokenType, int startOffset) { - - resetTokenList(); - this.offsetShift = -text.offset + startOffset; - - // Start off in the proper state. - int state = Token.NULL; - switch (initialTokenType) { - case Token.COMMENT_MULTILINE: - state = MLC; - start = text.offset; - break; - default: - state = Token.NULL; - } - - s = text; - try { - yyreset(zzReader); - yybegin(state); - return yylex(); - } catch (IOException ioe) { - ioe.printStackTrace(); - return new TokenImpl(); - } - - } - - - /** - * Refills the input buffer. - * - * @return true if EOF was reached, otherwise - * false. - * @exception IOException if any I/O-Error occurs. - */ - private boolean zzRefill() throws java.io.IOException { - return zzCurrentPos>=s.offset+s.count; - } - - - /** - * Resets the scanner to read from a new input stream. - * Does not close the old reader. - * - * All internal variables are reset, the old input stream - * cannot be reused (internal buffer is discarded and lost). - * Lexical state is set to YY_INITIAL. - * - * @param reader the new input stream - */ - public final void yyreset(java.io.Reader reader) throws java.io.IOException { - // 's' has been updated. - zzBuffer = s.array; - /* - * We replaced the line below with the two below it because zzRefill - * no longer "refills" the buffer (since the way we do it, it's always - * "full" the first time through, since it points to the segment's - * array). So, we assign zzEndRead here. - */ - //zzStartRead = zzEndRead = s.offset; - zzStartRead = s.offset; - zzEndRead = zzStartRead + s.count - 1; - zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset; - zzLexicalState = YYINITIAL; - zzReader = reader; - zzAtBOL = true; - zzAtEOF = false; - } - - public final String test() { - return "abs|ABS|COUNT|count"; - } + /** + * Constructor. This must be here because JFlex does not generate a + * no-parameter constructor. + */ + public FormulaTokenMaker() { + super(); + } + + /** + * Adds the token specified to the current linked list of tokens. + * + * @param tokenType The token's type. + * @see #addToken(int, int, int) + */ + private void addHyperlinkToken(int start, int end, int tokenType) { + int so = start + offsetShift; + addToken(zzBuffer, start, end, tokenType, so, true); + } + /** + * Adds the token specified to the current linked list of tokens. + * + * @param tokenType The token's type. + */ + private void addToken(int tokenType) { + addToken(zzStartRead, zzMarkedPos - 1, tokenType); + } + + + /** + * Adds the token specified to the current linked list of tokens. + * + * @param tokenType The token's type. + */ + private void addToken(int start, int end, int tokenType) { + int so = start + offsetShift; + addToken(zzBuffer, start, end, tokenType, so); + } + + + /** + * Adds the token specified to the current linked list of tokens. + * + * @param array The character array. + * @param start The starting offset in the array. + * @param end The ending offset in the array. + * @param tokenType The token's type. + * @param startOffset The offset in the document at which this token + * occurs. + */ + @Override + public void addToken(char[] array, int start, int end, int tokenType, int startOffset) { + super.addToken(array, start, end, tokenType, startOffset); + zzStartRead = zzMarkedPos; + } + + + /** + * Returns the text to place at the beginning and end of a + * line to "comment" it in a this programming language. + * + * @return The start and end strings to add to a line to "comment" + * it out. + */ + @Override + public String[] getLineCommentStartAndEnd() { + return new String[]{"//", null}; + } + + + /** + * Returns the first token in the linked list of tokens generated + * from text. This method must be implemented by + * subclasses so they can correctly implement syntax highlighting. + * + * @param text The text from which to get tokens. + * @param initialTokenType The token type we should start with. + * @param startOffset The offset into the document at which + * text starts. + * @return The first Token in a linked list representing + * the syntax highlighted text. + */ + public Token getTokenList(Segment text, int initialTokenType, int startOffset) { + + resetTokenList(); + this.offsetShift = -text.offset + startOffset; + + // Start off in the proper state. + int state = Token.NULL; + switch (initialTokenType) { + case Token.COMMENT_MULTILINE: + state = MLC; + start = text.offset; + break; + default: + state = Token.NULL; + } + + s = text; + try { + yyreset(zzReader); + yybegin(state); + return yylex(); + } catch (IOException ioe) { + ioe.printStackTrace(); + return new TokenImpl(); + } + + } + + + /** + * Refills the input buffer. + * + * @return true if EOF was reached, otherwise + * false. + * @throws IOException if any I/O-Error occurs. + */ + private boolean zzRefill() throws java.io.IOException { + return zzCurrentPos >= s.offset + s.count; + } + + + /** + * Resets the scanner to read from a new input stream. + * Does not close the old reader. + *

+ * All internal variables are reset, the old input stream + * cannot be reused (internal buffer is discarded and lost). + * Lexical state is set to YY_INITIAL. + * + * @param reader the new input stream + */ + public final void yyreset(java.io.Reader reader) throws java.io.IOException { + // 's' has been updated. + zzBuffer = s.array; + /* + * We replaced the line below with the two below it because zzRefill + * no longer "refills" the buffer (since the way we do it, it's always + * "full" the first time through, since it points to the segment's + * array). So, we assign zzEndRead here. + */ + //zzStartRead = zzEndRead = s.offset; + zzStartRead = s.offset; + zzEndRead = zzStartRead + s.count - 1; + zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset; + zzLexicalState = YYINITIAL; + zzReader = reader; + zzAtBOL = true; + zzAtEOF = false; + } + + public final String test() { + return "abs|ABS|COUNT|count"; + } + /** * Creates a new scanner @@ -2943,7 +2980,7 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { this(new java.io.InputStreamReader(in)); } - /** + /** * Unpacks the compressed character translation table. * * @param packed the packed character translation table @@ -2962,7 +2999,6 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { } - /** * Closes the input stream. */ @@ -2976,6 +3012,7 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { + /** * Returns the current lexical state. */ @@ -2998,17 +3035,17 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { * Returns the text matched by the current regular expression. */ public final String yytext() { - return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); + return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead); } /** - * Returns the character at position pos from the - * matched text. - * + * Returns the character at position pos from the + * matched text. + * * It is equivalent to yytext().charAt(pos), but faster * - * @param pos the position of the character to fetch. + * @param pos the position of the character to fetch. * A value from 0 to yylength()-1. * * @return the character at position pos @@ -3022,15 +3059,15 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { * Returns the length of the matched text region. */ public final int yylength() { - return zzMarkedPos-zzStartRead; + return zzMarkedPos - zzStartRead; } /** * Reports an error that occured while scanning. * - * In a wellformed scanner (no or only correct usage of - * yypushback(int) and a match-all fallback rule) this method + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method * will only be called with things that "Can't Possibly Happen". * If this method is called, something is seriously wrong * (e.g. a JFlex bug producing a faulty scanner etc.). @@ -3050,7 +3087,7 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { } throw new Error(message); - } + } /** @@ -3097,13 +3134,13 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { zzAction = -1; zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - + zzState = zzLexicalState; zzForAction: { while (true) { - + if (zzCurrentPosL < zzEndReadL) zzInput = zzBufferL[zzCurrentPosL++]; else if (zzAtEOF) { @@ -3146,134 +3183,184 @@ public class FormulaTokenMaker extends AbstractJFlexCTokenMaker { zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 25: - { addToken(Token.PREPROCESSOR); - } - case 28: break; - case 7: - { addNullToken(); return firstToken; - } - case 29: break; - case 22: - { addToken(Token.LITERAL_CHAR); - } - case 30: break; - case 21: - { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); - } - case 31: break; - case 17: - { start = zzMarkedPos-2; yybegin(MLC); - } - case 32: break; - case 9: - { addToken(Token.WHITESPACE); - } - case 33: break; - case 24: - { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); - } - case 34: break; - case 18: - { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ - } - case 35: break; - case 23: - { addToken(Token.ERROR_STRING_DOUBLE); - } - case 36: break; - case 14: - { addToken(Token.LITERAL_NUMBER_FLOAT); - } - case 37: break; - case 15: - { addToken(Token.RESERVED_WORD); - } - case 38: break; - case 5: - { addToken(Token.SEPARATOR); - } - case 39: break; - case 2: - { addToken(Token.IDENTIFIER); - } - case 40: break; - case 12: - { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; - } - case 41: break; - case 16: - { start = zzMarkedPos-2; yybegin(EOL_COMMENT); - } - case 42: break; - case 6: - { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; - } - case 43: break; - case 8: - { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; - } - case 44: break; - case 1: - { addToken(Token.ERROR_IDENTIFIER); - } - case 45: break; - case 19: - { addToken(Token.ERROR_CHAR); - } - case 46: break; - case 20: - { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); - } - case 47: break; - case 27: - { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; - } - case 48: break; - case 26: - { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_MULTILINE); start = zzMarkedPos; - } - case 49: break; - case 13: - { addToken(Token.ERROR_NUMBER_FORMAT); - } - case 50: break; - case 3: - { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); - } - case 51: break; - case 4: - { addToken(Token.OPERATOR); - } - case 52: break; - case 10: - { - } - case 53: break; - case 11: - { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; - } - case 54: break; - default: + case 25: { + addToken(Token.PREPROCESSOR); + } + case 28: + break; + case 7: { + addNullToken(); + return firstToken; + } + case 29: + break; + case 22: { + addToken(Token.LITERAL_CHAR); + } + case 30: + break; + case 21: { + yybegin(YYINITIAL); + addToken(start, zzStartRead + 1, Token.COMMENT_MULTILINE); + } + case 31: + break; + case 17: { + start = zzMarkedPos - 2; + yybegin(MLC); + } + case 32: + break; + case 9: { + addToken(Token.WHITESPACE); + } + case 33: + break; + case 24: { + addToken(Token.LITERAL_NUMBER_HEXADECIMAL); + } + case 34: + break; + case 18: { + addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ + } + case 35: + break; + case 23: { + addToken(Token.ERROR_STRING_DOUBLE); + } + case 36: + break; + case 14: { + addToken(Token.LITERAL_NUMBER_FLOAT); + } + case 37: + break; + case 15: { + addToken(Token.RESERVED_WORD); + } + case 38: + break; + case 5: { + addToken(Token.SEPARATOR); + } + case 39: + break; + case 2: { + addToken(Token.IDENTIFIER); + } + case 40: + break; + case 12: { + addToken(start, zzStartRead - 1, Token.COMMENT_EOL); + addNullToken(); + return firstToken; + } + case 41: + break; + case 16: { + start = zzMarkedPos - 2; + yybegin(EOL_COMMENT); + } + case 42: + break; + case 6: { + addToken(Token.ERROR_CHAR); + addNullToken(); + return firstToken; + } + case 43: + break; + case 8: { + addToken(Token.ERROR_STRING_DOUBLE); + addNullToken(); + return firstToken; + } + case 44: + break; + case 1: { + addToken(Token.ERROR_IDENTIFIER); + } + case 45: + break; + case 19: { + addToken(Token.ERROR_CHAR); + } + case 46: + break; + case 20: { + addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); + } + case 47: + break; + case 27: { + int temp = zzStartRead; + addToken(start, zzStartRead - 1, Token.COMMENT_EOL); + addHyperlinkToken(temp, zzMarkedPos - 1, Token.COMMENT_EOL); + start = zzMarkedPos; + } + case 48: + break; + case 26: { + int temp = zzStartRead; + addToken(start, zzStartRead - 1, Token.COMMENT_MULTILINE); + addHyperlinkToken(temp, zzMarkedPos - 1, Token.COMMENT_MULTILINE); + start = zzMarkedPos; + } + case 49: + break; + case 13: { + addToken(Token.ERROR_NUMBER_FORMAT); + } + case 50: + break; + case 3: { + addToken(Token.LITERAL_NUMBER_DECIMAL_INT); + } + case 51: + break; + case 4: { + addToken(Token.OPERATOR); + } + case 52: + break; + case 10: { + } + case 53: + break; + case 11: { + addToken(start, zzStartRead - 1, Token.COMMENT_MULTILINE); + return firstToken; + } + case 54: + break; + default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; switch (zzLexicalState) { - case EOL_COMMENT: { - addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; + case EOL_COMMENT: { + addToken(start, zzStartRead - 1, Token.COMMENT_EOL); + addNullToken(); + return firstToken; + } + case 900: + break; + case YYINITIAL: { + addNullToken(); + return firstToken; + } + case 901: + break; + case MLC: { + addToken(start, zzStartRead - 1, Token.COMMENT_MULTILINE); + return firstToken; + } + case 902: + break; + default: + return null; } - case 888: break; - case YYINITIAL: { - addNullToken(); return firstToken; - } - case 889: break; - case MLC: { - addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; - } - case 890: break; - default: - return null; - } - } + } else { zzScanError(ZZ_NO_MATCH); } diff --git a/designer-base/src/main/java/com/fr/design/login/socketio/LoginAuthServer.java b/designer-base/src/main/java/com/fr/design/login/socketio/LoginAuthServer.java index d60b97d0f6..0340fc3de3 100644 --- a/designer-base/src/main/java/com/fr/design/login/socketio/LoginAuthServer.java +++ b/designer-base/src/main/java/com/fr/design/login/socketio/LoginAuthServer.java @@ -1,5 +1,6 @@ package com.fr.design.login.socketio; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.DesignerEnvManager; import com.fr.design.login.DesignerLoginType; import com.fr.design.login.bean.BBSAccountLogin; @@ -11,7 +12,11 @@ import com.fr.third.socketio.Configuration; import com.fr.third.socketio.SocketIOClient; import com.fr.third.socketio.SocketIOServer; import com.fr.third.socketio.listener.DataListener; + import java.net.URLDecoder; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; /** * @author Lanlan @@ -19,9 +24,11 @@ import java.net.URLDecoder; * Created by Lanlan on 2021/6/3 */ public class LoginAuthServer { + + private AtomicBoolean started = new AtomicBoolean(false); private SocketIOServer server; - + private static final String HOSTNAME = "localhost"; private static final int PORT = 41925; @@ -47,6 +54,23 @@ public class LoginAuthServer { } public void start() { + + // 只运行一次,不在乎成不成功 + if (started.compareAndSet(false, true)) { + asyncStart(); + } + } + + public void asyncStart() { + + ExecutorService asyncService = Executors.newSingleThreadExecutor(new NamedThreadFactory(LoginAuthServer.class.getName(), true)); + asyncService.submit(this::compatibleStart); + asyncService.shutdown(); + } + + @Deprecated + public void compatibleStart() { + try { server.start(); } catch (Exception e) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/BaseJForm.java b/designer-base/src/main/java/com/fr/design/mainframe/BaseJForm.java index d3cff1ff95..dc36836c16 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/BaseJForm.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/BaseJForm.java @@ -10,7 +10,7 @@ import javax.swing.JComponent; * Date: 13-7-15 * Time: 上午10:28 */ -public interface BaseJForm extends JTemplateProvider { +public interface BaseJForm extends JTemplateProvider, JDashboard { String XML_TAG = "JForm"; int FORM_TAB = 0; @@ -58,4 +58,9 @@ public interface BaseJForm extends JTemplateProvider { * @param ecContainer ElementCase所在container */ void tabChanged(int index, FormElementCaseContainerProvider ecContainer); + + @Override + default void switchToDashBoardEditor() { + tabChanged(FORM_TAB); + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java index d31b5ede09..20c8c580a2 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java @@ -220,7 +220,7 @@ public class CenterRegionContainerPane extends JPanel { * * @param plus 工具条中相关信息 */ - protected void resetToolkitByPlus(ToolBarMenuDockPlus plus, ToolBarMenuDock ad) { + protected void resetToolkitByPlus(ToolBarMenuDockPlus plus, ToolBarMenuDock ad, ToolKitConfigStrategy strategy) { resetCombineUpTooBar(ad.resetUpToolBar(plus), plus); @@ -230,28 +230,40 @@ public class CenterRegionContainerPane extends JPanel { // 颜色,字体那些按钮的工具栏 toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER); - - if (plus.hasToolBarPane()) { + if (strategy.hasToolBarPane(plus)) { this.add(toolbarPane, BorderLayout.NORTH); } else { this.remove(toolbarPane); } + if (strategy.hasTemplateTabPane(plus)) { + eastCenterPane.add(templateTabPane, BorderLayout.CENTER); + } else { + eastCenterPane.remove(templateTabPane); + } + + if (strategy.hasCombineUp(plus)) { + eastCenterPane.add(combineUp, BorderLayout.NORTH); + } else { + eastCenterPane.remove(combineUp); + } resetByDesignMode(); } private void resetByDesignMode() { if (DesignModeContext.isDuchampMode()) { eastPane.remove(largeToolbar); - eastCenterPane.remove(templateTabPane); - centerTemplateCardPane.refresh(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); + //移除新建模板按钮 + templateTabPane.remove(newWorkBookPane); } else { eastPane.add(largeToolbar, BorderLayout.WEST); - eastCenterPane.add(templateTabPane, BorderLayout.CENTER); - } + templateTabPane.add(newWorkBookPane, BorderLayout.WEST); + } } + + JComponent getToolbarComponent() { return this.toolbarComponent; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DefaultToolKitConfig.java b/designer-base/src/main/java/com/fr/design/mainframe/DefaultToolKitConfig.java new file mode 100644 index 0000000000..305c44aa21 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/DefaultToolKitConfig.java @@ -0,0 +1,21 @@ +package com.fr.design.mainframe; + +import com.fr.design.base.mode.DesignModeContext; +import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; + +public class DefaultToolKitConfig implements ToolKitConfigStrategy { + @Override + public boolean hasTemplateTabPane(ToolBarMenuDockPlus plus) { + return !DesignModeContext.isDuchampMode(); + } + + @Override + public boolean hasCombineUp(ToolBarMenuDockPlus plus) { + return plus.hasToolBarPane(); + } + + @Override + public boolean hasToolBarPane(ToolBarMenuDockPlus plus) { + return plus.hasToolBarPane(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index 2534de5266..e2d4609439 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -4,6 +4,7 @@ package com.fr.design.mainframe; import com.fr.base.BaseUtils; +import com.fr.base.OptimizeUtil; import com.fr.design.DesignModelAdapter; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; @@ -42,6 +43,7 @@ import com.fr.design.lock.LockInfoDialog; import com.fr.event.EventDispatcher; import com.fr.exception.DecryptTemplateException; import com.fr.exception.TplLockedException; +import com.fr.exit.ConfigToPropMigrator; import com.fr.exit.DesignerExiter; import com.fr.file.FILE; import com.fr.file.FILEFactory; @@ -614,6 +616,10 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * @param plus 工具条中相关信息 */ public void resetToolkitByPlus(ToolBarMenuDockPlus plus) { + resetToolkitByPlus(plus, new DefaultToolKitConfig()); + } + + public void resetToolkitByPlus(ToolBarMenuDockPlus plus, ToolKitConfigStrategy strategy) { if (plus == null) { plus = ToolBarMenuDock.NULLAVOID; @@ -621,7 +627,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta NorthRegionContainerPane.getInstance().resetToolkitByPlus(plus, ad); - CenterRegionContainerPane.getInstance().resetToolkitByPlus(plus, ad); + CenterRegionContainerPane.getInstance().resetToolkitByPlus(plus, ad, strategy); this.checkToolbarMenuEnable(); this.validate(); @@ -1071,6 +1077,10 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta DesignerEnvManager.getEnvManager().setLastEastRegionContainerWidth( EastRegionContainerPane.getInstance().getContainerWidth()); + OptimizeUtil.open(() -> { + ConfigToPropMigrator.getInstance().execute(); + }); + DesignerEnvManager.getEnvManager().saveXMLFile(); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 2b7a321a82..ab30582dd4 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -11,6 +11,7 @@ import com.fr.design.actions.UpdateAction; import com.fr.design.constants.UIConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataTreePane; +import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager; import com.fr.design.data.tabledata.ResponseDataSourceChange; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.FileOperations; @@ -244,6 +245,9 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt DesignModelAdapter.setCurrentModelAdapter(jt.getModel()); fireDSChanged(); + if (TableDataTreeSearchManager.getInstance().isInSearchMode()) { + TableDataTreeSearchManager.getInstance().outOfSearchMode(); + } TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); HistoryTemplateListPane.getInstance().setCurrentEditingTemplate(jt); //处理自动新建的模板 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JDashboard.java b/designer-base/src/main/java/com/fr/design/mainframe/JDashboard.java new file mode 100644 index 0000000000..d2b45f4ea1 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/JDashboard.java @@ -0,0 +1,10 @@ +package com.fr.design.mainframe; + +/** + * @author Starryi + * @version 1.0 + * Created by Starryi on 2022/3/1 + */ +public interface JDashboard { + void switchToDashBoardEditor(); +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/ToolKitConfigStrategy.java b/designer-base/src/main/java/com/fr/design/mainframe/ToolKitConfigStrategy.java new file mode 100644 index 0000000000..67b1409b36 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/ToolKitConfigStrategy.java @@ -0,0 +1,27 @@ +package com.fr.design.mainframe; + +import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; + +public interface ToolKitConfigStrategy { + + /** + * 展示tabpane + * @param plus + * @return + */ + boolean hasTemplateTabPane(ToolBarMenuDockPlus plus); + + /** + * 展示模板操作按钮(复制、粘贴、保存等) + * @param plus + * @return + */ + boolean hasCombineUp(ToolBarMenuDockPlus plus); + + /** + * 展示工具栏pane + * @param plus + * @return + */ + boolean hasToolBarPane(ToolBarMenuDockPlus plus); +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTreeModelEditor.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTreeModelEditor.java index 5ce099c91f..5b04ef0143 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTreeModelEditor.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleTreeModelEditor.java @@ -23,7 +23,7 @@ public class AccessibleTreeModelEditor extends UneditableAccessibleEditor { @Override protected void showEditorPane() { if (treeSettingPane == null) { - treeSettingPane = new TreeSettingPane(false); + treeSettingPane = new TreeSettingPane(); } BasicDialog dlg = treeSettingPane.showWindow(SwingUtilities.getWindowAncestor(this)); treeSettingPane.populate(getValue()); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java b/designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java index 8a2489407c..00171f3fb0 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java @@ -6,8 +6,7 @@ import com.fr.data.impl.TreeNodeWrapper; import com.fr.design.Exception.ValidationException; import com.fr.design.designer.properties.Decoder; import com.fr.design.designer.properties.Encoder; - -import com.fr.general.NameObject; +import com.fr.form.ui.tree.LayerConfig; import com.fr.stable.StringUtils; public class TreeModelWrapper implements Encoder, Decoder { @@ -22,7 +21,7 @@ public class TreeModelWrapper implements Encoder, Decoder { } else if (v instanceof TreeNodeWrapper) { TreeNodeAttr[] treeNodeAttrs = ((TreeNodeWrapper) v).getTreeNodeAttrs(); return TemplateUtils.render(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Total_N_Grade"), new String[]{"N"}, new String[]{treeNodeAttrs.length + ""}); - } else if (v instanceof NameObject) { + } else if (v instanceof LayerConfig[]) { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DataTable_Build"); } else { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Auto_Build"); diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzer.java b/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzer.java new file mode 100644 index 0000000000..2397f05487 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzer.java @@ -0,0 +1,45 @@ +package com.fr.design.record.analyzer; + +import com.fr.design.record.analyzer.advice.TimeAdvice; +import com.fr.design.record.analyzer.advice.TrackAdvice; +import com.fr.record.analyzer.AnalyzerConfiguration; +import com.fr.record.analyzer.AnalyzerUnit; +import com.fr.record.analyzer.Assistant; +import com.fr.record.analyzer.Metrics; +import com.fr.record.analyzer.Track; +import com.fr.record.analyzer.configuration.AnalyzerAssemblyFactory; +import com.fr.stable.ArrayUtils; +import com.fr.third.net.bytebuddy.asm.Advice; +import com.fr.third.net.bytebuddy.description.type.TypeDescription; +import com.fr.third.net.bytebuddy.dynamic.DynamicType; +import com.fr.third.net.bytebuddy.matcher.ElementMatchers; +import com.fr.third.net.bytebuddy.utility.JavaModule; + +/** + * created by Harrison on 2022/03/08 + **/ +public class DesignerAnalyzer { + + private static final AnalyzerUnit ANALYZER = new AnalyzerUnit(); + + public static synchronized void init(AnalyzerAssemblyFactory factory, AnalyzerConfiguration... configurations) { + + AnalyzerAssemblyFactory redefineFactory = factory.prepare(DesignerAssemblyFactory.getInstance()); + + AnalyzerConfiguration defaultConfiguration = AnalyzerConfiguration.create(new Assistant() { + @Override + public DynamicType.Builder supply(DynamicType.Builder builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) { + return builder + .visit(Advice.to(TimeAdvice.class).on(ElementMatchers.isAnnotatedWith(Metrics.class))) + .visit(Advice.to(TrackAdvice.class).on(ElementMatchers.isAnnotatedWith(Track.class))); + } + }); + AnalyzerConfiguration[] allConfigurations = ArrayUtils.add(configurations, defaultConfiguration); + + // 准备监听 + ANALYZER.setAgentListener(new DesignerAnalyzerListener()); + + ANALYZER.init(redefineFactory, allConfigurations); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzerActivator.java b/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzerActivator.java new file mode 100644 index 0000000000..0a83d81c20 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzerActivator.java @@ -0,0 +1,131 @@ +package com.fr.design.record.analyzer; + +import com.fr.base.OptimizeUtil; +import com.fr.concurrent.NamedThreadFactory; +import com.fr.design.constants.DesignerLaunchStatus; +import com.fr.design.record.analyzer.advice.DBMonitorAdvice; +import com.fr.design.record.analyzer.advice.FaultToleranceAdvice; +import com.fr.design.record.analyzer.advice.FocusAdvice; +import com.fr.design.record.analyzer.advice.MonitorAdvice; +import com.fr.design.record.analyzer.advice.PerformancePointAdvice; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.event.Null; +import com.fr.intelli.metrics.Compute; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.PerformancePoint; +import com.fr.module.Activator; +import com.fr.module.extension.Prepare; +import com.fr.record.analyzer.AnalyzerConfiguration; +import com.fr.record.analyzer.AnalyzerKey; +import com.fr.record.analyzer.DBMetrics; +import com.fr.record.analyzer.FineAnalyzer; +import com.fr.record.analyzer.advice.AnalyzerAdviceKey; +import com.fr.record.analyzer.advice.FineAdviceAssistant; +import com.fr.record.analyzer.configuration.AnalyzerAssemblyFactory; +import com.fr.record.analyzer.configuration.FineAnalyzerAssemblyFactory; +import com.fr.stable.collections.CollectionUtils; +import com.fr.third.net.bytebuddy.matcher.ElementMatchers; +import com.fr.tolerance.FaultTolerance; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.concurrent.ExecutorService; + +/** + * created by Harrison on 2022/03/04 + **/ +public class DesignerAnalyzerActivator extends Activator implements Prepare { + + @Override + public void start() { + + OptimizeUtil.open(() -> { + + AnalyzerAssemblyFactory basicFactory = createBasicFactory(); + + // 兼容逻辑 + List backwardsConfigurations = findMutableBackwards(AnalyzerKey.KEY); + if (!CollectionUtils.isEmpty(backwardsConfigurations)) { + // 直接初始化,不添加默认值,防止和下面的冲突 + FineAnalyzer.initDirectly(basicFactory, backwardsConfigurations.toArray(new AnalyzerConfiguration[0])); + } + + // 等页面完全打开后,再进行 retransform, 别影响了启动速度 + EventDispatcher.listen(DesignerLaunchStatus.STARTUP_COMPLETE, new Listener() { + + @Override + public void on(Event event, Null param) { + + ExecutorService es = newSingleThreadExecutor(new NamedThreadFactory("designer-analyzer", true)); + try { + // 加入 retransform 部分的逻辑 + List adviceConfigurations = findMutable(AnalyzerAdviceKey.KEY); + + if (!CollectionUtils.isEmpty(adviceConfigurations)) { + AnalyzerConfiguration[] configurations = convertConfigurations(adviceConfigurations); + es.submit(() -> { + DesignerAnalyzer.init(basicFactory, configurations); + }); + } + } finally { + es.shutdown(); + } + } + }); + }); + } + + @NotNull + private AnalyzerConfiguration[] convertConfigurations(List list) { + + return list.stream() + .map(AnalyzerConfiguration::create) + .toArray(AnalyzerConfiguration[]::new); + } + + @Override + public void stop() { + + } + + @Override + public void prepare() { + + addMutable(AnalyzerAdviceKey.KEY, FineAdviceAssistant.create( + ElementMatchers.isAnnotatedWith(Focus.class), + FocusAdvice.class + )); + + addMutable(AnalyzerAdviceKey.KEY, FineAdviceAssistant.create( + ElementMatchers.isAnnotatedWith(Compute.class), + MonitorAdvice.class + )); + + addMutable(AnalyzerAdviceKey.KEY, FineAdviceAssistant.create( + ElementMatchers.isAnnotatedWith(DBMetrics.class), + DBMonitorAdvice.class + )); + + addMutable(AnalyzerAdviceKey.KEY, FineAdviceAssistant.create( + ElementMatchers.isAnnotatedWith(PerformancePoint.class), + PerformancePointAdvice.class + )); + + addMutable(AnalyzerAdviceKey.KEY, FineAdviceAssistant.create( + ElementMatchers.isAnnotatedWith(FaultTolerance.class), + FaultToleranceAdvice.class + )); + + } + + + private AnalyzerAssemblyFactory createBasicFactory() { + + AnalyzerAssemblyFactory factory = findSingleton(AnalyzerAssemblyFactory.class); + FineAnalyzerAssemblyFactory basicFactory = new FineAnalyzerAssemblyFactory(); + basicFactory.prepare(factory); + return basicFactory; + } +} diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzerAdvice.java b/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzerAdvice.java new file mode 100644 index 0000000000..301634aa6d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzerAdvice.java @@ -0,0 +1,12 @@ +package com.fr.design.record.analyzer; + +import com.fr.record.analyzer.advice.AnalyzerAdvice; + +/** + * 仅作为标志 + * 没有方法 + * + * created by Harrison on 2022/03/04 + **/ +public interface DesignerAnalyzerAdvice extends AnalyzerAdvice { +} diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzerListener.java b/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzerListener.java new file mode 100644 index 0000000000..8db3a395f1 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAnalyzerListener.java @@ -0,0 +1,23 @@ +package com.fr.design.record.analyzer; + +import com.fr.log.FineLoggerFactory; +import com.fr.third.net.bytebuddy.agent.builder.AgentBuilder; +import com.fr.third.net.bytebuddy.description.type.TypeDescription; +import com.fr.third.net.bytebuddy.dynamic.DynamicType; +import com.fr.third.net.bytebuddy.utility.JavaModule; + +/** + * created by Harrison on 2022/03/08 + **/ +public class DesignerAnalyzerListener extends AgentBuilder.Listener.Adapter { + + @Override + public void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module, boolean loaded, DynamicType dynamicType) { + FineLoggerFactory.getLogger().debug("Designer-Analyzer transform successfully:{}", typeDescription); + } + + @Override + public void onError(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded, Throwable throwable) { + FineLoggerFactory.getLogger().error("Designer-Analyzer transform error:" + typeName); + } +} diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAssemblyFactory.java b/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAssemblyFactory.java new file mode 100644 index 0000000000..2e5fdc408e --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/DesignerAssemblyFactory.java @@ -0,0 +1,91 @@ +package com.fr.design.record.analyzer; + +import com.fr.record.analyzer.configuration.AnalyzerAssemblyFactory; +import com.fr.third.net.bytebuddy.agent.builder.AgentBuilder; + +import java.util.List; +import java.util.Map; + +/** + * 装配 Agent 为后置启动 + *

必须在一个线程中处理 retransform 的事务,否则会阻塞整个的线程,导致效果不佳

+ * + * created by Harrison on 2022/03/07 + **/ +public class DesignerAssemblyFactory implements AnalyzerAssemblyFactory { + + /** + * 每次执行 1 个 class 的 retransform + */ + private static final int FIXED_SIZE = 1; + + /** + * 单位 ms + * 每次间隔 500 ms, 执行一次 + */ + private static final int DELAY_INTERVAL = 500; + + private final AgentBuilder.RedefinitionStrategy.BatchAllocator batchAllocator = AgentBuilder.RedefinitionStrategy.BatchAllocator.ForFixedSize.ofSize(FIXED_SIZE); + + private final AgentBuilder.RedefinitionStrategy.Listener redefinitionListener = new DelayListener(DELAY_INTERVAL); + + public static DesignerAssemblyFactory getInstance() { + return DesignerAssemblyFactoryHolder.INSTANCE; + } + + private static class DesignerAssemblyFactoryHolder { + private static final DesignerAssemblyFactory INSTANCE = new DesignerAssemblyFactory(); + } + + @Override + public AnalyzerAssemblyFactory prepare(Void material) { + + return this; + } + + @Override + public AgentBuilder assembly(AgentBuilder raw) { + + return raw.disableClassFormatChanges() + .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION) + // 每次只 transform 一部分否则会导致 UI 变慢 + .with(batchAllocator) + .with(redefinitionListener) + .with(AgentBuilder.InitializationStrategy.NoOp.INSTANCE) + .with(AgentBuilder.TypeStrategy.Default.REDEFINE); + } + + private class DelayListener implements AgentBuilder.RedefinitionStrategy.Listener { + + /** + * 单位 ms + */ + private final int interval; + + public DelayListener(int interval) { + this.interval = interval; + } + + /** + * 执行完后,等待一段时间再执行。 + */ + @Override + public void onBatch(int index, List> batch, List> types) { + + try { + Thread.sleep(interval); + } catch (Exception ignore) { + } + } + + @Override + public Iterable>> onError(int index, List> batch, Throwable throwable, List> types) { + return null; + } + + @Override + public void onComplete(int amount, List> types, Map>, Throwable> failures) { + + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/advice/DBMonitorAdvice.java b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/DBMonitorAdvice.java new file mode 100644 index 0000000000..aba2c2bdf3 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/DBMonitorAdvice.java @@ -0,0 +1,23 @@ +package com.fr.design.record.analyzer.advice; + +import com.fr.design.record.analyzer.DesignerAnalyzerAdvice; +import com.fr.general.data.DataModel; +import com.fr.measure.DBMeterFactory; +import com.fr.measure.metric.DBMetric; +import com.fr.third.net.bytebuddy.asm.Advice; +import com.fr.third.net.bytebuddy.implementation.bytecode.assign.Assigner; + +/** + * created by Harrison on 2022/03/07 + **/ +public class DBMonitorAdvice implements DesignerAnalyzerAdvice { + + @Advice.OnMethodExit(onThrowable = Exception.class) + public static void onMethodExit(@Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] args) { + + if (args.length > 1 && args[1] instanceof DataModel) { + DBMetric meter = ((DataModel) args[1]).getMetric(); + DBMeterFactory.getMeter().record(meter); + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/advice/FaultToleranceAdvice.java b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/FaultToleranceAdvice.java new file mode 100644 index 0000000000..4f40ef9430 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/FaultToleranceAdvice.java @@ -0,0 +1,46 @@ +package com.fr.design.record.analyzer.advice; + +import com.fr.design.record.analyzer.DesignerAnalyzerAdvice; +import com.fr.record.analyzer.advice.AdviceContext; +import com.fr.record.analyzer.advice.DefaultAdviceCallable; +import com.fr.third.net.bytebuddy.asm.Advice; +import com.fr.third.net.bytebuddy.implementation.bytecode.assign.Assigner; +import com.fr.tolerance.FaultTolerance; +import com.fr.tolerance.FaultToleranceFactory; + +import java.lang.reflect.Method; +import java.util.concurrent.Callable; + +/** + * created by Harrison on 2022/03/07 + **/ +public class FaultToleranceAdvice implements DesignerAnalyzerAdvice { + + @Advice.OnMethodEnter(skipOn = Advice.OnDefaultValue.class) + public static boolean onMethodEnter(@Advice.Local("context") AdviceContext adviceContext) throws Exception { + + adviceContext = AdviceContext + .builder() + .onAdviceCall() + .build(); + // 如果是切面调用,则忽视当前方法 + return adviceContext.isOnAdviceCall(); + } + + @Advice.OnMethodExit(onThrowable = Exception.class) + public static void onMethodExit(@Advice.This(optional = true, typing = Assigner.Typing.DYNAMIC) Object self, + @Advice.Origin Method method, + @Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] args, + @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object result, + @Advice.Local("context")AdviceContext adviceContext) throws Exception { + + // 如果是切面调用,则忽视不继续 exit + if (adviceContext != null && adviceContext.isOnAdviceCall()) { + return; + } + + FaultTolerance faultTolerance = method.getAnnotation(FaultTolerance.class); + Callable callable = new DefaultAdviceCallable<>(self, method, args); + result = FaultToleranceFactory.getInstance().getScene(faultTolerance.scene()).getProcessor().execute(self, callable, args); + } +} diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/advice/FocusAdvice.java b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/FocusAdvice.java new file mode 100644 index 0000000000..7bc79cc6cf --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/FocusAdvice.java @@ -0,0 +1,31 @@ +package com.fr.design.record.analyzer.advice; + +import com.fr.design.record.analyzer.DesignerAnalyzerAdvice; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.FocusPoint; +import com.fr.intelli.record.FocusPolicy; +import com.fr.log.counter.DefaultLimitedMetric; +import com.fr.third.net.bytebuddy.asm.Advice; +import com.fr.third.net.bytebuddy.implementation.bytecode.assign.Assigner; + +import java.lang.reflect.Method; + +/** + * created by Harrison on 2022/03/07 + **/ +public class FocusAdvice implements DesignerAnalyzerAdvice { + + private static final String FOCUS_POINT_ID_PREFIX = "function_"; + + @Advice.OnMethodExit(onThrowable = Exception.class) + public static void onMethodExit(@Advice.Origin Method method, + @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object result) throws Exception { + + if (FocusPolicy.IGNORE == result) { + return; + } + Focus focus = method.getAnnotation(Focus.class); + String id = FOCUS_POINT_ID_PREFIX + focus.id(); + DefaultLimitedMetric.INSTANCE.submit(FocusPoint.create(id, focus.text(), focus.source()), id); + } +} diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/advice/MonitorAdvice.java b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/MonitorAdvice.java new file mode 100644 index 0000000000..a459d0841d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/MonitorAdvice.java @@ -0,0 +1,157 @@ +package com.fr.design.record.analyzer.advice; + +import com.fr.design.record.analyzer.DesignerAnalyzerAdvice; +import com.fr.general.GeneralUtils; +import com.fr.intelli.measure.Estimator; +import com.fr.intelli.metrics.Compute; +import com.fr.intelli.metrics.SupervisoryConfig; +import com.fr.intelli.record.Measurable; +import com.fr.intelli.record.MeasureObject; +import com.fr.intelli.record.MeasureUnit; +import com.fr.intelli.record.MetricRegistry; +import com.fr.log.FineLoggerFactory; +import com.fr.measure.DBMeterFactory; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.web.Session; +import com.fr.stable.web.SessionProvider; +import com.fr.third.net.bytebuddy.asm.Advice; +import com.fr.third.net.bytebuddy.implementation.bytecode.assign.Assigner; +import com.fr.web.core.SessionPoolManager; +import com.fr.web.session.SessionLocalManager; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * created by Harrison on 2022/03/07 + **/ +public class MonitorAdvice implements DesignerAnalyzerAdvice { + + private static final Pattern P = Pattern.compile("-?\\d+"); + private static final int MIN_ERROR_CODE = 10000000; + + @Advice.OnMethodEnter + public static void onMethodEnter(@Advice.Origin Method method, + @Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] args, + @Advice.Local("startTime") Long startTime, + @Advice.Local("registeredSession") Boolean registeredSession) { + + startTime = (System.currentTimeMillis()); + registeredSession = (findSessionAnnotation(method, args)); + } + + @Advice.OnMethodExit(onThrowable = Exception.class) + public static void onMethodExit(@Advice.This(optional = true, typing = Assigner.Typing.DYNAMIC) Object self, + @Advice.Origin Method method, + @Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] args, + @Advice.Thrown(typing = Assigner.Typing.DYNAMIC) Exception e, + @Advice.Local("startTime") Long startTime, + @Advice.Local("registeredSession") Boolean registeredSession) throws Exception { + + String error = StringUtils.EMPTY; + + try { + + if (e != null) { + try { + error = getErrorContent(e); + } catch (Exception ignore) { + } + } + } finally { + try { + if (self instanceof Measurable) { + long consume = System.currentTimeMillis() - startTime; + Compute once = method.getAnnotation(Compute.class); + Measurable measurable = (Measurable) self; + MeasureObject measureObject = MeasureObject.create(); + recordMemory(once, measurable, measureObject); + recordSQL(once, measureObject); + measureObject.consume(consume); + measureObject.error(error); + String id = UUID.randomUUID().toString(); + List newArgs = new ArrayList<>(Arrays.asList(args)); + newArgs.add(id); + recordSQLDetail(id); + if (measurable instanceof Estimator) { + measurable.asyncDurable(measureObject, newArgs.toArray()); + } else { + Object message = null; + try { + message = measurable.durableEntity(measureObject, newArgs.toArray()); + } catch (Throwable throwable) { + FineLoggerFactory.getLogger().error(throwable.getMessage(), throwable); + } + if (message != null) { + MetricRegistry.getMetric().submit(message); + } + } + } + } catch (Exception ignore) { + //埋点信息入库失败应该不能影响业务流程 + } finally { + if (registeredSession) { + // 如果上面记录了,这里就要释放 + SessionLocalManager.releaseSession(); + } + } + } + } + + public static String getErrorContent(Exception e) { + int errorCode = GeneralUtils.objectToNumber( + extractCodeFromString(e.getMessage()) + ).intValue(); + // 提取字符串中的第一个数字,最小的错误码为10000000 + return e.getClass().getName() + ":" + (errorCode >= MIN_ERROR_CODE ? errorCode : StringUtils.EMPTY); + } + + public static String extractCodeFromString(String errorMsg) { + Matcher m = P.matcher(errorMsg); + if (m.find()) { + return m.group(); + } + return StringUtils.EMPTY; + } + + public static void recordSQLDetail(String uuid) { + DBMeterFactory.getMeter().submit(uuid); + } + + public static void recordSQL(Compute once, MeasureObject measureObject) { + if (SupervisoryConfig.getInstance().isEnableMeasureSql() && once.computeSql()) { + measureObject.sqlTime(SessionLocalManager.getSqlTime()); + measureObject.sql(SessionLocalManager.getSql()); + } + } + + public static void recordMemory(Compute once, Measurable measurable, MeasureObject measureObject) { + if (SupervisoryConfig.getInstance().isEnableMeasureMemory() && once.computeMemory()) { + MeasureUnit unit = measurable.measureUnit(); + measureObject.memory(unit.measureMemory()); + } + } + + public static boolean findSessionAnnotation(Method method, Object[] args) { + Annotation[][] all = method.getParameterAnnotations(); + int len = ArrayUtils.getLength(args); + for (int i = 0; i < len; i++) { + Annotation[] current = all[i]; + for (Annotation annotation : current) { + if (annotation.annotationType().equals(Session.class)) { + SessionLocalManager.setSession( + SessionPoolManager.getSessionIDInfor(GeneralUtils.objectToString(args[i]), SessionProvider.class)); + return true; + } + } + } + return false; + } +} diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/advice/PerformancePointAdvice.java b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/PerformancePointAdvice.java new file mode 100644 index 0000000000..5b54f66538 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/PerformancePointAdvice.java @@ -0,0 +1,49 @@ +package com.fr.design.record.analyzer.advice; + +import com.fr.design.record.analyzer.DesignerAnalyzerAdvice; +import com.fr.intelli.record.ConsumePoint; +import com.fr.intelli.record.MetricRegistry; +import com.fr.intelli.record.PerformancePoint; +import com.fr.intelli.record.PerformancePointRecord; +import com.fr.stable.StringUtils; +import com.fr.third.net.bytebuddy.asm.Advice; +import com.fr.third.net.bytebuddy.implementation.bytecode.assign.Assigner; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * created by Harrison on 2022/03/07 + **/ +public class PerformancePointAdvice implements DesignerAnalyzerAdvice { + + @Advice.OnMethodEnter + public static void onMethodEnter(@Advice.Local("startTime") Long startTime) { + + startTime = (System.currentTimeMillis()); + } + + @Advice.OnMethodExit(onThrowable = Exception.class) + public static void onMethodExit(@Advice.This(optional = true, typing = Assigner.Typing.DYNAMIC) Object self, + @Advice.Origin Method method, + @Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] args, + @Advice.Local("startTime") Long startTime) { + + PerformancePoint point = method.getAnnotation(PerformancePoint.class); + String id = point.id(); + long endTime = System.currentTimeMillis(); + long consume = endTime - startTime; + if (self instanceof PerformancePointRecord) { + PerformancePointRecord measurable = (PerformancePointRecord) self; + List newArgs = new ArrayList(Arrays.asList(args)); + ConsumePoint consumePoint = ConsumePoint.create(id, startTime, endTime, consume, point.source()); + MetricRegistry.getMetric().submit(measurable.recordPoint(consumePoint, newArgs.toArray())); + } else { + if (StringUtils.isNotEmpty(id)) { + MetricRegistry.getMetric().submit(ConsumePoint.create(id, consume, point.source())); + } + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/advice/TimeAdvice.java b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/TimeAdvice.java new file mode 100644 index 0000000000..b60b5c2d33 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/TimeAdvice.java @@ -0,0 +1,36 @@ +package com.fr.design.record.analyzer.advice; + +import com.fr.design.record.analyzer.DesignerAnalyzerAdvice; +import com.fr.log.FineLoggerFactory; +import com.fr.record.analyzer.Metrics; +import com.fr.third.net.bytebuddy.asm.Advice; + +import java.lang.reflect.Method; + +/** + * created by Harrison on 2022/03/08 + **/ +public class TimeAdvice implements DesignerAnalyzerAdvice { + + + @Advice.OnMethodEnter + public static void onMethodEnter(@Advice.Local("startTime") Long startTime) { + + startTime = (System.currentTimeMillis()); + } + + @Advice.OnMethodExit(onThrowable = Exception.class) + public static void onMethodExit(@Advice.Origin Method method, + @Advice.Local("startTime") Long startTime) { + + Metrics metrics = method.getAnnotation(Metrics.class); + Object prefix; + String description = metrics.description(); + if ("".equals(description)) { + prefix = method.getDeclaringClass().getName() + "#" + method.getName(); + } else { + prefix = description; + } + FineLoggerFactory.getLogger().info("{} took {} ms.", prefix, System.currentTimeMillis() - startTime); + } +} diff --git a/designer-base/src/main/java/com/fr/design/record/analyzer/advice/TrackAdvice.java b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/TrackAdvice.java new file mode 100644 index 0000000000..bdebecc600 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/record/analyzer/advice/TrackAdvice.java @@ -0,0 +1,25 @@ +package com.fr.design.record.analyzer.advice; + +import com.fr.intelli.record.MetricRegistry; +import com.fr.third.javax.persistence.Entity; +import com.fr.third.net.bytebuddy.asm.Advice; +import com.fr.third.net.bytebuddy.implementation.bytecode.assign.Assigner; + +import java.util.List; + +/** + * created by Harrison on 2022/03/08 + **/ +public class TrackAdvice { + + @Advice.OnMethodExit(onThrowable = Exception.class) + public static void onMethodExit(@Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object result) { + + if (result != null) { + Class clazz = result.getClass(); + if (clazz.getAnnotation(Entity.class) != null || result instanceof List) { + MetricRegistry.getMetric().submit(result); + } + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/startup/Install4jStartupNotificationProvider.java b/designer-base/src/main/java/com/fr/design/startup/Install4jStartupNotificationProvider.java index 5402032f94..b239698897 100644 --- a/designer-base/src/main/java/com/fr/design/startup/Install4jStartupNotificationProvider.java +++ b/designer-base/src/main/java/com/fr/design/startup/Install4jStartupNotificationProvider.java @@ -22,14 +22,22 @@ public class Install4jStartupNotificationProvider implements FineStartupNotifica @Override public void registerStartupListener(Listener listener) { - Class StartupNotificationListenerClass = Reflect.on("com.install4j.api.launcher.StartupNotification$Listener").type(); + Class StartupNotificationListenerClass = null; + try { + StartupNotificationListenerClass = Reflect.on("com.install4j.api.launcher.StartupNotification$Listener").type(); + } catch (Exception ignored) { + } + if (StartupNotificationListenerClass == null) { return; } ListenerHandler mHandler = new ListenerHandler(listener); Object listenerCallbackInstance = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] { StartupNotificationListenerClass }, mHandler); - Reflect.on("com.install4j.api.launcher.StartupNotification").call("registerStartupListener", listenerCallbackInstance); + try { + Reflect.on("com.install4j.api.launcher.StartupNotification").call("registerStartupListener", listenerCallbackInstance); + } catch (Exception ignored) { + } } private static class ListenerHandler implements InvocationHandler { @@ -48,4 +56,13 @@ public class Install4jStartupNotificationProvider implements FineStartupNotifica return null; } } + + public static void main(String[] args) { + Install4jStartupNotificationProvider.getInstance().registerStartupListener(new Listener() { + @Override + public void startupPerformed(String parameters) { + + } + }); + } } diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java index f3284c11e5..576c5a9b96 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java @@ -1,6 +1,6 @@ package com.fr.design.upm; -import com.fr.base.FRContext; +import com.fr.decision.webservice.v10.plugin.helper.category.impl.BaseResourceLoader; import com.fr.decision.webservice.v10.plugin.helper.category.impl.UpmResourceLoader; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.UIDialog; @@ -12,8 +12,11 @@ import com.fr.design.update.ui.dialog.UpdateMainDialog; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; +import com.fr.general.CommonIOUtils; import com.fr.general.GeneralContext; +import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.PluginStoreConstants; import com.fr.stable.StableUtils; import com.fr.workspace.Workspace; import com.fr.workspace.WorkspaceEvent; @@ -33,7 +36,7 @@ public class UpmFinder { private static final String MAIN_RESOURCE_PATH = UPM_DIR + "/plugin_design.html"; private static final String JXBROWSER = "com.teamdev.jxbrowser.browser.Browser"; - public static String installHome = FRContext.getCommonOperator().getWebRootPath(); + public static String installHome = PluginStoreConstants.getLocalInstallHome(); private static UIDialog dialog = null; @@ -41,7 +44,8 @@ public class UpmFinder { EventDispatcher.listen(WorkspaceEvent.AfterSwitch, new Listener() { @Override public void on(Event event, Workspace param) { - installHome = FRContext.getCommonOperator().getWebRootPath(); + installHome = PluginStoreConstants.getLocalInstallHome(); + UpmResourceLoader.INSTANCE.checkOldShopFile(); } }); } @@ -75,24 +79,24 @@ public class UpmFinder { } private static void showUpmPane() { - if (!checkUPMResourcesExist()){ + if (!checkUPMResourcesExist()) { // upm下载 int val = FineJOptionPane.showConfirmDialog(null, Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Need_Install"), Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE); - if (val == JOptionPane.OK_OPTION){ + if (val == JOptionPane.OK_OPTION) { try { UpmResourceLoader.INSTANCE.download(); - UpmResourceLoader.INSTANCE.install(); + installUpmResource(); + FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Installed"), Toolkit.i18nText("Fine-Design_Basic_Message"), JOptionPane.INFORMATION_MESSAGE); - } catch (Exception e){ + } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Updater_Download_Failed"), Toolkit.i18nText("Fine-Design_Basic_Message"), JOptionPane.INFORMATION_MESSAGE); } } - } - else { + } else { UpmShowPane upmPane = new UpmShowPane(); if (dialog == null) { dialog = new UpmShowDialog(DesignerContext.getDesignerFrame(), upmPane); @@ -102,6 +106,15 @@ public class UpmFinder { } } + private static void installUpmResource() { + String installHome = PluginStoreConstants.getLocalInstallHome(); + File scriptZip = new File(BaseResourceLoader.SCRIPT_DOWNLOAD_PATH); + if (scriptZip.exists()) { + IOUtils.unzip(scriptZip, installHome); + CommonIOUtils.deleteFile(scriptZip); + } + } + private static void showUpdatePane() { JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Update_Info_Plugin_Message")); if (!GeneralContext.getLocale().equals(Locale.JAPANESE) && !GeneralContext.getLocale().equals(Locale.JAPAN) diff --git a/designer-base/src/main/java/com/fr/env/utils/WorkspaceUtils.java b/designer-base/src/main/java/com/fr/env/utils/WorkspaceUtils.java new file mode 100644 index 0000000000..3979b4eee8 --- /dev/null +++ b/designer-base/src/main/java/com/fr/env/utils/WorkspaceUtils.java @@ -0,0 +1,27 @@ +package com.fr.env.utils; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.env.DesignerWorkspaceInfo; +import com.fr.design.env.LocalDesignerWorkspaceInfo; +import com.fr.stable.StringUtils; + +/** + * @author hades + * @version 11.0 + * Created by hades on 2022/3/10 + */ +public class WorkspaceUtils { + + private static final String SPECIFY_WORKSPACE = "fr.designer.workspace"; + + public static DesignerWorkspaceInfo getWorkspaceInfo() { + String workspacePath; + String current = DesignerEnvManager.getEnvManager().getCurEnvName(); + if (StringUtils.isNotEmpty(workspacePath = System.getProperty(SPECIFY_WORKSPACE))) { + return LocalDesignerWorkspaceInfo.create(StringUtils.EMPTY, workspacePath); + } else { + return DesignerEnvManager.getEnvManager().getWorkspaceInfo(current); + } + } + +} diff --git a/designer-base/src/main/java/com/fr/exit/ConfigToPropMigrator.java b/designer-base/src/main/java/com/fr/exit/ConfigToPropMigrator.java new file mode 100644 index 0000000000..909768beef --- /dev/null +++ b/designer-base/src/main/java/com/fr/exit/ConfigToPropMigrator.java @@ -0,0 +1,111 @@ +package com.fr.exit; + +import com.fr.config.dao.PropertiesConstants; +import com.fr.design.DesignerEnvManager; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.CommonUtils; +import com.fr.stable.StableUtils; +import com.fr.stable.project.ProjectConstants; +import com.fr.workspace.WorkContext; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.sql.Blob; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Properties; + +/** + * 设计器关闭前的配置缓存一份到Properties + * + * @author hades + * @version 11.0 + * Created by hades on 2022/3/1 + */ +public class ConfigToPropMigrator { + + private static final String SELECT_FOR_ENTITY = "select id, value from fine_conf_entity"; + + private static final String SELECT_FOR_CLASSNAME = "select id, classname from fine_conf_classname"; + + private static final String SELECT_FOR_XML_ENTITY = "select id, value from fine_conf_xmlentity"; + + private static final ConfigToPropMigrator INSTANCE = new ConfigToPropMigrator(); + + public static ConfigToPropMigrator getInstance() { + return INSTANCE; + } + + public void execute() { + + if (WorkContext.getCurrent().isLocal()) { + + String url = "jdbc:hsqldb:file://" + WorkContext.getCurrent().getPath() + "/" + ProjectConstants.EMBED_DB_DIRECTORY + "/finedb/db;hsqldb.tx=mvcc"; + + try { + Class.forName("com.fr.third.org.hsqldb.jdbcDriver"); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return ; + } + + initDirectory(); + + try (Connection c = DriverManager.getConnection(url); + FileOutputStream entityOut = new FileOutputStream(PropertiesConstants.ENTITY_PROP_PATH); + FileOutputStream classHelperOut = new FileOutputStream(PropertiesConstants.CLASS_NAME_PROP_PATH); + FileOutputStream xmlEntityOut = new FileOutputStream(PropertiesConstants.XML_ENTITY_PROP_PATH)) { + + processClassOrEntity(c, new Properties(), SELECT_FOR_ENTITY, entityOut); + processClassOrEntity(c, new Properties(), SELECT_FOR_CLASSNAME, classHelperOut); + processXmlEntity(c, new Properties(), xmlEntityOut); + DesignerEnvManager.getEnvManager().setPropertiesUsable(true); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + deletePropertiesCache(); + } + } + } + + private void initDirectory() { + File directory = new File(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.PROPERTIES_CACHE_FOR_CONFIG)); + if (!directory.exists()) { + directory.mkdir(); + } + } + + private void processClassOrEntity(Connection c, Properties map, String sql, FileOutputStream outputStream) throws SQLException, IOException { + PreparedStatement query = c.prepareStatement(sql); + ResultSet resultSet = query.executeQuery(); + while (resultSet.next()) { + String id = resultSet.getString(1); + String value = resultSet.getString(2); + if (id != null && value != null) { + map.setProperty(id, value); + } + } + map.store(outputStream, null); + } + + private void processXmlEntity(Connection c, Properties map, FileOutputStream outputStream) throws SQLException, IOException { + PreparedStatement query = c.prepareStatement(SELECT_FOR_XML_ENTITY); + ResultSet resultSet = query.executeQuery(); + while (resultSet.next()) { + String id = resultSet.getString(1); + Blob value = resultSet.getBlob(2); + byte[] bytes = value.getBytes(1L, (int) value.length()); + map.setProperty(id, new String(bytes)); + } + map.store(outputStream, null); + } + + public void deletePropertiesCache() { + CommonUtils.deleteFile(new File(PropertiesConstants.ENTITY_PROP_PATH)); + CommonUtils.deleteFile(new File(PropertiesConstants.XML_ENTITY_PROP_PATH)); + CommonUtils.deleteFile(new File(PropertiesConstants.CLASS_NAME_PROP_PATH)); + } + +} diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index 30f55d7ef0..6dfb294434 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -202,10 +202,11 @@ public class FILEChooserPane extends BasicPane { return INSTANCE; } - public static FILEChooserPane getInstanceWithDesignatePath(String path, FILEFilter filter) { + public static FILEChooserPane getInstanceWithDesignatePath(String path, FILEFilter filter, String topPath) { INSTANCE.showLoc = false; INSTANCE.showEnv = false; INSTANCE.showWebReport = false; + INSTANCE.setTopPath(topPath); INSTANCE.setDesignateModel(path); INSTANCE.removeAllFilter(); INSTANCE.addChooseFILEFilter(filter, 0); @@ -633,6 +634,9 @@ public class FILEChooserPane extends BasicPane { this.filterList.clear(); } + public void removeTopPath() { + this.setTopPath(StringUtils.EMPTY); + } /** * 设置filter,刷新右侧subFileList中的items @@ -1045,9 +1049,14 @@ public class FILEChooserPane extends BasicPane { if (placesList == null) { return; } + setPlaceListModel(new DesignateRemotePlaceListModel(path)); } + private void setTopPath(String path) { + this.locationBtnPane.setTopPath(path); + } + private void setMultiPlaceListModel() { if (placesList == null) { @@ -1385,6 +1394,8 @@ public class FILEChooserPane extends BasicPane { private List buttonList = new ArrayList<>(); private int pathIndex = 0; private int maxPathIndex = 0; + // 对顶层目录进行的限制 + private String topPath; public LocationButtonPane() { this.setLayout(FRGUIPaneFactory.createBoxFlowLayout()); @@ -1430,6 +1441,10 @@ public class FILEChooserPane extends BasicPane { }); } + public void setTopPath(String path) { + this.topPath = path; + } + public void highLightButton(FILE dir) { for (int i = 0; i < this.buttonList.size(); i++) { this.buttonList.get(i).setForeground(null); @@ -1471,6 +1486,7 @@ public class FILEChooserPane extends BasicPane { } Matcher matcher = SEPARATOR_PATTERN.matcher(path); int node_start = 0; + boolean needTopPath = !StringUtils.isEmpty(topPath); while (matcher.find()) { int start = matcher.start(); String btn_text = path.substring(node_start, start); @@ -1478,11 +1494,14 @@ public class FILEChooserPane extends BasicPane { if (StringUtils.isBlank(btn_text) && isWebAppNamePath) { btn_text = webAppName; } + node_start = matcher.end(); + if (needTopPath && topPath.equals(btn_text)) { + needTopPath = false; + } this.buttonList.add(createBlankButton((new SetDirectoryAction(btn_text + '/', // alex:dir.prefix不和btn_path一起参与pathJoin,因为btn_path是否以/打头在unix,linux // OS中意义很不一样 - FILEFactory.createFolder(dir.prefix() + StableUtils.pathJoin(btn_path, "/")))))); - node_start = matcher.end(); + FILEFactory.createFolder(dir.prefix() + StableUtils.pathJoin(btn_path, "/")), !needTopPath)))); } maxPathIndex = calculateMaxPathIndex(); @@ -1583,6 +1602,7 @@ public class FILEChooserPane extends BasicPane { private class SetDirectoryAction extends UpdateAction { private FILE dir; + private boolean response = true; public SetDirectoryAction(String name) { this.setName(name); @@ -1594,9 +1614,15 @@ public class FILEChooserPane extends BasicPane { this.dir = file; } + public SetDirectoryAction(String name, FILE file, boolean response) { + this.setName(name); + this.dir = file; + this.response = response; + } + @Override public void actionPerformed(ActionEvent evt) { - if (dir != null) { + if (dir != null && response) { setSelectedDirectory(dir); } } diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index 6165ff7f7c..2633cedd41 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -32,6 +32,7 @@ import com.fr.process.engine.core.CarryMessageEvent; import com.fr.process.engine.core.FineProcessContext; import com.fr.stable.OperatingSystem; +import com.fr.start.event.LazyStartupEvent; import com.fr.workspace.base.WorkspaceStatus; import java.awt.Window; import java.io.File; @@ -86,6 +87,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { eventPipe.fire(new CarryMessageEvent(ReportState.STOP.getValue())); } EventDispatcher.fire(WorkspaceStatus.Prepared); + EventDispatcher.asyncFire(LazyStartupEvent.INSTANCE); collectUserInformation(); } }); diff --git a/designer-base/src/main/java/com/fr/start/event/LazyStartupEvent.java b/designer-base/src/main/java/com/fr/start/event/LazyStartupEvent.java new file mode 100644 index 0000000000..fcef2ffc1b --- /dev/null +++ b/designer-base/src/main/java/com/fr/start/event/LazyStartupEvent.java @@ -0,0 +1,14 @@ +package com.fr.start.event; + +import com.fr.event.Event; +import com.fr.event.Null; + +/** + * @author hades + * @version 11.0 + * Created by hades on 2022/3/7 + */ +public enum LazyStartupEvent implements Event { + + INSTANCE +} diff --git a/designer-base/src/main/resources/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex b/designer-base/src/main/resources/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex index f73852366f..c749259ee2 100644 --- a/designer-base/src/main/resources/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex +++ b/designer-base/src/main/resources/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex @@ -584,7 +584,13 @@ FunctionNames = "ABS"| "QUERY"| "query"| "WEBIMAGE"| - "webimage" + "webimage"| + "ACCSUM"| + "accsum"| + "COUNTIFS"| + "countifs"| + "SUMIFS"| + "sumifs" %state MLC diff --git a/designer-base/src/main/resources/com/fr/design/images/data/back_normal.svg b/designer-base/src/main/resources/com/fr/design/images/data/back_normal.svg new file mode 100644 index 0000000000..8b22bc1821 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/data/back_normal.svg @@ -0,0 +1,9 @@ + + + icon_返回_normal + + + + diff --git a/designer-base/src/main/resources/com/fr/design/images/data/clear_normal.svg b/designer-base/src/main/resources/com/fr/design/images/data/clear_normal.svg new file mode 100644 index 0000000000..11f60a5530 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/data/clear_normal.svg @@ -0,0 +1,10 @@ + + + icon_关闭_normal + + + + diff --git a/designer-base/src/main/resources/com/fr/design/images/data/search_normal.svg b/designer-base/src/main/resources/com/fr/design/images/data/search_normal.svg new file mode 100644 index 0000000000..dc036ac53c --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/data/search_normal.svg @@ -0,0 +1,9 @@ + + + icon_搜索_normal + + + + diff --git a/designer-base/src/test/java/com/fr/design/data/MapCompareUtilsTest.java b/designer-base/src/test/java/com/fr/design/data/MapCompareUtilsTest.java new file mode 100644 index 0000000000..1f1e60e2be --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/data/MapCompareUtilsTest.java @@ -0,0 +1,57 @@ +package com.fr.design.data; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author rinoux + * @version 10.0 + * Created by rinoux on 2022/3/28 + */ +public class MapCompareUtilsTest { + + @Test + public void contrastMapEntries() { + + + Map orig = new LinkedHashMap<>(); + + orig.put("aaa", "aaa"); + orig.put("bbb", "bbb"); + orig.put("ccc", "ccc"); + orig.put("ddd", "ddd"); + + + Map other = new LinkedHashMap<>(); + + other.put("aaa", "111"); + other.put("bbb", "bbb"); + other.put("ccc", "ccc"); + other.put("eee", "eee"); + + + MapCompareUtils.contrastMapEntries(orig, other, new MapCompareUtils.EventHandler() { + @Override + public void on(MapCompareUtils.EntryEventKind entryEventKind, String s, String s2) { + switch (entryEventKind) { + case UPDATED: + Assert.assertEquals(s, "aaa"); + Assert.assertEquals(s2, "111"); + break; + case REMOVED: + Assert.assertEquals(s, "ddd"); + break; + case ADDED: + Assert.assertEquals(s, "eee"); + Assert.assertEquals(s2, "eee"); + break; + default: + Assert.fail(); + } + } + }); + } +} \ No newline at end of file diff --git a/designer-base/src/test/java/com/fr/design/data/datapane/management/clip/TableDataTreeClipboardTest.java b/designer-base/src/test/java/com/fr/design/data/datapane/management/clip/TableDataTreeClipboardTest.java new file mode 100644 index 0000000000..98871158d3 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/data/datapane/management/clip/TableDataTreeClipboardTest.java @@ -0,0 +1,43 @@ +package com.fr.design.data.datapane.management.clip; + +import com.fr.data.impl.EmbeddedTableData; +import com.fr.design.data.tabledata.wrapper.AbstractTableDataWrapper; +import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; +import junit.framework.TestCase; +import org.junit.Assert; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Yvan + */ +public class TableDataTreeClipboardTest extends TestCase { + + public void testAddAndTake() { + Map testMap = new HashMap<>(); + testMap.put("ds1", new TemplateTableDataWrapper(new EmbeddedTableData())); + testMap.put("ds2", new TemplateTableDataWrapper(new EmbeddedTableData())); + + Map anotherTestMap = new HashMap<>(); + anotherTestMap.put("ds3", new TemplateTableDataWrapper(new EmbeddedTableData())); + + Map clip; + TableDataTreeClipboard.getInstance().addToClip(testMap); + clip = TableDataTreeClipboard.getInstance().takeFromClip(); + Assert.assertEquals(2, clip.size()); + Assert.assertTrue(clip.containsKey("ds1")); + Assert.assertTrue(clip.containsKey("ds2")); + + // 验证多次取出 + clip = TableDataTreeClipboard.getInstance().takeFromClip(); + Assert.assertEquals(2, clip.size()); + Assert.assertTrue(clip.containsKey("ds1")); + Assert.assertTrue(clip.containsKey("ds2")); + + TableDataTreeClipboard.getInstance().addToClip(anotherTestMap); + clip = TableDataTreeClipboard.getInstance().takeFromClip(); + Assert.assertEquals(1, clip.size()); + Assert.assertTrue(clip.containsKey("ds3")); + } +} \ No newline at end of file diff --git a/designer-base/src/test/java/com/fr/design/data/tabledata/paste/TableDataFollowingPasteUtilsTest.java b/designer-base/src/test/java/com/fr/design/data/tabledata/paste/TableDataFollowingPasteUtilsTest.java new file mode 100644 index 0000000000..2435f363fc --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/data/tabledata/paste/TableDataFollowingPasteUtilsTest.java @@ -0,0 +1,201 @@ +package com.fr.design.data.tabledata.paste; + +import com.fr.base.TableData; +import com.fr.data.Dictionary; +import com.fr.data.TableDataSource; +import com.fr.data.impl.EmbeddedTableData; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; +import com.fr.form.data.DataBinding; +import com.fr.form.data.DataTableConfig; +import com.fr.form.ui.AbstractDataControl; +import com.fr.form.ui.DictionaryContainer; +import com.fr.form.ui.Widget; +import com.fr.form.ui.WidgetValue; +import com.fr.report.cell.tabledata.ElementUsedTableDataProvider; +import com.fr.script.Calculator; +import com.fr.stable.script.CalculatorProvider; +import com.fr.stable.script.NameSpace; +import com.fr.web.core.TemplateSessionIDInfo; +import junit.framework.TestCase; +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Before; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author Yvan + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({DesignTableDataManager.class}) +public class TableDataFollowingPasteUtilsTest extends TestCase { + + @Before + public void beforeTest() { + Map templateDataMap = new LinkedHashMap(); + Map serverDataMap = new LinkedHashMap(); + Map storeProcedureMap = new LinkedHashMap(); + templateDataMap.put("ds1", new TemplateTableDataWrapper(new EmbeddedTableData())); + templateDataMap.put("ds2", new TemplateTableDataWrapper(new EmbeddedTableData())); + templateDataMap.put("ds3", new TemplateTableDataWrapper(new EmbeddedTableData())); + templateDataMap.put("ds4", new TemplateTableDataWrapper(new EmbeddedTableData())); + templateDataMap.put("ds5", new TemplateTableDataWrapper(new EmbeddedTableData())); + + List> list = new ArrayList>(); + list.add(templateDataMap); + list.add(serverDataMap); + list.add(storeProcedureMap); + + TableDataSource tableDataSource = EasyMock.mock(TableDataSource.class); + PowerMock.mockStatic(DesignTableDataManager.class); + EasyMock.expect(DesignTableDataManager.getEditingTableDataSource()).andReturn(tableDataSource).anyTimes(); + EasyMock.expect(DesignTableDataManager.getEditingDataSet(tableDataSource)).andReturn(list).anyTimes(); + PowerMock.replayAll(); + } + + public void testTransferProvider2TableDataMap() { + ElementUsedTableDataProvider[] providers = generateElementUsedTableDataProvider(); + Map tableDataMap = TableDataFollowingPasteUtils.transferProvider2TableDataMap(providers); + Assert.assertEquals(2, tableDataMap.size()); + Assert.assertTrue(tableDataMap.containsKey("ds1")); + Assert.assertTrue(tableDataMap.containsKey("ds2")); + } + + private ElementUsedTableDataProvider[] generateElementUsedTableDataProvider() { + ElementUsedTableDataProvider elementUsedTableDataProvider1 = new ElementUsedTableDataProvider() { + @Override + public Set getElementUsedTableDataNames() { + Set set = new HashSet<>(); + set.add("ds1"); + return set; + } + }; + ElementUsedTableDataProvider elementUsedTableDataProvider2 = new ElementUsedTableDataProvider() { + @Override + public Set getElementUsedTableDataNames() { + Set set = new HashSet<>(); + set.add("ds2"); + return set; + } + }; + return new ElementUsedTableDataProvider[]{elementUsedTableDataProvider1, elementUsedTableDataProvider2}; + } + + public void testTransferWidgetArray2TableDataMap() { + Widget[] widgets = generateWidgetArray(); + Map tableDataMap = TableDataFollowingPasteUtils.transferWidgetArray2TableDataMap(widgets); + Assert.assertEquals(3, tableDataMap.size()); + Assert.assertTrue(tableDataMap.containsKey("ds3")); + Assert.assertTrue(tableDataMap.containsKey("ds4")); + Assert.assertTrue(tableDataMap.containsKey("ds5")); + } + + private Widget[] generateWidgetArray() { + Set set = new HashSet<>(); + set.add("ds3"); + MockWidget widget1 = EasyMock.mock(MockWidget.class); + EasyMock.expect(widget1.getUsedTableDataSets()).andReturn(set).anyTimes(); + EasyMock.replay(widget1); + + DataBinding dataBinding = new DataBinding("ds4", ""); + WidgetValue widgetValue2 = new WidgetValue(); + widgetValue2.setValue(dataBinding); + AbstractDataControl widget2 = EasyMock.mock(AbstractDataControl.class); + EasyMock.expect(widget2.getWidgetValue()).andReturn(widgetValue2).anyTimes(); + EasyMock.replay(widget2); + + DataTableConfig dataTableConfig = EasyMock.mock(DataTableConfig.class); + EasyMock.expect(dataTableConfig.getTableDataName()).andReturn("ds5").anyTimes(); + WidgetValue widgetValue3 = new WidgetValue(); + widgetValue3.setValue(dataTableConfig); + AbstractDataControl widget3 = EasyMock.mock(AbstractDataControl.class); + EasyMock.expect(widget3.getWidgetValue()).andReturn(widgetValue3).anyTimes(); + EasyMock.replay(dataTableConfig, widget3); + + Widget[] widgets = new Widget[3]; + widgets[0] = widget1; + widgets[1] = widget2; + widgets[2] = widget3; + return widgets; + } + + private class MockWidget extends Widget implements DictionaryContainer { + + @Override + public String[] supportedEvents() { + return new String[0]; + } + + @Override + public void setDictionary(Dictionary model) { + + } + + @Override + public Dictionary getDictionary() { + return null; + } + + @Override + public Object getViewValue(Object value, Calculator c, TemplateSessionIDInfo sessionIDInfor, HttpServletRequest req) { + return null; + } + + @Override + public Object getModuleValue(Object text, Calculator c, TemplateSessionIDInfo sessionIDInfor, HttpServletRequest req) { + return null; + } + + @Override + public Object getViewValue(Object value, Calculator c, TemplateSessionIDInfo sessionIDInfor, HttpServletRequest req, NameSpace dependenceNameSpace) { + return null; + } + + @Override + public Object getModuleValue(Object text, Calculator c, TemplateSessionIDInfo sessionIDInfor, HttpServletRequest req, NameSpace dependenceNameSpace) { + return null; + } + + @Override + public boolean isValueAllInDictionary(Object value, Calculator c, TemplateSessionIDInfo sessionIDInfor, HttpServletRequest req, NameSpace dependenceNameSpace) { + return false; + } + + @Override + public String getXType() { + return null; + } + + @Override + public boolean isEditor() { + return false; + } + + @Override + public void setDependenceMap(Map dependenceMap) { + + } + + @Override + public Map getDependenceMap() { + return null; + } + + @Override + public String[] dependence(CalculatorProvider calculatorProvider) { + return new String[0]; + } + } +} \ No newline at end of file diff --git a/designer-base/src/test/java/com/fr/design/record/analyzer/BytebuddyRedefineTest.java b/designer-base/src/test/java/com/fr/design/record/analyzer/BytebuddyRedefineTest.java new file mode 100644 index 0000000000..837c2bd5b8 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/record/analyzer/BytebuddyRedefineTest.java @@ -0,0 +1,139 @@ +package com.fr.design.record.analyzer; + +import com.fr.third.net.bytebuddy.ByteBuddy; +import com.fr.third.net.bytebuddy.agent.ByteBuddyAgent; +import com.fr.third.net.bytebuddy.asm.Advice; +import com.fr.third.net.bytebuddy.dynamic.loading.ClassReloadingStrategy; +import com.fr.third.net.bytebuddy.matcher.ElementMatchers; +import com.fr.third.org.apache.commons.lang3.time.StopWatch; +import org.junit.Assert; +import org.junit.Test; + +import java.util.concurrent.TimeUnit; + +/** + * 测试一下,通过 redefine 去处理代码时 + * 相应的 advice 应该怎么写 + */ +public class BytebuddyRedefineTest { + + /** + * 测试一下是否可以直接抛出异常 + */ + @Test + public void testThrowException() { + + try { + ByteBuddyAgent.install(); + + new ByteBuddy() + .redefine(TestClass.class) + .visit(Advice.to(TestThrowExceptionAdvice.class).on(ElementMatchers.named("testPrint"))) + .make() + .load(TestClass.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + + TestClass testClass = new TestClass(); + testClass.testPrint(); + } catch (Throwable throwable) { + Assert.assertNotNull("expected throw exception", throwable); + } + } + + /** + * 测试是否可以直接传值 + */ + @Test + public void testTransferValue() { + + ByteBuddyAgent.install(); + + new ByteBuddy() + .redefine(TestClass.class) + .visit(Advice.to(TestTransferValueAdvice.class).on(ElementMatchers.named("testPrint"))) + .make() + .load(TestClass.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + + TestClass testClass = new TestClass(); + String print = testClass.testPrint(); + + Assert.assertEquals(10, TestTransferValueAdvice.intField); + Assert.assertEquals("[test]stringField", TestTransferValueAdvice.stringField); + Assert.assertEquals("[test]objectField", TestTransferValueAdvice.objectField); + + } + + /** + * 测试是否可以改变返回值 + */ + @Test + public void testModifyReturn() { + + ByteBuddyAgent.install(); + + new ByteBuddy() + .redefine(TestClass.class) + .visit(Advice.to(TestModifyReturnAdvice.class).on(ElementMatchers.named("testPrint"))) + .make() + .load(TestClass.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + + TestClass testClass = new TestClass(); + String print = testClass.testPrint(); + + Assert.assertEquals("[test]Modify Return Value", print); + + } + + @Test + public void testCallable() throws Exception { + + ByteBuddyAgent.install(); + + new ByteBuddy() + .redefine(TestClass.class) + .visit(Advice.to(TestCallableAdvice.class).on(ElementMatchers.named("testPrint"))) + .make() + .load(TestClass.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + + TestClass testClass = new TestClass(); + String print = testClass.testPrint(); + + Assert.assertEquals("[test]Callable", print); + } + + @Test + public void testCallablePerformance() throws Exception { + + // 千 + int loop = 1000; + StopWatch stopWatch = new StopWatch(); + + stopWatch.start(); + TestClass rawClass = new TestClass(); + for (int i = 0; i < loop; i++) { + rawClass.testPrint(); + } + System.out.printf("raw class run %s cost %s ms \n", loop, stopWatch.getTime(TimeUnit.MILLISECONDS)); + + + ByteBuddyAgent.install(); + + new ByteBuddy() + .redefine(TestClass.class) + .visit(Advice.to(TestCallableAdvice.class).on(ElementMatchers.named("testPrint"))) + .make() + .load(TestClass.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + + stopWatch.reset(); + stopWatch.start(); + + TestClass retransformClass = new TestClass(); + for (int i = 0; i < loop; i++) { + retransformClass.testPrint(); + } + + System.out.printf("retransformClass class run %s cost %s ms \n", loop, stopWatch.getTime(TimeUnit.MILLISECONDS)); + + Assert.assertEquals("[test]Callable", retransformClass.testPrint()); + } + +} \ No newline at end of file diff --git a/designer-base/src/test/java/com/fr/design/record/analyzer/TestCallableAdvice.java b/designer-base/src/test/java/com/fr/design/record/analyzer/TestCallableAdvice.java new file mode 100644 index 0000000000..f98cedcde9 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/record/analyzer/TestCallableAdvice.java @@ -0,0 +1,50 @@ +package com.fr.design.record.analyzer; + +import com.fr.record.analyzer.advice.AdviceCallable; +import com.fr.record.analyzer.advice.AdviceContext; +import com.fr.third.net.bytebuddy.asm.Advice; +import com.fr.third.net.bytebuddy.implementation.bytecode.assign.Assigner; +import com.fr.tolerance.FaultTolerance; + +import java.lang.reflect.Method; +import java.util.concurrent.Callable; + +/** + * created by Harrison on 2022/03/09 + **/ +public class TestCallableAdvice { + + @Advice.OnMethodEnter(skipOn = Advice.OnDefaultValue.class) + public static boolean onMethodEnter(@Advice.Local("context")AdviceContext adviceContext) { + + adviceContext = AdviceContext + .builder() + .onAdviceCall() + .build(); + // 如果是切面调用,则忽视当前方法 + return adviceContext.isOnAdviceCall(); + } + + @Advice.OnMethodExit(onThrowable = Exception.class) + public static void onMethodExit(@Advice.This(optional = true, typing = Assigner.Typing.DYNAMIC) Object self, + @Advice.Origin Method method, + @Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] args, + @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object result, + @Advice.Local("context") AdviceContext adviceContext) throws Exception { + + // 如果是切面调用,则忽视不继续 exit + if (adviceContext != null && adviceContext.isOnAdviceCall()) { + return; + } + + FaultTolerance faultTolerance = method.getAnnotation(FaultTolerance.class); + Callable callable = new AdviceCallable() { + @Override + public Object call() throws Exception { + return method.invoke(self, args); + } + }; + result = TestCallableHelper.test(callable); + } + +} diff --git a/designer-base/src/test/java/com/fr/design/record/analyzer/TestCallableHelper.java b/designer-base/src/test/java/com/fr/design/record/analyzer/TestCallableHelper.java new file mode 100644 index 0000000000..4e99bb7031 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/record/analyzer/TestCallableHelper.java @@ -0,0 +1,15 @@ +package com.fr.design.record.analyzer; + +import java.util.concurrent.Callable; + +/** + * created by Harrison on 2022/03/09 + **/ +public class TestCallableHelper { + + public static String test(Callable callable) throws Exception { + + callable.call(); + return "[test]Callable"; + } +} diff --git a/designer-base/src/test/java/com/fr/design/record/analyzer/TestClass.java b/designer-base/src/test/java/com/fr/design/record/analyzer/TestClass.java new file mode 100644 index 0000000000..e1a2761aaa --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/record/analyzer/TestClass.java @@ -0,0 +1,11 @@ +package com.fr.design.record.analyzer; + +/** + * created by Harrison on 2022/03/04 + **/ +public class TestClass { + + public String testPrint() { + return ""; + } +} diff --git a/designer-base/src/test/java/com/fr/design/record/analyzer/TestModifyReturnAdvice.java b/designer-base/src/test/java/com/fr/design/record/analyzer/TestModifyReturnAdvice.java new file mode 100644 index 0000000000..7c2dae455a --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/record/analyzer/TestModifyReturnAdvice.java @@ -0,0 +1,29 @@ +package com.fr.design.record.analyzer; + +import com.fr.third.net.bytebuddy.asm.Advice; +import com.fr.third.net.bytebuddy.implementation.bytecode.assign.Assigner; + +import java.lang.reflect.Method; + +/** + * created by Harrison on 2022/03/07 + **/ +public class TestModifyReturnAdvice { + + @Advice.OnMethodEnter(skipOn = Advice.OnDefaultValue.class) + public static int onMethodEnter() throws Exception { + + return 0; + } + + @Advice.OnMethodExit(onThrowable = Exception.class) + public static void onMethodExit(@Advice.This(optional = true, typing = Assigner.Typing.DYNAMIC) Object self, + @Advice.Origin Method method, + @Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] args, + @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object result) throws Exception { + + result = "[test]Modify Return Value"; + + } + +} diff --git a/designer-base/src/test/java/com/fr/design/record/analyzer/TestThrowExceptionAdvice.java b/designer-base/src/test/java/com/fr/design/record/analyzer/TestThrowExceptionAdvice.java new file mode 100644 index 0000000000..53c54c28d8 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/record/analyzer/TestThrowExceptionAdvice.java @@ -0,0 +1,19 @@ +package com.fr.design.record.analyzer; + +import com.fr.third.net.bytebuddy.asm.Advice; +import com.fr.third.net.bytebuddy.implementation.bytecode.assign.Assigner; + +import java.lang.reflect.Method; + +/** + * created by Harrison on 2022/03/07 + **/ +public class TestThrowExceptionAdvice { + + @Advice.OnMethodExit(onThrowable = Exception.class) + public static void onMethodExit(@Advice.Origin Method method, + @Advice.AllArguments(typing = Assigner.Typing.DYNAMIC) Object[] arguments, + @Advice.Thrown(typing = Assigner.Typing.DYNAMIC) Exception e) throws Exception { + throw new RuntimeException("[test] throw exception in advice"); + } +} diff --git a/designer-base/src/test/java/com/fr/design/record/analyzer/TestTransferValueAdvice.java b/designer-base/src/test/java/com/fr/design/record/analyzer/TestTransferValueAdvice.java new file mode 100644 index 0000000000..fa0bf6f095 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/record/analyzer/TestTransferValueAdvice.java @@ -0,0 +1,37 @@ +package com.fr.design.record.analyzer; + +import com.fr.third.net.bytebuddy.asm.Advice; + +/** + * created by Harrison on 2022/03/07 + **/ +public class TestTransferValueAdvice { + + public static int intField; + + public static String stringField; + + public static Object objectField; + + @Advice.OnMethodEnter + public static void onMethodEnter(@Advice.Local("int") int intField, + @Advice.Local("string") String stringField, + @Advice.Local("Object") Object objectField) { + + intField = 10; + stringField = "[test]stringField"; + objectField = "[test]objectField"; + } + + @Advice.OnMethodExit(onThrowable = Exception.class) + public static void onMethodExit(@Advice.Local("int") int intField, + @Advice.Local("string") String stringField, + @Advice.Local("Object") Object objectField) throws Exception { + + TestTransferValueAdvice.intField = intField; + TestTransferValueAdvice.stringField = stringField; + TestTransferValueAdvice.objectField = objectField; + + } + +} diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java index 6b75dff693..6064ef89d0 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java @@ -29,6 +29,7 @@ import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.custom.VanChartCustomPlot; import com.fr.plugin.chart.vanchart.VanChart; +import com.fr.van.chart.drillmap.designer.data.VanChartDrillMapDataPane; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -148,7 +149,12 @@ public class ChartEditPane extends BasicPane implements AttributeChange, Prepare ChartInfoCollector.getInstance().updateChartPropertyTime(collection.getSelectedChartProvider(ChartProvider.class)); selectedPane.update(collection); - + for (int i = 0; i < paneList.size(); i++) { + if (paneList.get(i) instanceof VanChartDrillMapDataPane && i != tabsHeaderIconPane.getSelectedIndex()) { + paneList.get(i).populateBean(collection); + break; + } + } if (!ComparatorUtils.equals(collection, lastCollection)) { VanChart vanChart = collection.getSelectedChartProvider(VanChart.class); if (vanChart != null) { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotMoreCateReportDataContentPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotMoreCateReportDataContentPane.java index a9c6beda5e..427e241e60 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotMoreCateReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotMoreCateReportDataContentPane.java @@ -191,7 +191,6 @@ public class CategoryPlotMoreCateReportDataContentPane extends CategoryPlotRepor Plot plot = collection.getSelectedChart().getPlot(); if (definition instanceof NormalReportDataDefinition) { NormalReportDataDefinition reportDefinition = (NormalReportDataDefinition) definition; - reportDefinition.clearMoreCate(); updateMoreCate(reportDefinition, plot); ChartDataHelper.updateAxisCategoryStyles(collection); diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java index ca5a988559..7432dfcce1 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java @@ -258,5 +258,4 @@ public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableD } } } - } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java b/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java index 378e6a0d79..e0112f1865 100644 --- a/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java +++ b/designer-chart/src/main/java/com/fr/design/module/ChartHyperlinkGroup.java @@ -59,7 +59,7 @@ public class ChartHyperlinkGroup extends BaseHyperlinkGroup { return false; } - if (template.isJWorkBook() || DesignModeContext.isDuchampMode()) { + if (template.isJWorkBook()) { // 如果是普通报表单元格,那么没有 FormHyperlink 选项 FormHyperlinkProvider formHyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); //返回true表示可用,返回false表示不可用 diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java index b5efad3b66..f3a19a41e3 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java @@ -150,17 +150,19 @@ public class VanChartHyperLinkPane extends VanChartUIListControlPane { //安装平台内打开插件时,添加相应按钮 Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); - for (HyperlinkProvider provider : providers) { - NameableCreator nc = provider.createHyperlinkCreator(); - paneMap.put(nc.getHyperlink(), nc.getUpdatePane()); - } - java.util.List list = refreshList(paneMap); - NameObjectCreator[] creators = new NameObjectCreator[list.size()]; - for (int i = 0; list != null && i < list.size(); i++) { + int size = list.size(); + NameObjectCreator[] creators = new NameObjectCreator[size + providers.size()]; + for (int i = 0; i < size; i++) { UIMenuNameableCreator uiMenuNameableCreator = list.get(i); creators[i] = new NameObjectCreator(uiMenuNameableCreator.getName(), uiMenuNameableCreator.getObj().getClass(), uiMenuNameableCreator.getPaneClazz()); - + } + for (HyperlinkProvider provider : providers) { + NameableCreator creator = provider.createHyperlinkCreator(); + if (creator != null) { + creators[size] = new NameObjectCreator(creator.menuName(), creator.getHyperlink(), creator.getUpdatePane()); + size++; + } } refreshNameableCreator(creators); diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java index 31bb62531d..997af89c70 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java @@ -3,6 +3,7 @@ package com.fr.design.designer.beans.models; import com.fr.common.inputevent.InputEventBaseOnOS; import com.fr.design.ExtraDesignClassManager; import com.fr.design.base.clipboard.ClipboardFilter; +import com.fr.design.data.tabledata.paste.TableDataFollowingPasteUtils; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.events.DesignerEvent; @@ -188,12 +189,18 @@ public class SelectionModel { //已选 selectedPaste(); } + // 粘贴剪切板控件中的数据集 + pasteTableDataFromWidget(pasteSelection); } else { Toolkit.getDefaultToolkit().beep(); } return false; } + private void pasteTableDataFromWidget(FormSelection pasteSelection) { + TableDataFollowingPasteUtils.paste(pasteSelection.getSelectionUsedTablaData()); + } + public FormSelection getSelection() { return selection; } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormModelAdapter.java b/designer-form/src/main/java/com/fr/design/mainframe/FormModelAdapter.java index bf047a3bee..1230e0fae3 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormModelAdapter.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormModelAdapter.java @@ -2,6 +2,7 @@ package com.fr.design.mainframe; import com.fr.base.Parameter; import com.fr.base.TableData; +import com.fr.base.param.ParameterSource; import com.fr.data.TableDataSource; import com.fr.design.DesignModelAdapter; import com.fr.design.file.HistoryTemplateListPane; @@ -14,8 +15,8 @@ import com.fr.script.Calculator; import com.fr.stable.EmbParaFilter; import com.fr.stable.ParameterProvider; import com.fr.stable.js.WidgetName; - import com.fr.util.ParameterApplyHelper; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -55,7 +56,7 @@ public class FormModelAdapter extends DesignModelAdapter> Map map = new HashMap<>(); addGlobalParameters(map); updateTableDataParameters(oldName, tdName, tableData, map, parameterProvider -> !EmbParaFilter.isFRLayerTypePara(parameterProvider)); - ParameterApplyHelper.addPara2Map(map, this.getBook().getTemplateParameters()); + ParameterApplyHelper.addPara2Map(map, this.getBook().getTemplateParameters(), null, ParameterSource.DEFAULT_SOURCE); parameters = map.values().toArray(new Parameter[0]); jTemplate.populateParameter(); } @@ -158,7 +159,7 @@ public class FormModelAdapter extends DesignModelAdapter> addTableDataParameters(map, parameterProvider -> !EmbParaFilter.isFRLayerTypePara(parameterProvider)); - ParameterApplyHelper.addPara2Map(map, this.getBook().getTemplateParameters()); + ParameterApplyHelper.addPara2Map(map, this.getBook().getTemplateParameters(), null, ParameterSource.DEFAULT_SOURCE); return map.values().toArray(new Parameter[0]); } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormSelection.java b/designer-form/src/main/java/com/fr/design/mainframe/FormSelection.java index ee7918e50f..e7b0390e08 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormSelection.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormSelection.java @@ -1,5 +1,7 @@ package com.fr.design.mainframe; +import com.fr.base.TableData; +import com.fr.design.data.tabledata.paste.TableDataFollowingPasteUtils; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.adapters.layout.FRAbsoluteLayoutAdapter; @@ -7,12 +9,10 @@ import com.fr.design.designer.beans.location.Direction; import com.fr.design.designer.creator.XComponent; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreatorUtils; -import com.fr.design.designer.creator.XElementCase; import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWAbsoluteLayout; import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.designer.creator.XWParameterLayout; -import com.fr.design.designer.creator.XWTitleLayout; import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; import com.fr.design.designer.creator.cardlayout.XWCardTagLayout; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; @@ -22,11 +22,12 @@ import com.fr.design.utils.gui.LayoutUtils; import com.fr.form.ui.Widget; import com.fr.log.FineLoggerFactory; -import java.awt.Component; import java.awt.LayoutManager; import java.awt.Rectangle; import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedList; +import java.util.Map; public class FormSelection { @@ -35,6 +36,7 @@ public class FormSelection { private ArrayList recs = new ArrayList(); // 选中的组件外层嵌套的tab块 head->tail 由内向外 private LinkedList tabList = new LinkedList<>(); + private Map selectionUsedTablaData = new HashMap<>(); public FormSelection() { selection = new ArrayList(); @@ -51,6 +53,7 @@ public class FormSelection { ((XWCardMainBorderLayout) xCreator).setShowOuterShadowBorder(false); } selection.clear(); + selectionUsedTablaData.clear(); } /** @@ -362,8 +365,13 @@ public class FormSelection { public void cut2ClipBoard(FormSelection clipBoard) { clipBoard.reset(); clipBoard.selection.addAll(selection); - for (XCreator creator : selection) { + try { + // 剪切时,添加剪切组件的数据集到usedTablaDataMap中 + clipBoard.addUsedTablaData((Widget) creator.toData().clone()); + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } removeCreatorFromContainer(creator); } reset(); @@ -382,15 +390,26 @@ public class FormSelection { continue; } try { - XCreator creator = XCreatorUtils.createXCreator((Widget) root.toData().clone()); + Widget clone = (Widget) root.toData().clone(); + XCreator creator = XCreatorUtils.createXCreator(clone); creator.setBounds(root.getBounds()); clipBoard.selection.add(creator); + // 复制时,添加复制组件的数据集到usedTablaDataMap中 + clipBoard.addUsedTablaData(clone); } catch (CloneNotSupportedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } } + private void addUsedTablaData(Widget widget) { + this.selectionUsedTablaData.putAll(TableDataFollowingPasteUtils.transferWidgetArray2TableDataMap(widget)); + } + + public Map getSelectionUsedTablaData() { + return selectionUsedTablaData; + } + public LinkedList getTabList() { return tabList; } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopDialog.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopDialog.java index be2d724667..bb600674b1 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopDialog.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopDialog.java @@ -1,15 +1,13 @@ package com.fr.design.mainframe.share.ui.online.mini; -import com.fr.base.ScreenResolution; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.share.mini.MiniShopDisposingChecker; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.stable.Constants; -import com.fr.stable.unit.FU; -import com.fr.stable.unit.UNIT; import javax.swing.JFrame; import java.awt.Container; +import java.awt.GraphicsEnvironment; +import java.awt.Rectangle; import java.awt.Window; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; @@ -36,10 +34,11 @@ public class MiniComponentShopDialog { final JFrame frame = new JFrame(); final MiniComponentShopPane shopPane = new MiniComponentShopPane(); - final UNIT width = FU.getInstance(900 * Constants.FU_PER_OLD_PIX); - final UNIT height = FU.getInstance(600 * Constants.FU_PER_OLD_PIX); - int resolution = ScreenResolution.getScreenResolution(); - frame.setSize(width.toPixI(resolution), height.toPixI(resolution)); + GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment(); + Rectangle rect =ge.getMaximumWindowBounds(); + int width = (int) (rect.width * 0.8); + int height = (int) (rect.height * 0.9); + frame.setSize(width, height); frame.setTitle(Toolkit.i18nText("Fine-Design_Share_Online_Mini_Shop_Window_Title")); frame.add(shopPane); frame.setResizable(false); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java index e6a4f720cc..4cb985b5af 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java @@ -254,9 +254,9 @@ public class NativeProductBridge { MiniComponentShopDialog.getInstance().getContentPane(), Toolkit.i18nText("Fine-Design_Share_Online_Mini_Shop_Download_Incompatible_Component_Tip"), "", - FineJOptionPane.YES_NO_OPTION + FineJOptionPane.OK_CANCEL_OPTION ); - allowedDownload = result == JOptionPane.YES_OPTION; + allowedDownload = result == JOptionPane.OK_OPTION; } if (allowedDownload) { fireStartEvent(null); @@ -353,33 +353,14 @@ public class NativeProductBridge { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - boolean allowedDownload; - OnlineShareWidget[] childrenWidgets = OnlineShopUtils.getPackageWidgets(widget, false); - boolean isCompatibleWithCurrentEnv = true; - for (OnlineShareWidget children: childrenWidgets) { - if (!children.isCompatibleWithCurrentEnv()) { - isCompatibleWithCurrentEnv = false; - break; - } - } - int result; - if (!isCompatibleWithCurrentEnv) { - result = FineJOptionPane.showConfirmDialog( - MiniComponentShopDialog.getInstance().getContentPane(), - Toolkit.i18nText("Fine-Design_Share_Online_Mini_Shop_Download_Incompatible_Components_Package_Tip", childrenCount), - "", - FineJOptionPane.YES_NO_OPTION - ); - } else { - result = FineJOptionPane.showConfirmDialog( - MiniComponentShopDialog.getInstance().getContentPane(), - Toolkit.i18nText("Fine-Design_Share_Online_Mini_Shop_Download_Components_Package_Tip", childrenCount), - "", - FineJOptionPane.YES_NO_OPTION - ); - } - allowedDownload = result == JOptionPane.YES_OPTION; - if (allowedDownload) { + OnlineShareWidget[] childrenWidgets = OnlineShopUtils.getPackageWidgets(widget, true); + int result = FineJOptionPane.showConfirmDialog( + MiniComponentShopDialog.getInstance().getContentPane(), + Toolkit.i18nText("Fine-Design_Share_Online_Mini_Shop_Download_Components_Package_Tip", childrenWidgets.length), + "", + FineJOptionPane.OK_CANCEL_OPTION + ); + if (result == JOptionPane.OK_OPTION) { fireStartEvent(null); action.install(); } else { diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/TreeEditorDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/TreeEditorDefinePane.java index 3c7158f828..e4d99802c1 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/TreeEditorDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/TreeEditorDefinePane.java @@ -76,7 +76,7 @@ public class TreeEditorDefinePane extends CustomWritableRepeatEditorPane elementUsedTableDatas; public CellElementsClip(int columnSpan, int rowSpan, FU[] columnWidth, FU[] rowHeight, TemplateCellElement[] clips) { this.columnSpan = columnSpan; @@ -34,12 +38,14 @@ public class CellElementsClip implements Cloneable, java.io.Serializable { this.columnWidth = columnWidth; this.rowHeight = rowHeight; this.clips = clips; + this.elementUsedTableDatas = TableDataFollowingPasteUtils.transferProvider2TableDataMap(clips); } public CellElementsClip(int columnSpan, int rowSpan, TemplateCellElement[] clips) { this.columnSpan = columnSpan; this.rowSpan = rowSpan; this.clips = clips; + this.elementUsedTableDatas = TableDataFollowingPasteUtils.transferProvider2TableDataMap(clips); } public int getColumnSpan() { @@ -136,6 +142,8 @@ public class CellElementsClip implements Cloneable, java.io.Serializable { if (this.columnWidth != null && this.rowHeight != null) { pasteWidthAndHeight(ec, column, row, columnSpan, rowSpan); } + // 粘贴数据集 + TableDataFollowingPasteUtils.paste(elementUsedTableDatas); return new CellSelection(column, row, columnSpan, rowSpan); } @@ -163,6 +171,8 @@ public class CellElementsClip implements Cloneable, java.io.Serializable { } ec.addCellElement(cellElement); + // 跟随粘贴数据集 + TableDataFollowingPasteUtils.paste(elementUsedTableDatas); } } @@ -182,4 +192,4 @@ public class CellElementsClip implements Cloneable, java.io.Serializable { return cloned; } -} \ No newline at end of file +} diff --git a/designer-realize/src/main/java/com/fr/design/cell/clipboard/FloatElementsClip.java b/designer-realize/src/main/java/com/fr/design/cell/clipboard/FloatElementsClip.java index 7dc7fd80b9..3c1f54e338 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/clipboard/FloatElementsClip.java +++ b/designer-realize/src/main/java/com/fr/design/cell/clipboard/FloatElementsClip.java @@ -3,7 +3,9 @@ */ package com.fr.design.cell.clipboard; +import com.fr.base.TableData; import com.fr.design.cell.FloatElementsProvider; +import com.fr.design.data.tabledata.paste.TableDataFollowingPasteUtils; import com.fr.general.ComparatorUtils; import com.fr.grid.selection.FloatSelection; import com.fr.log.FineLoggerFactory; @@ -14,21 +16,25 @@ import com.fr.stable.unit.FU; import com.fr.stable.unit.OLDPIX; import java.util.Iterator; +import java.util.Map; /** * The clip of Float Element. */ -public class FloatElementsClip implements Cloneable, java.io.Serializable,FloatElementsProvider { +public class FloatElementsClip implements Cloneable, java.io.Serializable, FloatElementsProvider { private FloatElement floatEl; - public FloatElementsClip(FloatElement floatEl) { - this.floatEl = floatEl; - } - - /** - * 悬浮元素的粘贴 - * - * @param ec 单元格 + private Map elementUsedTableDatas; + + public FloatElementsClip(FloatElement floatEl) { + this.floatEl = floatEl; + this.elementUsedTableDatas = TableDataFollowingPasteUtils.transferProvider2TableDataMap(floatEl); + } + + /** + * 悬浮元素的粘贴 + * + * @param ec 单元格 * @return 粘贴的悬浮元素 */ public FloatSelection pasteAt(TemplateElementCase ec) { @@ -46,7 +52,7 @@ public class FloatElementsClip implements Cloneable, java.io.Serializable,FloatE while (ec.getFloatElement(ret.getName()) != null) { ret.setName(ret.getName() + "-Copy"); } - + while (true) { if (isContainSameBoundFloatElement(ec, ret)) { ret.setTopDistance(FU.getInstance(ret.getTopDistance().toFU() + new OLDPIX(50).toFU())); @@ -55,11 +61,12 @@ public class FloatElementsClip implements Cloneable, java.io.Serializable,FloatE break; } } - + ec.addFloatElement(ret); - + // 跟随粘贴数据集 + TableDataFollowingPasteUtils.paste(elementUsedTableDatas); return new FloatSelection(ret.getName()); - } + } /** * Contain same location and bounds FloatElement. @@ -100,4 +107,4 @@ public class FloatElementsClip implements Cloneable, java.io.Serializable,FloatE return cloned; } -} \ No newline at end of file +} diff --git a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java index 32818de9f7..91c8fa292c 100644 --- a/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java +++ b/designer-realize/src/main/java/com/fr/design/dscolumn/DSColumnAdvancedPane.java @@ -1,16 +1,14 @@ package com.fr.design.dscolumn; import com.fr.base.BaseFormula; -import com.fr.data.util.SortOrder; import com.fr.design.border.UITitledBorder; -import com.fr.design.constants.LayoutConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.formula.CustomVariableResolver; import com.fr.design.formula.FormulaFactory; -import com.fr.design.formula.SortFormulaPane; import com.fr.design.formula.UIFormula; +import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; @@ -30,11 +28,19 @@ import com.fr.report.cell.cellattr.CellExpandAttr; import com.fr.report.cell.cellattr.core.group.DSColumn; import com.fr.report.cell.cellattr.core.group.SelectCount; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.Arrays; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.BOTTOM; import static com.fr.report.cell.cellattr.core.group.FilterTypeEnum.SPECIFY; @@ -512,11 +518,12 @@ public class DSColumnAdvancedPane extends BasicPane { } } - public static class FormatAttrPane extends TextFormatPane { + + public static class ReLayoutTextFormatPane extends TextFormatPane { protected void initLayout() { - JComponent[][] components = new JComponent[][]{{typeComboBox, textField, roundingBox}}; - double[] rowSize = new double[]{TableLayout.FILL}; + JComponent[][] components = new JComponent[][] { {typeComboBox, textField, roundingBox} }; + double[] rowSize = new double[] { TableLayout.FILL }; double[] columnSize = {TableLayout.PREFERRED, 200, TableLayout.PREFERRED}; JPanel settingPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 4, 0); @@ -542,6 +549,44 @@ public class DSColumnAdvancedPane extends BasicPane { } } + public static class FormatAttrPane extends AbstractAttrNoScrollPane { + private TextFormatPane formatPane; + + @Override + protected JPanel createContentPane() { + this.formatPane = new ReLayoutTextFormatPane(); + return this.formatPane; + } + + @Override + public Dimension getPreferredSize() { + if (formatPane == null) { + return super.getPreferredSize(); + } + return formatPane.getPreferredSize(); + } + + protected void initContentPane() { + leftContentPane = createContentPane(); + if (leftContentPane != null) { + leftContentPane.setBorder(BorderFactory.createEmptyBorder()); + this.add(leftContentPane, BorderLayout.CENTER); + } + } + + public void populate(CellElement cellElement) { + if (cellElement != null && formatPane != null) { + formatPane.populateBean(cellElement.getStyle()); + } + } + + public void update(CellElement cellElement) { + if (cellElement != null && formatPane != null) { + cellElement.setStyle(formatPane.update(cellElement.getStyle())); + } + } + } + private void checkButtonEnabled() { if (useMultiplyNumCheckBox.isSelected()) { multiNumSpinner.setEnabled(true); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/HyperlinkGroupPaneActionImpl.java b/designer-realize/src/main/java/com/fr/design/mainframe/HyperlinkGroupPaneActionImpl.java index d90b7e8ec3..6de49767ad 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/HyperlinkGroupPaneActionImpl.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/HyperlinkGroupPaneActionImpl.java @@ -18,6 +18,7 @@ import com.fr.report.cell.FloatElement; import com.fr.report.elementcase.TemplateElementCase; import com.fr.stable.Constants; +import javax.swing.event.ListDataEvent; import java.awt.Color; /** @@ -86,7 +87,12 @@ public class HyperlinkGroupPaneActionImpl implements HyperlinkGroupPaneActionPro frFont = frFont.applyForeground(AdjustWorkBookDefaultStyleUtils.adjustCellElementFontForeground(Color.black)); frFont = frFont.applyUnderline(Constants.LINE_NONE); } - editCellElement.setStyle(elementStyle.deriveFRFont(frFont)); + + // 首次添加超链接,将文字样式默认改为蓝色下划线 + if (updateNameHyperlinks.size() == 1 && hyperlinkGroupPane.getCurrentEvent() != null && hyperlinkGroupPane.getCurrentEvent().getType() == ListDataEvent.INTERVAL_ADDED) { + editCellElement.setStyle(elementStyle.deriveFRFont(frFont)); + } + try { editCellElement.setNameHyperlinkGroup((NameJavaScriptGroup) updateNameHyperlinks.clone()); } catch (CloneNotSupportedException e) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/WorkBookModelAdapter.java b/designer-realize/src/main/java/com/fr/design/mainframe/WorkBookModelAdapter.java index 53f193be74..6cbc0142ed 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/WorkBookModelAdapter.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/WorkBookModelAdapter.java @@ -2,6 +2,7 @@ package com.fr.design.mainframe; import com.fr.base.Parameter; import com.fr.base.TableData; +import com.fr.base.param.ParameterSource; import com.fr.data.TableDataSource; import com.fr.design.DesignModelAdapter; import com.fr.design.bridge.DesignToolbarProvider; @@ -17,8 +18,8 @@ import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; import com.fr.stable.bridge.StableFactory; import com.fr.stable.js.WidgetName; - import com.fr.util.ParameterApplyHelper; + import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -139,7 +140,7 @@ public class WorkBookModelAdapter extends DesignModelAdapter{ - public FormElementCasePaneDelegate(FormElementCase sheet, Form form) { + this(sheet, form.getFormMobileAttr().isMobileOnly(), LightTool.containNewFormFlag(form)); + } + + public FormElementCasePaneDelegate(FormElementCase sheet, boolean isMobileOnly, boolean isNewForm) { super(sheet); - this.getGrid().setPaginateLineShowType(form.getFormMobileAttr().isMobileOnly() + this.getGrid().setPaginateLineShowType(isMobileOnly ? Grid.SINGLE_HORIZONTAL_PAGINATE_LINE : Grid.NO_PAGINATE_LINE); - if (LightTool.containNewFormFlag(form)){ + if (isNewForm){ this.getGrid().setCellElementPainter(new NewUIModeCellElementPainter()); } this.addSelectionChangeListener(new SelectionListener() { @@ -68,8 +72,17 @@ public class FormElementCasePaneDelegate extends ElementCasePane template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (!(template instanceof JForm)) { + return rectangle; + } + + FormDesigner designer = ((JForm) template).getFormDesign(); + if (designer == null) { + return rectangle; + } + XElementCase xElementCase = FormDesignerUtil.getXelementCase(designer.getRootComponent(), (FormElementCase) elementCase); if (xElementCase != null) { rectangle.setBounds(xElementCase.getBounds()); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java index 05c3b13ec0..5fdc4b011b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormReportComponentComposite.java @@ -2,7 +2,6 @@ package com.fr.design.mainframe.form; import com.fr.base.DynamicUnitList; import com.fr.base.ScreenResolution; -import com.fr.common.inputevent.InputEventBaseOnOS; import com.fr.design.cell.bar.DynamicScrollBar; import com.fr.design.event.TargetModifiedEvent; import com.fr.design.event.TargetModifiedListener; @@ -11,9 +10,11 @@ import com.fr.design.mainframe.BaseJForm; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerUIModeConfig; import com.fr.design.mainframe.ElementCasePane; +import com.fr.design.mainframe.JDashboard; +import com.fr.design.mainframe.JForm; import com.fr.design.mainframe.JFormSliderPane; -import com.fr.design.mainframe.ReportComponent; -import com.fr.design.mainframe.ReportComponentCompositeMouseWheelHandler; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.JTemplateProvider; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.form.FormElementCaseContainerProvider; import com.fr.form.FormElementCaseProvider; @@ -24,11 +25,11 @@ import com.fr.report.worksheet.FormElementCase; import com.fr.stable.AssistUtils; import com.fr.stable.Constants; -import javax.swing.*; +import javax.swing.JComponent; +import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import java.awt.*; -import java.awt.event.*; +import java.awt.BorderLayout; /** * 整个FormElementCase编辑区域 包括滚动条、中间的grid或者聚合块、下面的sheetTab @@ -40,19 +41,19 @@ public class FormReportComponentComposite extends JComponent implements TargetMo private static final int MIN = 10; private static final int DIR = 10; private static final double MIN_TIME = 0.4; - public FormElementCaseDesigner elementCaseDesigner; - private BaseJForm jForm; + public final FormElementCaseDesigner elementCaseDesigner; + private final JTemplateProvider jTemplate; - private FormTabPane sheetNameTab; + private final FormTabPane sheetNameTab; private JPanel hbarContainer; private JFormSliderPane jSliderContainer; - public FormReportComponentComposite(BaseJForm jform, FormElementCaseDesigner elementCaseDesign, FormElementCaseContainerProvider ecContainer) { - this.jForm = jform; + public FormReportComponentComposite(JTemplateProvider jTemplate, JDashboard jDashboard, FormElementCaseDesigner elementCaseDesign, String ecContainerName) { + this.jTemplate = jTemplate; this.setLayout(FRGUIPaneFactory.createBorderLayout()); this.elementCaseDesigner = elementCaseDesign; this.add(elementCaseDesigner, BorderLayout.CENTER); - sheetNameTab = new FormTabPane(ecContainer, jform); + sheetNameTab = new FormTabPane(ecContainerName, jDashboard); this.add(createSouthControlPane(), BorderLayout.SOUTH); jSliderContainer.addValueChangeListener(showValSpinnerChangeListener); this.elementCaseDesigner.elementCasePane.getGrid().addMouseWheelListener(new FormReportComponentCompositeMouseWheelHandler(this)); @@ -60,6 +61,10 @@ public class FormReportComponentComposite extends JComponent implements TargetMo this.jSliderContainer.setShowValue((ScreenResolution.getScreenResolution() * HUND) / Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION); } + public FormReportComponentComposite(BaseJForm jform, FormElementCaseDesigner elementCaseDesign, FormElementCaseContainerProvider ecContainer) { + this(jform, jform, elementCaseDesign, ecContainer.getElementCaseContainerName()); + } + ChangeListener showValSpinnerChangeListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { @@ -167,7 +172,7 @@ public class FormReportComponentComposite extends JComponent implements TargetMo } public void setComposite() { - DesignerContext.getDesignerFrame().resetToolkitByPlus((ToolBarMenuDockPlus) jForm); + DesignerContext.getDesignerFrame().resetToolkitByPlus((ToolBarMenuDockPlus) jTemplate); this.validate(); this.repaint(40); } @@ -182,7 +187,7 @@ public class FormReportComponentComposite extends JComponent implements TargetMo * 模板更新 */ public void fireTargetModified() { - jForm.fireTargetModified(); + jTemplate.fireTargetModified(); } public JFormSliderPane getSliderContainer() { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormTabPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormTabPane.java index f158b39360..dca7029047 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormTabPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormTabPane.java @@ -5,6 +5,7 @@ import com.fr.base.GraphHelper; import com.fr.design.constants.UIConstants; import com.fr.design.mainframe.BaseJForm; +import com.fr.design.mainframe.JDashboard; import com.fr.form.FormElementCaseContainerProvider; @@ -27,8 +28,8 @@ public class FormTabPane extends JComponent implements MouseListener, MouseMotio private static final int GAP = 5; //间隔 - private BaseJForm form; - private FormElementCaseContainerProvider elementCase; + private JDashboard jDashboard; + private final String elementCaseContainerName; //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 private double specialLocation1 = 2.5; @@ -48,8 +49,12 @@ public class FormTabPane extends JComponent implements MouseListener, MouseMotio private int selectedIndex = -1; public FormTabPane(FormElementCaseContainerProvider elementCase, BaseJForm form){ - this.elementCase = elementCase; - this.form = form; + this(elementCase.getElementCaseContainerName(), form); + } + + public FormTabPane(String elementCaseContainerName, JDashboard jDashboard){ + this.elementCaseContainerName = elementCaseContainerName; + this.jDashboard = jDashboard; this.setLayout(new BorderLayout(0, 0)); this.addMouseListener(this); this.addMouseMotionListener(this); @@ -57,12 +62,16 @@ public class FormTabPane extends JComponent implements MouseListener, MouseMotio this.setForeground(new Color(99, 99, 99)); } + public String getElementCaseContainerName() { + return elementCaseContainerName; + } + public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; calculateECWidth(); paintFormTab(g2d, 0, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Form"), POLY_SHEET_ICON); - paintECTab(g2d, formTabWidth, elementCase.getElementCaseContainerName(), WORK_SHEET_ICON); + paintECTab(g2d, formTabWidth, getElementCaseContainerName(), WORK_SHEET_ICON); } /** @@ -165,7 +174,7 @@ public class FormTabPane extends JComponent implements MouseListener, MouseMotio private void calculateECWidth() { FontMetrics fm = GraphHelper.getFontMetrics(this.getFont()); int charWidth = fm.charWidth('M'); - String ECName = elementCase.getElementCaseContainerName(); + String ECName = getElementCaseContainerName(); ecTabWidth = Math.max(ecTabWidth,fm.stringWidth(ECName) + charWidth * 2 + ADD_WIDTH_BY_SHEETNAME) ; } @@ -177,7 +186,7 @@ public class FormTabPane extends JComponent implements MouseListener, MouseMotio public void mouseClicked(MouseEvent e) { selectedIndex = getTabIndex(e.getX()); if (selectedIndex == FORM_INDEX) { - form.tabChanged(FORM_INDEX); + jDashboard.switchToDashBoardEditor(); } repaint(); } diff --git a/designer-realize/src/main/java/com/fr/design/sort/header/HeaderAreaPane.java b/designer-realize/src/main/java/com/fr/design/sort/header/HeaderAreaPane.java index 25641340cb..d7c9aab40c 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/header/HeaderAreaPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/header/HeaderAreaPane.java @@ -208,7 +208,9 @@ public class HeaderAreaPane extends JPanel { if (isNotSelectables(headerColumnRow)) { SortHeader sortHeader = templateCellElement.getCellExpandAttr().getCellSortAttr().getSortHeader(); headerColumnRow = ColumnRow.ERROR; - sortHeader.setHeaderArea(headerColumnRow.toString()); + if (sortHeader != null) { + sortHeader.setHeaderArea(headerColumnRow.toString()); + } } else { handleDisableHeaderCell(templateCellElement); } diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/TreeComboBoxEditorDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/TreeComboBoxEditorDefinePane.java index 881e832fb8..f8ddeeca2f 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/TreeComboBoxEditorDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/TreeComboBoxEditorDefinePane.java @@ -48,7 +48,7 @@ public class TreeComboBoxEditorDefinePane extends CustomWritableRepeatEditorPane } - + @Override protected String title4PopupWindow() { return "treecombobox"; @@ -56,20 +56,20 @@ public class TreeComboBoxEditorDefinePane extends CustomWritableRepeatEditorPane @Override protected void populateSubCustomWritableRepeatEditorBean(TreeEditor e) { - treeSettingPane.setValue(e.getNodeOrDict()); + treeSettingPane.setValue(e.getBuildModelConfig()); treeRootPane.populate(e.getTreeAttr()); } @Override protected TreeComboBoxEditor updateSubCustomWritableRepeatEditorBean() { TreeComboBoxEditor editor = new TreeComboBoxEditor(); - editor.setNodeOrDict(treeSettingPane.getValue()); + editor.setBuildModelConfig(treeSettingPane.getValue()); editor.setTreeAttr(treeRootPane.update()); return editor; } - @Override - public DataCreatorUI dataUI() { - return null; - } + @Override + public DataCreatorUI dataUI() { + return null; + } } \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/widget/ui/TreeEditorDefinePane.java b/designer-realize/src/main/java/com/fr/design/widget/ui/TreeEditorDefinePane.java index 6d6e1d4a87..89e54cdc8d 100644 --- a/designer-realize/src/main/java/com/fr/design/widget/ui/TreeEditorDefinePane.java +++ b/designer-realize/src/main/java/com/fr/design/widget/ui/TreeEditorDefinePane.java @@ -25,12 +25,12 @@ public class TreeEditorDefinePane extends FieldEditorDefinePane { private UICheckBox removeRepeatCheckBox; public TreeEditorDefinePane(){ - this.initComponents(); + this.initComponents(); } @Override protected void populateSubFieldEditorBean(TreeEditor e) { - this.accessibleTreeModelEditor.setValue(e.getNodeOrDict()); + this.accessibleTreeModelEditor.setValue(e.getBuildModelConfig()); treeRootPane.populate(e.getTreeAttr()); if (this.removeRepeatCheckBox != null) { this.removeRepeatCheckBox.setSelected(e.isRemoveRepeat()); @@ -40,7 +40,7 @@ public class TreeEditorDefinePane extends FieldEditorDefinePane { @Override protected TreeEditor updateSubFieldEditorBean() { TreeEditor editor = new TreeEditor(); - editor.setNodeOrDict(accessibleTreeModelEditor.getValue()); + editor.setBuildModelConfig(accessibleTreeModelEditor.getValue()); editor.setTreeAttr(treeRootPane.update()); if (this.removeRepeatCheckBox != null) { editor.setRemoveRepeat(this.removeRepeatCheckBox.isSelected()); @@ -50,8 +50,8 @@ public class TreeEditorDefinePane extends FieldEditorDefinePane { @Override protected JPanel setFirstContentPane() { - return this.setSecondContentPane(); - } + return this.setSecondContentPane(); + } protected JPanel setSecondContentPane() { accessibleTreeModelEditor = new AccessibleTreeModelEditor(); @@ -80,14 +80,14 @@ public class TreeEditorDefinePane extends FieldEditorDefinePane { content.add(treeRootPane, BorderLayout.NORTH); return content; } - + @Override protected String title4PopupWindow() { return "tree"; } - @Override - public DataCreatorUI dataUI() { - return null; - } + @Override + public DataCreatorUI dataUI() { + return null; + } } \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/grid/Grid.java b/designer-realize/src/main/java/com/fr/grid/Grid.java index d1f3881389..fb18ac07fd 100644 --- a/designer-realize/src/main/java/com/fr/grid/Grid.java +++ b/designer-realize/src/main/java/com/fr/grid/Grid.java @@ -1095,6 +1095,7 @@ public class Grid extends BaseGridComponent { TemplateCellElement cellElement = (TemplateCellElement) newValue; editingCellElement.setValue(cellElement.getValue()); editingCellElement.setCellExpandAttr(cellElement.getCellExpandAttr()); + editingCellElement.setStyle(cellElement.getStyle()); return true; } else if (newValue instanceof CellImage) { CellImage cellImage = (CellImage) newValue; diff --git a/designer-realize/src/main/java/com/fr/poly/creator/ECBlockPane.java b/designer-realize/src/main/java/com/fr/poly/creator/ECBlockPane.java index 33bcda20a6..d18e521106 100644 --- a/designer-realize/src/main/java/com/fr/poly/creator/ECBlockPane.java +++ b/designer-realize/src/main/java/com/fr/poly/creator/ECBlockPane.java @@ -62,7 +62,7 @@ public class ECBlockPane extends PolyElementCasePane { @Override public void selectionChanged(SelectionEvent e) { - if (!isEditable() && !DesignModeContext.isAuthorityEditing()) { + if (!isEditable()) { return; } if (DesignModeContext.isAuthorityEditing()) { diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java index 23015e9d09..1c50499f77 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java @@ -282,7 +282,7 @@ public class CellDSColumnEditor extends CellQuickEditor { private void initComponents(){ dataPane = new SelectedDataColumnPane(true, true); groupPane = new ResultSetGroupDockingPane(); - + initListener(); double[] rowSize = {P}, columnSize = {60, F}; UILabel uiLabel = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Report_Filter_Conditions")); condition = new DSColumnConditionAction(); @@ -299,6 +299,35 @@ public class CellDSColumnEditor extends CellQuickEditor { conditionPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, HGAP, VGAP); this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); } + + + private void initListener() { + dataPane.setListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.SELECTED) { + dataPane.update(cellElement); + fireTargetModified(); + } + } + }); + groupPane.setListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + if (e == null) { + //分组-高级-自定义点确定的时候传进来null的e,但是这时候应该触发保存 + groupPane.update(); + fireTargetModified(); + return; + } + if (e.getStateChange() == ItemEvent.DESELECTED) { + groupPane.update(); + fireTargetModified(); + } + } + }); + } + @Override protected AttributeChangeListener getAttributeChangeListener() { return new AttributeChangeListener() { @@ -442,6 +471,7 @@ public class CellDSColumnEditor extends CellQuickEditor { @Override public void attributeChange() { update(); + checkButtonEnabled(); fireTargetModified(); } }; diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index e29a4e804a..f60003c9a1 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -16,6 +16,7 @@ import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.fun.MenuHandler; +import com.fr.design.fun.OemProcessor; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIPreviewButton; import com.fr.design.gui.ibutton.UISaveForbiddenButton; @@ -42,6 +43,7 @@ import com.fr.design.module.DesignModuleFactory; import com.fr.design.monitor.DesignerLifecycleMonitorContext; import com.fr.design.notification.ui.NotificationCenterPane; import com.fr.design.share.SharableManager; +import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.concurrent.ThreadFactoryBuilder; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.env.utils.DesignerInteractionHistory; @@ -59,6 +61,7 @@ import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.lifecycle.FineLifecycleFatalError; import com.fr.stable.xml.XMLTools; +import com.fr.start.common.SplashCommon; import com.fr.start.module.StartupArgs; import com.fr.start.server.ServerTray; import com.fr.third.org.apache.commons.lang3.time.StopWatch; @@ -106,7 +109,8 @@ public class MainDesigner extends BaseDesigner { * @param args 参数 */ public static void main(String[] args) { - + + showSplash(); DeepLinkManager.getInstance().start(args); StopWatch watch = new StopWatch(); watch.start(); @@ -136,7 +140,18 @@ public class MainDesigner extends BaseDesigner { FineLoggerFactory.getLogger().info("Designer started.Time used {} ms", watch.getTime()); watch.stop(); } - + + private static void showSplash() { + // 快快显示启动画面 + UIUtil.invokeAndWaitIfNeeded(new Runnable() { + @Override + public void run() { + SplashContext.getInstance().registerSplash(createSplash()); + SplashContext.getInstance().show(); + } + }); + } + /** * 创建新建文件的快捷方式数组。 * @@ -528,5 +543,22 @@ public class MainDesigner extends BaseDesigner { DesignerInteractionHistory historyCollector = DesignerInteractionHistory.getInstance(); historyCollector.saveXMLFile(); } - + + private static SplashStrategy createSplash() { + + OemProcessor oemProcessor = OemHandler.findOem(); + if (oemProcessor != null) { + SplashStrategy splashStrategy = null; + try { + splashStrategy = oemProcessor.createSplashStrategy(); + } catch (Throwable e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + if (splashStrategy != null) { + return splashStrategy; + } + } + + return new SplashCommon(); + } } diff --git a/designer-realize/src/main/java/com/fr/start/SplashContext.java b/designer-realize/src/main/java/com/fr/start/SplashContext.java index d425d726ca..cc9eb19336 100644 --- a/designer-realize/src/main/java/com/fr/start/SplashContext.java +++ b/designer-realize/src/main/java/com/fr/start/SplashContext.java @@ -36,7 +36,7 @@ public class SplashContext { private SplashStrategy splashStrategy; - private String moduleId = ""; + private String moduleId = Toolkit.i18nText("Fine-Design_Basic_Initializing"); private int loadingIndex = 0; private String[] loading = new String[]{"..", "....", "......"}; diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index eea3360bae..93d9f98eed 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -3,6 +3,7 @@ package com.fr.start.module; import com.fr.base.BaseFormula; import com.fr.base.Formula; import com.fr.base.MultiFieldParameter; +import com.fr.base.OptimizeUtil; import com.fr.base.passport.FinePassportListenerAdapter; import com.fr.base.passport.FinePassportManager; import com.fr.base.process.ProcessOperator; @@ -12,6 +13,8 @@ import com.fr.chart.chartattr.ChartCollection; import com.fr.config.MarketConfig; import com.fr.config.ServerPreferenceConfig; import com.fr.decision.update.backup.RecoverManager; +import com.fr.decision.webservice.v10.plugin.helper.category.impl.PluginResourceLoader; +import com.fr.decision.webservice.v10.plugin.helper.category.impl.UpmResourceLoader; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.NewFormAction; @@ -78,7 +81,10 @@ import com.fr.design.share.ui.generate.ShareGeneratePane; import com.fr.design.update.actions.RecoverForDesigner; import com.fr.design.update.push.DesignerPushUpdateManager; import com.fr.design.widget.ui.btn.FormSubmitButtonDetailPane; +import com.fr.event.Event; import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.event.Null; import com.fr.general.GeneralContext; import com.fr.general.xml.GeneralXMLTools; import com.fr.js.EmailJavaScript; @@ -157,6 +163,8 @@ public class DesignerActivator extends Activator implements Prepare { @Override public void start() { + + startLoginAuthServer(); migrateBBSInfoFromFineDB(); FormThemeConfigMigrator.getInstance().upgrade(); ReportThemeConfigMigrator.getInstance().upgrade(); @@ -180,6 +188,8 @@ public class DesignerActivator extends Activator implements Prepare { AlphaFineHelper.switchConfig4Locale(); RecoverManager.register(new RecoverForDesigner()); pushUpdateTask.run(); + PluginResourceLoader.INSTANCE.checkOldShopFile(); + UpmResourceLoader.INSTANCE.checkOldShopFile(); } @Override @@ -484,7 +494,23 @@ public class DesignerActivator extends Activator implements Prepare { @Override public void prepare() { - LoginAuthServer.getInstance().start(); + + OptimizeUtil.close(() -> { + LoginAuthServer.getInstance().compatibleStart(); + }); ContentReplacerCenter.getInstance().register(); } + + private void startLoginAuthServer() { + + OptimizeUtil.open(() -> { + // 设计器启动后启动 + EventDispatcher.listen(DesignerLaunchStatus.STARTUP_COMPLETE, new Listener() { + @Override + public void on(Event event, Null param) { + LoginAuthServer.getInstance().start(); + } + }); + }); + } } diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index 56af5583f5..46218b91af 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -1,36 +1,39 @@ package com.fr.start.module; +import com.fr.base.OptimizeUtil; import com.fr.concurrent.NamedThreadFactory; +import com.fr.config.dao.DaoSelectorFactory; +import com.fr.decision.webservice.v10.encryption.EncryptionConstants; import com.fr.design.DesignerEnvManager; import com.fr.design.RestartHelper; import com.fr.design.dialog.TipDialog; -import com.fr.design.fun.OemProcessor; +import com.fr.design.env.DesignerWorkspaceInfo; +import com.fr.design.env.DesignerWorkspaceType; import com.fr.design.fun.impl.GlobalListenerProviderManager; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.messagecollect.StartErrorMessageCollector; import com.fr.design.mainframe.messagecollect.StartupMessageCollector; import com.fr.design.mainframe.messagecollect.entity.DesignerErrorMessage; -import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.DesignerPort; +import com.fr.env.utils.WorkspaceUtils; +import com.fr.event.Event; +import com.fr.event.Listener; +import com.fr.event.Null; import com.fr.exit.DesignerExiter; -import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import com.fr.module.Activator; import com.fr.record.analyzer.EnableMetrics; import com.fr.record.analyzer.Metrics; import com.fr.stable.ArrayUtils; import com.fr.stable.BuildContext; -import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; +import com.fr.stable.project.ProjectConstants; import com.fr.start.DesignerProcessType; -import com.fr.start.OemHandler; import com.fr.start.ServerStarter; -import com.fr.start.SplashContext; -import com.fr.start.SplashStrategy; -import com.fr.start.common.SplashCommon; +import com.fr.start.event.LazyStartupEvent; import com.fr.start.server.FineEmbedServer; import com.fr.value.NotNullLazyValue; import org.jetbrains.annotations.NotNull; @@ -55,10 +58,9 @@ public class DesignerStartup extends Activator { @Override public void beforeAllStart() { BuildContext.setBuildFilePath("/com/fr/stable/build.properties"); - // 检查是否是-Ddebug = true 启动 并切换对应的端口以及环境配置文件 - checkDebugStart(); - // 都是在启动过程中读取,这边提前初始化xml配置 - DesignerEnvManager.getEnvManager(); + + registerDaoSelector(); + // 初始化look and feel DesignUtils.initLookAndFeel(); if (DesignUtils.isPortOccupied()) { @@ -100,14 +102,6 @@ public class DesignerStartup extends Activator { DesignerExiter.getInstance().execute(); return; } - // 快快显示启动画面 - UIUtil.invokeAndWaitIfNeeded(new Runnable() { - @Override - public void run() { - SplashContext.getInstance().registerSplash(createSplash()); - SplashContext.getInstance().show(); - } - }); } @Override @@ -125,13 +119,21 @@ public class DesignerStartup extends Activator { || FineEmbedServer.isRunning()) { return; } + if (DaoSelectorFactory.getDaoSelector().useCacheDao()) { + listenEvent(LazyStartupEvent.INSTANCE, new Listener(Integer.MIN_VALUE) { + @Override + public void on(Event event, Null param) { + startEmbeddedServer(); + } + }); + } else { + startEmbeddedServer(); + } + } + + private void startEmbeddedServer() { ExecutorService service = newSingleThreadExecutor(new NamedThreadFactory("FineEmbedServerStart")); - service.submit(new Runnable() { - @Override - public void run() { - FineEmbedServer.start(); - } - }); + service.submit(FineEmbedServer::start); service.shutdown(); } @@ -142,23 +144,6 @@ public class DesignerStartup extends Activator { StartupMessageCollector.getInstance().recordStartupLog(); } - private SplashStrategy createSplash() { - OemProcessor oemProcessor = OemHandler.findOem(); - if (oemProcessor != null) { - SplashStrategy splashStrategy = null; - try { - splashStrategy = oemProcessor.createSplashStrategy(); - } catch (Throwable e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - if (splashStrategy != null) { - return splashStrategy; - } - } - - return new SplashCommon(); - } - private void browserDemoIfNeeded() { if (startupArgsValue.getValue().isDemo()) { @@ -166,28 +151,21 @@ public class DesignerStartup extends Activator { } } - /** - * 在VM options里加入-Ddebug=true激活 - */ - private void checkDebugStart() { - - if (ComparatorUtils.equals("true", System.getProperty("debug"))) { - setDebugEnv(); + private void registerDaoSelector() { + // 注入设计器db cache 是否可用 + DesignerWorkspaceInfo info = WorkspaceUtils.getWorkspaceInfo(); + if (info.getType() == DesignerWorkspaceType.Remote) { + DaoSelectorFactory.registerDaoSelector(() -> false); + } else { + String dbConfigPath = StableUtils.pathJoin(WorkspaceUtils.getWorkspaceInfo().getPath(), ProjectConstants.CONFIG_DIRECTORY, + EncryptionConstants.PROPERTY_NAME); + // + DaoSelectorFactory.registerDaoSelector(() -> DesignerEnvManager.getEnvManager().isPropertiesUsable() + && OptimizeUtil.isOpen() + && !new File(dbConfigPath).exists()); } } - /** - * 端口改一下,环境配置文件改一下。便于启动两个设计器,进行对比调试 - */ - private void setDebugEnv() { - - DesignUtils.setPort(DesignerPort.getInstance().getDebugMessagePort()); - DesignerEnvManager.setEnvFile(new File(StableUtils.pathJoin( - ProductConstants.getEnvHome(), - ProductConstants.APP_NAME + "Env_debug.xml" - ))); - } - @Override public void stop() { // void diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java index 724f947c94..de57164bcb 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java @@ -9,6 +9,7 @@ import com.fr.design.env.DesignerWorkspaceGenerator; import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.env.LocalDesignerWorkspaceInfo; import com.fr.design.versioncheck.VersionCheckUtils; +import com.fr.env.utils.WorkspaceUtils; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; @@ -28,7 +29,6 @@ import org.jetbrains.annotations.NotNull; */ public class DesignerWorkspaceProvider extends Activator { - private static final String SPECIFY_WORKSPACE = "fr.designer.workspace"; private NotNullLazyValue startupArgs = new NotNullLazyValue() { @NotNull @@ -46,15 +46,10 @@ public class DesignerWorkspaceProvider extends Activator { if (startupArgs.getValue().isDemo()) { DesignerEnvManager.getEnvManager().setCurrentEnv2Default(); } else { - String workspacePath; DesignerWorkspaceInfo workspaceInfo = null; try { String current = DesignerEnvManager.getEnvManager().getCurEnvName(); - if (StringUtils.isNotEmpty(workspacePath = System.getProperty(SPECIFY_WORKSPACE))) { - workspaceInfo = LocalDesignerWorkspaceInfo.create(StringUtils.EMPTY, workspacePath); - } else { - workspaceInfo = DesignerEnvManager.getEnvManager().getWorkspaceInfo(current); - } + workspaceInfo = WorkspaceUtils.getWorkspaceInfo(); Workspace workspace = DesignerWorkspaceGenerator.generate(workspaceInfo); boolean checkValid = workspace != null && workspaceInfo.checkValid(); if (!checkValid) { diff --git a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java index 6a3e0415d2..65cdc1c30d 100644 --- a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java @@ -2,14 +2,11 @@ package com.fr.start.module; import com.fr.design.DesignerEnvManager; import com.fr.design.RestartHelper; -import com.fr.design.i18n.Toolkit; import com.fr.design.utils.DesignUtils; -import com.fr.event.EventDispatcher; import com.fr.file.TmpFileUtils; import com.fr.general.CloudCenter; import com.fr.general.GeneralContext; import com.fr.module.Activator; -import com.fr.module.ModuleEvent; /** * Created by juhaoyu on 2018/1/8. @@ -21,8 +18,9 @@ public class PreStartActivator extends Activator { //清空临时文件 TmpFileUtils.cleanUpInnerTmpFiles(); RestartHelper.deleteRecordFilesWhenStart(); - //初始化 - EventDispatcher.fire(ModuleEvent.MajorModuleStarting, Toolkit.i18nText("Fine-Design_Basic_Initializing")); + //初始化起始画面放到 SplashContext 里面 + //EventDispatcher.fire(ModuleEvent.MajorModuleStarting, Toolkit.i18nText("Fine-Design_Basic_Initializing")); + // 完成初始化 //noinspection ResultOfMethodCallIgnored CloudCenter.getInstance(); diff --git a/designer-realize/src/main/java/com/fr/start/module/optimized/BaseDBActivator4Designer.java b/designer-realize/src/main/java/com/fr/start/module/optimized/BaseDBActivator4Designer.java new file mode 100644 index 0000000000..4c54926510 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/module/optimized/BaseDBActivator4Designer.java @@ -0,0 +1,30 @@ +package com.fr.start.module.optimized; + +import com.fr.config.activator.BaseDBActivator; +import com.fr.config.dao.DaoSelectorFactory; +import com.fr.event.Event; +import com.fr.event.Listener; +import com.fr.event.Null; +import com.fr.start.event.LazyStartupEvent; + +/** + * @author hades + * @version 11.0 + * Created by hades on 2022/3/7 + */ +public class BaseDBActivator4Designer extends BaseDBActivator { + + @Override + public void start() { + if (DaoSelectorFactory.getDaoSelector().useCacheDao()) { + listenEvent(LazyStartupEvent.INSTANCE, new Listener(Integer.MAX_VALUE) { + @Override + public void on(Event event, Null param) { + BaseDBActivator4Designer.super.start(); + } + }); + } else { + super.start(); + } + } +} diff --git a/designer-realize/src/main/java/com/fr/start/module/optimized/ConfigurationActivator4Designer.java b/designer-realize/src/main/java/com/fr/start/module/optimized/ConfigurationActivator4Designer.java new file mode 100644 index 0000000000..35863aa48b --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/module/optimized/ConfigurationActivator4Designer.java @@ -0,0 +1,27 @@ +package com.fr.start.module.optimized; + +import com.fr.config.activator.ConfigurationActivator; +import com.fr.config.dao.DaoContext; +import com.fr.config.dao.DaoSelectorFactory; +import com.fr.config.dao.impl.PropertiesClassHelperDao; +import com.fr.config.dao.impl.PropertiesEntityDao; +import com.fr.config.dao.impl.PropertiesXmlEntityDao; + +/** + * @author hades + * @version 11.0 + * Created by hades on 2022/3/7 + */ +public class ConfigurationActivator4Designer extends ConfigurationActivator { + + @Override + protected void initLocalDao() { + if (DaoSelectorFactory.getDaoSelector().useCacheDao()) { + DaoContext.setClassHelperDao(new PropertiesClassHelperDao()); + DaoContext.setEntityDao(new PropertiesEntityDao()); + DaoContext.setXmlEntityDao(new PropertiesXmlEntityDao()); + } else { + super.initLocalDao(); + } + } +} diff --git a/designer-realize/src/main/java/com/fr/start/module/optimized/ReportBaseActivator4Designer.java b/designer-realize/src/main/java/com/fr/start/module/optimized/ReportBaseActivator4Designer.java new file mode 100644 index 0000000000..31986da011 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/module/optimized/ReportBaseActivator4Designer.java @@ -0,0 +1,32 @@ +package com.fr.start.module.optimized; + +import com.fr.config.dao.DaoSelectorFactory; +import com.fr.event.Event; +import com.fr.event.Listener; +import com.fr.event.Null; +import com.fr.report.module.ReportBaseActivator; +import com.fr.start.event.LazyStartupEvent; + +/** + * @author hades + * @version 11.0 + * Created by hades on 2022/3/16 + */ +public class ReportBaseActivator4Designer extends ReportBaseActivator { + + @Override + protected void vcsInit() { + if (DaoSelectorFactory.getDaoSelector().useCacheDao()) { + listenEvent(LazyStartupEvent.INSTANCE, new Listener() { + @Override + public void on(Event event, Null param) { + ReportBaseActivator4Designer.super.vcsInit(); + } + }); + } else { + super.vcsInit(); + } + + + } +} diff --git a/designer-realize/src/main/java/com/fr/start/module/optimized/TenantDBAdapter4Designer.java b/designer-realize/src/main/java/com/fr/start/module/optimized/TenantDBAdapter4Designer.java new file mode 100644 index 0000000000..d45913e1aa --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/module/optimized/TenantDBAdapter4Designer.java @@ -0,0 +1,42 @@ +package com.fr.start.module.optimized; + +import com.fr.config.dao.DaoSelectorFactory; +import com.fr.config.dao.swicter.DaoSwitcher; +import com.fr.design.DesignerEnvManager; +import com.fr.event.Event; +import com.fr.event.Listener; +import com.fr.event.Null; +import com.fr.exit.ConfigToPropMigrator; +import com.fr.stable.db.tenant.TenantDBAdapter; +import com.fr.start.event.LazyStartupEvent; + +/** + * @author hades + * @version 11.0 + * Created by hades on 2022/3/7 + */ +public class TenantDBAdapter4Designer extends TenantDBAdapter { + + @Override + public void start() { + if (DaoSelectorFactory.getDaoSelector().useCacheDao()) { + listenEvent(LazyStartupEvent.INSTANCE, new Listener() { + @Override + public void on(Event event, Null param) { + TenantDBAdapter4Designer.super.start(); + afterStart(); + } + }); + + } else { + super.start(); + } + } + + private void afterStart() { + DesignerEnvManager.getEnvManager().setPropertiesUsable(false); + DaoSwitcher.executeSwitch(); + ConfigToPropMigrator.getInstance().deletePropertiesCache(); + DesignerEnvManager.getEnvManager().saveXMLFile(); + } +}