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 1qBDSI-0002Ru-V0 for pgsql-performance@arkaria.postgresql.org; Mon, 19 Jun 2023 11:53:59 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1qBDSH-0004to-RG for pgsql-performance@arkaria.postgresql.org; Mon, 19 Jun 2023 11:53:57 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qBDSH-0004sO-8U for pgsql-performance@lists.postgresql.org; Mon, 19 Jun 2023 11:53:57 +0000 Received: from mail-ed1-x530.google.com ([2a00:1450:4864:20::530]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qBDSD-0033A7-TX for pgsql-performance@lists.postgresql.org; Mon, 19 Jun 2023 11:53:55 +0000 Received: by mail-ed1-x530.google.com with SMTP id 4fb4d7f45d1cf-5196a728d90so4636188a12.0 for ; Mon, 19 Jun 2023 04:53:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1687175632; x=1689767632; h=in-reply-to:from:references:cc:to:content-language:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=G3Lw4AsyohxHGoqlpzMovre794/k2OlONaSu66B4Bvo=; b=SY8lgwk8v8WFdNQGW/II2Cwf0dKHMyEwaFH/Aquy4qVET/CicBU2BvuQroyHTMz2o3 Tjo6wIb1LVBELh1ufZBN90R2U0hGUeaVgkv14L2Eysa+ODk/UpO54sytF38HYpHvxCRV MzFcpv3H0gIJJc4CBEaImLZKwCtlAlkk95XhDV08anh9FaGi/S5DK0ZCw+IPjmWL0fTa gOtDwVoRBCO6ZDRPjvpt9ZXgGqE9njwouz8C6o9bZZqZJ+FaAn+Oi4/I8WoHT/skTxvC jq35DoewkASlI2Hn+RVE1BPeITnTNUrKxac1dRM3vpvUv2PXzImw8QsvvciFHtnDJtDO +NtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687175632; x=1689767632; h=in-reply-to:from:references:cc:to:content-language:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=G3Lw4AsyohxHGoqlpzMovre794/k2OlONaSu66B4Bvo=; b=d52m0urAntH/3eFxyj3YDnSmv21Ah1q83S2V8LIjdzr8CXgPHEEX13ejv5AjupHNag 4Qok4Wa7GHSUv3CrnSeW71qq1BogKGVkYu9S1V75CkM+OU9rrz5buZuEu8zV/lSgOulC 9LLB8K0hMEshF7h7Z6UvADv9zFKKueBS5XGyA2RITb0AUwTiySvtWPlwUnSh2xfjRXoH vmLbKxW7GeoCyvvjRrjPUsQfdTobgduq85w0GcfQ6XTFvCjuwSHgo+4c9pLtw1ficr60 uilSi9RrPgylsavyY3UbWLMCkYbEA2jA7mK+tYXylP3g9IrCRJUVJoptw5lerYS66LZo eS+Q== X-Gm-Message-State: AC+VfDyYivl2RFZdrhjbqJg4jrFYU4cTp/l0czPeKP8DILbzwbjV6acL ym7fJCKWLAjKsNE3+hruYa0fIY/CshPVDw6TvTU= X-Google-Smtp-Source: ACHHUZ5+5odmRnN2vWREDKj5sTnP0LW95Wc0uvKBDVpH6OlEg/sMv6bid2MfU3UKTBkxuJg55UT/Uw== X-Received: by 2002:a50:fc13:0:b0:51a:4d53:a492 with SMTP id i19-20020a50fc13000000b0051a4d53a492mr2650176edr.27.1687175632264; Mon, 19 Jun 2023 04:53:52 -0700 (PDT) Received: from [10.137.0.17] (ip-86-49-228-220.bb.vodafone.cz. [86.49.228.220]) by smtp.gmail.com with ESMTPSA id h23-20020a50ed97000000b0051a409e752asm3155379edr.17.2023.06.19.04.53.51 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 19 Jun 2023 04:53:51 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------5T4XA5ovsrH0BZuw69cFD4OJ" Message-ID: <27cdb9c5-6dc7-87ff-303e-b0d0d20edbc4@enterprisedb.com> Date: Mon, 19 Jun 2023 13:53:50 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.1 Subject: Re: Merge David and Goliath tables efficiently Content-Language: en-US To: Alvaro Herrera , nicolas paris Cc: pgsql-performance@lists.postgresql.org References: <20230619074646.2zlxxaqjieiafgqi@alvherre.pgsql> From: Tomas Vondra In-Reply-To: <20230619074646.2zlxxaqjieiafgqi@alvherre.pgsql> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------5T4XA5ovsrH0BZuw69cFD4OJ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 6/19/23 09:46, Alvaro Herrera wrote: > I came here to talk about partitionwise join, but then noticed you have > already thought of that: > > On 2023-Jun-18, nicolas paris wrote: > >> Note that both plan acome from the same partitioned by hash table with >> 100 parts, with a unique index on the list_id + hash_key. For strategy >> 2.1, I turned on enable_partitionwise_join, since david table has the >> same partitioning scheme as goliath including unique indexe. In both >> case the query is: > > Hmm, I suppose the reason partitionwise join isn't having any effect is > that the presence of WHEN NOT MATCHED clauses force an outer join, which > probably disarms partitionwise joining, since each join pair would > require to match for nulls, so there would be two matching partitions at > the other end. A quick test for this hypothesis might be to try the > MERGE without the WHEN NOT MATCHED clauses and see if partitionwise join > works better. > > Maybe Tom L's new outer-join infrastructure in 16 allows to improve on > this, not sure. > Not sure why would that disarm partitionwise join - attached is a simple reproducer, generating two tables, loading 10000000 and 10000 rows into them, and then doing explain on a simple merge. IMHO the thing that breaks it is the ORDER BY in the merge, which likely acts as an optimization fence and prevents all sorts of smart things including the partitionwise join. I'd bet that if Nicolas replaces MERGE INTO "goliath" ca USING (SELECT * FROM "david" ORDER BY "list_id") AS t .. with MERGE INTO "goliath" ca USING "david" AS t ... it'll start doing the working much better. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------5T4XA5ovsrH0BZuw69cFD4OJ Content-Type: application/sql; name="repro.sql" Content-Disposition: attachment; filename="repro.sql" Content-Transfer-Encoding: base64 Y3JlYXRlIHRhYmxlIGdvbGlhdGggKGlkIHNlcmlhbCBwcmltYXJ5IGtleSwgdmFsIHRleHQp IHBhcnRpdGlvbiBieSBoYXNoIChpZCk7CgpjcmVhdGUgdGFibGUgZ29saWF0aF8wIHBhcnRp dGlvbiBvZiBnb2xpYXRoIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRl ciAwKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMSBwYXJ0aXRpb24gb2YgZ29saWF0aCBmb3Ig dmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgMSk7CmNyZWF0ZSB0YWJsZSBn b2xpYXRoXzIgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVz IDEwMCwgcmVtYWluZGVyIDIpOwpjcmVhdGUgdGFibGUgZ29saWF0aF8zIHBhcnRpdGlvbiBv ZiBnb2xpYXRoIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciAzKTsK Y3JlYXRlIHRhYmxlIGdvbGlhdGhfNCBwYXJ0aXRpb24gb2YgZ29saWF0aCBmb3IgdmFsdWVz IHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNCk7CmNyZWF0ZSB0YWJsZSBnb2xpYXRo XzUgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwg cmVtYWluZGVyIDUpOwpjcmVhdGUgdGFibGUgZ29saWF0aF82IHBhcnRpdGlvbiBvZiBnb2xp YXRoIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA2KTsKY3JlYXRl IHRhYmxlIGdvbGlhdGhfNyBwYXJ0aXRpb24gb2YgZ29saWF0aCBmb3IgdmFsdWVzIHdpdGgg KG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNyk7CmNyZWF0ZSB0YWJsZSBnb2xpYXRoXzggcGFy dGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWlu ZGVyIDgpOwpjcmVhdGUgdGFibGUgZ29saWF0aF85IHBhcnRpdGlvbiBvZiBnb2xpYXRoIGZv ciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA5KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfMTAgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDEwKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMTEgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDExKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMTIgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDEyKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfMTMgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDEzKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMTQgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDE0KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMTUgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDE1KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfMTYgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDE2KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMTcgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDE3KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMTggcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDE4KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfMTkgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDE5KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMjAgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDIwKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMjEgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDIxKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfMjIgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDIyKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMjMgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDIzKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMjQgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDI0KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfMjUgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDI1KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMjYgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDI2KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMjcgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDI3KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfMjggcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDI4KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMjkgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDI5KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMzAgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDMwKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfMzEgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDMxKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMzIgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDMyKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMzMgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDMzKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfMzQgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDM0KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMzUgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDM1KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMzYgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDM2KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfMzcgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDM3KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMzggcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDM4KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfMzkgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDM5KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNDAgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDQwKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNDEgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDQxKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNDIgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDQyKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNDMgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDQzKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNDQgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDQ0KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNDUgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDQ1KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNDYgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDQ2KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNDcgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDQ3KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNDggcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDQ4KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNDkgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDQ5KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNTAgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDUwKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNTEgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDUxKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNTIgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDUyKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNTMgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDUzKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNTQgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDU0KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNTUgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDU1KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNTYgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDU2KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNTcgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDU3KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNTggcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDU4KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNTkgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDU5KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNjAgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDYwKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNjEgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDYxKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNjIgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDYyKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNjMgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDYzKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNjQgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDY0KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNjUgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDY1KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNjYgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDY2KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNjcgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDY3KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNjggcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDY4KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNjkgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDY5KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNzAgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDcwKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNzEgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDcxKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNzIgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDcyKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNzMgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDczKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNzQgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDc0KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNzUgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDc1KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNzYgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDc2KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNzcgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDc3KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfNzggcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDc4KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfNzkgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDc5KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfODAgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDgwKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfODEgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDgxKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfODIgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDgyKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfODMgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDgzKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfODQgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDg0KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfODUgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDg1KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfODYgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDg2KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfODcgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDg3KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfODggcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDg4KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfODkgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDg5KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfOTAgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDkwKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfOTEgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDkxKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfOTIgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDkyKTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfOTMgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDkzKTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfOTQgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDk0KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfOTUgcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDk1KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfOTYgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDk2KTsKY3JlYXRlIHRhYmxl IGdvbGlhdGhfOTcgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1 bHVzIDEwMCwgcmVtYWluZGVyIDk3KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfOTggcGFydGl0 aW9uIG9mIGdvbGlhdGggZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVy IDk4KTsKY3JlYXRlIHRhYmxlIGdvbGlhdGhfOTkgcGFydGl0aW9uIG9mIGdvbGlhdGggZm9y IHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDk5KTsKCmNyZWF0ZSB0YWJs ZSBkYXZpZCAoaWQgc2VyaWFsIHByaW1hcnkga2V5LCB2YWwgdGV4dCkgcGFydGl0aW9uIGJ5 IGhhc2ggKGlkKTsKCmNyZWF0ZSB0YWJsZSBkYXZpZF8wIHBhcnRpdGlvbiBvZiBkYXZpZCBm b3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgMCk7CmNyZWF0ZSB0YWJs ZSBkYXZpZF8xIHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMg MTAwLCByZW1haW5kZXIgMSk7CmNyZWF0ZSB0YWJsZSBkYXZpZF8yIHBhcnRpdGlvbiBvZiBk YXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgMik7CmNyZWF0 ZSB0YWJsZSBkYXZpZF8zIHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1v ZHVsdXMgMTAwLCByZW1haW5kZXIgMyk7CmNyZWF0ZSB0YWJsZSBkYXZpZF80IHBhcnRpdGlv biBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNCk7 CmNyZWF0ZSB0YWJsZSBkYXZpZF81IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdp dGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNSk7CmNyZWF0ZSB0YWJsZSBkYXZpZF82IHBh cnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5k ZXIgNik7CmNyZWF0ZSB0YWJsZSBkYXZpZF83IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFs dWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNyk7CmNyZWF0ZSB0YWJsZSBkYXZp ZF84IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCBy ZW1haW5kZXIgOCk7CmNyZWF0ZSB0YWJsZSBkYXZpZF85IHBhcnRpdGlvbiBvZiBkYXZpZCBm b3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgOSk7CmNyZWF0ZSB0YWJs ZSBkYXZpZF8xMCBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVz IDEwMCwgcmVtYWluZGVyIDEwKTsKY3JlYXRlIHRhYmxlIGRhdmlkXzExIHBhcnRpdGlvbiBv ZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgMTEpOwpj cmVhdGUgdGFibGUgZGF2aWRfMTIgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0 aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciAxMik7CmNyZWF0ZSB0YWJsZSBkYXZpZF8xMyBw YXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWlu ZGVyIDEzKTsKY3JlYXRlIHRhYmxlIGRhdmlkXzE0IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3Ig dmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgMTQpOwpjcmVhdGUgdGFibGUg ZGF2aWRfMTUgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAx MDAsIHJlbWFpbmRlciAxNSk7CmNyZWF0ZSB0YWJsZSBkYXZpZF8xNiBwYXJ0aXRpb24gb2Yg ZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDE2KTsKY3Jl YXRlIHRhYmxlIGRhdmlkXzE3IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGgg KG1vZHVsdXMgMTAwLCByZW1haW5kZXIgMTcpOwpjcmVhdGUgdGFibGUgZGF2aWRfMTggcGFy dGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRl ciAxOCk7CmNyZWF0ZSB0YWJsZSBkYXZpZF8xOSBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZh bHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDE5KTsKY3JlYXRlIHRhYmxlIGRh dmlkXzIwIHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAw LCByZW1haW5kZXIgMjApOwpjcmVhdGUgdGFibGUgZGF2aWRfMjEgcGFydGl0aW9uIG9mIGRh dmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciAyMSk7CmNyZWF0 ZSB0YWJsZSBkYXZpZF8yMiBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoICht b2R1bHVzIDEwMCwgcmVtYWluZGVyIDIyKTsKY3JlYXRlIHRhYmxlIGRhdmlkXzIzIHBhcnRp dGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIg MjMpOwpjcmVhdGUgdGFibGUgZGF2aWRfMjQgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1 ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciAyNCk7CmNyZWF0ZSB0YWJsZSBkYXZp ZF8yNSBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwg cmVtYWluZGVyIDI1KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzI2IHBhcnRpdGlvbiBvZiBkYXZp ZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgMjYpOwpjcmVhdGUg dGFibGUgZGF2aWRfMjcgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9k dWx1cyAxMDAsIHJlbWFpbmRlciAyNyk7CmNyZWF0ZSB0YWJsZSBkYXZpZF8yOCBwYXJ0aXRp b24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDI4 KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzI5IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVz IHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgMjkpOwpjcmVhdGUgdGFibGUgZGF2aWRf MzAgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJl bWFpbmRlciAzMCk7CmNyZWF0ZSB0YWJsZSBkYXZpZF8zMSBwYXJ0aXRpb24gb2YgZGF2aWQg Zm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDMxKTsKY3JlYXRlIHRh YmxlIGRhdmlkXzMyIHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVs dXMgMTAwLCByZW1haW5kZXIgMzIpOwpjcmVhdGUgdGFibGUgZGF2aWRfMzMgcGFydGl0aW9u IG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciAzMyk7 CmNyZWF0ZSB0YWJsZSBkYXZpZF8zNCBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3 aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDM0KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzM1 IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1h aW5kZXIgMzUpOwpjcmVhdGUgdGFibGUgZGF2aWRfMzYgcGFydGl0aW9uIG9mIGRhdmlkIGZv ciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciAzNik7CmNyZWF0ZSB0YWJs ZSBkYXZpZF8zNyBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVz IDEwMCwgcmVtYWluZGVyIDM3KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzM4IHBhcnRpdGlvbiBv ZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgMzgpOwpj cmVhdGUgdGFibGUgZGF2aWRfMzkgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0 aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciAzOSk7CmNyZWF0ZSB0YWJsZSBkYXZpZF80MCBw YXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWlu ZGVyIDQwKTsKY3JlYXRlIHRhYmxlIGRhdmlkXzQxIHBhcnRpdGlvbiBvZiBkYXZpZCBmb3Ig dmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNDEpOwpjcmVhdGUgdGFibGUg ZGF2aWRfNDIgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAx MDAsIHJlbWFpbmRlciA0Mik7CmNyZWF0ZSB0YWJsZSBkYXZpZF80MyBwYXJ0aXRpb24gb2Yg ZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDQzKTsKY3Jl YXRlIHRhYmxlIGRhdmlkXzQ0IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGgg KG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNDQpOwpjcmVhdGUgdGFibGUgZGF2aWRfNDUgcGFy dGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRl ciA0NSk7CmNyZWF0ZSB0YWJsZSBkYXZpZF80NiBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZh bHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDQ2KTsKY3JlYXRlIHRhYmxlIGRh dmlkXzQ3IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAw LCByZW1haW5kZXIgNDcpOwpjcmVhdGUgdGFibGUgZGF2aWRfNDggcGFydGl0aW9uIG9mIGRh dmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA0OCk7CmNyZWF0 ZSB0YWJsZSBkYXZpZF80OSBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoICht b2R1bHVzIDEwMCwgcmVtYWluZGVyIDQ5KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzUwIHBhcnRp dGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIg NTApOwpjcmVhdGUgdGFibGUgZGF2aWRfNTEgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1 ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA1MSk7CmNyZWF0ZSB0YWJsZSBkYXZp ZF81MiBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwg cmVtYWluZGVyIDUyKTsKY3JlYXRlIHRhYmxlIGRhdmlkXzUzIHBhcnRpdGlvbiBvZiBkYXZp ZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNTMpOwpjcmVhdGUg dGFibGUgZGF2aWRfNTQgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9k dWx1cyAxMDAsIHJlbWFpbmRlciA1NCk7CmNyZWF0ZSB0YWJsZSBkYXZpZF81NSBwYXJ0aXRp b24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDU1 KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzU2IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVz IHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNTYpOwpjcmVhdGUgdGFibGUgZGF2aWRf NTcgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJl bWFpbmRlciA1Nyk7CmNyZWF0ZSB0YWJsZSBkYXZpZF81OCBwYXJ0aXRpb24gb2YgZGF2aWQg Zm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDU4KTsKY3JlYXRlIHRh YmxlIGRhdmlkXzU5IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVs dXMgMTAwLCByZW1haW5kZXIgNTkpOwpjcmVhdGUgdGFibGUgZGF2aWRfNjAgcGFydGl0aW9u IG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA2MCk7 CmNyZWF0ZSB0YWJsZSBkYXZpZF82MSBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3 aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDYxKTsKY3JlYXRlIHRhYmxlIGRhdmlkXzYy IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1h aW5kZXIgNjIpOwpjcmVhdGUgdGFibGUgZGF2aWRfNjMgcGFydGl0aW9uIG9mIGRhdmlkIGZv ciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA2Myk7CmNyZWF0ZSB0YWJs ZSBkYXZpZF82NCBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVz IDEwMCwgcmVtYWluZGVyIDY0KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzY1IHBhcnRpdGlvbiBv ZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNjUpOwpj cmVhdGUgdGFibGUgZGF2aWRfNjYgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0 aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA2Nik7CmNyZWF0ZSB0YWJsZSBkYXZpZF82NyBw YXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWlu ZGVyIDY3KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzY4IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3Ig dmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNjgpOwpjcmVhdGUgdGFibGUg ZGF2aWRfNjkgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAx MDAsIHJlbWFpbmRlciA2OSk7CmNyZWF0ZSB0YWJsZSBkYXZpZF83MCBwYXJ0aXRpb24gb2Yg ZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDcwKTsKY3Jl YXRlIHRhYmxlIGRhdmlkXzcxIHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGgg KG1vZHVsdXMgMTAwLCByZW1haW5kZXIgNzEpOwpjcmVhdGUgdGFibGUgZGF2aWRfNzIgcGFy dGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRl ciA3Mik7CmNyZWF0ZSB0YWJsZSBkYXZpZF83MyBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZh bHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDczKTsKY3JlYXRlIHRhYmxlIGRh dmlkXzc0IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAw LCByZW1haW5kZXIgNzQpOwpjcmVhdGUgdGFibGUgZGF2aWRfNzUgcGFydGl0aW9uIG9mIGRh dmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA3NSk7CmNyZWF0 ZSB0YWJsZSBkYXZpZF83NiBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoICht b2R1bHVzIDEwMCwgcmVtYWluZGVyIDc2KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzc3IHBhcnRp dGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIg NzcpOwpjcmVhdGUgdGFibGUgZGF2aWRfNzggcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1 ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA3OCk7CmNyZWF0ZSB0YWJsZSBkYXZp ZF83OSBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwg cmVtYWluZGVyIDc5KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzgwIHBhcnRpdGlvbiBvZiBkYXZp ZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgODApOwpjcmVhdGUg dGFibGUgZGF2aWRfODEgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9k dWx1cyAxMDAsIHJlbWFpbmRlciA4MSk7CmNyZWF0ZSB0YWJsZSBkYXZpZF84MiBwYXJ0aXRp b24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDgy KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzgzIHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVz IHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgODMpOwpjcmVhdGUgdGFibGUgZGF2aWRf ODQgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJl bWFpbmRlciA4NCk7CmNyZWF0ZSB0YWJsZSBkYXZpZF84NSBwYXJ0aXRpb24gb2YgZGF2aWQg Zm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDg1KTsKY3JlYXRlIHRh YmxlIGRhdmlkXzg2IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVs dXMgMTAwLCByZW1haW5kZXIgODYpOwpjcmVhdGUgdGFibGUgZGF2aWRfODcgcGFydGl0aW9u IG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA4Nyk7 CmNyZWF0ZSB0YWJsZSBkYXZpZF84OCBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3 aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDg4KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzg5 IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1h aW5kZXIgODkpOwpjcmVhdGUgdGFibGUgZGF2aWRfOTAgcGFydGl0aW9uIG9mIGRhdmlkIGZv ciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA5MCk7CmNyZWF0ZSB0YWJs ZSBkYXZpZF85MSBwYXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVz IDEwMCwgcmVtYWluZGVyIDkxKTsKY3JlYXRlIHRhYmxlIGRhdmlkXzkyIHBhcnRpdGlvbiBv ZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgOTIpOwpj cmVhdGUgdGFibGUgZGF2aWRfOTMgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0 aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRlciA5Myk7CmNyZWF0ZSB0YWJsZSBkYXZpZF85NCBw YXJ0aXRpb24gb2YgZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWlu ZGVyIDk0KTsKY3JlYXRlIHRhYmxlIGRhdmlkXzk1IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3Ig dmFsdWVzIHdpdGggKG1vZHVsdXMgMTAwLCByZW1haW5kZXIgOTUpOwpjcmVhdGUgdGFibGUg ZGF2aWRfOTYgcGFydGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAx MDAsIHJlbWFpbmRlciA5Nik7CmNyZWF0ZSB0YWJsZSBkYXZpZF85NyBwYXJ0aXRpb24gb2Yg ZGF2aWQgZm9yIHZhbHVlcyB3aXRoIChtb2R1bHVzIDEwMCwgcmVtYWluZGVyIDk3KTsKY3Jl YXRlIHRhYmxlIGRhdmlkXzk4IHBhcnRpdGlvbiBvZiBkYXZpZCBmb3IgdmFsdWVzIHdpdGgg KG1vZHVsdXMgMTAwLCByZW1haW5kZXIgOTgpOwpjcmVhdGUgdGFibGUgZGF2aWRfOTkgcGFy dGl0aW9uIG9mIGRhdmlkIGZvciB2YWx1ZXMgd2l0aCAobW9kdWx1cyAxMDAsIHJlbWFpbmRl ciA5OSk7CgoKaW5zZXJ0IGludG8gZ29saWF0aCBzZWxlY3QgaSwgbWQ1KGk6OnRleHQpIGZy b20gZ2VuZXJhdGVfc2VyaWVzKDEsMTAwMDAwMDApIHMoaSk7CmFuYWx5emUgZ29saWF0aDsK Cmluc2VydCBpbnRvIGRhdmlkIHNlbGVjdCBpZCwgbWQ1KGlkOjp0ZXh0KSBmcm9tIChzZWxl Y3QgKDEwMDAwMDAwICogcmFuZG9tKCkpOjppbnQgaWQgZnJvbSBnZW5lcmF0ZV9zZXJpZXMo MSwxMDAwMCkgcyhpKSBncm91cCBieSBpZCk7CmFuYWx5emUgZGF2aWQ7CgotLSBvcmlnaW5h bCBtZXJnZQpleHBsYWluIG1lcmdlIGludG8gZ29saWF0aCB1c2luZyAoc2VsZWN0ICogZnJv bSBkYXZpZCBvcmRlciBieSB2YWwpIGFzIGRhdmlkIG9uIGRhdmlkLmlkID0gZ29saWF0aC5p ZCB3aGVuIG1hdGNoZWQgdGhlbiB1cGRhdGUgc2V0IHZhbCA9IGRhdmlkLnZhbCB3aGVuIG5v dCBtYXRjaGVkIHRoZW4gaW5zZXJ0IChpZCwgdmFsKSB2YWx1ZXMgKGRhdmlkLmlkLCBkYXZp ZC52YWwpOwoKLS0gc2ltcGxpZmllZApleHBsYWluIG1lcmdlIGludG8gZ29saWF0aCB1c2lu ZyBkYXZpZCBvbiBkYXZpZC5pZCA9IGdvbGlhdGguaWQgd2hlbiBtYXRjaGVkIHRoZW4gdXBk YXRlIHNldCB2YWwgPSBkYXZpZC52YWwgd2hlbiBub3QgbWF0Y2hlZCB0aGVuIGluc2VydCAo aWQsIHZhbCkgdmFsdWVzIChkYXZpZC5pZCwgZGF2aWQudmFsKTsK --------------5T4XA5ovsrH0BZuw69cFD4OJ--