Skip to content

Commit 2f2670d

Browse files
committed
Merge remote-tracking branch 'nlnetlabs/main'
# Conflicts: # src/generic/type.h # src/generic/types.h # src/westmere/type.h
2 parents adbc3ef + 3326ba4 commit 2f2670d

File tree

14 files changed

+552
-9
lines changed

14 files changed

+552
-9
lines changed

CHANGELOG.md

+12-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,18 @@ All notable changes to simdzone will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8-
## [0.2.1] - 2025-??-??
8+
## [0.2.2] - 2025-??-??
9+
10+
### Added
11+
12+
- Support for EID, NIMLOC, SINK, TALINK, DSYNC, DOA, AMTRELAY and IPN RR types.
13+
14+
### Fixed
15+
16+
- Empty base16 and base64 in CDS and CDNSKEY can be represented with a '0'.
17+
As specified in Section 4 of RFC 8078.
18+
19+
## [0.2.1] - 2025-01-17
920

1021
### Fixed
1122

configure.ac

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
# platform not supported by NSD here is undesirable. Builds for standalone use
1111
# or development/testing are required to use CMake.
1212

13-
AC_INIT([simdzone],[0.2.0],[https://github.com/NLnetLabs/simdzone/issues])
13+
AC_INIT([simdzone],[0.2.2],[https://github.com/NLnetLabs/simdzone/issues])
1414

1515
AC_CONFIG_HEADERS([config.h])
1616
AC_CONFIG_FILES([Makefile])

include/zone.h

+18
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,14 @@ extern "C" {
120120
#define ZONE_TYPE_LOC (29u)
121121
/** Next domain @rfc{3755} @rfc{2535} @obsolete */
122122
#define ZONE_TYPE_NXT (30u)
123+
/** Endpoint Identifier */
124+
#define ZONE_TYPE_EID (31u)
125+
/** Nimrod Locator */
126+
#define ZONE_TYPE_NIMLOC (32u)
123127
/** Server Selection @rfc{2782} */
124128
#define ZONE_TYPE_SRV (33u)
129+
/** ATM Address */
130+
#define ZONE_TYPE_ATMA (34u)
125131
/** Naming Authority Pointer @rfc{2915} @rfc{2168} @rfc{3403} */
126132
#define ZONE_TYPE_NAPTR (35u)
127133
/** Key Exchanger @rfc{2230} */
@@ -132,6 +138,8 @@ extern "C" {
132138
#define ZONE_TYPE_A6 (38u)
133139
/** DNAME @rfc{6672} */
134140
#define ZONE_TYPE_DNAME (39u)
141+
/** SINK @draft{eastlake, kitchen-sink} */
142+
#define ZONE_TYPE_SINK (40u)
135143
/** Address Prefix List @rfc{3123} */
136144
#define ZONE_TYPE_APL (42u)
137145
/** Delegation Signer @rfc{4034} @rfc{3658} */
@@ -162,6 +170,8 @@ extern "C" {
162170
#define ZONE_TYPE_NINFO (56u)
163171
/** RKEY */
164172
#define ZONE_TYPE_RKEY (57u)
173+
/** Trust Anchor LINK @draft{ietf, dnsop-dnssec-trust-history} */
174+
#define ZONE_TYPE_TALINK (58u)
165175
/** Child DS @rfc{7344} */
166176
#define ZONE_TYPE_CDS (59u)
167177
/** DNSKEY(s) the Child wants reflected in DS @rfc{7344} */
@@ -176,6 +186,8 @@ extern "C" {
176186
#define ZONE_TYPE_SVCB (64u)
177187
/** Service binding @rfc{9460} */
178188
#define ZONE_TYPE_HTTPS (65u)
189+
/** Endpoint discovery for delegation synchronization @draft{ietf, dnsop-generalized-notify} */
190+
#define ZONE_TYPE_DSYNC (66u)
179191
/** Sender Policy Framework @rfc{7208} */
180192
#define ZONE_TYPE_SPF (99u)
181193
/** Node Identifier @rfc{6742} */
@@ -196,12 +208,18 @@ extern "C" {
196208
#define ZONE_TYPE_CAA (257u)
197209
/** DNS Authoritative Source (DNS-AS) */
198210
#define ZONE_TYPE_AVC (258u)
211+
/** Digital Object Architecture @draft{durand, doa-over-dns} */
212+
#define ZONE_TYPE_DOA (259u)
213+
/** Automatic Multicast Tunneling Relay @rfc{8777} */
214+
#define ZONE_TYPE_AMTRELAY (260u)
199215
/** Resolver Information as Key/Value Pairs @rfc{9606} */
200216
#define ZONE_TYPE_RESINFO (261u)
201217
/** Public wallet address */
202218
#define ZONE_TYPE_WALLET (262u)
203219
/** BP Convergence Layer Adapter */
204220
#define ZONE_TYPE_CLA (263u)
221+
/** BP Node Number */
222+
#define ZONE_TYPE_IPN (264u)
205223
/** DNSSEC Trust Authorities */
206224
#define ZONE_TYPE_TA (32768u)
207225
/** DNSSEC Lookaside Validation @rfc{4431} @obsolete */

scripts/check-RR-types.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ RECORDS=`xmlstarlet select --template --match "/_:registry/_:registry[@id='dns-p
1717
rm ${TEMPFILE}
1818
for RECORD in ${RECORDS}
1919
do
20-
TYPE=`echo ${RECORD} | awk -F# '{ print $1 }'`
20+
TYPE=`echo ${RECORD} | awk -F# '{ print $1 }'|sed 's/-/_/g'`
2121
VALUE=`echo ${RECORD} | awk -F# '{ print $2 }'`
2222
RECORD_TYPE=`echo ${RECORD} | awk -F# '{ print $3 }'`
2323
RECORD_REF=`echo ${RECORD} | awk -F# '{ print $4 }'`

scripts/hash.c

+11-2
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,16 @@ static const tuple_t types_and_classes[] = {
5555
{ "AAAA", 28, true },
5656
{ "LOC", 29, true },
5757
{ "NXT", 30, true },
58+
{ "EID", 31, true },
59+
{ "NIMLOC", 32, true },
5860
{ "SRV", 33, true },
61+
{ "ATMA", 34, true },
5962
{ "NAPTR", 35, true },
6063
{ "KX", 36, true },
6164
{ "CERT", 37, true },
6265
{ "A6", 38, true },
6366
{ "DNAME", 39, true },
67+
{ "SINK", 40, true },
6468
{ "APL", 42, true },
6569
{ "DS", 43, true },
6670
{ "SSHFP", 44, true },
@@ -76,13 +80,15 @@ static const tuple_t types_and_classes[] = {
7680
{ "HIP", 55, true },
7781
{ "NINFO", 56, true },
7882
{ "RKEY", 57, true },
83+
{ "TALINK", 58, true },
7984
{ "CDS", 59, true },
8085
{ "CDNSKEY", 60, true },
8186
{ "OPENPGPKEY", 61, true },
8287
{ "CSYNC", 62, true },
8388
{ "ZONEMD", 63, true },
8489
{ "SVCB", 64, true },
8590
{ "HTTPS", 65, true },
91+
{ "DSYNC", 66, true },
8692
{ "SPF", 99, true },
8793
{ "NID", 104, true },
8894
{ "L32", 105, true },
@@ -93,9 +99,12 @@ static const tuple_t types_and_classes[] = {
9399
{ "URI", 256, true },
94100
{ "CAA", 257, true },
95101
{ "AVC", 258, true },
102+
{ "DOA", 259, true },
103+
{ "AMTRELAY", 260, true },
96104
{ "RESINFO", 261, true },
97105
{ "WALLET", 262, true },
98106
{ "CLA", 263, true },
107+
{ "IPN", 264, true },
99108
{ "TA", 32768, true },
100109
{ "DLV", 32769, true },
101110
{ "IDELEG", 65280, true }
@@ -128,9 +137,9 @@ static void print_table(uint64_t magic)
128137
for (size_t j=i+8; i < j; i++) {
129138
uint16_t code;
130139
switch(keys[i].code) {
131-
case 32768: code = 265; // index of TA in types array in generic/types.h
140+
case 32768: code = 270; // index of TA in types array in generic/types.h
132141
break;
133-
case 32769: code = 266; // index of DLV in types array in generic/types.h
142+
case 32769: code = 271; // index of DLV in types array in generic/types.h
134143
break;
135144
case 65280: code = 267; // index of IDELEG in types array in generic/types.h
136145
break;

src/fallback/parser.c

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "generic/apl.h"
3636
#include "generic/svcb.h"
3737
#include "generic/cert.h"
38+
#include "generic/atma.h"
3839
#include "generic/algorithm.h"
3940
#include "generic/types.h"
4041
#include "generic/type.h"

src/generic/atma.h

+215
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
/*
2+
* atma.h -- ATMA parser (see: https://web.archive.org/web/20190112072924/http://www.broadband-forum.org/ftp/pub/approved-specs/af-dans-0152.000.pdf )
3+
*
4+
* Copyright (c) 2025, NLnet Labs. All rights reserved.
5+
*
6+
* SPDX-License-Identifier: BSD-3-Clause
7+
*
8+
*/
9+
#ifndef ATMA_H
10+
#define ATMA_H
11+
12+
static const uint8_t bad_atma_chars[256] = {
13+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x00 - 0x07
14+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x08 - 0x0f
15+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x10 - 0x17
16+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x18 - 0x1f
17+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x20 - 0x27
18+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, // 0x28 - 0x2f
19+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x30 - 0x37
20+
0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x38 - 0x3f
21+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x40 - 0x47
22+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x48 - 0x4f
23+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x50 - 0x57
24+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x58 - 0x5f
25+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x60 - 0x67
26+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x68 - 0x6f
27+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x70 - 0x77
28+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x78 - 0x7f
29+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x80 - 0x87
30+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x88 - 0x8f
31+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x90 - 0x97
32+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x98 - 0x9f
33+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xa0 - 0xa7
34+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xa8 - 0xaf
35+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xb0 - 0xb7
36+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xb8 - 0xbf
37+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xc0 - 0xc7
38+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xc8 - 0xcf
39+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xd0 - 0xd7
40+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xd8 - 0xdf
41+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xe0 - 0xe7
42+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xe0 - 0xe7
43+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xf8 - 0xff
44+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xf8 - 0xff
45+
};
46+
47+
static const uint8_t atma_increment[256] = {
48+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x01 - 0x07
49+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 - 0x0f
50+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 - 0x17
51+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 - 0x1f
52+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 - 0x27
53+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 - 0x2f
54+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x30 - 0x37
55+
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 - 0x3f
56+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 - 0x47
57+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 - 0x4f
58+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 - 0x57
59+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 - 0x5f
60+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 - 0x67
61+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 - 0x6f
62+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 - 0x77
63+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 - 0x7f
64+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 - 0x87
65+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 - 0x8f
66+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 - 0x97
67+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 - 0x9f
68+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xa0 - 0xa7
69+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xa8 - 0xaf
70+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xb0 - 0xb7
71+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xb8 - 0xbf
72+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xc0 - 0xc7
73+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xc8 - 0xcf
74+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xd0 - 0xd7
75+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xd8 - 0xdf
76+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xe0 - 0xe7
77+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xe0 - 0xe7
78+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xf8 - 0x00
79+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xf8 - 0x00
80+
};
81+
82+
83+
nonnull_all
84+
static really_inline int32_t parse_atma_e164(
85+
parser_t *parser,
86+
const type_info_t *type,
87+
const rdata_info_t *field,
88+
rdata_t *rdata,
89+
const token_t *token)
90+
{
91+
uint32_t bad_chars = 0;
92+
for (size_t count=1; count < token->length; count++) {
93+
const uint8_t octet = (uint8_t)token->data[count];
94+
*rdata->octets = octet;
95+
rdata->octets += atma_increment[octet];
96+
bad_chars |= bad_atma_chars[octet];
97+
}
98+
if (bad_chars)
99+
SEMANTIC_ERROR(parser, "Invalid %s in %s", NAME(field), NAME(type));
100+
101+
return 0;
102+
}
103+
104+
nonnull((1,2,4,5))
105+
static really_inline int atma_stream_decode(
106+
struct base16_state *state,
107+
const char *src,
108+
size_t srclen,
109+
uint8_t *out,
110+
size_t *outlen)
111+
{
112+
int ret = 0;
113+
const uint8_t *s = (const uint8_t *) src;
114+
uint8_t *o = (uint8_t *) out;
115+
uint32_t q;
116+
117+
// Use local temporaries to avoid cache thrashing:
118+
size_t olen = 0;
119+
size_t slen = srclen;
120+
struct base16_state st;
121+
st.eof = state->eof;
122+
st.bytes = state->bytes;
123+
st.carry = state->carry;
124+
125+
if (st.eof) {
126+
*outlen = 0;
127+
return ret;
128+
}
129+
130+
// Duff's device again:
131+
switch (st.bytes)
132+
{
133+
#if defined(__SUNPRO_C)
134+
#pragma error_messages(off, E_STATEMENT_NOT_REACHED)
135+
#endif
136+
for (;;)
137+
#if defined(__SUNPRO_C)
138+
#pragma error_messages(default, E_STATEMENT_NOT_REACHED)
139+
#endif
140+
{
141+
case 0:
142+
base16_dec_loop_generic_32(&s, &slen, &o, &olen);
143+
if (slen-- == 0) {
144+
ret = 1;
145+
break;
146+
}
147+
if ((q = base16_table_dec_32bit_d0[*s++]) == 256) {
148+
st.eof = BASE16_EOF;
149+
break;
150+
} else if (q == 257) {
151+
continue;
152+
}
153+
st.carry = (uint8_t)q;
154+
st.bytes = 1;
155+
156+
// fallthrough
157+
158+
case 1:
159+
if (slen-- == 0) {
160+
ret = 1;
161+
break;
162+
}
163+
if ((q = base16_table_dec_32bit_d1[*s++]) == 256) {
164+
st.eof = BASE16_EOF;
165+
break;
166+
} else if (q == 257) {
167+
continue;
168+
}
169+
*o++ = st.carry | (uint8_t)q;
170+
st.carry = 0;
171+
st.bytes = 0;
172+
olen++;
173+
}
174+
}
175+
176+
state->eof = st.eof;
177+
state->bytes = st.bytes;
178+
state->carry = st.carry;
179+
*outlen = olen;
180+
return ret;
181+
}
182+
183+
nonnull((1,3,4))
184+
static really_inline int atma_decode(
185+
const char *src, size_t srclen, uint8_t *out, size_t *outlen)
186+
{
187+
struct base16_state state = { .eof = 0, .bytes = 0, .carry = 0 };
188+
return atma_stream_decode(&state, src, srclen, out, outlen) & !state.bytes;
189+
}
190+
191+
nonnull_all
192+
static really_inline int32_t parse_atma(
193+
parser_t *parser,
194+
const type_info_t *type,
195+
const rdata_info_t *field,
196+
rdata_t *rdata,
197+
const token_t *token)
198+
{
199+
if (token->length && (char)*token->data == '+') {
200+
*rdata->octets++ = 1;
201+
if ((uintptr_t)rdata->limit - (uintptr_t)rdata->octets < token->length)
202+
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), NAME(type));
203+
return parse_atma_e164(parser, type, field, rdata, token);
204+
}
205+
size_t length = token->length / 2;
206+
if ((uintptr_t)rdata->limit - (uintptr_t)rdata->octets < length)
207+
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), NAME(type));
208+
*rdata->octets++ = 0;
209+
if (!atma_decode(token->data, token->length, rdata->octets, &length))
210+
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), NAME(type));
211+
rdata->octets += length;
212+
return 0;
213+
}
214+
215+
#endif // ATMA_H

src/generic/base16.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static const uint32_t base16_table_dec_32bit_d0[256] = {
2727
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
2828
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
2929
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
30-
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
30+
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 257, 256,
3131
0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 256, 256,
3232
256, 256, 256, 256, 256, 160, 176, 192, 208, 224, 240, 256,
3333
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
@@ -52,7 +52,7 @@ static const uint32_t base16_table_dec_32bit_d1[256] = {
5252
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
5353
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
5454
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
55-
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
55+
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 257, 256,
5656
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 256, 256,
5757
256, 256, 256, 256, 256, 10, 11, 12, 13, 14, 15, 256,
5858
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,

0 commit comments

Comments
 (0)