jiapeng 8 years ago
parent
commit
f7c2a2aee0

+ 39 - 0
src/main/java/com/ekexiu/console/system/dao/DictDao.java

@ -0,0 +1,39 @@
1
package com.ekexiu.console.system.dao;
2

3
import java.sql.Connection;
4
import java.sql.SQLException;
5
import java.util.List;
6

7
import org.jfw.apt.annotation.Nullable;
8
import org.jfw.apt.orm.annotation.dao.Column;
9
import org.jfw.apt.orm.annotation.dao.DAO;
10
import org.jfw.apt.orm.annotation.dao.method.From;
11
import org.jfw.apt.orm.annotation.dao.method.operator.DeleteWith;
12
import org.jfw.apt.orm.annotation.dao.method.operator.QueryVal;
13
import org.jfw.apt.orm.annotation.dao.method.operator.SelectList;
14
import org.jfw.apt.orm.annotation.dao.method.operator.UpdateWith;
15
import org.jfw.apt.orm.annotation.dao.param.Set;
16
import org.jfw.apt.orm.core.defaultImpl.StringHandler;
17

18
import com.ekexiu.console.system.po.Dict;
19

20
@DAO
21
public interface DictDao {
22

23
	@SelectList
24
	List<Dict> queryAlll(Connection con)throws SQLException;
25
	
26
	@Nullable
27
	@QueryVal
28
	@Column(value="ITEM",handlerClass=StringHandler.class)
29
	@From(Dict.class)
30
	String queryItem(Connection con,String code)throws SQLException;
31
	
32
	@UpdateWith
33
	@From(Dict.class)
34
	int update(Connection con,String code,@Set String item)throws SQLException;
35
	
36
	@DeleteWith
37
	@From(Dict.class)
38
	int delete(Connection con,String code)throws SQLException;
39
}

+ 44 - 0
src/main/java/com/ekexiu/console/system/dao/OrgDao.java

@ -0,0 +1,44 @@
1
package com.ekexiu.console.system.dao;
2

3
import java.sql.Connection;
4
import java.sql.SQLException;
5

6
import org.jfw.apt.annotation.Nullable;
7
import org.jfw.apt.orm.annotation.dao.DAO;
8
import org.jfw.apt.orm.annotation.dao.method.From;
9
import org.jfw.apt.orm.annotation.dao.method.OrderBy;
10
import org.jfw.apt.orm.annotation.dao.method.operator.DeleteWith;
11
import org.jfw.apt.orm.annotation.dao.method.operator.Insert;
12
import org.jfw.apt.orm.annotation.dao.method.operator.PageSelect;
13
import org.jfw.apt.orm.annotation.dao.method.operator.SelectOne;
14
import org.jfw.apt.orm.annotation.dao.method.operator.Update;
15
import org.jfw.apt.orm.annotation.dao.param.Alias;
16
import org.jfw.apt.orm.annotation.dao.param.GtEq;
17
import org.jfw.apt.orm.annotation.dao.param.Like;
18
import org.jfw.apt.orm.annotation.dao.param.LtEq;
19
import org.jfw.util.PageQueryResult;
20

21
import com.ekexiu.console.system.po.Organization;
22

23
@DAO
24
public interface OrgDao {
25
	@Insert
26
	int insert(Connection con, Organization org) throws SQLException;
27

28
	@Update
29
	int update(Connection con, Organization org) throws SQLException;
30

31
	@DeleteWith
32
	@From(Organization.class)
33
	int delete(Connection con, String id) throws SQLException;
34

35
	@Nullable
36
	@SelectOne
37
	Organization query(Connection con, String id) throws SQLException;
38

39
	@PageSelect
40
	@OrderBy(" ORDER BY ID")
41
	PageQueryResult<Organization> query(Connection con, @Nullable @Like String name, @Nullable String type, @GtEq @Nullable @Alias("createTime") String bt,
42
			@LtEq @Nullable @Alias("createTime") String et, int pageSize, int pageNo) throws SQLException;
43

44
}

+ 1 - 1
src/main/java/com/ekexiu/console/system/dao/RoleDao.java

@ -38,6 +38,6 @@ public interface RoleDao {
38 38
	List<Role> query(Connection con)throws SQLException;
39 39

40 40
	@SelectList
41
	List<Role> queryByUser(Connection con , @SqlColumn(handlerClass=StringHandler.class,value="id in (SELECT ROLEID FROM USER_ROLE WHERE USER_ID=?")  String userid) throws SQLException;
41
	List<Role> queryByUser(Connection con , @SqlColumn(handlerClass=StringHandler.class,value="id in (SELECT ROLEID FROM USER_ROLE WHERE USERID=?)")  String userid) throws SQLException;
42 42
	
43 43
}

+ 54 - 0
src/main/java/com/ekexiu/console/system/po/Dict.java

@ -0,0 +1,54 @@
1
package com.ekexiu.console.system.po;
2

3
import org.jfw.apt.orm.annotation.entry.Column;
4
import org.jfw.apt.orm.annotation.entry.PrimaryKey;
5
import org.jfw.apt.orm.annotation.entry.Table;
6
import org.jfw.apt.orm.core.enums.DE;
7

8
@PrimaryKey("code")
9
@Table
10
public class Dict {
11

12
	private String code;
13
	private String caption;
14
	private String descp;
15
	private boolean readonly;
16
	private String item;
17
	
18
	@Column(DE.string_de)
19
	public String getCode() {
20
		return code;
21
	}
22
	public void setCode(String code) {
23
		this.code = code;
24
	}
25
	@Column(DE.string_de)
26
	public String getCaption() {
27
		return caption;
28
	}
29
	public void setCaption(String caption) {
30
		this.caption = caption;
31
	}
32
	@Column(DE.Text_de)
33
	public String getDescp() {
34
		return descp;
35
	}
36
	public void setDescp(String descp) {
37
		this.descp = descp;
38
	}
39
	@Column(DE.boolean_de)
40
	public boolean isReadonly() {
41
		return readonly;
42
	}
43
	public void setReadonly(boolean readonly) {
44
		this.readonly = readonly;
45
	}
46
	@Column(DE.Text_de)
47
	public String getItem() {
48
		return item;
49
	}
50
	public void setItem(String item) {
51
		this.item = item;
52
	}
53
	
54
}

+ 62 - 0
src/main/java/com/ekexiu/console/system/po/Organization.java

@ -0,0 +1,62 @@
1
package com.ekexiu.console.system.po;
2

3
import org.jfw.apt.orm.annotation.entry.Column;
4
import org.jfw.apt.orm.annotation.entry.PrimaryKey;
5
import org.jfw.apt.orm.annotation.entry.Table;
6
import org.jfw.apt.orm.core.enums.DE;
7

8
import com.ekexiu.console.basepo.CreateTimeSupported;
9
import com.ekexiu.console.basepo.DescpSupported;
10
import com.ekexiu.console.basepo.ModifyTimeSupported;
11
@PrimaryKey("id")
12
@Table
13
public class Organization implements CreateTimeSupported,ModifyTimeSupported,DescpSupported{
14
	
15
	private String id;
16
	private String name;
17
	private String type;
18
	private String createTime;
19
	private String modifyTime;
20
	private String descp;
21
	
22
	@Column(DE.id_32)
23
	public String getId() {
24
		return id;
25
	}
26
	public void setId(String id) {
27
		this.id = id;
28
	}
29
	@Column(DE.string_de)
30
	public String getName() {
31
		return name;
32
	}
33
	public void setName(String name) {
34
		this.name = name;
35
	}
36
	@Column(DE.singleChar)
37
	public String getType() {
38
		return type;
39
	}
40
	public void setType(String type) {
41
		this.type = type;
42
	}
43
	public String getCreateTime() {
44
		return createTime;
45
	}
46
	public void setCreateTime(String createTime) {
47
		this.createTime = createTime;
48
	}
49
	public String getModifyTime() {
50
		return modifyTime;
51
	}
52
	public void setModifyTime(String modifyTime) {
53
		this.modifyTime = modifyTime;
54
	}
55
	public String getDescp() {
56
		return descp;
57
	}
58
	public void setDescp(String descp) {
59
		this.descp = descp;
60
	}
61
	
62
}

+ 1 - 1
src/main/java/com/ekexiu/console/system/po/UserConfig.java

@ -27,7 +27,7 @@ public class UserConfig {
27 27
	public void setCfkey(String cfkey) {
28 28
		this.cfkey = cfkey;
29 29
	}
30
	@Column(DE.string_de)
30
	@Column(DE.text_de)
31 31
	public String getCfval() {
32 32
		return cfval;
33 33
	}

+ 219 - 0
src/main/java/com/ekexiu/console/system/service/DictService.java

@ -0,0 +1,219 @@
1
package com.ekexiu.console.system.service;
2

3
import java.lang.reflect.Type;
4
import java.sql.Connection;
5
import java.sql.SQLException;
6
import java.util.ArrayList;
7
import java.util.Collection;
8
import java.util.Collections;
9
import java.util.HashMap;
10
import java.util.LinkedList;
11
import java.util.List;
12
import java.util.ListIterator;
13
import java.util.Map;
14
import java.util.concurrent.atomic.AtomicReference;
15

16
import javax.swing.event.ListSelectionEvent;
17

18
import org.jfw.apt.annotation.Autowrie;
19
import org.jfw.apt.web.annotation.Path;
20
import org.jfw.apt.web.annotation.operate.Get;
21
import org.jfw.apt.web.annotation.operate.Put;
22
import org.jfw.apt.web.annotation.param.JdbcConn;
23
import org.jfw.apt.web.annotation.param.PathVar;
24
import org.jfw.apt.web.annotation.param.RequestBody;
25
import org.jfw.util.exception.JfwBaseException;
26
import org.jfw.util.json.JsonService;
27
import org.jfw.util.reflect.TypeReference;
28

29
import com.ekexiu.console.system.dao.DictDao;
30
import com.ekexiu.console.system.po.Dict;
31
import com.ekexiu.console.system.vo.DictInfo;
32
import com.ekexiu.console.system.vo.DictItem;
33
import com.ekexiu.console.system.vo.EditDictItem;
34

35
@Path("/sys/dict")
36
public class DictService {
37

38
	private final static Type LINKEDLIST_EDITDICTITEM_TYPE = new TypeReference<List<EditDictItem>>() {
39
	}.getType();
40

41
	private AtomicReference<Map<String, DictInfo>> dicts = new AtomicReference<Map<String, DictInfo>>();
42
	private Map<String, AtomicReference<LinkedList<DictItem>>> items = new HashMap<String, AtomicReference<LinkedList<DictItem>>>();
43

44
	@Autowrie
45
	private DictDao dictDao;
46

47
	public DictDao getDictDao() {
48
		return dictDao;
49
	}
50

51
	public void setDictDao(DictDao dictDao) {
52
		this.dictDao = dictDao;
53
	}
54

55
	@Get
56
	@Path("/all")
57
	public List<DictInfo> getAll() {
58
		Collection<DictInfo> ds = this.dicts.get().values();
59
		ArrayList<DictInfo> ret = new ArrayList<DictInfo>(ds.size());
60
		ret.addAll(ds);
61
		return ret;
62
	}
63
	
64
	@Get
65
	@Path("/code/{code}")
66
	public DictInfo get(@PathVar String code)
67
	{
68
		return this.dicts.get().get(code);
69
	}
70
	
71
	
72

73
	@Put
74
	@Path
75
	public void update(@JdbcConn(true) Connection con,  @RequestBody List<EditDictItem> items) throws SQLException, JfwBaseException {
76
		LinkedList<DictItem> ret = new LinkedList<DictItem>();
77
	//	if()
78
		
79

80
	}
81

82
	// public static List
83
	public DictItem queryItem(String dictCode, String itemCode) {
84
		AtomicReference<LinkedList<DictItem>> aitems = this.items.get(dictCode);
85
		if (null != aitems) {
86
			LinkedList<DictItem> ims = aitems.get();
87
			if (ims != null && ims.size() > 0) {
88
				return query(ims, itemCode);
89
			}
90
		}
91
		return null;
92
	}
93

94
	private DictItem query(LinkedList<DictItem> items, String code) {
95
		for (ListIterator<DictItem> it = items.listIterator(); it.hasNext();) {
96
			DictItem item = it.next();
97
			if (item.getCode().equals(code))
98
				return item;
99
			LinkedList<DictItem> citems = item.getChildren();
100
			if (citems.size() > 0) {
101
				item = query(citems, code);
102
				if (null != item)
103
					return item;
104
			}
105
		}
106
		return null;
107
	}
108
	
109

110

111
	public LinkedList<DictItem> transfer(List<EditDictItem> src, LinkedList<DictItem> dest) {
112
		Map<String, EditDictItem> map = new HashMap<String, EditDictItem>();
113
		for (EditDictItem eitem : src) {
114
			map.put(eitem.getCode(), eitem);
115
		}
116
		LinkedList<String> removeCodes = new LinkedList<String>();
117
		for (;;) {
118
			for (String code : removeCodes) {
119
				map.remove(code);
120
			}
121
			removeCodes.clear();
122
			for (Map.Entry<String, EditDictItem> entry : map.entrySet()) {
123
				String code = entry.getKey();
124
				EditDictItem eitem = entry.getValue();
125
				String pc = eitem.getParentCode();
126
				if (pc == null || pc.length() == 0) {
127
					removeCodes.add(code);
128
					dest.add(transfer(eitem));
129
				} else {
130
					DictItem item = query(dest, pc);
131
					if (item != null) {
132
						removeCodes.add(code);
133
						item.getChildren().add(transfer(eitem));
134
					}
135
				}
136
			}
137
			if (removeCodes.size() == map.size())
138
				return dest;
139
			if (removeCodes.isEmpty()) {
140
				return null;
141
			}
142
		}
143

144
		// while(map.size()>0){
145
		// boolean added = false;
146
		// for(Map.Entry<String,EditDictItem> entry:map.entrySet()){
147
		// String code = entry.getKey();
148
		// EditDictItem eitem = entry.getValue();
149
		// String pc =eitem.getParentCode();
150
		// if(pc ==null || pc.length()==0){
151
		// added = true;
152
		// map.remove(code);
153
		// dest.add(transfer(eitem));
154
		// break;
155
		// }else{
156
		// DictItem item = query(dest,pc);
157
		// if(item!=null){
158
		// added=true;
159
		// item.getChildren().add(transfer(eitem));
160
		// map.remove(code);
161
		// break;
162
		// }
163
		// }
164
		// }
165
		// if(!added) break;
166
		// }
167
		// return dest;
168
	}
169

170
	public DictItem transfer(EditDictItem eitem) {
171
		DictItem item = new DictItem();
172
		item.setCaption(eitem.getCaption());
173
		item.setCode(eitem.getCode());
174
		item.setData(eitem.getData());
175
		item.setEnabled(eitem.isEnabled());
176
		item.setShortCode(eitem.getShortCode());
177
		item.setSystem(eitem.isSystem());
178
		return item;
179
	}
180

181
	private LinkedList<DictItem> transfer(String s) {
182
		LinkedList<DictItem> ret = new LinkedList<DictItem>();
183
		if (s == null || s.length() == 0 || s.equals("[]")) {
184
			return ret;
185
		}
186
		try {
187
			List<EditDictItem> list = JsonService.fromJson(s, LINKEDLIST_EDITDICTITEM_TYPE);
188
			if (null == transfer(list, ret)) {
189
				// TODO:: // log not exists parentCode or loop parentCode
190

191
			} 
192
		} catch (Exception e) {
193
			// TODO: ///// log json parse exception
194

195
		}
196
		return ret;
197
	}
198

199
	private synchronized void init(List<Dict> list) {
200
		if(null!= this.dicts.get()) return;		
201
		Map<String, DictInfo> map = new HashMap<String, DictInfo>();
202
		for (Dict dict : list) {
203
			map.put(dict.getCode(), new DictInfo(dict));
204
			AtomicReference<LinkedList<DictItem>> ar = new AtomicReference<LinkedList<DictItem>>(transfer(dict.getItem()));
205
			this.items.put(dict.getCode(), ar);
206
		}
207
		this.dicts.set(map);
208
	}
209

210
	private void update(Dict dict) {
211
		Map<String, DictInfo> map = new HashMap<String, DictInfo>();
212
		map.putAll(this.dicts.get());
213
		map.remove(dict.getCode());
214
		map.put(dict.getCode(), new DictInfo(dict));
215
		this.dicts.set(map);
216
	}
217
	
218
	
219
}

+ 66 - 0
src/main/java/com/ekexiu/console/system/service/OrgService.java

@ -0,0 +1,66 @@
1
package com.ekexiu.console.system.service;
2

3
import java.sql.Connection;
4
import java.sql.SQLException;
5

6
import org.jfw.apt.annotation.Autowrie;
7
import org.jfw.apt.annotation.DefaultValue;
8
import org.jfw.apt.annotation.Nullable;
9
import org.jfw.apt.web.annotation.Path;
10
import org.jfw.apt.web.annotation.operate.Get;
11
import org.jfw.apt.web.annotation.operate.Post;
12
import org.jfw.apt.web.annotation.operate.Put;
13
import org.jfw.apt.web.annotation.param.JdbcConn;
14
import org.jfw.apt.web.annotation.param.PathVar;
15
import org.jfw.apt.web.annotation.param.RequestBody;
16
import org.jfw.apt.web.annotation.param.RequestParam;
17
import org.jfw.util.PageQueryResult;
18
import org.jfw.util.StringUtil;
19

20
import com.ekexiu.console.system.dao.OrgDao;
21
import com.ekexiu.console.system.po.Organization;
22

23
@Path("/sys/org")
24
public class OrgService {
25

26
	@Autowrie
27
	private OrgDao orgDao;
28

29
	public OrgDao getOrgDao() {
30
		return orgDao;
31
	}
32

33
	public void setOrgDao(OrgDao orgDao) {
34
		this.orgDao = orgDao;
35
	}
36

37
	@Post
38
	@Path
39
	public String insert(@JdbcConn(true) Connection con, @RequestParam(excludeFields = { "createTime", "modifyTime", "id" }) Organization orgn)
40
			throws SQLException {
41
		String id = StringUtil.buildUUID();
42
		orgn.setId(id);
43
		this.orgDao.insert(con, orgn);
44
		return id;
45
	}
46

47
	@Put
48
	@Path
49
	public void update(@JdbcConn(true) Connection con,@RequestBody Organization orgn)throws SQLException{
50
		this.orgDao.update(con, orgn);
51
	}
52

53
	@Get
54
	@Path("/pq")
55
	public PageQueryResult<Organization> pageQuery(@JdbcConn Connection con,@Nullable String name,@Nullable String type,@Nullable String bt,@Nullable String et,@DefaultValue("1") int pageNo,@DefaultValue("10") int pageSize)throws SQLException{
56
		return this.orgDao.query(con, name, type, bt, et, pageSize, pageNo);
57
	}
58
	
59
	@Get
60
	@Path("/id/{id}")
61
	public Organization query(@JdbcConn Connection con,@PathVar String id)throws SQLException{
62
		return this.orgDao.query(con, id);
63
	}
64
	
65

66
}

+ 5 - 0
src/main/java/com/ekexiu/console/system/service/UserService.java

@ -7,6 +7,7 @@ import java.util.ArrayList;
7 7
import org.jfw.apt.annotation.Autowrie;
8 8
import org.jfw.apt.web.annotation.Path;
9 9
import org.jfw.apt.web.annotation.method.SetSession;
10
import org.jfw.apt.web.annotation.operate.Post;
10 11
import org.jfw.apt.web.annotation.param.JdbcConn;
11 12
import org.jfw.util.StringUtil;
12 13
import org.jfw.util.auth.AuthUtil;
@ -43,6 +44,7 @@ public class UserService {
43 44

44 45
	@SetSession("JFW_SESSION_LOGIN_USER=result")
45 46
	@Path("/login")
47
	@Post
46 48
	public ConsoleAuthUser login(@JdbcConn Connection con, String key, String pw) throws SQLException {
47 49
		User user = userDao.queryByLoginKey(con, key);
48 50
		if (user != null && StringUtil.md5(pw).equals(user.getLoginPassword()) && user.isActived()) {
@ -60,4 +62,7 @@ public class UserService {
60 62
		}
61 63
		return null;
62 64
	}
65
	public static void main(String[] args)throws Exception{
66
		System.out.println(AuthUtil.serialAuth(new int[]{0}));
67
	}
63 68
}

+ 46 - 0
src/main/java/com/ekexiu/console/system/vo/DictInfo.java

@ -0,0 +1,46 @@
1
package com.ekexiu.console.system.vo;
2

3
import com.ekexiu.console.system.po.Dict;
4

5
public class DictInfo {
6
	private String code;
7
	private String caption;
8
	private String descp;
9
	private boolean readonly;
10
	
11
	
12
	
13
	public DictInfo(){}
14
	public DictInfo(Dict dict){
15
		this.code = dict.getCode();
16
		this.caption = dict.getCaption();
17
		this.descp = dict.getDescp();
18
		this.readonly = dict.isReadonly();
19
	}
20
	public String getCode() {
21
		return code;
22
	}
23
	public void setCode(String code) {
24
		this.code = code;
25
	}
26
	public String getCaption() {
27
		return caption;
28
	}
29
	public void setCaption(String caption) {
30
		this.caption = caption;
31
	}
32
	public String getDescp() {
33
		return descp;
34
	}
35
	public void setDescp(String descp) {
36
		this.descp = descp;
37
	}
38
	public boolean isReadonly() {
39
		return readonly;
40
	}
41
	public void setReadonly(boolean readonly) {
42
		this.readonly = readonly;
43
	}
44
	
45
	
46
}

+ 57 - 0
src/main/java/com/ekexiu/console/system/vo/DictItem.java

@ -0,0 +1,57 @@
1
package com.ekexiu.console.system.vo;
2

3
import java.util.HashMap;
4
import java.util.LinkedList;
5

6
public class DictItem {
7
	private String code;
8
	private String caption;
9
	private String shortCode;
10
	private boolean enabled;
11
	private boolean system;
12
	private HashMap<String,String> data = new HashMap<String,String>();
13
	private LinkedList<DictItem> children = new LinkedList<DictItem>();
14
	
15
	public String getCode() {
16
		return code;
17
	}
18
	public void setCode(String code) {
19
		this.code = code;
20
	}
21
	public String getCaption() {
22
		return caption;
23
	}
24
	public void setCaption(String caption) {
25
		this.caption = caption;
26
	}
27
	public String getShortCode() {
28
		return shortCode;
29
	}
30
	public void setShortCode(String shortCode) {
31
		this.shortCode = shortCode;
32
	}
33
	public boolean isEnabled() {
34
		return enabled;
35
	}
36
	public void setEnabled(boolean enabled) {
37
		this.enabled = enabled;
38
	}
39
	public LinkedList<DictItem> getChildren() {
40
		return children;
41
	}
42
	public void setChildren(LinkedList<DictItem> children) {
43
		this.children = children;
44
	}
45
	public HashMap<String, String> getData() {
46
		return data;
47
	}
48
	public void setData(HashMap<String, String> data) {
49
		this.data = data;
50
	}
51
	public boolean isSystem() {
52
		return system;
53
	}
54
	public void setSystem(boolean system) {
55
		this.system = system;
56
	}
57
}

+ 64 - 0
src/main/java/com/ekexiu/console/system/vo/EditDictItem.java

@ -0,0 +1,64 @@
1
package com.ekexiu.console.system.vo;
2

3
import java.util.HashMap;
4

5
public class EditDictItem {
6
	private String code;
7
	private String parentCode;
8
	private String caption;
9
	private String shortCode;
10
	private boolean enabled;
11
	private HashMap<String,String> data = new HashMap<String,String>();
12
    private boolean system;
13
    private String descp ;
14
    
15
	public String getCode() {
16
		return code;
17
	}
18
	public void setCode(String code) {
19
		this.code = code;
20
	}
21
	public String getParentCode() {
22
		return parentCode;
23
	}
24
	public void setParentCode(String parentCode) {
25
		this.parentCode = parentCode;
26
	}
27
	public String getCaption() {
28
		return caption;
29
	}
30
	public void setCaption(String caption) {
31
		this.caption = caption;
32
	}
33
	public String getShortCode() {
34
		return shortCode;
35
	}
36
	public void setShortCode(String shortCode) {
37
		this.shortCode = shortCode;
38
	}
39
	public boolean isEnabled() {
40
		return enabled;
41
	}
42
	public void setEnabled(boolean enabled) {
43
		this.enabled = enabled;
44
	}
45
	public HashMap<String, String> getData() {
46
		return data;
47
	}
48
	public void setData(HashMap<String, String> data) {
49
		this.data = data;
50
	}
51
	public boolean isSystem() {
52
		return system;
53
	}
54
	public void setSystem(boolean system) {
55
		this.system = system;
56
	}
57
	public String getDescp() {
58
		return descp;
59
	}
60
	public void setDescp(String descp) {
61
		this.descp = descp;
62
	}
63
	
64
}