View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.a.rttests;
18  
19  import static org.apache.juneau.commons.utils.CollectionUtils.*;
20  import static org.apache.juneau.commons.utils.Utils.*;
21  import static org.junit.jupiter.api.Assertions.*;
22  
23  import java.util.*;
24  
25  import org.apache.juneau.collections.*;
26  import org.junit.jupiter.params.*;
27  import org.junit.jupiter.params.provider.*;
28  
29  /**
30   * Tests designed to serialize and parse objects to make sure we end up
31   * with the same objects for all serializers and parsers.
32   */
33  @SuppressWarnings("rawtypes")
34  class SimpleObjects_RoundTripTest extends RoundTripTest_Base {
35  
36  	@ParameterizedTest
37  	@MethodSource("testers")
38  	void a01_null(RoundTrip_Tester t) throws Exception {
39  		assertNull(t.roundTrip((String)null));
40  	}
41  
42  	@ParameterizedTest
43  	@MethodSource("testers")
44  	void a02_optional(RoundTrip_Tester t) throws Exception {
45  		assertFalse(t.roundTrip(opte()).isPresent());
46  	}
47  
48  	@ParameterizedTest
49  	@MethodSource("testers")
50  	void a03_string(RoundTrip_Tester t) throws Exception {
51  		assertEquals("foobar", t.roundTrip("foobar"));
52  		assertEquals("", t.roundTrip(""));
53  	}
54  
55  	@ParameterizedTest
56  	@MethodSource("testers")
57  	void a04_optionalContainingString(RoundTrip_Tester t) throws Exception {
58  		assertEquals("foobar", t.roundTrip(opt("foobar")).get());
59  		assertEquals("", t.roundTrip(opt("")).get());
60  	}
61  
62  	@ParameterizedTest
63  	@MethodSource("testers")
64  	void a05_stringArray(RoundTrip_Tester t) throws Exception {
65  		assertArrayEquals(a("foo", null, "null", ""), t.roundTrip(a("foo", null, "null", ""), String[].class));
66  	}
67  
68  	@ParameterizedTest
69  	@MethodSource("testers")
70  	void a06_string2dArray(RoundTrip_Tester t) throws Exception {
71  		var x = a(a("foo", null, "null", ""),null);
72  		x = t.roundTrip(x, String[][].class);
73  		assertEquals("foo", x[0][0]);
74  		assertNull(x[0][1]);
75  		assertEquals("null", x[0][2]);
76  		assertEquals("", x[0][3]);
77  		assertNull(x[1]);
78  	}
79  
80  	@ParameterizedTest
81  	@MethodSource("testers")
82  	void a07_int(RoundTrip_Tester t) throws Exception {
83  		assertEquals(123, t.roundTrip(123).intValue());
84  	}
85  
86  	@ParameterizedTest
87  	@MethodSource("testers")
88  	void a08_intArray(RoundTrip_Tester t) throws Exception {
89  		assertArrayEquals(ints(1,2,3), t.roundTrip(ints(1,2,3), int[].class));
90  	}
91  
92  	@ParameterizedTest
93  	@MethodSource("testers")
94  	void a09_int2dArray(RoundTrip_Tester t) throws Exception {
95  		var x = new int[][]{{1,2,3},null};
96  		x = t.roundTrip(x, int[][].class);
97  		assertEquals(1, x[0][0]);
98  		assertEquals(2, x[0][1]);
99  		assertEquals(3, x[0][2]);
100 		assertNull(x[1]);
101 	}
102 
103 	@ParameterizedTest
104 	@MethodSource("testers")
105 	void a10_int3dArray(RoundTrip_Tester t) throws Exception {
106 		var x = new int[][][]{{{1,2,3},{4,5,6},null},null};
107 		x = t.roundTrip(x, int[][][].class);
108 		assertEquals(1, x[0][0][0]);
109 		assertEquals(2, x[0][0][1]);
110 		assertEquals(3, x[0][0][2]);
111 		assertEquals(4, x[0][1][0]);
112 		assertEquals(5, x[0][1][1]);
113 		assertEquals(6, x[0][1][2]);
114 		assertNull(x[0][2]);
115 		assertNull(x[1]);
116 	}
117 
118 	@ParameterizedTest
119 	@MethodSource("testers")
120 	void a11_boolean(RoundTrip_Tester t) throws Exception {
121 		assertTrue(t.roundTrip(true));
122 		assertFalse(t.roundTrip(false));
123 	}
124 
125 	@ParameterizedTest
126 	@MethodSource("testers")
127 	void a12_booleanArray(RoundTrip_Tester t) throws Exception {
128 		assertArrayEquals(booleans(true,false), t.roundTrip(booleans(true,false), boolean[].class));
129 	}
130 
131 	@ParameterizedTest
132 	@MethodSource("testers")
133 	void a13_boolean2dArray(RoundTrip_Tester t) throws Exception {
134 		var x = new boolean[][]{{true,false},null};
135 		x = t.roundTrip(x, boolean[][].class);
136 		assertTrue(x[0][0]);
137 		assertFalse(x[0][1]);
138 		assertNull(x[1]);
139 	}
140 
141 	@ParameterizedTest
142 	@MethodSource("testers")
143 	void a14_char(RoundTrip_Tester t) throws Exception {
144 		assertEquals('a', t.roundTrip('a', char.class).charValue());
145 	}
146 
147 	@ParameterizedTest
148 	@MethodSource("testers")
149 	void a15_charArray(RoundTrip_Tester t) throws Exception {
150 		assertArrayEquals(chars('a',(char)0), t.roundTrip(chars('a',(char)0), char[].class));
151 	}
152 
153 	@ParameterizedTest
154 	@MethodSource("testers")
155 	void a16_char2dArray(RoundTrip_Tester t) throws Exception {
156 		var x = new char[][]{{'a',0},null};
157 		x = t.roundTrip(x, char[][].class);
158 		assertEquals('a', x[0][0]);
159 		assertEquals(0, x[0][1]);
160 		assertNull(x[1]);
161 	}
162 
163 	@ParameterizedTest
164 	@MethodSource("testers")
165 	void a17_float(RoundTrip_Tester t) throws Exception {
166 		assertEquals(1f, t.roundTrip(1f, float.class), 0.1f);
167 	}
168 
169 	@ParameterizedTest
170 	@MethodSource("testers")
171 	void a18_floatArray(RoundTrip_Tester t) throws Exception {
172 		assertArrayEquals(floats(1f), t.roundTrip(floats(1f), float[].class), 0.1f);
173 	}
174 
175 	@ParameterizedTest
176 	@MethodSource("testers")
177 	void a19_float2dArray(RoundTrip_Tester t) throws Exception {
178 		var x = new float[][]{{1f},null};
179 		x = t.roundTrip(x, float[][].class);
180 		assertEquals(1f, x[0][0], 0.1f);
181 		assertNull(x[1]);
182 	}
183 
184 	@ParameterizedTest
185 	@MethodSource("testers")
186 	void a20_double(RoundTrip_Tester t) throws Exception {
187 		assertEquals(1d, t.roundTrip(1d, double.class), 0.1f);
188 	}
189 
190 	@ParameterizedTest
191 	@MethodSource("testers")
192 	void a21_doubleArray(RoundTrip_Tester t) throws Exception {
193 		assertArrayEquals(doubles(1d), t.roundTrip(doubles(1d), double[].class), 0.1);
194 	}
195 
196 	@ParameterizedTest
197 	@MethodSource("testers")
198 	void a22_double2dArray(RoundTrip_Tester t) throws Exception {
199 		var x = new double[][]{{1d},null};
200 		x = t.roundTrip(x, double[][].class);
201 		assertEquals(1d, x[0][0], 0.1f);
202 		assertNull(x[1]);
203 	}
204 
205 	@ParameterizedTest
206 	@MethodSource("testers")
207 	void a23_long(RoundTrip_Tester t) throws Exception {
208 		assertEquals(1L, t.roundTrip(1L, long.class).longValue());
209 	}
210 
211 	@ParameterizedTest
212 	@MethodSource("testers")
213 	void a24_longArray(RoundTrip_Tester t) throws Exception {
214 		assertArrayEquals(longs(1L), t.roundTrip(longs(1L), long[].class));
215 	}
216 
217 	@ParameterizedTest
218 	@MethodSource("testers")
219 	void a25_long2dArray(RoundTrip_Tester t) throws Exception {
220 		var x = new long[][]{{1L},null};
221 		x = t.roundTrip(x, long[][].class);
222 		assertEquals(1L, x[0][0]);
223 		assertNull(x[1]);
224 	}
225 
226 	@ParameterizedTest
227 	@MethodSource("testers")
228 	void a26_short(RoundTrip_Tester t) throws Exception {
229 		assertEquals((short)1, t.roundTrip((short)1, short.class).shortValue());
230 	}
231 
232 	@ParameterizedTest
233 	@MethodSource("testers")
234 	void a27_shortArray(RoundTrip_Tester t) throws Exception {
235 		assertArrayEquals(shorts((short)1), t.roundTrip(shorts((short)1), short[].class));
236 	}
237 
238 	@ParameterizedTest
239 	@MethodSource("testers")
240 	void a28_short2dArray(RoundTrip_Tester t) throws Exception {
241 		var x = new short[][]{{(short)1},null};
242 		x = t.roundTrip(x, short[][].class);
243 		assertEquals((short)1, x[0][0]);
244 		assertNull(x[1]);
245 	}
246 
247 	@ParameterizedTest
248 	@MethodSource("testers")
249 	void a29_integer(RoundTrip_Tester t) throws Exception {
250 		assertEquals(Integer.valueOf(123), t.roundTrip((Integer)123, Integer.class));
251 	}
252 
253 	@ParameterizedTest
254 	@MethodSource("testers")
255 	void a30_integerArray(RoundTrip_Tester t) throws Exception {
256 		var x = a(123, null);
257 		x = t.roundTrip(x, Integer[].class);
258 		assertEquals(Integer.valueOf(123), x[0]);
259 		assertNull(x[1]);
260 	}
261 
262 	@ParameterizedTest
263 	@MethodSource("testers")
264 	void a31_integer2dArray(RoundTrip_Tester t) throws Exception {
265 		var x = a(a(123,null),null);
266 		x = t.roundTrip(x, Integer[][].class);
267 		assertEquals(Integer.valueOf(123), x[0][0]);
268 		assertNull(x[0][1]);
269 		assertNull(x[1]);
270 	}
271 
272 	@ParameterizedTest
273 	@MethodSource("testers")
274 	void a32_integer3dArray(RoundTrip_Tester t) throws Exception {
275 		var x = a(a(a(123,null),null),null);
276 		x = t.roundTrip(x, Integer[][][].class);
277 		assertEquals(Integer.valueOf(123), x[0][0][0]);
278 		assertNull(x[0][0][1]);
279 		assertNull(x[0][1]);
280 		assertNull(x[1]);
281 	}
282 
283 	@ParameterizedTest
284 	@MethodSource("testers")
285 	void a33_booleanObject(RoundTrip_Tester t) throws Exception {
286 		assertTrue(t.roundTrip(Boolean.TRUE, Boolean.class));
287 		assertFalse(t.roundTrip(Boolean.FALSE, Boolean.class));
288 	}
289 
290 	@ParameterizedTest
291 	@MethodSource("testers")
292 	void a34_booleanObjectArray(RoundTrip_Tester t) throws Exception {
293 		var x = a(true,false,null);
294 		x = t.roundTrip(x, Boolean[].class);
295 		assertTrue(x[0]);
296 		assertFalse(x[1]);
297 		assertNull(x[2]);
298 	}
299 
300 	@ParameterizedTest
301 	@MethodSource("testers")
302 	void a35_booleanObject2dArray(RoundTrip_Tester t) throws Exception {
303 		var x = a(a(true,false,null),null);
304 		x = t.roundTrip(x, Boolean[][].class);
305 		assertTrue(x[0][0]);
306 		assertFalse(x[0][1]);
307 		assertNull(x[0][2]);
308 		assertNull(x[1]);
309 	}
310 
311 	@ParameterizedTest
312 	@MethodSource("testers")
313 	void a36_character(RoundTrip_Tester t) throws Exception {
314 		assertEquals(Character.valueOf('a'), t.roundTrip((Character)'a', Character.class));
315 	}
316 
317 	@ParameterizedTest
318 	@MethodSource("testers")
319 	void a37_characterArray(RoundTrip_Tester t) throws Exception {
320 		var x = a('a',null);
321 		x = t.roundTrip(x, Character[].class);
322 		assertEquals(Character.valueOf('a'), x[0]);
323 		assertNull(x[1]);
324 	}
325 
326 	@ParameterizedTest
327 	@MethodSource("testers")
328 	void a38_character2dArray(RoundTrip_Tester t) throws Exception {
329 		var x = a(a('a',null),null);
330 		x = t.roundTrip(x, Character[][].class);
331 		assertEquals(Character.valueOf('a'), x[0][0]);
332 		assertNull(x[0][1]);
333 		assertNull(x[1]);
334 	}
335 
336 	@ParameterizedTest
337 	@MethodSource("testers")
338 	void a39_floatObject(RoundTrip_Tester t) throws Exception {
339 		assertEquals(Float.valueOf(1f), t.roundTrip((Float)1f, Float.class));
340 	}
341 
342 	@ParameterizedTest
343 	@MethodSource("testers")
344 	void a40_floatObjectArray(RoundTrip_Tester t) throws Exception {
345 		var x = a(1f, null);
346 		x = t.roundTrip(x, Float[].class);
347 		assertEquals(Float.valueOf(1f), x[0]);
348 		assertNull(x[1]);
349 	}
350 
351 	@ParameterizedTest
352 	@MethodSource("testers")
353 	void a41_floatObject2dArray(RoundTrip_Tester t) throws Exception {
354 		var x = a(a(1f,null),null);
355 		x = t.roundTrip(x, Float[][].class);
356 		assertEquals(Float.valueOf(1f), x[0][0]);
357 		assertNull(x[0][1]);
358 		assertNull(x[1]);
359 	}
360 
361 	@ParameterizedTest
362 	@MethodSource("testers")
363 	void a42_doubleObject(RoundTrip_Tester t) throws Exception {
364 		assertEquals(Double.valueOf(1d), t.roundTrip((Double)1d, Double.class));
365 	}
366 
367 	@ParameterizedTest
368 	@MethodSource("testers")
369 	void a43_doubleObjectArray(RoundTrip_Tester t) throws Exception {
370 		var x = a(1d,null);
371 		x = t.roundTrip(x, Double[].class);
372 		assertEquals(Double.valueOf(1d), x[0]);
373 		assertNull(x[1]);
374 	}
375 
376 	@ParameterizedTest
377 	@MethodSource("testers")
378 	void a44_doubleObject2dArray(RoundTrip_Tester t) throws Exception {
379 		var x = a(a(1d,null),null);
380 		x = t.roundTrip(x, Double[][].class);
381 		assertEquals(Double.valueOf(1d), x[0][0]);
382 		assertNull(x[0][1]);
383 		assertNull(x[1]);
384 	}
385 
386 	@ParameterizedTest
387 	@MethodSource("testers")
388 	void a45_longObject(RoundTrip_Tester t) throws Exception {
389 		assertEquals(Long.valueOf(1L), t.roundTrip((Long)1L, Long.class));
390 	}
391 
392 	@ParameterizedTest
393 	@MethodSource("testers")
394 	void a46_longObjectArray(RoundTrip_Tester t) throws Exception {
395 		var x = a(1L, null);
396 		x = t.roundTrip(x, Long[].class);
397 		assertEquals(Long.valueOf(1L), x[0]);
398 		assertNull(x[1]);
399 	}
400 
401 	@ParameterizedTest
402 	@MethodSource("testers")
403 	void a47_longObject2dArray(RoundTrip_Tester t) throws Exception {
404 		var x = a(a(1L,null),null);
405 		x = t.roundTrip(x, Long[][].class);
406 		assertEquals(Long.valueOf(1L), x[0][0]);
407 		assertNull(x[0][1]);
408 		assertNull(x[1]);
409 	}
410 
411 	@ParameterizedTest
412 	@MethodSource("testers")
413 	void a48_shortObject(RoundTrip_Tester t) throws Exception {
414 		assertEquals(Short.valueOf((short)1), t.roundTrip((Short)(short)1, Short.class));
415 	}
416 
417 	@ParameterizedTest
418 	@MethodSource("testers")
419 	void a49_shortObjectArray(RoundTrip_Tester t) throws Exception {
420 		var x = a((short)1,null);
421 		x = t.roundTrip(x, Short[].class);
422 		assertEquals(Short.valueOf((short)1), x[0]);
423 		assertNull(x[1]);
424 	}
425 
426 	@ParameterizedTest
427 	@MethodSource("testers")
428 	void a50_shortObject2dArray(RoundTrip_Tester t) throws Exception {
429 		var x = a(a((short)1,null),null);
430 		x = t.roundTrip(x, Short[][].class);
431 		assertEquals(Short.valueOf((short)1), x[0][0]);
432 		assertNull(x[0][1]);
433 		assertNull(x[1]);
434 	}
435 
436 	@ParameterizedTest
437 	@MethodSource("testers")
438 	void a51_jsonMap(RoundTrip_Tester t) throws Exception {
439 		var x = JsonMap.ofJson("{a:'b',c:123,d:false,e:null,f:[123,'abc',true,false,null]}");
440 		x = t.roundTrip(x);
441 		assertEquals("b", x.get("a"));
442 		assertEquals(123, x.get("c"));
443 		assertEquals(false, x.get("d"));
444 		assertNull(x.get("e"));
445 		var x2 = (List)x.get("f");
446 		assertEquals(123, x2.get(0));
447 		assertEquals("abc", x2.get(1));
448 		assertEquals(true, x2.get(2));
449 		assertEquals(false, x2.get(3));
450 		assertNull(x2.get(4));
451 	}
452 
453 	@ParameterizedTest
454 	@MethodSource("testers")
455 	void a52_jsonList(RoundTrip_Tester t) throws Exception {
456 		var x = new JsonList("['abc',123,true,false,null,{a:'b'}]");
457 		x = t.roundTrip(x);
458 		assertEquals("abc", x.get(0));
459 		assertEquals(123, x.get(1));
460 		assertEquals(true, x.get(2));
461 		assertEquals(false, x.get(3));
462 		assertNull(x.get(4));
463 		var m = (Map)x.get(5);
464 		assertEquals("b", m.get("a"));
465 	}
466 
467 	@ParameterizedTest
468 	@MethodSource("testers")
469 	void a53_treeMap(RoundTrip_Tester t) throws Exception {
470 		var x = new TreeMap<String,Object>();
471 		x.put("a", 1);
472 		x.put("b", 2);
473 		x.put("c", 3);
474 		x = t.roundTrip(x, TreeMap.class);
475 		assertEquals(1, x.get("a"));
476 		assertEquals(2, x.get("b"));
477 		assertEquals(3, x.get("c"));
478 
479 		x = new TreeMap<>();
480 		x.put("a", true);
481 		x.put("b", false);
482 		x.put("c", null);
483 		x.put("d", "foo");
484 		x.put("null", "baz");
485 		x.put("a\"a", "a\"a");
486 		x.put("b'b", "b'b");
487 		x.put("\"cc\"", "\"cc\"");
488 		x.put("'dd'", "'dd'");
489 		x = t.roundTrip(x, TreeMap.class);
490 		assertEquals(true, x.get("a"));
491 		assertEquals(false, x.get("b"));
492 		assertNull(x.get("c"));
493 		assertEquals("foo", x.get("d"));
494 		assertEquals("baz", x.get("null"));
495 		assertEquals("a\"a", x.get("a\"a"));
496 		assertEquals("b'b", x.get("b'b"));
497 		assertEquals("\"cc\"", x.get("\"cc\""));
498 		assertEquals("'dd'", x.get("'dd'"));
499 	}
500 
501 	@ParameterizedTest
502 	@MethodSource("testers")
503 	void a54_linkedHashMap(RoundTrip_Tester t) throws Exception {
504 		var x = map();
505 		x.put("a", true);
506 		x.put("b", false);
507 		x.put("c", null);
508 		x.put("d", "foo");
509 		x.put(null, "bar");
510 		x.put("null", "null");
511 		x.put("true", "true");
512 		x.put("false", "false");
513 		x.put("a\"a", "a\"a");
514 		x.put("b'b", "b'b");
515 		x.put("\"cc\"", "\"cc\"");
516 		x.put("'dd'", "'dd'");
517 		x.put("<ee>", "<ee>");
518 		x.put("<ff/>", "<ff/>");
519 		x.put("</gg>", "</gg>");
520 		x.put("<>", "<>");
521 		x.put("{}", "{}");
522 		x.put("[]", "[]");
523 		x.put("&", "&");
524 		x.put("?", "?");
525 		x.put("/", "/");
526 		x.put("\b", "\b");
527 		x.put("\\b", "\\b");
528 		x.put("\n", "\n");
529 		x.put("\\n", "\\n");
530 		x.put("\t", "\t");
531 		x.put("\\t", "\\t");
532 		x.put("\f", "\f");
533 		x.put("\\f", "\\f");
534 		x.put("\\", "\\");
535 		x.put("\\\\", "\\\\");
536 		x.put("\u2345", "\u2345");
537 		x.put("\\u2345", "\\u2345");
538 		x.put("\\\u2345", "\\\u2345");
539 		x.put("<>{}[]&?/\b\n\t\f\\\\\u2345", "<>{}[]&?/\b\n\t\f\\\\\u2345");
540 		x = t.roundTrip(x, LinkedHashMap.class);
541 		assertEquals(true, x.get("a"));
542 		assertEquals(false, x.get("b"));
543 		assertNull(x.get("c"));
544 		assertEquals("foo", x.get("d"));
545 		assertEquals("bar", x.get(null));
546 		assertEquals("null", x.get("null"));
547 		assertEquals("true", x.get("true"));
548 		assertEquals("false", x.get("false"));
549 		assertEquals("a\"a", x.get("a\"a"));
550 		assertEquals("b'b", x.get("b'b"));
551 		assertEquals("\"cc\"", x.get("\"cc\""));
552 		assertEquals("'dd'", x.get("'dd'"));
553 		assertEquals("<ee>", x.get("<ee>"));
554 		assertEquals("<ff/>", x.get("<ff/>"));
555 		assertEquals("</gg>", x.get("</gg>"));
556 		assertEquals("<>", x.get("<>"));
557 		assertEquals("{}", x.get("{}"));
558 		assertEquals("[]", x.get("[]"));
559 		assertEquals("&", x.get("&"));
560 		assertEquals("?", x.get("?"));
561 		assertEquals("/", x.get("/"));
562 		assertEquals("\b", x.get("\b"));
563 		assertEquals("\\b", x.get("\\b"));
564 		assertEquals("\n", x.get("\n"));
565 		assertEquals("\\n", x.get("\\n"));
566 		assertEquals("\t", x.get("\t"));
567 		assertEquals("\\t", x.get("\\t"));
568 		assertEquals("\f", x.get("\f"));
569 		assertEquals("\\f", x.get("\\f"));
570 		assertEquals("\\", x.get("\\"));
571 		assertEquals("\\\\", x.get("\\\\"));
572 		assertEquals("\u2345", x.get("\u2345"));
573 		assertEquals("\\u2345", x.get("\\u2345"));
574 		assertEquals("\\\u2345", x.get("\\\u2345"));
575 		assertEquals("<>{}[]&?/\b\n\t\f\\\\\u2345", x.get("<>{}[]&?/\b\n\t\f\\\\\u2345"));
576 	}
577 
578 	@ParameterizedTest
579 	@MethodSource("testers")
580 	void a55_vector(RoundTrip_Tester t) {
581 		var x = new Vector<Integer>();
582 		x.add(1);
583 		x.add(2);
584 		x.add(3);
585 		assertDoesNotThrow(()->t.roundTrip(x, Vector.class, Integer.class));
586 	}
587 
588 	@ParameterizedTest
589 	@MethodSource("testers")
590 	void a56_extendedUnicode(RoundTrip_Tester t) throws Exception {
591 		// Test 4-byte UTF-8 character
592 		assertEquals("𤭢𤭢", t.roundTrip("𤭢𤭢"));
593 	}
594 }