Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ozuSp-0007Ls-Vp for pgsql-hackers@arkaria.postgresql.org; Tue, 29 Nov 2022 06:51:32 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1ozuSn-0001vg-4j for pgsql-hackers@arkaria.postgresql.org; Tue, 29 Nov 2022 06:51:29 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ozuSm-0001vX-LN for pgsql-hackers@lists.postgresql.org; Tue, 29 Nov 2022 06:51:28 +0000 Received: from mail-pg1-x52e.google.com ([2607:f8b0:4864:20::52e]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1ozuSk-00062S-3Y for pgsql-hackers@postgresql.org; Tue, 29 Nov 2022 06:51:28 +0000 Received: by mail-pg1-x52e.google.com with SMTP id q71so12141547pgq.8 for ; Mon, 28 Nov 2022 22:51:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=j-davis-com.20210112.gappssmtp.com; s=20210112; h=mime-version:user-agent:references:in-reply-to:date:cc:to:from :subject:message-id:from:to:cc:subject:date:message-id:reply-to; bh=EC5rb5ZuxX6d8Zp0dovEWK4URqMUJxKkj8eiRba1Res=; b=OHwCOx1d/rvgpFLVjmveiv009MuntGbDk4gh3Zss/f/kaALGnfBn7DVW0C6HbzVXxz sQ+9vLiTh/fW+EdaRW6KaD6WnA2skujCEGLHOKQrR4Z3gGglZnZ3kp/Yzn92hdtqiE/B dNznU3ppmn5O/HM2owggvDDdtmg1Y4LZa+o9gGm8tl8Hjv7orfhSFwk+W4Ap5K81IU8C 1sc3KolPa2hYnz/PeL/W2E81YAYu19hKcJ/HctumtyStDOg7FCirF9U+ZCR8HlvZMNW/ dQlLi/tgFma2AAo5i7c5hcwEJhGE0ichtQVFw++6OimASy2yA6c0YbeubCq51TiFlOn0 BByQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:references:in-reply-to:date:cc:to:from :subject:message-id:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=EC5rb5ZuxX6d8Zp0dovEWK4URqMUJxKkj8eiRba1Res=; b=AA3D6kIwDSCNs087A1inrM5+B2yYmwKzebGTOYqbtY7vnH7Vf1Is/xkPoCaKJCibMO 1nnvdQ+a4WDVpqQvOhOwde+oXX2nPSFueTYN2xXRgLI8wi/jHlNBxyBt42recH3UfSV3 S+ppg8gg16wcRvPD3qgB/vC+6hKBS8zUhw3Typqqwrtoe3NrKmlS142gQzs3gPHTU1ig XHLYWByDfSWkgzt9dTiB3KASqW0uTn7Zxp25t1BoQVztbevSEX2xouP3iV0BRMjWvLtU tkrMhcGaY3ahsGjJ4Unoe8OM5hgCe14R2JV69wngKuCvnQyEu0VnoukrXEEKd3ziuSc+ GNhw== X-Gm-Message-State: ANoB5pkeS/xVSHar9LQ6yXzd1YWB0yzcNVI5TCbeUcg6kdSejX6rCmaD +VyuQ6X0vp2L2my6Jxvo5kIHDQ== X-Google-Smtp-Source: AA0mqf42mN6KTo5vr4PHeZMnb5nAiEvV+/wJOzIkgk16n/r4joB53NSzblFuUHtAV97MIbPEg5vw+g== X-Received: by 2002:aa7:8c19:0:b0:573:620a:3b1c with SMTP id c25-20020aa78c19000000b00573620a3b1cmr36679843pfd.50.1669704683836; Mon, 28 Nov 2022 22:51:23 -0800 (PST) Received: from jeff-laptop.lan (c-73-231-146-4.hsd1.ca.comcast.net. [73.231.146.4]) by smtp.gmail.com with ESMTPSA id u14-20020a170902e5ce00b00189743ed3b6sm6207508plf.64.2022.11.28.22.51.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Nov 2022 22:51:22 -0800 (PST) Message-ID: Subject: Re: Collation version tracking for macOS From: Jeff Davis To: Thomas Munro Cc: Peter Eisentraut , Jeremy Schneider , Peter Geoghegan , "Nasby, Jim" , Tom Lane , pgsql-hackers Date: Mon, 28 Nov 2022 22:51:20 -0800 In-Reply-To: References: <398aabd1-ad95-ba2d-d70a-dd5d90bf6e07@enterprisedb.com> <606bd2baa6d65b38fee6eb23bba40c5da210255b.camel@j-davis.com> <9f8e9b5a3352478d4cf7d6c0a5dd7e82496be4b6.camel@j-davis.com> <346f836208a39009c1998ed5a41c7f1a0be36911.camel@j-davis.com> Content-Type: multipart/mixed; boundary="=-aHG/P1uM9aGkEelS11k4" User-Agent: Evolution 3.44.4-0ubuntu1 MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-aHG/P1uM9aGkEelS11k4 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, 2022-11-26 at 18:27 +1300, Thomas Munro wrote: > On Thu, Nov 24, 2022 at 5:48 PM Thomas Munro > wrote: > > On Thu, Nov 24, 2022 at 3:07 PM Jeff Davis > > wrote: > > > I'd vote for 1 on the grounds that it's easier to document and > > > understand a single collation version, which comes straight from > > > ucol_getVersion(). This approach makes it a separate problem to > > > find > > > the collation version among whatever libraries the admin can > > > provide; > > > but adding some observability into the search should mitigate any > > > confusion. > >=20 > > OK, it sounds like I should code that up next. >=20 > Here's the first iteration. Thank you. Proposed changes: * I attached a first pass of some documentation. * Should be another GUC to turn WARNING into an ERROR. Useful at least for testing; perhaps too dangerous for production. * The libraries should be loaded in a more diliberate order. The "*" should be expanded in a descending fashion so that later versions are preferred. * GUCs should be validated. * Should validate that loaded library has expected version. * We need to revise or remove pg_collation_actual_version() and pg_database_collation_actual_version(). * The GUCs are PGC_SUSET, but don't take effect because icu_library_list_fully_loaded is never reset. * The extra collations you're adding at bootstrap time are named based on the library major version. I suppose it might be more "proper" to name them based on the collation version, but that would be more verbose, so I won't advocate for that. Just pointing it out. * It looks hard (or impossible) to mix multiple ICU libraries with the same major version and different minor versions. That's because, e.g.,=C2=A0libicui18n.so.63.1 links against libicuuc.63 and libicudata.63, and when you install ICU 63.2, those dependencies get clobbered with the 63.2 versions. That fails the sanity check I proposed above about the library version number matching the requested library version number. And it also just seems wrong -- why would you have minor- version precision about an ICU library but then only major-version precision about the ICU dependencies of that library? Doesn't that defeat the whole purpose of this naming scheme? (Maybe another ICU bug?). Minor comments: * ICU_I18N is defined in make_icu_library_name() but used outside of it. One solution might be to have it return both library names to the caller and rename it as make_icu_library_names(). * get_icu_function() could use a clarifying comment or a better name. Something that communicates that you are looking for the function in the given library with the given major version number (which may or may not be needed depending on how the library was compiled). * typo in comment over make_icu_collator: s/u_getVersion/ucol_getVersion/ * The return value of make_icu_collator() seems backwards to me, stylistically. I typically see the false-is-good pattern with integer returns. * weird bracketing style in get_icu_collator for the "else" > =C2=A0 The version rosetta stone functions look like this: >=20 > postgres=3D# select * from pg_icu_library_versions(); > =C2=A0icu_version | unicode_version | cldr_version > -------------+-----------------+-------------- > =C2=A067.1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 13.0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 37.0 > =C2=A063.1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 11.0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 34.0 > =C2=A057.1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 8.0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 29.0 > (3 rows) >=20 > postgres=3D# select * from pg_icu_collation_versions('zh'); > =C2=A0icu_version | uca_version | collator_version > -------------+-------------+------------------ > =C2=A067.1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 13.0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 153.14.37 > =C2=A063.1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 11.0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 153.88.34 > =C2=A057.1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 8.0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 153.64.29 > (3 rows) I like these functions. --=20 Jeff Davis PostgreSQL Contributor Team - AWS --=-aHG/P1uM9aGkEelS11k4 Content-Disposition: attachment; filename="doc.patch" Content-Type: text/x-patch; name="doc.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9jaGFyc2V0LnNnbWwgYi9kb2Mvc3JjL3NnbWwvY2hh cnNldC5zZ21sCmluZGV4IDQ0NWZkMTc1ZDguLmI5ZGJhOGFjNjcgMTAwNjQ0Ci0tLSBhL2RvYy9z cmMvc2dtbC9jaGFyc2V0LnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2NoYXJzZXQuc2dtbApAQCAt MTA0Nyw2ICsxMDQ3LDUwIEBAIENSRUFURSBDT0xMQVRJT04gaWdub3JlX2FjY2VudHMgKHByb3Zp ZGVyID0gaWN1LCBsb2NhbGUgPSAndW5kLXUta3MtbGV2ZWwxLWtjLXRyCiAgICAgPC90aXA+CiAg ICA8L3NlY3QzPgogICA8L3NlY3QyPgorICA8c2VjdDIgaWQ9ImNvbGxhdGlvbi12ZXJzaW9ucyI+ CisgICA8dGl0bGU+Q29sbGF0aW9uIFZlcnNpb25zPC90aXRsZT4KKworICAgPHBhcmE+CisgICAg Q29sbGF0aW9ucyBhcmUgc2Vuc2l0aXZlIHRvIHRoZSBzcGVjaWZpYyBjb2xsYXRpb24gdmVyc2lv biwgd2hpY2ggaXMKKyAgICBvYnRhaW5lZCBmcm9tIHRoZSBjb2xsYXRpb24gcHJvdmlkZXIgbGli cmFyeSBhdCB0aGUgdGltZSB0aGUgY29sbGF0aW9uIGlzCisgICAgY3JlYXRlZCAoYW5kIG9ubHkg dXBkYXRlZCB3aXRoIDx4cmVmIGxpbmtlbmQ9InNxbC1hbHRlcmNvbGxhdGlvbiIvPikuIElmCisg ICAgdGhlIGNvbGxhdGlvbiBwcm92aWRlciBsaWJyYXJ5IGlzIHVwZGF0ZWQgb24gdGhlIHN5c3Rl bSAoZS5nLiBkdWUgdG8gYW4KKyAgICBvcGVyYXRpbmcgc3lzdGVtIHVwZ3JhZGUpLCBpdCBtYXkg cHJvdmlkZSBhIGRpZmZlcmVudCBjb2xsYXRpb24gdmVyc2lvbjsKKyAgICBidXQgdGhlIHZlcnNp b24gcmVjb3JkZWQgaW4gPHByb2R1Y3RuYW1lPlBvc3RncmVTUUw8L3Byb2R1Y3RuYW1lPiB3aWxs CisgICAgcmVtYWluIHVuY2hhbmdlZC4KKyAgIDwvcGFyYT4KKyAgIDxwYXJhPgorICAgIE5ldyBj b2xsYXRpb24gdmVyc2lvbnMgYXJlIGdlbmVyYWxseSBkZXNpcmFibGUsIGFzIHRoZXkgcmVmbGVj dCBjaGFuZ2VzIGluCisgICAgbmF0dXJhbCBsYW5ndWFnZSBvdmVyIHRpbWUuIEJ1dCB0aGVzZSBv cmRlcmluZyBjaGFuZ2VzIGNhbiBhbHNvIGNhdXNlCisgICAgcHJvYmxlbXMsIHN1Y2ggYXMgdGhl IGluY29uc2lzdGVuY3kgb2YgYW4gaW5kZXhlcywgd2hpY2ggb2Z0ZW4gZGVwZW5kIG9uIGEKKyAg ICBzdGFibGUgb3JkZXJpbmcuIElmIDxwcm9kdWN0bmFtZT5Qb3N0Z3JlU1FMPC9wcm9kdWN0bmFt ZT4gaXMgdW5hYmxlIHRvCisgICAgZmluZCBhIGNvbGxhdGlvbiBpbiB0aGUgY29sbGF0aW9uIHBy b3ZpZGVyIHRoYXQgbWF0Y2hlcyB0aGUgcmVjb3JkZWQKKyAgICB2ZXJzaW9uIGV4YWN0bHksIGl0 IHdpbGwgZW1pdCBhIDxsaXRlcmFsPldBUk5JTkc8L2xpdGVyYWw+IChjb25maWd1cmFibGUKKyAg ICB3aXRoIDx4cmVmIGxpbmtlbmQ9Imd1Yy1jb2xsYXRpb24tdmVyc2lvbi1taXNtYXRjaC1lcnJv ciIvPikuCisgICA8L3BhcmE+CisgICA8c2VjdDMgaWQ9Im11bHRpcGxlLWljdS1saWJyYXJpZXMi PgorICAgIDx0aXRsZT5NdWx0aXBsZSBJQ1UgY29sbGF0aW9uIHByb3ZpZGVyIGxpYnJhcmllczwv dGl0bGU+CisgICAgPHBhcmE+CisgICAgIFdoZW4gdXNpbmcgdGhlIDxsaXRlcmFsPmljdTwvbGl0 ZXJhbD4gY29sbGF0aW9uIHByb3ZpZGVyLAorICAgICA8cHJvZHVjdG5hbWU+UG9zdGdyZVNRTDwv cHJvZHVjdG5hbWU+IGNhbiBsb2FkIG11bHRpcGxlIElDVSBjb2xsYXRpb24KKyAgICAgcHJvdmlk ZXIgbGlicmFyaWVzLCBtYWtpbmcgaXQgcG9zc2libGUgdG8gZmluZCBhbiBleGFjdCBtYXRjaCBm b3IgdGhlCisgICAgIGNvbGxhdGlvbiB2ZXJzaW9uIGV2ZW4gaWYgdGhlIG9wZXJhdGluZyBzeXN0 ZW0ncyBJQ1UgbGlicmFyeSBoYXMgYmVlbgorICAgICB1cGdyYWRlZCBhbmQgcHJvdmlkZXMgYSBu ZXcgY29sbGF0aW9uIHZlcnNpb24uCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICBUbyB1 c2UgYWRkaXRpb25hbCBJQ1UgY29sbGF0aW9uIHByb3ZpZGVyIGxpYnJhcmllcywgc2V0IDx4cmVm CisgICAgIGxpbmtlbmQ9Imd1Yy1pY3UtbGlicmFyeS1wYXRoIi8+IHRvIHRoZSBkaXJlY3Rvcnkg d2hlcmUgdGhlIElDVSBsaWJyYXJpZXMKKyAgICAgYXJlIGluc3RhbGxlZCwgYW5kIHVzZSA8eHJl ZiBsaW5rZW5kPSJndWMtaWN1LWxpYnJhcnktdmVyc2lvbnMiLz4gdG8KKyAgICAgY29udHJvbCBo b3cgdGhvc2UgbGlicmFyaWVzIGFyZSBzZWFyY2hlZC4KKyAgICA8L3BhcmE+CisgICAgPG5vdGU+ CisgICAgIDxwYXJhPgorICAgICAgVGhlIDxsaXRlcmFsPmxpYmM8L2xpdGVyYWw+IGNvbGxhdGlv biBwcm92aWRlciBkb2VzIG5vdCBhbGxvdyBzcGVjaWZ5aW5nCisgICAgICBtdWx0aXBsZSBsaWJy YXJpZXMuCisgICAgIDwvcGFyYT4KKyAgICA8L25vdGU+CisgICA8L3NlY3QzPgorICA8L3NlY3Qy PgogIDwvc2VjdDE+CiAKICA8c2VjdDEgaWQ9Im11bHRpYnl0ZSI+CmRpZmYgLS1naXQgYS9kb2Mv c3JjL3NnbWwvY29uZmlnLnNnbWwgYi9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwKaW5kZXggOWZk MjA3NWIxZS4uMzgwOWMyNmIzMSAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2NvbmZpZy5zZ21s CisrKyBiL2RvYy9zcmMvc2dtbC9jb25maWcuc2dtbApAQCAtMTAyODgsNiArMTAyODgsMTA3IEBA IGR5bmFtaWNfbGlicmFyeV9wYXRoID0gJ0M6XHRvb2xzXHBvc3RncmVzcWw7SDpcbXlfcHJvamVj dFxsaWI7JGxpYmRpcicKICAgICAgPC92YXJpYWJsZWxpc3Q+CiAgICAgPC9zZWN0Mj4KIAorICAg IDxzZWN0MiBpZD0icnVudGltZS1jb25maWctY29tcGF0aWJsZS1jb2xsYXRpb24iPgorICAgICA8 dGl0bGU+Q29sbGF0aW9uIFZlcnNpb24gQ29tcGF0aWJpbGl0eTwvdGl0bGU+CisgICAgIDx2YXJp YWJsZWxpc3Q+CisgICAgIDx2YXJsaXN0ZW50cnkgaWQ9Imd1Yy1jb2xsYXRpb24tdmVyc2lvbi1t aXNtYXRjaC1lcnJvciI+CisgICAgICA8dGVybT48dmFybmFtZT5jb2xsYXRpb25fdmVyc2lvbl9t aXNtYXRjaF9lcnJvcjwvdmFybmFtZT4gKDx0eXBlPmJvb2xlYW48L3R5cGU+KQorICAgICAgPGlu ZGV4dGVybT4KKyAgICAgICA8cHJpbWFyeT48dmFybmFtZT5jb2xsYXRpb25fdmVyc2lvbl9taXNt YXRjaF9lcnJvcjwvdmFybmFtZT4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXI8L3ByaW1hcnk+Cisg ICAgICA8L2luZGV4dGVybT4KKyAgICAgIDwvdGVybT4KKyAgICAgIDxsaXN0aXRlbT4KKyAgICAg ICA8cGFyYT4KKyAgICAgICAgSWYgPHByb2R1Y3RuYW1lPlBvc3RncmVTUUw8L3Byb2R1Y3RuYW1l PiBkZXRlY3RzIG1pc21hdGNoZWQgY29sbGF0aW9uCisgICAgICAgIHZlcnNpb25zLCBhbmQgdGhp cyB2YXJpYWJsZSBpcyBzZXQgdG8gPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4sIGFuCisgICAgICAg IGVycm9yIHdpbGwgYmUgcmFpc2VkLiBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0bworICAgICAg ICA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4sIGEgd2FybmluZyB3aWxsIGJlIHJhaXNlZCBpbnN0 ZWFkLiBUaGUKKyAgICAgICAgZGVmYXVsdCBpcyA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisg ICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgorICAgICAgICBTZWUgPHhyZWYgbGlua2VuZD0i Y29sbGF0aW9uLXZlcnNpb25zIi8+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgIDwvcGFy YT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgIDx2YXJs aXN0ZW50cnkgaWQ9Imd1Yy1pY3UtbGlicmFyeS1wYXRoIj4KKyAgICAgIDx0ZXJtPjx2YXJuYW1l PmljdV9saWJyYXJ5X3BhdGg8L3Zhcm5hbWU+ICg8dHlwZT5zdHJpbmc8L3R5cGU+KQorICAgICAg PGluZGV4dGVybT4KKyAgICAgICA8cHJpbWFyeT48dmFybmFtZT5pY3VfbGlicmFyeV9wYXRoPC92 YXJuYW1lPiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcjwvcHJpbWFyeT4KKyAgICAgIDwvaW5kZXh0 ZXJtPgorICAgICAgPC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAg ICAgICBTZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBhZGRpdGlvbmFsIElDVSBsaWJyYXJpZXMg YXJlIGluc3RhbGxlZCwgdG8KKyAgICAgICAgYmUgc2VhcmNoZWQgZm9yIG1hdGNoaW5nIGNvbGxh dGlvbiB2ZXJzaW9ucy4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIFNl ZSA8eHJlZiBsaW5rZW5kPSJtdWx0aXBsZS1pY3UtbGlicmFyaWVzIi8+IGZvciBtb3JlIGluZm9y bWF0aW9uLgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFybGlz dGVudHJ5PgorCisgICAgIDx2YXJsaXN0ZW50cnkgaWQ9Imd1Yy1pY3UtbGlicmFyeS12ZXJzaW9u cyI+CisgICAgICA8dGVybT48dmFybmFtZT5pY3VfbGlicmFyeV92ZXJzaW9uczwvdmFybmFtZT4g KDx0eXBlPnN0cmluZzwvdHlwZT4pCisgICAgICA8aW5kZXh0ZXJtPgorICAgICAgIDxwcmltYXJ5 Pjx2YXJuYW1lPmljdV9saWJyYXJ5X3ZlcnNpb25zPC92YXJuYW1lPiBjb25maWd1cmF0aW9uIHBh cmFtZXRlcjwvcHJpbWFyeT4KKyAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgPC90ZXJtPgorICAg ICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIHNlYXJjaGluZyBmb3Ig YSBtYXRjaGluZyBjb2xsYXRpb24gdmVyc2lvbiwgc2VhcmNoIHRoZSBJQ1UKKyAgICAgICAgbGli cmFyaWVzIHdpdGggdGhlIHZlcnNpb24gbnVtYmVycyBzcGVjaWZpZWQgaW4gdGhpcyBzZXR0aW5n LAorICAgICAgICBzZXBhcmF0ZWQgYnkgY29tbWFzLiBCeSBkZWZhdWx0LCBvbmx5IHRoZSBidWls dC1pbiBJQ1UgbGlicmFyeSBpcworICAgICAgICBzZWFyY2hlZC4KKyAgICAgICA8L3BhcmE+Cisg ICAgICAgPHBhcmE+CisgICAgICAgIExpYnJhcnkgdmVyc2lvbiBudW1iZXJzIGNhbiBiZSBzcGVj aWZpZWQgYXMgZWl0aGVyCisgICAgICAgIDxsaXRlcmFsPm1ham9yX3ZlcnNpb248L2xpdGVyYWw+ IG9yCisgICAgICAgIDxsaXRlcmFsPm1ham9yX3ZlcnNpb24ubWlub3JfdmVyc2lvbjwvbGl0ZXJh bD4uIEJ5IGRlZmF1bHQsIHRoZQorICAgICAgICBidWlsdC1pbiBJQ1UgbGlicmFyeSBpcyB1c2Vk LgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgSWYgdGhpcyB2YXJpYWJs ZSBpcyBzZXQgdG8gPGxpdGVyYWw+KjwvbGl0ZXJhbD4sCisgICAgICAgIDxwcm9kdWN0bmFtZT5Q b3N0Z3JlU1FMPC9wcm9kdWN0bmFtZT4gd2lsbCBhdHRlbXB0IHRvIGxvYWQgYW55IElDVQorICAg ICAgICBsaWJyYXJ5IGluIDxsaXRlcmFsPmljdV9saWJyYXJ5X3BhdGg8L2xpdGVyYWw+IHdpdGgg YSBjb21wYXRpYmxlIG1ham9yCisgICAgICAgIHZlcnNpb24uCisgICAgICAgPC9wYXJhPgorICAg ICAgIDxwYXJhPgorICAgICAgICBTZWUgPHhyZWYgbGlua2VuZD0ibXVsdGlwbGUtaWN1LWxpYnJh cmllcyIvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xp c3RpdGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICA8dmFybGlzdGVudHJ5IGlkPSJn dWMtZGVmYXVsdC1pY3UtbGlicmFyeS12ZXJzaW9uIj4KKyAgICAgIDx0ZXJtPjx2YXJuYW1lPmRl ZmF1bHRfaWN1X2xpYnJhcnlfdmVyc2lvbjwvdmFybmFtZT4gKDx0eXBlPnN0cmluZzwvdHlwZT4p CisgICAgICA8aW5kZXh0ZXJtPgorICAgICAgIDxwcmltYXJ5Pjx2YXJuYW1lPmRlZmF1bHRfaWN1 X2xpYnJhcnlfdmVyc2lvbjwvdmFybmFtZT4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXI8L3ByaW1h cnk+CisgICAgICA8L2luZGV4dGVybT4KKyAgICAgIDwvdGVybT4KKyAgICAgIDxsaXN0aXRlbT4K KyAgICAgICA8cGFyYT4KKyAgICAgICAgSWYgPHByb2R1Y3RuYW1lPlBvc3RncmVTUUw8L3Byb2R1 Y3RuYW1lPiBkZXRlY3RzIG1pc21hdGNoZWQgY29sbGF0aW9uCisgICAgICAgIHZlcnNpb25zLCB1 c2UgdGhlIGNvbGxhdGlvbiBwcm92aWRlZCBieSB0aGUgSUNVIGxpYnJhcnkgd2l0aCB0aGlzCisg ICAgICAgIHZlcnNpb24gbnVtYmVyLgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAg ICAgICAgTGlicmFyeSB2ZXJzaW9uIG51bWJlcnMgY2FuIGJlIHNwZWNpZmllZCBhcyBlaXRoZXIK KyAgICAgICAgPGxpdGVyYWw+bWFqb3JfdmVyc2lvbjwvbGl0ZXJhbD4gb3IKKyAgICAgICAgPGxp dGVyYWw+bWFqb3JfdmVyc2lvbi5taW5vcl92ZXJzaW9uPC9saXRlcmFsPi4gQnkgZGVmYXVsdCwg dGhlCisgICAgICAgIGJ1aWx0LWluIElDVSBsaWJyYXJ5IGlzIHVzZWQuCisgICAgICAgPC9wYXJh PgorICAgICAgIDxwYXJhPgorICAgICAgICBIYXMgbm8gZWZmZWN0IGlmIDxsaXRlcmFsPmNvbGxh dGlvbl92ZXJzaW9uX21pc21hdGNoX2Vycm9yPC9saXRlcmFsPgorICAgICAgICBpcyBzZXQgdG8g PGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4uCisgICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgor ICAgICAgICBTZWUgPHhyZWYgbGlua2VuZD0ibXVsdGlwbGUtaWN1LWxpYnJhcmllcyIvPiBmb3Ig bW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAg ICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgICA8L3NlY3QyPgog ICAgIDxzZWN0MiBpZD0icnVudGltZS1jb25maWctY29tcGF0aWJsZS1jbGllbnRzIj4KICAgICAg PHRpdGxlPlBsYXRmb3JtIGFuZCBDbGllbnQgQ29tcGF0aWJpbGl0eTwvdGl0bGU+CiAgICAgIDx2 YXJpYWJsZWxpc3Q+CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvZnVuYy5zZ21sIGIvZG9jL3Ny Yy9zZ21sL2Z1bmMuc2dtbAppbmRleCA2OGNkNDI5N2QyLi5hOWY2MjU4ZTc3IDEwMDY0NAotLS0g YS9kb2Mvc3JjL3NnbWwvZnVuYy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwKQEAg LTI3MTgwLDYgKzI3MTgwLDM5IEBAIHBvc3RncmVzPSMgU0VMRUNUICogRlJPTSBwZ193YWxmaWxl X25hbWVfb2Zmc2V0KChwZ19iYWNrdXBfc3RvcCgpKS5sc24pOwogICAgICAgICBVc2Ugb2YgdGhp cyBmdW5jdGlvbiBpcyByZXN0cmljdGVkIHRvIHN1cGVydXNlcnMuCiAgICAgICAgPC9wYXJhPjwv ZW50cnk+CiAgICAgICA8L3Jvdz4KKworICAgICAgPHJvdz4KKyAgICAgICA8ZW50cnkgcm9sZT0i ZnVuY190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iZnVuY19zaWduYXR1cmUiPgorICAgICAgICA8 aW5kZXh0ZXJtPgorICAgICAgICAgPHByaW1hcnk+cGdfaWN1X2xpYnJhcnlfdmVyc2lvbnM8L3By aW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8ZnVuY3Rpb24+cGdfaWN1X2xp YnJhcnlfdmVyc2lvbnM8L2Z1bmN0aW9uPiAoKQorICAgICAgICA8cmV0dXJudmFsdWU+c2V0b2Yg cmVjb3JkPC9yZXR1cm52YWx1ZT4KKyAgICAgICAgKCA8cGFyYW1ldGVyPmljdV92ZXJzaW9uPC9w YXJhbWV0ZXI+IDx0eXBlPnRleHQ8L3R5cGU+LAorICAgICAgICA8cGFyYW1ldGVyPnVuaWNvZGVf dmVyc2lvbjwvcGFyYW1ldGVyPiA8dHlwZT50ZXh0PC90eXBlPiwKKyAgICAgICAgPHBhcmFtZXRl cj5jbGRyX3ZlcnNpb248L3BhcmFtZXRlcj4gPHR5cGU+dGV4dDwvdHlwZT4pICkKKyAgICAgICA8 L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIFJldHVybnMgaW5mb3JtYXRpb24gZnJvbSBl YWNoIGF2YWlsYWJsZSBJQ1UgbGlicmFyeS4KKyAgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAg IDwvcm93PgorCisgICAgICA8cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJmdW5jX3RhYmxlX2Vu dHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+CisgICAgICAgIDxpbmRleHRlcm0+Cisg ICAgICAgICA8cHJpbWFyeT5wZ19pY3VfY29sbGF0aW9uX3ZlcnNpb25zPC9wcmltYXJ5PgorICAg ICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGZ1bmN0aW9uPnBnX2ljdV9jb2xsYXRpb25fdmVy c2lvbnM8L2Z1bmN0aW9uPiAoIDxwYXJhbWV0ZXI+bG9jYWxlPC9wYXJhbWV0ZXI+IDx0eXBlPnRl eHQ8L3R5cGU+ICkKKyAgICAgICAgPHJldHVybnZhbHVlPnNldG9mIHJlY29yZDwvcmV0dXJudmFs dWU+CisgICAgICAgICg8cGFyYW1ldGVyPmljdV92ZXJzaW9uPC9wYXJhbWV0ZXI+IDx0eXBlPnRl eHQ8L3R5cGU+LAorICAgICAgICA8cGFyYW1ldGVyPnVjYV92ZXJzaW9uPC9wYXJhbWV0ZXI+IDx0 eXBlPnRleHQ8L3R5cGU+LAorICAgICAgICA8cGFyYW1ldGVyPmNvbGxhdG9yX3ZlcnNpb248L3Bh cmFtZXRlcj4gPHR5cGU+dGV4dDwvdHlwZT4gKQorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFy YT4KKyAgICAgICAgUmV0dXJucyB0aGUgY29sbGF0aW9uIHZlcnNpb24gb2YgdGhlIGdpdmVuIGxv Y2FsZSBmcm9tIGVhY2ggYXZhaWxhYmxlCisgICAgICAgIElDVSBsaWJyYXJ5LgorICAgICAgIDwv cGFyYT48L2VudHJ5PgorICAgICAgPC9yb3c+CiAgICAgIDwvdGJvZHk+CiAgICAgPC90Z3JvdXA+ CiAgICA8L3RhYmxlPgo= --=-aHG/P1uM9aGkEelS11k4--