Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wCovY-002L0z-1m for pgsql-bugs@arkaria.postgresql.org; Wed, 15 Apr 2026 01:20:25 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wCovW-00Dqpc-2q for pgsql-bugs@arkaria.postgresql.org; Wed, 15 Apr 2026 01:20:23 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wCovW-00DqpU-0o for pgsql-bugs@lists.postgresql.org; Wed, 15 Apr 2026 01:20:23 +0000 Received: from mail-pf1-x430.google.com ([2607:f8b0:4864:20::430]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wCovT-000000013sv-1CYl for pgsql-bugs@lists.postgresql.org; Wed, 15 Apr 2026 01:20:22 +0000 Received: by mail-pf1-x430.google.com with SMTP id d2e1a72fcca58-82735a41920so2097271b3a.2 for ; Tue, 14 Apr 2026 18:20:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776216019; cv=none; d=google.com; s=arc-20240605; b=YoqApkFnUvJuMYVtFVYojEIFN+9A8Hyq0haiThIWV88+pxEIgRSmY1n9zmUKGPAvVZ XapT7ASpU1k/B0ecK0mKb3eFhCgaPyxPrYJD23HrtGFo33saVEvHRKchC46vzK4lldro eltEet+/wFcM9hhcf2GLayYFbD8RcVQeKyYEy+nnaI5OMtcyxEVlQth1xcJP1HPk7vlY Vfw/E9C/VFOyp6rwbRe111ezwqH96jyek+WHIUzxSvntHPw2mt3DX2BZwSE0eKmYcCqW HwN0Epyjdb/psygdLYIwi4V6o6M4TWgTQuRMVBmx8psSV9pyS7j3dhVlJCXiH+ANSg3+ daEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:reply-to:in-reply-to:references :mime-version:dkim-signature; bh=5vUf15WI3D3CZ6V+PD6bFPkWZNp47TzNBymZaUruEfk=; fh=alQ9U5YUTAtFe1JS2/yl//WQwPRKcHGLf+5j2ZgZ/0w=; b=cK/SPnOH85GzAaaQKYSOYTLV3Pdpqx1ULrpfZix7Nuhb0iUbQEtFFmOywEPbdDle4d 1U97GGfvbyHIVkkjLBV6BfQPqaA/dO8UuWZUIW3Rstcj/LjYeEBjoYKaKslzWrRVqQHo k9Rb3nCRdsV5j2t3MTAAnLGNrNZ3zsFv1p7wm/sQi2gPb2lKqCw1rQnChjCr78BQ7iUj NOfF68UMZwhyPHO/PxlkkaibbiRgsH19UD1fIO3e+2xGYMw8JA0JjNdDFcicT09bzOCD 60Ndwcm+YLDosRRhuxL+Yo/kxSiK1vCOC5r0yJ8RDfrkn45mhkY/Ihx+izr0NOQixGeC CXNA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776216019; x=1776820819; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:reply-to:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=5vUf15WI3D3CZ6V+PD6bFPkWZNp47TzNBymZaUruEfk=; b=Qoyx9LJ4C2gPpdjK8RA0G10SY2k4XcxJPZJlR1JcIJY5UBnAGNQbbRjxwy9OI8WcSL oT/8VKseImFJrocsaOndvfAydrgNF6GISKkRC3GUnwI3RbG+kvlDD+20HIzwkHRexTFL GImtflsCd8TgJVfivxL6pAR2CypS5IDuO/9xCkfBfKByA4gT+Ssc/fqF/WHZ9tc9neJr BK1iVQBdJAxlC5/KY7d2ls8e4VzQVtAvFpLOZyhq0wTEhR6MhNJmDxfPbAIIFjsYTpMh gZhRcpgIVogg7jlNpN0/n+3sTE+B+FaMup7qasmizZebXqzNpr5drQ+EmKmn95+P0fAg z/Zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776216019; x=1776820819; h=cc:to:subject:message-id:date:from:reply-to:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=5vUf15WI3D3CZ6V+PD6bFPkWZNp47TzNBymZaUruEfk=; b=oZWmwtBozjLSzEwOn3Oz7IT5g0X7BjGcPaRYLi4XG+zXLV16z0Y3/WfgwlqAIM2AuB jRB1EgZSZx8eJpPyUSOnqzcM+fbMdCpZQi21+FL206Dz4Qse3zxNMYczwynRcYtQZRcS U10p7ASVCHHZOaeZOe2Oh/Yy16pPXu9bUH/n0d2z1NTao6Oc1N/jFN8fZpBNYrQnWANJ hxg+fztnGuFNdpDdfXHRzrh0BBlqj3ZPWK3JklxlxyCWzisl4WgktLo2plKMhlUmTPlF k3J8xE5M+KWBZ5e0p/JINC7XaoZzowB1U7yScBwdYp9xUKbnVYg5tsNjUdbSV7t5orI4 TfiQ== X-Forwarded-Encrypted: i=1; AFNElJ9aelFz/KQxM0R3QndaKGNQY0wdAUZv7jAo0bEThLkp86V/hhVQVo/grEoLob11+VN8Wc+4TCqwCw5v@lists.postgresql.org X-Gm-Message-State: AOJu0YxbCTnxRQSYdnzE1HoiUPTVn3PceEkBKUUj8CO1n6zbsMmK7UPH TZFnCVcYb5Yfedxzc38Pg2M2isklUT7xt6ZA1AIFbFeP1aWMazotLtTOVghlbkS6hPNQyS7BKuv lhn/0TZDdS4VHU/+pwGVgASBPDnuYbyk= X-Gm-Gg: AeBDieunYCqIFChk4sQtcYyZ3sl0DsjCYFD0Us4vG+Um+TZGrjTJOZ86su7DSYLOfNu w46OAjYN49FEJnmOMZSKAqzWaColsdcqyRvYwpvjTDKx6XSy/BHp8LYWN8l7xQJQL7N6aqa41fz KGi0ZaM+dGpf0OgLMxxVHb0/AiEuKTfTZPtKRiSWUSeahaFSCj5dUoc4ID/MCVHpBB+isbJAfbL GXstU+NJHbwGv8rZg2aRXjpybB0qE50WCFD48jn68aO36nBW0rcspF0RjR3CMje5D6QMAm4zsXn 2es7DuQdZMcZA1gx4qqU7j0cd2peMqtpCfJDuAYK/tGlGxhk6w== X-Received: by 2002:a05:6300:210f:b0:39b:bee4:294e with SMTP id adf61e73a8af0-39fe40a440bmr20529764637.58.1776216018493; Tue, 14 Apr 2026 18:20:18 -0700 (PDT) MIME-Version: 1.0 References: <19354-eefe6d8b3e84f9f2@postgresql.org> <2292889.1765846569@sss.pgh.pa.us> <2393116.1765899706@sss.pgh.pa.us> <6a8122ac-123d-4e93-9269-0b3be1e4a5a4@iki.fi> In-Reply-To: <6a8122ac-123d-4e93-9269-0b3be1e4a5a4@iki.fi> Reply-To: assam258@gmail.com From: Henson Choi Date: Wed, 15 Apr 2026 10:20:06 +0900 X-Gm-Features: AQROBzA6gggBcj6gY6gpxMfFykbLY-326lzp2p_n1-KlTIXEmg4uvJI1VoncCqc Message-ID: Subject: Re: BUG #19354: JOHAB rejects valid byte sequences To: Heikki Linnakangas , Thomas Munro , Robert Haas Cc: Tom Lane , Jeroen Vermeulen , VASUKI M , pgsql-bugs@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000d3d6e8064f7584ef" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000d3d6e8064f7584ef Content-Type: multipart/alternative; boundary="000000000000d3d6e7064f7584ed" --000000000000d3d6e7064f7584ed Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi hackers, > > So +1 from me, set the phasers to git rm. > > +1 > > > Wait until 20, or just do it now? > Let's just do it now. > Following up on my earlier note with an actual review of the primary Korean national standard and a fix patch. The result turns out to be small, and I believe it resolves the ambiguity that drove the removal proposal. Standard reference ------------------ The authoritative specification for JOHAB is Annex 3 of KS X 1001 (originally KS C 5601-1992 Annex 3, renumbered KS X 1001:1992 and republished as KS X 1001:2004), published by the Korean Agency for Technology and Standards (KATS) and available from the national e-standards portal: https://standard.go.kr/KSCI/api/std/viewMachine.do?reformNo=3D08&tmprKsNo= =3DKSX1001&formType=3DSTD The decisive passages are quoted below in the original Korean with an English translation, so non-Korean readers can verify the byte ranges the fix implements. Two terms from the standard recur throughout the quoted passages: * =EC=99=84=EC=84=B1=ED=98=95 =EB=B6=80=ED=98=B8=EA=B3=84 (romanised "WAN= SUNG", literally "completion-form code set"). Each Hangul syllable is assigned a single code point drawn from a fixed table of pre-composed syllables. The main body of KS X 1001 defines such a table of 2,350 syllables; per the standard's commentary, that subset was chosen by frequency analysis over samples from publishing, print media, industry, academia and dictionaries at the time of the 1987 revision, which is why some valid modern syllables (e.g. =EB=A2=94, =EC=8C=B0, = =EC=8E=BC, =EC=93=94, =EC=AC=AC) were deliberately excluded. EUC-KR is the packed 8-bit form of that WANSUNG table, and Microsoft's CP949 / UHC is a later superset that fills in additional syllables. * =EC=A1=B0=ED=95=A9=ED=98=95 =EB=B6=80=ED=98=B8=EA=B3=84 (romanised "JOH= AB", literally "combinational code set"). Each Hangul syllable is constructed at encoding time from 5-bit codes for the initial consonant, medial vowel, and final consonant packed into two bytes, so all 11,172 modern syllables are directly representable without a lookup table. This is what Annex 3 defines and what PostgreSQL ships under the encoding name JOHAB. In short: completion form is a frequency-curated lookup, combinational form is an algorithmic composition that covers the full modern Hangul space. Unicode later adopted the combinational form's coverage as a completion-form table: the Hangul Syllables block (U+AC00 - U+D7A3) encodes exactly the same 11,172 modern syllables, as precomposed code points. So today the three Korean-related encodings PostgreSQL supports sit along this spectrum: EUC_KR (curated completion form), UHC (extended completion form), and JOHAB (algorithmic combinational form). =EB=B6=80=EC=86=8D=EC=84=9C 3 =EB=B3=B4=EC=A1=B0 =EB=B6=80=ED=98=B8=EA=B3= =84 (2=EB=B0=94=EC=9D=B4=ED=8A=B8 =EC=A1=B0=ED=95=A9=ED=98=95 =EB=B6=80=ED= =98=B8=EA=B3=84) [Annex 3. Supplementary code set (two-byte combinational code)] 1. =EC=A0=81=EC=9A=A9 =EB=B2=94=EC=9C=84 [Scope] =EC=9D=B4 =EB=B6=80=EC=86=8D=EC=84=9C=EC=97=90=EC=84=9C=EB=8A=94 =EA=B8= =B0=EB=B3=B8 =EB=B6=80=ED=98=B8=EA=B3=84=EC=9D=B8 2=EB=B0=94=EC=9D=B4=ED=8A= =B8 =EC=99=84=EC=84=B1=ED=98=95 =EB=B6=80=ED=98=B8=EA=B3=84=EC=9D=98 =EB=B3= =B4=EC=A1=B0 =EB=B6=80=ED=98=B8=EA=B3=84=EB=A1=9C=EC=84=9C, 2=EB=B0=94=EC=9D=B4=ED=8A=B8 =EC=A1=B0=ED=95=A9=ED=98=95 =EB=B6=80=ED=98= =B8=EA=B3=84=EB=A5=BC =EA=B7=9C=EC=A0=95=ED=95=9C=EB=8B=A4. [This annex specifies the two-byte combinational code set as the supplementary code set to the two-byte completion-form code set that constitutes the main body of the standard.] 2. =EB=8F=84=ED=98=95 =EB=AC=B8=EC=9E=90 [Graphic characters] a) =ED=95=9C =EA=B8=80 [Hangul] =EB=B6=80=EC=86=8D=EC=84=9C 3 =ED=91=9C 2=EC=97=90 =EA=B7=9C=EC=A0=95= =EB=90=9C =EC=B2=AB=EC=86=8C=EB=A6=AC =EA=B8=80=EC=9E=90 19=EC=9E=90, =EA= =B0=80=EC=9A=B4=EB=8E=83=EC=86=8C=EB=A6=AC =EA=B8=80=EC=9E=90 21=EC=9E=90, =EB=81=9D=EC=86=8C=EB=A6=AC =EA=B8=80=EC=9E=90 27=EC=9E=90=EB=A1=9C = =EC=A1=B0=ED=95=A9 =EA=B0=80=EB=8A=A5=ED=95=9C, =EB=AA=A8=EB=93=A0 =ED=98= =84=EB=8C=80 =ED=95=9C=EA=B8=80 =EA=B8=80=EC=9E=90 =EB=A7=88=EB=94=94(11 17= 2=EC=9E=90) =EB=B0=8F =ED=98=84=EB=8C=80 =ED=95=9C=EA=B8=80 =EB=82=B1=EC=9E=90(67= =EC=9E=90) [All modern Hangul syllables (11,172) and modern Hangul jamo (67) that can be composed from the 19 initials, 21 medials, and 27 finals defined in Annex 3 Table 2.] b) =ED=95=9C =EC=9E=90 [Hanja] 2=EB=B0=94=EC=9D=B4=ED=8A=B8 =EC=99=84=EC=84=B1=ED=98=95 =EB=B6=80=ED= =98=B8=EA=B3=84=EC=97=90=EC=84=9C =EA=B7=9C=EC=A0=95=ED=95=9C =ED=95=9C=EC= =9E=90(4 888=EC=9E=90) [The 4,888 Hanja defined in the two-byte completion-form code set.] c) =EA=B7=B8 =EB=B0=96=EC=9D=98 =EB=AC=B8=EC=9E=90 [Other characters] 2=EB=B0=94=EC=9D=B4=ED=8A=B8 =EC=99=84=EC=84=B1=ED=98=95 =EB=B6=80=ED= =98=B8=EA=B3=84=EC=97=90=EC=84=9C =EA=B7=9C=EC=A0=95=ED=95=9C =EB=AC=B8=EC= =9E=90 =EC=A4=91=EC=97=90=EC=84=9C =ED=98=84=EB=8C=80 =ED=95=9C=EA=B8=80 = =EA=B8=80=EC=9E=90 =EB=A7=88=EB=94=94 =EB=B0=8F =ED=98=84=EB=8C=80 =ED=95=9C=EA=B8=80 =EB=82=B1=EC=9E=90, = =ED=95=9C=EC=9E=90=EB=A5=BC =EC=A0=9C=EC=99=B8=ED=95=9C =EB=8F=84=ED=98=95 = =EB=AC=B8=EC=9E=90(937=EC=9E=90) [The 937 graphic characters defined in the completion-form code set other than modern Hangul syllables, modern Hangul jamo, and Hanja.] 3. =EB=8F=84=ED=98=95 =EB=AC=B8=EC=9E=90=EC=9D=98 =EB=B0=B0=EC=B9=98 =EC=98= =81=EC=97=AD [Graphic-character placement] =EB=8F=84=ED=98=95 =EB=AC=B8=EC=9E=90=EC=9D=98 =EB=B0=B0=EC=B9=98 =EC=98= =81=EC=97=AD=EC=9D=80 =EB=B6=80=EC=86=8D=EC=84=9C 3 =ED=91=9C 1=EA=B3=BC = =EA=B0=99=EB=8B=A4. [The placement of the graphic characters is given in Annex 3 Table 1.] =EB=B6=80=EC=86=8D=EC=84=9C 3 =ED=91=9C 1 =EB=8F=84=ED=98=95 =EB=AC=B8=EC= =9E=90=EC=9D=98 =EB=B0=B0=EC=B9=98 =EC=98=81=EC=97=AD [Annex 3 Table 1. Placement of graphic characters] =EA=B5=AC =EB=B6=84 =EC=B2=AB=EC=A7=B8 =EB=B0=94=EC=9D=B4=ED= =8A=B8 =EB=91=98=EC=A7=B8 =EB=B0=94=EC=9D=B4=ED=8A=B8 [Category] [Lead byte] [Trail byte] ---------------- ----------- -------------------- =ED=95=9C=EA=B8=80 =EA=B8=80=EC=9E=90=EB=A7=88=EB=94=94 84H=E2=80=93= D3H 41H=E2=80=937EH, 81H=E2=80=93FEH [Hangul syllables] =EC=82=AC=EC=9A=A9=EC=9E=90 =EC=A0=95=EC=9D=98 =EC=98=81=EC=97=AD D8H = 31H=E2=80=937EH, 91H=E2=80=93FEH [User-defined area] =EA=B8=B0=ED=83=80 =EB=AC=B8=EC=9E=90 D9H=E2=80=93DEH 31H= =E2=80=937EH, 91H=E2=80=93FEH [Other characters] =ED=95=9C =EC=9E=90 E0H=E2=80=93F9H 31H=E2=80=937EH, = 91H=E2=80=93FEH [Hanja] =EB=B9=84 =EA=B3=A0 16=EC=A7=84=EC=88=98=EB=A5=BC =EB=82=98=ED=83=80=EB= =82=B4=EA=B8=B0 =EC=9C=84=ED=95=98=EC=97=AC =EB=A7=A8 =EB=92=A4=EC=97=90 H= =EB=A5=BC =EC=A0=81=EB=8A=94=EB=8B=A4 (10 H=EB=8A=94 10=EC=A7=84=EB=B2=95=EC=9C=BC=EB=A1=9C 16=EC=9D=B4= =EB=8B=A4). [Note: a trailing H denotes a hexadecimal value (e.g. 10H equals 16 in decimal).] 4. =ED=95=9C=EA=B8=80 =EA=B8=80=EC=9E=90 =EB=A7=88=EB=94=94=EC=9D=98 =EB=B6= =80=ED=98=B8=EA=B0=92 =EA=B5=AC=EC=84=B1 =EB=B0=8F =EB=B0=B0=EC=97=B4 [Encoding and layout of Hangul syllables] =EA=B0=81 =ED=95=9C=EA=B8=80 =EA=B8=80=EC=9E=90 =EB=A7=88=EB=94=94=EC=9D= =98 =EB=B6=80=ED=98=B8=EA=B0=92=EC=9D=80 2=EB=B0=94=EC=9D=B4=ED=8A=B8 =EB= =82=B4=EC=97=90 =EC=B2=AB=EC=86=8C=EB=A6=AC =EA=B8=80=EC=9E=90 5=EB=B9=84= =ED=8A=B8, =EA=B0=80=EC=9A=B4=EB=8E=83=EC=86=8C=EB=A6=AC =EA=B8=80=EC=9E=90 5=EB=B9= =84=ED=8A=B8, =EB=81=9D=EC=86=8C=EB=A6=AC =EA=B8=80=EC=9E=90 5=EB=B9=84=ED= =8A=B8=EB=A1=9C =ED=95=98=EC=97=AC, =ED=95=9C=EA=B8=80 =EB=82=B1=EC=9E=90= =EB=A5=BC =EC=A1=B0=ED=95=A9=ED=95=98=EC=97=AC =ED=91=9C=ED=98=84=ED=95=9C =EA=B0=92=EC=9C=BC=EB=A1=9C =EC=A0=95=EC=9D= =98=ED=95=9C=EB=8B=A4. =EA=B0=81 =ED=95=9C=EA=B8=80 =EB=82=B1=EC=9E=90=EC= =9D=98 =EC=88=9C=EC=84=9C=EB=8A=94 =EC=B5=9C=EC=83=81=EC=9C=84 =EB=B9=84=ED= =8A=B8(MSB)=EB=A5=BC 1=EB=A1=9C =ED=95=98=EA=B3=A0 =EB=82=98=EC=84=9C =EC=B2=AB=EC=86=8C=EB=A6=AC, =EA=B0= =80=EC=9A=B4=EB=8E=83=EC=86=8C=EB=A6=AC, =EB=81=9D=EC=86=8C=EB=A6=AC =EA=B8= =80=EC=9E=90=EA=B0=80 =EC=88=9C=EC=84=9C=EB=8C=80=EB=A1=9C =EB=82=98=EC=98= =A4=EB=8F=84=EB=A1=9D =EA=B5=AC=EC=84=B1=ED=95=9C=EB=8B=A4. [The code value of each Hangul syllable is defined as the composition of the Hangul letters within two bytes: 5 bits for the initial consonant, 5 bits for the medial vowel, and 5 bits for the final consonant, laid out with the most-significant bit set to 1 followed by the initial, medial, and final in that order.] Annex 3 continues with Table 2 (5-bit jamo codes), Table 3 (row-wise mapping between completion-form and combinational-form for Hanja and other characters), and usage notes. Those are not needed for the verifier fix, but they do confirm that the mapping tables we already ship in johab_to_utf8.map line up with the standard; the same is true of the data under unicode.org's JOHAB.TXT that Robert pointed to earlier in the thread. On "multiple variants": the KS national standard for JOHAB (Annex 3) is singular and authoritative, and the mapping tables we ship match it. The Wikipedia note about EBCDIC-based and stateful JOHAB variants refers to niche vendor encodings that PostgreSQL never implemented. The historical "variant" churn in Korean encoding is in fact not about JOHAB but about the completion-form main body of KS X 1001 and its packed form EUC-KR: Microsoft's CP949 / UHC extended WANSUNG with additional Hangul syllables, and different vendors disagreed at the edges. PostgreSQL already separates those concerns by carrying EUC_KR and UHC as distinct encodings, so fixing JOHAB does not re-open that family of ambiguities. Diagnosis --------- pg_johab_mblen() in src/common/wchar.c delegates to pg_euc_mblen(), whose relevant branches treat 0x8F (EUC's SS3) as a 3-byte prefix and any other high-bit byte as a 2-byte prefix. pg_johab_verifychar() then requires each trail byte to satisfy IS_EUC_RANGE_VALID(), defined in the same file as ((c) >=3D 0xa1 && (c) <=3D 0xfe). Neither rule corresponds to the standard: * JOHAB has no three-byte sequences. 0x8F is simply a valid Hangul lead byte (it lies in the 0x84-0xD3 Hangul syllable range from Table 1) that begins a normal 2-byte sequence; EUC's SS3 handling spuriously inflates its length to 3. * Hangul trail bytes are 0x41-0x7E or 0x81-0xFE; the other three categories use 0x31-0x7E or 0x91-0xFE. Restricting trail bytes to 0xA1-0xFE rejects large portions of the standard, including the sequences in the bug report. 0x5C (ASCII backslash) is a valid Hangul trail byte, which is exactly what Jeroen's unit test surfaced. The consequence is that a substantial portion of johab_to_utf8.map is unreachable today: the verifier rejects the byte sequences before conversion is attempted. That matches Robert's observation that the "right" mapping existed but was gated behind an incorrect rule. Patch ----- The attached 0001-Fix-JOHAB-encoding-validation.txt makes these changes: src/common/wchar.c Rewrite pg_johab_mblen() to return 2 when the lead byte falls in any of the ranges listed in Annex 3 Table 1, and 1 otherwise (ASCII pass-through). Rewrite pg_johab_verifychar() to apply the correct trail-byte range depending on whether the lead byte is a Hangul lead byte (trail 0x41-0x7E or 0x81-0xFE) or a non-Hangul lead byte (trail 0x31-0x7E or 0x91-0xFE). Two helper macros IS_JOHAB_LEAD_HANGUL() and IS_JOHAB_LEAD_OTHER() express the lead-byte classification once and are shared between mblen and verifychar. A comment block above the implementation reproduces Table 1 for future maintainers. Also correct pg_wchar_table[PG_JOHAB].maxmblen from 3 to 2 so that callers sizing buffers from maxmblen do not over-allocate and so that the value matches the spec. doc/src/sgml/charset.sgml Update the JOHAB row in the character-set table to show the maximum character length as 1-2 instead of 1-3, matching the standard and the corrected maxmblen. src/test/regress/sql/johab.sql src/test/regress/expected/johab.out src/test/regress/expected/johab_1.out src/test/regress/parallel_schedule A new regression test, modelled on euc_kr.sql, that runs in UTF8 databases and skips otherwise. It covers: - the original bug sequences \x8A\x5B, \x8A\x5C, \x8A\x5D decoding to =EA=B5=8D, =EA=B5=8E, =EA=B5=8F; - the first multibyte character from JOHAB.TXT (\x84\x44 -> =E3=84=B3= ), previously rejected; - byte sequences that already decoded under the old rules (\x89\xEF -> =EA=B4=A6, \x89\xA1 -> =EA=B3=A0) to guard against reg= ression; - Hanja trail bytes that used to be rejected (\xE0\x31, \xE0\x7E, \xE0\x91); - one representative of the "other characters" category (\xD9\x31); - each lead-byte gap (0x80, 0xD5, 0xDF, 0xFA) producing an "invalid byte sequence" error; - every trail-byte gap for both Hangul (0x40, 0x7F, 0x80) and the non-Hangul categories (0x30, 0x7F, 0x90, 0xFF); - an incomplete trailing byte for a valid lead byte. Compatibility ------------- The mapping tables themselves are unchanged. Byte sequences that decode successfully today continue to decode to the same characters; the change is strictly additive in that previously-rejected sequences now succeed. Because JOHAB is a client-only encoding there is no on-disk representation to reconcile, so back-branch behaviour would move from a strict subset of valid JOHAB to full valid JOHAB, without reinterpreting any byte sequence that was previously accepted. I believe that is safe to back-patch, but confining the change to v19 is also entirely reasonable if the project prefers to limit the exposure. Why keep it rather than remove it --------------------------------- I understand the appeal of simply deleting a dead-looking encoding, and Thomas' removal patch is clean work. However, Korean archival data from the 1990s (government records, academic repositories, early online corpora) does exist as JOHAB bytes; as a client encoding, JOHAB in PostgreSQL provides a straightforward ingest path (client_encoding=3DJOHAB, convert_from, then store as UTF-8). Once removed, that path closes with no obvious alternative short of preprocessing outside PostgreSQL. Fixing the verifier preserves the capability at the cost of a ~30-line correction plus tests. Happy to iterate on the patch, the commit message, or the tests. Thanks to everyone for the careful analysis that preceded this; I recognise that the consensus was leaning toward removal, and I would appreciate a chance to have this fix considered as an alternative. Regards, Henson --000000000000d3d6e7064f7584ed Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi hackers,

=C2=A0
> So +1 from me, set the phasers to git rm.

+1

> Wait until 20, or just do it now?
Let's just do it now.



Following = up on my earlier note with an actual review of the primary
Korean nation= al standard and a fix patch.=C2=A0 The result turns out to be
small, and= I believe it resolves the ambiguity that drove the removal
proposal.

Standard reference
------------------


The authoritat= ive specification for JOHAB is Annex 3 of KS X 1001
(originally KS C 560= 1-1992 Annex 3, renumbered KS X 1001:1992 and
republished as KS X 1001:2= 004), published by the Korean Agency for
Technology and Standards (KATS)= and available from the national
e-standards portal:


=C2=A0 <= a href=3D"https://standard.go.kr/KSCI/api/std/viewMachine.do?reformNo=3D08&= amp;tmprKsNo=3DKSX1001&formType=3DSTD" target=3D"_blank">https://standa= rd.go.kr/KSCI/api/std/viewMachine.do?reformNo=3D08&tmprKsNo=3DKSX1001&a= mp;formType=3DSTD


The decisive passages are quoted below in = the original Korean with an
English translation, so non-Korean readers c= an verify the byte ranges
the fix implements.


Two terms from = the standard recur throughout the quoted passages:

=C2=A0 * =EC=99= =84=EC=84=B1=ED=98=95 =EB=B6=80=ED=98=B8=EA=B3=84 (romanised "WANSUNG&= quot;, literally "completion-form
=C2=A0 =C2=A0 code set").=C2= =A0 Each Hangul syllable is assigned a single code point
=C2=A0 =C2=A0 d= rawn from a fixed table of pre-composed syllables.=C2=A0 The main
=C2=A0= =C2=A0 body of KS X 1001 defines such a table of 2,350 syllables; per
= =C2=A0 =C2=A0 the standard's commentary, that subset was chosen by freq= uency
=C2=A0 =C2=A0 analysis over samples from publishing, print media, = industry,
=C2=A0 =C2=A0 academia and dictionaries at the time of the 198= 7 revision,
=C2=A0 =C2=A0 which is why some valid modern syllables (e.g.= =EB=A2=94, =EC=8C=B0, =EC=8E=BC, =EC=93=94,
=C2=A0 =C2=A0 =EC=AC=AC) we= re deliberately excluded.=C2=A0 EUC-KR is the packed 8-bit form
=C2=A0 = =C2=A0 of that WANSUNG table, and Microsoft's CP949 / UHC is a later=C2=A0 =C2=A0 superset that fills in additional syllables.

=C2=A0 *= =EC=A1=B0=ED=95=A9=ED=98=95 =EB=B6=80=ED=98=B8=EA=B3=84 (romanised "J= OHAB", literally "combinational code
=C2=A0 =C2=A0 set").= =C2=A0 Each Hangul syllable is constructed at encoding time
=C2=A0 =C2= =A0 from 5-bit codes for the initial consonant, medial vowel, and
=C2=A0= =C2=A0 final consonant packed into two bytes, so all 11,172 modern
=C2= =A0 =C2=A0 syllables are directly representable without a lookup table.
= =C2=A0 =C2=A0 This is what Annex 3 defines and what PostgreSQL ships under<= br>=C2=A0 =C2=A0 the encoding name JOHAB.

In short: completion form = is a frequency-curated lookup, combinational
form is an algorithmic comp= osition that covers the full modern Hangul
space.=C2=A0 Unicode later ad= opted the combinational form's coverage as a
completion-form table: = the Hangul Syllables block (U+AC00 - U+D7A3)
encodes exactly the same 11= ,172 modern syllables, as precomposed code
points.=C2=A0 So today the th= ree Korean-related encodings PostgreSQL
supports sit along this spectrum= : EUC_KR (curated completion form),
UHC (extended completion form), and = JOHAB (algorithmic combinational
form).


=EB=B6=80=EC=86=8D=EC= =84=9C 3 =EB=B3=B4=EC=A1=B0 =EB=B6=80=ED=98=B8=EA=B3=84 (2=EB=B0=94=EC=9D= =B4=ED=8A=B8 =EC=A1=B0=ED=95=A9=ED=98=95 =EB=B6=80=ED=98=B8=EA=B3=84)
[A= nnex 3.=C2=A0 Supplementary code set (two-byte combinational code)]

=
1. =EC=A0=81=EC=9A=A9 =EB=B2=94=EC=9C=84
[Scope]


=C2=A0 = =EC=9D=B4 =EB=B6=80=EC=86=8D=EC=84=9C=EC=97=90=EC=84=9C=EB=8A=94 =EA=B8=B0= =EB=B3=B8 =EB=B6=80=ED=98=B8=EA=B3=84=EC=9D=B8 2=EB=B0=94=EC=9D=B4=ED=8A=B8= =EC=99=84=EC=84=B1=ED=98=95 =EB=B6=80=ED=98=B8=EA=B3=84=EC=9D=98 =EB=B3=B4= =EC=A1=B0 =EB=B6=80=ED=98=B8=EA=B3=84=EB=A1=9C=EC=84=9C,
=C2=A0 2=EB=B0= =94=EC=9D=B4=ED=8A=B8 =EC=A1=B0=ED=95=A9=ED=98=95 =EB=B6=80=ED=98=B8=EA=B3= =84=EB=A5=BC =EA=B7=9C=EC=A0=95=ED=95=9C=EB=8B=A4.
=C2=A0 [This annex sp= ecifies the two-byte combinational code set as the
=C2=A0 supplementary = code set to the two-byte completion-form code set that
=C2=A0 constitute= s the main body of the standard.]


2. =EB=8F=84=ED=98=95 =EB=AC= =B8=EC=9E=90
[Graphic characters]


=C2=A0 a) =ED=95=9C =EA=B8= =80
=C2=A0 =C2=A0 =C2=A0[Hangul]
=C2=A0 =C2=A0 =C2=A0=EB=B6=80=EC=86= =8D=EC=84=9C 3 =ED=91=9C 2=EC=97=90 =EA=B7=9C=EC=A0=95=EB=90=9C =EC=B2=AB= =EC=86=8C=EB=A6=AC =EA=B8=80=EC=9E=90 19=EC=9E=90, =EA=B0=80=EC=9A=B4=EB=8E= =83=EC=86=8C=EB=A6=AC =EA=B8=80=EC=9E=90 21=EC=9E=90,
=C2=A0 =C2=A0 =C2= =A0=EB=81=9D=EC=86=8C=EB=A6=AC =EA=B8=80=EC=9E=90 27=EC=9E=90=EB=A1=9C =EC= =A1=B0=ED=95=A9 =EA=B0=80=EB=8A=A5=ED=95=9C, =EB=AA=A8=EB=93=A0 =ED=98=84= =EB=8C=80 =ED=95=9C=EA=B8=80 =EA=B8=80=EC=9E=90 =EB=A7=88=EB=94=94(11 172= =EC=9E=90)
=C2=A0 =C2=A0 =C2=A0=EB=B0=8F =ED=98=84=EB=8C=80 =ED=95=9C=EA= =B8=80 =EB=82=B1=EC=9E=90(67=EC=9E=90)
=C2=A0 =C2=A0 =C2=A0[All modern H= angul syllables (11,172) and modern Hangul jamo (67)
=C2=A0 =C2=A0 =C2= =A0that can be composed from the 19 initials, 21 medials, and 27
=C2=A0 = =C2=A0 =C2=A0finals defined in Annex 3 Table 2.]
=C2=A0 b) =ED=95=9C =EC= =9E=90
=C2=A0 =C2=A0 =C2=A0[Hanja]
=C2=A0 =C2=A0 =C2=A02=EB=B0=94=EC= =9D=B4=ED=8A=B8 =EC=99=84=EC=84=B1=ED=98=95 =EB=B6=80=ED=98=B8=EA=B3=84=EC= =97=90=EC=84=9C =EA=B7=9C=EC=A0=95=ED=95=9C =ED=95=9C=EC=9E=90(4 888=EC=9E= =90)
=C2=A0 =C2=A0 =C2=A0[The 4,888 Hanja defined in the two-byte comple= tion-form code
=C2=A0 =C2=A0 =C2=A0set.]
=C2=A0 c) =EA=B7=B8 =EB=B0= =96=EC=9D=98 =EB=AC=B8=EC=9E=90
=C2=A0 =C2=A0 =C2=A0[Other characters]=C2=A0 =C2=A0 =C2=A02=EB=B0=94=EC=9D=B4=ED=8A=B8 =EC=99=84=EC=84=B1=ED=98= =95 =EB=B6=80=ED=98=B8=EA=B3=84=EC=97=90=EC=84=9C =EA=B7=9C=EC=A0=95=ED=95= =9C =EB=AC=B8=EC=9E=90 =EC=A4=91=EC=97=90=EC=84=9C =ED=98=84=EB=8C=80 =ED= =95=9C=EA=B8=80 =EA=B8=80=EC=9E=90 =EB=A7=88=EB=94=94
=C2=A0 =C2=A0 =C2= =A0=EB=B0=8F =ED=98=84=EB=8C=80 =ED=95=9C=EA=B8=80 =EB=82=B1=EC=9E=90, =ED= =95=9C=EC=9E=90=EB=A5=BC =EC=A0=9C=EC=99=B8=ED=95=9C =EB=8F=84=ED=98=95 =EB= =AC=B8=EC=9E=90(937=EC=9E=90)
=C2=A0 =C2=A0 =C2=A0[The 937 graphic chara= cters defined in the completion-form code
=C2=A0 =C2=A0 =C2=A0set other = than modern Hangul syllables, modern Hangul jamo, and
=C2=A0 =C2=A0 =C2= =A0Hanja.]


3. =EB=8F=84=ED=98=95 =EB=AC=B8=EC=9E=90=EC=9D=98 =EB= =B0=B0=EC=B9=98 =EC=98=81=EC=97=AD
[Graphic-character placement]

=
=C2=A0 =EB=8F=84=ED=98=95 =EB=AC=B8=EC=9E=90=EC=9D=98 =EB=B0=B0=EC=B9= =98 =EC=98=81=EC=97=AD=EC=9D=80 =EB=B6=80=EC=86=8D=EC=84=9C 3 =ED=91=9C 1= =EA=B3=BC =EA=B0=99=EB=8B=A4.
=C2=A0 [The placement of the graphic chara= cters is given in Annex 3
=C2=A0 Table 1.]


=EB=B6=80=EC=86=8D= =EC=84=9C 3 =ED=91=9C 1 =C2=A0=EB=8F=84=ED=98=95 =EB=AC=B8=EC=9E=90=EC=9D= =98 =EB=B0=B0=EC=B9=98 =EC=98=81=EC=97=AD
[Annex 3 Table 1.=C2=A0 Placem= ent of graphic characters]


=C2=A0 =EA= =B5=AC =EB=B6=84 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=EC=B2=AB= =EC=A7=B8 =EB=B0=94=EC=9D=B4=ED=8A=B8 =C2=A0 =C2=A0=EB=91=98=EC=A7=B8 =EB= =B0=94=EC=9D=B4=ED=8A=B8
=C2=A0 [Category] =C2=A0 =C2=A0 =C2=A0 =C2=A0 [= Lead byte] =C2=A0 =C2=A0[Trail byte]
=C2=A0 ---------------- =C2=A0 ----= ------- =C2=A0 =C2=A0--------------------
=C2=A0 =ED=95=9C=EA=B8=80 =EA= =B8=80=EC=9E=90=EB=A7=88=EB=94=94 =C2=A0 =C2=A0 =C2=A084H=E2=80=93D3H =C2= =A0 =C2=A0 =C2=A0 =C2=A041H=E2=80=937EH, 81H=E2=80=93FEH
=C2=A0 [Hangul = syllables]
=C2=A0 =EC=82=AC=EC=9A=A9=EC=9E=90 =EC=A0=95=EC=9D=98 =EC=98= =81=EC=97=AD =C2=A0 D8H =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A031H=E2=80= =937EH, 91H=E2=80=93FEH
=C2=A0 [User-defined area]
=C2=A0 =EA=B8=B0= =ED=83=80 =EB=AC=B8=EC=9E=90 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0D9H=E2=80=93= DEH =C2=A0 =C2=A0 =C2=A0 =C2=A031H=E2=80=937EH, 91H=E2=80=93FEH
=C2=A0 [= Other characters]
=C2=A0 =ED=95=9C =EC=9E=90 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0E0H=E2=80=93F9H =C2=A0 =C2=A0 =C2=A0 =C2=A031H=E2=80= =937EH, 91H=E2=80=93FEH
=C2=A0 [Hanja]



=C2=A0 =EB=B9= =84 =EA=B3=A0 16=EC=A7=84=EC=88=98=EB=A5=BC =EB=82=98=ED=83=80=EB=82=B4=EA= =B8=B0 =EC=9C=84=ED=95=98=EC=97=AC =EB=A7=A8 =EB=92=A4=EC=97=90 H=EB=A5=BC = =EC=A0=81=EB=8A=94=EB=8B=A4
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (10 H=EB=8A=94 1= 0=EC=A7=84=EB=B2=95=EC=9C=BC=EB=A1=9C 16=EC=9D=B4=EB=8B=A4).
=C2=A0 [Not= e: a trailing H denotes a hexadecimal value
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = (e.g. 10H equals 16 in decimal).]


4. =ED=95=9C=EA=B8=80 =EA=B8= =80=EC=9E=90 =EB=A7=88=EB=94=94=EC=9D=98 =EB=B6=80=ED=98=B8=EA=B0=92 =EA=B5= =AC=EC=84=B1 =EB=B0=8F =EB=B0=B0=EC=97=B4
[Encoding and layout of Hangul= syllables]


=C2=A0 =EA=B0=81 =ED=95=9C=EA=B8=80 =EA=B8=80=EC=9E= =90 =EB=A7=88=EB=94=94=EC=9D=98 =EB=B6=80=ED=98=B8=EA=B0=92=EC=9D=80 2=EB= =B0=94=EC=9D=B4=ED=8A=B8 =EB=82=B4=EC=97=90 =EC=B2=AB=EC=86=8C=EB=A6=AC =EA= =B8=80=EC=9E=90 5=EB=B9=84=ED=8A=B8,
=C2=A0 =EA=B0=80=EC=9A=B4=EB=8E=83= =EC=86=8C=EB=A6=AC =EA=B8=80=EC=9E=90 5=EB=B9=84=ED=8A=B8, =EB=81=9D=EC=86= =8C=EB=A6=AC =EA=B8=80=EC=9E=90 5=EB=B9=84=ED=8A=B8=EB=A1=9C =ED=95=98=EC= =97=AC, =ED=95=9C=EA=B8=80 =EB=82=B1=EC=9E=90=EB=A5=BC =EC=A1=B0=ED=95=A9= =ED=95=98=EC=97=AC
=C2=A0 =ED=91=9C=ED=98=84=ED=95=9C =EA=B0=92=EC=9C=BC= =EB=A1=9C =EC=A0=95=EC=9D=98=ED=95=9C=EB=8B=A4. =EA=B0=81 =ED=95=9C=EA=B8= =80 =EB=82=B1=EC=9E=90=EC=9D=98 =EC=88=9C=EC=84=9C=EB=8A=94 =EC=B5=9C=EC=83= =81=EC=9C=84 =EB=B9=84=ED=8A=B8(MSB)=EB=A5=BC 1=EB=A1=9C
=C2=A0 =ED=95= =98=EA=B3=A0 =EB=82=98=EC=84=9C =EC=B2=AB=EC=86=8C=EB=A6=AC, =EA=B0=80=EC= =9A=B4=EB=8E=83=EC=86=8C=EB=A6=AC, =EB=81=9D=EC=86=8C=EB=A6=AC =EA=B8=80=EC= =9E=90=EA=B0=80 =EC=88=9C=EC=84=9C=EB=8C=80=EB=A1=9C =EB=82=98=EC=98=A4=EB= =8F=84=EB=A1=9D
=C2=A0 =EA=B5=AC=EC=84=B1=ED=95=9C=EB=8B=A4.
=C2=A0 [= The code value of each Hangul syllable is defined as the composition
=C2= =A0 of the Hangul letters within two bytes: 5 bits for the initial
=C2= =A0 consonant, 5 bits for the medial vowel, and 5 bits for the final
=C2= =A0 consonant, laid out with the most-significant bit set to 1 followed
= =C2=A0 by the initial, medial, and final in that order.]


Annex 3= continues with Table 2 (5-bit jamo codes), Table 3 (row-wise
mapping be= tween completion-form and combinational-form for Hanja and
other charact= ers), and usage notes.=C2=A0 Those are not needed for the
verifier fix, = but they do confirm that the mapping tables we already
ship in johab_to_= utf8.map line up with the standard; the same is true
of the data under <= a href=3D"http://unicode.org" target=3D"_blank">unicode.org's JOHAB= .TXT that Robert pointed to
earlier in the thread.


On "m= ultiple variants": the KS national standard for JOHAB (Annex 3)
is = singular and authoritative, and the mapping tables we ship match
it.=C2= =A0 The Wikipedia note about EBCDIC-based and stateful JOHAB variants
re= fers to niche vendor encodings that PostgreSQL never implemented.

Th= e historical "variant" churn in Korean encoding is in fact not ab= out
JOHAB but about the completion-form main body of KS X 1001 and itspacked form EUC-KR: Microsoft's CP949 / UHC extended WANSUNG with
= additional Hangul syllables, and different vendors disagreed at the
edge= s.=C2=A0 PostgreSQL already separates those concerns by carrying
EUC_KR = and UHC as distinct encodings, so fixing JOHAB does not
re-open that fam= ily of ambiguities.


Diagnosis
---------


pg_johab_m= blen() in src/common/wchar.c delegates to pg_euc_mblen(),
whose relevant= branches treat 0x8F (EUC's SS3) as a 3-byte prefix and
any other hi= gh-bit byte as a 2-byte prefix. =C2=A0pg_johab_verifychar()
then require= s each trail byte to satisfy IS_EUC_RANGE_VALID(), defined
in the same f= ile as ((c) >=3D 0xa1 && (c) <=3D 0xfe).=C2=A0 Neither rulecorresponds to the standard:


=C2=A0 * JOHAB has no three-byte = sequences. =C2=A00x8F is simply a valid Hangul
=C2=A0 =C2=A0 lead byte (= it lies in the 0x84-0xD3 Hangul syllable range from
=C2=A0 =C2=A0 Table = 1) that begins a normal 2-byte sequence; EUC's SS3 handling
=C2=A0 = =C2=A0 spuriously inflates its length to 3.
=C2=A0 * Hangul trail bytes = are 0x41-0x7E or 0x81-0xFE; the other three
=C2=A0 =C2=A0 categories use= 0x31-0x7E or 0x91-0xFE.=C2=A0 Restricting trail bytes to
=C2=A0 =C2=A0 = 0xA1-0xFE rejects large portions of the standard, including the
=C2=A0 = =C2=A0 sequences in the bug report. =C2=A00x5C (ASCII backslash) is a valid=
=C2=A0 =C2=A0 Hangul trail byte, which is exactly what Jeroen's uni= t test
=C2=A0 =C2=A0 surfaced.


The consequence is that a subs= tantial portion of johab_to_utf8.map is
unreachable today: the verifier = rejects the byte sequences before
conversion is attempted.=C2=A0 That ma= tches Robert's observation that the
"right" mapping existe= d but was gated behind an incorrect rule.


Patch
-----

=
The attached 0001-Fix-JOHAB-encoding-validation.txt makes these
chan= ges:


=C2=A0 src/common/wchar.c
=C2=A0 =C2=A0 Rewrite pg_johab= _mblen() to return 2 when the lead byte falls in
=C2=A0 =C2=A0 any of th= e ranges listed in Annex 3 Table 1, and 1 otherwise
=C2=A0 =C2=A0 (ASCII= pass-through).=C2=A0 Rewrite pg_johab_verifychar() to apply the
=C2=A0 = =C2=A0 correct trail-byte range depending on whether the lead byte is a
= =C2=A0 =C2=A0 Hangul lead byte (trail 0x41-0x7E or 0x81-0xFE) or a non-Hang= ul
=C2=A0 =C2=A0 lead byte (trail 0x31-0x7E or 0x91-0xFE).=C2=A0 Two hel= per macros
=C2=A0 =C2=A0 IS_JOHAB_LEAD_HANGUL() and IS_JOHAB_LEAD_OTHER(= ) express the
=C2=A0 =C2=A0 lead-byte classification once and are shared= between mblen and
=C2=A0 =C2=A0 verifychar.=C2=A0 A comment block above= the implementation reproduces
=C2=A0 =C2=A0 Table 1 for future maintain= ers.=C2=A0 Also correct
=C2=A0 =C2=A0 pg_wchar_table[PG_JOHAB].maxmblen = from 3 to 2 so that callers
=C2=A0 =C2=A0 sizing buffers from maxmblen d= o not over-allocate and so that the
=C2=A0 =C2=A0 value matches the spec= .


=C2=A0 doc/src/sgml/charset.sgml
=C2=A0 =C2=A0 Update the J= OHAB row in the character-set table to show the
=C2=A0 =C2=A0 maximum ch= aracter length as 1-2 instead of 1-3, matching the
=C2=A0 =C2=A0 standar= d and the corrected maxmblen.


=C2=A0 src/test/regress/sql/johab.= sql
=C2=A0 src/test/regress/expected/johab.out
=C2=A0 src/test/regres= s/expected/johab_1.out
=C2=A0 src/test/regress/parallel_schedule
=C2= =A0 =C2=A0 A new regression test, modelled on euc_kr.sql, that runs in UTF8=
=C2=A0 =C2=A0 databases and skips otherwise.=C2=A0 It covers:

=C2=A0 =C2=A0 =C2=A0 - the original bug sequences \x8A\x5B, \x8A\x5C, \x8= A\x5D
=C2=A0 =C2=A0 =C2=A0 =C2=A0 decoding to =EA=B5=8D, =EA=B5=8E, =EA= =B5=8F;
=C2=A0 =C2=A0 =C2=A0 - the first multibyte character from JOHAB.= TXT (\x84\x44 -> =E3=84=B3),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 previously r= ejected;
=C2=A0 =C2=A0 =C2=A0 - byte sequences that already decoded unde= r the old rules
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (\x89\xEF -> =EA=B4=A6, \= x89\xA1 -> =EA=B3=A0) to guard against regression;
=C2=A0 =C2=A0 =C2= =A0 - Hanja trail bytes that used to be rejected (\xE0\x31,
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 \xE0\x7E, \xE0\x91);
=C2=A0 =C2=A0 =C2=A0 - one repres= entative of the "other characters" category
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 (\xD9\x31);
=C2=A0 =C2=A0 =C2=A0 - each lead-byte gap (0x80, = 0xD5, 0xDF, 0xFA) producing an
=C2=A0 =C2=A0 =C2=A0 =C2=A0 "invalid= byte sequence" error;
=C2=A0 =C2=A0 =C2=A0 - every trail-byte gap = for both Hangul (0x40, 0x7F, 0x80) and
=C2=A0 =C2=A0 =C2=A0 =C2=A0 the n= on-Hangul categories (0x30, 0x7F, 0x90, 0xFF);
=C2=A0 =C2=A0 =C2=A0 - an= incomplete trailing byte for a valid lead byte.


Compatibility-------------


The mapping tables themselves are unchanged.=C2= =A0 Byte sequences that
decode successfully today continue to decode to = the same characters;
the change is strictly additive in that previously-= rejected sequences
now succeed.=C2=A0 Because JOHAB is a client-only enc= oding there is no
on-disk representation to reconcile, so back-branch be= haviour would
move from a strict subset of valid JOHAB to full valid JOH= AB, without
reinterpreting any byte sequence that was previously accepte= d. =C2=A0I
believe that is safe to back-patch, but confining the change = to v19
is also entirely reasonable if the project prefers to limit theexposure.


Why keep it rather than remove it
---------------= ------------------


I understand the appeal of simply deleting a = dead-looking encoding,
and Thomas' removal patch is clean work.=C2= =A0 However, Korean archival
data from the 1990s (government records, ac= ademic repositories, early
online corpora) does exist as JOHAB bytes; as= a client encoding, JOHAB
in PostgreSQL provides a straightforward inges= t path
(client_encoding=3DJOHAB, convert_from, then store as UTF-8).=C2= =A0 Once
removed, that path closes with no obvious alternative short of<= br>preprocessing outside PostgreSQL.=C2=A0 Fixing the verifier preserves th= e
capability at the cost of a ~30-line correction plus tests.

Happy to iterate on the patch, the commit message, or the tests.
Thanks= to everyone for the careful analysis that preceded this; I
recognise th= at the consensus was leaning toward removal, and I would
appreciate a ch= ance to have this fix considered as an alternative.


Regards,
=
Henson=C2=A0
--000000000000d3d6e7064f7584ed-- --000000000000d3d6e8064f7584ef Content-Type: text/plain; charset="US-ASCII"; name="0001-Fix-JOHAB-encoding-validation.txt" Content-Disposition: attachment; filename="0001-Fix-JOHAB-encoding-validation.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnzcrzvk0 RnJvbSA5NGZjMGQwYzJmMmU3NDI4ZjExMWZiOTUyZGRhNjM1Yjk5Yzg0ZGEzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIZW5zb24gQ2hvaSA8YXNzYW0yNThAZ21haWwuY29tPgpEYXRl OiBXZWQsIDE1IEFwciAyMDI2IDA4OjQ2OjU2ICswOTAwClN1YmplY3Q6IFtQQVRDSF0gRml4IEpP SEFCIGVuY29kaW5nIHZhbGlkYXRpb24gdG8gbWF0Y2ggS1MgWCAxMDAxIEFubmV4IDMuCk1JTUUt VmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOApDb250 ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CgpTaW5jZSB0aGUgZW5jb2Rpbmcgd2FzIGFkZGVk IGluIDIwMDIsIHBnX2pvaGFiX21ibGVuKCkgYW5kCnBnX2pvaGFiX3ZlcmlmeWNoYXIoKSBoYXZl IGJvcnJvd2VkIHRoZWlyIGJ5dGUtbGVuZ3RoIGFuZCB0cmFpbC1ieXRlCnJ1bGVzIGZyb20gRVVD LUtSIHZpYSBwZ19ldWNfbWJsZW4oKSBhbmQgSVNfRVVDX1JBTkdFX1ZBTElEKCksIHdoaWNoCmRl bWFuZCB0cmFpbCBieXRlcyBpbiAweEExLTB4RkUuICBKT0hBQiBkb2VzIG5vdCBmb2xsb3cgdGhh dCBydWxlOiBwZXIKS1MgWCAxMDAxOjIwMDQgQW5uZXggMyBUYWJsZSAxLCB0cmFpbCBieXRlcyBt YXkgZmFsbCBhbnl3aGVyZSBpbgoweDQxLTB4N0Ugb3IgMHg4MS0weEZFIGZvciBIYW5ndWwgc3ls bGFibGVzICgweDMxLTB4N0Ugb3IgMHg5MS0weEZFCmZvciB0aGUgb3RoZXIgdGhyZWUgY2F0ZWdv cmllcyksIGluY2x1ZGluZyB0aGUgQVNDSUkgZ3JhcGhpYyByYW5nZQphbmQgaW4gcGFydGljdWxh ciAweDVDLCB0aGUgYmFja3NsYXNoLiAgQXMgYSByZXN1bHQsIG1vc3Qgb2YgdGhlCm1hcHBpbmdz IHNoaXBwZWQgaW4gam9oYWJfdG9fdXRmOC5tYXAgd2VyZSB1bnJlYWNoYWJsZTogdGhlIHZlcmlm aWVyCnJlamVjdGVkIHRoZSBieXRlIHNlcXVlbmNlcyBiZWZvcmUgdGhleSBjb3VsZCBiZSBjb252 ZXJ0ZWQuICBUaGUKZmlyc3QgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgaW4gdGhlIHNvdXJjZSBKT0hB Qi5UWFQgKFx4ODRceDQ0KSBhbmQgdGhlCm9yaWdpbmFsbHkgcmVwb3J0ZWQgc2VxdWVuY2UgXHg4 QVx4NUMgPSAi6rWOIiB3ZXJlIGJvdGggYWZmZWN0ZWQuCgpSZXdyaXRlIHBnX2pvaGFiX21ibGVu KCkgYW5kIHBnX2pvaGFiX3ZlcmlmeWNoYXIoKSB0byBjbGFzc2lmeSB0aGUKbGVhZGluZyBieXRl IGludG8gdGhlIGZvdXIgY2F0ZWdvcmllcyBkZWZpbmVkIGJ5IEFubmV4IDMgVGFibGUgMSBhbmQK YWNjZXB0IG9ubHkgdGhlIHRyYWlsLWJ5dGUgcmFuZ2VzIHNwZWNpZmllZCBmb3IgZWFjaCBjYXRl Z29yeS4gIFRoZQplbmNvZGluZyBpcyBzdHJpY3RseSB0d28gYnl0ZXMgd2lkZSBmb3IgYW55IG5v bi1BU0NJSSBjaGFyYWN0ZXIsIHNvCmFsc28gY29ycmVjdCBwZ193Y2hhcl90YWJsZVtQR19KT0hB Ql0ubWF4bWJsZW4gZnJvbSAzIHRvIDIgYW5kIHRoZQpjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiBj aGFyc2V0LnNnbWwuICBBIG5ldyByZWdyZXNzaW9uIHRlc3QgY292ZXJzCnRoZSBvcmlnaW5hbCBi dWcgc2VxdWVuY2VzLCBib3VuZGFyeSBjYXNlcyBmb3IgZWFjaCBsZWFkIGFuZCB0cmFpbApyYW5n ZSwgYW5kIHRoZSBpbnZhbGlkLWJ5dGUgZ2Fwcy4KClRoZSBtYXBwaW5nIHRhYmxlcyB0aGVtc2Vs dmVzIHdlcmUgYWxyZWFkeSBjb3JyZWN0IGFuZCBhcmUgdW5jaGFuZ2VkLApzbyB0aGlzIGZpeCBp cyBmb3J3YXJkLWNvbXBhdGlibGU6IHNlcXVlbmNlcyB0aGF0IGRlY29kZWQgYmVmb3JlCmNvbnRp bnVlIHRvIGRlY29kZSBpZGVudGljYWxseSwgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3ZXJlCmVy cm9uZW91c2x5IHJlamVjdGVkIG5vdyBzdWNjZWVkLgoKQnVnOiAjMTkzNTQKUmVwb3J0ZWQtYnk6 IEplcm9lbiBWZXJtZXVsZW4gPGp0dmp0dkBnbWFpbC5jb20+CkRpc2N1c3Npb246IGh0dHBzOi8v cG9zdGdyLmVzL20vMTkzNTQtZWVmZTZkOGIzZTg0ZjlmMkBwb3N0Z3Jlc3FsLm9yZwotLS0KIGRv Yy9zcmMvc2dtbC9jaGFyc2V0LnNnbWwgICAgICAgICAgICAgfCAgMiArLQogc3JjL2NvbW1vbi93 Y2hhci5jICAgICAgICAgICAgICAgICAgICB8IDY5ICsrKysrKysrKysrKysrKystLS0tLQogc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2hhYi5vdXQgICB8IDg3ICsrKysrKysrKysrKysrKysr KysrKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2hhYl8xLm91dCB8ICA5ICsr Kwogc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZSAgICB8ICAyICstCiBzcmMvdGVz dC9yZWdyZXNzL3NxbC9qb2hhYi5zcWwgICAgICAgIHwgNTggKysrKysrKysrKysrKysrKysrCiA2 IGZpbGVzIGNoYW5nZWQsIDIwOSBpbnNlcnRpb25zKCspLCAxOCBkZWxldGlvbnMoLSkKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaGFiLm91dAogY3JlYXRl IG1vZGUgMTAwNjQ0IHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9oYWJfMS5vdXQKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2hhYi5zcWwKCmRpZmYgLS1naXQg YS9kb2Mvc3JjL3NnbWwvY2hhcnNldC5zZ21sIGIvZG9jL3NyYy9zZ21sL2NoYXJzZXQuc2dtbApp bmRleCA3NDZlNDBiYjlkMi4uOGZmN2Y3ZWQwM2QgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9j aGFyc2V0LnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2NoYXJzZXQuc2dtbApAQCAtMTkzNCw3ICsx OTM0LDcgQEAgT1JERVIgQlkgYyBDT0xMQVRFIGViY2RpYzsKICAgICAgICAgIDxlbnRyeT5Lb3Jl YW4gKEhhbmd1bCk8L2VudHJ5PgogICAgICAgICAgPGVudHJ5Pk5vPC9lbnRyeT4KICAgICAgICAg IDxlbnRyeT5ObzwvZW50cnk+Ci0gICAgICAgICA8ZW50cnk+MSZuZGFzaDszPC9lbnRyeT4KKyAg ICAgICAgIDxlbnRyeT4xJm5kYXNoOzI8L2VudHJ5PgogICAgICAgICAgPGVudHJ5PjwvZW50cnk+ CiAgICAgICAgIDwvcm93PgogICAgICAgICA8cm93PgpkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi93 Y2hhci5jIGIvc3JjL2NvbW1vbi93Y2hhci5jCmluZGV4IGE0NGVlNzNhY2NmLi5mNDkzZTRkOWE5 OSAxMDA2NDQKLS0tIGEvc3JjL2NvbW1vbi93Y2hhci5jCisrKyBiL3NyYy9jb21tb24vd2NoYXIu YwpAQCAtNDM4LDE4ICs0MzgsNDUgQEAgcGdfd2NoYXIyZXVjX3dpdGhfbGVuKGNvbnN0IHBnX3dj aGFyICpmcm9tLCB1bnNpZ25lZCBjaGFyICp0bywgaW50IGxlbikKIAogCiAvKgotICogSk9IQUIK KyAqIEpPSEFCIChLUyBYIDEwMDE6MjAwNCBBbm5leCAzLCBhLmsuYS4gdGhlIDItYnl0ZSBjb21i aW5hdGlvbmFsIGNvZGUpCisgKgorICogQnl0ZSByYW5nZXMgcGVyIEFubmV4IDMgVGFibGUgMToK KyAqCisgKiAgIENhdGVnb3J5ICAgICAgICAgICAgICBMZWFkIGJ5dGUgICAgVHJhaWwgYnl0ZQor ICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0t LS0tLQorICogICBIYW5ndWwgc3lsbGFibGVzICAgICAgMHg4NCAtIDB4RDMgIDB4NDEgLSAweDdF LCAweDgxIC0gMHhGRQorICogICBVc2VyLWRlZmluZWQgYXJlYSBBICAgMHhEOCAgICAgICAgIDB4 MzEgLSAweDdFLCAweDkxIC0gMHhGRQorICogICBPdGhlciBjaGFyYWN0ZXJzICAgICAgMHhEOSAt IDB4REUgIDB4MzEgLSAweDdFLCAweDkxIC0gMHhGRQorICogICBIYW5qYSAgICAgICAgICAgICAg ICAgMHhFMCAtIDB4RjkgIDB4MzEgLSAweDdFLCAweDkxIC0gMHhGRQorICoKKyAqIEFTQ0lJICg8 IDB4ODApIGlzIHNpbmdsZS1ieXRlLiAgTGVhZCBieXRlcyBpbiB0aGUgZ2FwcyBiZXR3ZWVuIHRo ZSByYW5nZXMKKyAqIGFib3ZlICgweDgwLTB4ODMsIDB4RDQtMHhENywgMHhERiwgMHhGQS0weEZG KSBhcmUgaW52YWxpZC4gIExpa2V3aXNlLAorICogdHJhaWwgYnl0ZXMgdGhhdCBmYWxsIG91dHNp ZGUgdGhlaXIgYWxsb3dlZCB1bmlvbiBhcmUgaW52YWxpZDogZm9yIEhhbmd1bAorICogdGhpcyBl eGNsdWRlcyAweDAwLTB4NDAsIDB4N0YtMHg4MCwgYW5kIDB4RkY7IGZvciB0aGUgb3RoZXIgY2F0 ZWdvcmllcworICogdGhpcyBleGNsdWRlcyAweDAwLTB4MzAsIDB4N0YtMHg5MCwgYW5kIDB4RkYu CisgKgorICogTm90ZSB0aGF0IHVubGlrZSBFVUMtS1IsIHRyYWlsIGJ5dGVzIG1heSBmYWxsIHdp dGhpbiB0aGUgQVNDSUkgZ3JhcGhpYworICogcmFuZ2UgKGluY2x1ZGluZyAweDVDIGJhY2tzbGFz aCksIHNvIGNhbGxlcnMgZGVhbGluZyB3aXRoIEpPSEFCIHRleHQKKyAqIG11c3Qgbm90IGFzc3Vt ZSBBU0NJSSBieXRlcyBhcmUgc2VsZi1zeW5jaHJvbml6aW5nLgogICovCisjZGVmaW5lIElTX0pP SEFCX0xFQURfSEFOR1VMKGMpCSgoYykgPj0gMHg4NCAmJiAoYykgPD0gMHhEMykKKyNkZWZpbmUg SVNfSk9IQUJfTEVBRF9PVEhFUihjKQlcCisJKCgoYykgPj0gMHhEOCAmJiAoYykgPD0gMHhERSkg fHwgKChjKSA+PSAweEUwICYmIChjKSA8PSAweEY5KSkKKwogc3RhdGljIGludAogcGdfam9oYWJf bWJsZW4oY29uc3QgdW5zaWduZWQgY2hhciAqcykKIHsKLQlyZXR1cm4gcGdfZXVjX21ibGVuKHMp OworCWlmIChJU19KT0hBQl9MRUFEX0hBTkdVTCgqcykgfHwgSVNfSk9IQUJfTEVBRF9PVEhFUigq cykpCisJCXJldHVybiAyOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBwZ19qb2hhYl9k c3BsZW4oY29uc3QgdW5zaWduZWQgY2hhciAqcykKIHsKLQlyZXR1cm4gcGdfZXVjX2RzcGxlbihz KTsKKwlpZiAoSVNfSElHSEJJVF9TRVQoKnMpKQorCQlyZXR1cm4gMjsKKwlyZXR1cm4gcGdfYXNj aWlfZHNwbGVuKHMpOwogfQogCiAvKgpAQCAtMTE1NiwyNSArMTE4MywzNSBAQCBwZ19ldWN0d192 ZXJpZnlzdHIoY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IGxlbikKIHN0YXRpYyBpbnQKIHBn X2pvaGFiX3ZlcmlmeWNoYXIoY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IGxlbikKIHsKLQlp bnQJCQlsLAotCQkJCW1ibDsKLQl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgY2hhciBiMSwK KwkJCQliMjsKIAotCWwgPSBtYmwgPSBwZ19qb2hhYl9tYmxlbihzKTsKKwlpZiAoIUlTX0hJR0hC SVRfU0VUKCpzKSkKKwkJcmV0dXJuIDE7CiAKLQlpZiAobGVuIDwgbCkKKwlpZiAobGVuIDwgMikK IAkJcmV0dXJuIC0xOwogCi0JaWYgKCFJU19ISUdIQklUX1NFVCgqcykpCi0JCXJldHVybiBtYmw7 CisJYjEgPSBzWzBdOworCWIyID0gc1sxXTsKIAotCXdoaWxlICgtLWwgPiAwKQorCS8qCisJICog UGVyIEtTIFggMTAwMToyMDA0IEFubmV4IDMgVGFibGUgMSwgdHJhaWxpbmcgYnl0ZSByYW5nZXMg ZGVwZW5kIG9uIHRoZQorCSAqIGxlYWRpbmcgYnl0ZSdzIGNhdGVnb3J5LgorCSAqLworCWlmIChJ U19KT0hBQl9MRUFEX0hBTkdVTChiMSkpCiAJewotCQljID0gKisrczsKLQkJaWYgKCFJU19FVUNf UkFOR0VfVkFMSUQoYykpCi0JCQlyZXR1cm4gLTE7CisJCS8qIEhhbmd1bCBzeWxsYWJsZXM6IDB4 NDEtMHg3RSBvciAweDgxLTB4RkUgKi8KKwkJaWYgKChiMiA+PSAweDQxICYmIGIyIDw9IDB4N0Up IHx8IChiMiA+PSAweDgxICYmIGIyIDw9IDB4RkUpKQorCQkJcmV0dXJuIDI7CiAJfQotCXJldHVy biBtYmw7CisJZWxzZSBpZiAoSVNfSk9IQUJfTEVBRF9PVEhFUihiMSkpCisJeworCQkvKiBVc2Vy LWRlZmluZWQsIG90aGVyIGNoYXJhY3RlcnMsIEhhbmphOiAweDMxLTB4N0Ugb3IgMHg5MS0weEZF ICovCisJCWlmICgoYjIgPj0gMHgzMSAmJiBiMiA8PSAweDdFKSB8fCAoYjIgPj0gMHg5MSAmJiBi MiA8PSAweEZFKSkKKwkJCXJldHVybiAyOworCX0KKwlyZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBp bnQKQEAgLTE5MDEsNyArMTkzOCw3IEBAIGNvbnN0IHBnX3djaGFyX3RibCBwZ193Y2hhcl90YWJs ZVtdID0gewogCVtQR19HQktdID0gezAsIDAsIHBnX2dia19tYmxlbiwgcGdfZ2JrX2RzcGxlbiwg cGdfZ2JrX3ZlcmlmeWNoYXIsIHBnX2dia192ZXJpZnlzdHIsIDJ9LAogCVtQR19VSENdID0gezAs IDAsIHBnX3VoY19tYmxlbiwgcGdfdWhjX2RzcGxlbiwgcGdfdWhjX3ZlcmlmeWNoYXIsIHBnX3Vo Y192ZXJpZnlzdHIsIDJ9LAogCVtQR19HQjE4MDMwXSA9IHswLCAwLCBwZ19nYjE4MDMwX21ibGVu LCBwZ19nYjE4MDMwX2RzcGxlbiwgcGdfZ2IxODAzMF92ZXJpZnljaGFyLCBwZ19nYjE4MDMwX3Zl cmlmeXN0ciwgNH0sCi0JW1BHX0pPSEFCXSA9IHswLCAwLCBwZ19qb2hhYl9tYmxlbiwgcGdfam9o YWJfZHNwbGVuLCBwZ19qb2hhYl92ZXJpZnljaGFyLCBwZ19qb2hhYl92ZXJpZnlzdHIsIDN9LAor CVtQR19KT0hBQl0gPSB7MCwgMCwgcGdfam9oYWJfbWJsZW4sIHBnX2pvaGFiX2RzcGxlbiwgcGdf am9oYWJfdmVyaWZ5Y2hhciwgcGdfam9oYWJfdmVyaWZ5c3RyLCAyfSwKIAlbUEdfU0hJRlRfSklT XzIwMDRdID0gezAsIDAsIHBnX3NqaXNfbWJsZW4sIHBnX3NqaXNfZHNwbGVuLCBwZ19zamlzX3Zl cmlmeWNoYXIsIHBnX3NqaXNfdmVyaWZ5c3RyLCAyfSwKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9oYWIub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9qb2hhYi5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmQyZWFm ZGY3M2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2hh Yi5vdXQKQEAgLTAsMCArMSw4NyBAQAorLS0gVGhpcyB0ZXN0IGV4ZXJjaXNlcyB0aGUgSk9IQUIg Y2xpZW50IGVuY29kaW5nIChLUyBYIDEwMDE6MjAwNCBBbm5leCAzKS4KKy0tIEpPSEFCJ3MgdmFs aWQgYnl0ZSByYW5nZXMgZGlmZmVyIGZyb20gRVVDLUtSOiB0cmFpbCBieXRlcyBtYXkgZmFsbCB3 aXRoaW4KKy0tIHRoZSBBU0NJSSBncmFwaGljIHJhbmdlICgweDQxLTB4N0UgZm9yIEhhbmd1bCwg MHgzMS0weDdFIGZvciB0aGUgb3RoZXIKKy0tIGNhdGVnb3JpZXMpLCBpbmNsdWRpbmcgMHg1QyB3 aGljaCBpcyB0aGUgQVNDSUkgYmFja3NsYXNoLiAgVGhlIHRlc3QgcnVucworLS0gb25seSBpbiBV VEY4IGRhdGFiYXNlcywgc2luY2Ugc29tZSBkZWNvZGVkIGNoYXJhY3RlcnMgaGF2ZSBubyBlcXVp dmFsZW50CistLSBpbiBvdGhlciBzZXJ2ZXIgZW5jb2RpbmdzLgorU0VMRUNUIGdldGRhdGFiYXNl ZW5jb2RpbmcoKSA8PiAnVVRGOCcgQVMgc2tpcF90ZXN0IFxnc2V0CitcaWYgOnNraXBfdGVzdAor XHF1aXQKK1xlbmRpZgorLS0gQnVnICMxOTM1NCBvcmlnaW5hbCByZXBvcnQgcGx1cyBpdHMgbmVp Z2hib3JzOiB0aGVzZSB0aHJlZSBieXRlIHNlcXVlbmNlcworLS0gYXJlIHZhbGlkIEhhbmd1bCBz eWxsYWJsZXMgcGVyIEFubmV4IDMgVGFibGUgMSAobGVhZCAweDhBIGlzIGluIDB4ODQtMHhEMywK Ky0tIHRyYWlsIDB4NUIvMHg1Qy8weDVEIGlzIGluIDB4NDEtMHg3RSkgYnV0IHdlcmUgcmVqZWN0 ZWQgYnkgdGhlIHByaW9yCistLSBFVUMtS1ItZGVyaXZlZCBjaGVjayB0aGF0IGRlbWFuZGVkIHRy YWlsIGJ5dGVzIGluIDB4QTEtMHhGRS4KK1NFTEVDVCBjb252ZXJ0X2Zyb20oJ1x4OGE1Yic6OmJ5 dGVhLCAnam9oYWInKSBBUyAiMHg4YTViIiwKKyAgICAgICBjb252ZXJ0X2Zyb20oJ1x4OGE1Yyc6 OmJ5dGVhLCAnam9oYWInKSBBUyAiMHg4YTVjIiwKKyAgICAgICBjb252ZXJ0X2Zyb20oJ1x4OGE1 ZCc6OmJ5dGVhLCAnam9oYWInKSBBUyAiMHg4YTVkIjsKKyAweDhhNWIgfCAweDhhNWMgfCAweDhh NWQgCistLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLQorIOq1jSAgICAgfCDqtY4gICAgIHwg6rWP CisoMSByb3cpCisKKy0tIEZpcnN0IG11bHRpLWJ5dGUgY2hhcmFjdGVyIGluIHVuaWNvZGUub3Jn J3MgSk9IQUIuVFhULCBhbHNvIHJlamVjdGVkIGJ5CistLSB0aGUgcHJpb3IgY2hlY2sgKHRyYWls IDB4NDQgaW4gSGFuZ3VsIHJhbmdlIDB4NDEtMHg3RSkuCitTRUxFQ1QgY29udmVydF9mcm9tKCdc eDg0NDQnOjpieXRlYSwgJ2pvaGFiJykgQVMgIjB4ODQ0NCI7CisgMHg4NDQ0IAorLS0tLS0tLS0K KyDjhLMKKygxIHJvdykKKworLS0gUmVncmVzc2lvbiBjaGVjayBmb3IgYnl0ZSBzZXF1ZW5jZXMg dGhhdCBhbHJlYWR5IGRlY29kZWQgY29ycmVjdGx5IHVuZGVyCistLSB0aGUgb2xkIHJ1bGVzICh0 cmFpbCBieXRlIGFscmVhZHkgd2l0aGluIHRoZSBvbGQtYWxsb3dlZCAweEExLTB4RkUpLgorU0VM RUNUIGNvbnZlcnRfZnJvbSgnXHg4OWVmJzo6Ynl0ZWEsICdqb2hhYicpIEFTICIweDg5ZWYiLAor ICAgICAgIGNvbnZlcnRfZnJvbSgnXHg4OWExJzo6Ynl0ZWEsICdqb2hhYicpIEFTICIweDg5YTEi OworIDB4ODllZiB8IDB4ODlhMSAKKy0tLS0tLS0tKy0tLS0tLS0tCisg6rSmICAgICB8IOqzoAor KDEgcm93KQorCistLSBIYW5qYSByYW5nZSAobGVhZCAweEUwLTB4RjkpIHdpdGggdHJhaWwgYnl0 ZXMgaW4gdGhlIG9sZC1yZWplY3RlZCByZWdpb24KKy0tIDB4MzEtMHhBMC4gIFBlciBBbm5leCAz IFRhYmxlIDEgdGhlIEhhbmphIHRyYWlsIHJhbmdlIGlzIDB4MzEtMHg3RSBhbmQKKy0tIDB4OTEt MHhGRS4KK1NFTEVDVCBjb252ZXJ0X2Zyb20oJ1x4ZTAzMSc6OmJ5dGVhLCAnam9oYWInKSBBUyAi MHhlMDMxIiwKKyAgICAgICBjb252ZXJ0X2Zyb20oJ1x4ZTA3ZSc6OmJ5dGVhLCAnam9oYWInKSBB UyAiMHhlMDdlIiwKKyAgICAgICBjb252ZXJ0X2Zyb20oJ1x4ZTA5MSc6OmJ5dGVhLCAnam9oYWIn KSBBUyAiMHhlMDkxIjsKKyAweGUwMzEgfCAweGUwN2UgfCAweGUwOTEgCistLS0tLS0tLSstLS0t LS0tLSstLS0tLS0tLQorIOS8vSAgICAgfCDltYwgICAgIHwg5oSfCisoMSByb3cpCisKKy0tICJP dGhlciBjaGFyYWN0ZXJzIiBjYXRlZ29yeSAobGVhZCAweEQ5LTB4REUpIHdpdGggYSBsb3cgdHJh aWwgYnl0ZS4KK1NFTEVDVCBjb252ZXJ0X2Zyb20oJ1x4ZDkzMSc6OmJ5dGVhLCAnam9oYWInKSBB UyAiMHhkOTMxIjsKKyAweGQ5MzEgCistLS0tLS0tLQorIOOAgAorKDEgcm93KQorCistLSBJbnZh bGlkIGxlYWQgYnl0ZXM6IHRoZSBnYXBzIGJldHdlZW4gdGhlIGZvdXIgbGVhZC1ieXRlIHJhbmdl cyBkZWZpbmVkIGJ5CistLSBBbm5leCAzIFRhYmxlIDEuCitTRUxFQ1QgY29udmVydF9mcm9tKCdc eDgwNDEnOjpieXRlYSwgJ2pvaGFiJyk7CitFUlJPUjogIGludmFsaWQgYnl0ZSBzZXF1ZW5jZSBm b3IgZW5jb2RpbmcgIkpPSEFCIjogMHg4MAorU0VMRUNUIGNvbnZlcnRfZnJvbSgnXHhkNTQxJzo6 Ynl0ZWEsICdqb2hhYicpOworRVJST1I6ICBpbnZhbGlkIGJ5dGUgc2VxdWVuY2UgZm9yIGVuY29k aW5nICJKT0hBQiI6IDB4ZDUKK1NFTEVDVCBjb252ZXJ0X2Zyb20oJ1x4ZGY0MSc6OmJ5dGVhLCAn am9oYWInKTsKK0VSUk9SOiAgaW52YWxpZCBieXRlIHNlcXVlbmNlIGZvciBlbmNvZGluZyAiSk9I QUIiOiAweGRmCitTRUxFQ1QgY29udmVydF9mcm9tKCdceGZhNDEnOjpieXRlYSwgJ2pvaGFiJyk7 CitFUlJPUjogIGludmFsaWQgYnl0ZSBzZXF1ZW5jZSBmb3IgZW5jb2RpbmcgIkpPSEFCIjogMHhm YQorLS0gSW52YWxpZCB0cmFpbCBieXRlczogdmFsdWVzIGluc2lkZSB0aGUgZ2FwcyB3aXRoaW4g ZWFjaCB0cmFpbC1ieXRlIHJhbmdlLgorLS0gRm9yIEhhbmd1bCB0aGUgZ2FwcyBhcmUgMHgwMC0w eDQwLCAweDdGLTB4ODAsIGFuZCAweEZGLgorU0VMRUNUIGNvbnZlcnRfZnJvbSgnXHg4YTQwJzo6 Ynl0ZWEsICdqb2hhYicpOworRVJST1I6ICBpbnZhbGlkIGJ5dGUgc2VxdWVuY2UgZm9yIGVuY29k aW5nICJKT0hBQiI6IDB4OGEgMHg0MAorU0VMRUNUIGNvbnZlcnRfZnJvbSgnXHg4YTdmJzo6Ynl0 ZWEsICdqb2hhYicpOworRVJST1I6ICBpbnZhbGlkIGJ5dGUgc2VxdWVuY2UgZm9yIGVuY29kaW5n ICJKT0hBQiI6IDB4OGEgMHg3ZgorU0VMRUNUIGNvbnZlcnRfZnJvbSgnXHg4YTgwJzo6Ynl0ZWEs ICdqb2hhYicpOworRVJST1I6ICBpbnZhbGlkIGJ5dGUgc2VxdWVuY2UgZm9yIGVuY29kaW5nICJK T0hBQiI6IDB4OGEgMHg4MAorLS0gRm9yIHRoZSBvdGhlciBjYXRlZ29yaWVzIHRoZSBnYXBzIGFy ZSAweDAwLTB4MzAsIDB4N0YtMHg5MCwgYW5kIDB4RkYuCitTRUxFQ1QgY29udmVydF9mcm9tKCdc eGUwMzAnOjpieXRlYSwgJ2pvaGFiJyk7CitFUlJPUjogIGludmFsaWQgYnl0ZSBzZXF1ZW5jZSBm b3IgZW5jb2RpbmcgIkpPSEFCIjogMHhlMCAweDMwCitTRUxFQ1QgY29udmVydF9mcm9tKCdceGUw N2YnOjpieXRlYSwgJ2pvaGFiJyk7CitFUlJPUjogIGludmFsaWQgYnl0ZSBzZXF1ZW5jZSBmb3Ig ZW5jb2RpbmcgIkpPSEFCIjogMHhlMCAweDdmCitTRUxFQ1QgY29udmVydF9mcm9tKCdceGUwOTAn OjpieXRlYSwgJ2pvaGFiJyk7CitFUlJPUjogIGludmFsaWQgYnl0ZSBzZXF1ZW5jZSBmb3IgZW5j b2RpbmcgIkpPSEFCIjogMHhlMCAweDkwCitTRUxFQ1QgY29udmVydF9mcm9tKCdceGUwZmYnOjpi eXRlYSwgJ2pvaGFiJyk7CitFUlJPUjogIGludmFsaWQgYnl0ZSBzZXF1ZW5jZSBmb3IgZW5jb2Rp bmcgIkpPSEFCIjogMHhlMCAweGZmCistLSBJbmNvbXBsZXRlIHNlcXVlbmNlOiBhIHZhbGlkIGxl YWQgYnl0ZSB3aXRoIG5vIHRyYWlsIGJ5dGUgaXMgcmVqZWN0ZWQuCitTRUxFQ1QgY29udmVydF9m cm9tKCdceDhhJzo6Ynl0ZWEsICdqb2hhYicpOworRVJST1I6ICBpbnZhbGlkIGJ5dGUgc2VxdWVu Y2UgZm9yIGVuY29kaW5nICJKT0hBQiI6IDB4OGEKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jl c3MvZXhwZWN0ZWQvam9oYWJfMS5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaGFi XzEub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi44OTAyOGFkODFl MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9oYWJfMS5v dXQKQEAgLTAsMCArMSw5IEBACistLSBUaGlzIHRlc3QgZXhlcmNpc2VzIHRoZSBKT0hBQiBjbGll bnQgZW5jb2RpbmcgKEtTIFggMTAwMToyMDA0IEFubmV4IDMpLgorLS0gSk9IQUIncyB2YWxpZCBi eXRlIHJhbmdlcyBkaWZmZXIgZnJvbSBFVUMtS1I6IHRyYWlsIGJ5dGVzIG1heSBmYWxsIHdpdGhp bgorLS0gdGhlIEFTQ0lJIGdyYXBoaWMgcmFuZ2UgKDB4NDEtMHg3RSBmb3IgSGFuZ3VsLCAweDMx LTB4N0UgZm9yIHRoZSBvdGhlcgorLS0gY2F0ZWdvcmllcyksIGluY2x1ZGluZyAweDVDIHdoaWNo IGlzIHRoZSBBU0NJSSBiYWNrc2xhc2guICBUaGUgdGVzdCBydW5zCistLSBvbmx5IGluIFVURjgg ZGF0YWJhc2VzLCBzaW5jZSBzb21lIGRlY29kZWQgY2hhcmFjdGVycyBoYXZlIG5vIGVxdWl2YWxl bnQKKy0tIGluIG90aGVyIHNlcnZlciBlbmNvZGluZ3MuCitTRUxFQ1QgZ2V0ZGF0YWJhc2VlbmNv ZGluZygpIDw+ICdVVEY4JyBBUyBza2lwX3Rlc3QgXGdzZXQKK1xpZiA6c2tpcF90ZXN0CitccXVp dApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZSBiL3NyYy90 ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUKaW5kZXggY2MzNjUzOTNiYjcuLjYzZjc0MTlk MjU1IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlCisrKyBi L3NyYy90ZXN0L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUKQEAgLTI4LDcgKzI4LDcgQEAgdGVz dDogc3RyaW5ncyBtZDUgbnVtZXJvbG9neSBwb2ludCBsc2VnIGxpbmUgYm94IHBhdGggcG9seWdv biBjaXJjbGUgZGF0ZSB0aW1lIHQKICMgZ2VvbWV0cnkgZGVwZW5kcyBvbiBwb2ludCwgbHNlZywg bGluZSwgYm94LCBwYXRoLCBwb2x5Z29uLCBjaXJjbGUKICMgaG9yb2xvZ3kgZGVwZW5kcyBvbiBk YXRlLCB0aW1lLCB0aW1ldHosIHRpbWVzdGFtcCwgdGltZXN0YW1wdHosIGludGVydmFsCiAjIC0t LS0tLS0tLS0KLXRlc3Q6IGdlb21ldHJ5IGhvcm9sb2d5IHRzdHlwZXMgcmVnZXggdHlwZV9zYW5p dHkgb3ByX3Nhbml0eSBtaXNjX3Nhbml0eSBjb21tZW50cyBleHByZXNzaW9ucyB1bmljb2RlIHhp ZCBtdmNjIGRhdGFiYXNlIHN0YXRzX2ltcG9ydCBwZ19uZGlzdGluY3QgcGdfZGVwZW5kZW5jaWVz IG9pZDggZW5jb2RpbmcgZXVjX2tyCit0ZXN0OiBnZW9tZXRyeSBob3JvbG9neSB0c3R5cGVzIHJl Z2V4IHR5cGVfc2FuaXR5IG9wcl9zYW5pdHkgbWlzY19zYW5pdHkgY29tbWVudHMgZXhwcmVzc2lv bnMgdW5pY29kZSB4aWQgbXZjYyBkYXRhYmFzZSBzdGF0c19pbXBvcnQgcGdfbmRpc3RpbmN0IHBn X2RlcGVuZGVuY2llcyBvaWQ4IGVuY29kaW5nIGV1Y19rciBqb2hhYgogCiAjIC0tLS0tLS0tLS0K ICMgTG9hZCBodWdlIGFtb3VudHMgb2YgZGF0YQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVz cy9zcWwvam9oYWIuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9oYWIuc3FsCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi43YTkxOWY0MzBhNwotLS0gL2Rldi9udWxs CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaGFiLnNxbApAQCAtMCwwICsxLDU4IEBACist LSBUaGlzIHRlc3QgZXhlcmNpc2VzIHRoZSBKT0hBQiBjbGllbnQgZW5jb2RpbmcgKEtTIFggMTAw MToyMDA0IEFubmV4IDMpLgorLS0gSk9IQUIncyB2YWxpZCBieXRlIHJhbmdlcyBkaWZmZXIgZnJv bSBFVUMtS1I6IHRyYWlsIGJ5dGVzIG1heSBmYWxsIHdpdGhpbgorLS0gdGhlIEFTQ0lJIGdyYXBo aWMgcmFuZ2UgKDB4NDEtMHg3RSBmb3IgSGFuZ3VsLCAweDMxLTB4N0UgZm9yIHRoZSBvdGhlcgor LS0gY2F0ZWdvcmllcyksIGluY2x1ZGluZyAweDVDIHdoaWNoIGlzIHRoZSBBU0NJSSBiYWNrc2xh c2guICBUaGUgdGVzdCBydW5zCistLSBvbmx5IGluIFVURjggZGF0YWJhc2VzLCBzaW5jZSBzb21l IGRlY29kZWQgY2hhcmFjdGVycyBoYXZlIG5vIGVxdWl2YWxlbnQKKy0tIGluIG90aGVyIHNlcnZl ciBlbmNvZGluZ3MuCitTRUxFQ1QgZ2V0ZGF0YWJhc2VlbmNvZGluZygpIDw+ICdVVEY4JyBBUyBz a2lwX3Rlc3QgXGdzZXQKK1xpZiA6c2tpcF90ZXN0CitccXVpdAorXGVuZGlmCisKKy0tIEJ1ZyAj MTkzNTQgb3JpZ2luYWwgcmVwb3J0IHBsdXMgaXRzIG5laWdoYm9yczogdGhlc2UgdGhyZWUgYnl0 ZSBzZXF1ZW5jZXMKKy0tIGFyZSB2YWxpZCBIYW5ndWwgc3lsbGFibGVzIHBlciBBbm5leCAzIFRh YmxlIDEgKGxlYWQgMHg4QSBpcyBpbiAweDg0LTB4RDMsCistLSB0cmFpbCAweDVCLzB4NUMvMHg1 RCBpcyBpbiAweDQxLTB4N0UpIGJ1dCB3ZXJlIHJlamVjdGVkIGJ5IHRoZSBwcmlvcgorLS0gRVVD LUtSLWRlcml2ZWQgY2hlY2sgdGhhdCBkZW1hbmRlZCB0cmFpbCBieXRlcyBpbiAweEExLTB4RkUu CitTRUxFQ1QgY29udmVydF9mcm9tKCdceDhhNWInOjpieXRlYSwgJ2pvaGFiJykgQVMgIjB4OGE1 YiIsCisgICAgICAgY29udmVydF9mcm9tKCdceDhhNWMnOjpieXRlYSwgJ2pvaGFiJykgQVMgIjB4 OGE1YyIsCisgICAgICAgY29udmVydF9mcm9tKCdceDhhNWQnOjpieXRlYSwgJ2pvaGFiJykgQVMg IjB4OGE1ZCI7CisKKy0tIEZpcnN0IG11bHRpLWJ5dGUgY2hhcmFjdGVyIGluIHVuaWNvZGUub3Jn J3MgSk9IQUIuVFhULCBhbHNvIHJlamVjdGVkIGJ5CistLSB0aGUgcHJpb3IgY2hlY2sgKHRyYWls IDB4NDQgaW4gSGFuZ3VsIHJhbmdlIDB4NDEtMHg3RSkuCitTRUxFQ1QgY29udmVydF9mcm9tKCdc eDg0NDQnOjpieXRlYSwgJ2pvaGFiJykgQVMgIjB4ODQ0NCI7CisKKy0tIFJlZ3Jlc3Npb24gY2hl Y2sgZm9yIGJ5dGUgc2VxdWVuY2VzIHRoYXQgYWxyZWFkeSBkZWNvZGVkIGNvcnJlY3RseSB1bmRl cgorLS0gdGhlIG9sZCBydWxlcyAodHJhaWwgYnl0ZSBhbHJlYWR5IHdpdGhpbiB0aGUgb2xkLWFs bG93ZWQgMHhBMS0weEZFKS4KK1NFTEVDVCBjb252ZXJ0X2Zyb20oJ1x4ODllZic6OmJ5dGVhLCAn am9oYWInKSBBUyAiMHg4OWVmIiwKKyAgICAgICBjb252ZXJ0X2Zyb20oJ1x4ODlhMSc6OmJ5dGVh LCAnam9oYWInKSBBUyAiMHg4OWExIjsKKworLS0gSGFuamEgcmFuZ2UgKGxlYWQgMHhFMC0weEY5 KSB3aXRoIHRyYWlsIGJ5dGVzIGluIHRoZSBvbGQtcmVqZWN0ZWQgcmVnaW9uCistLSAweDMxLTB4 QTAuICBQZXIgQW5uZXggMyBUYWJsZSAxIHRoZSBIYW5qYSB0cmFpbCByYW5nZSBpcyAweDMxLTB4 N0UgYW5kCistLSAweDkxLTB4RkUuCitTRUxFQ1QgY29udmVydF9mcm9tKCdceGUwMzEnOjpieXRl YSwgJ2pvaGFiJykgQVMgIjB4ZTAzMSIsCisgICAgICAgY29udmVydF9mcm9tKCdceGUwN2UnOjpi eXRlYSwgJ2pvaGFiJykgQVMgIjB4ZTA3ZSIsCisgICAgICAgY29udmVydF9mcm9tKCdceGUwOTEn OjpieXRlYSwgJ2pvaGFiJykgQVMgIjB4ZTA5MSI7CisKKy0tICJPdGhlciBjaGFyYWN0ZXJzIiBj YXRlZ29yeSAobGVhZCAweEQ5LTB4REUpIHdpdGggYSBsb3cgdHJhaWwgYnl0ZS4KK1NFTEVDVCBj b252ZXJ0X2Zyb20oJ1x4ZDkzMSc6OmJ5dGVhLCAnam9oYWInKSBBUyAiMHhkOTMxIjsKKworLS0g SW52YWxpZCBsZWFkIGJ5dGVzOiB0aGUgZ2FwcyBiZXR3ZWVuIHRoZSBmb3VyIGxlYWQtYnl0ZSBy YW5nZXMgZGVmaW5lZCBieQorLS0gQW5uZXggMyBUYWJsZSAxLgorU0VMRUNUIGNvbnZlcnRfZnJv bSgnXHg4MDQxJzo6Ynl0ZWEsICdqb2hhYicpOworU0VMRUNUIGNvbnZlcnRfZnJvbSgnXHhkNTQx Jzo6Ynl0ZWEsICdqb2hhYicpOworU0VMRUNUIGNvbnZlcnRfZnJvbSgnXHhkZjQxJzo6Ynl0ZWEs ICdqb2hhYicpOworU0VMRUNUIGNvbnZlcnRfZnJvbSgnXHhmYTQxJzo6Ynl0ZWEsICdqb2hhYicp OworCistLSBJbnZhbGlkIHRyYWlsIGJ5dGVzOiB2YWx1ZXMgaW5zaWRlIHRoZSBnYXBzIHdpdGhp biBlYWNoIHRyYWlsLWJ5dGUgcmFuZ2UuCistLSBGb3IgSGFuZ3VsIHRoZSBnYXBzIGFyZSAweDAw LTB4NDAsIDB4N0YtMHg4MCwgYW5kIDB4RkYuCitTRUxFQ1QgY29udmVydF9mcm9tKCdceDhhNDAn OjpieXRlYSwgJ2pvaGFiJyk7CitTRUxFQ1QgY29udmVydF9mcm9tKCdceDhhN2YnOjpieXRlYSwg J2pvaGFiJyk7CitTRUxFQ1QgY29udmVydF9mcm9tKCdceDhhODAnOjpieXRlYSwgJ2pvaGFiJyk7 CistLSBGb3IgdGhlIG90aGVyIGNhdGVnb3JpZXMgdGhlIGdhcHMgYXJlIDB4MDAtMHgzMCwgMHg3 Ri0weDkwLCBhbmQgMHhGRi4KK1NFTEVDVCBjb252ZXJ0X2Zyb20oJ1x4ZTAzMCc6OmJ5dGVhLCAn am9oYWInKTsKK1NFTEVDVCBjb252ZXJ0X2Zyb20oJ1x4ZTA3Zic6OmJ5dGVhLCAnam9oYWInKTsK K1NFTEVDVCBjb252ZXJ0X2Zyb20oJ1x4ZTA5MCc6OmJ5dGVhLCAnam9oYWInKTsKK1NFTEVDVCBj b252ZXJ0X2Zyb20oJ1x4ZTBmZic6OmJ5dGVhLCAnam9oYWInKTsKKworLS0gSW5jb21wbGV0ZSBz ZXF1ZW5jZTogYSB2YWxpZCBsZWFkIGJ5dGUgd2l0aCBubyB0cmFpbCBieXRlIGlzIHJlamVjdGVk LgorU0VMRUNUIGNvbnZlcnRfZnJvbSgnXHg4YSc6OmJ5dGVhLCAnam9oYWInKTsKLS0gCjIuNTAu MSAoQXBwbGUgR2l0LTE1NSkKCg== --000000000000d3d6e8064f7584ef--