1 /*
2  * rekichu.c -- ����ľ����Ȭ�ɡ�����
3  *
4  * Copyright (C) 1997,1999 by Yoshifumi Mori
5  *
6  * tab:4
7  */
8 
9 #include "cdefs.h"
10 #include "extern.h"
11 
12 char	*rekichu_f_string;
13 char	*rekichu_kadan_f_string;
14 
15 static unsigned char	reki_bitmap[(MAX_REKICHU + 7) / 8];
16 static unsigned char	kadan_bitmap[(MAX_REKICHU_KADAN + 7) / 8];
17 
18 static const char	setu_sekkitbl[12] = { 19, 21, 23, 1, 3, 5, 7, 9, 11, 13, 15, 17 };
19 
20 static void kadan(int setuyy, int setumm, long *jdn, void (*outfunc)(const char *msg, ...));
21 
22 /*
23  * ����ľ�����
24  */
calc_12choku(int year,int month,int day,long jdn)25 const char *calc_12choku(int year, int month, int day, long jdn)
26 {
27 	static const char	*choku[12] = {
28 		"��", "��", "��", "ʿ", "��", "��",
29 		"��", "��", "��", "Ǽ", "��", "��"
30 	};
31 	long	jd;
32 	int		setumm, t;
33 
34 	jd = GetSekkiJulianDay(year, setu_sekkitbl[month - 1]);
35 	if (jd == 0L) {
36 		return (NULL);
37 	}
38 
39 	if (jdn >= jd) {
40 		setumm = calendar.month - 1;
41 	} else {
42 		setumm = calendar.month - 2;
43 	}
44 	if (setumm < 1) {
45 		setumm += 12;
46 	}
47 
48 	t = (int)((jdn + 2L) % 12L) - ((setumm + 1) % 12);
49 	while (t < 0) {
50 		t += 12;
51 	}
52 
53 	return (choku[t % 12]);
54 }
55 
56 /*
57  * ��Ȭ�ɤ����
58  */
calc_28syuku(long julianday)59 const char *calc_28syuku(long julianday)
60 {
61 	static const char	*syuku[28] = {
62 		"��", "ж", "�Ƥ�", "˼", "��", "��", "̧",
63 		"��", "��", "��", "��", "��", "��", "��",
64 		"��", "Ϭ", "��", "��", "ɭ", "�", "��",
65 		"��", "��", "��", "��", "ĥ", "��", "��"
66 	};
67 
68 	return (syuku[(int)((julianday + 12L) % 28L)]);
69 }
70 
71 /*
72  * ������
73  */
74 static
kadan(int setuyy,int setumm,long * jdn,void (* outfunc)(const char * msg,...))75 void kadan(int setuyy, int setumm, long *jdn, void (*outfunc)(const char *msg, ...))
76 {
77 	static const char	kamiyosinichi[33] = {
78 		 1,  3,  5,  6,  8,  9, 13, 15, 18, 20, 21, 24, 27, 30, 32, 33,
79 		35, 36, 37, 39, 41, 42, 43, 44, 45, 47, 48, 51, 54, 55, 56, 57, 59
80 	};
81 	static const char	daimyounichi[25] = {
82 		 5,  6,  7,  8,  9, 13, 15, 18, 20, 23, 28, 31,
83 		38, 40, 41, 42, 43, 45, 46, 47, 52, 54, 55, 56, 57
84 	};
85 	long	jd;
86 	int		i;
87 
88 	if (setumm != 0) {
89 		static const char	kurobi[12] = { 10, 4, 11, 5, 0, 6, 1, 7, 2, 8, 3, 9 };
90 		static const char	jyusinichi[12] = { 9, 5, 1, 9, 5, 1, 9, 5, 1, 9, 5, 1 };
91 		static const char	kikonichi[12] = { 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0 };
92 		static const char	fukunichi[12][2] = {
93 			{ 0, 6 }, { 1, 7 }, { 4, 5 }, { 2, 8 }, { 3, 9 }, { 4, 5 },
94 			{ 0, 6 }, { 1, 7 }, { 4, 5 }, { 2, 8 }, { 3, 9 }, { 4, 5 },
95 		};
96 		static const char	oumounichi[12] = { 6, 13, 20, 7, 15, 23, 8, 17, 26, 9, 19, 29 };
97 		static const char	bosounichi[12][4] = {
98 			{  0, 11,  0, 11 }, {  0, 11,  0, 11 }, {  5,  6,  5,  6 }, {  2,  3,  2,  3 },
99 			{  2,  3,  2,  3 }, {  5,  6,  5,  6 }, {  1,  4,  7, 10 }, {  1,  4,  7, 10 },
100 			{  5,  6,  5,  6 }, {  8,  4,  8,  4 }, {  8,  4,  8,  4 }, {  5,  6,  5,  6 },
101 		};
102 		static const char	tukitokunichi[12] = { 2, 0, 8, 6, 2, 0, 8, 6, 2, 0, 8, 6 };
103 
104 		if (calendar.dt == kurobi[setumm - 1] && CHKBIT(0, kadan_bitmap) != 0) {
105 			(*outfunc)("������");
106 		}
107 		if (calendar.dt == jyusinichi[setumm - 1] && CHKBIT(1, kadan_bitmap) != 0) {
108 			(*outfunc)("������");
109 		}
110 		if (calendar.dt == kikonichi[setumm - 1] && CHKBIT(3, kadan_bitmap) != 0) {
111 			(*outfunc)("������");
112 		}
113 		if (calendar.de == fukunichi[setumm - 1][0] ||
114 		    calendar.de == fukunichi[setumm - 1][1]) {
115 			if (CHKBIT(6, kadan_bitmap) != 0) {
116 				(*outfunc)("����");
117 			}
118 		}
119 
120 #if 1	/* ��� */
121 #define MM	(setumm - 1)
122 		if (setumm != 0) {
123 #else	/* ���(����) */
124 #define MM	(calendar.lc_month - 1)
125 		if (calendar.lc_valid == TRUE) {
126 #endif
127 			static const char	chiiminichi[12] = { 1, 7, 2, 8, 3, 9, 4, 10, 5, 11, 6, 0 };
128 			static const char	tenkanichi[12] = { 0, 3, 6, 9, 0, 3, 6, 9, 0, 3, 6, 9 };
129 			static const char	jikanichi[12] = { 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4 };
130 
131 			if (calendar.dt == chiiminichi[MM] && CHKBIT(4, kadan_bitmap) != 0) {
132 				(*outfunc)("�����");
133 			}
134 			if (calendar.dt == tenkanichi[MM] && CHKBIT(7, kadan_bitmap) != 0) {
135 				(*outfunc)("ŷ����");
136 			}
137 			if (calendar.dt == jikanichi[MM] && CHKBIT(8, kadan_bitmap) != 0) {
138 				(*outfunc)("�ϲ���");
139 			}
140 		}
141 
142 		i = setuyy;
143 		if (setumm == 12) {
144 			i++;
145 		}
146 		jd = GetSekkiJulianDay(i, setu_sekkitbl[setumm % 12]);
147 		if ((jd + oumounichi[setumm - 1]) == calendar.julian_day && CHKBIT(14, kadan_bitmap) != 0) {
148 			(*outfunc)("��˴��");
149 		}
150 		if (calendar.dt == bosounichi[setumm - 1][0] ||
151 		    calendar.dt == bosounichi[setumm - 1][1] ||
152 		    calendar.dt == bosounichi[setumm - 1][2] ||
153 		    calendar.dt == bosounichi[setumm - 1][3]) {
154 			if (CHKBIT(20, kadan_bitmap) != 0) {
155 				(*outfunc)("������");
156 			}
157 		}
158 		if (calendar.de == tukitokunichi[setumm - 1] && CHKBIT(21, kadan_bitmap) != 0) {
159 			(*outfunc)("������");
160 		}
161 	}
162 
163 	if (calendar.dt == 5 || calendar.dt == 11) {
164 		/* ̦����, ����� */
165 		if (CHKBIT(5, kadan_bitmap) != 0) {
166 			(*outfunc)("����");
167 		}
168 	}
169 	i = FALSE;
170 	if (calendar.eto == 14 &&
171 	    (jdn[3] <= calendar.julian_day && calendar.julian_day < jdn[0])) {
172 		i = TRUE;	/* Ω�ա�Ω�� ���� */
173 	}
174 	if (calendar.eto == 30 &&
175 	    (jdn[0] <= calendar.julian_day && calendar.julian_day < jdn[1])) {
176 		i = TRUE;	/* Ω�ơ�Ω�� �ø� */
177 	}
178 	if (calendar.eto == 44 &&
179 	    (jdn[1] <= calendar.julian_day && calendar.julian_day < jdn[2])) {
180 		i = TRUE;	/* Ω����Ω�� �꿽 */
181 	}
182 	if (calendar.eto == 0 &&
183 	    (jdn[2] <= calendar.julian_day || calendar.julian_day < jdn[3])) {
184 		i = TRUE;	/* Ω�ߡ�Ω�� �û� */
185 	}
186 	if (i != FALSE && CHKBIT(15, kadan_bitmap) != 0) {
187 		(*outfunc)("ŷ����");
188 	}
189 	for (i = 0; i < sizeof(kamiyosinichi); i++) {
190 		if (calendar.eto == kamiyosinichi[i]) {
191 			if (CHKBIT(16, kadan_bitmap) != 0) {
192 				(*outfunc)("������");
193 			}
194 			break;
195 		}
196 	}
197 	for (i = 0; i < sizeof(daimyounichi); i++) {
198 		if (calendar.eto == daimyounichi[i]) {
199 			if (CHKBIT(17, kadan_bitmap) != 0) {
200 				(*outfunc)("������");
201 			}
202 			break;
203 		}
204 	}
205 	if ((int)((calendar.julian_day + 12L) % 28L) == 22 && CHKBIT(18, kadan_bitmap) != 0) {
206 		(*outfunc)("������");	/* ��Ȭ�� �� */
207 	}
208 	if (calendar.eto <= 4 ||
209 	    (calendar.eto >= 15 && calendar.eto <= 19) ||
210 	    (calendar.eto >= 45 && calendar.eto <= 49)) {
211 		/* �û�, ����, ʺ��, ����, ��ä */
212 		/* �ʱ�, ��ä, ��̦, �Ѹ�, �̤ */
213 		/* ����, ����, �ɰ�, �ѻ�, ⣱� */
214 		if (CHKBIT(19, kadan_bitmap) != 0) {
215 			(*outfunc)("ŷ����");
216 		}
217 	}
218 
219 	if (calendar.lc_valid == TRUE) {
220 #if 1
221 		static const char	kuenichix[13] = {
222 			0, 2, 5, 17, 27, 29, 34, 37, 40, 51, 63, 66, 70
223 		};
224 		static const char	kuenichit[] = {
225 			27, 50,														/*  1- 2 */
226 			15, 51, 57,													/*  2- 3 */
227 			 0,  1,  2,  3,  4,  8, 16, 20, 32, 40, 44, 56,				/*  3-12 */
228 			 4,  7, 19, 31, 35, 42, 43, 54, 55, 59,						/*  4-10 */
229 			42, 54,														/*  5- 2 */
230 			 5, 42, 43, 53, 55,											/*  6- 5 */
231 			21, 40, 56,													/*  7- 3 */
232 			45, 51, 57,													/*  8- 3 */
233 			10, 27, 28, 29, 30, 31, 32, 33, 34, 46, 50,					/*  9-11 */
234 			 1,  5, 13, 24, 25, 34, 35, 37, 48, 49, 53, 59,				/* 10-12 */
235 			24, 42, 48,													/* 11- 3 */
236 			24, 43, 48, 59,												/* 12- 4 */
237 		};
238 #else
239 		static const char	kuenichix[13] = {
240 			0, 3, 6, 19, 31, 34, 41, 44, 47, 62, 74, 77, 82
241 		};
242 		static const char	kuenichit[] = {
243 			27, 50, 47,													/*  1- 3 */
244 			15, 51, 57,													/*  2- 3 */
245 			 0,  1,  2,  3,  4,  8, 16, 20, 32, 40, 44, 56, 59,			/*  3-13 */
246 			 4,  7, 19, 31, 35, 42, 43, 54, 55, 59,  5, 53,				/*  4-12 */
247 			42, 54,  48,												/*  5- 3 */
248 			 5, 42, 43, 53, 55, 49, 54,									/*  6- 7 */
249 			21, 40, 56,													/*  7- 3 */
250 			45, 51, 57,													/*  8- 3 */
251 			10, 27, 28, 29, 30, 31, 32, 33, 34, 46, 50,  2, 14, 26, 38,	/*  9-15 */
252 			 1,  5, 13, 24, 25, 34, 35, 37, 48, 49, 53, 59,				/* 10-12 */
253 			24, 42, 48,													/* 11- 3 */
254 			24, 43, 48, 59, 49,											/* 12- 5 */
255 		};
256 #endif
257 		static const char	saigejiki[12] = { 13, 26, 3, 28, 53, 42, 43, 56, 33, 22, 47, 36 };
258 		const struct kansi_t	*k;
259 
260 		for (i = kuenichix[calendar.lc_month - 1]; i < kuenichix[calendar.lc_month]; i++) {
261 			if (calendar.eto == kuenichit[i]) {
262 				if (CHKBIT(13, kadan_bitmap) != 0) {
263 					(*outfunc)("������");
264 				}
265 				break;
266 			}
267 		}
268 		k = kansi(calendar.lc_year, calendar.lc_month, calendar.julian_day);
269 		if (calendar.eto == saigejiki[k->yt] && CHKBIT(12, kadan_bitmap) != 0) {
270 			(*outfunc)("�в���");
271 		}
272 	}
273 }
274 
275 /*
276  * �����ᵤ�����ᡢ�����λ��С�ɽ�����ե饰����
277  */
278 void rekichu(unsigned char *evflag, void (*outfunc)(const char *msg, ...))
279 {
280 	const char	*p, *q, *s;
281 	int		i, j;
282 	int		setumm, setuyy;
283 	long	jd, jdn[4];
284 
285 	memset(reki_bitmap, '\xFF', sizeof(reki_bitmap));
286 	if (rekichu_f_string != NULL) {
287 		p = rekichu_f_string;
288 		for (i = 0; *p != '\0' && i < MAX_REKICHU; i++, p++) {
289 			if (*p != '1') {
290 				CLRBIT(i, reki_bitmap);
291 			}
292 		}
293 	}
294 
295 	memset(kadan_bitmap, '\xFF', sizeof(kadan_bitmap));
296 	if (rekichu_kadan_f_string != NULL) {
297 		p = rekichu_kadan_f_string;
298 		for (i = 0; *p != '\0' && i < MAX_REKICHU_KADAN; i++, p++) {
299 			if (*p != '1') {
300 				CLRBIT(i, kadan_bitmap);
301 			}
302 		}
303 	}
304 
305 	p = GetSekkiName(calendar.year, calendar.month, calendar.day, &i);
306 	if (p != NULL) {
307 		if (i >= 0 && i <= 23) {
308 			SETBIT(i, evflag);
309 			if (CHKBIT(0, reki_bitmap) != 0) {
310 				(*outfunc)(p);	/* �����ᵤ */
311 			}
312 		} else if (i == 24) {
313 			if (CHKBIT(5, reki_bitmap) != 0) {
314 				(*outfunc)(p);	/* ���� */
315 			}
316 		} else if (i == 25) {
317 			if (CHKBIT(6, reki_bitmap) != 0) {
318 				(*outfunc)(p);	/* Ⱦ���� */
319 			}
320 		}
321 	}
322 
323 	if (calendar.month == 3 || calendar.month == 9) {
324 		GetSB(calendar.year, &i, &j);
325 		if (calendar.month == 9) {
326 			i = j;
327 		}
328 		p = NULL;
329 		q = "";
330 		switch (calendar.day - i) {
331 		case -3:
332 			q = "������";
333 			/* no break */
334 		case -2:
335 		case -1:
336 		case 0:
337 		case 1:
338 		case 2:
339 higan:;
340 			p = "���%s";
341 			break;
342 		case 3:
343 			q = "������";
344 			goto higan;
345 		}
346 		if (p != NULL && CHKBIT(2, reki_bitmap) != 0) {
347 			(*outfunc)(p, q);
348 		}
349 
350 		if (calendar.month == 3) {
351 			i = 30;
352 		} else {
353 			i = 31;
354 		}
355 		if (calendar.julian_day == GetSekkiJulianDay(calendar.year, i)) {
356 			SETBIT(38, evflag);	/* ���� */
357 			if (CHKBIT(3, reki_bitmap) != 0) {
358 				(*outfunc)("����");	/* ����� */
359 			}
360 		}
361 	}
362 
363 	for (i = 0; i < 4; i++) {
364 		jd = calendar.julian_day - GetSekkiJulianDay(calendar.year, i + 26);
365 		if (jd >= 0L && jd <= 17L) {
366 			static const char	*kisetu = "�ղƽ���";
367 
368 			s = &kisetu[i * 2];
369 			p = "%-.2s������%s";
370 			q = "";
371 			switch ((int)jd) {
372 			case 0:
373 				q = "����";
374 				break;
375 			case 17:
376 				q = "����";
377 				break;
378 			}
379 			SETBIT(34 + i, evflag);
380 			if (CHKBIT(4, reki_bitmap) != 0) {
381 				(*outfunc)(p, s, q);
382 			}
383 			if (i == 1 && calendar.dt == 1) {
384 				if (jd < 12L) {
385 					p = "���Ѥα�����";
386 				} else {
387 					p = "���Ѥ���α�";
388 				}
389 				if (CHKBIT(4, reki_bitmap) != 0) {
390 					(*outfunc)(p);
391 				}
392 			}
393 		}
394 
395 		jdn[i] = GetSekkiJulianDay(calendar.year, i * 6 + 3);
396 		if (i == 3) {
397 			static const short	rissyun_diff[] = { -1, 87, 209, 219 };
398 			static const char	*zatsusetu[] = {
399 				"��ʬ", "Ȭ��Ȭ��", "��ɴ����", "��ɴ����"
400 			};
401 
402 			for (j = 0; j < sizeof(rissyun_diff) / sizeof(int); j++) {
403 				if (calendar.julian_day == (jdn[3] + rissyun_diff[j])) {
404 					SETBIT(24 + j, evflag);
405 					if (CHKBIT(j + 7, reki_bitmap) != 0) {
406 						(*outfunc)(zatsusetu[j]);
407 					}
408 				}
409 			}
410 		}
411 	}
412 
413 	if (calendar.month == 2 && calendar.dt == 6) {
414 		if (calendar.day <= 12) {
415 			SETBIT(28, evflag);	/* ��� */
416 		} else if (calendar.day <= 24) {
417 			SETBIT(29, evflag);	/* ��θ� */
418 		} else {
419 			SETBIT(30, evflag);	/* ���θ� */
420 		}
421 	}
422 
423 	if (calendar.month == 11 && calendar.dt == 9) {
424 		if (calendar.day <= 12) {
425 			SETBIT(31, evflag);	/* ����� */
426 		} else if (calendar.day <= 24) {
427 			SETBIT(32, evflag);	/* ����� */
428 		} else {
429 			SETBIT(33, evflag);	/* ������ */
430 		}
431 	}
432 
433 	if (calendar.de == 6 &&
434 	    (calendar.month == 7 || calendar.month == 8)) {	/* ������ */
435 		p = NULL;
436 		jd = GetSekkiJulianDay(calendar.year, 6);	/* �ƻ� */
437 		if ((jd + 20L) <= calendar.julian_day && calendar.julian_day <= (jd + 29L)) {
438 			p = "����";
439 		}
440 		if ((jd + 30L) <= calendar.julian_day && calendar.julian_day <= (jd + 39L)) {
441 			p = "����";
442 		}
443 		jd = GetSekkiJulianDay(calendar.year, 9);	/* Ω�� */
444 		if (jd <= calendar.julian_day && calendar.julian_day <= (jd + 9L)) {
445 			p = "����";
446 		}
447 		if (p != NULL && CHKBIT(16, reki_bitmap) != 0) {
448 			(*outfunc)(p);	/* ���� */
449 		}
450 	}
451 
452 	jd = GetSekkiJulianDay(calendar.year, setu_sekkitbl[calendar.month - 1]);
453 	if (jd != 0L) {
454 		if (calendar.julian_day >= jd) {
455 			setumm = calendar.month - 1;
456 		} else {
457 			setumm = calendar.month - 2;
458 		}
459 		setuyy = calendar.year;
460 		if (setumm < 1) {
461 			setumm += 12;
462 			setuyy--;
463 		}
464 	} else {
465 		setuyy = 0;
466 		setumm = 0;
467 	}
468 
469 	if (setumm != 0) {
470 		static const char	sanrinbo[12] = { 11, 2, 6, 11, 2, 6, 11, 2, 6, 11, 2, 6 };
471 		static const char	manbaibi[12][2] = {
472 			{  1,  6 }, {  9,  2 }, {  0,  3 }, {  3,  4 }, {  5,  6 }, {  9,  6 },
473 			{  7,  0 }, {  3,  8 }, {  9,  6 }, {  9, 10 }, { 11,  0 }, {  3,  0 },
474 		};
475 
476 		if (calendar.dt == sanrinbo[setumm - 1] && CHKBIT(15, reki_bitmap) != 0) {
477 			(*outfunc)("����˴");
478 		}
479 		if (calendar.dt == manbaibi[setumm - 1][0] ||
480 		    calendar.dt == manbaibi[setumm - 1][1]) {
481 			if (CHKBIT(17, reki_bitmap) != 0) {
482 				(*outfunc)("��γ������");
483 			}
484 		}
485 	}
486 
487 	if (calendar.lc_valid == TRUE) {
488 		static const char	fujyoujyu[12] = { 3, 2, 1, 4, 5, 6, 3, 2, 1, 4, 5, 6 };
489 
490 		j = fujyoujyu[calendar.lc_month - 1];
491 		if (calendar.lc_day == j || calendar.lc_day == j + 8 ||
492 		    calendar.lc_day == j + 16 || calendar.lc_day == j + 24) {
493 			if (CHKBIT(13, reki_bitmap) != 0) {
494 				(*outfunc)("��������");
495 			}
496 		}
497 	}
498 
499 	if (calendar.eto == 48 || calendar.eto == 50 || calendar.eto == 51 ||
500 	    calendar.eto == 53 || calendar.eto == 55 || calendar.eto == 56 ||
501 	    calendar.eto == 57 || calendar.eto == 59) {
502 		/* �ѻ�, ����, ����, ��̦, ��̤, ����, ����, ⣰� */
503 		q = "";
504 		if (calendar.eto == 48) {
505 			q = "�Ϥ�";
506 		}
507 		if (calendar.eto == 59) {
508 			q = "����";
509 		}
510 		if (CHKBIT(11, reki_bitmap) != 0) {
511 			(*outfunc)("Ȭ��%s", q);
512 		}
513 	}
514 	if (calendar.eto >= 20 && calendar.eto <= 29) {
515 		q = "";
516 		if (calendar.eto == 20) {
517 			q = "����";
518 		}
519 		if (CHKBIT(12, reki_bitmap) != 0) {
520 			(*outfunc)("������%s", q);	/* �ÿ� ���� �̦ (ʺ��:22, �ʱ�:25�ϴ��������ޤޤ��) */
521 		}
522 	}
523 	if (calendar.eto >= 29 && calendar.eto <= 44) {
524 		q = "";
525 		if (calendar.eto == 29) {
526 			q = "����";
527 		}
528 		if (CHKBIT(14, reki_bitmap) != 0) {
529 			(*outfunc)("ŷ��ŷ��%s", q);	/* �̦ ���� �꿽  */
530 		}
531 	}
532 	if (calendar.eto >= 6 && calendar.eto <= 12) {
533 		if (CHKBIT(18, reki_bitmap) != 0) {
534 			(*outfunc)("������");	/* ���� ���� ʺ�� */
535 		}
536 	}
537 	if (calendar.eto >= 14 && calendar.eto <= 20) {
538 		if (CHKBIT(18, reki_bitmap) != 0) {
539 			(*outfunc)("������" );	/* ���� ���� �ÿ� */
540 		}
541 	}
542 
543 	if (calendar.eto == 56 && CHKBIT(19, reki_bitmap) != 0) {
544 		(*outfunc)("��������");	/* ���� */
545 	}
546 	if (calendar.eto == 0 && CHKBIT(19, reki_bitmap) != 0) {
547 		(*outfunc)("�ûҤ���");	/* �û� */
548 	}
549 	if (calendar.eto == 5 && CHKBIT(19, reki_bitmap) != 0) {
550 		(*outfunc)("��̦����");	/* ��̦ */
551 	}
552 
553 	if (CHKBIT(1, reki_bitmap) != 0) {
554 		kadan(setuyy, setumm, jdn, outfunc);
555 	}
556 }
557