Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:24
erlang
6580-inet_dns-support-TSIG.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 6580-inet_dns-support-TSIG.patch of Package erlang
From 2473a414da546440636e722dd794c2e12ad892f0 Mon Sep 17 00:00:00 2001 From: Alexander Clouter <alex@digriz.org.uk> Date: Wed, 9 Aug 2023 16:38:55 +0100 Subject: [PATCH 10/10] inet_dns: support TSIG --- lib/kernel/src/Makefile | 2 + lib/kernel/src/inet_dns.erl | 86 ++- lib/kernel/src/inet_dns.hrl | 48 ++ lib/kernel/src/inet_dns_tsig.erl | 319 +++++++++++ lib/kernel/src/inet_res.erl | 13 +- lib/kernel/src/kernel.app.src | 1 + lib/kernel/test/inet_res_SUITE.erl | 195 ++++++- .../inet_res_SUITE_data/otptest/knot_inc.conf | 13 +- .../inet_res_SUITE_data/otptest/otptest.zone | 507 ++++++++++++++++++ 9 files changed, 1178 insertions(+), 6 deletions(-) create mode 100644 lib/kernel/src/inet_dns_tsig.erl diff --git a/lib/kernel/src/Makefile b/lib/kernel/src/Makefile index f67044f5e7..929f1d2c4e 100644 --- a/lib/kernel/src/Makefile +++ b/lib/kernel/src/Makefile @@ -100,6 +100,7 @@ MODULES = \ inet_config \ inet_db \ inet_dns \ + inet_dns_tsig \ inet_gethost_native \ inet_hosts \ inet_parse \ @@ -266,6 +267,7 @@ $(EBIN)/inet6_sctp.beam: inet_int.hrl $(EBIN)/inet_config.beam: inet_config.hrl ../include/inet.hrl $(EBIN)/inet_db.beam: ../include/inet.hrl inet_int.hrl inet_res.hrl inet_dns.hrl inet_config.hrl $(EBIN)/inet_dns.beam: inet_int.hrl inet_dns.hrl inet_dns_record_adts.hrl +$(EBIN)/inet_dns_tsig.beam: inet_dns.hrl $(EBIN)/inet_gethost_native.beam: ../include/inet.hrl $(EBIN)/inet_hosts.beam: ../include/inet.hrl $(EBIN)/inet_parse.beam: ../include/file.hrl diff --git a/lib/kernel/src/inet_dns.erl b/lib/kernel/src/inet_dns.erl index 6228ca9790..c65546a7e5 100644 --- a/lib/kernel/src/inet_dns.erl +++ b/lib/kernel/src/inet_dns.erl @@ -33,8 +33,10 @@ %% RFC 6762: Multicast DNS %% RFC 6891: Extension Mechanisms for DNS (EDNS0) %% RFC 7553: The Uniform Resource Identifier (URI) DNS Resource Record +%% RFC 8945: Secret Key Transaction Authentication for DNS (TSIG) -export([decode/1, encode/1]). +-export([decode_algname/1, encode_algname/1]). -import(lists, [reverse/1]). @@ -253,6 +255,28 @@ decode_rr_section(Opcode, Bin, N, Buffer, RRs) -> z = Z, data = D, do = DnssecOk}; + ?S_TSIG -> + %% RFC 8945: 5.2. FORMERR if not last + %% RFC 8945: 5.2. FORMERR if more than one dns_rr_tsig + %% (...covered by being last) + Rest =/= <<>> andalso throw(?DECODE_ERROR), + {DR,AlgName} = decode_name(D, Buffer), + ?MATCH_ELSE_DECODE_ERROR( + DR, + <<Now:48, Fudge:16, MACSize:16, MAC:MACSize/binary, + OriginalId:16, Error:16, + OtherLen:16, OtherData:OtherLen/binary>>, + #dns_rr_tsig{ + domain = Name, + type = Type, + offset = byte_size(Buffer) - byte_size(Bin), + algname = AlgName, + now = Now, + fudge = Fudge, + mac = MAC, + original_id = OriginalId, + error = Error, + other_data = OtherData}); _ -> {Class,CacheFlush} = decode_class(C), Data = if @@ -347,7 +371,22 @@ encode_res_section( DO = case DnssecOk of true -> 1; false -> 0 end, encode_res_section_rr( Opcode, Bin, Comp, Rs, DName, ?S_OPT, UdpPayloadSize, false, - <<ExtRCode,Version,DO:1,Z:15>>, Data). + <<ExtRCode,Version,DO:1,Z:15>>, Data); +encode_res_section( + Opcode, Bin, Comp, + [#dns_rr_tsig{ + domain = DName, + algname = AlgName, + now = Now, + fudge = Fudge, + mac = MAC, + original_id = OriginalId, + error = Error, + other_data = OtherData}]) -> + Data = {AlgName,Now,Fudge,MAC,OriginalId,Error,OtherData}, + encode_res_section_rr( + Opcode, Bin, Comp, [], DName, ?S_TSIG, ?S_ANY, false, + <<0:32/signed>>, Data). encode_res_section_rr( Opcode, Bin0, Comp0, Rs, DName, Type, Class, CacheFlush, TTL, Data) -> @@ -399,6 +438,7 @@ decode_type(Type) -> ?T_UID -> ?S_UID; ?T_GID -> ?S_GID; ?T_UNSPEC -> ?S_UNSPEC; + ?T_TSIG -> ?S_TSIG; ?T_IXFR -> ?S_IXFR; ?T_AXFR -> ?S_AXFR; ?T_MAILB -> ?S_MAILB; @@ -441,6 +481,7 @@ encode_type(Type) -> ?S_UID -> ?T_UID; ?S_GID -> ?T_GID; ?S_UNSPEC -> ?T_UNSPEC; + ?S_TSIG -> ?T_TSIG; ?S_IXFR -> ?T_IXFR; ?S_AXFR -> ?T_AXFR; ?S_MAILB -> ?T_MAILB; @@ -833,6 +874,17 @@ encode_data(Comp, _, ?S_CAA, Data)-> _ -> {encode_txt(Data),Comp} end; +encode_data(Comp, _, ?S_TSIG, Data)-> + {AlgName,Now,Fudge,MAC,OriginalId,Error,OtherData} = Data, + %% Bypass name compression (RFC 8945, section 4.2) + {AlgNameEncoded,_} = encode_name(gb_trees:empty(), 0, AlgName), + MACSize = byte_size(MAC), + OtherLen = byte_size(OtherData), + DataB = <<AlgNameEncoded/binary, + Now:48, Fudge:16, MACSize:16, MAC:MACSize/binary, + OriginalId:16, Error:16, + OtherLen:16, OtherData:OtherLen/binary>>, + {DataB,Comp}; %% %% sofar unknown or non standard encode_data(Comp, _Pos, Type, Data) when is_integer(Type) -> @@ -972,3 +1024,35 @@ encode_loc_size(X) Multiplier = round(math:pow(10, Exponent)), Base = (X + Multiplier - 1) div Multiplier, <<Base:4, Exponent:4>>. + +decode_algname(AlgName) -> + case AlgName of + ?T_TSIG_HMAC_MD5 -> ?S_TSIG_HMAC_MD5; + ?T_TSIG_GSS_TSIG -> ?S_TSIG_GSS_TSIG; + ?T_TSIG_HMAC_SHA1 -> ?S_TSIG_HMAC_SHA1; + ?T_TSIG_HMAC_SHA1_96 -> ?S_TSIG_HMAC_SHA1_96; + ?T_TSIG_HMAC_SHA224 -> ?S_TSIG_HMAC_SHA224; + ?T_TSIG_HMAC_SHA256 -> ?S_TSIG_HMAC_SHA256; + ?T_TSIG_HMAC_SHA256_128 -> ?S_TSIG_HMAC_SHA256_128; + ?T_TSIG_HMAC_SHA384 -> ?S_TSIG_HMAC_SHA384; + ?T_TSIG_HMAC_SHA384_192 -> ?S_TSIG_HMAC_SHA384_192; + ?T_TSIG_HMAC_SHA512 -> ?S_TSIG_HMAC_SHA512; + ?T_TSIG_HMAC_SHA512_256 -> ?S_TSIG_HMAC_SHA512_256; + _ -> AlgName % raw unknown algname + end. + +encode_algname(Alg) -> + case Alg of + ?S_TSIG_HMAC_MD5 -> ?T_TSIG_HMAC_MD5; + ?S_TSIG_GSS_TSIG -> ?T_TSIG_GSS_TSIG; + ?S_TSIG_HMAC_SHA1 -> ?T_TSIG_HMAC_SHA1; + ?S_TSIG_HMAC_SHA1_96 -> ?T_TSIG_HMAC_SHA1_96; + ?S_TSIG_HMAC_SHA224 -> ?T_TSIG_HMAC_SHA224; + ?S_TSIG_HMAC_SHA256 -> ?T_TSIG_HMAC_SHA256; + ?S_TSIG_HMAC_SHA256_128 -> ?T_TSIG_HMAC_SHA256_128; + ?S_TSIG_HMAC_SHA384 -> ?T_TSIG_HMAC_SHA384; + ?S_TSIG_HMAC_SHA384_192 -> ?T_TSIG_HMAC_SHA384_192; + ?S_TSIG_HMAC_SHA512 -> ?T_TSIG_HMAC_SHA512; + ?S_TSIG_HMAC_SHA512_256 -> ?T_TSIG_HMAC_SHA512_256; + Alg when is_list(Alg) -> Alg % raw unknown algname + end. diff --git a/lib/kernel/src/inet_dns.hrl b/lib/kernel/src/inet_dns.hrl index 17151fbb6a..d3b5930b4c 100644 --- a/lib/kernel/src/inet_dns.hrl +++ b/lib/kernel/src/inet_dns.hrl @@ -45,6 +45,10 @@ -define(NOTAUTH, 9). %% server not authoritative for zone (DDNS) -define(NOTZONE, 10). %% name not contained in zone (DDNS) -define(BADVERS, 16). %% bad version EDNS pseudo-rr RFC6891: 6.1.3 +-define(BADSIG, 16). %% TSIG Signature Failure (TSIG) +-define(BADKEY, 17). %% Key not recognized (TSIG) +-define(BADTIME, 18). %% Signature out of time window (TSIG) +-define(BADTRUNC, 22). %% Bad Truncation (TSIG) %% %% Type values for resources and queries @@ -80,6 +84,7 @@ -define(T_UID, 101). %% user ID -define(T_GID, 102). %% group ID -define(T_UNSPEC, 103). %% Unspecified format (binary data) +-define(T_TSIG, 250). %% transaction signature -define(T_IXFR, 251). %% incremental zone transfer -define(T_AXFR, 252). %% zone transfer -define(T_MAILB, 253). %% transfer mailbox records @@ -124,6 +129,7 @@ -define(S_UID, uid). %% user ID -define(S_GID, gid). %% group ID -define(S_UNSPEC, unspec). %% Unspecified format (binary data) +-define(S_TSIG, tsig). %% transaction signature -define(S_IXFR, ixfr). %% incremental zone transfer -define(S_AXFR, axfr). %% zone transfer -define(S_MAILB, mailb). %% transfer mailbox records @@ -143,6 +149,33 @@ -define(C_NONE, 254). %% for DDNS (RFC2136, section 2.4) -define(C_ANY, 255). %% wildcard match +%% +%% TSIG Algorithms and Identifiers (RFC8945, section 6) +%% +-define(T_TSIG_HMAC_MD5, "HMAC-MD5.SIG-ALG.REG.INT"). +-define(T_TSIG_GSS_TSIG, "gss-tsig"). +-define(T_TSIG_HMAC_SHA1, "hmac-sha1"). +-define(T_TSIG_HMAC_SHA1_96, "hmac-sha1_96"). +-define(T_TSIG_HMAC_SHA224, "hmac-sha224"). +-define(T_TSIG_HMAC_SHA256, "hmac-sha256"). +-define(T_TSIG_HMAC_SHA256_128, "hmac-sha256-128"). +-define(T_TSIG_HMAC_SHA384, "hmac-sha384"). +-define(T_TSIG_HMAC_SHA384_192, "hmac-sha384-192"). +-define(T_TSIG_HMAC_SHA512, "hmac-sha512"). +-define(T_TSIG_HMAC_SHA512_256, "hmac-sha512-256"). +% map mostly to crypto:hmac_hash_algorithm() +-define(S_TSIG_HMAC_MD5, md5). +-define(S_TSIG_GSS_TSIG, gss_tsig). +-define(S_TSIG_HMAC_SHA1, sha). +-define(S_TSIG_HMAC_SHA1_96, {sha,96}). +-define(S_TSIG_HMAC_SHA224, sha224). +-define(S_TSIG_HMAC_SHA256, sha256). +-define(S_TSIG_HMAC_SHA256_128, {sha256,128}). +-define(S_TSIG_HMAC_SHA384, sha384). +-define(S_TSIG_HMAC_SHA384_192, {sha384,192}). +-define(S_TSIG_HMAC_SHA512, sha512). +-define(S_TSIG_HMAC_SHA512_256, {sha512,256}). + %% %% Structure for query header, the order of the fields is machine and %% compiler dependent, in our case, the bits within a byte are assignd @@ -206,6 +239,21 @@ do = false %% RFC6891(6.1.3 DO) }). +-record(dns_rr_tsig, %% TSIG RR OPT (RFC8945), dns_rr{type=tsig} + { + domain = "", %% name of the key + type = tsig, + offset, %% position of RR in packet + %% RFC8945(4.2 TSIG Record Format) + algname, + now, + fudge, + mac, + original_id = #dns_header{}#dns_header.id, + error = #dns_header{}#dns_header.rcode, + other_data = <<>> + }). + -record(dns_query, { domain, %% query domain diff --git a/lib/kernel/src/inet_dns_tsig.erl b/lib/kernel/src/inet_dns_tsig.erl new file mode 100644 index 0000000000..46bd05b2b0 --- /dev/null +++ b/lib/kernel/src/inet_dns_tsig.erl @@ -0,0 +1,319 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2023. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +-module(inet_dns_tsig). + +%% DNS TSIG handling +%% +%% RFC 8945: Secret Key Transaction Authentication for DNS (TSIG) + +%% WARNING: in the spirit of inet_dns.erl, this module only handles the +%% cryptographic operations and does not absolve you of your responsibities +%% that include: +%% * implement a truncation policy as per RFC8945, section 5.2 +%% * verifying that for TSIG over TCP the last message contains a TSIG RR +%% * truncated messages must include the TSIG RR as per RFC8945, section 5.3 +%% * if running as a server, generate suitable error responses +%% as per RFC8945, section 5.2 + +-export([init/1, sign/2, sign/3, verify/3]). + +-include("inet_dns.hrl"). + +-define(FUDGE_DEFAULT, 300). % RFC8945, section 10 +-define(MAC_SIZE_MIN, 10). % RFC8945, section 5.2.2.1 +-define(TTL, 0). +-define(NOW, (os:system_time(seconds))). % RFC8945, section 5.2.3 + +-define(ALG_DEFAULT, sha256). % RFC8945, section 6 +-define(ALGS_SUPPORTED, [md5, sha, sha224, ?ALG_DEFAULT, sha384, sha512]). +-type tsig_algs() :: md5 | sha | sha224 | ?ALG_DEFAULT | sha384 | sha512. +-type tsig_alg() :: {tsig_algs(),?MAC_SIZE_MIN..65535}. + +-type tsig_key() :: {string(),iodata()}. +-type tsig_error() :: ?BADSIG | ?BADKEY | ?BADTIME | ?BADTRUNC. + +-record( + tsig_state, + {key = [] :: tsig_key() | list(tsig_key()), + alg = ?ALG_DEFAULT :: tsig_alg(), % client only + fudge = ?FUDGE_DEFAULT :: 0..65535, + + qr = 0 :: 0..100, + %% 0 (false): request, 1+ (true): response + %% this value is overloaded to handle TSIG + %% over TCP where we need to accept up to + %% 99 messages without TSIG so each time a + %% response with a TSIG RR is received this + %% value is reset to 2 + + id :: undefined | 0..65535, + mac = {?MODULE,undefined} :: + {?MODULE,undefined | binary()} | {crypto,crypto:mac_state()} +}). +-opaque tsig_state() :: #tsig_state{}. +-export_type([tsig_state/0]). + +-spec init(proplists:proplist()) -> tsig_state(). +init(Config) -> + Key0 = proplists:get_value(keys, Config, []), % server passes in keys + Key = proplists:get_value(key, Config, Key0), % client passes in key + true = is_tuple(Key) orelse Key =/= [], + Alg = case proplists:get_value(alg, Config, ?ALG_DEFAULT) of + {A,S} when is_atom(A), is_integer(S) -> + true = lists:member(A, ?ALGS_SUPPORTED) + andalso + S >= ?MAC_SIZE_MIN + andalso + S >= maps:get(size, crypto:hash_info(A)) div 2, + {A,S}; + A when is_atom(A) -> + true = lists:member(A, ?ALGS_SUPPORTED), + {A,maps:get(size, crypto:hash_info(A))} + end, + Fudge = proplists:get_value(fudge, Config, ?FUDGE_DEFAULT), + true = is_integer(Fudge) andalso Fudge >= 0 andalso Fudge =< 65535, + #tsig_state{ key = Key, alg = Alg, fudge = Fudge }. + + +-spec sign(binary(), tsig_state()) -> {ok,binary(),tsig_state()}. +sign(Pkt, TS) -> + sign(Pkt, TS, ?NOERROR). + +-spec sign(binary(), tsig_state(), tsig_error() | ?NOERROR) -> + {ok,binary(),tsig_state()}. +sign( + Pkt = <<Hdr:10/binary, Rest/binary>>, + TS = #tsig_state{ id = TSId, qr = TSQR }, + Error) -> + case Hdr of + %% client uses this + <<Id:16, QR:1, _:15, _/binary>> + when QR == 0, TSId == undefined -> + sign(Pkt, TS#tsig_state{ id = Id }, Error, Hdr, Rest); + %% + %% client and server use this + <<_Id:16, QR:1, _:15, _/binary>> + when QR == 0, TSQR == 0; + QR == 1, TSQR >= 1 -> + sign(Pkt, TS, Error, Hdr, Rest) + end. + +sign(Pkt, TS, Error, Hdr, <<ARCount:16, Content/binary>>) -> + {Name,_Secret} = TS#tsig_state.key, + {Alg,_MACSize} = TS#tsig_state.alg, + Now = ?NOW, + OtherData = otherdata(Error, Now), + MAC = mac(Pkt, TS, Error, Now, OtherData), + TSigRR = + #dns_rr_tsig{ + domain = Name, + algname = inet_dns:encode_algname(Alg), + now = Now, + fudge = TS#tsig_state.fudge, + mac = MAC, + original_id = TS#tsig_state.id, + error = Error, + other_data = OtherData}, + %% for simplicity, and to avoid export hell, we encode a skeleton packet and + %% extract our TSIG RR directly from it + <<_:12/binary, TSigRRBin/binary>> = + inet_dns:encode( + #dns_rec{ header = #dns_header{}, arlist = [TSigRR]}), + TSQR = TS#tsig_state.qr, + {ok, + <<Hdr/binary, (ARCount + 1):16, Content/binary, TSigRRBin/binary>>, + TS#tsig_state{ qr = TSQR + 1, mac = {?MODULE,MAC} }}. + + +%% this function needs to work with the original response binary as the MAC +%% calculation is affected by each DNS implementation having their own varying +%% name compression algorithm +-spec verify(binary(), #dns_rec{}, tsig_state()) -> + {ok,tsig_state()} | + {error,formerr | {notauth,badkey | badsig | badtime}}. +verify(Pkt, Response, TS) -> + try do_verify(Pkt, Response, TS) of + R -> + R + catch + Reason -> + {error,Reason} + end. + +%% server uses this +do_verify(Pkt, + Response = #dns_rec{ + header = #dns_header{ qr = QR }, + arlist = ARList }, + TS0 = #tsig_state{ id = TSId }) + when QR == false, TSId == undefined -> + ARList == [] andalso throw({noauth,badsig}), + #dns_rr_tsig{ + domain = Name, + algname = AlgName, + mac = MAC, + original_id = OriginalId, + error = Error + } = lists:last(ARList), + Key = lists:keyfind(Name, 1, TS0#tsig_state.key), + Key == false andalso throw({notauth,badkey}), + {Alg,AlgSize} = case inet_dns:decode_algname(AlgName) of + {A,S} -> + {A,S}; + A -> + {A,maps:get(size, crypto:hash_info(A))} + end, + %% RFC8945, section 5.2.2.1: MAC Truncation + MACSize = if + Error == ?BADSIG; Error == ?BADKEY -> + AlgSize; + true -> + byte_size(MAC) + end, + lists:member(Alg, ?ALGS_SUPPORTED) orelse throw({notauth,badkey}), + MACValid = MACSize >= ?MAC_SIZE_MIN + andalso + MACSize >= AlgSize div 2 + andalso + MACSize =< AlgSize, + MACValid orelse throw(formerr), + TS = TS0#tsig_state{ alg = {Alg,AlgSize}, key = Key, id = OriginalId }, + do_verify(Pkt, Response, TS); +%% +%% client and server use this +do_verify(Pkt = <<_Id:16, QR:1, _:15, _/binary>>, + Response = #dns_rec{ arlist = ARList }, + TS = #tsig_state{ qr = TSQR }) + when QR == TSQR; QR == 1 andalso TSQR >= 2 -> + case ARList =/= [] andalso lists:last(ARList) of + %% RFC8945, section 5.3.1: TSIG on TCP Connections + false when TSQR == 3 -> % not 2 as we must start with a TSIG RR + MAC0 = mac0(TS), + %% TS#tsig_state.mac is {?MODULE,binary()} (Previous MAC) + MACN0 = macN(TS#tsig_state.mac, TS#tsig_state{ mac = MAC0 }), + MACN = macN(Pkt, TS#tsig_state{ mac = MACN0 }), + {ok,TS#tsig_state{ qr = TSQR + 1, mac = MACN }}; + false when TSQR >= 4, TSQR =< 99 -> + MACN = macN(Pkt, TS), + {ok,TS#tsig_state{ qr = TSQR + 1, mac = MACN }}; + TSigRR = #dns_rr_tsig{} -> + do_verify(Pkt, Response, TS, TSigRR); + false -> + {error,{notauth,badsig}} + end. + +do_verify(Pkt, _Response, TS, TSigRR) -> + Now = ?NOW, + #dns_rr_tsig{ + offset = Offset, + now = NowSigned, + fudge = Fudge, + mac = MAC, + error = Error, + other_data = OtherData + } = TSigRR, + PktS = iolist_to_binary([ + <<(TS#tsig_state.id):16>>, + binary:part(Pkt, {2,8}), + begin + <<ARC:16>> = binary:part(Pkt, {10,2}), + <<(ARC - 1):16>> + end, + binary:part(Pkt, {12,Offset - 12}) + ]), + MACCalc = if + element(1, TS#tsig_state.mac) == ?MODULE -> + mac(PktS, TS, Error, Now, OtherData); + %% RFC8945, section 5.3.1: TSIG on TCP Connections + true -> + mac(TS, Error, Now, OtherData) + end, + if + %% RFC8945, section 5.2 - MUST check time after MAC + MAC == MACCalc, NowSigned - Fudge < Now, NowSigned + Fudge > Now -> + QR = if TS#tsig_state.qr == 0 -> 1; true -> 2 end, + {ok,TS#tsig_state{ qr = QR, mac = {?MODULE,MAC} }}; + MAC == MACCalc -> + {error,{notauth,badtime}}; + true -> + {error,{notauth,badsig}} + end. + +%% similar to inet_dns:encode_name/3 but without compression +encode_name(Name) -> + iolist_to_binary([ + [ <<(byte_size(L)):8, L/binary>> + || L <- binary:split(list_to_binary(Name), <<".">>, [global]) ], + <<0:8>> + ]). + +otherdata(?BADTIME, Now) -> <<Now:48>>; +otherdata(_Error, _Now) -> <<>>. + +mac0(TS = #tsig_state{ mac = {?MODULE,MAC} }) -> + {_Name,Secret} = TS#tsig_state.key, + {Alg,_MACSize} = TS#tsig_state.alg, + MACState = crypto:mac_init(hmac, Alg, Secret), + {crypto,if + %% RFC8945, section 5.3.1: TSIG on TCP Connections + is_binary(MAC) -> + MS = byte_size(MAC), + crypto:mac_update(MACState, [<<MS:16>>, MAC]); + true -> + MACState + end}. + +macN({?MODULE,MAC}, #tsig_state{ mac = {crypto,MACState} }) -> + {crypto,crypto:mac_update(MACState, MAC)}; +macN(Pkt, TS = #tsig_state{ mac = {crypto,MACState} }) -> + {crypto,crypto:mac_update(MACState, [ + <<(TS#tsig_state.id):16>>, + binary:part(Pkt, {2,byte_size(Pkt) - 2}) + ])}. + +%% RFC8945, section 5.3.2: Generation of TSIG on Error Returns +mac(_TS, Error, _Now, _OtherData) + when Error == ?BADSIG; Error == ?BADKEY -> + <<>>; +mac(TS = #tsig_state{ mac = {crypto,MACState0} }, Error, Now, OtherData) -> + {Name,_Secret} = TS#tsig_state.key, + {Alg,MACSize} = TS#tsig_state.alg, + Fudge = TS#tsig_state.fudge, + OtherLen = byte_size(OtherData), + MACState = crypto:mac_update(MACState0, if + TS#tsig_state.qr =< 1 -> + [ + %% TSIG RR + encode_name(Name), <<?C_ANY:16>>, <<?TTL:32/signed>>, + %% TSIG RDATA + encode_name(inet_dns:encode_algname(Alg)), + <<Now:48, Fudge:16, Error:16, OtherLen:16>>, + OtherData + ]; + %% RFC8945, section 5.3.1: TSIG on TCP Connections + true -> + <<Now:48, Fudge:16>> + end), + crypto:mac_finalN(MACState, MACSize). + +mac(Pkt, TS, Error, Now, OtherData) -> + MAC0 = mac0(TS), + MACN = macN(Pkt, TS#tsig_state{ mac = MAC0 }), + mac(TS#tsig_state{ mac = MACN }, Error, Now, OtherData). diff --git a/lib/kernel/src/inet_res.erl b/lib/kernel/src/inet_res.erl index f0d2f21364..091ebef91c 100644 --- a/lib/kernel/src/inet_res.erl +++ b/lib/kernel/src/inet_res.erl @@ -1094,11 +1094,16 @@ decode_answer(Answer, Q_Msg, Verbose) -> case inet_dns:decode(Answer) of {ok, #dns_rec{header = H, arlist = ARList} = Msg} -> ?verbose(Verbose, "Got reply: ~p~n", [dns_msg(Msg)]), + T = case lists:keyfind(dns_rr_tsig, 1, ARList) of + false -> false; + #dns_rr_tsig{error=?NOERROR} -> false; + #dns_rr_tsig{error=TsigError} -> TsigError + end, E = case lists:keyfind(dns_rr_opt, 1, ARList) of false -> 0; #dns_rr_opt{ext_rcode=ExtRCode} -> ExtRCode end, - RCode = (E bsl 4) bor H#dns_header.rcode, + RCode = T orelse (E bsl 4) bor H#dns_header.rcode, case RCode of ?NOERROR -> decode_answer_noerror(Q_Msg, Msg, H); ?FORMERR -> {error,{qfmterror,Msg}}; @@ -1111,7 +1116,11 @@ decode_answer(Answer, Q_Msg, Verbose) -> ?NXRRSET -> {error,{nxrrset,Msg}}; ?NOTAUTH -> {error,{noauth,Msg}}; ?NOTZONE -> {error,{nozone,Msg}}; - ?BADVERS -> {error,{badvers,Msg}}; + ?BADVERS when not T -> {error,{badvers,Msg}}; + ?BADSIG -> {error,{badsig,Msg}}; + ?BADKEY -> {error,{badkey,Msg}}; + ?BADTIME -> {error,{badtime,Msg}}; + ?BADTRUNC -> {error,{badtrunc,Msg}}; _ -> {error,{unknown,Msg}} end; {error, formerr} = Error -> diff --git a/lib/kernel/src/kernel.app.src b/lib/kernel/src/kernel.app.src index 10705d9d76..4ae0fb6bb5 100644 --- a/lib/kernel/src/kernel.app.src +++ b/lib/kernel/src/kernel.app.src @@ -104,6 +104,7 @@ inet, inet_db, inet_dns, + inet_dns_tsig, inet_parse, inet_res, inet_tcp, diff --git a/lib/kernel/test/inet_res_SUITE.erl b/lib/kernel/test/inet_res_SUITE.erl index c69cf934ce..045fdcc83b 100644 --- a/lib/kernel/test/inet_res_SUITE.erl +++ b/lib/kernel/test/inet_res_SUITE.erl @@ -35,7 +35,7 @@ edns0/1, edns0_multi_formerr/1, txt_record/1, files_monitor/1, nxdomain_reply/1, last_ms_answer/1, intermediate_error/1, servfail_retry_timeout_default/1, servfail_retry_timeout_1000/1, - label_compression_limit/1, update/1 + label_compression_limit/1, update/1, tsig_client/1, tsig_server/1 ]). -export([ gethostbyaddr/0, gethostbyaddr/1, @@ -77,7 +77,7 @@ all() -> nxdomain_reply, last_ms_answer, intermediate_error, servfail_retry_timeout_default, servfail_retry_timeout_1000, - label_compression_limit, update, + label_compression_limit, update, tsig_client, tsig_server, gethostbyaddr, gethostbyaddr_v6, gethostbyname, gethostbyname_v6, getaddr, getaddr_v6, ipv4_to_ipv6, host_and_addr]. @@ -134,6 +134,7 @@ zone_dir(TC) -> nxdomain_reply -> otptest; last_ms_answer -> otptest; update -> otptest; + tsig_client -> otptest; intermediate_error -> {internal, #{rcode => ?REFUSED}}; @@ -1470,6 +1471,196 @@ update(Config) when is_list(Config) -> ok. +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Tests for TSIG + +% note for implementors reading this, the usage of +% inet_dns_tsig.erl is identical except you do not need +% to inspect the reponse for the presence of a TSIG RR +tsig_client(Config) when is_list(Config) -> + {NSIP,NSPort} = ns(Config), + Domain = "otptest", + Request = #dns_rec{ + header = #dns_header{}, + qdlist = [#dns_query{ domain = Domain, class = in, type = axfr }] + }, + Pkt = inet_dns:encode(Request), + + Key = {"testkey","ded5ada3-07f2-42b9-84bf-82d30f6795ee"}, + TS0 = inet_dns_tsig:init([{key,Key}]), + {ok,PktS,TS1} = inet_dns_tsig:sign(Pkt, TS0), + + SockOpts = [binary,{active,false},{nodelay,true},{packet,2}], + {ok,Sock} = gen_tcp:connect(NSIP, NSPort, SockOpts), + ok = gen_tcp:send(Sock, PktS), + ok = gen_tcp:shutdown(Sock, write), + Recv = fun(Recv, A) -> + case gen_tcp:recv(Sock, 0) of + {ok,P} -> + Recv(Recv, [P|A]); + {error,closed} -> + lists:reverse(A) + end + end, + PktR = Recv(Recv, []), + ok = gen_tcp:close(Sock), + + true = PktR =/= [], + + {_TS,Response} = lists:foldl(fun(P, {T0,R0}) -> + {ok,R} = inet_dns:decode(P), + {ok,T} = inet_dns_tsig:verify(P, R, T0), + {T,R0 ++ [R]} + end, {TS1,[]}, PktR), + + % not necessary for the test, but helpful to those using this + % to understand how to validate TCP responses, we need to check + % that the last message has a TSIG RR (RRC8945, section 5.3.1) + % N.B. unnecessary for UDP as handled by inet_dns_tsig:verify() + #dns_rec{ arlist = ARList } = lists:last(Response), + true = ARList =/= [], + #dns_rr_tsig{} = lists:last(ARList), + + % actual implementations would here now consider if the additional + % checks described in the WARNING at the top of inet_dns_tsig.erl + % are applicable to their use case and if so implement them + ok. + +tsig_server(Config) when is_list(Config) -> + case os:find_executable("dig") of + false -> + case os:find_executable("drill") of + false -> + {skip, "Cannot find executable: dig|drill"}; + Drill -> + tsig_server(Config, Drill) + end; + Dig -> + tsig_server(Config, Dig) + end. +%% +tsig_server(_Config, DigDrill) -> + Domain = "otptest", + + Key = {"testkey","b0b8006a-04ad-4a96-841a-a4eae78011a1"}, + Keys0 = [Key,{"grease0",""},{"grease1",""},{"grease2",""}], + Rand = [ rand:uniform() || _ <- lists:seq(1, length(Keys0)) ], + {_,Keys} = lists:unzip(lists:keysort(1, lists:zip(Rand, Keys0))), + TS0 = inet_dns_tsig:init([{keys,Keys}]), + + SockOpts = [binary,{active,false},{nodelay,true},{packet,2}], + {ok,LSock} = gen_tcp:listen(0, [{ip,{127,0,0,1}}|SockOpts]), + {ok,LPort} = inet:port(LSock), + + _ = process_flag(trap_exit, true), + {_, MRef} = + spawn_opt( + fun() -> + KeyName = element(1, Key), + KeySecret = base64:encode_to_string(element(2, Key)), + Command = DigDrill ++ + " -p " ++ integer_to_list(LPort) ++ + " -y hmac-sha256:" ++ KeyName ++ ":" ++ KeySecret ++ + " " ++ Domain ++ ". @127.0.0.1 AXFR IN", + Opts = [in,eof,exit_status,stderr_to_stdout,hide], + Port = erlang:open_port({spawn,Command}, Opts), + Collect = + fun C(A) -> + receive + {Port,{data,B}} -> + C([B|A]); + {Port,eof} -> + C(A); + {Port,{exit_status,Status}} -> + {ok,{Status,lists:reverse(A)}}; + {Port,closed} -> + {error,closed} + after 1000 -> + {error,timeout} + end + end, + ClientResult = Collect([]), + true = erlang:port_close(Port), + exit({done,ClientResult}) + end, [link,monitor]), + + Result = + case gen_tcp:accept(LSock, 5000) of + {ok,Sock} -> + try + ok = gen_tcp:close(LSock), + tsig_server(Domain, TS0, Sock) + of + _ -> + gen_tcp:close(Sock) + catch + Class : Reason : Stacktrace -> + _ = catch gen_tcp:close(Sock), + {Class,Reason,Stacktrace} + end; + Error -> + _ = catch gen_tcp:close(LSock), + Error + end, + + receive + {'DOWN',MRef,_,_,{done,{ok,{Code,Output}}}} -> + ?P("Output of ~s (exit code ~B):~n~s~n", + [DigDrill, Code, Output]), + {0,ok} = {Code,Result}; + {'DOWN',MRef,_,_,CError} -> + error({CError,Result}) + after 1000 -> + error({timeout,Result}) + end. + +tsig_server(Domain, TS0, Sock) -> + SOAData = {"ns","lsa.soa",1,60,10,300,30}, + SOA = #dns_rr{ domain = Domain, class = in, type = soa, data = SOAData }, + PadData = ["0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"], + Padding = #dns_rr{ class = in, type = txt, data = PadData }, + + {ok,Pkt} = gen_tcp:recv(Sock, 0), + ok = gen_tcp:shutdown(Sock, read), + + {ok,Request} = inet_dns:decode(Pkt), + {ok,TS1} = inet_dns_tsig:verify(Pkt, Request, TS0), + + % actual implementations would here now consider if the additional + % checks described in the WARNING at the top of inet_dns_tsig.erl + % are applicable to their use case and if so implement them + + PktR0 = #dns_rec{ + header = #dns_header{ + id = Request#dns_rec.header#dns_header.id, + qr = true + }, + qdlist = Request#dns_rec.qdlist + }, + + Format = "~2.10.0B.padding." ++ Domain, + AnList1 = [SOA] ++ [ Padding#dns_rr{ + domain = io_lib:format(Format, [X]) } || + X <- lists:seq(0, 9) ], + PktR1 = inet_dns:encode(PktR0#dns_rec{ anlist = AnList1 }), + {ok,PktR1S,TS2} = inet_dns_tsig:sign(PktR1, TS1), + ok = gen_tcp:send(Sock, PktR1S), + + AnList2 = [ Padding#dns_rr{ + domain = io_lib:format(Format, [X]) } || + X <- lists:seq(10, 19) ], + PktR2 = inet_dns:encode(PktR0#dns_rec{ anlist = AnList2 }), + {ok,PktR2S,TS3} = inet_dns_tsig:sign(PktR2, TS2), + ok = gen_tcp:send(Sock, PktR2S), + + AnList3 = [ Padding#dns_rr{ + domain = io_lib:format(Format, [X]) } || + X <- lists:seq(20, 29) ] ++ [SOA], + PktR3 = inet_dns:encode(PktR0#dns_rec{ anlist = AnList3 }), + {ok,PktR3S,_TS} = inet_dns_tsig:sign(PktR3, TS3), + ok = gen_tcp:send(Sock, PktR3S). + + %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Compatibility tests. Call the inet_SUITE tests, but with %% lookup = [file,dns] instead of [native] diff --git a/lib/kernel/test/inet_res_SUITE_data/otptest/knot_inc.conf b/lib/kernel/test/inet_res_SUITE_data/otptest/knot_inc.conf index 50c9f0d977..91a48f62bf 100644 --- a/lib/kernel/test/inet_res_SUITE_data/otptest/knot_inc.conf +++ b/lib/kernel/test/inet_res_SUITE_data/otptest/knot_inc.conf @@ -1,10 +1,21 @@ +key: + - id: testkey.otptest + algorithm: hmac-sha256 + # ded5ada3-07f2-42b9-84bf-82d30f6795ee + secret: ZGVkNWFkYTMtMDdmMi00MmI5LTg0YmYtODJkMzBmNjc5NWVl + acl: - id: update_rule address: 127.0.0.1 action: update +acl: + - id: testkey_rule + key: testkey.otptest + action: transfer + zone: - domain: otptest - acl: [ update_rule ] + acl: [ update_rule, testkey_rule ] - domain: 0.0.127.in-addr.arpa. - domain: 0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa. diff --git a/lib/kernel/test/inet_res_SUITE_data/otptest/otptest.zone b/lib/kernel/test/inet_res_SUITE_data/otptest/otptest.zone index e94866a1f9..dc004896cb 100644 --- a/lib/kernel/test/inet_res_SUITE_data/otptest/otptest.zone +++ b/lib/kernel/test/inet_res_SUITE_data/otptest/otptest.zone @@ -61,3 +61,510 @@ minfo.resolve IN MINFO minfo-owner.resolve minfo-bounce.resolve uri.resolve IN TYPE256 \# 21 000a 0003 (68747470 3a2f2f 65726c616e67 2e 6f7267) ;caa.resolve IN CAA 1 iodef "http://iodef.erlang.org" caa.resolve IN TYPE257 \# 30 01 (05 696f646566) (68747470 3a2f2f 696f646566 2e 65726c616e67 2e 6f7267) + +; for testing TSIG we need a multi-message response so we use AXFR but need +; to juice up the zone file to meet our needs, the following creates 3 messages +; +; N.B. knotd does not support $GENERATE so here we go... +; +;$GENERATE 0-599 ${0,3,d} $.padding TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +000.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +001.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +002.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +003.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +004.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +005.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +006.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +007.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +008.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +009.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +010.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +011.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +012.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +013.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +014.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +015.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +016.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +017.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +018.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +019.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +020.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +021.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +022.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +023.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +024.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +025.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +026.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +027.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +028.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +029.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +030.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +031.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +032.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +033.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +034.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +035.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +036.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +037.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +038.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +039.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +040.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +041.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +042.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +043.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +044.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +045.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +046.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +047.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +048.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +049.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +050.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +051.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +052.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +053.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +054.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +055.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +056.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +057.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +058.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +059.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +060.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +061.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +062.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +063.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +064.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +065.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +066.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +067.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +068.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +069.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +070.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +071.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +072.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +073.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +074.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +075.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +076.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +077.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +078.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +079.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +080.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +081.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +082.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +083.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +084.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +085.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +086.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +087.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +088.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +089.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +090.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +091.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +092.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +093.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +094.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +095.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +096.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +097.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +098.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +099.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +100.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +101.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +102.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +103.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +104.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +105.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +106.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +107.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +108.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +109.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +110.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +111.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +112.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +113.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +114.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +115.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +116.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +117.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +118.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +119.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +120.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +121.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +122.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +123.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +124.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +125.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +126.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +127.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +128.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +129.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +130.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +131.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +132.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +133.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +134.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +135.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +136.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +137.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +138.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +139.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +140.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +141.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +142.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +143.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +144.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +145.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +146.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +147.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +148.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +149.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +150.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +151.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +152.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +153.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +154.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +155.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +156.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +157.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +158.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +159.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +160.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +161.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +162.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +163.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +164.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +165.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +166.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +167.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +168.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +169.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +170.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +171.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +172.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +173.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +174.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +175.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +176.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +177.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +178.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +179.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +180.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +181.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +182.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +183.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +184.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +185.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +186.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +187.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +188.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +189.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +190.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +191.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +192.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +193.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +194.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +195.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +196.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +197.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +198.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +199.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +200.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +201.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +202.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +203.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +204.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +205.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +206.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +207.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +208.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +209.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +210.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +211.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +212.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +213.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +214.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +215.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +216.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +217.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +218.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +219.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +220.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +221.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +222.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +223.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +224.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +225.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +226.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +227.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +228.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +229.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +230.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +231.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +232.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +233.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +234.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +235.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +236.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +237.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +238.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +239.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +240.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +241.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +242.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +243.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +244.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +245.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +246.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +247.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +248.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +249.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +250.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +251.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +252.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +253.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +254.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +255.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +256.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +257.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +258.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +259.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +260.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +261.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +262.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +263.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +264.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +265.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +266.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +267.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +268.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +269.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +270.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +271.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +272.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +273.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +274.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +275.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +276.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +277.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +278.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +279.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +280.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +281.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +282.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +283.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +284.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +285.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +286.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +287.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +288.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +289.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +290.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +291.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +292.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +293.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +294.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +295.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +296.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +297.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +298.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +299.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +300.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +301.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +302.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +303.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +304.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +305.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +306.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +307.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +308.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +309.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +310.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +311.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +312.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +313.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +314.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +315.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +316.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +317.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +318.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +319.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +320.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +321.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +322.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +323.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +324.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +325.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +326.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +327.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +328.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +329.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +330.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +331.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +332.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +333.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +334.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +335.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +336.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +337.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +338.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +339.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +340.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +341.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +342.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +343.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +344.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +345.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +346.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +347.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +348.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +349.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +350.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +351.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +352.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +353.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +354.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +355.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +356.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +357.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +358.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +359.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +360.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +361.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +362.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +363.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +364.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +365.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +366.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +367.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +368.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +369.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +370.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +371.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +372.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +373.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +374.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +375.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +376.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +377.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +378.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +379.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +380.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +381.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +382.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +383.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +384.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +385.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +386.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +387.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +388.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +389.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +390.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +391.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +392.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +393.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +394.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +395.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +396.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +397.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +398.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +399.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +400.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +401.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +402.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +403.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +404.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +405.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +406.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +407.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +408.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +409.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +410.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +411.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +412.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +413.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +414.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +415.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +416.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +417.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +418.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +419.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +420.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +421.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +422.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +423.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +424.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +425.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +426.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +427.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +428.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +429.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +430.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +431.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +432.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +433.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +434.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +435.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +436.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +437.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +438.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +439.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +440.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +441.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +442.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +443.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +444.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +445.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +446.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +447.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +448.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +449.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +450.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +451.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +452.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +453.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +454.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +455.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +456.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +457.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +458.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +459.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +460.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +461.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +462.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +463.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +464.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +465.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +466.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +467.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +468.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +469.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +470.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +471.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +472.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +473.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +474.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +475.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +476.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +477.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +478.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +479.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +480.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +481.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +482.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +483.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +484.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +485.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +486.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +487.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +488.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +489.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +490.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +491.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +492.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +493.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +494.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +495.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +496.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +497.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +498.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +499.padding IN TXT "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" -- 2.35.3
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor