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 1w0i54-0028vq-2C for pgsql-hackers@arkaria.postgresql.org; Thu, 12 Mar 2026 15:36:10 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w0i53-00FhiU-0a for pgsql-hackers@arkaria.postgresql.org; Thu, 12 Mar 2026 15:36:09 +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 1w0i52-00Fhgg-1b for pgsql-hackers@lists.postgresql.org; Thu, 12 Mar 2026 15:36:09 +0000 Received: from mail-ed1-x529.google.com ([2a00:1450:4864:20::529]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w0i4z-00000001n07-0jJ6 for pgsql-hackers@lists.postgresql.org; Thu, 12 Mar 2026 15:36:08 +0000 Received: by mail-ed1-x529.google.com with SMTP id 4fb4d7f45d1cf-65c0891f4e9so1780484a12.1 for ; Thu, 12 Mar 2026 08:36:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773329762; cv=none; d=google.com; s=arc-20240605; b=JUk9iDmXoRzjS/9g1MnrhxKOCtvkoSv2uBJIA0i3mXjAs+4vYcWmXr22RTojba+mZ6 QbTAEUh4QjMG1E06VfE0UR+/mIO2vlUxrIQWAtwwwGGP9EQBHHw5pIV7uj8Vcjz++iq7 V5CBj10mqNogvMXbdPiFpsDBBvlSVVIKmR3+GaXJoNqAWTXBoQtjVi2GzZmFIHBcIjAI H+ah2xQPc7uR6sRT84RnLOBLzvShS1IrDhxNd/rDSkiiL/epqsueVTNiP5okZ2PwPKk0 4oG2UvuiZfajDOA1Qxe+8SlcXNw4zmQT2SwNekHLeUoYe7r7VgpxWCsQrRbrwr/edI2v 05dg== 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:in-reply-to:references :mime-version:dkim-signature; bh=gajxpZQQaFhN0akQcNuK+jh4UR6tdpS6cziEjuGAI4k=; fh=nprvNcRljrIRPWgI49C6//mz5b0zhpeE+CFNpxe28Eg=; b=VgdIWHgnC8F7bo+9KlCuB1aBrivMXYiJgoWrV4tsfPj77tFELXtxm47hh5AhFH4n69 BlQfcXZJX51jH5e/yMEoDN8/TiWvk1eleRc0mLWauEzGa+L6PI7KlT2iBmNhjhm5dV2M dYs94G6w+hkzCFqSf7B6vx49+VQLj9AFKvN40ilLnkjBzCwq35BOATpBjyUTxU4M3ZvW jMrRgqbdWgjJ6kjqJL0/KRO54Qc4K6TMmHxetnEuOU0lu1Au+YASPknNser8HQ5CIfvD tYCewZOjZnUTqBXwCIKIdoQopEPJOkqEfviysPd7bgVKxHSLNTamVzHqu+2kGPKk02BX mukg==; 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=20230601; t=1773329762; x=1773934562; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=gajxpZQQaFhN0akQcNuK+jh4UR6tdpS6cziEjuGAI4k=; b=hXdOo6HSlv5E0Hpp+WvVVwzEFEZItE2wAEb/0xJDZB8FrU22w1Ab71eus7p+9hxMqv F2eyhB2t82m4j4OPkX0fKxRhARDtwkWzeFhwKyIiXbN/0shAod7dP6ixkwcAg4D8bE0Y NPVesuQmiV+U85lK23I+zBiwg6ibx3RyHjytUexaWIeJiL8LF3GMB9gtwFQiw8f4sIWT 1ik6z2cVcfu/zB6H8jyHoq9bq2Vi1OH9cMLxxqIiXFi+f6124jIQ5UKMa33Jxen35lY3 JZDbo+s0qGJD6OIWuisZQnzAnqC5TQLG5je5mlj/yOu0dCiVywoa8MOih4zCODesWQJq at8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773329762; x=1773934562; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=gajxpZQQaFhN0akQcNuK+jh4UR6tdpS6cziEjuGAI4k=; b=Ip4p89vgUzjfskHAqvAxKrWDKqVnaDYGtiRHF0TjUfeoo/GsJMT/++3OwUpSdx8EQe 2Yvc4DZrDLZSj0hWDX76pdx7lg/hLrHBoII7L30FvkBsMARB9oh4Cw6aaRXYoIBZB8xv ZgPFhGiCm2N3AqNfTaK29rZsyebRgdVlQXLiNrnKRYhTWyFqCp8cmdLW7SrKCY6gQD67 EVMUbp9HPMWdlzdupF6D3HqLi34MxFDpfOinyZRsUultXC6IF3oAC4KyoXLQINb1zcw8 Ux8sPqxJrjQ6dxxjAaDfJGitEalwDmXeTzpvjZ3rVNRc2TVwsifyut+5S8YuKQAhEOv2 Xq+A== X-Forwarded-Encrypted: i=1; AJvYcCVtO2Z1K5N9k6Kf6Tx8DBXChJMIzw/W/K579g9qRk73HxvKhZvfPwK3ZWkzj7gP8S5uPzHxj13NHFtRdsGA@lists.postgresql.org X-Gm-Message-State: AOJu0Yy1DgPcT2vfYnWiAWSelZrn+uZSY18KK8YgGy0fTy6C/YZ1XNnB TAphIaLVr+oFw2uXBjugZuUADLew+PX8spdZ2i1oMhNeGQFHNxyO684IfU82EhZQR8dUcxVTTT0 kRAuGS7b03sSzn42iB/1hFFR3yczzZmk= X-Gm-Gg: ATEYQzzmSA6NSS3iwVQtBoA5owwGRuQ6445LyWwBtDpMOI+BHFkvUFD+krJwA8TXp1q 42lO4I9X1UevXMMZdtXlCkp34YT9Zq+AYbk1XJce9rVryRE2ICx5k7TTeQW+9DCOF4UKXZ8uvAc AADQ3XrCPR4wSSZAT3Vz/N94vZTzgc/oc9zHppeS97BAzkttmRtPgdBXNSOdgo57VMWF5UJK+KV sGDnH70b/gRWwHEi8hHotWtLr5LjKj3fIgI63cUfk2hpafJ3V0TIG29FR8YrLwy1LERYuvxIivH SjBfA5TiEuFFtCJ+EFhINEXZ6GnzauY7Pd5ZcKaBwMQn6gLrcBshh9hCPkVDMUu9sNrxMuOw+eC dNQpblwUn X-Received: by 2002:a17:907:3c8f:b0:b93:715f:ced with SMTP id a640c23a62f3a-b972e1ab17fmr389300366b.18.1773329761590; Thu, 12 Mar 2026 08:36:01 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Xuneng Zhou Date: Thu, 12 Mar 2026 23:35:48 +0800 X-Gm-Features: AaiRm50D6U0csEuB9RJ_pHGRDUIjp01lNjeX2IWWAnEGNDbpMFeO_XXFlakoxog Message-ID: Subject: Re: Streamify more code paths To: Michael Paquier Cc: Andres Freund , pgsql-hackers , Nazir Bilal Yavuz Content-Type: multipart/mixed; boundary="00000000000082a0db064cd582eb" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000082a0db064cd582eb Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Mar 12, 2026 at 12:39=E2=80=AFPM Xuneng Zhou = wrote: > > On Thu, Mar 12, 2026 at 11:42=E2=80=AFAM Michael Paquier wrote: > > > > On Thu, Mar 12, 2026 at 06:33:08AM +0900, Michael Paquier wrote: > > > Thanks for doing that. On my side, I am going to look at the gin and > > > hash vacuum paths first with more testing as these don't use a custom > > > callback. I don't think that I am going to need a lot of convincing, > > > but I'd rather produce some numbers myself because doing something. > > > I'll tweak a mounting point with the delay trick, as well. > > > > While debug_io_direct has been helping a bit, the trick for the delay > > to throttle the IO activity has helped much more with my runtime > > numbers. I have mounted a separate partition with a delay of 5ms, > > disabled checkums (this part did not make a real difference), and > > evicted shared buffers for relation and indexes before the VACUUM. > > > > Then I got better numbers. Here is an extract: > > - worker=3D3: > > gin_vacuum (100k tuples) base=3D 1448.2ms patch=3D 572.5ms 2.53= x > > ( 60.5%) (reads=3D175=E2=86=92104, io_time=3D1382.70=E2=86=92506.64ms) > > gin_vacuum (300k tuples) base=3D 3728.0ms patch=3D 1332.0ms 2.80= x > > ( 64.3%) (reads=3D486=E2=86=92293, io_time=3D3669.89=E2=86=921266.27ms= ) > > bloom_vacuum (100k tuples) base=3D 21826.8ms patch=3D 17220.3ms 1.27= x > > ( 21.1%) (reads=3D485=E2=86=92117, io_time=3D4773.33=E2=86=92270.56ms) > > bloom_vacuum (300k tuples) base=3D 67054.0ms patch=3D 53164.7ms 1.26= x > > ( 20.7%) (reads=3D1431.5=E2=86=92327.5, io_time=3D13880.2=E2=86=92381.= 395ms) > > - io_uring: > > gin_vacuum (100k tuples) base=3D 1240.3ms patch=3D 360.5ms 3.44= x > > ( 70.9%) (reads=3D175=E2=86=92104, io_time=3D1175.35=E2=86=92299.75ms) > > gin_vacuum (300k tuples) base=3D 2829.9ms patch=3D 642.0ms 4.41= x > > ( 77.3%) (reads=3D465.5=E2=86=92293, io_time=3D2768.46=E2=86=92579.04m= s) > > bloom_vacuum (100k tuples) base=3D 22121.7ms patch=3D 17532.3ms 1.26= x > > ( 20.7%) (reads=3D485=E2=86=92117, io_time=3D4850.46=E2=86=92285.28ms) > > bloom_vacuum (300k tuples) base=3D 67058.0ms patch=3D 53118.0ms 1.26= x > > ( 20.8%) (reads=3D1431.5=E2=86=92327.5, io_time=3D13870.9=E2=86=92305.= 44ms) > > > > The higher the number of tuples, the better the performance for each > > individual operation, but the tests take a much longer time (tens of > > seconds vs tens of minutes). For GIN, the numbers can be quite good > > once these reads are pushed. For bloom, the runtime is improved, and > > the IO numbers are much better. > > > > -- io_uring, medium size > > bloom_vacuum_medium base=3D 8355.2ms patch=3D 715.0ms 11.68x > ( 91.4%) (reads=3D4732=E2=86=921056, io_time=3D7699.47=E2=86=9286.52ms) > pgstattuple_medium base=3D 4012.8ms patch=3D 213.7ms 18.78x > ( 94.7%) (reads=3D2006=E2=86=922006, io_time=3D4001.66=E2=86=92200.24ms) > pgstatindex_medium base=3D 5490.6ms patch=3D 37.9ms 144.88x > ( 99.3%) (reads=3D2745=E2=86=92173, io_time=3D5481.54=E2=86=927.82ms) > hash_vacuum_medium base=3D 34483.4ms patch=3D 2703.5ms 12.75x > ( 92.2%) (reads=3D19166=E2=86=923901, io_time=3D31948.33=E2=86=92308.05m= s) > wal_logging_medium base=3D 7778.6ms patch=3D 7814.5ms 1.00x > ( -0.5%) (reads=3D2857=E2=86=922845, io_time=3D11.84=E2=86=9211.45ms) > > -- worker, medium size > bloom_vacuum_medium base=3D 8376.2ms patch=3D 747.7ms 11.20x > ( 91.1%) (reads=3D4732=E2=86=921056, io_time=3D7688.91=E2=86=9265.49ms) > pgstattuple_medium base=3D 4012.7ms patch=3D 339.0ms 11.84x > ( 91.6%) (reads=3D2006=E2=86=922006, io_time=3D4002.23=E2=86=9249.99ms) > pgstatindex_medium base=3D 5490.3ms patch=3D 38.3ms 143.23x > ( 99.3%) (reads=3D2745=E2=86=92173, io_time=3D5480.60=E2=86=9216.24ms) > hash_vacuum_medium base=3D 34638.4ms patch=3D 2940.2ms 11.78x > ( 91.5%) (reads=3D19166=E2=86=923901, io_time=3D31881.61=E2=86=92242.01m= s) > wal_logging_medium base=3D 7440.1ms patch=3D 7434.0ms 1.00x > ( 0.1%) (reads=3D2861=E2=86=922825, io_time=3D10.62=E2=86=9210.71ms) > Our io_time metric currently measures only read time and ignores write I/O, which can be misleading. We now separate it into read_time and write_time. -- write-delay 2 ms WORKROOT=3D/srv/pg_delayed SIZES=3Dsmall REPS=3D3 ./run_streaming_benchmark.sh --baseline --io-method worker --io-workers 12 --test hash_vacuum --direct-io --read-delay 2 --write-delay 2 v6-0004-Streamify-hash-index-VACUUM-primary-bucket-page-r.patch hash_vacuum_small base=3D 16652.8ms patch=3D 13493.2ms 1.23x ( 19.0%) (reads=3D2338=E2=86=92815, read_time=3D4136.19=E2=86=92884.79ms, writes=3D6218=E2=86=926206, write_time=3D12313.81=E2=86=9212289.58ms) -- write-delay 0 ms WORKROOT=3D/srv/pg_delayed SIZES=3Dsmall REPS=3D3 ./run_streaming_benchmark.sh --baseline --io-method worker --io-workers 12 --test hash_vacuum --direct-io --read-delay 2 --write-delay 0 v6-0004-Streamify-hash-index-VACUUM-primary-bucket-page-r.patch hash_vacuum_small base=3D 4310.2ms patch=3D 1146.7ms 3.76x ( 73.4%) (reads=3D2338=E2=86=92815, read_time=3D4002.24=E2=86=92833.47ms, writes=3D6218=E2=86=926206, write_time=3D186.69=E2=86=92140.96ms) --=20 Best, Xuneng --00000000000082a0db064cd582eb Content-Type: text/x-sh; charset="UTF-8"; name="run_streaming_benchmark.sh" Content-Disposition: attachment; filename="run_streaming_benchmark.sh" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmnmpmge0 IyEvdXNyL2Jpbi9lbnYgYmFzaApzZXQgLWV1byBwaXBlZmFpbAoKIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIwojIFN0cmVhbWluZyBSZWFkIFBhdGNoZXMgQmVuY2htYXJrCiMKIyBVc2FnZTogLi9ydW5f c3RyZWFtaW5nX2JlbmNoLnNoIFtPUFRJT05TXSA8cGF0Y2g+CiMKIyBPcHRpb25zOgojICAgLS1j bGVhbiAgICAgICAgICAgUmVtb3ZlIGV4aXN0aW5nIGJ1aWxkcyBhbmQgc3RhcnQgZnJlc2gKIyAg IC0tYmFzZWxpbmUgICAgICAgIEFsc28gYnVpbGQgYW5kIHRlc3QgdmFuaWxsYSBQb3N0Z3JlU1FM IGZvciBjb21wYXJpc29uCiMgICAtLXRlc3QgVEVTVCAgICAgICBSdW4gc3BlY2lmaWMgdGVzdCAo Ymxvb21fc2NhbiwgYmxvb21fdmFjdXVtLCBwZ3N0YXR0dXBsZSwKIyAgICAgICAgICAgICAgICAg ICAgIHBnc3RhdGluZGV4LCBnaW5fdmFjdXVtLCB3YWxfbG9nZ2luZywgaGFzaF92YWN1dW0sIG9y ICJhbGwiKQojICAgLS1pby1tZXRob2QgTU9ERSAgSS9PIG1ldGhvZDogaW9fdXJpbmcsIHdvcmtl ciwgb3Igc3luYyAoZGVmYXVsdDogaW9fdXJpbmcpCiMgICAtLWlvLXdvcmtlcnMgTiAgICBOdW1i ZXIgb2YgSS9PIHdvcmtlcnMgZm9yIHdvcmtlciBtb2RlIChkZWZhdWx0OiAzKQojICAgLS1pby1j b25jdXJyZW5jeSBOICBNYXggY29uY3VycmVudCBJL09zIHBlciBwcm9jZXNzIChkZWZhdWx0OiA2 NCkKIyAgIC0tZGlyZWN0LWlvICAgICAgICAgRW5hYmxlIGRpcmVjdCBJTyAoZGVidWdfaW9fZGly ZWN0PWRhdGEpLCBieXBhc3NlcyBPUyBwYWdlIGNhY2hlCiMgICAtLXJlYWQtZGVsYXkgTVMgICAg IFNpbXVsYXRlIHJlYWQgbGF0ZW5jeSB2aWEgZG1fZGVsYXkgKHJlcXVpcmVzIHByZS1jcmVhdGVk IGRldmljZSkKIyAgIC0td3JpdGUtZGVsYXkgTVMgICAgU2ltdWxhdGUgd3JpdGUgbGF0ZW5jeSB2 aWEgZG1fZGVsYXkgKGRlZmF1bHQ6IDAsIHJlcXVpcmVzIC0tcmVhZC1kZWxheSkKIyAgIC0tcHJv ZmlsZSAgICAgICAgICAgRW5hYmxlIHBlcmYgcHJvZmlsaW5nIGFuZCBmbGFtZWdyYXBoIGdlbmVy YXRpb24KIwojIEVudmlyb25tZW50OgojICAgV09SS1JPT1QgICAgICAgQmFzZSBkaXJlY3Rvcnkg KGRlZmF1bHQ6ICRIT01FL3BnX2JlbmNoKQojICAgUkVQUyAgICAgICAgICAgUmVwZXRpdGlvbnMg cGVyIHRlc3QgKGRlZmF1bHQ6IDUpCiMgICBTSVpFUyAgICAgICAgICBUYWJsZSBzaXplcyB0byB0 ZXN0IChkZWZhdWx0OiAibGFyZ2UiKQojICAgRkxBTUVHUkFQSF9ESVIgUGF0aCB0byBGbGFtZUdy YXBoIHRvb2xzIChkZWZhdWx0OiAkSE9NRS9GbGFtZUdyYXBoKQojICAgRE1fREVMQVlfREVWICAg ZG1fZGVsYXkgZGV2aWNlIG5hbWUgZm9yIC0tcmVhZC1kZWxheSAoZGVmYXVsdDogImRlbGF5ZWQi KQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpsb2coKSB7IHByaW50ZiAnXDAzM1sxOzM0bT09Plww MzNbMG0gJXNcbicgIiQqIjsgfQpkaWUoKSB7IHByaW50ZiAnXDAzM1sxOzMxbUVSUk9SOlwwMzNb MG0gJXNcbicgIiQqIiA+JjI7IGV4aXQgMTsgfQoKIyAtLS0gQ0xJIHBhcnNpbmcgLS0tCkNMRUFO PTAKQkFTRUxJTkU9MApET19QUk9GSUxFPTAKRElSRUNUX0lPPTAKSU9fREVMQVlfTVM9IiIKV1JJ VEVfREVMQVlfTVM9IjAiClRFU1Q9ImFsbCIKSU9fTUVUSE9EPSIke0lPX01FVEhPRDotaW9fdXJp bmd9IgpJT19XT1JLRVJTPSIke0lPX1dPUktFUlM6LTN9IgpJT19NQVhfQ09OQ1VSUkVOQ1k9IiR7 SU9fTUFYX0NPTkNVUlJFTkNZOi02NH0iCkRNX0RFTEFZX0RFVj0iJHtETV9ERUxBWV9ERVY6LWRl bGF5ZWR9IgpQQVRDSD0iIgoKd2hpbGUgW1sgJCMgLWd0IDAgXV07IGRvCiAgY2FzZSAiJDEiIGlu CiAgICAtLWNsZWFuKSAgICAgICAgICBDTEVBTj0xIDs7CiAgICAtLWJhc2VsaW5lKSAgICAgICBC QVNFTElORT0xIDs7CiAgICAtLXByb2ZpbGUpICAgICAgICBET19QUk9GSUxFPTEgOzsKICAgIC0t ZGlyZWN0LWlvKSAgICAgIERJUkVDVF9JTz0xIDs7CiAgICAtLXJlYWQtZGVsYXkpICAgICBJT19E RUxBWV9NUz0iJDIiOyBzaGlmdCA7OwogICAgLS13cml0ZS1kZWxheSkgICAgV1JJVEVfREVMQVlf TVM9IiQyIjsgc2hpZnQgOzsKICAgIC0tdGVzdCkgICAgICAgICAgIFRFU1Q9IiQyIjsgc2hpZnQg OzsKICAgIC0taW8tbWV0aG9kKSAgICAgIElPX01FVEhPRD0iJDIiOyBzaGlmdCA7OwogICAgLS1p by13b3JrZXJzKSAgICAgSU9fV09SS0VSUz0iJDIiOyBzaGlmdCA7OwogICAgLS1pby1jb25jdXJy ZW5jeSkgSU9fTUFYX0NPTkNVUlJFTkNZPSIkMiI7IHNoaWZ0IDs7CiAgICAtaHwtLWhlbHApICAg ICAgICBzZWQgLW4gJzMsMjdwJyAiJDAiIHwgc2VkICdzL14jIFw/Ly8nOyBleGl0IDAgOzsKICAg IC0qKSAgICAgICAgICAgICAgIGRpZSAiVW5rbm93biBvcHRpb246ICQxIiA7OwogICAgKikgICAg ICAgICAgICAgICAgUEFUQ0g9IiQxIiA7OwogIGVzYWMKICBzaGlmdApkb25lCgojIFZhbGlkYXRl IGlvX21ldGhvZApjYXNlICIkSU9fTUVUSE9EIiBpbgogIGlvX3VyaW5nfHdvcmtlcnxzeW5jKSA7 OwogICopIGRpZSAiSW52YWxpZCAtLWlvLW1ldGhvZDogJElPX01FVEhPRCAobXVzdCBiZSBpb191 cmluZywgd29ya2VyLCBvciBzeW5jKSIgOzsKZXNhYwoKIyBWYWxpZGF0ZSBkbV9kZWxheSBkZXZp Y2UgaWYgLS1yZWFkLWRlbGF5IGlzIHVzZWQKaWYgW1sgLW4gIiRJT19ERUxBWV9NUyIgXV07IHRo ZW4KICBjb21tYW5kIC12IGRtc2V0dXAgPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAiLS1yZWFkLWRl bGF5IHJlcXVpcmVzIGRtc2V0dXAgKHN1ZG8gYXB0IGluc3RhbGwgZG1zZXR1cCkiCiAgc3VkbyBk bXNldHVwIHN0YXR1cyAiJERNX0RFTEFZX0RFViIgPi9kZXYvbnVsbCAyPiYxIFwKICAgIHx8IGRp ZSAiZG1fZGVsYXkgZGV2aWNlICckRE1fREVMQVlfREVWJyBub3QgZm91bmQuIENyZWF0ZSBpdCBm aXJzdCwgZS5nLjpcbiAgdW1vdW50IC9zcnYgJiYgZG1zZXR1cCBjcmVhdGUgJERNX0RFTEFZX0RF ViAtLXRhYmxlIFwiMCBcJChibG9ja2RldiAtLWdldHN6IC9kZXYvREVWSUNFKSBkZWxheSAvZGV2 L0RFVklDRSAwICRJT19ERUxBWV9NU1wiICYmIG1vdW50IC9kZXYvbWFwcGVyLyRETV9ERUxBWV9E RVYgL3Nydi8iCmZpCgpbWyAteiAiJFBBVENIIiBdXSAmJiBkaWUgIlVzYWdlOiAkMCBbLS1jbGVh bl0gWy0tYmFzZWxpbmVdIFstLXRlc3QgVEVTVF0gPHBhdGNoPiIKW1sgISAtZiAiJFBBVENIIiBd XSAmJiBkaWUgIlBhdGNoIG5vdCBmb3VuZDogJFBBVENIIgpbWyAiJFBBVENIIiAhPSAvKiBdXSAm JiBQQVRDSD0iJFBXRC8kUEFUQ0giCgojIC0tLSBQcm9maWxpbmcgdmFsaWRhdGlvbiAtLS0KRkxB TUVHUkFQSF9ESVI9IiR7RkxBTUVHUkFQSF9ESVI6LSRIT01FL0ZsYW1lR3JhcGh9IgpQRVJGX1NV RE89IiR7UEVSRl9TVURPOi1zdWRvfSIKUEVSRl9FVkVOVD0iJHtQRVJGX0VWRU5UOi1jeWNsZXN9 IiAgIyBjeWNsZXMgPSB1c2VyK2tlcm5lbDsgY3ljbGVzOnUgPSB1c2VyLW9ubHkKaWYgW1sgJERP X1BST0ZJTEUgLWVxIDEgXV07IHRoZW4KICBjb21tYW5kIC12IHBlcmYgPi9kZXYvbnVsbCAyPiYx IHx8IGRpZSAiTmVlZCBwZXJmIChzdWRvIGFwdCBpbnN0YWxsIGxpbnV4LXRvb2xzLSQodW5hbWUg LXIpKSIKICBbWyAteCAiJEZMQU1FR1JBUEhfRElSL3N0YWNrY29sbGFwc2UtcGVyZi5wbCIgXV0g fHwgZGllICJNaXNzaW5nICRGTEFNRUdSQVBIX0RJUi9zdGFja2NvbGxhcHNlLXBlcmYucGwgKGdp dCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYnJlbmRhbmdyZWdnL0ZsYW1lR3JhcGgpIgogIFtb IC14ICIkRkxBTUVHUkFQSF9ESVIvZmxhbWVncmFwaC5wbCIgXV0gfHwgZGllICJNaXNzaW5nICRG TEFNRUdSQVBIX0RJUi9mbGFtZWdyYXBoLnBsIgpmaQoKIyAtLS0gQ29uZmlndXJhdGlvbiAtLS0K V09SS1JPT1Q9IiR7V09SS1JPT1Q6LSRIT01FL3BnX2JlbmNofSIKUkVQUz0iJHtSRVBTOi01fSIK U0laRVM9IiR7U0laRVM6LWxhcmdlfSIKClJPT1RfQkFTRT0iJFdPUktST09UL3ZhbmlsbGEiClBB VENIX1RBRz0kKGJhc2VuYW1lICIkUEFUQ0giIC5wYXRjaCB8IHRyIC1kYyAnWzphbG51bTpdXy0n IHwgY3V0IC1jMS00MCkKUk9PVF9QQVRDSD0iJFdPUktST09ULyRQQVRDSF9UQUciCgojIC0tLSBI ZWxwZXJzIC0tLQpwZygpIHsgZWNobyAiJDEvcGcvYmluLyQyIjsgfQoKcGlja19wb3J0KCkgewog IGZvciBwIGluICQoc2VxICIkezE6LTU0MzJ9IiA2MDAwMCk7IGRvCiAgICBsc29mIC1pVENQOiIk cCIgLXNUQ1A6TElTVEVOID4vZGV2L251bGwgMj4mMSB8fCB7IGVjaG8gIiRwIjsgcmV0dXJuOyB9 CiAgZG9uZQogIGRpZSAiTm8gZnJlZSBwb3J0IGZvdW5kIgp9CgpzZXRfaW9fZGVsYXkoKSB7CiAg bG9jYWwgbXM9IiQxIgogIFtbIC16ICIkSU9fREVMQVlfTVMiIF1dICYmIHJldHVybgogIGxvY2Fs IHRhYmxlIHNpemUgZGV2CiAgdGFibGU9JChzdWRvIGRtc2V0dXAgdGFibGUgIiRETV9ERUxBWV9E RVYiKQogIHNpemU9JChlY2hvICIkdGFibGUiIHwgYXdrICd7cHJpbnQgJDJ9JykKICBkZXY9JChl Y2hvICIkdGFibGUiIHwgYXdrICd7cHJpbnQgJDR9JykKICBsb2cgIlNldHRpbmcgZG1fZGVsYXkg b24gJERNX0RFTEFZX0RFViB0byAke21zfW1zIHJlYWQgLyAke1dSSVRFX0RFTEFZX01TfW1zIHdy aXRlIgogIHN1ZG8gZG1zZXR1cCBzdXNwZW5kICIkRE1fREVMQVlfREVWIgogIHN1ZG8gZG1zZXR1 cCByZWxvYWQgIiRETV9ERUxBWV9ERVYiIC0tdGFibGUgIjAgJHNpemUgZGVsYXkgJGRldiAwICRt cyAkZGV2IDAgJFdSSVRFX0RFTEFZX01TIgogIHN1ZG8gZG1zZXR1cCByZXN1bWUgIiRETV9ERUxB WV9ERVYiCn0KCiMgLS0tIEJ1aWxkIFBvc3RncmVTUUwgLS0tCmJ1aWxkX3BnKCkgewogIGxvY2Fs IFJPT1Q9IiQxIiBQQVRDSF9GSUxFPSIkezI6LX0iCiAgCiAgW1sgJENMRUFOIC1lcSAxIF1dICYm IHJtIC1yZiAiJFJPT1QiCiAgCiAgaWYgW1sgISAteCAiJChwZyAiJFJPT1QiIGluaXRkYikiIF1d OyB0aGVuCiAgICBsb2cgIkJ1aWxkaW5nIFBvc3RncmVTUUw6ICRST09UIgogICAgbWtkaXIgLXAg IiRST09UIgogICAgCiAgICBnaXQgY2xvbmUgLS1kZXB0aCAxIGh0dHBzOi8vZ2l0aHViLmNvbS9w b3N0Z3Jlcy9wb3N0Z3JlcyAiJFJPT1Qvc3JjIiAyPi9kZXYvbnVsbAogICAgY2QgIiRST09UL3Ny YyIKICAgIAogICAgW1sgLW4gIiRQQVRDSF9GSUxFIiBdXSAmJiB7IGxvZyAiQXBwbHlpbmcgcGF0 Y2giOyBnaXQgYXBwbHkgIiRQQVRDSF9GSUxFIjsgfQogICAgCiAgICAuL2NvbmZpZ3VyZSAtLXBy ZWZpeD0iJFJPT1QvcGciIC0td2l0aC1saWJ1cmluZyBcCiAgICAgIENGTEFHUz0nLU8yIC1nZ2Ri MyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlcicgPi9kZXYvbnVsbCAyPiYxCiAgICAKICAgIG1ha2Ug LWoiJChucHJvYykiIGluc3RhbGwgPi9kZXYvbnVsbCAyPiYxCiAgZWxzZQogICAgbG9nICJSZXVz aW5nIGJ1aWxkOiAkUk9PVCIKICAgIGNkICIkUk9PVC9zcmMiCiAgZmkKICAKICAjIEFsd2F5cyBp bnN0YWxsIGNvbnRyaWJzIChpZGVtcG90ZW50LCBjYXRjaGVzIHJldXNlZCBidWlsZHMgbWlzc2lu ZyBuZXcgZXh0ZW5zaW9ucykKICBtYWtlIC1DIGNvbnRyaWIvYmxvb20gaW5zdGFsbCA+L2Rldi9u dWxsIDI+JjEKICBtYWtlIC1DIGNvbnRyaWIvcGdzdGF0dHVwbGUgaW5zdGFsbCA+L2Rldi9udWxs IDI+JjEKICBtYWtlIC1DIGNvbnRyaWIvcGdfYnVmZmVyY2FjaGUgaW5zdGFsbCA+L2Rldi9udWxs IDI+JjEKICBtYWtlIC1DIGNvbnRyaWIvcGdfcHJld2FybSBpbnN0YWxsID4vZGV2L251bGwgMj4m MQp9CgojIC0tLSBDbHVzdGVyIG1hbmFnZW1lbnQgLS0tCmluaXRfY2x1c3RlcigpIHsKICBsb2Nh bCBST09UPSIkMSIgUE9SVD0iJDIiCiAgCiAgcm0gLXJmICIkUk9PVC9kYXRhIgogICIkKHBnICIk Uk9PVCIgaW5pdGRiKSIgLUQgIiRST09UL2RhdGEiIC0tbm8tbG9jYWxlID4vZGV2L251bGwgMj4m MQogIAogIGNhdCA+PiAiJFJPT1QvZGF0YS9wb3N0Z3Jlc3FsLmNvbmYiIDw8RU9GCnBvcnQgPSAk UE9SVApsaXN0ZW5fYWRkcmVzc2VzID0gJzEyNy4wLjAuMScKc2hhcmVkX2J1ZmZlcnMgPSAnMzJH QicKZWZmZWN0aXZlX2lvX2NvbmN1cnJlbmN5ID0gMjAwCmlvX21ldGhvZCA9ICRJT19NRVRIT0QK aW9fd29ya2VycyA9ICRJT19XT1JLRVJTCmlvX21heF9jb25jdXJyZW5jeSA9ICRJT19NQVhfQ09O Q1VSUkVOQ1kKdHJhY2tfaW9fdGltaW5nID0gb24KdHJhY2tfd2FsX2lvX3RpbWluZyA9IG9uCnN5 bmNocm9ub3VzX2NvbW1pdCA9IG9uCmF1dG92YWN1dW0gPSBvZmYKY2hlY2twb2ludF90aW1lb3V0 ID0gMWgKbWF4X3dhbF9zaXplID0gMTBHQgptYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVy ID0gMApFT0YKICAKICBbWyAkRElSRUNUX0lPIC1lcSAxIF1dICYmIGVjaG8gImRlYnVnX2lvX2Rp cmVjdCA9IGRhdGEiID4+ICIkUk9PVC9kYXRhL3Bvc3RncmVzcWwuY29uZiIKICAKICAiJChwZyAi JFJPT1QiIHBnX2N0bCkiIC1EICIkUk9PVC9kYXRhIiAtbCAiJFJPT1Qvc2VydmVyLmxvZyIgc3Rh cnQgLXcgPi9kZXYvbnVsbAogIAogIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAiQ1JFQVRF IEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIHBnX2J1ZmZlcmNhY2hlOyIKICBwc3FsX3J1biAiJFJP T1QiICIkUE9SVCIgLWMgIkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyBwZ19wcmV3YXJt OyIKfQoKc3RvcF9jbHVzdGVyKCkgewogIGxvY2FsIFJPT1Q9IiQxIgogICIkKHBnICIkUk9PVCIg cGdfY3RsKSIgLUQgIiRST09UL2RhdGEiIHN0b3AgLW0gZmFzdCAyPi9kZXYvbnVsbCB8fCB0cnVl Cn0KCmRyb3BfY2FjaGVzKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIKICBzaGlmdCAy CiAgbG9jYWwgcmVscz0oIiRAIikKICAKICAjIEV2aWN0IHRhcmdldCByZWxhdGlvbnMgZnJvbSBz aGFyZWQgYnVmZmVycyAobm8gUEcgcmVzdGFydCBuZWVkZWQpCiAgZm9yIHJlbCBpbiAiJHtyZWxz W0BdfSI7IGRvCiAgICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIlNFTEVDVCBwZ19idWZm ZXJjYWNoZV9ldmljdF9yZWxhdGlvbignJHtyZWx9Jzo6cmVnY2xhc3MpOyIgPi9kZXYvbnVsbAog IGRvbmUKICAKICAjIERyb3AgT1MgcGFnZSBjYWNoZSAoc2tpcCB3aXRoIGRpcmVjdCBJTyDigJQg bm8gcGFnZSBjYWNoZSBpbnZvbHZlZCkKICBpZiBbWyAkRElSRUNUX0lPIC1lcSAwIF1dOyB0aGVu CiAgICBzeW5jCiAgICBlY2hvIDMgfCBzdWRvIHRlZSAvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMg Pi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDIKICBmaQp9Cgpwc3FsX3J1bigpIHsK ICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiCiAgc2hpZnQgMgogICIkKHBnICIkUk9PVCIgcHNx bCkiIC1oIDEyNy4wLjAuMSAtcCAiJFBPUlQiIC1kIHBvc3RncmVzIC12IE9OX0VSUk9SX1NUT1A9 MSAtQXRxICIkQCIKfQoKIyAtLS0gVGltaW5nIC0tLQpydW5fdGltZWQoKSB7CiAgbG9jYWwgUk9P VD0iJDEiIFBPUlQ9IiQyIiBTUUw9IiQzIgogIGxvY2FsIG1zCiAgIyAtWDogaWdub3JlIC5wc3Fs cmMsIC12IE9OX0VSUk9SX1NUT1A9MTogZmFpbCBvbiBTUUwgZXJyb3JzCiAgIyBQYXJzZSBsYXN0 IFRpbWU6IGxpbmUsIGhhbmRsZSBib3RoICJtcyIgYW5kICJzIiB1bml0cwogIG1zPSQoIiQocGcg IiRST09UIiBwc3FsKSIgLWggMTI3LjAuMC4xIC1wICIkUE9SVCIgLWQgcG9zdGdyZXMgLVggLXYg T05fRVJST1JfU1RPUD0xIC1BdCBcCiAgICAtYyAnXHRpbWluZyBvbicgLWMgIiRTUUwiIDI+JjEg fCBcCiAgICBhd2sgJwogICAgICAvVGltZTovIHsKICAgICAgICB2YWw9JDI7IHVuaXQ9JDM7CiAg ICAgICAgaWYgKHVuaXQ9PSJtcyIpIG1zPXZhbDsKICAgICAgICBlbHNlIGlmICh1bml0PT0icyIp IG1zPXZhbCoxMDAwOwogICAgICB9CiAgICAgIEVORCB7IGlmIChtcz09IiIpIGV4aXQgMTsgcHJp bnRmICIlLjNmXG4iLCBtczsgfQogICAgJykKICAjIFZhbGlkYXRlIG51bWVyaWMgb3V0cHV0CiAg W1sgIiRtcyIgPX4gXlswLTldKyhcLlswLTldKyk/JCBdXSB8fCB7IGVjaG8gIkVSUk9SOiBOb24t bnVtZXJpYyB0aW1pbmc6ICRtcyIgPiYyOyByZXR1cm4gMTsgfQogIGVjaG8gIiRtcyIKfQoKIyAt LS0gSS9PIFN0YXRzIC0tLQojIFJ1biBTUUwgYW5kIGNhcHR1cmUgdGltaW5nICsgSS9PIHN0YXRz IGZyb20gcGdfc3RhdF9pbwojIFJlc2V0cyBzdGF0cyBiZWZvcmUgcXVlcnksIHdhaXRzIGZvciBm bHVzaCwgdGhlbiByZWFkcyBhYnNvbHV0ZSB2YWx1ZXMKIyBOb3RlOiBwZ19zdGF0X2lvIGhhcyBQ R1NUQVRfTUlOX0lOVEVSVkFMPTEwMDBtcyBmbHVzaCBkZWxheSwgc28gd2Ugd2FpdCAxLjVzCiMg ICAgICAgYWZ0ZXIgdGhlIHF1ZXJ5IHRvIGVuc3VyZSBzdGF0cyBhcmUgZmx1c2hlZCB0byBzaGFy ZWQgbWVtb3J5LgojIE5vdGU6IHBnX3N0YXRfaW8gY291bnRzIEkvTyBvcGVyYXRpb25zLCBub3Qg cGFnZXMgKHdpdGggaW9fY29tYmluZV9saW1pdD0xMjhrQiwKIyAgICAgICB1cCB0byAxNiBwYWdl cyBwZXIgb3BlcmF0aW9uKS4gVGhpcyBpcyBleHBlY3RlZCBiZWhhdmlvci4KIyBSZXR1cm5zOiBt cyxyZWFkcyxyZWFkX3RpbWUsd3JpdGVzLHdyaXRlX3RpbWUKcnVuX3RpbWVkX3dpdGhfaW8oKSB7 CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBTUUw9IiQzIgogIGxvY2FsIHJlc3VsdAogIAog ICMgUmVzZXQgc3RhdHMsIHJ1biBxdWVyeSwgd2FpdCBmb3IgZmx1c2gsIHJlYWQgYWJzb2x1dGUg dmFsdWVzCiAgIyAtIEZpbHRlciBieSBjbGllbnQgYmFja2VuZCBhbmQgaW8gd29ya2VyIChleGNs dWRlcyBiZ3dyaXRlci9jaGVja3BvaW50ZXIpCiAgIyAtIDEuNXMgZGVsYXkgYWxsb3dzIHN0YXRz IHRvIGZsdXNoIChQR1NUQVRfTUlOX0lOVEVSVkFMPTEwMDBtcykKICByZXN1bHQ9JCgiJChwZyAi JFJPT1QiIHBzcWwpIiAtaCAxMjcuMC4wLjEgLXAgIiRQT1JUIiAtZCBwb3N0Z3JlcyAtWCAtdiBP Tl9FUlJPUl9TVE9QPTEgPDxFT1NRTApTRUxFQ1QgcGdfc3RhdF9yZXNldF9zaGFyZWQoJ2lvJyk7 ClxcdGltaW5nIG9uCiRTUUwKXFx0aW1pbmcgb2ZmClNFTEVDVCBwZ19zbGVlcCgxLjUpOwpcXHQg b24KU0VMRUNUIAogIENPQUxFU0NFKFNVTShyZWFkcyksMCk6OmJpZ2ludCwKICBDT0FMRVNDRShT VU0ocmVhZF90aW1lKSwwKTo6bnVtZXJpYygxMiwyKSwKICBDT0FMRVNDRShTVU0od3JpdGVzKSww KTo6YmlnaW50LAogIENPQUxFU0NFKFNVTSh3cml0ZV90aW1lKSwwKTo6bnVtZXJpYygxMiwyKQpG Uk9NIHBnX3N0YXRfaW8gCldIRVJFIG9iamVjdCA9ICdyZWxhdGlvbicgQU5EIGJhY2tlbmRfdHlw ZSBJTiAoJ2NsaWVudCBiYWNrZW5kJywgJ2lvIHdvcmtlcicpOwpFT1NRTAogIDI+JjEpCiAgCiAg IyBQYXJzZSB0aW1pbmcgKGxhc3QgVGltZTogbGluZSkKICBsb2NhbCBtcwogIG1zPSQoZWNobyAi JHJlc3VsdCIgfCBhd2sgJwogICAgL1RpbWU6LyB7CiAgICAgIHZhbD0kMjsgdW5pdD0kMzsKICAg ICAgaWYgKHVuaXQ9PSJtcyIpIG1zPXZhbDsKICAgICAgZWxzZSBpZiAodW5pdD09InMiKSBtcz12 YWwqMTAwMDsKICAgIH0KICAgIEVORCB7IGlmIChtcz09IiIpIGV4aXQgMTsgcHJpbnRmICIlLjNm XG4iLCBtczsgfQogICcpCiAgCiAgIyBQYXJzZSBJL08gc3RhdHMgKGxhc3Qgbm9uLWVtcHR5IGxp bmUgd2l0aCBwaXBlIHNlcGFyYXRvcjogcmVhZHN8cmVhZF90aW1lfHdyaXRlc3x3cml0ZV90aW1l KQogIGxvY2FsIHJlYWRzIHJlYWRfdGltZSB3cml0ZXMgd3JpdGVfdGltZQogIGxvY2FsIGlvX2xp bmUKICBpb19saW5lPSQoZWNobyAiJHJlc3VsdCIgfCBncmVwICd8JyB8IHRhaWwgLTEpCiAgcmVh ZHM9JChlY2hvICIkaW9fbGluZSIgICAgIHwgY3V0IC1kJ3wnIC1mMSB8IHRyIC1kICcgJykKICBy ZWFkX3RpbWU9JChlY2hvICIkaW9fbGluZSIgIHwgY3V0IC1kJ3wnIC1mMiB8IHRyIC1kICcgJykK ICB3cml0ZXM9JChlY2hvICIkaW9fbGluZSIgICAgfCBjdXQgLWQnfCcgLWYzIHwgdHIgLWQgJyAn KQogIHdyaXRlX3RpbWU9JChlY2hvICIkaW9fbGluZSIgfCBjdXQgLWQnfCcgLWY0IHwgdHIgLWQg JyAnKQogIAogICMgRGVmYXVsdCB0byAwIGlmIG5vdCBmb3VuZAogIFtbICIkcmVhZHMiICAgICAg PX4gXi0/WzAtOV0rJCAgICAgICAgICAgICBdXSB8fCByZWFkcz0wCiAgW1sgIiRyZWFkX3RpbWUi ICA9fiBeLT9bMC05XSsoXC5bMC05XSspPyQgXV0gfHwgcmVhZF90aW1lPTAKICBbWyAiJHdyaXRl cyIgICAgID1+IF4tP1swLTldKyQgICAgICAgICAgICAgXV0gfHwgd3JpdGVzPTAKICBbWyAiJHdy aXRlX3RpbWUiID1+IF4tP1swLTldKyhcLlswLTldKyk/JCBdXSB8fCB3cml0ZV90aW1lPTAKICAK ICBlY2hvICIkbXMsJHJlYWRzLCRyZWFkX3RpbWUsJHdyaXRlcywkd3JpdGVfdGltZSIKfQoKIyAt LS0gU3RhdGlzdGljcyAtLS0KY2FsY19tZWRpYW4oKSB7CiAgYXdrIC1GLCAnTlI+MXthWysrbl09 JDJ9RU5EewogICAgaWYobj09MCl7cHJpbnQgMDsgZXhpdH0KICAgIGZvcihpPTE7aTw9bjtpKysp Zm9yKGo9aSsxO2o8PW47aisrKWlmKGFbaV0+YVtqXSl7dD1hW2ldO2FbaV09YVtqXTthW2pdPXR9 CiAgICBwcmludCAobiUyKT9hW2ludChuLzIpKzFdOihhW24vMl0rYVtuLzIrMV0pLzIKICB9JyAi JDEiCn0KCmNhbGNfbWVkaWFuX2NvbCgpIHsKICBsb2NhbCBmaWxlPSIkMSIgY29sPSIkMiIKICBh d2sgLUYsIC12IGNvbD0iJGNvbCIgJ05SPjF7YVsrK25dPSRjb2x9RU5EewogICAgaWYobj09MCl7 cHJpbnQgMDsgZXhpdH0KICAgIGZvcihpPTE7aTw9bjtpKyspZm9yKGo9aSsxO2o8PW47aisrKWlm KGFbaV0+YVtqXSl7dD1hW2ldO2FbaV09YVtqXTthW2pdPXR9CiAgICBwcmludCAobiUyKT9hW2lu dChuLzIpKzFdOihhW24vMl0rYVtuLzIrMV0pLzIKICB9JyAiJGZpbGUiCn0KCmNhbGNfc3RhdHMo KSB7CiAgbG9jYWwgY3N2PSIkMSIKICBhd2sgLUYsICdOUj4xe2FbKytuXT0kMjtzKz0kMn1FTkR7 CiAgICBpZihuPT0wKWV4aXQKICAgIGZvcihpPTE7aTw9bjtpKyspZm9yKGo9aSsxO2o8PW47aisr KWlmKGFbaV0+YVtqXSl7dD1hW2ldO2FbaV09YVtqXTthW2pdPXR9CiAgICBtZWQ9KG4lMik/YVtp bnQobi8yKSsxXTooYVtuLzJdK2Fbbi8yKzFdKS8yCiAgICBhdmc9cy9uOyBmb3IoaT0xO2k8PW47 aSsrKXNzKz0oYVtpXS1hdmcpXjI7IHNkPXNxcnQoc3MvbikKICAgIHByaW50ZiAibWVkaWFuPSUu MWZtcyBtZWFuPSUuMWbCsSUuMWZtcyBuPSVkIiwgbWVkLCBhdmcsIHNkLCBuCiAgfScgIiRjc3Yi Cn0KCiMgLS0tIFByb2ZpbGluZyAtLS0KIyBSdW4gYSBTUUwgY29tbWFuZCB1bmRlciBwZXJmLCBh dHRhY2hpbmcgdG8gdGhlIGJhY2tlbmQgUElELgojIEdlbmVyYXRlcyBwZXJmLmRhdGEgYW5kIGZs YW1lZ3JhcGggU1ZHLgojICAgcHJvZmlsZV9zcWwgUk9PVCBQT1JUIExBQkVMIFNRTApwcm9maWxl X3NxbCgpIHsKICBbWyAkRE9fUFJPRklMRSAtbmUgMSBdXSAmJiByZXR1cm4KICAKICBsb2NhbCBS T09UPSIkMSIgUE9SVD0iJDIiIExBQkVMPSIkMyIgU1FMPSIkNCIKICBsb2NhbCBQUk9GX0RJUj0i JFJPT1QvcHJvZmlsZSIKICBta2RpciAtcCAiJFBST0ZfRElSIgogIAogIGxvY2FsIFBFUkZfREFU QT0iJFBST0ZfRElSLyR7TEFCRUx9LnBlcmYuZGF0YSIKICBsb2NhbCBTVkc9IiRQUk9GX0RJUi8k e0xBQkVMfS5zdmciCiAgbG9jYWwgcHNxbF9iaW4KICBwc3FsX2Jpbj0iJChwZyAiJFJPT1QiIHBz cWwpIgogIAogICMgVXNlIGEgdW5pcXVlIGFwcGxpY2F0aW9uX25hbWUgdG8gZmluZCB0aGUgYmFj a2VuZCBQSUQKICBsb2NhbCBBUFA9InByb2ZfJHtMQUJFTH1fJCQiCiAgCiAgIyBMYXVuY2ggYSBw c3FsIHNlc3Npb24gdGhhdCB3aWxsIGZpcnN0IGlkZW50aWZ5IGl0c2VsZiwgdGhlbiBydW4gdGhl IFNRTAogICMgVGhlIHBnX3NsZWVwKCkgZ2l2ZXMgdXMgdGltZSB0byBmaW5kIHRoZSBiYWNrZW5k IFBJRCBhbmQgYXR0YWNoIHBlcmYKICBQR0FQUE5BTUU9IiRBUFAiICIkcHNxbF9iaW4iIC1oIDEy Ny4wLjAuMSAtcCAiJFBPUlQiIC1kIHBvc3RncmVzIFwKICAgIC1YIC12IE9OX0VSUk9SX1NUT1A9 MSA8PEVPU1FMID4vZGV2L251bGwgMj4mMSAmClNFTEVDVCBwZ19zbGVlcCgyKTsKJFNRTApFT1NR TAogIGxvY2FsIFFVRVJZX1NIRUxMX1BJRD0kIQogIAogICMgRmluZCB0aGUgYmFja2VuZCBQSUQg dmlhIHBnX3N0YXRfYWN0aXZpdHkKICBsb2NhbCBCQUNLRU5EX1BJRD0iIgogIGZvciAoKG49MDsg bjwxMDA7IG4rKykpOyBkbwogICAgQkFDS0VORF9QSUQ9JCgiJHBzcWxfYmluIiAtaCAxMjcuMC4w LjEgLXAgIiRQT1JUIiAtZCBwb3N0Z3JlcyAtQXRxIFwKICAgICAgLWMgIlNFTEVDVCBwaWQgRlJP TSBwZ19zdGF0X2FjdGl2aXR5IFdIRVJFIGFwcGxpY2F0aW9uX25hbWU9JyR7QVBQfScgT1JERVIg QlkgYmFja2VuZF9zdGFydCBERVNDIExJTUlUIDE7IiAyPi9kZXYvbnVsbCkKICAgIFtbIC1uICIk QkFDS0VORF9QSUQiICYmIC1kICIvcHJvYy8kQkFDS0VORF9QSUQiIF1dICYmIGJyZWFrCiAgICBz bGVlcCAwLjA1CiAgZG9uZQogIAogIGlmIFtbIC16ICIkQkFDS0VORF9QSUQiIHx8ICEgLWQgIi9w cm9jLyRCQUNLRU5EX1BJRCIgXV07IHRoZW4KICAgIGxvZyAiV0FSTklORzogQ291bGQgbm90IGZp bmQgYmFja2VuZCBQSUQgZm9yIHByb2ZpbGluZywgc2tpcHBpbmciCiAgICB3YWl0ICIkUVVFUllf U0hFTExfUElEIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICByZXR1cm4KICBmaQogIAogIGxvZyAi UHJvZmlsaW5nIGJhY2tlbmQgUElEICRCQUNLRU5EX1BJRCDihpIgJFBFUkZfREFUQSIKICAKICAj IEF0dGFjaCBwZXJmIHRvIHRoZSBiYWNrZW5kOyB3ZSBleHBsaWNpdGx5IGtpbGwgLUlOVCBpdCBh ZnRlciB0aGUgcXVlcnkgZmluaXNoZXMKICAkUEVSRl9TVURPIHBlcmYgcmVjb3JkIC1nIC0tY2Fs bC1ncmFwaCBkd2FyZiBcCiAgICAtcCAiJEJBQ0tFTkRfUElEIiAtbyAiJFBFUkZfREFUQSIgXAog ICAgLS1ldmVudD0iJFBFUkZfRVZFTlQiIDI+L2Rldi9udWxsICYKICBsb2NhbCBQRVJGX1BJRD0k IQogIHNsZWVwIDAuMQogIAogICMgVmVyaWZ5IHBlcmYgYWN0dWFsbHkgc3RhcnRlZCAocGVybWlz c2lvbnMsIHZhbGlkIFBJRCwgZXRjLikKICBpZiAhIGtpbGwgLTAgIiRQRVJGX1BJRCIgMj4vZGV2 L251bGw7IHRoZW4KICAgIGxvZyAiV0FSTklORzogcGVyZiByZWNvcmQgZmFpbGVkIHRvIHN0YXJ0 IChwZXJtaXNzaW9ucy9jb25maWc/KSwgc2tpcHBpbmcgZmxhbWVncmFwaCIKICAgIHdhaXQgIiRR VUVSWV9TSEVMTF9QSUQiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIHJldHVybgogIGZpCiAgCiAg IyBXYWl0IGZvciB0aGUgcXVlcnkgdG8gZmluaXNoCiAgd2FpdCAiJFFVRVJZX1NIRUxMX1BJRCIg Mj4vZGV2L251bGwgfHwgdHJ1ZQogIAogICMgR2l2ZSBwZXJmIGEgbW9tZW50IHRvIGZsdXNoLCB0 aGVuIHN0b3AgaXQKICBzbGVlcCAwLjUKICAkUEVSRl9TVURPIGtpbGwgLUlOVCAiJFBFUkZfUElE IiAyPi9kZXYvbnVsbCB8fCB0cnVlOyB3YWl0ICIkUEVSRl9QSUQiIDI+L2Rldi9udWxsIHx8IHRy dWUKICAKICAjIEdlbmVyYXRlIGZsYW1lZ3JhcGgKICBnZW5lcmF0ZV9mbGFtZWdyYXBoICIkUEVS Rl9EQVRBIiAiJFNWRyIgIiRMQUJFTCIKfQoKIyBDb252ZXJ0IHBlcmYuZGF0YSDihpIgZmxhbWVn cmFwaCBTVkcKIyAgIGdlbmVyYXRlX2ZsYW1lZ3JhcGggUEVSRl9EQVRBIFNWR19QQVRIIFRJVExF CmdlbmVyYXRlX2ZsYW1lZ3JhcGgoKSB7CiAgbG9jYWwgUEVSRl9EQVRBPSIkMSIgU1ZHPSIkMiIg VElUTEU9IiQzIgogIAogIFtbIC1mICIkUEVSRl9EQVRBIiBdXSB8fCByZXR1cm4KICAKICBsb2Nh bCBGT0xERUQ9IiR7UEVSRl9EQVRBJS5wZXJmLmRhdGF9LmZvbGRlZCIKICBpZiAkUEVSRl9TVURP IHBlcmYgc2NyaXB0IC1pICIkUEVSRl9EQVRBIiAyPi9kZXYvbnVsbCBcCiAgICAgIHwgIiRGTEFN RUdSQVBIX0RJUi9zdGFja2NvbGxhcHNlLXBlcmYucGwiID4gIiRGT0xERUQiIDI+L2Rldi9udWxs IFwKICAgICAgJiYgW1sgLXMgIiRGT0xERUQiIF1dOyB0aGVuCiAgICAiJEZMQU1FR1JBUEhfRElS L2ZsYW1lZ3JhcGgucGwiIC0tdGl0bGUgIiRUSVRMRSIgLS1jb3VudG5hbWUgc2FtcGxlcyBcCiAg ICAgICIkRk9MREVEIiA+ICIkU1ZHIiAyPi9kZXYvbnVsbAogICAgbG9nICJGbGFtZWdyYXBoOiAk U1ZHIgogICAgcm0gLWYgIiRGT0xERUQiCiAgZWxzZQogICAgbG9nICJXQVJOSU5HOiBGYWlsZWQg dG8gZ2VuZXJhdGUgZmxhbWVncmFwaCBmb3IgJFRJVExFIgogICAgcm0gLWYgIiRGT0xERUQiCiAg ZmkKfQoKIyAtLS0gQmVuY2htYXJrIHJ1bm5lciAtLS0KIyBiZW5jaG1hcmsgUk9PVCBQT1JUIE5B TUUgU1FMIFJFTEFUSU9OIFtSRUxBVElPTi4uLl0KYmVuY2htYXJrKCkgewogIGxvY2FsIFJPT1Q9 IiQxIiBQT1JUPSIkMiIgTkFNRT0iJDMiIFNRTD0iJDQiCiAgc2hpZnQgNAogIGxvY2FsIHJlbHM9 KCIkQCIpCiAgbG9jYWwgT1VUPSIkUk9PVC9yZXN1bHRzLyR7TkFNRX0uY3N2IgogIAogIG1rZGly IC1wICIkUk9PVC9yZXN1bHRzIgogIGVjaG8gInJ1bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMsd3Jp dGVzLHdyaXRlX3RpbWVfbXMiID4gIiRPVVQiCiAgCiAgZm9yICgoaT0xOyBpPD1SRVBTOyBpKysp KTsgZG8KICAgIGRyb3BfY2FjaGVzICIkUk9PVCIgIiRQT1JUIiAiJHtyZWxzW0BdfSIKICAgIGxv Y2FsIHJlc3VsdCBtcyByZWFkcyByZWFkX3RpbWUgd3JpdGVzIHdyaXRlX3RpbWUKICAgIHJlc3Vs dD0kKHJ1bl90aW1lZF93aXRoX2lvICIkUk9PVCIgIiRQT1JUIiAiJFNRTCIpCiAgICBJRlM9Jywn IHJlYWQgLXIgbXMgcmVhZHMgcmVhZF90aW1lIHdyaXRlcyB3cml0ZV90aW1lIDw8PCIkcmVzdWx0 IgogICAgZWNobyAiJGksJG1zLCRyZWFkcywkcmVhZF90aW1lLCR3cml0ZXMsJHdyaXRlX3RpbWUi ID4+ICIkT1VUIgogICAgbG9nICIkTkFNRSBbJGkvJFJFUFNdOiAke21zfW1zIChyZWFkcz0kcmVh ZHMsIHJlYWRfdGltZT0ke3JlYWRfdGltZX1tcywgd3JpdGVzPSR3cml0ZXMsIHdyaXRlX3RpbWU9 JHt3cml0ZV90aW1lfW1zKSIKICBkb25lCn0KCiMgLS0tIERhdGEgc2V0dXAgZnVuY3Rpb25zIC0t LQpzZXR1cF9ibG9vbSgpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIFNJWkU9IiQzIgog IGxvY2FsIE5ST1dTCiAgY2FzZSAiJFNJWkUiIGluCiAgICBzbWFsbCkgIE5ST1dTPTEwMDAwMCA7 OwogICAgbWVkaXVtKSBOUk9XUz0xMDAwMDAwIDs7CiAgICBsYXJnZSkgIE5ST1dTPTEwMDAwMDAw IDs7CiAgZXNhYwogIAogIGxvZyAiQ3JlYXRpbmcgQmxvb20gdGVzdCBkYXRhICgkU0laRTogJE5S T1dTIHJvd3MpIgogIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiA8PFNRTApDUkVBVEUgRVhURU5T SU9OIElGIE5PVCBFWElTVFMgYmxvb207CkRST1AgVEFCTEUgSUYgRVhJU1RTIGJsb29tX3Rlc3Q7 CkNSRUFURSBUQUJMRSBibG9vbV90ZXN0IChpZCBJTlQsIGRhdGEgVEVYVCwgdmFsMSBJTlQsIHZh bDIgSU5UKTsKSU5TRVJUIElOVE8gYmxvb21fdGVzdCBTRUxFQ1QgaSwgJ2RhdGFfJ3x8aSwgaSUx MDAwLCBpJTEwMCBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCROUk9XUykgaTsKQ1JFQVRFIElOREVY IGJsb29tX2lkeCBPTiBibG9vbV90ZXN0IFVTSU5HIGJsb29tICh2YWwxLCB2YWwyKTsKVkFDVVVN IEFOQUxZWkUgYmxvb21fdGVzdDsKQ0hFQ0tQT0lOVDsKU1FMCn0KCnNldHVwX3Bnc3RhdHR1cGxl KCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgU0laRT0iJDMiCiAgbG9jYWwgTlJPV1MK ICBjYXNlICIkU0laRSIgaW4KICAgIHNtYWxsKSAgTlJPV1M9MTAwMDAwIDs7CiAgICBtZWRpdW0p IE5ST1dTPTEwMDAwMDAgOzsKICAgIGxhcmdlKSAgTlJPV1M9MTAwMDAwMDAgOzsKICBlc2FjCiAg CiAgbG9nICJDcmVhdGluZyBwZ3N0YXR0dXBsZSB0ZXN0IGRhdGEgKCRTSVpFOiAkTlJPV1Mgcm93 cykiCiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIDw8U1FMCkNSRUFURSBFWFRFTlNJT04gSUYg Tk9UIEVYSVNUUyBwZ3N0YXR0dXBsZTsKRFJPUCBUQUJMRSBJRiBFWElTVFMgaGVhcF90ZXN0OwpD UkVBVEUgVEFCTEUgaGVhcF90ZXN0IChpZCBTRVJJQUwgUFJJTUFSWSBLRVksIGRhdGEgVEVYVCk7 CklOU0VSVCBJTlRPIGhlYXBfdGVzdCAoZGF0YSkgU0VMRUNUIHJlcGVhdCgneCcsMTAwKSBGUk9N IGdlbmVyYXRlX3NlcmllcygxLCROUk9XUyk7ClZBQ1VVTSBBTkFMWVpFIGhlYXBfdGVzdDsKQ0hF Q0tQT0lOVDsKU1FMCn0KCnNldHVwX3Bnc3RhdGluZGV4KCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQ T1JUPSIkMiIgU0laRT0iJDMiCiAgbG9jYWwgTlJPV1MKICBjYXNlICIkU0laRSIgaW4KICAgIHNt YWxsKSAgTlJPV1M9MTAwMDAwIDs7CiAgICBtZWRpdW0pIE5ST1dTPTEwMDAwMDAgOzsKICAgIGxh cmdlKSAgTlJPV1M9MTAwMDAwMDAgOzsKICBlc2FjCiAgCiAgbG9nICJDcmVhdGluZyBwZ3N0YXRp bmRleCB0ZXN0IGRhdGEgKCRTSVpFOiAkTlJPV1Mgcm93cykiCiAgcHNxbF9ydW4gIiRST09UIiAi JFBPUlQiIDw8U1FMCkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyBwZ3N0YXR0dXBsZTsK RFJPUCBUQUJMRSBJRiBFWElTVFMgaWR4X3Rlc3Q7CkNSRUFURSBUQUJMRSBpZHhfdGVzdCAoaWQg U0VSSUFMIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOwpJTlNFUlQgSU5UTyBpZHhfdGVzdCAoZGF0 YSkgU0VMRUNUICdkYXRhX3Jvd18nIHx8IGkgfHwgJ18nIHx8IHJlcGVhdCgneCcsNTApIEZST00g Z2VuZXJhdGVfc2VyaWVzKDEsJE5ST1dTKSBpOwpWQUNVVU0gQU5BTFlaRSBpZHhfdGVzdDsKQ0hF Q0tQT0lOVDsKU1FMCn0KCnNldHVwX2dpbigpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIi IFNJWkU9IiQzIgogIGxvY2FsIE5ST1dTCiAgY2FzZSAiJFNJWkUiIGluCiAgICBzbWFsbCkgIE5S T1dTPTEwMDAwMCA7OwogICAgbWVkaXVtKSBOUk9XUz0xMDAwMDAwIDs7CiAgICBsYXJnZSkgIE5S T1dTPTUwMDAwMDAgOzsKICBlc2FjCiAgCiAgbG9nICJDcmVhdGluZyBHSU4gdGVzdCBkYXRhICgk U0laRTogJE5ST1dTIHJvd3MpIgogIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiA8PFNRTApEUk9Q IFRBQkxFIElGIEVYSVNUUyBnaW5fdGVzdDsKLS0gTm8gUFJJTUFSWSBLRVk6IGlzb2xhdGUgR0lO IGluZGV4IHZhY3V1bSBmcm9tIGJ0cmVlIG92ZXJoZWFkCkNSRUFURSBUQUJMRSBnaW5fdGVzdCAo aWQgSU5ULCB0YWdzIFRFWFRbXSk7CklOU0VSVCBJTlRPIGdpbl90ZXN0IChpZCwgdGFncykKU0VM RUNUIGksIEFSUkFZKFNFTEVDVCAndGFnXyd8fChyYW5kb20oKSoxMDApOjppbnQgRlJPTSBnZW5l cmF0ZV9zZXJpZXMoMSw1KSkKRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwkTlJPV1MpIGk7CkNSRUFU RSBJTkRFWCBnaW5faWR4IE9OIGdpbl90ZXN0IFVTSU5HIGdpbiAodGFncyk7ClZBQ1VVTSBBTkFM WVpFIGdpbl90ZXN0OwpDSEVDS1BPSU5UOwpTUUwKfQoKc2V0dXBfaGFzaCgpIHsKICBsb2NhbCBS T09UPSIkMSIgUE9SVD0iJDIiIFNJWkU9IiQzIgogIGxvY2FsIE5ST1dTCiAgY2FzZSAiJFNJWkUi IGluCiAgICBzbWFsbCkgIE5ST1dTPTUwMDAwMCA7OwogICAgbWVkaXVtKSBOUk9XUz01MDAwMDAw IDs7CiAgICBsYXJnZSkgIE5ST1dTPTIwMDAwMDAwIDs7CiAgZXNhYwogIAogIGxvZyAiQ3JlYXRp bmcgSGFzaCB0ZXN0IGRhdGEgKCRTSVpFOiAkTlJPV1MgdW5pcXVlIHZhbHVlcykiCiAgcHNxbF9y dW4gIiRST09UIiAiJFBPUlQiIDw8U1FMCkRST1AgVEFCTEUgSUYgRVhJU1RTIGhhc2hfdGVzdDsK LS0gTm8gUFJJTUFSWSBLRVk6IGlzb2xhdGUgaGFzaCBpbmRleCB2YWN1dW0gZnJvbSBidHJlZSBv dmVyaGVhZApDUkVBVEUgVEFCTEUgaGFzaF90ZXN0IChpZCBJTlQsIGRhdGEgVEVYVCk7CklOU0VS VCBJTlRPIGhhc2hfdGVzdCBTRUxFQ1QgaSwgJ3gnIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsJE5S T1dTKSBpOwpDUkVBVEUgSU5ERVggaGFzaF9pZHggT04gaGFzaF90ZXN0IFVTSU5HIGhhc2ggKGlk KTsKVkFDVVVNIEFOQUxZWkUgaGFzaF90ZXN0OwpDSEVDS1BPSU5UOwpTUUwKfQoKc2V0dXBfd2Fs KCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgU0laRT0iJDMiCiAgbG9jYWwgTlJPV1MK ICBjYXNlICIkU0laRSIgaW4KICAgIHNtYWxsKSAgTlJPV1M9MTAwMDAwMCA7OwogICAgbWVkaXVt KSBOUk9XUz01MDAwMDAwIDs7CiAgICBsYXJnZSkgIE5ST1dTPTIwMDAwMDAwIDs7CiAgZXNhYwog IAogIGxvZyAiQ3JlYXRpbmcgdGFibGUgZm9yIEdJTiBpbmRleCBidWlsZCAvIGxvZ19uZXdwYWdl X3JhbmdlIHRlc3QgKCRTSVpFOiAkTlJPV1Mgcm93cykiCiAgcHNxbF9ydW4gIiRST09UIiAiJFBP UlQiIDw8U1FMCkRST1AgVEFCTEUgSUYgRVhJU1RTIHdhbF90ZXN0OwotLSBUYWJsZSB3aXRoIHRz dmVjdG9yIGNvbHVtbiBmb3IgR0lOIGluZGV4aW5nIChmdWxsLXRleHQgc2VhcmNoKQotLSBHSU4g aW5kZXggYnVpbGRzIGFsd2F5cyBjYWxsIGxvZ19uZXdwYWdlX3JhbmdlKCkgYXQgdGhlIGVuZCBv ZgotLSBnaW5idWlsZCgpIChnaW5pbnNlcnQuYykgdG8gV0FMLWxvZyBhbGwgaW5kZXggcGFnZXMu IApDUkVBVEUgVEFCTEUgd2FsX3Rlc3QgKGlkIElOVCwgZG9jIFRFWFQsIGRvY190c3YgVFNWRUNU T1IpOwpJTlNFUlQgSU5UTyB3YWxfdGVzdAogIFNFTEVDVCBpLAogICAgICAgICAnd29yZCcgfHwg KHJhbmRvbSgpKjEwMDAwKTo6aW50IHx8ICcgdGVybScgfHwgKHJhbmRvbSgpKjEwMDAwKTo6aW50 CiAgICAgICAgICAgfHwgJyB0b2tlbicgfHwgKHJhbmRvbSgpKjUwMDApOjppbnQgfHwgJyBwaHJh c2UnIHx8IChyYW5kb20oKSo4MDAwKTo6aW50LAogICAgICAgICB0b190c3ZlY3Rvcignc2ltcGxl JywKICAgICAgICAgICAnd29yZCcgfHwgKHJhbmRvbSgpKjEwMDAwKTo6aW50IHx8ICcgdGVybScg fHwgKHJhbmRvbSgpKjEwMDAwKTo6aW50CiAgICAgICAgICAgfHwgJyB0b2tlbicgfHwgKHJhbmRv bSgpKjUwMDApOjppbnQgfHwgJyBwaHJhc2UnIHx8IChyYW5kb20oKSo4MDAwKTo6aW50KQogIEZS T00gZ2VuZXJhdGVfc2VyaWVzKDEsJE5ST1dTKSBpOwpWQUNVVU0gQU5BTFlaRSB3YWxfdGVzdDsK Q0hFQ0tQT0lOVDsKU1FMCn0KCiMgLS0tIFRlc3QgZnVuY3Rpb25zIC0tLQp0ZXN0X2Jsb29tX3Nj YW4oKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBMQUJFTD0iJDMiIFNJWkU9IiQ0Igog IHNldHVwX2Jsb29tICIkUk9PVCIgIiRQT1JUIiAiJFNJWkUiCiAgYmVuY2htYXJrICIkUk9PVCIg IiRQT1JUIiAiJHtMQUJFTH1fYmxvb21fc2Nhbl8ke1NJWkV9IiBcCiAgICAiU0VUIGVuYWJsZV9z ZXFzY2FuPW9mZjsgU0VMRUNUIENPVU5UKCopIEZST00gYmxvb21fdGVzdCBXSEVSRSB2YWwxPTQy IEFORCB2YWwyPTc7IiBcCiAgICBibG9vbV90ZXN0IGJsb29tX2lkeAogICMgUHJvZmlsZSBhZnRl ciBiZW5jaG1hcmsgcmVwczogc2hhcmVkX2J1ZmZlcnMgbWVtb3J5IGFscmVhZHkgZmF1bHRlZCBp biwKICAjIHNvIHBhZ2UtZmF1bHQgbm9pc2UgaXMgZ29uZTsgZHJvcF9jYWNoZXMgZW5zdXJlcyBj b2xkIElPIGZvciB0aGUgcHJvZmlsZS4KICBpZiBbWyAkRE9fUFJPRklMRSAtZXEgMSBdXTsgdGhl bgogICAgZHJvcF9jYWNoZXMgIiRST09UIiAiJFBPUlQiIGJsb29tX3Rlc3QgYmxvb21faWR4CiAg ICBwcm9maWxlX3NxbCAiJFJPT1QiICIkUE9SVCIgIiR7TEFCRUx9X2Jsb29tX3NjYW5fJHtTSVpF fSIgXAogICAgICAiU0VUIGVuYWJsZV9zZXFzY2FuPW9mZjsgU0VMRUNUIENPVU5UKCopIEZST00g Ymxvb21fdGVzdCBXSEVSRSB2YWwxPTQyIEFORCB2YWwyPTc7IgogIGZpCn0KCnRlc3RfYmxvb21f dmFjdXVtKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIk NCIKICBsb2NhbCBPVVQ9IiRST09UL3Jlc3VsdHMvJHtMQUJFTH1fYmxvb21fdmFjdXVtXyR7U0la RX0uY3N2IgogIG1rZGlyIC1wICIkUk9PVC9yZXN1bHRzIgogIGVjaG8gInJ1bixtcyxyZWFkcyxy ZWFkX3RpbWVfbXMsd3JpdGVzLHdyaXRlX3RpbWVfbXMiID4gIiRPVVQiCiAgCiAgZm9yICgoaT0x OyBpPD1SRVBTOyBpKyspKTsgZG8KICAgICMgRnJlc2ggdGFibGUgZWFjaCBydW4gZm9yIGNvbnNp c3RlbnQgc3RhdGUKICAgIHNldHVwX2Jsb29tICIkUk9PVCIgIiRQT1JUIiAiJFNJWkUiCiAgICAj IENyZWF0ZSAxMCUgZGVhZCB0dXBsZXMKICAgIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAi REVMRVRFIEZST00gYmxvb21fdGVzdCBXSEVSRSBpZCAlIDEwID0gMDsiCiAgICAKICAgIGRyb3Bf Y2FjaGVzICIkUk9PVCIgIiRQT1JUIiBibG9vbV90ZXN0IGJsb29tX2lkeAogICAgbG9jYWwgcmVz dWx0IG1zIHJlYWRzIHJlYWRfdGltZSB3cml0ZXMgd3JpdGVfdGltZQogICAgcmVzdWx0PSQocnVu X3RpbWVkX3dpdGhfaW8gIiRST09UIiAiJFBPUlQiICJWQUNVVU0gYmxvb21fdGVzdDsiKQogICAg SUZTPScsJyByZWFkIC1yIG1zIHJlYWRzIHJlYWRfdGltZSB3cml0ZXMgd3JpdGVfdGltZSA8PDwi JHJlc3VsdCIKICAgIGVjaG8gIiRpLCRtcywkcmVhZHMsJHJlYWRfdGltZSwkd3JpdGVzLCR3cml0 ZV90aW1lIiA+PiAiJE9VVCIKICAgIGxvZyAiJHtMQUJFTH1fYmxvb21fdmFjdXVtXyR7U0laRX0g WyRpLyRSRVBTXTogJHttc31tcyAocmVhZHM9JHJlYWRzLCByZWFkX3RpbWU9JHtyZWFkX3RpbWV9 bXMsIHdyaXRlcz0kd3JpdGVzLCB3cml0ZV90aW1lPSR7d3JpdGVfdGltZX1tcykiCiAgZG9uZQog IAogIGlmIFtbICRET19QUk9GSUxFIC1lcSAxIF1dOyB0aGVuCiAgICBzZXR1cF9ibG9vbSAiJFJP T1QiICIkUE9SVCIgIiRTSVpFIgogICAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJERUxF VEUgRlJPTSBibG9vbV90ZXN0IFdIRVJFIGlkICUgMTAgPSAwOyIKICAgIGRyb3BfY2FjaGVzICIk Uk9PVCIgIiRQT1JUIiBibG9vbV90ZXN0IGJsb29tX2lkeAogICAgcHJvZmlsZV9zcWwgIiRST09U IiAiJFBPUlQiICIke0xBQkVMfV9ibG9vbV92YWN1dW1fJHtTSVpFfSIgIlZBQ1VVTSBibG9vbV90 ZXN0OyIKICBmaQp9Cgp0ZXN0X3Bnc3RhdHR1cGxlKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JU PSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIKICBsb2NhbCBPVVQ9IiRST09UL3Jlc3VsdHMvJHtM QUJFTH1fcGdzdGF0dHVwbGVfJHtTSVpFfS5jc3YiCiAgbWtkaXIgLXAgIiRST09UL3Jlc3VsdHMi CiAgZWNobyAicnVuLG1zLHJlYWRzLHJlYWRfdGltZV9tcyx3cml0ZXMsd3JpdGVfdGltZV9tcyIg PiAiJE9VVCIKICAKICAjIFNldHVwIG9uY2Ug4oCUIHJvbGxlZC1iYWNrIERFTEVURSBrZWVwcyBs YXlvdXQgaWRlbnRpY2FsIGFjcm9zcyBhbGwgcmVwcwogIHNldHVwX3Bnc3RhdHR1cGxlICIkUk9P VCIgIiRQT1JUIiAiJFNJWkUiCiAgIyBSb2xsZWQtYmFjayBERUxFVEUgY2xlYXJzIHRoZSBhbGwt dmlzaWJsZSBiaXQgaW4gdGhlIFZpc2liaWxpdHkgTWFwIHNvCiAgIyBwZ3N0YXR0dXBsZV9hcHBy b3ggbXVzdCBhY3R1YWxseSByZWFkIHRob3NlIHBhZ2VzIChpdCBza2lwcyBhbGwtdmlzaWJsZSBw YWdlcykuCiAgIyBVc2luZyBST0xMQkFDSyBrZWVwcyB0aGUgcGh5c2ljYWwgbGF5b3V0IGlkZW50 aWNhbCBhY3Jvc3MgYWxsIHJlcHMgKG5vIFRPQVNUCiAgIyBvdXQtb2YtcGFnZSB1cGRhdGVzLCBu byBkaXJ0eSBwYWdlcyB0byBmbHVzaCBmcm9tIHNoYXJlZF9idWZmZXJzKS4KICBwc3FsX3J1biAi JFJPT1QiICIkUE9SVCIgLWMgIkJFR0lOOyBERUxFVEUgRlJPTSBoZWFwX3Rlc3QgV0hFUkUgaWQg JSA1MDAgPSAwOyBST0xMQkFDSzsiCiAgIyBXYXJtdXAgcGFzczogVGhlIHJvbGxlZC1iYWNrIERF TEVURSBsZWZ0IGV2ZXJ5IHRvdWNoZWQgdHVwbGUgd2l0aCBhbiB4bWF4CiAgIyBwb2ludGluZyB0 byB0aGUgYWJvcnRlZCB0cmFuc2FjdGlvbiBidXQgbm8gaGludCBiaXRzIHNldC4gT24gdGhlIGZp cnN0CiAgIyBwZ3N0YXR0dXBsZV9hcHByb3ggY2FsbCwgSGVhcFR1cGxlU2F0aXNmaWVzVmFjdXVt IOKGkiBIZWFwVHVwbGVTYXRpc2ZpZXNWYWN1dW1Ib3Jpem9uCiAgIyBtdXN0IHJlc29sdmUgZWFj aCBzdWNoIHhtYXg6IFRyYW5zYWN0aW9uSWRJc0luUHJvZ3Jlc3MgKFByb2NBcnJheSBzY2FuKSB0 aGVuCiAgIyBUcmFuc2FjdGlvbklkRGlkQ29tbWl0IChDTE9HIGxvb2t1cCkg4oCUIG9ubHkgdGhl biBjYW4gaXQgY2FsbCBTZXRIaW50Qml0cyB0bwogICMgc3RhbXAgSEVBUF9YTUFYX0lOVkFMSUQg YW5kIE1hcmtCdWZmZXJEaXJ0eUhpbnQuIFdpdGhvdXQgdGhpcyB3YXJtdXAsIHJlcCAxCiAgIyBw YXlzIH4xMTAwbXMgZXh0cmEgQ1BVIGZvciB0aG9zZSBDTE9HL1Byb2NBcnJheSBsb29rdXBzLiBT dWJzZXF1ZW50IHJlcHMgaGl0CiAgIyB0aGUgZWFybHktZXhpdCBhdCAiaWYgKHRfaW5mb21hc2sg JiBIRUFQX1hNQVhfSU5WQUxJRCkgcmV0dXJuIEhFQVBUVVBMRV9MSVZFIgogICMgYW5kIHNraXAg dGhlIGV4cGVuc2l2ZSBwYXRoIGVudGlyZWx5LgogICMgQWZ0ZXIgdGhpcyBwYXNzLCB0aGUgZGly dGllZCBoaW50LWJpdCBwYWdlcyBhcmUgZmx1c2hlZCB0byBkaXNrIHZpYQogICMgZHJvcF9jYWNo ZXMsIHNvIGFsbCByZXBzIHN0YXJ0IGZyb20gdGhlIHNhbWUgb24tZGlzayBzdGF0ZS4KICBwc3Fs X3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIlNFTEVDVCAqIEZST00gcGdzdGF0dHVwbGVfYXBwcm94 KCdoZWFwX3Rlc3QnKTsiID4vZGV2L251bGwKCiAgZm9yICgoaT0xOyBpPD1SRVBTOyBpKyspKTsg ZG8KICAgIGRyb3BfY2FjaGVzICIkUk9PVCIgIiRQT1JUIiBoZWFwX3Rlc3QgaGVhcF90ZXN0X3Br ZXkKICAgIGxvY2FsIHJlc3VsdCBtcyByZWFkcyByZWFkX3RpbWUgd3JpdGVzIHdyaXRlX3RpbWUK ICAgIHJlc3VsdD0kKHJ1bl90aW1lZF93aXRoX2lvICIkUk9PVCIgIiRQT1JUIiAiU0VMRUNUICog RlJPTSBwZ3N0YXR0dXBsZV9hcHByb3goJ2hlYXBfdGVzdCcpOyIpCiAgICBJRlM9JywnIHJlYWQg LXIgbXMgcmVhZHMgcmVhZF90aW1lIHdyaXRlcyB3cml0ZV90aW1lIDw8PCIkcmVzdWx0IgogICAg ZWNobyAiJGksJG1zLCRyZWFkcywkcmVhZF90aW1lLCR3cml0ZXMsJHdyaXRlX3RpbWUiID4+ICIk T1VUIgogICAgbG9nICIke0xBQkVMfV9wZ3N0YXR0dXBsZV8ke1NJWkV9IFskaS8kUkVQU106ICR7 bXN9bXMgKHJlYWRzPSRyZWFkcywgcmVhZF90aW1lPSR7cmVhZF90aW1lfW1zLCB3cml0ZXM9JHdy aXRlcywgd3JpdGVfdGltZT0ke3dyaXRlX3RpbWV9bXMpIgogIGRvbmUKICAKICBpZiBbWyAkRE9f UFJPRklMRSAtZXEgMSBdXTsgdGhlbgogICAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJC RUdJTjsgREVMRVRFIEZST00gaGVhcF90ZXN0IFdIRVJFIGlkICUgNTAwID0gMDsgUk9MTEJBQ0s7 IgogICAgZHJvcF9jYWNoZXMgIiRST09UIiAiJFBPUlQiIGhlYXBfdGVzdCBoZWFwX3Rlc3RfcGtl eQogICAgcHJvZmlsZV9zcWwgIiRST09UIiAiJFBPUlQiICIke0xBQkVMfV9wZ3N0YXR0dXBsZV8k e1NJWkV9IiBcCiAgICAgICJTRUxFQ1QgKiBGUk9NIHBnc3RhdHR1cGxlX2FwcHJveCgnaGVhcF90 ZXN0Jyk7IgogIGZpCn0KCnRlc3RfcGdzdGF0aW5kZXgoKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBP UlQ9IiQyIiBMQUJFTD0iJDMiIFNJWkU9IiQ0IgogIHNldHVwX3Bnc3RhdGluZGV4ICIkUk9PVCIg IiRQT1JUIiAiJFNJWkUiCiAgYmVuY2htYXJrICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fcGdz dGF0aW5kZXhfJHtTSVpFfSIgXAogICAgIlNFTEVDVCAqIEZST00gcGdzdGF0aW5kZXgoJ2lkeF90 ZXN0X3BrZXknKTsiIFwKICAgIGlkeF90ZXN0IGlkeF90ZXN0X3BrZXkKICBpZiBbWyAkRE9fUFJP RklMRSAtZXEgMSBdXTsgdGhlbgogICAgZHJvcF9jYWNoZXMgIiRST09UIiAiJFBPUlQiIGlkeF90 ZXN0IGlkeF90ZXN0X3BrZXkKICAgIHByb2ZpbGVfc3FsICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJF TH1fcGdzdGF0aW5kZXhfJHtTSVpFfSIgXAogICAgICAiU0VMRUNUICogRlJPTSBwZ3N0YXRpbmRl eCgnaWR4X3Rlc3RfcGtleScpOyIKICBmaQp9Cgp0ZXN0X2dpbl92YWN1dW0oKSB7CiAgbG9jYWwg Uk9PVD0iJDEiIFBPUlQ9IiQyIiBMQUJFTD0iJDMiIFNJWkU9IiQ0IgogIGxvY2FsIE9VVD0iJFJP T1QvcmVzdWx0cy8ke0xBQkVMfV9naW5fdmFjdXVtXyR7U0laRX0uY3N2IgogIG1rZGlyIC1wICIk Uk9PVC9yZXN1bHRzIgogIGVjaG8gInJ1bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMsd3JpdGVzLHdy aXRlX3RpbWVfbXMiID4gIiRPVVQiCiAgCiAgZm9yICgoaT0xOyBpPD1SRVBTOyBpKyspKTsgZG8K ICAgICMgRnJlc2ggdGFibGUgZWFjaCBydW4gZm9yIGNvbnNpc3RlbnQgc3RhdGUKICAgIHNldHVw X2dpbiAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogICAgCiAgICBkcm9wX2NhY2hlcyAiJFJPT1Qi ICIkUE9SVCIgZ2luX3Rlc3QgZ2luX2lkeAogICAgbG9jYWwgcmVzdWx0IG1zIHJlYWRzIHJlYWRf dGltZSB3cml0ZXMgd3JpdGVfdGltZQogICAgIyBWQUNVVU0gQU5BTFlaRSBmb3JjZXMgZ2ludmFj dXVtY2xlYW51cCgpIHRvIHJ1biBhbmQgc2NhbiBhbGwgcGFnZXMKICAgIHJlc3VsdD0kKHJ1bl90 aW1lZF93aXRoX2lvICIkUk9PVCIgIiRQT1JUIiAiVkFDVVVNIEFOQUxZWkUgZ2luX3Rlc3Q7IikK ICAgIElGUz0nLCcgcmVhZCAtciBtcyByZWFkcyByZWFkX3RpbWUgd3JpdGVzIHdyaXRlX3RpbWUg PDw8IiRyZXN1bHQiCiAgICBlY2hvICIkaSwkbXMsJHJlYWRzLCRyZWFkX3RpbWUsJHdyaXRlcywk d3JpdGVfdGltZSIgPj4gIiRPVVQiCiAgICBsb2cgIiR7TEFCRUx9X2dpbl92YWN1dW1fJHtTSVpF fSBbJGkvJFJFUFNdOiAke21zfW1zIChyZWFkcz0kcmVhZHMsIHJlYWRfdGltZT0ke3JlYWRfdGlt ZX1tcywgd3JpdGVzPSR3cml0ZXMsIHdyaXRlX3RpbWU9JHt3cml0ZV90aW1lfW1zKSIKICBkb25l CiAgCiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEgXV07IHRoZW4KICAgIHNldHVwX2dpbiAiJFJP T1QiICIkUE9SVCIgIiRTSVpFIgogICAgZHJvcF9jYWNoZXMgIiRST09UIiAiJFBPUlQiIGdpbl90 ZXN0IGdpbl9pZHgKICAgIHByb2ZpbGVfc3FsICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fZ2lu X3ZhY3V1bV8ke1NJWkV9IiAiVkFDVVVNIEFOQUxZWkUgZ2luX3Rlc3Q7IgogIGZpCn0KCnRlc3Rf aGFzaF92YWN1dW0oKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBMQUJFTD0iJDMiIFNJ WkU9IiQ0IgogIGxvY2FsIE9VVD0iJFJPT1QvcmVzdWx0cy8ke0xBQkVMfV9oYXNoX3ZhY3V1bV8k e1NJWkV9LmNzdiIKICBta2RpciAtcCAiJFJPT1QvcmVzdWx0cyIKICBlY2hvICJydW4sbXMscmVh ZHMscmVhZF90aW1lX21zLHdyaXRlcyx3cml0ZV90aW1lX21zIiA+ICIkT1VUIgogIAogIGZvciAo KGk9MTsgaTw9UkVQUzsgaSsrKSk7IGRvCiAgICAjIEZyZXNoIHRhYmxlIGVhY2ggcnVuIGZvciBj b25zaXN0ZW50IHN0YXRlCiAgICBzZXR1cF9oYXNoICIkUk9PVCIgIiRQT1JUIiAiJFNJWkUiCiAg ICAjIENyZWF0ZSAxMCUgZGVhZCB0dXBsZXMKICAgIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiAt YyAiREVMRVRFIEZST00gaGFzaF90ZXN0IFdIRVJFIGlkICUgMTAgPSAwOyIKICAgIAogICAgZHJv cF9jYWNoZXMgIiRST09UIiAiJFBPUlQiIGhhc2hfdGVzdCBoYXNoX2lkeAogICAgbG9jYWwgcmVz dWx0IG1zIHJlYWRzIHJlYWRfdGltZSB3cml0ZXMgd3JpdGVfdGltZQogICAgcmVzdWx0PSQocnVu X3RpbWVkX3dpdGhfaW8gIiRST09UIiAiJFBPUlQiICJWQUNVVU0gaGFzaF90ZXN0OyIpCiAgICBJ RlM9JywnIHJlYWQgLXIgbXMgcmVhZHMgcmVhZF90aW1lIHdyaXRlcyB3cml0ZV90aW1lIDw8PCIk cmVzdWx0IgogICAgZWNobyAiJGksJG1zLCRyZWFkcywkcmVhZF90aW1lLCR3cml0ZXMsJHdyaXRl X3RpbWUiID4+ICIkT1VUIgogICAgbG9nICIke0xBQkVMfV9oYXNoX3ZhY3V1bV8ke1NJWkV9IFsk aS8kUkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFkcywgcmVhZF90aW1lPSR7cmVhZF90aW1lfW1z LCB3cml0ZXM9JHdyaXRlcywgd3JpdGVfdGltZT0ke3dyaXRlX3RpbWV9bXMpIgogIGRvbmUKICAK ICBpZiBbWyAkRE9fUFJPRklMRSAtZXEgMSBdXTsgdGhlbgogICAgc2V0dXBfaGFzaCAiJFJPT1Qi ICIkUE9SVCIgIiRTSVpFIgogICAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJERUxFVEUg RlJPTSBoYXNoX3Rlc3QgV0hFUkUgaWQgJSAxMCA9IDA7IgogICAgZHJvcF9jYWNoZXMgIiRST09U IiAiJFBPUlQiIGhhc2hfdGVzdCBoYXNoX2lkeAogICAgcHJvZmlsZV9zcWwgIiRST09UIiAiJFBP UlQiICIke0xBQkVMfV9oYXNoX3ZhY3V1bV8ke1NJWkV9IiAiVkFDVVVNIGhhc2hfdGVzdDsiCiAg ZmkKfQoKdGVzdF93YWxfbG9nZ2luZygpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIExB QkVMPSIkMyIgU0laRT0iJDQiCiAgbG9jYWwgT1VUPSIkUk9PVC9yZXN1bHRzLyR7TEFCRUx9X3dh bF9sb2dnaW5nXyR7U0laRX0uY3N2IgogIG1rZGlyIC1wICIkUk9PVC9yZXN1bHRzIgogIGVjaG8g InJ1bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMsd3JpdGVzLHdyaXRlX3RpbWVfbXMiID4gIiRPVVQi CiAgCiAgIyBCdWlsZCB0YWJsZSBvbmNlIC0gb25seSByZWJ1aWxkIGluZGV4IGVhY2ggcmVwCiAg c2V0dXBfd2FsICIkUk9PVCIgIiRQT1JUIiAiJFNJWkUiCiAgCiAgbG9jYWwgV0FMX1NRTD0iQ1JF QVRFIElOREVYIHdhbF90ZXN0X2dpbl9pZHggT04gd2FsX3Rlc3QgVVNJTkcgZ2luIChkb2NfdHN2 KTsiCiAgCiAgZm9yICgoaT0xOyBpPD1SRVBTOyBpKyspKTsgZG8KICAgICMgRHJvcCBpbmRleCBm cm9tIHByZXZpb3VzIGl0ZXJhdGlvbgogICAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJE Uk9QIElOREVYIElGIEVYSVNUUyB3YWxfdGVzdF9naW5faWR4OyIKICAgIAogICAgIyBEcm9wIE9T IGNhY2hlcyAtIHNvdXJjZSB0YWJsZSBwYWdlcyBhcmUgQ09MRCBvbiBkaXNrCiAgICBkcm9wX2Nh Y2hlcyAiJFJPT1QiICIkUE9SVCIgd2FsX3Rlc3QKICAgIAogICAgIyBDUkVBVEUgSU5ERVggb24g R0lOICh0c3ZlY3Rvcl9vcHMpOgogICAgIyAtIEdJTiBhbHdheXMgdXNlcyB0aGUgc2FtZSBidWls ZCBwYXRoOiBnaW5idWlsZCgpIHBvcHVsYXRlcyB0aGUKICAgICMgICBpbmRleCBpbiBtZW1vcnks IGZsdXNoZXMgdG8gZGlzaywgdGhlbiBjYWxscyBsb2dfbmV3cGFnZV9yYW5nZSgpCiAgICAjICAg dG8gcmVhZCBBTEwgaW5kZXggcGFnZXMgYW5kIHdyaXRlIHRoZW0gdG8gV0FMIChnaW5pbnNlcnQu Yzo3ODUtNzkwKQogICAgbG9jYWwgcmVzdWx0IG1zIHJlYWRzIHJlYWRfdGltZSB3cml0ZXMgd3Jp dGVfdGltZQogICAgcmVzdWx0PSQocnVuX3RpbWVkX3dpdGhfaW8gIiRST09UIiAiJFBPUlQiICIk V0FMX1NRTCIpCiAgICBJRlM9JywnIHJlYWQgLXIgbXMgcmVhZHMgcmVhZF90aW1lIHdyaXRlcyB3 cml0ZV90aW1lIDw8PCIkcmVzdWx0IgogICAgZWNobyAiJGksJG1zLCRyZWFkcywkcmVhZF90aW1l LCR3cml0ZXMsJHdyaXRlX3RpbWUiID4+ICIkT1VUIgogICAgbG9nICIke0xBQkVMfV93YWxfbG9n Z2luZ18ke1NJWkV9IFskaS8kUkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFkcywgcmVhZF90aW1l PSR7cmVhZF90aW1lfW1zLCB3cml0ZXM9JHdyaXRlcywgd3JpdGVfdGltZT0ke3dyaXRlX3RpbWV9 bXMpIgogIGRvbmUKICAKICBpZiBbWyAkRE9fUFJPRklMRSAtZXEgMSBdXTsgdGhlbgogICAgcHNx bF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJEUk9QIElOREVYIElGIEVYSVNUUyB3YWxfdGVzdF9n aW5faWR4OyIKICAgIGRyb3BfY2FjaGVzICIkUk9PVCIgIiRQT1JUIiB3YWxfdGVzdAogICAgcHJv ZmlsZV9zcWwgIiRST09UIiAiJFBPUlQiICIke0xBQkVMfV93YWxfbG9nZ2luZ18ke1NJWkV9IiAi JFdBTF9TUUwiCiAgZmkKfQoKIyAtLS0gUnVuIHRlc3RzIGZvciBhIGJ1aWxkIC0tLQp3YXJtdXBf Y2F0YWxvZygpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiCiAgIyBFeHBsaWNpdGx5IHBy ZXdhcm0gY2F0YWxvZyB0YWJsZXMgYW5kIHRoZWlyIGluZGV4ZXMgaW50byBzaGFyZWRfYnVmZmVy cwogICMgc28gcmVwIDEgZG9lc24ndCBwYXkgZGlzay1yZWFkIGNvc3QgZm9yIGNhdGFsb2cgcGFn ZXMuCiAgIyBwZ19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbiBvbmx5IGV2aWN0cyB0aGUgdGVz dCByZWxhdGlvbiwgbm90IGNhdGFsb2dzLAogICMgc28gdGhlc2Ugc3RheSB3YXJtIGFjcm9zcyBh bGwgcmVwcy4KICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgPDxTUUwgPi9kZXYvbnVsbApTRUxF Q1QgcGdfcHJld2FybSgncGdfY2xhc3MnLCAgICAgJ2J1ZmZlcicpOwpTRUxFQ1QgcGdfcHJld2Fy bSgncGdfYXR0cmlidXRlJywgJ2J1ZmZlcicpOwpTRUxFQ1QgcGdfcHJld2FybSgncGdfbmFtZXNw YWNlJywgJ2J1ZmZlcicpOwpTRUxFQ1QgcGdfcHJld2FybSgncGdfcHJvYycsICAgICAgJ2J1ZmZl cicpOwpTRUxFQ1QgcGdfcHJld2FybSgncGdfdHlwZScsICAgICAgJ2J1ZmZlcicpOwpTUUwKfQoK cnVuX3Rlc3RzKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBMQUJFTD0iJDIiCiAgbG9jYWwgUE9SVAog IFBPUlQ9JChwaWNrX3BvcnQpCiAgCiAgbG9nICJbJExBQkVMXSBTdGFydGluZyBjbHVzdGVyIG9u IHBvcnQgJFBPUlQiCiAgaW5pdF9jbHVzdGVyICIkUk9PVCIgIiRQT1JUIgogIHdhcm11cF9jYXRh bG9nICIkUk9PVCIgIiRQT1JUIgogIHNldF9pb19kZWxheSAiJElPX0RFTEFZX01TIgogIAogIHRy YXAgInN0b3BfY2x1c3RlciAnJFJPT1QnIiBFWElUCiAgCiAgZm9yIFNJWkUgaW4gJFNJWkVTOyBk bwogICAgY2FzZSAiJFRFU1QiIGluCiAgICAgIGJsb29tX3NjYW4pICAgdGVzdF9ibG9vbV9zY2Fu ICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiIDs7CiAgICAgIGJsb29tX3ZhY3V1bSkg dGVzdF9ibG9vbV92YWN1dW0gIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIgOzsKICAg ICAgcGdzdGF0dHVwbGUpICB0ZXN0X3Bnc3RhdHR1cGxlICIkUk9PVCIgIiRQT1JUIiAiJExBQkVM IiAiJFNJWkUiIDs7CiAgICAgIHBnc3RhdGluZGV4KSAgdGVzdF9wZ3N0YXRpbmRleCAiJFJPT1Qi ICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIiA7OwogICAgICBnaW5fdmFjdXVtKSAgIHRlc3RfZ2lu X3ZhY3V1bSAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIiA7OwogICAgICBoYXNoX3Zh Y3V1bSkgIHRlc3RfaGFzaF92YWN1dW0gIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIg OzsKICAgICAgd2FsX2xvZ2dpbmcpICB0ZXN0X3dhbF9sb2dnaW5nICIkUk9PVCIgIiRQT1JUIiAi JExBQkVMIiAiJFNJWkUiIDs7CiAgICAgIGFsbCkKICAgICAgICB0ZXN0X2Jsb29tX3ZhY3V1bSAi JFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIgogICAgICAgIHRlc3RfcGdzdGF0dHVwbGUg IiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIKICAgICAgICB0ZXN0X3Bnc3RhdGluZGV4 ICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiCiAgICAgICAgdGVzdF9oYXNoX3ZhY3V1 bSAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIgogICAgICAgIHRlc3Rfd2FsX2xvZ2dp bmcgIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIKICAgICAgICA7OwogICAgICAqKSBk aWUgIlVua25vd24gdGVzdDogJFRFU1QiIDs7CiAgICBlc2FjCiAgZG9uZQogIAogIHN0b3BfY2x1 c3RlciAiJFJPT1QiCiAgdHJhcCAtIEVYSVQKfQoKIyAtLS0gQ29tcGFyZSByZXN1bHRzIC0tLQpj b21wYXJlX3Jlc3VsdHMoKSB7CiAgbG9jYWwgYmFzZV9jc3Y9IiQxIiBwYXRjaF9jc3Y9IiQyIiBs YWJlbD0iJDMiCiAgCiAgW1sgISAtZiAiJGJhc2VfY3N2IiB8fCAhIC1mICIkcGF0Y2hfY3N2IiBd XSAmJiByZXR1cm4KICAKICBsb2NhbCBiYXNlX21lZCBwYXRjaF9tZWQKICBiYXNlX21lZD0kKGNh bGNfbWVkaWFuICIkYmFzZV9jc3YiKQogIHBhdGNoX21lZD0kKGNhbGNfbWVkaWFuICIkcGF0Y2hf Y3N2IikKICAKICAjIEd1YXJkIGFnYWluc3QgZW1wdHkgb3IgemVybyB2YWx1ZXMgdG8gcHJldmVu dCBkaXZpc2lvbiBieSB6ZXJvCiAgW1sgLXogIiRiYXNlX21lZCIgfHwgIiRiYXNlX21lZCIgPT0g IjAiIF1dICYmIGJhc2VfbWVkPSIwLjAwMSIKICBbWyAteiAiJHBhdGNoX21lZCIgfHwgIiRwYXRj aF9tZWQiID09ICIwIiBdXSAmJiBwYXRjaF9tZWQ9IjAuMDAxIgogIAogIGxvY2FsIHNwZWVkdXAg cGN0CiAgc3BlZWR1cD0kKGF3ayAiQkVHSU4geyBwcmludGYgXCIlLjJmXCIsICRiYXNlX21lZCAv ICRwYXRjaF9tZWQgfSIpCiAgcGN0PSQoYXdrICJCRUdJTiB7IHByaW50ZiBcIiUuMWZcIiwgKCRi YXNlX21lZCAtICRwYXRjaF9tZWQpIC8gJGJhc2VfbWVkICogMTAwIH0iKQogIAogIGxvY2FsIGlv X2luZm89IiIKICBpZiBoZWFkIC0xICIkYmFzZV9jc3YiIHwgZ3JlcCAtcSAicmVhZHMiOyB0aGVu CiAgICAjIFN0YW5kYXJkIHRlc3Q6IGNvbHVtbnMgYXJlIHJ1bixtcyxyZWFkcyxyZWFkX3RpbWVf bXMsd3JpdGVzLHdyaXRlX3RpbWVfbXMKICAgIGxvY2FsIGJhc2VfcmVhZHMgcGF0Y2hfcmVhZHMg YmFzZV9ydGltZSBwYXRjaF9ydGltZSBiYXNlX3dyaXRlcyBwYXRjaF93cml0ZXMgYmFzZV93dGlt ZSBwYXRjaF93dGltZQogICAgYmFzZV9yZWFkcz0kKGNhbGNfbWVkaWFuX2NvbCAiJGJhc2VfY3N2 IiAzKQogICAgcGF0Y2hfcmVhZHM9JChjYWxjX21lZGlhbl9jb2wgIiRwYXRjaF9jc3YiIDMpCiAg ICBiYXNlX3J0aW1lPSQoY2FsY19tZWRpYW5fY29sICIkYmFzZV9jc3YiIDQpCiAgICBwYXRjaF9y dGltZT0kKGNhbGNfbWVkaWFuX2NvbCAiJHBhdGNoX2NzdiIgNCkKICAgIGJhc2Vfd3JpdGVzPSQo Y2FsY19tZWRpYW5fY29sICIkYmFzZV9jc3YiIDUpCiAgICBwYXRjaF93cml0ZXM9JChjYWxjX21l ZGlhbl9jb2wgIiRwYXRjaF9jc3YiIDUpCiAgICBiYXNlX3d0aW1lPSQoY2FsY19tZWRpYW5fY29s ICIkYmFzZV9jc3YiIDYpCiAgICBwYXRjaF93dGltZT0kKGNhbGNfbWVkaWFuX2NvbCAiJHBhdGNo X2NzdiIgNikKICAgICMgRGVmYXVsdCB0byAwIGlmIGVtcHR5CiAgICBbWyAteiAiJGJhc2VfcmVh ZHMiIF1dICAgJiYgYmFzZV9yZWFkcz0wCiAgICBbWyAteiAiJHBhdGNoX3JlYWRzIiBdXSAgJiYg cGF0Y2hfcmVhZHM9MAogICAgW1sgLXogIiRiYXNlX3J0aW1lIiBdXSAgICYmIGJhc2VfcnRpbWU9 MAogICAgW1sgLXogIiRwYXRjaF9ydGltZSIgXV0gICYmIHBhdGNoX3J0aW1lPTAKICAgIFtbIC16 ICIkYmFzZV93cml0ZXMiIF1dICAmJiBiYXNlX3dyaXRlcz0wCiAgICBbWyAteiAiJHBhdGNoX3dy aXRlcyIgXV0gJiYgcGF0Y2hfd3JpdGVzPTAKICAgIFtbIC16ICIkYmFzZV93dGltZSIgXV0gICAm JiBiYXNlX3d0aW1lPTAKICAgIFtbIC16ICIkcGF0Y2hfd3RpbWUiIF1dICAmJiBwYXRjaF93dGlt ZT0wCiAgICBpb19pbmZvPSIgIChyZWFkcz0ke2Jhc2VfcmVhZHN94oaSJHtwYXRjaF9yZWFkc30s IHJlYWRfdGltZT0ke2Jhc2VfcnRpbWV94oaSJHtwYXRjaF9ydGltZX1tcywgd3JpdGVzPSR7YmFz ZV93cml0ZXN94oaSJHtwYXRjaF93cml0ZXN9LCB3cml0ZV90aW1lPSR7YmFzZV93dGltZX3ihpIk e3BhdGNoX3d0aW1lfW1zKSIKICBmaQogIAogIHByaW50ZiAiJS0yNnMgYmFzZT0lOC4xZm1zICBw YXRjaD0lOC4xZm1zICAlNS4yZnggICglNS4xZiUlKSVzXG4iIFwKICAgICIkbGFiZWwiICIkYmFz ZV9tZWQiICIkcGF0Y2hfbWVkIiAiJHNwZWVkdXAiICIkcGN0IiAiJGlvX2luZm8iCn0KCnByaW50 X3N1bW1hcnkoKSB7CiAgZWNobyAiIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICIgICAgICAgICAgICAgICAgICAgICBTVFJFQU1JTkcg UkVBRCBCRU5DSE1BUksgUkVTVUxUUyAgICAgICAgICAgICAgICAgICAiCiAgZWNobyAi4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIiIKICAKICBpZiBb WyAkQkFTRUxJTkUgLWVxIDEgXV07IHRoZW4KICAgIHByaW50ZiAiJS0yNnMgJS0xN3MgJS0xN3Mg JS03cyAlLTdzICVzXG4iICJURVNUIiAiQkFTRUxJTkUiICJQQVRDSEVEIiAiU1BFRURVUCIgIkNI QU5HRSIgIkkvTyBUSU1FIgogICAgZWNobyAi4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIgogICAgCiAgICBmb3IgU0laRSBpbiAk U0laRVM7IGRvCiAgICAgIGZvciB0ZXN0X25hbWUgaW4gYmxvb21fc2NhbiBibG9vbV92YWN1dW0g cGdzdGF0dHVwbGUgcGdzdGF0aW5kZXggZ2luX3ZhY3V1bSBoYXNoX3ZhY3V1bSB3YWxfbG9nZ2lu ZzsgZG8KICAgICAgICBbWyAiJFRFU1QiICE9ICJhbGwiICYmICIkVEVTVCIgIT0gIiR0ZXN0X25h bWUiIF1dICYmIGNvbnRpbnVlCiAgICAgICAgY29tcGFyZV9yZXN1bHRzIFwKICAgICAgICAgICIk Uk9PVF9CQVNFL3Jlc3VsdHMvYmFzZV8ke3Rlc3RfbmFtZX1fJHtTSVpFfS5jc3YiIFwKICAgICAg ICAgICIkUk9PVF9QQVRDSC9yZXN1bHRzL3BhdGNoZWRfJHt0ZXN0X25hbWV9XyR7U0laRX0uY3N2 IiBcCiAgICAgICAgICAiJHt0ZXN0X25hbWV9XyR7U0laRX0iCiAgICAgIGRvbmUKICAgIGRvbmUK ICBlbHNlCiAgICBlY2hvICJSZXN1bHRzIChwYXRjaGVkIG9ubHkpOiIKICAgIGVjaG8gIiIKICAg IGZvciBmIGluICIkUk9PVF9QQVRDSC9yZXN1bHRzLyIqLmNzdjsgZG8KICAgICAgW1sgLWYgIiRm IiBdXSB8fCBjb250aW51ZQogICAgICBwcmludGYgIiUtNDBzICVzXG4iICIkKGJhc2VuYW1lICIk ZiIgLmNzdik6IiAiJChjYWxjX3N0YXRzICIkZiIpIgogICAgZG9uZQogIGZpCiAgCiAgZWNobyAi IgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBl Y2hvICJDU1YgZmlsZXM6ICRST09UX1BBVENIL3Jlc3VsdHMvIgogIFtbICRCQVNFTElORSAtZXEg MSBdXSAmJiBlY2hvICJCYXNlbGluZTogICRST09UX0JBU0UvcmVzdWx0cy8iCiAgCiAgIyBMaXN0 IGdlbmVyYXRlZCBmbGFtZWdyYXBocwogIGlmIFtbICRET19QUk9GSUxFIC1lcSAxIF1dOyB0aGVu CiAgICBsb2NhbCBzdmdzPSgpCiAgICBmb3IgZGlyIGluICIkUk9PVF9CQVNFL3Byb2ZpbGUiICIk Uk9PVF9QQVRDSC9wcm9maWxlIjsgZG8KICAgICAgW1sgLWQgIiRkaXIiIF1dIHx8IGNvbnRpbnVl CiAgICAgIGZvciBzdmcgaW4gIiRkaXIiLyouc3ZnOyBkbwogICAgICAgIFtbIC1mICIkc3ZnIiBd XSAmJiBzdmdzKz0oIiRzdmciKQogICAgICBkb25lCiAgICBkb25lCiAgICBpZiBbWyAkeyNzdmdz W0BdfSAtZ3QgMCBdXTsgdGhlbgogICAgICBlY2hvICIiCiAgICAgIGVjaG8gIkZsYW1lZ3JhcGhz OiIKICAgICAgZm9yIHN2ZyBpbiAiJHtzdmdzW0BdfSI7IGRvIGVjaG8gIiAgJHN2ZyI7IGRvbmUK ICAgIGZpCiAgZmkKICAKICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZAiCn0KCiMgLS0tIE1haW4gLS0tCm1haW4oKSB7CiAgbG9nICJTdHJlYW1pbmcgUmVh ZCBCZW5jaG1hcmsiCiAgbG9nICJQYXRjaDogJFBBVENIICgkUEFUQ0hfVEFHKSIKICBsb2cgIlRl c3RzOiAkVEVTVCIKICBsb2cgIlNpemVzOiAkU0laRVMiCiAgbG9nICJSZXBzOiAgJFJFUFMiCiAg bG9nICJJL086ICAgJElPX01FVEhPRCAod29ya2Vycz0kSU9fV09SS0VSUywgY29uY3VycmVuY3k9 JElPX01BWF9DT05DVVJSRU5DWSkiCiAgW1sgJERJUkVDVF9JTyAtZXEgMSBdXSAmJiBsb2cgIkRp cmVjdCBJTzogZW5hYmxlZCAoZGVidWdfaW9fZGlyZWN0PWRhdGEpIgogIFtbIC1uICIkSU9fREVM QVlfTVMiIF1dICYmIGxvZyAiSS9PIGRlbGF5OiAke0lPX0RFTEFZX01TfW1zIHJlYWQgLyAke1dS SVRFX0RFTEFZX01TfW1zIHdyaXRlIHZpYSBkbV9kZWxheSAoJERNX0RFTEFZX0RFVikiCiAgW1sg JERPX1BST0ZJTEUgLWVxIDEgXV0gJiYgbG9nICJQcm9maWxlOiBlbmFibGVkIChmbGFtZWdyYXBo cyDihpIgPHJvb3Q+L3Byb2ZpbGUvKSIKICAKICAjIEJ1aWxkCiAgaWYgW1sgJEJBU0VMSU5FIC1l cSAxIF1dOyB0aGVuCiAgICBidWlsZF9wZyAiJFJPT1RfQkFTRSIgIiIKICBmaQogIGJ1aWxkX3Bn ICIkUk9PVF9QQVRDSCIgIiRQQVRDSCIKICAKICAjIFJ1biB0ZXN0cwogIGlmIFtbICRCQVNFTElO RSAtZXEgMSBdXTsgdGhlbgogICAgbG9nICJSdW5uaW5nIGJhc2VsaW5lIHRlc3RzIgogICAgcnVu X3Rlc3RzICIkUk9PVF9CQVNFIiAiYmFzZSIKICBmaQogIAogIGxvZyAiUnVubmluZyBwYXRjaGVk IHRlc3RzIgogIHJ1bl90ZXN0cyAiJFJPT1RfUEFUQ0giICJwYXRjaGVkIgogIAogICMgU3VtbWFy eQogIHByaW50X3N1bW1hcnkKfQoKbWFpbgo= --00000000000082a0db064cd582eb--