Diffstat (limited to 'noncore/unsupported/mail2/libmail/imapresponse.h') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/unsupported/mail2/libmail/imapresponse.h | 531 |
1 files changed, 531 insertions, 0 deletions
diff --git a/noncore/unsupported/mail2/libmail/imapresponse.h b/noncore/unsupported/mail2/libmail/imapresponse.h new file mode 100644 index 0000000..73435ee --- a/dev/null +++ b/noncore/unsupported/mail2/libmail/imapresponse.h | |||
@@ -0,0 +1,531 @@ | |||
1 | #ifndef IMAPRESPONSE_H | ||
2 | #define IMAPRESPONSE_H | ||
3 | |||
4 | #include <qobject.h> | ||
5 | |||
6 | #define MAX_BODYPARTS 50 | ||
7 | |||
8 | class IMAPHandler; | ||
9 | |||
10 | class IMAPResponseEnums | ||
11 | { | ||
12 | public: | ||
13 | enum IMAPResponseStatus { | ||
14 | OK, NO, BAD, PREAUTH, BYE, UnknownStatus = 0 | ||
15 | }; | ||
16 | |||
17 | enum IMAPResponseFlags { | ||
18 | Seen, Answered, Flagged, Deleted, Draft, Recent, | ||
19 | Noinferiors, Noselect, Marked, Unmarked, UnknownFlag = 0 | ||
20 | }; | ||
21 | |||
22 | enum IMAPResponseCode { | ||
23 | ALERT, NEWNAME, PARSE, PERMANENTFLAGS, READONLY, READWRITE, | ||
24 | TRYCREATE, UIDVALIDITY, UNSEEN, NoCode, UnknownCode = 0 | ||
25 | }; | ||
26 | |||
27 | }; | ||
28 | |||
29 | class IMAPResponseAddress | ||
30 | { | ||
31 | public: | ||
32 | IMAPResponseAddress(QString name = 0, QString adl = 0, QString mailbox = 0, QString host = 0) | ||
33 | { | ||
34 | _name = name; | ||
35 | _adl = adl; | ||
36 | _mailbox = mailbox; | ||
37 | _host = host; | ||
38 | } | ||
39 | |||
40 | void setName(QString name) { _name = name; } | ||
41 | QString name() { return _name; } | ||
42 | void setAdl(QString adl) { _adl = adl; } | ||
43 | QString adl() { return _adl; } | ||
44 | void setMailbox(QString mailbox) { _mailbox = mailbox; } | ||
45 | QString mailbox() { return _mailbox; } | ||
46 | void setHost(QString host) { _host = host; } | ||
47 | QString host() { return _host; } | ||
48 | |||
49 | QString toString() | ||
50 | { | ||
51 | if (_name.isNull() && _mailbox.isNull() && _host.isNull()) | ||
52 | return QString(0); | ||
53 | if (_name != _mailbox + "@" + _host) | ||
54 | return _name + " <" + _mailbox + "@" + _host + ">"; | ||
55 | else | ||
56 | return _name; | ||
57 | } | ||
58 | |||
59 | QString email() | ||
60 | { | ||
61 | if (_host.isEmpty()) return _mailbox; | ||
62 | else return _mailbox + "@" + _host; | ||
63 | } | ||
64 | |||
65 | private: | ||
66 | QString _name, _adl, _mailbox, _host; | ||
67 | |||
68 | }; | ||
69 | |||
70 | class IMAPResponseAddressList : public QValueList<IMAPResponseAddress> | ||
71 | { | ||
72 | public: | ||
73 | IMAPResponseAddressList() | ||
74 | : QValueList<IMAPResponseAddress>() | ||
75 | { | ||
76 | |||
77 | } | ||
78 | |||
79 | QString toString() | ||
80 | { | ||
81 | QString string; | ||
82 | IMAPResponseAddressList::Iterator it; | ||
83 | for (it = this->begin(); it != this->end(); it++) { | ||
84 | QString tmp = (*it).toString(); | ||
85 | if (!tmp.isNull() && string.isEmpty()) string = tmp; | ||
86 | else if (!tmp.isNull()) string += ", " + tmp; | ||
87 | } | ||
88 | return string; | ||
89 | } | ||
90 | |||
91 | }; | ||
92 | |||
93 | class IMAPResponseBody | ||
94 | { | ||
95 | public: | ||
96 | void setData(QString data) { _data = data; } | ||
97 | QString data() { return _data; } | ||
98 | |||
99 | private: | ||
100 | QString _data; | ||
101 | |||
102 | }; | ||
103 | |||
104 | class IMAPResponseBodyPart : public IMAPResponseBody | ||
105 | { | ||
106 | public: | ||
107 | void setPart(QString part) { _part = part; } | ||
108 | QString part() { return _part; } | ||
109 | |||
110 | private: | ||
111 | QString _part; | ||
112 | |||
113 | }; | ||
114 | |||
115 | class IMAPResponseEnvelope | ||
116 | { | ||
117 | public: | ||
118 | void setMailDate(QString date) { _date = date; } | ||
119 | QString mailDate() { return _date; } | ||
120 | void setSubject(QString subject) { _subject = subject; } | ||
121 | QString subject() { return _subject; } | ||
122 | void addFrom(IMAPResponseAddress from) { _from.append(from); } | ||
123 | IMAPResponseAddressList from() { return _from; } | ||
124 | void addSender(IMAPResponseAddress sender) { _sender.append(sender); } | ||
125 | IMAPResponseAddressList sender() { return _sender; } | ||
126 | void addReplyTo(IMAPResponseAddress replyTo) { _replyTo.append(replyTo); } | ||
127 | IMAPResponseAddressList replyTo() { return _replyTo; } | ||
128 | void addTo(IMAPResponseAddress to) { _to.append(to); } | ||
129 | IMAPResponseAddressList to() { return _to; } | ||
130 | void addCc(IMAPResponseAddress cc) { _cc.append(cc); } | ||
131 | IMAPResponseAddressList cc() { return _cc; } | ||
132 | void addBcc(IMAPResponseAddress bcc) { _bcc.append(bcc); } | ||
133 | IMAPResponseAddressList bcc() { return _bcc; } | ||
134 | void setInReplyTo(QString inReplyTo) { _inReplyTo = inReplyTo; } | ||
135 | QString inReplyTo() { return _inReplyTo; } | ||
136 | void setMessageId(QString messageId) { _messageId = messageId; } | ||
137 | QString messageId() { return _messageId; } | ||
138 | |||
139 | private: | ||
140 | QString _date, _subject, _inReplyTo, _messageId; | ||
141 | IMAPResponseAddressList _from, _sender, _replyTo, _to, _cc, _bcc; | ||
142 | |||
143 | }; | ||
144 | |||
145 | class IMAPResponseStatusResponse : public IMAPResponseEnums | ||
146 | { | ||
147 | public: | ||
148 | IMAPResponseStatusResponse(IMAPResponseStatus status = (IMAPResponseStatus)0, QString comment = 0, IMAPResponseCode code = (IMAPResponseCode)0) | ||
149 | { | ||
150 | _status = status; | ||
151 | _comment = comment; | ||
152 | _code = code; | ||
153 | } | ||
154 | |||
155 | void setStatus(IMAPResponseStatus status) { _status = status; } | ||
156 | IMAPResponseStatus status() { return _status; } | ||
157 | void setComment(QString comment) { _comment = comment; } | ||
158 | QString comment() { return _comment; } | ||
159 | void setResponseCode(IMAPResponseCode code) { _code = code; } | ||
160 | IMAPResponseCode responseCode() { return _code; } | ||
161 | |||
162 | void setExitedUnexpected(bool exitu) { _exitu = exitu; } | ||
163 | bool exitedUnexpected() { return _exitu; } | ||
164 | |||
165 | private: | ||
166 | IMAPResponseStatus _status; | ||
167 | QString _comment; | ||
168 | IMAPResponseCode _code; | ||
169 | bool _exitu; | ||
170 | |||
171 | }; | ||
172 | |||
173 | class IMAPResponseOK : public IMAPResponseEnums | ||
174 | { | ||
175 | public: | ||
176 | IMAPResponseOK(QString comment = 0, IMAPResponseCode code = (IMAPResponseCode)0) | ||
177 | { | ||
178 | _comment = comment; | ||
179 | _code = code; | ||
180 | } | ||
181 | |||
182 | void setComment(QString comment) { _comment = comment; } | ||
183 | QString comment() { return _comment; } | ||
184 | void setResponseCode(IMAPResponseCode code) { _code = code; } | ||
185 | IMAPResponseCode responseCode() { return _code; } | ||
186 | |||
187 | private: | ||
188 | QString _comment; | ||
189 | IMAPResponseCode _code; | ||
190 | |||
191 | }; | ||
192 | |||
193 | class IMAPResponseNO : public IMAPResponseEnums | ||
194 | { | ||
195 | public: | ||
196 | IMAPResponseNO(QString comment = 0, IMAPResponseCode code = (IMAPResponseCode)0) | ||
197 | { | ||
198 | _comment = comment; | ||
199 | _code = code; | ||
200 | } | ||
201 | |||
202 | void setComment(QString comment) { _comment = comment; } | ||
203 | QString comment() { return _comment; } | ||
204 | void setResponseCode(IMAPResponseCode code) { _code = code; } | ||
205 | IMAPResponseCode responseCode() { return _code; } | ||
206 | |||
207 | private: | ||
208 | QString _comment; | ||
209 | IMAPResponseCode _code; | ||
210 | |||
211 | }; | ||
212 | |||
213 | class IMAPResponseBAD : public IMAPResponseEnums | ||
214 | { | ||
215 | public: | ||
216 | IMAPResponseBAD(QString comment = 0, IMAPResponseCode code = (IMAPResponseCode)0) | ||
217 | { | ||
218 | _comment = comment; | ||
219 | _code = code; | ||
220 | } | ||
221 | |||
222 | void setComment(QString comment) { _comment = comment; } | ||
223 | QString comment() { return _comment; } | ||
224 | void setResponseCode(IMAPResponseCode code) { _code = code; } | ||
225 | IMAPResponseCode responseCode() { return _code; } | ||
226 | |||
227 | private: | ||
228 | QString _comment; | ||
229 | IMAPResponseCode _code; | ||
230 | |||
231 | }; | ||
232 | |||
233 | class IMAPResponseCAPABILITY | ||
234 | { | ||
235 | public: | ||
236 | IMAPResponseCAPABILITY(QStringList capabilities = 0) | ||
237 | { | ||
238 | _capabilities = capabilities; | ||
239 | } | ||
240 | |||
241 | void setCapabilities(QStringList capabilities) { _capabilities = capabilities; } | ||
242 | QStringList capabilities() { return _capabilities; } | ||
243 | |||
244 | private: | ||
245 | QStringList _capabilities; | ||
246 | |||
247 | }; | ||
248 | |||
249 | class IMAPResponseLIST : public IMAPResponseEnums | ||
250 | { | ||
251 | public: | ||
252 | IMAPResponseLIST(QValueList<IMAPResponseFlags> flags = QValueList<IMAPResponseFlags>(), QString folderSeparator = 0, QString folder = 0) | ||
253 | { | ||
254 | _flags = flags; | ||
255 | _folderSeparator = folderSeparator; | ||
256 | _folder = folder; | ||
257 | } | ||
258 | |||
259 | void setFlags(QValueList<IMAPResponseFlags> flags) { _flags = flags; } | ||
260 | QValueList<IMAPResponseFlags> flags() { return _flags; } | ||
261 | void setFolderSeparator(QString folderSeparator) { _folderSeparator = folderSeparator; } | ||
262 | QString folderSeparator() { return _folderSeparator; } | ||
263 | void setFolder(QString folder) { _folder = folder; } | ||
264 | QString folder() { return _folder; } | ||
265 | |||
266 | private: | ||
267 | QValueList<IMAPResponseFlags> _flags; | ||
268 | QString _folderSeparator, _folder; | ||
269 | |||
270 | }; | ||
271 | |||
272 | class IMAPResponseLSUB : public IMAPResponseEnums | ||
273 | { | ||
274 | public: | ||
275 | IMAPResponseLSUB(QValueList<IMAPResponseFlags> flags = QValueList<IMAPResponseFlags>(), QString folderSeperator = 0, QString folder = 0) | ||
276 | { | ||
277 | _flags = flags; | ||
278 | _folderSeperator = folderSeperator; | ||
279 | _folder = folder; | ||
280 | } | ||
281 | |||
282 | void setFlags(QValueList<IMAPResponseFlags> flags) { _flags = flags; } | ||
283 | QValueList<IMAPResponseFlags> flags() { return _flags; } | ||
284 | void setFolderSeperator(QString folderSeperator) { _folderSeperator = folderSeperator; } | ||
285 | QString folderSeperator() { return _folderSeperator; } | ||
286 | void setFolder(QString folder) { _folder = folder; } | ||
287 | QString folder() { return _folder; } | ||
288 | |||
289 | private: | ||
290 | QValueList<IMAPResponseFlags> _flags; | ||
291 | QString _folderSeperator, _folder; | ||
292 | |||
293 | }; | ||
294 | |||
295 | class IMAPResponseSTATUS | ||
296 | { | ||
297 | public: | ||
298 | IMAPResponseSTATUS(QString mailbox = 0, QString messages = 0, QString recent = 0, QString uidnext = 0, QString uidvalidity = 0, QString unseen = 0) | ||
299 | { | ||
300 | _mailbox = mailbox; | ||
301 | _messages = messages; | ||
302 | _recent = recent; | ||
303 | _uidnext = uidnext; | ||
304 | _uidvalidity = uidvalidity; | ||
305 | _unseen = unseen; | ||
306 | } | ||
307 | |||
308 | void setMailbox(QString &mailbox) { _mailbox = mailbox; } | ||
309 | QString mailbox() { return _mailbox; } | ||
310 | void setMessages(QString &messages) { _messages = messages; } | ||
311 | QString messages() { return _messages; } | ||
312 | void setRecent(QString &recent) { _recent = recent; } | ||
313 | QString recent() { return _recent; } | ||
314 | void setUidnext(QString &uidnext) { _uidnext = uidnext; } | ||
315 | QString uidnext() { return _uidnext; } | ||
316 | void setUidvalidity(QString &uidvalidity) { _uidvalidity = uidvalidity; } | ||
317 | QString uidvalidity() { return _uidvalidity; } | ||
318 | void setUnseen(QString &unseen) { _unseen = unseen; } | ||
319 | QString unseen() { return _unseen; } | ||
320 | |||
321 | private: | ||
322 | QString _mailbox, _messages, _recent, _uidnext, _uidvalidity, _unseen; | ||
323 | |||
324 | }; | ||
325 | |||
326 | class IMAPResponseSEARCH | ||
327 | { | ||
328 | public: | ||
329 | IMAPResponseSEARCH(QStringList mails = 0) | ||
330 | { | ||
331 | _mails = mails; | ||
332 | } | ||
333 | |||
334 | void setMails(QStringList mails) { _mails = mails; } | ||
335 | QStringList mails() { return _mails; } | ||
336 | |||
337 | private: | ||
338 | QStringList _mails; | ||
339 | |||
340 | }; | ||
341 | |||
342 | class IMAPResponseFLAGS : public IMAPResponseEnums | ||
343 | { | ||
344 | public: | ||
345 | IMAPResponseFLAGS(QValueList<IMAPResponseFlags> flags = QValueList<IMAPResponseFlags>()) | ||
346 | { | ||
347 | _flags = flags; | ||
348 | } | ||
349 | |||
350 | void setFlags(QValueList<IMAPResponseFlags> flags) { _flags = flags; } | ||
351 | QValueList<IMAPResponseFlags> flags() { return _flags; } | ||
352 | |||
353 | private: | ||
354 | QValueList<IMAPResponseFlags> _flags; | ||
355 | |||
356 | }; | ||
357 | |||
358 | class IMAPResponseEXISTS | ||
359 | { | ||
360 | public: | ||
361 | IMAPResponseEXISTS(QString mails = 0) | ||
362 | { | ||
363 | _mails = mails; | ||
364 | } | ||
365 | |||
366 | void setMails(QString mails) { _mails = mails; } | ||
367 | QString mails() { return _mails; } | ||
368 | |||
369 | private: | ||
370 | QString _mails; | ||
371 | |||
372 | }; | ||
373 | |||
374 | class IMAPResponseRECENT | ||
375 | { | ||
376 | public: | ||
377 | IMAPResponseRECENT(QString mails = 0) | ||
378 | { | ||
379 | _mails = mails; | ||
380 | } | ||
381 | |||
382 | void setMails(QString mails) { _mails = mails; } | ||
383 | QString mails() { return _mails; } | ||
384 | |||
385 | private: | ||
386 | QString _mails; | ||
387 | |||
388 | }; | ||
389 | |||
390 | class IMAPResponseEXPUNGE | ||
391 | { | ||
392 | public: | ||
393 | IMAPResponseEXPUNGE(QString mails = 0) | ||
394 | { | ||
395 | _mails = mails; | ||
396 | } | ||
397 | |||
398 | void setMails(QString mails) { _mails = mails; } | ||
399 | QString mails() { return _mails; } | ||
400 | |||
401 | private: | ||
402 | QString _mails; | ||
403 | |||
404 | }; | ||
405 | |||
406 | class IMAPResponseFETCH : public IMAPResponseEnums | ||
407 | { | ||
408 | public: | ||
409 | void setEnvelope(IMAPResponseEnvelope envelope) { _envelope = envelope; } | ||
410 | IMAPResponseEnvelope envelope() { return _envelope; } | ||
411 | void setFlags(QValueList<IMAPResponseFlags> flags) { _flags = flags; } | ||
412 | QValueList<IMAPResponseFlags> flags() { return _flags; } | ||
413 | void setInternalDate(QString idate) { _idate = idate; } | ||
414 | QString internalDate() { return _idate; } | ||
415 | void setRFC822Size(QString rfc822size) { _rfc822size = rfc822size; } | ||
416 | QString RFC822Size() { return _rfc822size; } | ||
417 | void setUid(QString uid) { _uid = uid; } | ||
418 | QString uid() { return _uid; } | ||
419 | |||
420 | void setBody(QString body) { _body = body; } | ||
421 | QString body() { return _body; } | ||
422 | void addBodyPart(IMAPResponseBodyPart part) { _bodyParts.append(part); } | ||
423 | void setBodyParts(QValueList<IMAPResponseBodyPart> parts) { _bodyParts = parts; } | ||
424 | QValueList<IMAPResponseBodyPart> bodyParts() { return _bodyParts; } | ||
425 | IMAPResponseBodyPart bodyPart(int part) { return _bodyParts[part]; } | ||
426 | void setRfc822(QString rfc822) { _rfc822 = rfc822; } | ||
427 | QString rfc822() { return _rfc822; } | ||
428 | void setRfc822Header(QString rfc822Header) { _rfc822Header = rfc822Header; } | ||
429 | QString rfc822Header() { return _rfc822Header; } | ||
430 | void setRfc822Text(QString rfc822Text) { _rfc822Text = rfc822Text; } | ||
431 | QString rfc822Text() { return _rfc822Text; } | ||
432 | |||
433 | private: | ||
434 | IMAPResponseEnvelope _envelope; | ||
435 | QValueList<IMAPResponseFlags> _flags; | ||
436 | QString _idate, _rfc822size, _uid, _body, _rfc822, _rfc822Header, _rfc822Text; | ||
437 | QValueList<IMAPResponseBodyPart> _bodyParts; | ||
438 | |||
439 | }; | ||
440 | |||
441 | class IMAPResponse : public IMAPResponseEnums | ||
442 | { | ||
443 | public: | ||
444 | void setTag(QString tag) { _tag = tag; } | ||
445 | QString tag() { return _tag; } | ||
446 | |||
447 | void setImapHandler(IMAPHandler *handler) { _handler = handler; } | ||
448 | IMAPHandler *imapHandler() { return _handler; } | ||
449 | |||
450 | void setStatusResponse(IMAPResponseStatusResponse response) { _response = response; } | ||
451 | IMAPResponseStatusResponse statusResponse() { return _response; } | ||
452 | |||
453 | void addOK(IMAPResponseOK ok) { _okl.append(ok); } | ||
454 | void addNO(IMAPResponseNO no) { _nol.append(no); } | ||
455 | void addBAD(IMAPResponseBAD bad) { _badl.append(bad); } | ||
456 | void addCAPABILITY(IMAPResponseCAPABILITY capability) { _capabilityl.append(capability); } | ||
457 | void addLIST(IMAPResponseLIST list) { _listl.append(list); } | ||
458 | void addLSUB(IMAPResponseLSUB lsub) { _lsubl.append(lsub); } | ||
459 | void addSTATUS(IMAPResponseSTATUS status) { _statusl.append(status); } | ||
460 | void addSEARCH(IMAPResponseSEARCH search) { _searchl.append(search); } | ||
461 | void addFLAGS(IMAPResponseFLAGS flags) { _flagsl.append(flags); } | ||
462 | void addEXISTS(IMAPResponseEXISTS exists) { _existsl.append(exists); } | ||
463 | void addRECENT(IMAPResponseRECENT recent) { _recentl.append(recent); } | ||
464 | void addEXPUNGE(IMAPResponseEXPUNGE expunge) { _expungel.append(expunge); } | ||
465 | void addFETCH(IMAPResponseFETCH fetch) { _fetchl.append(fetch); } | ||
466 | |||
467 | QValueList<IMAPResponseOK> OK() { return _okl; } | ||
468 | QValueList<IMAPResponseNO> NO() { return _nol; } | ||
469 | QValueList<IMAPResponseBAD> BAD() { return _badl; } | ||
470 | QValueList<IMAPResponseCAPABILITY> CAPABILITY() { return _capabilityl; } | ||
471 | QValueList<IMAPResponseLIST> LIST() { return _listl; } | ||
472 | QValueList<IMAPResponseLSUB> LSUB() { return _lsubl; } | ||
473 | QValueList<IMAPResponseSTATUS> STATUS() { return _statusl; } | ||
474 | QValueList<IMAPResponseSEARCH> SEARCH() { return _searchl; } | ||
475 | QValueList<IMAPResponseFLAGS> FLAGS() { return _flagsl; } | ||
476 | QValueList<IMAPResponseEXISTS> EXISTS() { return _existsl; } | ||
477 | QValueList<IMAPResponseRECENT> RECENT() { return _recentl; } | ||
478 | QValueList<IMAPResponseEXPUNGE> EXPUNGE() { return _expungel; } | ||
479 | QValueList<IMAPResponseFETCH> FETCH() { return _fetchl; } | ||
480 | |||
481 | private: | ||
482 | QString _tag; | ||
483 | IMAPResponseStatusResponse _response; | ||
484 | |||
485 | IMAPHandler *_handler; | ||
486 | |||
487 | QValueList<IMAPResponseOK> _okl; | ||
488 | QValueList<IMAPResponseNO> _nol; | ||
489 | QValueList<IMAPResponseBAD> _badl; | ||
490 | QValueList<IMAPResponseCAPABILITY> _capabilityl; | ||
491 | QValueList<IMAPResponseLIST> _listl; | ||
492 | QValueList<IMAPResponseLSUB> _lsubl; | ||
493 | QValueList<IMAPResponseSTATUS> _statusl; | ||
494 | QValueList<IMAPResponseSEARCH> _searchl; | ||
495 | QValueList<IMAPResponseFLAGS> _flagsl; | ||
496 | QValueList<IMAPResponseEXISTS> _existsl; | ||
497 | QValueList<IMAPResponseRECENT> _recentl; | ||
498 | QValueList<IMAPResponseEXPUNGE> _expungel; | ||
499 | QValueList<IMAPResponseFETCH> _fetchl; | ||
500 | |||
501 | }; | ||
502 | |||
503 | class IMAPResponseParser : public QObject, public IMAPResponseEnums | ||
504 | { | ||
505 | Q_OBJECT | ||
506 | |||
507 | public: | ||
508 | IMAPResponseParser(const QString &data); | ||
509 | |||
510 | IMAPResponse response(); | ||
511 | |||
512 | signals: | ||
513 | void needMoreData(const QString &comment); | ||
514 | |||
515 | protected: | ||
516 | void parseResponse(const QString &data, bool tagged = false); | ||
517 | |||
518 | QStringList splitData(const QString &data, bool withBrackets); | ||
519 | void parseParenthesizedList(const QString &data, QStringList &parsed); | ||
520 | void splitTagData(const QString &line, QString &tag, QString &data); | ||
521 | QString removeLimiters(QString &string, const QChar &sl = '"', const QChar &el = '"'); | ||
522 | IMAPResponseCode getResponseCode(const QString &line); | ||
523 | QValueList<IMAPResponseFlags> parseFlagList(const QStringList &flags); | ||
524 | |||
525 | private: | ||
526 | IMAPResponse _iresponse; | ||
527 | |||
528 | }; | ||
529 | |||
530 | #endif | ||
531 | |||