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 1wUlBg-001QSm-1G for pgsql-hackers@arkaria.postgresql.org; Wed, 03 Jun 2026 12:59:12 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wUlBe-001XMA-3C for pgsql-hackers@arkaria.postgresql.org; Wed, 03 Jun 2026 12:59:11 +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 1wUlBe-001XM1-0X for pgsql-hackers@lists.postgresql.org; Wed, 03 Jun 2026 12:59:10 +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 1wUlBa-00000000uZo-3DeK for pgsql-hackers@postgresql.org; Wed, 03 Jun 2026 12:59:08 +0000 Received: by mail-ed1-x529.google.com with SMTP id 4fb4d7f45d1cf-68d232e119dso4745562a12.0 for ; Wed, 03 Jun 2026 05:59:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1780491545; cv=none; d=google.com; s=arc-20240605; b=GAidhUju8UEL83beq6u1sLbUXtFOJCWUYPX83ENa465enSPp1A10JUkHbNPLzt88eo iNhVhfg06ahI9ZV7XbkjPpQn3rCUfk8kit9uwH9mHzAHMHrnvbkIHAaBYFhARFinILXw HOI++kHcOGjXrnlG/SzG7o8Cr8LyxBXU4ZzZYF5yatpbIZc56bSZjXV2CZLL3yTK0vZw 7x69agQ1m5A1rw1d8Jrv252iGbwCPHV2dDI0SKBEMnVoyMrIt39X+PB0m/rjVZ/RyTzy qwQcYzxhKO5sfTtiFOmNcEOVKStpFpTUQDtqcww0KOxsoMgMSLMJCuPB5JmhXvfxaZw9 SI2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=/5GbkJwMVtqGHgXXizvUk61tmKkOju0hqRMbaqyYwqg=; fh=RfrkJab44jNT7RraF/sJO97r9/nkUL0AAgzmC7PBS2w=; b=LXl9sIkc314XREdCorTAKLN5WW7yUt4D1TTTX7UIa1TsUocLwN8+PZPHdClwUxDmf4 WRNEmVHLCOkmTXUDS89lJUeRNuShQhTIGHTw1zcFzcerwwUHUJcdaotxuaSfcmqvnwDt /BlN5BI9IEO3lN+SDplMh1Au0/HRFOT5RJwQzPJLbmn/JuU1gjgt7IgQgsHucTYLOtCx cmIRUSvonQkQ5Cuupwb7DJhxD0JBW1FKz0MmQs/i2zmsrvJFwdsbK8NgrJ1fT4DODRVH IqlZYy6wrMRHdm4sbcav3kcwYOHaewvqpKYvWbCN4t4JYQQCyveLHSE3wJZA60zxxTEx 7rww==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1780491545; x=1781096345; darn=postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=/5GbkJwMVtqGHgXXizvUk61tmKkOju0hqRMbaqyYwqg=; b=PhVrdnL/XMLC/Ou7zmkK4heoz0SsgII11BQlhWklpZPKK2/7+gioqAtgXw2F20A/7y v2U+DJPoarpDr6r/2LOmyPkh8eljeF1Zc9skjjk7kbqkyGKqca358R+HOgoMP65Ac8MA a21sSgTYb/UFRxX8q3VGqPjajBH1eSxO+tGYiRydcp+VyeCXWY66kx1rXbPoQ1w3rd7A Lr7WF0xzE7o/xOxPO6zmBxyuU/6mmmrWEAQl3tcGmbKhpIZZykHKDZGhWRwpPB9Md04R 1FMRCNRjMOTjyqhL7pOuFe3BP+YbkjYxEuCfqIQMb3dCkBHjMFXxYjyYYPXIsbPZQRph 9UnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780491545; x=1781096345; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=/5GbkJwMVtqGHgXXizvUk61tmKkOju0hqRMbaqyYwqg=; b=hr3cJS9SbRLWJ7GqT5rhSJZuPPXgJuGD0WinoMtFgBJeC4a9NeA9Jleu0F0Hx8FHjN bUeWrfkTMXuGdTg14/weeeSox9kzlCzX2KEJ0xu/zs05vMlACVL4oWvOFHG/GrUpSsWG 8mBiiy7gfFRqv5OnYFDSQZOn74GnIveWoEFbz3ivzb9b8M/f+NYnOh+yMw4Nx0+pCUs1 SJkQ0HKQ6kXxZlcYpgx4p0h77hDx3UUnJfv5Qz5n4COTgLclEtsi/mIv8aCTNUZ6ioSk UM829f1ED2VWBfAHRezyHXl+3KaTGjbmPnPB0Dd7ucqdf7HTs2TLowO8zRk6vhTyUaq6 SQwQ== X-Gm-Message-State: AOJu0Yx5ok1BAJPNOg6hIo/BqRYiDYZwjuvNl7ybBY995Vb8+OZ8dmgw 065wEIFOAKhBo0Slvbkk696bM+MEY0yPlljdm05C7b7Q3u1lRYFH8G/4J993/ZsYx50dNpegDQY uasnEPpmBTm/1J/9i8geatp71LovtgKx/RrIE9y4o9U66yPR0N9JGcMEk X-Gm-Gg: Acq92OFsRKVz/XJzRT0Vd+aom6fdNj/begwpLErjFQxPjRUsu0Ym5qxitCakXX5QuhE Gj5Bxk1z4PNAZiuI5JGaN3AvsHOc7TcvFRtwUX+ffKT/qPwTP/ICPVJlvxVJkplItrK2lTfHG+s XYI+oq1zmbxZKClF00OA/Wn7ArXTvZCsX3VNGNKlDsy1IhhRBxBzuzM2xAvc7IQCrAMKC/HZUt3 YkWNOXkfRXBfDh7yPNLgxLBaiBbBPTfVXWxBRbgkPG7Ss2H/7QdpFvS7r4XZT50XptS/RLj2rHm 5On68yS0xJQxvS7Qil8= X-Received: by 2002:a05:6402:40d2:b0:682:d56d:1de8 with SMTP id 4fb4d7f45d1cf-68e70dee146mr1543514a12.14.1780491544832; Wed, 03 Jun 2026 05:59:04 -0700 (PDT) MIME-Version: 1.0 From: Akshay Joshi Date: Wed, 3 Jun 2026 18:28:52 +0530 X-Gm-Features: AVHnY4JkuQyUem5GwuFlv1I13RXDyPVU0FbYN1TdKw2YfBhzSZA1UUrJHR9TWmI Message-ID: Subject: [PATCH] Add pg_get_table_ddl() to reconstruct CREATE TABLE statements To: pgsql-hackers Content-Type: multipart/mixed; boundary="0000000000000ead26065358fe5c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000000ead26065358fe5c Content-Type: multipart/alternative; boundary="0000000000000ead24065358fe5a" --0000000000000ead24065358fe5a Content-Type: text/plain; charset="UTF-8" Hackers, Attached is a patch adding pg_get_table_ddl(regclass, VARIADIC text[]), extending the existing pg_get_database/role/tablespace_ddl family. relations. It returns the CREATE TABLE statement plus the follow-up ALTER TABLE, CREATE INDEX, CREATE RULE, and CREATE STATISTICS statements needed for a full reconstruction, one per row. *Coverage* -------- *Per-column:* typmod, COLLATE, STORAGE, COMPRESSION (pglz/lz4), GENERATED STORED/VIRTUAL, IDENTITY ALWAYS/BY DEFAULT (with non-default sequence options), DEFAULT, NOT NULL, attoptions. *Table-level:* UNLOGGED, INHERITS, PARTITION BY (RANGE/LIST/HASH), PARTITION OF ... FOR VALUES, USING access method, WITH (reloptions), TABLESPACE, inline CHECK. *Sub-objects:* Indexes, Constraints (PK/UNIQUE/FK/EXCLUDE/named NOT NULL), Rules, extended statistics, REPLICA IDENTITY, ENABLE/FORCE RLS, and child-local DEFAULT overrides. *Triggers and policies are TODOs pending pg_get_trigger_ddl (Phil's re-roll) and pg_get_policy_ddl (Waiting for review/commit)*. Options (pretty, owner, tablespace, and a family of *includes_** toggles for each sub-object class) let callers fine-tune the output. Every clause is omitted when its value equals what the system would reapply on round-trip same default-omission convention as the existing _ddl functions. I deliberately did *not* add pg_get_index_ddl / _constraint_ddl / _rule_ddl / _stat_ddl wrappers. The existing C helpers in ruleutils.c (pg_get_indexdef_string, pg_get_constraintdef_command, etc.) already emit reproducible statements, so pg_get_table_ddl_internal calls them directly. Happy to revisit if reviewers prefer separate SQL-level surfaces. *Testing: * pg_regress test at src/test/regress/sql/pg_get_table_ddl.sql covering the matrix above plus error paths. I kept it as pg_regress rather than TAP (where the sibling _ddl tests live) since exact-.out diffs are the more rigorous check for a deparse function, and the pg_regress restriction that drove the TAP choice for CREATE DATABASE/TABLESPACE doesn't apply to tables. A manual round-trip across IDENTITY/GENERATED/ STORAGE/COMPRESSION/PK produces an empty EXCEPT diff against the original. *Out of scope:* COMMENT ON, GRANT/REVOKE (matching the existing _ddl family), and typed tables (CREATE TABLE name OF type). Feedback is welcome, particularly on the option naming and the decision to reuse the C helpers directly rather than add new SQL wrappers. ----- Regards, Akshay Joshi Principal Engineer | Engineering Manager | pgAdmin Hacker EDB (EnterpriseDB) --0000000000000ead24065358fe5a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hackers,

Attached is a patch adding pg_get_tab= le_ddl(regclass, VARIADIC text[]), extending the existing pg_get_database/r= ole/tablespace_ddl family. relations. It returns the CREATE TABLE statement= plus the follow-up ALTER TABLE, CREATE INDEX, CREATE RULE, and CREATE STAT= ISTICS statements needed for a full reconstruction, one per row.

= Coverage
--------
Per-column: typmod, COLLATE, STORAGE, CO= MPRESSION (pglz/lz4), GENERATED STORED/VIRTUAL, IDENTITY ALWAYS/BY DEFAULT = (with non-default sequence options), DEFAULT, NOT NULL, attoptions.
<= br>
Table-level: UNLOGGED, INHERITS, PARTITION BY (RAN= GE/LIST/HASH), PARTITION OF ... FOR VALUES, USING access method, WITH (relo= ptions), TABLESPACE, inline CHECK.

Sub-objects:=C2=A0Indexes,= Constraints (PK/UNIQUE/FK/EXCLUDE/named NOT NULL), Rules, extended statist= ics, REPLICA IDENTITY, ENABLE/FORCE RLS, and child-local DEFAULT overrides.=
Triggers and policies are TODOs pending pg_get_trigger_ddl (Phil'= ;s re-roll) and pg_get_policy_ddl (Waiting for review/commit).

O= ptions (pretty, owner, tablespace, and a family of includes_* toggle= s for each sub-object class) let callers fine-tune the output. Every clause= is omitted when its value equals what the system would reapply on round-tr= ip same default-omission convention as the existing _ddl functions.

= I deliberately did *not* add pg_get_index_ddl / _constraint_ddl / _rule_ddl= / _stat_ddl wrappers. The existing C helpers in ruleutils.c (pg_get_indexd= ef_string, pg_get_constraintdef_command, etc.) already emit reproducible st= atements, so pg_get_table_ddl_internal calls them directly. Happy to revisi= t if reviewers prefer separate SQL-level surfaces.

Testing:=C2=A0=
pg_regress test at src/test/regress/sql/pg_get_table_ddl.sql coveri= ng the matrix above plus error paths. I kept it as pg_regress rather than T= AP (where the sibling _ddl tests live) since exact-.out diffs are the more = rigorous check for a deparse function, and the pg_regress restriction that = drove the TAP choice for CREATE DATABASE/TABLESPACE doesn't apply to ta= bles. A manual round-trip across IDENTITY/GENERATED/ STORAGE/COMPRESSION/PK= produces an empty EXCEPT diff against the original.

Out of scope= : COMMENT ON, GRANT/REVOKE (matching the existing _ddl family), and typ= ed tables (CREATE TABLE name OF type).

Feedback is welcome, particul= arly on the option naming and the decision to reuse the C helpers directly = rather than add new SQL wrappers.

-----
Regards,
Akshay Joshi<= br>Princip= al Engineer | Engineering Manager | pgAdmin Hacker
EDB (Enterpris= eDB)

--0000000000000ead24065358fe5a-- --0000000000000ead26065358fe5c Content-Type: application/octet-stream; name="v1-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Disposition: attachment; filename="v1-0001-Add-pg_get_table_ddl-to-reconstruct-CREATE-TABLE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpy2nqwm0 RnJvbSA4YzQ5NWQwNDY1Nzg0MTM1MmNlOTgyYjI4Y2E5MjAzYjI4Nzk3MjNlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBUdWUsIDIgSnVuIDIwMjYgMTQ6MTg6NDAgKzA1MzAKU3ViamVjdDogW1BB VENIIHYxXSBBZGQgcGdfZ2V0X3RhYmxlX2RkbCgpIHRvIHJlY29uc3RydWN0IENSRUFURSBUQUJM RQogc3RhdGVtZW50cwoKVGhlIGZ1bmN0aW9uIHJlY29uc3RydWN0cyB0aGUgQ1JFQVRFIFRBQkxF IHN0YXRlbWVudCBmb3IgYW4gb3JkaW5hcnkgb3IKcGFydGl0aW9uZWQgdGFibGUsIGZvbGxvd2Vk IGJ5IHRoZSBBTFRFUiBUQUJMRSAvIENSRUFURSBJTkRFWCAvCkNSRUFURSBSVUxFIC8gQ1JFQVRF IFNUQVRJU1RJQ1Mgc3RhdGVtZW50cyBuZWVkZWQgdG8gcmVzdG9yZSBpdHMgZnVsbApkZWZpbml0 aW9uLiAgRWFjaCBzdGF0ZW1lbnQgaXMgcmV0dXJuZWQgYXMgYSBzZXBhcmF0ZSByb3cuCgpTdXBw b3J0ZWQgcGVyLWNvbHVtbiBmZWF0dXJlczogZGF0YSB0eXBlIHdpdGggdHlwZSBtb2RpZmllcnMs IENPTExBVEUsClNUT1JBR0UsIENPTVBSRVNTSU9OIChwZ2x6IC8gbHo0KSwgR0VORVJBVEVEIEFM V0FZUyBBUyAoZXhwcikKU1RPUkVEL1ZJUlRVQUwsIEdFTkVSQVRFRCBBTFdBWVN8QlkgREVGQVVM VCBBUyBJREVOVElUWSAod2l0aCBzZXF1ZW5jZQpvcHRpb25zKSwgREVGQVVMVCwgTk9UIE5VTEws IGFuZCBwZXItY29sdW1uIGF0dG9wdGlvbnMgZW1pdHRlZCBhcwpBTFRFUiBDT0xVTU4gU0VUICgu Li4pLgoKU3VwcG9ydGVkIHRhYmxlLWxldmVsIGZlYXR1cmVzOiBVTkxPR0dFRCwgSU5IRVJJVFMs IFBBUlRJVElPTiBCWSAoUkFOR0UKLyBMSVNUIC8gSEFTSCBwYXJlbnRzKSwgUEFSVElUSU9OIE9G IHBhcmVudCBGT1IgVkFMVUVTIChGUk9NL1RPLCBXSVRICm1vZHVsdXMvcmVtYWluZGVyLCBERUZB VUxUKSwgVVNJTkcgdGFibGUgYWNjZXNzIG1ldGhvZCwgV0lUSAoocmVsb3B0aW9ucyksIFRBQkxF U1BBQ0UsIGFuZCBpbmxpbmUgQ0hFQ0sgY29uc3RyYWludHMgaW4gdGhlCkNSRUFURSBUQUJMRSBi b2R5LgoKU3VwcG9ydGVkIHN1Yi1vYmplY3RzIChyZS11c2luZyBleGlzdGluZyBkZXBhcnNlIGhl bHBlcnMgZnJvbQpydWxldXRpbHMuYyk6IGluZGV4ZXMgdmlhIHBnX2dldF9pbmRleGRlZl9zdHJp bmcsIGNvbnN0cmFpbnRzCihQUklNQVJZIEtFWSwgVU5JUVVFLCBGT1JFSUdOIEtFWSwgRVhDTFVE RSwgbmFtZWQgTk9UIE5VTEwpIHZpYQpwZ19nZXRfY29uc3RyYWludGRlZl9jb21tYW5kLCBydWxl cyB2aWEgcGdfZ2V0X3J1bGVkZWYsIGV4dGVuZGVkCnN0YXRpc3RpY3MgdmlhIHBnX2dldF9zdGF0 aXN0aWNzb2JqZGVmX3N0cmluZywgUkVQTElDQSBJREVOVElUWQpOT1RISU5HL0ZVTEwvVVNJTkcg SU5ERVgsIEFMVEVSIFRBQkxFIEVOQUJMRS9GT1JDRSBST1cgTEVWRUwgU0VDVVJJVFksCmFuZCBj aGlsZC1sb2NhbCBERUZBVUxUIG92ZXJyaWRlcyBvbiBpbmhlcml0YW5jZS9wYXJ0aXRpb24gY2hp bGRyZW4uCgpEZWZhdWx0IG9taXNzaW9uIGNvbnZlbnRpb246IGV2ZXJ5IG9wdGlvbmFsIGNsYXVz ZSBpcyBkcm9wcGVkIHdoZW4gaXRzCnZhbHVlIGVxdWFscyB3aGF0IHRoZSBzeXN0ZW0gd291bGQg cmVhcHBseSBvbiByb3VuZC10cmlwLCBpbmNsdWRpbmcKdHlwZS1kZWZhdWx0IENPTExBVEUsIHBl ci10eXBlIFNUT1JBR0UsIHRoZSBhdXRvLWdlbmVyYXRlZCBpZGVudGl0eQpzZXF1ZW5jZSBuYW1l IGFuZCBwYXJhbWV0ZXIgZGVmYXVsdHMsIGhlYXAgYWNjZXNzIG1ldGhvZCwgZGVmYXVsdApSRVBM SUNBIElERU5USVRZLCBkaXNhYmxlZCBSTFMgdG9nZ2xlcywgZW1wdHkgcmVsb3B0aW9ucywgYW5k IHRoZQpkZWZhdWx0IHRhYmxlc3BhY2UuCgpBIHJlZ3Jlc3Npb24gdGVzdCB1bmRlciBzcmMvdGVz dC9yZWdyZXNzIGNvdmVycyBvcmRpbmFyeSB0YWJsZXMsCmlkZW50aXR5IChkZWZhdWx0IGFuZCBj dXN0b20gc2VxdWVuY2Ugb3B0aW9ucyksIGdlbmVyYXRlZCBjb2x1bW5zLApTVE9SQUdFL0NPTVBS RVNTSU9OLCBjb25zdHJhaW50cyAoQ0hFQ0svVU5JUVVFL0ZLIHdpdGggZGVmZXJyYWJsZSksCmZ1 bmN0aW9uYWwgYW5kIHBhcnRpYWwgaW5kZXhlcywgaW5oZXJpdGFuY2UgYW5kIHBhcnRpdGlvbmlu ZywKcGFydGl0aW9uIGNoaWxkcmVuIHdpdGggRk9SIFZBTFVFUyBGUk9NL1RPLCBXSVRIIG1vZHVs dXMvcmVtYWluZGVyLCBhbmQKREVGQVVMVCwgcnVsZXMsIGV4dGVuZGVkIHN0YXRpc3RpY3MsIFJM UyB0b2dnbGVzLCBSRVBMSUNBIElERU5USVRZLApVTkxPR0dFRCB3aXRoIHJlbG9wdGlvbnMsIHBl ci1jb2x1bW4gYXR0b3B0aW9ucywgY2hpbGQgREVGQVVMVApvdmVycmlkZXMsIHByZXR0eSBtb2Rl LCBvd25lcj1mYWxzZSwgYW5kIHRoZSBlcnJvciBwYXRocyBmb3Igdmlld3MsCnNlcXVlbmNlcywg TlVMTCwgdW5rbm93biBvcHRpb25zLCBhbmQgb2RkLXZhcmlhZGljIGFyZ3VtZW50IGNvdW50cy4K CkF1dGhvcjogQWtzaGF5IEpvc2hpIDxha3NoYXkuam9zaGlAZW50ZXJwcmlzZWRiLmNvbT4KLS0t CiBkb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbCAgICAgICAgICAgICAgfCAgIDYxICsK IHNyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jICAgICAgICAgICAgICB8ICAgMjcgKwog c3JjL2JhY2tlbmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMgICAgICAgICAgICAgIHwgMTMyNSArKysr KysrKysrKysrKysrKwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCAgICAgICAgICAg ICAgIHwgICAgNyArCiBzcmMvaW5jbHVkZS9jb21tYW5kcy90YWJsZWNtZHMuaCAgICAgICAgICAg ICAgfCAgICAxICsKIC4uLi9yZWdyZXNzL2V4cGVjdGVkL3BnX2dldF90YWJsZV9kZGwub3V0ICAg ICB8ICA0OTggKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZSAgICAg ICAgICAgIHwgICAgMiArLQogc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGdfZ2V0X3RhYmxlX2RkbC5z cWwgICAgIHwgIDI3OCArKysrCiA4IGZpbGVzIGNoYW5nZWQsIDIxOTggaW5zZXJ0aW9ucygrKSwg MSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvcGdfZ2V0X3RhYmxlX2RkbC5vdXQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWdy ZXNzL3NxbC9wZ19nZXRfdGFibGVfZGRsLnNxbAoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9m dW5jL2Z1bmMtaW5mby5zZ21sIGIvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwKaW5k ZXggMDBmNjRmNTBjZWIuLjQ4ZTk4NzIwOGQ1IDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvZnVu Yy9mdW5jLWluZm8uc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbApA QCAtMzk2MSw2ICszOTYxLDY3IEBAIGFjbCAgICAgIHwge3Bvc3RncmVzPWFyd2REeHRtL3Bvc3Rn cmVzLGZvbz1yL3Bvc3RncmVzfQogICAgICAgICA8bGl0ZXJhbD5UQUJMRVNQQUNFPC9saXRlcmFs Pi4KICAgICAgICA8L3BhcmE+PC9lbnRyeT4KICAgICAgIDwvcm93PgorICAgICAgPHJvdz4KKyAg ICAgICA8ZW50cnkgcm9sZT0iZnVuY190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iZnVuY19zaWdu YXR1cmUiPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgPHByaW1hcnk+cGdfZ2V0X3Rh YmxlX2RkbDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxmdW5jdGlv bj5wZ19nZXRfdGFibGVfZGRsPC9mdW5jdGlvbj4KKyAgICAgICAgKCA8cGFyYW1ldGVyPnRhYmxl PC9wYXJhbWV0ZXI+IDx0eXBlPnJlZ2NsYXNzPC90eXBlPgorICAgICAgICA8b3B0aW9uYWw+LCA8 bGl0ZXJhbD5WQVJJQURJQzwvbGl0ZXJhbD4gPHBhcmFtZXRlcj5vcHRpb25zPC9wYXJhbWV0ZXI+ CisgICAgICAgIDx0eXBlPnRleHQ8L3R5cGU+IDwvb3B0aW9uYWw+ICkKKyAgICAgICAgPHJldHVy bnZhbHVlPnNldG9mIHRleHQ8L3JldHVybnZhbHVlPgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8 cGFyYT4KKyAgICAgICAgUmVjb25zdHJ1Y3RzIHRoZSA8Y29tbWFuZD5DUkVBVEUgVEFCTEU8L2Nv bW1hbmQ+IHN0YXRlbWVudCBmb3IgdGhlCisgICAgICAgIHNwZWNpZmllZCBvcmRpbmFyeSBvciBw YXJ0aXRpb25lZCB0YWJsZSwgZm9sbG93ZWQgYnkgdGhlCisgICAgICAgIDxjb21tYW5kPkFMVEVS IFRBQkxFPC9jb21tYW5kPiwgPGNvbW1hbmQ+Q1JFQVRFIElOREVYPC9jb21tYW5kPiwKKyAgICAg ICAgPGNvbW1hbmQ+Q1JFQVRFIFJVTEU8L2NvbW1hbmQ+LCBhbmQgPGNvbW1hbmQ+Q1JFQVRFIFNU QVRJU1RJQ1M8L2NvbW1hbmQ+CisgICAgICAgIHN0YXRlbWVudHMgbmVlZGVkIHRvIHJlY3JlYXRl IHRoZSB0YWJsZSdzIGNvbHVtbnMsIGNvbnN0cmFpbnRzLAorICAgICAgICBpbmRleGVzLCBydWxl cywgZXh0ZW5kZWQgc3RhdGlzdGljcywgYW5kIHJvdy1sZXZlbCBzZWN1cml0eSBmbGFncy4KKyAg ICAgICAgSW5oZXJpdGVkIGNvbHVtbnMgYW5kIGNvbnN0cmFpbnRzIGFyZSBlbWl0dGVkIGJ5IHRo ZSBwYXJlbnQgdGFibGUncworICAgICAgICBEREwgYW5kIGFyZSBub3QgZHVwbGljYXRlZCBvbiBp bmhlcml0YW5jZSBjaGlsZHJlbiBvciBwYXJ0aXRpb25zLgorICAgICAgICBFYWNoIHN0YXRlbWVu dCBpcyByZXR1cm5lZCBhcyBhIHNlcGFyYXRlIHJvdy4KKyAgICAgICAgVGhlIGZvbGxvd2luZyBv cHRpb25zIGFyZSBzdXBwb3J0ZWQ6CisgICAgICAgIDxsaXRlcmFsPnByZXR0eTwvbGl0ZXJhbD4g KGJvb2xlYW4pIGZvciBmb3JtYXR0ZWQgb3V0cHV0LAorICAgICAgICA8bGl0ZXJhbD5vd25lcjwv bGl0ZXJhbD4gKGJvb2xlYW4pIHRvIGluY2x1ZGUgdGhlCisgICAgICAgIDxjb21tYW5kPkFMVEVS IFRBQkxFIC4uLiBPV05FUiBUTzwvY29tbWFuZD4gc3RhdGVtZW50LAorICAgICAgICA8bGl0ZXJh bD50YWJsZXNwYWNlPC9saXRlcmFsPiAoYm9vbGVhbikgdG8gaW5jbHVkZSB0aGUKKyAgICAgICAg PGxpdGVyYWw+VEFCTEVTUEFDRTwvbGl0ZXJhbD4gY2xhdXNlIG9uIHRoZQorICAgICAgICA8Y29t bWFuZD5DUkVBVEUgVEFCTEU8L2NvbW1hbmQ+IHN0YXRlbWVudCwgYW5kIGEgZmFtaWx5IG9mCisg ICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzXzxyZXBsYWNlYWJsZT5jYXRlZ29yeTwvcmVwbGFjZWFi bGU+PC9saXRlcmFsPgorICAgICAgICBib29sZWFucyB0aGF0IGdhdGUgZW1pc3Npb24gb2Ygb3B0 aW9uYWwgc3ViLW9iamVjdHM6CisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX2luZGV4ZXM8L2xp dGVyYWw+LAorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRlc19jb25zdHJhaW50czwvbGl0ZXJhbD4s CisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX3J1bGVzPC9saXRlcmFsPiwKKyAgICAgICAgPGxp dGVyYWw+aW5jbHVkZXNfc3RhdGlzdGljczwvbGl0ZXJhbD4sCisgICAgICAgIDxsaXRlcmFsPmlu Y2x1ZGVzX3RyaWdnZXJzPC9saXRlcmFsPiwKKyAgICAgICAgPGxpdGVyYWw+aW5jbHVkZXNfcG9s aWNpZXM8L2xpdGVyYWw+LAorICAgICAgICA8bGl0ZXJhbD5pbmNsdWRlc19ybHM8L2xpdGVyYWw+ ICh0aGUKKyAgICAgICAgPGNvbW1hbmQ+RU5BQkxFPC9jb21tYW5kPi88Y29tbWFuZD5GT1JDRSBS T1cgTEVWRUwgU0VDVVJJVFk8L2NvbW1hbmQ+CisgICAgICAgIHRvZ2dsZXMpLCBhbmQKKyAgICAg ICAgPGxpdGVyYWw+aW5jbHVkZXNfcmVwbGljYV9pZGVudGl0eTwvbGl0ZXJhbD4uICBFYWNoIG9m IHRoZXNlCisgICAgICAgIGRlZmF1bHRzIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LiAgVGhl CisgICAgICAgIDxsaXRlcmFsPmluY2x1ZGVzX3BhcnRpdGlvbjwvbGl0ZXJhbD4gb3B0aW9uLCB3 aGljaCBkZWZhdWx0cyB0bworICAgICAgICA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4sIGNvbnRy b2xzIHdoZXRoZXIgdGhlIERETCBmb3IgcGFydGl0aW9uCisgICAgICAgIGNoaWxkcmVuIGlzIGFw cGVuZGVkIGFmdGVyIGEgcGFydGl0aW9uZWQtdGFibGUgcGFyZW50LgorICAgICAgIDwvcGFyYT4K KyAgICAgICA8cGFyYT4KKyAgICAgICAgQWxsIHRocmVlIGZvcm1zIG9mIDxjb21tYW5kPkNSRUFU RSBUQUJMRTwvY29tbWFuZD4gYXJlIHN1cHBvcnRlZDoKKyAgICAgICAgdGhlIG9yZGluYXJ5IGNv bHVtbi1saXN0IGZvcm0sIHRoZSB0eXBlZC10YWJsZSBmb3JtCisgICAgICAgICg8bGl0ZXJhbD5P RiA8cmVwbGFjZWFibGU+dHlwZV9uYW1lPC9yZXBsYWNlYWJsZT48L2xpdGVyYWw+LCB3aXRoCisg ICAgICAgIHBlci1jb2x1bW4gPGxpdGVyYWw+V0lUSCBPUFRJT05TPC9saXRlcmFsPiBvdmVycmlk ZXMgZm9yIGxvY2FsCisgICAgICAgIGRlZmF1bHRzLCA8bGl0ZXJhbD5OT1QgTlVMTDwvbGl0ZXJh bD4sIGFuZCA8bGl0ZXJhbD5DSEVDSzwvbGl0ZXJhbD4KKyAgICAgICAgY29uc3RyYWludHMpLCBh bmQgdGhlIDxsaXRlcmFsPlBBUlRJVElPTiBPRjwvbGl0ZXJhbD4gZm9ybS4KKyAgICAgICAgPGxp dGVyYWw+VEVNUE9SQVJZPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+VU5MT0dHRUQ8L2xpdGVyYWw+ CisgICAgICAgIHBlcnNpc3RlbmNlIG1vZGVzIGFyZSBlbWl0dGVkIGZyb20KKyAgICAgICAgPHN0 cnVjdGZpZWxkPnJlbHBlcnNpc3RlbmNlPC9zdHJ1Y3RmaWVsZD4uICBGb3IgdGVtcG9yYXJ5IHRh YmxlcworICAgICAgICByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24sIHRoZQorICAg ICAgICA8bGl0ZXJhbD5PTiBDT01NSVQgREVMRVRFIFJPV1M8L2xpdGVyYWw+IGFuZAorICAgICAg ICA8bGl0ZXJhbD5PTiBDT01NSVQgRFJPUDwvbGl0ZXJhbD4gY2xhdXNlcyBhcmUgZW1pdHRlZDsg dGhlIGRlZmF1bHQKKyAgICAgICAgPGxpdGVyYWw+T04gQ09NTUlUIFBSRVNFUlZFIFJPV1M8L2xp dGVyYWw+IGlzIG9taXR0ZWQuCisgICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4K ICAgICAgPC90Ym9keT4KICAgICA8L3Rncm91cD4KICAgIDwvdGFibGU+CmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3Rh YmxlY21kcy5jCmluZGV4IGExODQ1MjQwYTk4Li5iMDJkZmI0NTFmOCAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMv dGFibGVjbWRzLmMKQEAgLTE5NTgzLDYgKzE5NTgzLDMzIEBAIHJlbW92ZV9vbl9jb21taXRfYWN0 aW9uKE9pZCByZWxpZCkKIAl9CiB9CiAKKy8qCisgKiBMb29rIHVwIHRoZSByZWdpc3RlcmVkIE9O IENPTU1JVCBhY3Rpb24gZm9yIGEgcmVsYXRpb24uCisgKgorICogUmV0dXJucyBPTkNPTU1JVF9O T09QIHdoZW4gbm90aGluZyB3YXMgcmVnaXN0ZXJlZCwgd2hpY2ggYWxzbyBjb3ZlcnMKKyAqIHRl bXBvcmFyeSB0YWJsZXMgY3JlYXRlZCB3aXRoIHRoZSBkZWZhdWx0IE9OIENPTU1JVCBQUkVTRVJW RSBST1dTCisgKiBiZWhhdmlvciAocmVnaXN0ZXJfb25fY29tbWl0X2FjdGlvbigpIHNraXBzIHRo b3NlLCBzaW5jZSBubyBhY3Rpb24gaXMKKyAqIG5lZWRlZCBhdCBjb21taXQpLiAgRW50cmllcyBt YXJrZWQgZm9yIGRlbGV0aW9uIGluIHRoZSBjdXJyZW50CisgKiB0cmFuc2FjdGlvbiBhcmUgaWdu b3JlZC4KKyAqLworT25Db21taXRBY3Rpb24KK2dldF9vbl9jb21taXRfYWN0aW9uKE9pZCByZWxp ZCkKK3sKKwlMaXN0Q2VsbCAgICpsOworCisJZm9yZWFjaChsLCBvbl9jb21taXRzKQorCXsKKwkJ T25Db21taXRJdGVtICpvYyA9IChPbkNvbW1pdEl0ZW0gKikgbGZpcnN0KGwpOworCisJCWlmIChv Yy0+cmVsaWQgIT0gcmVsaWQpCisJCQljb250aW51ZTsKKwkJaWYgKG9jLT5kZWxldGluZ19zdWJp ZCAhPSBJbnZhbGlkU3ViVHJhbnNhY3Rpb25JZCkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gb2Mt Pm9uY29tbWl0OworCX0KKwlyZXR1cm4gT05DT01NSVRfTk9PUDsKK30KKwogLyoKICAqIFBlcmZv cm0gT04gQ09NTUlUIGFjdGlvbnMuCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMv YWR0L2RkbHV0aWxzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYwppbmRleCBm MzJmY2Q0NTNlZi4uMzc2MWY2NWUxNTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9kZGx1dGlscy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9kZGx1dGlscy5jCkBAIC0y MSwxMiArMjEsMjcgQEAKICNpbmNsdWRlICJhY2Nlc3MvZ2VuYW0uaCIKICNpbmNsdWRlICJhY2Nl c3MvaHR1cF9kZXRhaWxzLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3RhYmxlLmgiCisjaW5jbHVkZSAi YWNjZXNzL3RvYXN0X2NvbXByZXNzaW9uLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19hdXRoX21l bWJlcnMuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2F1dGhpZC5oIgorI2luY2x1ZGUgImNhdGFs b2cvcGdfY2xhc3MuaCIKKyNpbmNsdWRlICJjYXRhbG9nL2RlcGVuZGVuY3kuaCIKICNpbmNsdWRl ICJjYXRhbG9nL3BnX2NvbGxhdGlvbi5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfY29uc3RyYWlu dC5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjYXRhbG9n L3BnX2RiX3JvbGVfc2V0dGluZy5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfYW0uaCIKKyNpbmNs dWRlICJjYXRhbG9nL3BnX2luaGVyaXRzLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19wb2xpY3ku aCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX3NlcXVlbmNlLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9w Z19zdGF0aXN0aWNfZXh0LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ190YWJsZXNwYWNlLmgiCisj aW5jbHVkZSAiY2F0YWxvZy9wZ190cmlnZ2VyLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wYXJ0aXRp b24uaCIKKyNpbmNsdWRlICJjb21tYW5kcy9kZWZyZW0uaCIKKyNpbmNsdWRlICJjb21tYW5kcy90 YWJsZWNtZHMuaCIKKyNpbmNsdWRlICJyZXdyaXRlL3ByczJsb2NrLmgiCisjaW5jbHVkZSAibm9k ZXMvbm9kZXMuaCIKICNpbmNsdWRlICJjb21tYW5kcy90YWJsZXNwYWNlLmgiCiAjaW5jbHVkZSAi Y29tbW9uL3JlbHBhdGguaCIKICNpbmNsdWRlICJmdW5jYXBpLmgiCkBAIC04Niw2ICsxMDEsMjcg QEAgc3RhdGljIExpc3QgKnBnX2dldF90YWJsZXNwYWNlX2RkbF9pbnRlcm5hbChPaWQgdHNpZCwg Ym9vbCBwcmV0dHksIGJvb2wgbm9fb3duZXIKIHN0YXRpYyBEYXR1bSBwZ19nZXRfdGFibGVzcGFj ZV9kZGxfc3JmKEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvLCBPaWQgdHNpZCwgYm9vbCBpc251bGwp Owogc3RhdGljIExpc3QgKnBnX2dldF9kYXRhYmFzZV9kZGxfaW50ZXJuYWwoT2lkIGRiaWQsIGJv b2wgcHJldHR5LAogCQkJCQkJCQkJCSAgYm9vbCBub19vd25lciwgYm9vbCBub190YWJsZXNwYWNl KTsKK3N0YXRpYyBMaXN0ICpwZ19nZXRfdGFibGVfZGRsX2ludGVybmFsKE9pZCByZWxpZCwgYm9v bCBwcmV0dHksCisJCQkJCQkJCQkgICBib29sIG5vX293bmVyLCBib29sIG5vX3RhYmxlc3BhY2Us CisJCQkJCQkJCQkgICBib29sIGluY2x1ZGVfaW5kZXhlcywKKwkJCQkJCQkJCSAgIGJvb2wgaW5j bHVkZV9jb25zdHJhaW50cywKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9ydWxlcywKKwkJCQkJ CQkJCSAgIGJvb2wgaW5jbHVkZV9zdGF0aXN0aWNzLAorCQkJCQkJCQkJICAgYm9vbCBpbmNsdWRl X3RyaWdnZXJzLAorCQkJCQkJCQkJICAgYm9vbCBpbmNsdWRlX3BvbGljaWVzLAorCQkJCQkJCQkJ ICAgYm9vbCBpbmNsdWRlX3JscywKKwkJCQkJCQkJCSAgIGJvb2wgaW5jbHVkZV9yZXBsaWNhX2lk ZW50aXR5LAorCQkJCQkJCQkJICAgYm9vbCBpbmNsdWRlX3BhcnRpdGlvbik7CitzdGF0aWMgdm9p ZCBhcHBlbmRfY29sdW1uX2RlZnMoU3RyaW5nSW5mbyBidWYsIFJlbGF0aW9uIHJlbCwgYm9vbCBw cmV0dHksCisJCQkJCQkJICAgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRzKTsKK3N0YXRpYyB2b2lk IGFwcGVuZF90eXBlZF9jb2x1bW5fb3ZlcnJpZGVzKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiBy ZWwsCisJCQkJCQkJCQkJICBib29sIHByZXR0eSwgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRzKTsK K3N0YXRpYyB2b2lkIGFwcGVuZF9pbmxpbmVfY2hlY2tfY29uc3RyYWludHMoU3RyaW5nSW5mbyBi dWYsIFJlbGF0aW9uIHJlbCwKKwkJCQkJCQkJCQkJYm9vbCBwcmV0dHksIGJvb2wgKmZpcnN0KTsK K3N0YXRpYyBjaGFyICpmaW5kX2F0dHJkZWZfdGV4dChSZWxhdGlvbiByZWwsIEF0dHJOdW1iZXIg YXR0bnVtLAorCQkJCQkJCSAgIExpc3QgKipkcGNvbnRleHQpOworc3RhdGljIGNoYXIgKmxvb2t1 cF9xdWFsaWZpZWRfcmVsbmFtZShPaWQgcmVsaWQpOworc3RhdGljIExpc3QgKmdldF9pbmhlcml0 YW5jZV9wYXJlbnRzKE9pZCByZWxpZCk7CiAKIAogLyoKQEAgLTExODUsMyArMTIyMSwxMjkyIEBA IHBnX2dldF9kYXRhYmFzZV9kZGwoUEdfRlVOQ1RJT05fQVJHUykKIAkJU1JGX1JFVFVSTl9ET05F KGZ1bmNjdHgpOwogCX0KIH0KKworLyoKKyAqIGdldF9pbmhlcml0YW5jZV9wYXJlbnRzCisgKgkJ UmV0dXJuIGEgTGlzdCBvZiBwYXJlbnQgT0lEcyBmb3IgcmVsaWQsIG9yZGVyZWQgYnkgaW5oc2Vx bm8uCisgKgorICogZmluZF9pbmhlcml0YW5jZV9jaGlsZHJlbigpIHdhbGtzIHRoZSBvcHBvc2l0 ZSBkaXJlY3Rpb24gKHBhcmVudC0+Y2hpbGRyZW4pLAorICogc28gd2Ugc2NhbiBwZ19pbmhlcml0 cyBkaXJlY3RseSBoZXJlIHVzaW5nIHRoZSAoaW5ocmVsaWQsIGluaHNlcW5vKSBpbmRleCwKKyAq IHdoaWNoIHlpZWxkcyByb3dzIGluIHRoZSBvcmRlciB0aGV5IG5lZWQgdG8gYXBwZWFyIGluIHRo ZSBJTkhFUklUUyBjbGF1c2UuCisgKiBQYXJ0aXRpb24gY2hpbGRyZW4gYWxzbyBoYXZlIGEgcGdf aW5oZXJpdHMgZW50cnksIHNvIGNhbGxlcnMgbXVzdCBza2lwIHRoZQorICogSU5IRVJJVFMgY2xh dXNlIHdoZW4gcmVsaXNwYXJ0aXRpb24gaXMgdHJ1ZS4KKyAqLworc3RhdGljIExpc3QgKgorZ2V0 X2luaGVyaXRhbmNlX3BhcmVudHMoT2lkIHJlbGlkKQoreworCVJlbGF0aW9uCWluaGVyaXRzUmVs OworCVN5c1NjYW5EZXNjIHNjYW47CisJU2NhbktleURhdGEga2V5OworCUhlYXBUdXBsZQl0dXA7 CisJTGlzdAkgICAqcGFyZW50cyA9IE5JTDsKKworCWluaGVyaXRzUmVsID0gdGFibGVfb3BlbihJ bmhlcml0c1JlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJU2NhbktleUluaXQoJmtleSwK KwkJCQlBbnVtX3BnX2luaGVyaXRzX2luaHJlbGlkLAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJl ciwgRl9PSURFUSwKKwkJCQlPYmplY3RJZEdldERhdHVtKHJlbGlkKSk7CisJc2NhbiA9IHN5c3Rh YmxlX2JlZ2luc2Nhbihpbmhlcml0c1JlbCwgSW5oZXJpdHNSZWxpZFNlcW5vSW5kZXhJZCwKKwkJ CQkJCQkgIHRydWUsIE5VTEwsIDEsICZrZXkpOworCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKHR1 cCA9IHN5c3RhYmxlX2dldG5leHQoc2NhbikpKQorCXsKKwkJRm9ybV9wZ19pbmhlcml0cyBpbmgg PSAoRm9ybV9wZ19pbmhlcml0cykgR0VUU1RSVUNUKHR1cCk7CisKKwkJcGFyZW50cyA9IGxhcHBl bmRfb2lkKHBhcmVudHMsIGluaC0+aW5ocGFyZW50KTsKKwl9CisJc3lzdGFibGVfZW5kc2Nhbihz Y2FuKTsKKwl0YWJsZV9jbG9zZShpbmhlcml0c1JlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCXJl dHVybiBwYXJlbnRzOworfQorCisvKgorICogbG9va3VwX3F1YWxpZmllZF9yZWxuYW1lCisgKgkJ UmV0dXJuIHRoZSBzY2hlbWEtcXVhbGlmaWVkLCBpZGVudGlmaWVyLXF1b3RlZCBuYW1lIG9mIGEg cmVsYXRpb24sCisgKgkJb3IgcmFpc2UgRVJSQ09ERV9VTkRFRklORURfT0JKRUNUIGlmIHRoZSBy ZWxhdGlvbiBoYXMgZGlzYXBwZWFyZWQuCisgKgorICogUmVwbGFjZXMgdGhlIHVuc2FmZSBwYXR0 ZXJuCisgKgkgIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKGdldF9uYW1lc3BhY2VfbmFtZShn ZXRfcmVsX25hbWVzcGFjZShvaWQpKSwKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Z2V0X3JlbF9uYW1lKG9pZCkpCisgKiB3aGljaCBkZXJlZmVyZW5jZXMgTlVMTCB3aGVuIGEgY29u Y3VycmVudCB0cmFuc2FjdGlvbiBoYXMgZHJvcHBlZCB0aGUKKyAqIHJlZmVyZW5jZWQgcmVsYXRp b24gKG9yIGl0cyBzY2hlbWEpIGJldHdlZW4gd2hlbiB3ZSBjYWNoZWQgaXRzIE9JRCBhbmQKKyAq IHdoZW4gd2UgYXNrIHRoZSBzeXNjYWNoZSBmb3IgaXRzIG5hbWUuICBIb2xkaW5nIEFjY2Vzc1No YXJlTG9jayBvbiBhCisgKiBkZXBlbmRlbnQgcmVsYXRpb24gbWFrZXMgdGhpcyByYWNlIHZhbmlz aGluZ2x5IHVubGlrZWx5IGluIHByYWN0aWNlLAorICogYnV0IHdlIHN0aWxsIGRlZmVuZCBhZ2Fp bnN0IGl0IGJlY2F1c2UgdGhlIGFsdGVybmF0aXZlIGlzIGEgU0lHU0VHVi4KKyAqCisgKiBDYWxs ZXIgaXMgcmVzcG9uc2libGUgZm9yIHBmcmVlKClpbmcgdGhlIHJlc3VsdC4KKyAqLworc3RhdGlj IGNoYXIgKgorbG9va3VwX3F1YWxpZmllZF9yZWxuYW1lKE9pZCByZWxpZCkKK3sKKwlIZWFwVHVw bGUJdHA7CisJRm9ybV9wZ19jbGFzcyByZWx0dXA7CisJY2hhcgkgICAqbnNwbmFtZTsKKwljaGFy CSAgICpyZXN1bHQ7CisKKwl0cCA9IFNlYXJjaFN5c0NhY2hlMShSRUxPSUQsIE9iamVjdElkR2V0 RGF0dW0ocmVsaWQpKTsKKwlpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHApKQorCQllcmVwb3J0KEVS Uk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJCQkJIGVycm1z ZygicmVsYXRpb24gd2l0aCBPSUQgJXUgZG9lcyBub3QgZXhpc3QiLCByZWxpZCksCisJCQkJIGVy cmRldGFpbCgiSXQgbWF5IGhhdmUgYmVlbiBjb25jdXJyZW50bHkgZHJvcHBlZC4iKSkpOworCisJ cmVsdHVwID0gKEZvcm1fcGdfY2xhc3MpIEdFVFNUUlVDVCh0cCk7CisJbnNwbmFtZSA9IGdldF9u YW1lc3BhY2VfbmFtZShyZWx0dXAtPnJlbG5hbWVzcGFjZSk7CisJaWYgKG5zcG5hbWUgPT0gTlVM TCkKKwl7CisJCU9pZAkJCW5zcG9pZCA9IHJlbHR1cC0+cmVsbmFtZXNwYWNlOworCisJCVJlbGVh c2VTeXNDYWNoZSh0cCk7CisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9V TkRFRklORURfT0JKRUNUKSwKKwkJCQkgZXJybXNnKCJzY2hlbWEgd2l0aCBPSUQgJXUgZG9lcyBu b3QgZXhpc3QiLCBuc3BvaWQpLAorCQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJlZW4gY29u Y3VycmVudGx5IGRyb3BwZWQuIikpKTsKKwl9CisKKwlyZXN1bHQgPSBxdW90ZV9xdWFsaWZpZWRf aWRlbnRpZmllcihuc3BuYW1lLCBOYW1lU3RyKHJlbHR1cC0+cmVsbmFtZSkpOworCisJcGZyZWUo bnNwbmFtZSk7CisJUmVsZWFzZVN5c0NhY2hlKHRwKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisK Ky8qCisgKiBmaW5kX2F0dHJkZWZfdGV4dAorICoJCVJldHVybiB0aGUgZGVwYXJzZWQgREVGQVVM VC9HRU5FUkFURUQgZXhwcmVzc2lvbiBmb3IgYXR0bnVtIG9uIHJlbCwKKyAqCQlvciBOVUxMIGlm IG5vIGVudHJ5IGV4aXN0cyBpbiBUdXBsZUNvbnN0ci0+ZGVmdmFsLgorICoKKyAqIFRoZSBjYWxs ZXIgcGFzc2VzIGEgTGlzdCAqKiBzbyB0aGF0IHRoZSBkZXBhcnNlIGNvbnRleHQgaXMgYnVpbHQg bGF6aWx5CisgKiBhbmQgcmV1c2VkIGFjcm9zcyBjYWxscyAoZGVwYXJzZV9jb250ZXh0X2ZvciBp cyBub3QgY2hlYXApLiAgUmV0dXJuZWQKKyAqIHN0cmluZyBpcyBwYWxsb2MnZCBpbiB0aGUgY3Vy cmVudCBtZW1vcnkgY29udGV4dDsgY2FsbGVyIHBmcmVlJ3MgaXQuCisgKi8KK3N0YXRpYyBjaGFy ICoKK2ZpbmRfYXR0cmRlZl90ZXh0KFJlbGF0aW9uIHJlbCwgQXR0ck51bWJlciBhdHRudW0sIExp c3QgKipkcGNvbnRleHQpCit7CisJVHVwbGVDb25zdHIgKmNvbnN0ciA9IFJlbGF0aW9uR2V0RGVz Y3IocmVsKS0+Y29uc3RyOworCisJaWYgKGNvbnN0ciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsK KworCWZvciAoaW50IGogPSAwOyBqIDwgY29uc3RyLT5udW1fZGVmdmFsOyBqKyspCisJeworCQlp ZiAoY29uc3RyLT5kZWZ2YWxbal0uYWRudW0gIT0gYXR0bnVtKQorCQkJY29udGludWU7CisKKwkJ aWYgKCpkcGNvbnRleHQgPT0gTklMKQorCQkJKmRwY29udGV4dCA9IGRlcGFyc2VfY29udGV4dF9m b3IoUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSwKKwkJCQkJCQkJCQkJIFJlbGF0aW9uR2V0 UmVsaWQocmVsKSk7CisKKwkJcmV0dXJuIGRlcGFyc2VfZXhwcmVzc2lvbihzdHJpbmdUb05vZGUo Y29uc3RyLT5kZWZ2YWxbal0uYWRiaW4pLAorCQkJCQkJCQkgICpkcGNvbnRleHQsIGZhbHNlLCBm YWxzZSk7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogYXBwZW5kX2lubGluZV9jaGVj a19jb25zdHJhaW50cworICoJCUVtaXQgZWFjaCBsb2NhbGx5LWRlY2xhcmVkIENIRUNLIGNvbnN0 cmFpbnQgb24gcmVsIGFzCisgKgkJIkNPTlNUUkFJTlQgbmFtZSA8cGdfZ2V0X2NvbnN0cmFpbnRk ZWY+Iiwgc2VwYXJhdGVkIGJ5ICcsJyBmcm9tIGFueQorICoJCXByZXZpb3VzbHktZW1pdHRlZCBj b2x1bW4gb3IgY29uc3RyYWludC4KKyAqCisgKiAqZmlyc3QgdHJhY2tzIHdoZXRoZXIgYW55dGhp bmcgaGFzIGJlZW4gZW1pdHRlZCBvbiB0aGlzIGxpc3QgeWV0LCBzbyB0aGUKKyAqIGNhbGxlciBj YW4gY2hhaW4gY29sdW1uIGVtaXNzaW9uIGFuZCBjb25zdHJhaW50IGVtaXNzaW9uIHRocm91Z2gg dGhlIHNhbWUKKyAqIGJ1ZmZlci4gIEluaGVyaXRlZCBDSEVDSyBjb25zdHJhaW50cyAoIWNvbmlz bG9jYWwpIGNvbWUgZnJvbSB0aGUgcGFyZW50J3MKKyAqIERETCBhbmQgYXJlbid0IHJlcGVhdGVk IGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkCithcHBlbmRfaW5saW5lX2NoZWNrX2NvbnN0cmFpbnRz KFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIGJvb2wgcHJldHR5LAorCQkJCQkJCQlib29s ICpmaXJzdCkKK3sKKwlSZWxhdGlvbgljb25SZWw7CisJU3lzU2NhbkRlc2MgY29uU2NhbjsKKwlT Y2FuS2V5RGF0YSBjb25LZXk7CisJSGVhcFR1cGxlCWNvblR1cDsKKworCWNvblJlbCA9IHRhYmxl X29wZW4oQ29uc3RyYWludFJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJU2NhbktleUlu aXQoJmNvbktleSwKKwkJCQlBbnVtX3BnX2NvbnN0cmFpbnRfY29ucmVsaWQsCisJCQkJQlRFcXVh bFN0cmF0ZWd5TnVtYmVyLCBGX09JREVRLAorCQkJCU9iamVjdElkR2V0RGF0dW0oUmVsYXRpb25H ZXRSZWxpZChyZWwpKSk7CisJY29uU2NhbiA9IHN5c3RhYmxlX2JlZ2luc2Nhbihjb25SZWwsIENv bnN0cmFpbnRSZWxpZFR5cGlkTmFtZUluZGV4SWQsCisJCQkJCQkJCSB0cnVlLCBOVUxMLCAxLCAm Y29uS2V5KTsKKworCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKGNvblR1cCA9IHN5c3RhYmxlX2dl dG5leHQoY29uU2NhbikpKQorCXsKKwkJRm9ybV9wZ19jb25zdHJhaW50IGNvbiA9IChGb3JtX3Bn X2NvbnN0cmFpbnQpIEdFVFNUUlVDVChjb25UdXApOworCQlEYXR1bQkJZGVmRGF0dW07CisJCWNo YXIJICAgKmRlZmJvZHk7CisKKwkJaWYgKGNvbi0+Y29udHlwZSAhPSBDT05TVFJBSU5UX0NIRUNL KQorCQkJY29udGludWU7CisJCWlmICghY29uLT5jb25pc2xvY2FsKQorCQkJY29udGludWU7CisK KwkJaWYgKCEqZmlyc3QpCisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcsJyk7CisJCSpm aXJzdCA9IGZhbHNlOworCQlpZiAocHJldHR5KQorCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhi dWYsICJcbiAgICAiKTsKKwkJZWxzZQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnICcp OworCisJCWRlZkRhdHVtID0gT2lkRnVuY3Rpb25DYWxsMShGX1BHX0dFVF9DT05TVFJBSU5UREVG X09JRCwKKwkJCQkJCQkJCU9iamVjdElkR2V0RGF0dW0oY29uLT5vaWQpKTsKKwkJZGVmYm9keSA9 IFRleHREYXR1bUdldENTdHJpbmcoZGVmRGF0dW0pOworCQlhcHBlbmRTdHJpbmdJbmZvKGJ1Ziwg IkNPTlNUUkFJTlQgJXMgJXMiLAorCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoTmFtZVN0cihjb24t PmNvbm5hbWUpKSwKKwkJCQkJCSBkZWZib2R5KTsKKwkJcGZyZWUoZGVmYm9keSk7CisJfQorCXN5 c3RhYmxlX2VuZHNjYW4oY29uU2Nhbik7CisJdGFibGVfY2xvc2UoY29uUmVsLCBBY2Nlc3NTaGFy ZUxvY2spOworfQorCisvKgorICogYXBwZW5kX2NvbHVtbl9kZWZzCisgKgkJQXBwZW5kIHRoZSBj b21tYS1zZXBhcmF0ZWQgY29sdW1uIGRlZmluaXRpb24gbGlzdCBmb3IgYSB0YWJsZS4KKyAqCisg KiBFbWl0cyBlYWNoIG5vbi1kcm9wcGVkLCBsb2NhbGx5LWRlY2xhcmVkIGNvbHVtbiBhcworICoJ CW5hbWUgdHlwZSBbQ09MTEFURSB4XSBbU1RPUkFHRSBzXSBbQ09NUFJFU1NJT04gY10KKyAqCQlb R0VORVJBVEVEIC4uLiB8IERFRkFVTFQgZV0gW05PVCBOVUxMXQorICogZm9sbG93ZWQgYnkgYW55 IGxvY2FsbHktZGVjbGFyZWQgaW5saW5lIENIRUNLIGNvbnN0cmFpbnRzLiAgT3B0aW9uYWwKKyAq IGNsYXVzZXMgYXJlIG9taXR0ZWQgd2hlbiB0aGVpciB2YWx1ZSBtYXRjaGVzIHdoYXQgdGhlIHN5 c3RlbSB3b3VsZAorICogcmVhcHBseSBvbiByb3VuZC10cmlwIChlLmcuIHR5cGUtZGVmYXVsdCBD T0xMQVRFLCB0eXBlLWRlZmF1bHQgU1RPUkFHRSkuCisgKi8KK3N0YXRpYyB2b2lkCithcHBlbmRf Y29sdW1uX2RlZnMoU3RyaW5nSW5mbyBidWYsIFJlbGF0aW9uIHJlbCwgYm9vbCBwcmV0dHksCisJ CQkJICAgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRzKQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0g UmVsYXRpb25HZXREZXNjcihyZWwpOworCUxpc3QJICAgKmRwY29udGV4dCA9IE5JTDsKKwlib29s CQlmaXJzdCA9IHRydWU7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IHR1cGRlc2MtPm5hdHRzOyBp KyspCisJeworCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHQgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2Ms IGkpOworCQljaGFyCSAgICp0eXBzdHI7CisKKwkJaWYgKGF0dC0+YXR0aXNkcm9wcGVkKQorCQkJ Y29udGludWU7CisKKwkJLyoKKwkJICogQ29sdW1ucyBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCBh cmUgZW1pdHRlZCBieSB0aGUgSU5IRVJJVFMgY2xhdXNlCisJCSAqIChvbmNlIGltcGxlbWVudGVk KSwgbm90IHRoZSBjb2x1bW4gbGlzdCwgdW5sZXNzIHRoZSBjaGlsZAorCQkgKiByZWRlY2xhcmVk IHRoZW0gbG9jYWxseSAoYXR0aXNsb2NhbD10cnVlKS4KKwkJICovCisJCWlmICghYXR0LT5hdHRp c2xvY2FsKQorCQkJY29udGludWU7CisKKwkJaWYgKCFmaXJzdCkKKwkJCWFwcGVuZFN0cmluZ0lu Zm9DaGFyKGJ1ZiwgJywnKTsKKwkJZmlyc3QgPSBmYWxzZTsKKworCQlpZiAocHJldHR5KQorCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICJcbiAgICAiKTsKKwkJZWxzZQorCQkJYXBwZW5k U3RyaW5nSW5mb0NoYXIoYnVmLCAnICcpOworCisJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVm LCBxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIoYXR0LT5hdHRuYW1lKSkpOworCQlhcHBlbmRTdHJp bmdJbmZvQ2hhcihidWYsICcgJyk7CisKKwkJdHlwc3RyID0gZm9ybWF0X3R5cGVfd2l0aF90eXBl bW9kKGF0dC0+YXR0dHlwaWQsIGF0dC0+YXR0dHlwbW9kKTsKKwkJYXBwZW5kU3RyaW5nSW5mb1N0 cmluZyhidWYsIHR5cHN0cik7CisJCXBmcmVlKHR5cHN0cik7CisKKwkJLyogQ09MTEFURSBjbGF1 c2UsIG9ubHkgaWYgaXQgZGlmZmVycyBmcm9tIHRoZSB0eXBlJ3MgZGVmYXVsdC4gKi8KKwkJaWYg KE9pZElzVmFsaWQoYXR0LT5hdHRjb2xsYXRpb24pICYmCisJCQlhdHQtPmF0dGNvbGxhdGlvbiAh PSBnZXRfdHlwY29sbGF0aW9uKGF0dC0+YXR0dHlwaWQpKQorCQkJYXBwZW5kU3RyaW5nSW5mbyhi dWYsICIgQ09MTEFURSAlcyIsCisJCQkJCQkJIGdlbmVyYXRlX2NvbGxhdGlvbl9uYW1lKGF0dC0+ YXR0Y29sbGF0aW9uKSk7CisKKwkJLyogU1RPUkFHRSBjbGF1c2UsIG9ubHkgaWYgaXQgZGlmZmVy cyBmcm9tIHRoZSB0eXBlJ3MgZGVmYXVsdC4gKi8KKwkJaWYgKGF0dC0+YXR0c3RvcmFnZSAhPSBn ZXRfdHlwc3RvcmFnZShhdHQtPmF0dHR5cGlkKSkKKwkJeworCQkJY29uc3QgY2hhciAqc3RvcmFn ZSA9IE5VTEw7CisKKwkJCXN3aXRjaCAoYXR0LT5hdHRzdG9yYWdlKQorCQkJeworCQkJCWNhc2Ug VFlQU1RPUkFHRV9QTEFJTjoKKwkJCQkJc3RvcmFnZSA9ICJQTEFJTiI7CisJCQkJCWJyZWFrOwor CQkJCWNhc2UgVFlQU1RPUkFHRV9FWFRFUk5BTDoKKwkJCQkJc3RvcmFnZSA9ICJFWFRFUk5BTCI7 CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVFlQU1RPUkFHRV9NQUlOOgorCQkJCQlzdG9yYWdlID0g Ik1BSU4iOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRZUFNUT1JBR0VfRVhURU5ERUQ6CisJCQkJ CXN0b3JhZ2UgPSAiRVhURU5ERUQiOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdG9yYWdl KQorCQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIFNUT1JBR0UgJXMiLCBzdG9yYWdlKTsKKwkJ fQorCisJCS8qIENPTVBSRVNTSU9OIGNsYXVzZSwgb25seSBpZiBleHBsaWNpdGx5IHNldCBvbiB0 aGUgY29sdW1uLiAqLworCQlpZiAoQ29tcHJlc3Npb25NZXRob2RJc1ZhbGlkKGF0dC0+YXR0Y29t cHJlc3Npb24pKQorCQl7CisJCQljb25zdCBjaGFyICpjbSA9IE5VTEw7CisKKwkJCXN3aXRjaCAo YXR0LT5hdHRjb21wcmVzc2lvbikKKwkJCXsKKwkJCQljYXNlIFRPQVNUX1BHTFpfQ09NUFJFU1NJ T046CisJCQkJCWNtID0gInBnbHoiOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRPQVNUX0xaNF9D T01QUkVTU0lPTjoKKwkJCQkJY20gPSAibHo0IjsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAo Y20pCisJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgQ09NUFJFU1NJT04gJXMiLCBjbSk7CisJ CX0KKworCQkvKgorCQkgKiBMb29rIHVwIHRoZSBkZWZhdWx0L2dlbmVyYXRlZCBleHByZXNzaW9u IHRleHQgdXAgZnJvbnQ7IGdlbmVyYXRlZAorCQkgKiBjb2x1bW5zIGhhdmUgYXR0aGFzZGVmPXRy dWUgd2l0aCBhbiBlbnRyeSBpbiBwZ19hdHRyZGVmIGp1c3QgbGlrZQorCQkgKiByZWd1bGFyIGRl ZmF1bHRzLgorCQkgKi8KKwkJeworCQkJY2hhcgkgICAqZGVmZXhwciA9IE5VTEw7CisKKwkJCWlm IChhdHQtPmF0dGhhc2RlZikKKwkJCQlkZWZleHByID0gZmluZF9hdHRyZGVmX3RleHQocmVsLCBh dHQtPmF0dG51bSwgJmRwY29udGV4dCk7CisKKwkJCS8qIEdFTkVSQVRFRCAvIElERU5USVRZIC8g REVGQVVMVCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAqLworCQkJaWYgKGF0dC0+YXR0Z2VuZXJh dGVkID09IEFUVFJJQlVURV9HRU5FUkFURURfU1RPUkVEICYmIGRlZmV4cHIpCisJCQkJYXBwZW5k U3RyaW5nSW5mbyhidWYsICIgR0VORVJBVEVEIEFMV0FZUyBBUyAoJXMpIFNUT1JFRCIsIGRlZmV4 cHIpOworCQkJZWxzZSBpZiAoYXR0LT5hdHRnZW5lcmF0ZWQgPT0gQVRUUklCVVRFX0dFTkVSQVRF RF9WSVJUVUFMICYmIGRlZmV4cHIpCisJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgR0VORVJB VEVEIEFMV0FZUyBBUyAoJXMpIFZJUlRVQUwiLCBkZWZleHByKTsKKwkJCWVsc2UgaWYgKGF0dC0+ YXR0aWRlbnRpdHkgPT0gQVRUUklCVVRFX0lERU5USVRZX0FMV0FZUyB8fAorCQkJCQkgYXR0LT5h dHRpZGVudGl0eSA9PSBBVFRSSUJVVEVfSURFTlRJVFlfQllfREVGQVVMVCkKKwkJCXsKKwkJCQlj b25zdCBjaGFyICppZGtpbmQgPQorCQkJCQkoYXR0LT5hdHRpZGVudGl0eSA9PSBBVFRSSUJVVEVf SURFTlRJVFlfQUxXQVlTKQorCQkJCQk/ICJBTFdBWVMiIDogIkJZIERFRkFVTFQiOworCQkJCU9p ZAkJCXNlcWlkID0gZ2V0SWRlbnRpdHlTZXF1ZW5jZShyZWwsIGF0dC0+YXR0bnVtLCB0cnVlKTsK KworCQkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiIEdFTkVSQVRFRCAlcyBBUyBJREVOVElUWSIs IGlka2luZCk7CisKKwkJCQkvKgorCQkJCSAqIEVtaXQgb25seSB0aGUgc2VxdWVuY2Ugb3B0aW9u cyB0aGF0IGRpZmZlciBmcm9tIHRoZWlyCisJCQkJICogZGVmYXVsdHMg4oCUIG1pcnJvcmluZyBw Z19nZXRfZGF0YWJhc2VfZGRsJ3MgcGF0dGVybiBvZgorCQkJCSAqIG9taXR0aW5nIHZhbHVlcyB0 aGF0IHRoZSBzeXN0ZW0gd291bGQgcmVhcHBseSBvbiBpdHMgb3duLgorCQkJCSAqLworCQkJCWlm IChPaWRJc1ZhbGlkKHNlcWlkKSkKKwkJCQl7CisJCQkJCUhlYXBUdXBsZQlzZXFUdXAgPSBTZWFy Y2hTeXNDYWNoZTEoU0VRUkVMSUQsCisJCQkJCQkJCQkJCQkJCSBPYmplY3RJZEdldERhdHVtKHNl cWlkKSk7CisKKwkJCQkJaWYgKEhlYXBUdXBsZUlzVmFsaWQoc2VxVHVwKSkKKwkJCQkJeworCQkJ CQkJRm9ybV9wZ19zZXF1ZW5jZSBzZXEgPSAoRm9ybV9wZ19zZXF1ZW5jZSkgR0VUU1RSVUNUKHNl cVR1cCk7CisJCQkJCQlTdHJpbmdJbmZvRGF0YSBvcHRzOworCQkJCQkJYm9vbAkJZmlyc3Rfb3B0 ID0gdHJ1ZTsKKwkJCQkJCWludDY0CQlkZWZfbWluLAorCQkJCQkJCQkJZGVmX21heCwKKwkJCQkJ CQkJCWRlZl9zdGFydDsKKwkJCQkJCWludDY0CQl0eXBfbWluLAorCQkJCQkJCQkJdHlwX21heDsK KworCQkJCQkJLyoKKwkJCQkJCSAqIFBlci10eXBlIGJvdW5kcyBmb3IgdGhlIHNlcXVlbmNlJ3Mg dW5kZXJseWluZworCQkJCQkJICogaW50ZWdlciB0eXBlLiAgRGVmYXVsdHMgdG8gaW50OCBpZiB0 aGUgY29sdW1uIHR5cGUKKwkJCQkJCSAqIGlzIHNvbWV0aGluZyBlbHNlIChzaG91bGRuJ3QgaGFw cGVuIGZvciBJREVOVElUWSwKKwkJCQkJCSAqIGJ1dCBiZSBkZWZlbnNpdmUpLgorCQkJCQkJICov CisJCQkJCQlzd2l0Y2ggKGF0dC0+YXR0dHlwaWQpCisJCQkJCQl7CisJCQkJCQkJY2FzZSBJTlQy T0lEOgorCQkJCQkJCQl0eXBfbWluID0gUEdfSU5UMTZfTUlOOworCQkJCQkJCQl0eXBfbWF4ID0g UEdfSU5UMTZfTUFYOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIElOVDRPSUQ6CisJCQkJ CQkJCXR5cF9taW4gPSBQR19JTlQzMl9NSU47CisJCQkJCQkJCXR5cF9tYXggPSBQR19JTlQzMl9N QVg7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXR5cF9taW4gPSBQ R19JTlQ2NF9NSU47CisJCQkJCQkJCXR5cF9tYXggPSBQR19JTlQ2NF9NQVg7CisJCQkJCQkJCWJy ZWFrOworCQkJCQkJfQorCisJCQkJCQlpZiAoc2VxLT5zZXFpbmNyZW1lbnQgPiAwKQorCQkJCQkJ eworCQkJCQkJCWRlZl9taW4gPSAxOworCQkJCQkJCWRlZl9tYXggPSB0eXBfbWF4OworCQkJCQkJ CWRlZl9zdGFydCA9IGRlZl9taW47CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJ CQkJZGVmX21pbiA9IHR5cF9taW47CisJCQkJCQkJZGVmX21heCA9IC0xOworCQkJCQkJCWRlZl9z dGFydCA9IGRlZl9tYXg7CisJCQkJCQl9CisKKwkJCQkJCWluaXRTdHJpbmdJbmZvKCZvcHRzKTsK KworCQkJCQkJLyoKKwkJCQkJCSAqIFNFUVVFTkNFIE5BTUUg4oCUIG9taXQgd2hlbiBpdCBtYXRj aGVzIHRoZQorCQkJCQkJICogaW1wbGljaXQgIjx0YWJsZW5hbWU+Xzxjb2x1bW5uYW1lPl9zZXEi IHBhdHRlcm4KKwkJCQkJCSAqIGluIHRoZSBzYW1lIHNjaGVtYSwgc2luY2UgQ1JFQVRFIFRBQkxF IHdpbGwKKwkJCQkJCSAqIHJlZ2VuZXJhdGUgdGhhdCBleGFjdCBuYW1lLiAgVGhlIHNlcXVlbmNl IGlzIGFuCisJCQkJCQkgKiBJTlRFUk5BTCBkZXBlbmRlbmN5IG9mIHRoZSBjb2x1bW4sIHNvIHRo ZSBsb2NrCisJCQkJCQkgKiB3ZSBob2xkIG9uIHRoZSB0YWJsZSBhbHNvIHBpbnMgaXQsIGJ1dCB0 aGUKKwkJCQkJCSAqIGxvb2t1cCBoZWxwZXIgc3RpbGwgZGVmZW5kcyBhZ2FpbnN0IGEgbWlzc2lu ZworCQkJCQkJICogcGdfY2xhc3Mgcm93LgorCQkJCQkJICovCisJCQkJCQl7CisJCQkJCQkJSGVh cFR1cGxlCXNlcUNsYXNzVHVwOworCQkJCQkJCUZvcm1fcGdfY2xhc3Mgc2VxQ2xhc3M7CisJCQkJ CQkJY2hhcgkJYXV0b25hbWVbTkFNRURBVEFMRU5dOworCisJCQkJCQkJc2VxQ2xhc3NUdXAgPSBT ZWFyY2hTeXNDYWNoZTEoUkVMT0lELAorCQkJCQkJCQkJCQkJCQkgIE9iamVjdElkR2V0RGF0dW0o c2VxaWQpKTsKKwkJCQkJCQlpZiAoIUhlYXBUdXBsZUlzVmFsaWQoc2VxQ2xhc3NUdXApKQorCQkJ CQkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVE X09CSkVDVCksCisJCQkJCQkJCQkJIGVycm1zZygiaWRlbnRpdHkgc2VxdWVuY2Ugd2l0aCBPSUQg JXUgZG9lcyBub3QgZXhpc3QiLAorCQkJCQkJCQkJCQkJc2VxaWQpLAorCQkJCQkJCQkJCSBlcnJk ZXRhaWwoIkl0IG1heSBoYXZlIGJlZW4gY29uY3VycmVudGx5IGRyb3BwZWQuIikpKTsKKwkJCQkJ CQlzZXFDbGFzcyA9IChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1Qoc2VxQ2xhc3NUdXApOworCisJ CQkJCQkJc25wcmludGYoYXV0b25hbWUsIHNpemVvZihhdXRvbmFtZSksICIlc18lc19zZXEiLAor CQkJCQkJCQkJIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCksCisJCQkJCQkJCQkgTmFtZVN0 cihhdHQtPmF0dG5hbWUpKTsKKwkJCQkJCQlpZiAoc2VxQ2xhc3MtPnJlbG5hbWVzcGFjZSAhPSBS ZWxhdGlvbkdldE5hbWVzcGFjZShyZWwpIHx8CisJCQkJCQkJCXN0cmNtcChOYW1lU3RyKHNlcUNs YXNzLT5yZWxuYW1lKSwgYXV0b25hbWUpICE9IDApCisJCQkJCQkJeworCQkJCQkJCQljaGFyCSAg ICpzZXFRdWFsID0KKwkJCQkJCQkJCWxvb2t1cF9xdWFsaWZpZWRfcmVsbmFtZShzZXFpZCk7CisK KwkJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVzU0VRVUVOQ0UgTkFNRSAlcyIsCisJ CQkJCQkJCQkJCQkgZmlyc3Rfb3B0ID8gIiIgOiAiICIsIHNlcVF1YWwpOworCQkJCQkJCQlmaXJz dF9vcHQgPSBmYWxzZTsKKwkJCQkJCQkJcGZyZWUoc2VxUXVhbCk7CisJCQkJCQkJfQorCQkJCQkJ CVJlbGVhc2VTeXNDYWNoZShzZXFDbGFzc1R1cCk7CisJCQkJCQl9CisKKwkJCQkJCWlmIChzZXEt PnNlcXN0YXJ0ICE9IGRlZl9zdGFydCkKKwkJCQkJCXsKKwkJCQkJCQlhcHBlbmRTdHJpbmdJbmZv KCZvcHRzLCAiJXNTVEFSVCBXSVRIICIgSU5UNjRfRk9STUFULAorCQkJCQkJCQkJCQkgZmlyc3Rf b3B0ID8gIiIgOiAiICIsIHNlcS0+c2Vxc3RhcnQpOworCQkJCQkJCWZpcnN0X29wdCA9IGZhbHNl OworCQkJCQkJfQorCQkJCQkJaWYgKHNlcS0+c2VxaW5jcmVtZW50ICE9IDEpCisJCQkJCQl7CisJ CQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVzSU5DUkVNRU5UIEJZICIgSU5UNjRfRk9S TUFULAorCQkJCQkJCQkJCQkgZmlyc3Rfb3B0ID8gIiIgOiAiICIsIHNlcS0+c2VxaW5jcmVtZW50 KTsKKwkJCQkJCQlmaXJzdF9vcHQgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzZXEtPnNl cW1pbiAhPSBkZWZfbWluKQorCQkJCQkJeworCQkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJm9wdHMs ICIlc01JTlZBTFVFICIgSU5UNjRfRk9STUFULAorCQkJCQkJCQkJCQkgZmlyc3Rfb3B0ID8gIiIg OiAiICIsIHNlcS0+c2VxbWluKTsKKwkJCQkJCQlmaXJzdF9vcHQgPSBmYWxzZTsKKwkJCQkJCX0K KwkJCQkJCWlmIChzZXEtPnNlcW1heCAhPSBkZWZfbWF4KQorCQkJCQkJeworCQkJCQkJCWFwcGVu ZFN0cmluZ0luZm8oJm9wdHMsICIlc01BWFZBTFVFICIgSU5UNjRfRk9STUFULAorCQkJCQkJCQkJ CQkgZmlyc3Rfb3B0ID8gIiIgOiAiICIsIHNlcS0+c2VxbWF4KTsKKwkJCQkJCQlmaXJzdF9vcHQg PSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChzZXEtPnNlcWNhY2hlICE9IDEpCisJCQkJCQl7 CisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmb3B0cywgIiVzQ0FDSEUgIiBJTlQ2NF9GT1JNQVQs CisJCQkJCQkJCQkJCSBmaXJzdF9vcHQgPyAiIiA6ICIgIiwgc2VxLT5zZXFjYWNoZSk7CisJCQkJ CQkJZmlyc3Rfb3B0ID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCQlpZiAoc2VxLT5zZXFjeWNsZSkK KwkJCQkJCXsKKwkJCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZvcHRzLCAiJXNDWUNMRSIsIGZpcnN0 X29wdCA/ICIiIDogIiAiKTsKKwkJCQkJCQlmaXJzdF9vcHQgPSBmYWxzZTsKKwkJCQkJCX0KKwor CQkJCQkJaWYgKCFmaXJzdF9vcHQpCisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgKCVz KSIsIG9wdHMuZGF0YSk7CisKKwkJCQkJCXBmcmVlKG9wdHMuZGF0YSk7CisJCQkJCQlSZWxlYXNl U3lzQ2FjaGUoc2VxVHVwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKGRlZmV4 cHIpCisJCQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgREVGQVVMVCAlcyIsIGRlZmV4cHIpOwor CisJCQlpZiAoZGVmZXhwcikKKwkJCQlwZnJlZShkZWZleHByKTsKKwkJfQorCisJCWlmIChhdHQt PmF0dG5vdG51bGwpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIiBOT1QgTlVMTCIp OworCX0KKworCS8qCisJICogVGFibGUtbGV2ZWwgQ0hFQ0sgY29uc3RyYWludHMg4oCUIGVtaXR0 ZWQgaW5saW5lIGluIHRoZSBDUkVBVEUgVEFCTEUKKwkgKiBib2R5IHNvIHRoZXkgYXBwZWFyIGFs b25nc2lkZSB0aGUgY29sdW1ucyAodGhlIHBnX2R1bXAgc2hhcGUpLiAgVGhlCisJICogY29uc3Ry YWludCBsb29wIGxhdGVyIGluIHBnX2dldF90YWJsZV9kZGxfaW50ZXJuYWwgc2tpcHMgQ0hFQ0sK KwkgKiBjb25zdHJhaW50cyB0byBhdm9pZCBkb3VibGUtZW1pc3Npb24uCisJICovCisJaWYgKGlu Y2x1ZGVfY29uc3RyYWludHMpCisJCWFwcGVuZF9pbmxpbmVfY2hlY2tfY29uc3RyYWludHMoYnVm LCByZWwsIHByZXR0eSwgJmZpcnN0KTsKK30KKworLyoKKyAqIGFwcGVuZF90eXBlZF9jb2x1bW5f b3ZlcnJpZGVzCisgKgkJRm9yIGEgdHlwZWQgdGFibGUgKENSRUFURSBUQUJMRSAuLi4gT0YgdHlw ZV9uYW1lKSwgYXBwZW5kIHRoZQorICoJCW9wdGlvbmFsICIoY29sIFdJVEggT1BUSU9OUyAuLi4s IC4uLikiIGxpc3QgY2FycnlpbmcgbG9jYWxseQorICoJCWFwcGxpZWQgcGVyLWNvbHVtbiBvdmVy cmlkZXMg4oCUIERFRkFVTFQsIE5PVCBOVUxMLCBhbmQgYW55IGxvY2FsbHkKKyAqCQlkZWNsYXJl ZCBDSEVDSyBjb25zdHJhaW50cy4KKyAqCisgKiBDb2x1bW5zIHdob3NlIHR5cGUgaXMgZnVsbHkg ZGljdGF0ZWQgYnkgcmVsb2Z0eXBlIGVtaXQgbm90aGluZy4gIFRoZQorICogcGFyZW50aGVzaXNl ZCBsaXN0IGlzIHN1cHByZXNzZWQgZW50aXJlbHkgd2hlbiBubyBjb2x1bW4gbmVlZHMgYW4KKyAq IG92ZXJyaWRlIGFuZCB0aGVyZSBhcmUgbm8gbG9jYWxseS1kZWNsYXJlZCBDSEVDSyBjb25zdHJh aW50cywgbWF0Y2hpbmcKKyAqIHRoZSBjYW5vbmljYWwgIkNSRUFURSBUQUJMRSB4IE9GIHQ7IiBz aGFwZS4KKyAqLworc3RhdGljIHZvaWQKK2FwcGVuZF90eXBlZF9jb2x1bW5fb3ZlcnJpZGVzKFN0 cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIGJvb2wgcHJldHR5LAorCQkJCQkJCSAgYm9vbCBp bmNsdWRlX2NvbnN0cmFpbnRzKQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXRE ZXNjcihyZWwpOworCUxpc3QJICAgKmRwY29udGV4dCA9IE5JTDsKKwlTdHJpbmdJbmZvRGF0YSBp bm5lcjsKKwlib29sCQlmaXJzdCA9IHRydWU7CisKKwlpbml0U3RyaW5nSW5mbygmaW5uZXIpOwor CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0dXBkZXNjLT5uYXR0czsgaSsrKQorCXsKKwkJRm9ybV9w Z19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBpKTsKKwkJY2hhcgkgICAq ZGVmZXhwciA9IE5VTEw7CisJCWJvb2wJCWhhc19kZWZhdWx0OworCQlib29sCQloYXNfbm90bnVs bDsKKworCQlpZiAoYXR0LT5hdHRpc2Ryb3BwZWQpCisJCQljb250aW51ZTsKKworCQlpZiAoYXR0 LT5hdHRoYXNkZWYpCisJCQlkZWZleHByID0gZmluZF9hdHRyZGVmX3RleHQocmVsLCBhdHQtPmF0 dG51bSwgJmRwY29udGV4dCk7CisKKwkJaGFzX2RlZmF1bHQgPSAoZGVmZXhwciAhPSBOVUxMKTsK KwkJaGFzX25vdG51bGwgPSBhdHQtPmF0dG5vdG51bGw7CisKKwkJaWYgKCFoYXNfZGVmYXVsdCAm JiAhaGFzX25vdG51bGwpCisJCXsKKwkJCWlmIChkZWZleHByKQorCQkJCXBmcmVlKGRlZmV4cHIp OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5m b0NoYXIoJmlubmVyLCAnLCcpOworCQlmaXJzdCA9IGZhbHNlOworCQlpZiAocHJldHR5KQorCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZygmaW5uZXIsICJcbiAgICAiKTsKKwkJZWxzZQorCQkJYXBw ZW5kU3RyaW5nSW5mb0NoYXIoJmlubmVyLCAnICcpOworCisJCWFwcGVuZFN0cmluZ0luZm8oJmlu bmVyLCAiJXMgV0lUSCBPUFRJT05TIiwKKwkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIo YXR0LT5hdHRuYW1lKSkpOworCQlpZiAoaGFzX2RlZmF1bHQpCisJCQlhcHBlbmRTdHJpbmdJbmZv KCZpbm5lciwgIiBERUZBVUxUICVzIiwgZGVmZXhwcik7CisJCWlmIChoYXNfbm90bnVsbCkKKwkJ CWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmlubmVyLCAiIE5PVCBOVUxMIik7CisKKwkJaWYgKGRl ZmV4cHIpCisJCQlwZnJlZShkZWZleHByKTsKKwl9CisKKwkvKgorCSAqIExvY2FsbHktZGVjbGFy ZWQgQ0hFQ0sgY29uc3RyYWludHMgb24gYSB0eXBlZCB0YWJsZSBiZWxvbmcgaW4gdGhlCisJICog Y29sdW1uLWxpc3QgcGFyZW50aGVzZXMsIHNhbWUgYXMgZm9yIGFuIHVudHlwZWQgdGFibGUuICBU aGUKKwkgKiBvdXQtb2YtbGluZSBjb25zdHJhaW50IGxvb3AgbGF0ZXIgc3RpbGwgc2tpcHMgQ0hF Q0tzLgorCSAqLworCWlmIChpbmNsdWRlX2NvbnN0cmFpbnRzKQorCQlhcHBlbmRfaW5saW5lX2No ZWNrX2NvbnN0cmFpbnRzKCZpbm5lciwgcmVsLCBwcmV0dHksICZmaXJzdCk7CisKKwlpZiAoIWZp cnN0KQorCXsKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgKCIpOworCQlhcHBlbmRT dHJpbmdJbmZvU3RyaW5nKGJ1ZiwgaW5uZXIuZGF0YSk7CisJCWlmIChwcmV0dHkpCisJCQlhcHBl bmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIlxuKSIpOworCQllbHNlCisJCQlhcHBlbmRTdHJpbmdJ bmZvQ2hhcihidWYsICcpJyk7CisJfQorCXBmcmVlKGlubmVyLmRhdGEpOworfQorCisvKgorICog cGdfZ2V0X3RhYmxlX2RkbF9pbnRlcm5hbAorICoJCUdlbmVyYXRlIERETCBzdGF0ZW1lbnRzIHRv IHJlY3JlYXRlIGEgcmVndWxhciBvciBwYXJ0aXRpb25lZCB0YWJsZS4KKyAqCisgKiBUaGUgZmly c3QgbGlzdCBlbGVtZW50IGlzIHRoZSBDUkVBVEUgVEFCTEUgc3RhdGVtZW50LiAgU3Vic2VxdWVu dAorICogZWxlbWVudHMgYXJlIHRoZSBBTFRFUiBUQUJMRSAvIENSRUFURSBJTkRFWCAvIENSRUFU RSBSVUxFIC8KKyAqIENSRUFURSBTVEFUSVNUSUNTIHN0YXRlbWVudHMgbmVlZGVkIHRvIHJlc3Rv cmUgdGhlIHRhYmxlJ3MgZnVsbAorICogZGVmaW5pdGlvbi4KKyAqCisgKiBUcmlnZ2VyIGFuZCBw b2xpY3kgZW1pc3Npb24gYXJlIHNjYWZmb2xkZWQgYnV0IG5vdCB5ZXQgd2lyZWQgdXAg4oCUIHRo ZXkKKyAqIGFyZSBnYXRlZCBvbiBzdGFuZGFsb25lIHBnX2dldF90cmlnZ2VyX2RkbCAvIHBnX2dl dF9wb2xpY3lfZGRsIGhlbHBlcnMKKyAqIGxhbmRpbmcuCisgKi8KK3N0YXRpYyBMaXN0ICoKK3Bn X2dldF90YWJsZV9kZGxfaW50ZXJuYWwoT2lkIHJlbGlkLCBib29sIHByZXR0eSwKKwkJCQkJCSAg Ym9vbCBub19vd25lciwgYm9vbCBub190YWJsZXNwYWNlLAorCQkJCQkJICBib29sIGluY2x1ZGVf aW5kZXhlcywKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX2NvbnN0cmFpbnRzLAorCQkJCQkJICBib29s IGluY2x1ZGVfcnVsZXMsCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9zdGF0aXN0aWNzLAorCQkJCQkJ ICBib29sIGluY2x1ZGVfdHJpZ2dlcnMsCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9wb2xpY2llcywK KwkJCQkJCSAgYm9vbCBpbmNsdWRlX3JscywKKwkJCQkJCSAgYm9vbCBpbmNsdWRlX3JlcGxpY2Ff aWRlbnRpdHksCisJCQkJCQkgIGJvb2wgaW5jbHVkZV9wYXJ0aXRpb24pCit7CisJUmVsYXRpb24J cmVsOworCVN0cmluZ0luZm9EYXRhIGJ1ZjsKKwlMaXN0CSAgICpzdGF0ZW1lbnRzID0gTklMOwor CWNoYXIJICAgKnF1YWxuYW1lOworCWNoYXIJCXJlbGtpbmQ7CisJY2hhcgkJcmVscGVyc2lzdGVu Y2U7CisJYm9vbAkJaXNfdHlwZWQ7CisJQWNsUmVzdWx0CWFjbHJlc3VsdDsKKworCXJlbCA9IHRh YmxlX29wZW4ocmVsaWQsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlyZWxraW5kID0gcmVsLT5yZF9y ZWwtPnJlbGtpbmQ7CisJcmVscGVyc2lzdGVuY2UgPSByZWwtPnJkX3JlbC0+cmVscGVyc2lzdGVu Y2U7CisJaXNfdHlwZWQgPSBPaWRJc1ZhbGlkKHJlbC0+cmRfcmVsLT5yZWxvZnR5cGUpOworCisJ LyoKKwkgKiBUaGUgaW5pdGlhbCBjdXQgb25seSBzdXBwb3J0cyBvcmRpbmFyeSBhbmQgcGFydGl0 aW9uZWQgdGFibGVzLiAgVmlld3MsCisJICogbWF0dmlld3MsIGZvcmVpZ24gdGFibGVzLCBzZXF1 ZW5jZXMsIGluZGV4ZXMsIGNvbXBvc2l0ZSB0eXBlcywgYW5kCisJICogVE9BU1QgdGFibGVzIGFy ZSBvdXQgb2Ygc2NvcGUgZm9yIG5vdy4KKwkgKi8KKwlpZiAocmVsa2luZCAhPSBSRUxLSU5EX1JF TEFUSU9OICYmIHJlbGtpbmQgIT0gUkVMS0lORF9QQVJUSVRJT05FRF9UQUJMRSkKKwl7CisJCWNo YXIJICAgKnJlbG5hbWUgPSBwc3RyZHVwKFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkpOwor CisJCXRhYmxlX2Nsb3NlKHJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKwkJZXJlcG9ydChFUlJPUiwK KwkJCQkoZXJyY29kZShFUlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKKwkJCQkgZXJybXNnKCJc IiVzXCIgaXMgbm90IGFuIG9yZGluYXJ5IG9yIHBhcnRpdGlvbmVkIHRhYmxlIiwKKwkJCQkJCXJl bG5hbWUpKSk7CisJfQorCisJLyogQ2FsbGVyIG5lZWRzIFNFTEVDVCBvbiB0aGUgdGFibGUgdG8g cmVhZCBpdHMgZGVmaW5pdGlvbi4gKi8KKwlhY2xyZXN1bHQgPSBwZ19jbGFzc19hY2xjaGVjayhy ZWxpZCwgR2V0VXNlcklkKCksIEFDTF9TRUxFQ1QpOworCWlmIChhY2xyZXN1bHQgIT0gQUNMQ0hF Q0tfT0spCisJCWFjbGNoZWNrX2Vycm9yKGFjbHJlc3VsdCwgT0JKRUNUX1RBQkxFLAorCQkJCQkg ICBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKTsKKworCXF1YWxuYW1lID0gbG9va3VwX3F1 YWxpZmllZF9yZWxuYW1lKHJlbGlkKTsKKworCWluaXRTdHJpbmdJbmZvKCZidWYpOworCisJLyog cGdfY2xhc3MgdHVwbGUg4oCUIGZvciByZWxwYXJ0Ym91bmQgYW5kIHJlbG9wdGlvbnMgKi8KKwl7 CisJCUhlYXBUdXBsZQljbGFzc3R1cDsKKwkJRGF0dW0JCXJlbG9wdERhdHVtOworCQlib29sCQly ZWxvcHRJc251bGw7CisKKwkJY2xhc3N0dXAgPSBTZWFyY2hTeXNDYWNoZTEoUkVMT0lELCBPYmpl Y3RJZEdldERhdHVtKHJlbGlkKSk7CisJCWlmICghSGVhcFR1cGxlSXNWYWxpZChjbGFzc3R1cCkp CisJCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgcmVsYXRpb24gJXUiLCBy ZWxpZCk7CisKKwkJcmVsb3B0RGF0dW0gPSBTeXNDYWNoZUdldEF0dHIoUkVMT0lELCBjbGFzc3R1 cCwKKwkJCQkJCQkJCSAgQW51bV9wZ19jbGFzc19yZWxvcHRpb25zLCAmcmVsb3B0SXNudWxsKTsK KworCQkvKgorCQkgKiBDUkVBVEUgW1RFTVBPUkFSWSB8IFVOTE9HR0VEXSBUQUJMRSBxdWFsbmFt ZSAuLi4KKwkJICoKKwkJICogUGVyc2lzdGVuY2UgYXBwbGllcyB1bmlmb3JtbHkgdG8gYWxsIHRo cmVlIENSRUFURSBUQUJMRSBmb3JtcworCQkgKiAocmVndWxhciBjb2x1bW4gbGlzdCwgT0YgdHlw ZV9uYW1lLCBhbmQgUEFSVElUSU9OIE9GKS4gIE9ubHkgb25lCisJCSAqIG9mIFRFTVBPUkFSWSAv IFVOTE9HR0VEIGNhbiBiZSBzZXQ7IHRoZSByZWxwZXJzaXN0ZW5jZSBjYXRhbG9nCisJCSAqIGZp ZWxkIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoLgorCQkgKi8KKwkJYXBwZW5kU3RyaW5n SW5mb1N0cmluZygmYnVmLCAiQ1JFQVRFICIpOworCQlpZiAocmVscGVyc2lzdGVuY2UgPT0gUkVM UEVSU0lTVEVOQ0VfVEVNUCkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmJ1ZiwgIlRFTVBP UkFSWSAiKTsKKwkJZWxzZSBpZiAocmVscGVyc2lzdGVuY2UgPT0gUkVMUEVSU0lTVEVOQ0VfVU5M T0dHRUQpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZidWYsICJVTkxPR0dFRCAiKTsKKwkJ YXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiVEFCTEUgJXMiLCBxdWFsbmFtZSk7CisKKwkJaWYgKHJl bC0+cmRfcmVsLT5yZWxpc3BhcnRpdGlvbikKKwkJeworCQkJLyogUEFSVElUSU9OIE9GIHBhcmVu dCBGT1IgVkFMVUVTIC4uLiAqLworCQkJT2lkCQkJcGFyZW50T2lkID0gZ2V0X3BhcnRpdGlvbl9w YXJlbnQocmVsaWQsIHRydWUpOworCQkJY2hhcgkgICAqcGFyZW50UXVhbCA9IGxvb2t1cF9xdWFs aWZpZWRfcmVsbmFtZShwYXJlbnRPaWQpOworCQkJY2hhcgkgICAqcGFyZW50UmVsbmFtZSA9IGdl dF9yZWxfbmFtZShwYXJlbnRPaWQpOworCQkJRGF0dW0JCWJvdW5kRGF0dW07CisJCQlib29sCQli b3VuZElzbnVsbDsKKwkJCWNoYXIJICAgKmZvclZhbHVlcyA9IE5VTEw7CisJCQljaGFyCSAgICpi b3VuZFN0ciA9IE5VTEw7CisKKwkJCWlmIChwYXJlbnRSZWxuYW1lID09IE5VTEwpCisJCQkJZXJl cG9ydChFUlJPUiwKKwkJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX09CSkVDVCksCisJ CQkJCQkgZXJybXNnKCJwYXJ0aXRpb24gcGFyZW50IHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0 IiwKKwkJCQkJCQkJcGFyZW50T2lkKSwKKwkJCQkJCSBlcnJkZXRhaWwoIkl0IG1heSBoYXZlIGJl ZW4gY29uY3VycmVudGx5IGRyb3BwZWQuIikpKTsKKworCQkJYm91bmREYXR1bSA9IFN5c0NhY2hl R2V0QXR0cihSRUxPSUQsIGNsYXNzdHVwLAorCQkJCQkJCQkJCSBBbnVtX3BnX2NsYXNzX3JlbHBh cnRib3VuZCwgJmJvdW5kSXNudWxsKTsKKwkJCWlmICghYm91bmRJc251bGwpCisJCQl7CisJCQkJ Tm9kZQkgICAqYm91bmROb2RlOworCQkJCUxpc3QJICAgKmRwY29udGV4dDsKKworCQkJCWJvdW5k U3RyID0gVGV4dERhdHVtR2V0Q1N0cmluZyhib3VuZERhdHVtKTsKKwkJCQlib3VuZE5vZGUgPSBz dHJpbmdUb05vZGUoYm91bmRTdHIpOworCQkJCWRwY29udGV4dCA9IGRlcGFyc2VfY29udGV4dF9m b3IocGFyZW50UmVsbmFtZSwgcGFyZW50T2lkKTsKKwkJCQlmb3JWYWx1ZXMgPSBkZXBhcnNlX2V4 cHJlc3Npb24oYm91bmROb2RlLCBkcGNvbnRleHQsIGZhbHNlLCBmYWxzZSk7CisJCQl9CisKKwkJ CWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwgIiBQQVJUSVRJT04gT0YgJXMgJXMiLAorCQkJCQkJCSBw YXJlbnRRdWFsLCBmb3JWYWx1ZXMgPyBmb3JWYWx1ZXMgOiAiREVGQVVMVCIpOworCQkJaWYgKGZv clZhbHVlcykKKwkJCQlwZnJlZShmb3JWYWx1ZXMpOworCQkJaWYgKGJvdW5kU3RyKQorCQkJCXBm cmVlKGJvdW5kU3RyKTsKKwkJCXBmcmVlKHBhcmVudFF1YWwpOworCQkJcGZyZWUocGFyZW50UmVs bmFtZSk7CisKKwkJCS8qCisJCQkgKiBDb2x1bW4tbGV2ZWwgb3ZlcnJpZGVzIHJlZGVjbGFyZWQg b24gdGhlIGNoaWxkIGFyZSBlbWl0dGVkCisJCQkgKiBvdXQtb2YtbGluZTogTk9UIE5VTEwvQ0hF Q0sgY29tZSB0aHJvdWdoIHRoZSBjb25zdHJhaW50IGxvb3AKKwkJCSAqIChjb25pc2xvY2FsPXRy dWUpLCBhbmQgREVGQVVMVCBjb21lcyB0aHJvdWdoIHRoZSBkZWRpY2F0ZWQKKwkJCSAqIEFMVEVS IENPTFVNTiBTRVQgREVGQVVMVCBwYXNzIGJlbG93LgorCQkJICovCisJCX0KKwkJZWxzZSBpZiAo aXNfdHlwZWQpCisJCXsKKwkJCS8qCisJCQkgKiBUeXBlZCB0YWJsZTogQ1JFQVRFIFRBQkxFIG5h bWUgT0YgdHlwZV9uYW1lIFsoY29sIFdJVEgKKwkJCSAqIE9QVElPTlMgLi4uKV0uICBUaGUgY29s dW1uIGxpc3QgKHdoZW4gcHJlc2VudCkgY2FycmllcyBvbmx5CisJCQkgKiBsb2NhbGx5LWFwcGxp ZWQgb3ZlcnJpZGVzIOKAlCBkZWZhdWx0cywgTk9UIE5VTEwgdG9nZ2xlcywgYW5kCisJCQkgKiBs b2NhbGx5LWRlY2xhcmVkIENIRUNLIGNvbnN0cmFpbnRzIOKAlCBmb3IgY29sdW1ucyB3aG9zZSB0 eXBlCisJCQkgKiBpcyBvdGhlcndpc2UgZGljdGF0ZWQgYnkgcmVsb2Z0eXBlLgorCQkJICovCisJ CQljaGFyCSAgICp0eXBuYW1lID0gZm9ybWF0X3R5cGVfYmVfcXVhbGlmaWVkKHJlbC0+cmRfcmVs LT5yZWxvZnR5cGUpOworCisJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsICIgT0YgJXMiLCB0eXBu YW1lKTsKKwkJCXBmcmVlKHR5cG5hbWUpOworCisJCQlhcHBlbmRfdHlwZWRfY29sdW1uX292ZXJy aWRlcygmYnVmLCByZWwsIHByZXR0eSwgaW5jbHVkZV9jb25zdHJhaW50cyk7CisJCX0KKwkJZWxz ZQorCQl7CisJCQlMaXN0CSAgICpwYXJlbnRzOworCQkJTGlzdENlbGwgICAqbGM7CisJCQlib29s CQlmaXJzdDsKKworCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmYnVmLCAiICgiKTsKKworCQkJ YXBwZW5kX2NvbHVtbl9kZWZzKCZidWYsIHJlbCwgcHJldHR5LCBpbmNsdWRlX2NvbnN0cmFpbnRz KTsKKworCQkJaWYgKHByZXR0eSkKKwkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZidWYsICJc bikiKTsKKwkJCWVsc2UKKwkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmYnVmLCAnKScpOworCisJ CQkvKiBJTkhFUklUUyAocGFyZW50MSwgcGFyZW50MiwgLi4uKSDigJQgbm9uLXBhcnRpdGlvbiBp bmhlcml0YW5jZSBvbmx5ICovCisJCQlwYXJlbnRzID0gZ2V0X2luaGVyaXRhbmNlX3BhcmVudHMo cmVsaWQpOworCQkJaWYgKHBhcmVudHMgIT0gTklMKQorCQkJeworCQkJCWFwcGVuZFN0cmluZ0lu Zm9TdHJpbmcoJmJ1ZiwgIiBJTkhFUklUUyAoIik7CisJCQkJZmlyc3QgPSB0cnVlOworCQkJCWZv cmVhY2gobGMsIHBhcmVudHMpCisJCQkJeworCQkJCQlPaWQJCQlwb2lkID0gbGZpcnN0X29pZChs Yyk7CisJCQkJCWNoYXIJICAgKnBuYW1lID0gbG9va3VwX3F1YWxpZmllZF9yZWxuYW1lKHBvaWQp OworCisJCQkJCWlmICghZmlyc3QpCisJCQkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZidWYs ICIsICIpOworCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5n KCZidWYsIHBuYW1lKTsKKwkJCQkJcGZyZWUocG5hbWUpOworCQkJCX0KKwkJCQlhcHBlbmRTdHJp bmdJbmZvQ2hhcigmYnVmLCAnKScpOworCQkJCWxpc3RfZnJlZShwYXJlbnRzKTsKKwkJCX0KKwkJ fQorCisJCS8qIFBBUlRJVElPTiBCWSDigJQgYXBwbGllcyB3aGVuZXZlciB0aGlzIHJlbGF0aW9u IGlzIGEgcGFydGl0aW9uZWQgdGFibGUgKi8KKwkJaWYgKHJlbGtpbmQgPT0gUkVMS0lORF9QQVJU SVRJT05FRF9UQUJMRSkKKwkJeworCQkJRGF0dW0JCXBhcnRrZXlEYXR1bTsKKwkJCWNoYXIJICAg KnBhcnRrZXk7CisKKwkJCXBhcnRrZXlEYXR1bSA9IE9pZEZ1bmN0aW9uQ2FsbDEoRl9QR19HRVRf UEFSVEtFWURFRiwKKwkJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShyZWxpZCkpOworCQkJcGFy dGtleSA9IFRleHREYXR1bUdldENTdHJpbmcocGFydGtleURhdHVtKTsKKwkJCWFwcGVuZFN0cmlu Z0luZm8oJmJ1ZiwgIiBQQVJUSVRJT04gQlkgJXMiLCBwYXJ0a2V5KTsKKwkJCXBmcmVlKHBhcnRr ZXkpOworCQl9CisKKwkJLyoKKwkJICogVVNJTkcgbWV0aG9kIOKAlCBlbWl0IG9ubHkgd2hlbiB0 aGUgdGFibGUgYWNjZXNzIG1ldGhvZCBkaWZmZXJzCisJCSAqIGZyb20gaGVhcCAodGhlIGNsdXN0 ZXIgZGVmYXVsdCkuICBQbHVnZ2FibGUgdGFibGUgQU1zIGhhdmUgYmVlbgorCQkgKiBzdXBwb3J0 ZWQgc2luY2UgUG9zdGdyZVNRTCAxMi4KKwkJICovCisJCWlmIChPaWRJc1ZhbGlkKHJlbC0+cmRf cmVsLT5yZWxhbSkgJiYKKwkJCXJlbC0+cmRfcmVsLT5yZWxhbSAhPSBIRUFQX1RBQkxFX0FNX09J RCkKKwkJeworCQkJY2hhcgkgICAqYW1uYW1lID0gZ2V0X2FtX25hbWUocmVsLT5yZF9yZWwtPnJl bGFtKTsKKworCQkJaWYgKGFtbmFtZSAhPSBOVUxMKQorCQkJeworCQkJCWFwcGVuZFN0cmluZ0lu Zm8oJmJ1ZiwgIiBVU0lORyAlcyIsIHF1b3RlX2lkZW50aWZpZXIoYW1uYW1lKSk7CisJCQkJcGZy ZWUoYW1uYW1lKTsKKwkJCX0KKwkJfQorCisJCS8qIFdJVEggKHJlbG9wdGlvbnMpICovCisJCWlm ICghcmVsb3B0SXNudWxsKQorCQl7CisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKCZidWYsICIg V0lUSCAoIik7CisJCQlnZXRfcmVsb3B0aW9ucygmYnVmLCByZWxvcHREYXR1bSk7CisJCQlhcHBl bmRTdHJpbmdJbmZvQ2hhcigmYnVmLCAnKScpOworCQl9CisKKwkJUmVsZWFzZVN5c0NhY2hlKGNs YXNzdHVwKTsKKwl9CisKKwkvKiBUQUJMRVNQQUNFICovCisJaWYgKCFub190YWJsZXNwYWNlICYm IE9pZElzVmFsaWQocmVsLT5yZF9yZWwtPnJlbHRhYmxlc3BhY2UpKQorCXsKKwkJY2hhcgkgICAq dHNuYW1lID0gZ2V0X3RhYmxlc3BhY2VfbmFtZShyZWwtPnJkX3JlbC0+cmVsdGFibGVzcGFjZSk7 CisKKwkJaWYgKHRzbmFtZSAhPSBOVUxMKQorCQl7CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYs ICIgVEFCTEVTUEFDRSAlcyIsIHF1b3RlX2lkZW50aWZpZXIodHNuYW1lKSk7CisJCQlwZnJlZSh0 c25hbWUpOworCQl9CisJfQorCisJLyoKKwkgKiBPTiBDT01NSVQgYXBwbGllcyBvbmx5IHRvIHRl bXBvcmFyeSB0YWJsZXMuICBUaGUgYWN0aW9uIGxpdmVzIGluIGEKKwkgKiBiYWNrZW5kLWxvY2Fs IGxpc3QgKG5vdCB0aGUgY2F0YWxvZykgc2luY2UgaXQncyBhIHNlc3Npb24tc2NvcGVkCisJICog cHJvcGVydHksIHNvIHRoaXMgaXMgYmVzdC1lZmZvcnQ6IHdlIGNhbiBvbmx5IHNlZSBlbnRyaWVz IHJlZ2lzdGVyZWQKKwkgKiBpbiB0aGUgY3VycmVudCBiYWNrZW5kLiAgUFJFU0VSVkUgUk9XUyBp cyB0aGUgZGVmYXVsdCBhbmQgaXMgbm90CisJICogZW1pdHRlZDsgTk9PUCBpbmRpY2F0ZXMgbm8g ZW50cnkgd2FzIGZvdW5kLgorCSAqLworCWlmIChyZWxwZXJzaXN0ZW5jZSA9PSBSRUxQRVJTSVNU RU5DRV9URU1QKQorCXsKKwkJT25Db21taXRBY3Rpb24gb2MgPSBnZXRfb25fY29tbWl0X2FjdGlv bihyZWxpZCk7CisKKwkJaWYgKG9jID09IE9OQ09NTUlUX0RFTEVURV9ST1dTKQorCQkJYXBwZW5k U3RyaW5nSW5mb1N0cmluZygmYnVmLCAiIE9OIENPTU1JVCBERUxFVEUgUk9XUyIpOworCQllbHNl IGlmIChvYyA9PSBPTkNPTU1JVF9EUk9QKQorCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmYnVm LCAiIE9OIENPTU1JVCBEUk9QIik7CisJfQorCisJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmJ1Ziwg JzsnKTsKKwlzdGF0ZW1lbnRzID0gbGFwcGVuZChzdGF0ZW1lbnRzLCBwc3RyZHVwKGJ1Zi5kYXRh KSk7CisKKwkvKiBPV05FUiAqLworCWlmICghbm9fb3duZXIpCisJeworCQljaGFyCSAgICpvd25l ciA9IEdldFVzZXJOYW1lRnJvbUlkKHJlbC0+cmRfcmVsLT5yZWxvd25lciwgZmFsc2UpOworCisJ CXJlc2V0U3RyaW5nSW5mbygmYnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiQUxURVIg VEFCTEUgJXMgT1dORVIgVE8gJXM7IiwKKwkJCQkJCSBxdWFsbmFtZSwgcXVvdGVfaWRlbnRpZmll cihvd25lcikpOworCQlzdGF0ZW1lbnRzID0gbGFwcGVuZChzdGF0ZW1lbnRzLCBwc3RyZHVwKGJ1 Zi5kYXRhKSk7CisJCXBmcmVlKG93bmVyKTsKKwl9CisKKwkvKgorCSAqIFBlci1jb2x1bW4gREVG QVVMVCBvdmVycmlkZXMgb24gaW5oZXJpdGVkL3BhcnRpdGlvbiBjaGlsZHJlbi4gIFRoZQorCSAq IGNvbHVtbiBsaXN0IGluc2lkZSBDUkVBVEUgVEFCTEUgb25seSBlbWl0cyBsb2NhbGx5LWRlY2xh cmVkIGNvbHVtbnMKKwkgKiAoYXR0aXNsb2NhbD10cnVlKSwgc28gYW55IGRlZmF1bHQgc2V0IGxv Y2FsbHkgb24gYSBjb2x1bW4gdGhhdCBjYW1lCisJICogZnJvbSBhIHBhcmVudCB0YWJsZSBuZWVk cyB0byBiZSByZS1hcHBsaWVkIHdpdGggQUxURVIgQ09MVU1OIFNFVAorCSAqIERFRkFVTFQuICBO b3RlOiBOT1QgTlVMTCBvdmVycmlkZXMgY29tZSBvdXQgdGhyb3VnaCB0aGUgY29uc3RyYWludAor CSAqIGxvb3AgKFBHIDE4IHN0b3JlcyB0aGVtIGFzIG5hbWVkIHBnX2NvbnN0cmFpbnQgZW50cmll cyB3aXRoCisJICogY29uaXNsb2NhbD10cnVlKSwgYW5kIENIRUNLIG92ZXJyaWRlcyBkbyB0b28u CisJICovCisJeworCQlUdXBsZURlc2MJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsKTsK KwkJTGlzdAkgICAqZHBjb250ZXh0ID0gTklMOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHVw ZGVzYy0+bmF0dHM7IGkrKykKKwkJeworCQkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVE ZXNjQXR0cih0dXBkZXNjLCBpKTsKKwkJCWNoYXIJICAgKmRlZnN0cjsKKworCQkJaWYgKGF0dC0+ YXR0aXNkcm9wcGVkIHx8IGF0dC0+YXR0aXNsb2NhbCB8fCAhYXR0LT5hdHRoYXNkZWYpCisJCQkJ Y29udGludWU7CisKKwkJCWRlZnN0ciA9IGZpbmRfYXR0cmRlZl90ZXh0KHJlbCwgYXR0LT5hdHRu dW0sICZkcGNvbnRleHQpOworCQkJaWYgKGRlZnN0ciA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOwor CisJCQlyZXNldFN0cmluZ0luZm8oJmJ1Zik7CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsCisJ CQkJCQkJICJBTFRFUiBUQUJMRSAlcyBBTFRFUiBDT0xVTU4gJXMgU0VUIERFRkFVTFQgJXM7IiwK KwkJCQkJCQkgcXVhbG5hbWUsCisJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoTmFtZVN0cihhdHQt PmF0dG5hbWUpKSwKKwkJCQkJCQkgZGVmc3RyKTsKKwkJCXN0YXRlbWVudHMgPSBsYXBwZW5kKHN0 YXRlbWVudHMsIHBzdHJkdXAoYnVmLmRhdGEpKTsKKwkJCXBmcmVlKGRlZnN0cik7CisJCX0KKwl9 CisKKwkvKgorCSAqIFBlci1jb2x1bW4gYXR0b3B0aW9ucyDigJQgdGhlc2UgY2FuJ3QgYmUgc2V0 IGlubGluZSBpbiBDUkVBVEUgVEFCTEUsCisJICogc28gdGhleSBjb21lIG91dCBhcyBBTFRFUiBU QUJMRSAuLi4gQUxURVIgQ09MVU1OIGNvbCBTRVQgKC4uLikgYWZ0ZXIKKwkgKiB0aGUgdGFibGUg aXMgY3JlYXRlZC4gIFR5cGljYWwgdXNlOiBuX2Rpc3RpbmN0IG92ZXJyaWRlcyBmb3IgdGhlCisJ ICogcGxhbm5lci4KKwkgKi8KKwl7CisJCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXRE ZXNjcihyZWwpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHVwZGVzYy0+bmF0dHM7IGkrKykK KwkJeworCQkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBp KTsKKwkJCUhlYXBUdXBsZQlhdHRUdXA7CisJCQlEYXR1bQkJb3B0RGF0dW07CisJCQlib29sCQlv cHRJc251bGw7CisKKwkJCWlmIChhdHQtPmF0dGlzZHJvcHBlZCkKKwkJCQljb250aW51ZTsKKwor CQkJYXR0VHVwID0gU2VhcmNoU3lzQ2FjaGUyKEFUVE5VTSwKKwkJCQkJCQkJCSBPYmplY3RJZEdl dERhdHVtKHJlbGlkKSwKKwkJCQkJCQkJCSBJbnQxNkdldERhdHVtKGF0dC0+YXR0bnVtKSk7CisJ CQlpZiAoIUhlYXBUdXBsZUlzVmFsaWQoYXR0VHVwKSkKKwkJCQljb250aW51ZTsKKworCQkJb3B0 RGF0dW0gPSBTeXNDYWNoZUdldEF0dHIoQVRUTlVNLCBhdHRUdXAsCisJCQkJCQkJCQkgICBBbnVt X3BnX2F0dHJpYnV0ZV9hdHRvcHRpb25zLCAmb3B0SXNudWxsKTsKKwkJCWlmICghb3B0SXNudWxs KQorCQkJeworCQkJCXJlc2V0U3RyaW5nSW5mbygmYnVmKTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZv KCZidWYsICJBTFRFUiBUQUJMRSAlcyBBTFRFUiBDT0xVTU4gJXMgU0VUICgiLAorCQkJCQkJCQkg cXVhbG5hbWUsCisJCQkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIoYXR0LT5hdHRuYW1l KSkpOworCQkJCWdldF9yZWxvcHRpb25zKCZidWYsIG9wdERhdHVtKTsKKwkJCQlhcHBlbmRTdHJp bmdJbmZvU3RyaW5nKCZidWYsICIpOyIpOworCQkJCXN0YXRlbWVudHMgPSBsYXBwZW5kKHN0YXRl bWVudHMsIHBzdHJkdXAoYnVmLmRhdGEpKTsKKwkJCX0KKwkJCVJlbGVhc2VTeXNDYWNoZShhdHRU dXApOworCQl9CisJfQorCisJLyoKKwkgKiBJbmRleGVzIOKAlCBlbWl0IGEgQ1JFQVRFIElOREVY IGZvciBlYWNoIG5vbi1jb25zdHJhaW50LWJhY2tlZCBpbmRleCBvbgorCSAqIHRoZSB0YWJsZS4g IEluZGV4ZXMgdGhhdCBiYWNrIFBLL1VOSVFVRS9FWENMVURFIGNvbnN0cmFpbnRzIGFyZQorCSAq IGVtaXR0ZWQgYnkgdGhlIGNvbnN0cmFpbnQgbG9vcCBiZWxvdyBhcyBwYXJ0IG9mIHRoZSBBTFRF UiBUQUJMRSAuLi4KKwkgKiBBREQgQ09OU1RSQUlOVCBzdGF0ZW1lbnQsIHdoaWNoIGNyZWF0ZXMg dGhlIGluZGV4IGltcGxpY2l0bHkuCisJICovCisJaWYgKGluY2x1ZGVfaW5kZXhlcykKKwl7CisJ CUxpc3QJICAgKmluZGV4b2lkcyA9IFJlbGF0aW9uR2V0SW5kZXhMaXN0KHJlbCk7CisJCUxpc3RD ZWxsICAgKmxjOworCisJCWZvcmVhY2gobGMsIGluZGV4b2lkcykKKwkJeworCQkJT2lkCQkJaWR4 b2lkID0gbGZpcnN0X29pZChsYyk7CisJCQljaGFyCSAgICppZHhkZWY7CisKKwkJCWlmIChPaWRJ c1ZhbGlkKGdldF9pbmRleF9jb25zdHJhaW50KGlkeG9pZCkpKQorCQkJCWNvbnRpbnVlOworCisJ CQlpZHhkZWYgPSBwZ19nZXRfaW5kZXhkZWZfc3RyaW5nKGlkeG9pZCk7CisJCQlyZXNldFN0cmlu Z0luZm8oJmJ1Zik7CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsICIlczsiLCBpZHhkZWYpOwor CQkJc3RhdGVtZW50cyA9IGxhcHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChidWYuZGF0YSkpOwor CQkJcGZyZWUoaWR4ZGVmKTsKKwkJfQorCQlsaXN0X2ZyZWUoaW5kZXhvaWRzKTsKKwl9CisKKwkv KgorCSAqIENvbnN0cmFpbnRzIOKAlCBlbWl0IGFuIEFMVEVSIFRBQkxFIC4uLiBBREQgQ09OU1RS QUlOVCBmb3IgZWFjaAorCSAqIGxvY2FsbHktZGVmaW5lZCBjb25zdHJhaW50IG9uIHRoZSB0YWJs ZS4gIEluaGVyaXRlZCBjb25zdHJhaW50cworCSAqIChjb25pc2xvY2FsPWZhbHNlKSBhcmUgcHJv ZHVjZWQgYnkgdGhlIHBhcmVudCdzIERETCBhbmQgcHJvcGFnYXRlZAorCSAqIGF1dG9tYXRpY2Fs bHkgYnkgSU5IRVJJVFMgLyBQQVJUSVRJT04gT0YsIHNvIHdlIHNraXAgdGhlbSBoZXJlLgorCSAq LworCWlmIChpbmNsdWRlX2NvbnN0cmFpbnRzKQorCXsKKwkJUmVsYXRpb24JY29uUmVsOworCQlT eXNTY2FuRGVzYyBjb25TY2FuOworCQlTY2FuS2V5RGF0YSBjb25LZXk7CisJCUhlYXBUdXBsZQlj b25UdXA7CisKKwkJY29uUmVsID0gdGFibGVfb3BlbihDb25zdHJhaW50UmVsYXRpb25JZCwgQWNj ZXNzU2hhcmVMb2NrKTsKKwkJU2NhbktleUluaXQoJmNvbktleSwKKwkJCQkJQW51bV9wZ19jb25z dHJhaW50X2NvbnJlbGlkLAorCQkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJ CQkJCU9iamVjdElkR2V0RGF0dW0ocmVsaWQpKTsKKwkJY29uU2NhbiA9IHN5c3RhYmxlX2JlZ2lu c2Nhbihjb25SZWwsIENvbnN0cmFpbnRSZWxpZFR5cGlkTmFtZUluZGV4SWQsCisJCQkJCQkJCQkg dHJ1ZSwgTlVMTCwgMSwgJmNvbktleSk7CisKKwkJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQoY29u VHVwID0gc3lzdGFibGVfZ2V0bmV4dChjb25TY2FuKSkpCisJCXsKKwkJCUZvcm1fcGdfY29uc3Ry YWludCBjb24gPSAoRm9ybV9wZ19jb25zdHJhaW50KSBHRVRTVFJVQ1QoY29uVHVwKTsKKwkJCWNo YXIJICAgKmNvbmRlZjsKKworCQkJaWYgKCFjb24tPmNvbmlzbG9jYWwpCisJCQkJY29udGludWU7 CisJCQkvKiBDSEVDSyBjb25zdHJhaW50cyBhcmUgZW1pdHRlZCBpbmxpbmUgaW4gdGhlIGNvbHVt biBsaXN0LiAqLworCQkJaWYgKGNvbi0+Y29udHlwZSA9PSBDT05TVFJBSU5UX0NIRUNLKQorCQkJ CWNvbnRpbnVlOworCisJCQljb25kZWYgPSBwZ19nZXRfY29uc3RyYWludGRlZl9jb21tYW5kKGNv bi0+b2lkKTsKKwkJCXJlc2V0U3RyaW5nSW5mbygmYnVmKTsKKwkJCWFwcGVuZFN0cmluZ0luZm8o JmJ1ZiwgIiVzOyIsIGNvbmRlZik7CisJCQlzdGF0ZW1lbnRzID0gbGFwcGVuZChzdGF0ZW1lbnRz LCBwc3RyZHVwKGJ1Zi5kYXRhKSk7CisJCQlwZnJlZShjb25kZWYpOworCQl9CisJCXN5c3RhYmxl X2VuZHNjYW4oY29uU2Nhbik7CisJCXRhYmxlX2Nsb3NlKGNvblJlbCwgQWNjZXNzU2hhcmVMb2Nr KTsKKwl9CisKKwkvKgorCSAqIFJ1bGVzIOKAlCBlbWl0IGEgQ1JFQVRFIFJVTEUgZm9yIGVhY2gg Y2FjaGVkIHJld3JpdGUgcnVsZSBvbiB0aGUKKwkgKiByZWxhdGlvbi4gIEludGVybmFsIHJ1bGVz IChzdWNoIGFzIHRoZSBfUkVUVVJOIHJ1bGUgb24gdmlld3MpIGxpdmUgb24KKwkgKiB2aWV3cy9t YXR2aWV3cyBhbmQgZG9uJ3QgYXBwZWFyIGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IHJlc3RyaWN0 ZWQKKwkgKiByZWxraW5kIGFib3ZlLgorCSAqLworCWlmIChpbmNsdWRlX3J1bGVzICYmIHJlbC0+ cmRfcnVsZXMgIT0gTlVMTCkKKwl7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVsLT5yZF9ydWxl cy0+bnVtTG9ja3M7IGkrKykKKwkJeworCQkJT2lkCQkJcnVsZWlkID0gcmVsLT5yZF9ydWxlcy0+ cnVsZXNbaV0tPnJ1bGVJZDsKKwkJCURhdHVtCQlydWxlZGVmOworCQkJY2hhcgkgICAqcnVsZWRl Zl9zdHI7CisKKwkJCXJ1bGVkZWYgPSBPaWRGdW5jdGlvbkNhbGwxKEZfUEdfR0VUX1JVTEVERUZf T0lELAorCQkJCQkJCQkJICAgT2JqZWN0SWRHZXREYXR1bShydWxlaWQpKTsKKwkJCXJ1bGVkZWZf c3RyID0gVGV4dERhdHVtR2V0Q1N0cmluZyhydWxlZGVmKTsKKwkJCXJlc2V0U3RyaW5nSW5mbygm YnVmKTsKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmJ1ZiwgcnVsZWRlZl9zdHIpOworCQkJ c3RhdGVtZW50cyA9IGxhcHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChidWYuZGF0YSkpOworCQkJ cGZyZWUocnVsZWRlZl9zdHIpOworCQl9CisJfQorCisJLyoKKwkgKiBFeHRlbmRlZCBzdGF0aXN0 aWNzIOKAlCBpdGVyYXRlIHBnX3N0YXRpc3RpY19leHQgYnkgc3R4cmVsaWQgYW5kIGVtaXQKKwkg KiBwZ19nZXRfc3RhdGlzdGljc29iamRlZl9zdHJpbmcoKSBmb3IgZWFjaC4KKwkgKi8KKwlpZiAo aW5jbHVkZV9zdGF0aXN0aWNzKQorCXsKKwkJUmVsYXRpb24Jc3RhdFJlbDsKKwkJU3lzU2NhbkRl c2Mgc3RhdFNjYW47CisJCVNjYW5LZXlEYXRhIHN0YXRLZXk7CisJCUhlYXBUdXBsZQlzdGF0VHVw OworCisJCXN0YXRSZWwgPSB0YWJsZV9vcGVuKFN0YXRpc3RpY0V4dFJlbGF0aW9uSWQsIEFjY2Vz c1NoYXJlTG9jayk7CisJCVNjYW5LZXlJbml0KCZzdGF0S2V5LAorCQkJCQlBbnVtX3BnX3N0YXRp c3RpY19leHRfc3R4cmVsaWQsCisJCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwK KwkJCQkJT2JqZWN0SWRHZXREYXR1bShyZWxpZCkpOworCQlzdGF0U2NhbiA9IHN5c3RhYmxlX2Jl Z2luc2NhbihzdGF0UmVsLCBTdGF0aXN0aWNFeHRSZWxpZEluZGV4SWQsCisJCQkJCQkJCQkgIHRy dWUsIE5VTEwsIDEsICZzdGF0S2V5KTsKKworCQl3aGlsZSAoSGVhcFR1cGxlSXNWYWxpZChzdGF0 VHVwID0gc3lzdGFibGVfZ2V0bmV4dChzdGF0U2NhbikpKQorCQl7CisJCQlGb3JtX3BnX3N0YXRp c3RpY19leHQgc3RhdCA9IChGb3JtX3BnX3N0YXRpc3RpY19leHQpIEdFVFNUUlVDVChzdGF0VHVw KTsKKwkJCWNoYXIJICAgKnN0YXRkZWYgPSBwZ19nZXRfc3RhdGlzdGljc29iamRlZl9zdHJpbmco c3RhdC0+b2lkKTsKKworCQkJcmVzZXRTdHJpbmdJbmZvKCZidWYpOworCQkJYXBwZW5kU3RyaW5n SW5mbygmYnVmLCAiJXM7Iiwgc3RhdGRlZik7CisJCQlzdGF0ZW1lbnRzID0gbGFwcGVuZChzdGF0 ZW1lbnRzLCBwc3RyZHVwKGJ1Zi5kYXRhKSk7CisJCQlwZnJlZShzdGF0ZGVmKTsKKwkJfQorCQlz eXN0YWJsZV9lbmRzY2FuKHN0YXRTY2FuKTsKKwkJdGFibGVfY2xvc2Uoc3RhdFJlbCwgQWNjZXNz U2hhcmVMb2NrKTsKKwl9CisKKwkvKgorCSAqIFJFUExJQ0EgSURFTlRJVFkg4oCUIGVtaXQgb25s eSB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdAorCSAqICgnZCcgPSB1c2UgcHJpbWFy eSBrZXkpLiAgVGhpcyBhZmZlY3RzIGxvZ2ljYWwgcmVwbGljYXRpb24KKwkgKiBiZWhhdmlvciwg c28gcm91bmQtdHJpcCBmaWRlbGl0eSBtYXR0ZXJzLgorCSAqLworCWlmIChpbmNsdWRlX3JlcGxp Y2FfaWRlbnRpdHkgJiYKKwkJcmVsLT5yZF9yZWwtPnJlbHJlcGxpZGVudCAhPSBSRVBMSUNBX0lE RU5USVRZX0RFRkFVTFQpCisJeworCQlyZXNldFN0cmluZ0luZm8oJmJ1Zik7CisJCXN3aXRjaCAo cmVsLT5yZF9yZWwtPnJlbHJlcGxpZGVudCkKKwkJeworCQkJY2FzZSBSRVBMSUNBX0lERU5USVRZ X05PVEhJTkc6CisJCQkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiQUxURVIgVEFCTEUgJXMgUkVQ TElDQSBJREVOVElUWSBOT1RISU5HOyIsCisJCQkJCQkJCSBxdWFsbmFtZSk7CisJCQkJc3RhdGVt ZW50cyA9IGxhcHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChidWYuZGF0YSkpOworCQkJCWJyZWFr OworCQkJY2FzZSBSRVBMSUNBX0lERU5USVRZX0ZVTEw6CisJCQkJYXBwZW5kU3RyaW5nSW5mbygm YnVmLCAiQUxURVIgVEFCTEUgJXMgUkVQTElDQSBJREVOVElUWSBGVUxMOyIsCisJCQkJCQkJCSBx dWFsbmFtZSk7CisJCQkJc3RhdGVtZW50cyA9IGxhcHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChi dWYuZGF0YSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBSRVBMSUNBX0lERU5USVRZX0lOREVYOgor CQkJCXsKKwkJCQkJT2lkCQkJcmVwbGlkeCA9IFJlbGF0aW9uR2V0UmVwbGljYUluZGV4KHJlbCk7 CisKKwkJCQkJaWYgKE9pZElzVmFsaWQocmVwbGlkeCkpCisJCQkJCXsKKwkJCQkJCWNoYXIJICAg KmlkeG5hbWUgPSBnZXRfcmVsX25hbWUocmVwbGlkeCk7CisKKwkJCQkJCWlmIChpZHhuYW1lID09 IE5VTEwpCisJCQkJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVf VU5ERUZJTkVEX09CSkVDVCksCisJCQkJCQkJCQkgZXJybXNnKCJyZXBsaWNhIGlkZW50aXR5IGlu ZGV4IHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0IiwKKwkJCQkJCQkJCQkJcmVwbGlkeCksCisJ CQkJCQkJCQkgZXJyZGV0YWlsKCJJdCBtYXkgaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBkcm9wcGVk LiIpKSk7CisKKwkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwKKwkJCQkJCQkJCQkgIkFMVEVS IFRBQkxFICVzIFJFUExJQ0EgSURFTlRJVFkgVVNJTkcgSU5ERVggJXM7IiwKKwkJCQkJCQkJCQkg cXVhbG5hbWUsCisJCQkJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoaWR4bmFtZSkpOworCQkJCQkJ c3RhdGVtZW50cyA9IGxhcHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChidWYuZGF0YSkpOworCQkJ CQkJcGZyZWUoaWR4bmFtZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKwl9CisK KwkvKiBFTkFCTEUgLyBGT1JDRSBST1cgTEVWRUwgU0VDVVJJVFkgKi8KKwlpZiAoaW5jbHVkZV9y bHMgJiYgcmVsLT5yZF9yZWwtPnJlbHJvd3NlY3VyaXR5KQorCXsKKwkJcmVzZXRTdHJpbmdJbmZv KCZidWYpOworCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsICJBTFRFUiBUQUJMRSAlcyBFTkFCTEUg Uk9XIExFVkVMIFNFQ1VSSVRZOyIsCisJCQkJCQkgcXVhbG5hbWUpOworCQlzdGF0ZW1lbnRzID0g bGFwcGVuZChzdGF0ZW1lbnRzLCBwc3RyZHVwKGJ1Zi5kYXRhKSk7CisJfQorCWlmIChpbmNsdWRl X3JscyAmJiByZWwtPnJkX3JlbC0+cmVsZm9yY2Vyb3dzZWN1cml0eSkKKwl7CisJCXJlc2V0U3Ry aW5nSW5mbygmYnVmKTsKKwkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiQUxURVIgVEFCTEUgJXMg Rk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZOyIsCisJCQkJCQkgcXVhbG5hbWUpOworCQlzdGF0ZW1l bnRzID0gbGFwcGVuZChzdGF0ZW1lbnRzLCBwc3RyZHVwKGJ1Zi5kYXRhKSk7CisJfQorCisJLyoK KwkgKiBUcmlnZ2VycyDigJQgc2NhZmZvbGRpbmcgb25seS4gIFRoZSBzdGFuZGFsb25lIHBnX2dl dF90cmlnZ2VyX2RkbCgpCisJICogZnVuY3Rpb24gKFBoaWwncyByZS1yb2xsKSBpcyB0aGUgaW50 ZW5kZWQgZW1pc3Npb24gcGF0aDsgb25jZSBpdAorCSAqIGxhbmRzIHRoZSBib2R5IG9mIHRoaXMg bG9vcCBiZWNvbWVzIGEgc2luZ2xlIGNhbGwgaW50byBpdC4gIFRoZQorCSAqIHNjYW4gc3RydWN0 dXJlLCBsb2NrIGFjcXVpc2l0aW9uLCBhbmQgdGdpc2ludGVybmFsIGZpbHRlciAod2hpY2gKKwkg KiBza2lwcyBGSy1iYWNraW5nIGFuZCBvdGhlciBzeXN0ZW0tZ2VuZXJhdGVkIHRyaWdnZXJzKSBh cmUgc2V0dGxlZAorCSAqIGhlcmUgc28gdGhhdCBjaGFuZ2Ugc3RheXMgbWluaW1hbC4KKwkgKi8K KwlpZiAoaW5jbHVkZV90cmlnZ2VycykKKwl7CisJCVJlbGF0aW9uCXRyaWdSZWw7CisJCVN5c1Nj YW5EZXNjIHRyaWdTY2FuOworCQlTY2FuS2V5RGF0YSB0cmlnS2V5OworCQlIZWFwVHVwbGUJdHJp Z1R1cDsKKworCQl0cmlnUmVsID0gdGFibGVfb3BlbihUcmlnZ2VyUmVsYXRpb25JZCwgQWNjZXNz U2hhcmVMb2NrKTsKKwkJU2NhbktleUluaXQoJnRyaWdLZXksCisJCQkJCUFudW1fcGdfdHJpZ2dl cl90Z3JlbGlkLAorCQkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJCU9i amVjdElkR2V0RGF0dW0ocmVsaWQpKTsKKwkJdHJpZ1NjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4o dHJpZ1JlbCwgVHJpZ2dlclJlbGlkTmFtZUluZGV4SWQsCisJCQkJCQkJCQkgIHRydWUsIE5VTEws IDEsICZ0cmlnS2V5KTsKKwkJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQodHJpZ1R1cCA9IHN5c3Rh YmxlX2dldG5leHQodHJpZ1NjYW4pKSkKKwkJeworCQkJRm9ybV9wZ190cmlnZ2VyIHRyZyA9IChG b3JtX3BnX3RyaWdnZXIpIEdFVFNUUlVDVCh0cmlnVHVwKTsKKworCQkJaWYgKHRyZy0+dGdpc2lu dGVybmFsKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBUT0RPOiBhcHBlbmQgcGdfZ2V0X3RyaWdn ZXJfZGRsKHRyZy0+b2lkKSBvdXRwdXQgaGVyZS4gKi8KKwkJCSh2b2lkKSB0cmc7CisJCX0KKwkJ c3lzdGFibGVfZW5kc2Nhbih0cmlnU2Nhbik7CisJCXRhYmxlX2Nsb3NlKHRyaWdSZWwsIEFjY2Vz c1NoYXJlTG9jayk7CisJfQorCisJLyoKKwkgKiBSb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWNpZXMg 4oCUIHNjYWZmb2xkaW5nIG9ubHkuICBPbmNlCisJICogcGdfZ2V0X3BvbGljeV9kZGwoKSAoYWxy ZWFkeS1zdWJtaXR0ZWQgcGF0Y2gpIGxhbmRzLCB0aGUgYm9keSBvZgorCSAqIHRoaXMgbG9vcCBi ZWNvbWVzIGEgcGVyLXBvbGljeSBjYWxsIGludG8gaXQuICBUaGUgRU5BQkxFL0ZPUkNFCisJICog Uk9XIExFVkVMIFNFQ1VSSVRZIHRvZ2dsZXMgYWJvdmUgYXJlIHRoZSBjb21wYW5pb24gY2F0YWxv ZyBmbGFncworCSAqIGFuZCBhcmUgYWxyZWFkeSBlbWl0dGVkIGluZGVwZW5kZW50bHkgb2YgcG9s aWNpZXMuCisJICovCisJaWYgKGluY2x1ZGVfcG9saWNpZXMpCisJeworCQlSZWxhdGlvbglwb2xS ZWw7CisJCVN5c1NjYW5EZXNjIHBvbFNjYW47CisJCVNjYW5LZXlEYXRhIHBvbEtleTsKKwkJSGVh cFR1cGxlCXBvbFR1cDsKKworCQlwb2xSZWwgPSB0YWJsZV9vcGVuKFBvbGljeVJlbGF0aW9uSWQs IEFjY2Vzc1NoYXJlTG9jayk7CisJCVNjYW5LZXlJbml0KCZwb2xLZXksCisJCQkJCUFudW1fcGdf cG9saWN5X3BvbHJlbGlkLAorCQkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJ CQkJCU9iamVjdElkR2V0RGF0dW0ocmVsaWQpKTsKKwkJcG9sU2NhbiA9IHN5c3RhYmxlX2JlZ2lu c2Nhbihwb2xSZWwsIFBvbGljeVBvbHJlbGlkUG9sbmFtZUluZGV4SWQsCisJCQkJCQkJCQkgdHJ1 ZSwgTlVMTCwgMSwgJnBvbEtleSk7CisJCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKHBvbFR1cCA9 IHN5c3RhYmxlX2dldG5leHQocG9sU2NhbikpKQorCQl7CisJCQlGb3JtX3BnX3BvbGljeSBwb2wg PSAoRm9ybV9wZ19wb2xpY3kpIEdFVFNUUlVDVChwb2xUdXApOworCisJCQkvKiBUT0RPOiBhcHBl bmQgcGdfZ2V0X3BvbGljeV9kZGwocmVsaWQsIHBvbG5hbWUpIG91dHB1dCBoZXJlLiAqLworCQkJ KHZvaWQpIHBvbDsKKwkJfQorCQlzeXN0YWJsZV9lbmRzY2FuKHBvbFNjYW4pOworCQl0YWJsZV9j bG9zZShwb2xSZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisJfQorCisJLyoKKwkgKiBQYXJ0aXRpb24g Y2hpbGRyZW4g4oCUIHdoZW4gaW5jbHVkZV9wYXJ0aXRpb24gaXMgdHJ1ZSBhbmQgdGhpcyByZWxh dGlvbgorCSAqIGlzIGEgcGFydGl0aW9uZWQtdGFibGUgcGFyZW50LCByZWN1cnNpdmVseSBlbWl0 IHRoZSBEREwgZm9yIGVhY2gKKwkgKiBkaXJlY3QgcGFydGl0aW9uIGNoaWxkLiAgRWFjaCBjaGls ZCdzIG93biBEREwgaGFuZGxlcyBmdXJ0aGVyIGxldmVscworCSAqIG9mIHN1Yi1wYXJ0aXRpb25p bmcgdGhyb3VnaCB0aGUgc2FtZSByZWN1cnNpb24uCisJICovCisJaWYgKGluY2x1ZGVfcGFydGl0 aW9uICYmIHJlbGtpbmQgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9UQUJMRSkKKwl7CisJCUxpc3QJ ICAgKmNoaWxkcmVuID0gZmluZF9pbmhlcml0YW5jZV9jaGlsZHJlbihyZWxpZCwgQWNjZXNzU2hh cmVMb2NrKTsKKwkJTGlzdENlbGwgICAqbGM7CisKKwkJZm9yZWFjaChsYywgY2hpbGRyZW4pCisJ CXsKKwkJCU9pZAkJCWNoaWxkb2lkID0gbGZpcnN0X29pZChsYyk7CisJCQlMaXN0CSAgICpjaGls ZHN0bXRzOworCisJCQljaGlsZHN0bXRzID0gcGdfZ2V0X3RhYmxlX2RkbF9pbnRlcm5hbChjaGls ZG9pZCwgcHJldHR5LAorCQkJCQkJCQkJCQkJICAgbm9fb3duZXIsIG5vX3RhYmxlc3BhY2UsCisJ CQkJCQkJCQkJCQkgICBpbmNsdWRlX2luZGV4ZXMsCisJCQkJCQkJCQkJCQkgICBpbmNsdWRlX2Nv bnN0cmFpbnRzLAorCQkJCQkJCQkJCQkJICAgaW5jbHVkZV9ydWxlcywKKwkJCQkJCQkJCQkJCSAg IGluY2x1ZGVfc3RhdGlzdGljcywKKwkJCQkJCQkJCQkJCSAgIGluY2x1ZGVfdHJpZ2dlcnMsCisJ CQkJCQkJCQkJCQkgICBpbmNsdWRlX3BvbGljaWVzLAorCQkJCQkJCQkJCQkJICAgaW5jbHVkZV9y bHMsCisJCQkJCQkJCQkJCQkgICBpbmNsdWRlX3JlcGxpY2FfaWRlbnRpdHksCisJCQkJCQkJCQkJ CQkgICBpbmNsdWRlX3BhcnRpdGlvbik7CisJCQlzdGF0ZW1lbnRzID0gbGlzdF9jb25jYXQoc3Rh dGVtZW50cywgY2hpbGRzdG10cyk7CisJCX0KKwkJbGlzdF9mcmVlKGNoaWxkcmVuKTsKKwl9CisK Kwl0YWJsZV9jbG9zZShyZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisJcGZyZWUoYnVmLmRhdGEpOwor CXBmcmVlKHF1YWxuYW1lKTsKKworCXJldHVybiBzdGF0ZW1lbnRzOworfQorCisvKgorICogcGdf Z2V0X3RhYmxlX2RkbAorICoJCVJldHVybiBEREwgdG8gcmVjcmVhdGUgYSB0YWJsZSBhcyBhIHNl dCBvZiB0ZXh0IHJvd3MuCisgKi8KK0RhdHVtCitwZ19nZXRfdGFibGVfZGRsKFBHX0ZVTkNUSU9O X0FSR1MpCit7CisJRnVuY0NhbGxDb250ZXh0ICpmdW5jY3R4OworCUxpc3QJICAgKnN0YXRlbWVu dHM7CisKKwlpZiAoU1JGX0lTX0ZJUlNUQ0FMTCgpKQorCXsKKwkJTWVtb3J5Q29udGV4dCBvbGRj b250ZXh0OworCQlPaWQJCQlyZWxpZDsKKwkJRGRsT3B0aW9uCW9wdHNbXSA9IHsKKwkJCXsicHJl dHR5IiwgRERMX09QVF9CT09MfSwKKwkJCXsib3duZXIiLCBERExfT1BUX0JPT0x9LAorCQkJeyJ0 YWJsZXNwYWNlIiwgRERMX09QVF9CT09MfSwKKwkJCXsiaW5jbHVkZXNfaW5kZXhlcyIsIERETF9P UFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX2NvbnN0cmFpbnRzIiwgRERMX09QVF9CT09MfSwKKwkJ CXsiaW5jbHVkZXNfcnVsZXMiLCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc19zdGF0aXN0 aWNzIiwgRERMX09QVF9CT09MfSwKKwkJCXsiaW5jbHVkZXNfdHJpZ2dlcnMiLCBERExfT1BUX0JP T0x9LAorCQkJeyJpbmNsdWRlc19wb2xpY2llcyIsIERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1 ZGVzX3JscyIsIERETF9PUFRfQk9PTH0sCisJCQl7ImluY2x1ZGVzX3JlcGxpY2FfaWRlbnRpdHki LCBERExfT1BUX0JPT0x9LAorCQkJeyJpbmNsdWRlc19wYXJ0aXRpb24iLCBERExfT1BUX0JPT0x9 LAorCQl9OworCisJCWZ1bmNjdHggPSBTUkZfRklSU1RDQUxMX0lOSVQoKTsKKwkJb2xkY29udGV4 dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhmdW5jY3R4LT5tdWx0aV9jYWxsX21lbW9yeV9jdHgp OworCisJCWlmIChQR19BUkdJU05VTEwoMCkpCisJCXsKKwkJCU1lbW9yeUNvbnRleHRTd2l0Y2hU byhvbGRjb250ZXh0KTsKKwkJCVNSRl9SRVRVUk5fRE9ORShmdW5jY3R4KTsKKwkJfQorCisJCXJl bGlkID0gUEdfR0VUQVJHX09JRCgwKTsKKwkJcGFyc2VfZGRsX29wdGlvbnMoZmNpbmZvLCAxLCBv cHRzLCBsZW5ndGhvZihvcHRzKSk7CisKKwkJc3RhdGVtZW50cyA9IHBnX2dldF90YWJsZV9kZGxf aW50ZXJuYWwocmVsaWQsCisJCQkJCQkJCQkJCSAgIG9wdHNbMF0uaXNzZXQgJiYgb3B0c1swXS5i b29sdmFsLAorCQkJCQkJCQkJCQkgICBvcHRzWzFdLmlzc2V0ICYmICFvcHRzWzFdLmJvb2x2YWws CisJCQkJCQkJCQkJCSAgIG9wdHNbMl0uaXNzZXQgJiYgIW9wdHNbMl0uYm9vbHZhbCwKKwkJCQkJ CQkJCQkJICAgIW9wdHNbM10uaXNzZXQgfHwgb3B0c1szXS5ib29sdmFsLAorCQkJCQkJCQkJCQkg ICAhb3B0c1s0XS5pc3NldCB8fCBvcHRzWzRdLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFvcHRz WzVdLmlzc2V0IHx8IG9wdHNbNV0uYm9vbHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNbNl0uaXNz ZXQgfHwgb3B0c1s2XS5ib29sdmFsLAorCQkJCQkJCQkJCQkgICAhb3B0c1s3XS5pc3NldCB8fCBv cHRzWzddLmJvb2x2YWwsCisJCQkJCQkJCQkJCSAgICFvcHRzWzhdLmlzc2V0IHx8IG9wdHNbOF0u Ym9vbHZhbCwKKwkJCQkJCQkJCQkJICAgIW9wdHNbOV0uaXNzZXQgfHwgb3B0c1s5XS5ib29sdmFs LAorCQkJCQkJCQkJCQkgICAhb3B0c1sxMF0uaXNzZXQgfHwgb3B0c1sxMF0uYm9vbHZhbCwKKwkJ CQkJCQkJCQkJICAgb3B0c1sxMV0uaXNzZXQgJiYgb3B0c1sxMV0uYm9vbHZhbCk7CisJCWZ1bmNj dHgtPnVzZXJfZmN0eCA9IHN0YXRlbWVudHM7CisJCWZ1bmNjdHgtPm1heF9jYWxscyA9IGxpc3Rf bGVuZ3RoKHN0YXRlbWVudHMpOworCisJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0 KTsKKwl9CisKKwlmdW5jY3R4ID0gU1JGX1BFUkNBTExfU0VUVVAoKTsKKwlzdGF0ZW1lbnRzID0g KExpc3QgKikgZnVuY2N0eC0+dXNlcl9mY3R4OworCisJaWYgKGZ1bmNjdHgtPmNhbGxfY250ciA8 IGZ1bmNjdHgtPm1heF9jYWxscykKKwl7CisJCWNoYXIJICAgKnN0bXQ7CisKKwkJc3RtdCA9IGxp c3RfbnRoKHN0YXRlbWVudHMsIGZ1bmNjdHgtPmNhbGxfY250cik7CisKKwkJU1JGX1JFVFVSTl9O RVhUKGZ1bmNjdHgsIENTdHJpbmdHZXRUZXh0RGF0dW0oc3RtdCkpOworCX0KKwllbHNlCisJewor CQlsaXN0X2ZyZWVfZGVlcChzdGF0ZW1lbnRzKTsKKwkJU1JGX1JFVFVSTl9ET05FKGZ1bmNjdHgp OworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9z cmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CmluZGV4IGJlMTU3YTVmYmU5Li4wZDU3MDgx YTFmMyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9z cmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CkBAIC04NjE1LDYgKzg2MTUsMTMgQEAKICAg cHJvYXJndHlwZXMgPT4gJ3JlZ2RhdGFiYXNlIHRleHQnLCBwcm9hbGxhcmd0eXBlcyA9PiAne3Jl Z2RhdGFiYXNlLHRleHR9JywKICAgcHJvYXJnbW9kZXMgPT4gJ3tpLHZ9JywgcHJvYXJnZGVmYXVs dHMgPT4gJ3tOVUxMfScsCiAgIHByb3NyYyA9PiAncGdfZ2V0X2RhdGFiYXNlX2RkbCcgfSwKK3sg b2lkID0+ICc4MjE1JywgZGVzY3IgPT4gJ2dldCBEREwgdG8gcmVjcmVhdGUgYSB0YWJsZScsCisg IHByb25hbWUgPT4gJ3BnX2dldF90YWJsZV9kZGwnLCBwcm9yb3dzID0+ICc1MCcsIHByb3Zhcmlh ZGljID0+ICd0ZXh0JywKKyAgcHJvaXNzdHJpY3QgPT4gJ2YnLCBwcm9yZXRzZXQgPT4gJ3QnLCBw cm92b2xhdGlsZSA9PiAncycsCisgIHByb25hcmdkZWZhdWx0cyA9PiAnMScsIHByb3JldHR5cGUg PT4gJ3RleHQnLAorICBwcm9hcmd0eXBlcyA9PiAncmVnY2xhc3MgdGV4dCcsIHByb2FsbGFyZ3R5 cGVzID0+ICd7cmVnY2xhc3MsdGV4dH0nLAorICBwcm9hcmdtb2RlcyA9PiAne2ksdn0nLCBwcm9h cmdkZWZhdWx0cyA9PiAne05VTEx9JywKKyAgcHJvc3JjID0+ICdwZ19nZXRfdGFibGVfZGRsJyB9 LAogeyBvaWQgPT4gJzI1MDknLAogICBkZXNjciA9PiAnZGVwYXJzZSBhbiBlbmNvZGVkIGV4cHJl c3Npb24gd2l0aCBwcmV0dHktcHJpbnQgb3B0aW9uJywKICAgcHJvbmFtZSA9PiAncGdfZ2V0X2V4 cHInLCBwcm92b2xhdGlsZSA9PiAncycsIHByb3JldHR5cGUgPT4gJ3RleHQnLApkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvdGFibGVjbWRzLmggYi9zcmMvaW5jbHVkZS9jb21tYW5k cy90YWJsZWNtZHMuaAppbmRleCBjM2Q4NTE4Y2I2Mi4uMjA4NTAyN2M5YjEgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL2NvbW1hbmRzL3RhYmxlY21kcy5oCisrKyBiL3NyYy9pbmNsdWRlL2NvbW1h bmRzL3RhYmxlY21kcy5oCkBAIC05Miw2ICs5Miw3IEBAIGV4dGVybiB2b2lkIGNoZWNrX29mX3R5 cGUoSGVhcFR1cGxlIHR5cGV0dXBsZSk7CiAKIGV4dGVybiB2b2lkIHJlZ2lzdGVyX29uX2NvbW1p dF9hY3Rpb24oT2lkIHJlbGlkLCBPbkNvbW1pdEFjdGlvbiBhY3Rpb24pOwogZXh0ZXJuIHZvaWQg cmVtb3ZlX29uX2NvbW1pdF9hY3Rpb24oT2lkIHJlbGlkKTsKK2V4dGVybiBPbkNvbW1pdEFjdGlv biBnZXRfb25fY29tbWl0X2FjdGlvbihPaWQgcmVsaWQpOwogCiBleHRlcm4gdm9pZCBQcmVDb21t aXRfb25fY29tbWl0X2FjdGlvbnModm9pZCk7CiBleHRlcm4gdm9pZCBBdEVPWGFjdF9vbl9jb21t aXRfYWN0aW9ucyhib29sIGlzQ29tbWl0KTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvcGdfZ2V0X3RhYmxlX2RkbC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3BnX2dldF90YWJsZV9kZGwub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwLi5hNWZjOGFkZDUxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvcGdfZ2V0X3RhYmxlX2RkbC5vdXQKQEAgLTAsMCArMSw0OTggQEAKKy0tCistLSBwZ19n ZXRfdGFibGVfZGRsCistLQorLS0gQWxsIHRlc3RzIHBhc3Mgb3duZXI9PmZhbHNlIHNvIHRoZSBB TFRFUiBUQUJMRSBPV05FUiBUTyBsaW5lIGlzIG5vdAorLS0gZW1pdHRlZCwga2VlcGluZyBvdXRw dXQgc3RhYmxlIGFjcm9zcyB0ZXN0IHJ1bm5lcnMgKHdoaWNoIG1heSBydW4gdW5kZXIKKy0tIGRp ZmZlcmVudCByb2xlIG5hbWVzKS4KKy0tCitDUkVBVEUgU0NIRU1BIHBndGJsX2RkbF90ZXN0Owor U0VUIHNlYXJjaF9wYXRoID0gcGd0YmxfZGRsX3Rlc3Q7CistLSBCYXNpYyB0YWJsZSB3aXRoIFBS SU1BUlkgS0VZLCBOT1QgTlVMTCwgREVGQVVMVCwgQ09MTEFURS4KK0NSRUFURSBUQUJMRSBiYXNp YyAoCisgICAgaWQgaW50IFBSSU1BUlkgS0VZLAorICAgIG5hbWUgdGV4dCBOT1QgTlVMTCBERUZB VUxUICdhbm9uJyBDT0xMQVRFICJDIgorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2Rk bCgnYmFzaWMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBn dGJsX2RkbF90ZXN0LmJhc2ljICggaWQgaW50ZWdlciBOT1QgTlVMTCwgbmFtZSB0ZXh0IENPTExB VEUgIkMiIERFRkFVTFQgJ2Fub24nOjp0ZXh0IE5PVCBOVUxMKTsKKyBBTFRFUiBUQUJMRSBwZ3Ri bF9kZGxfdGVzdC5iYXNpYyBBREQgQ09OU1RSQUlOVCBiYXNpY19pZF9ub3RfbnVsbCBOT1QgTlVM TCBpZDsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5iYXNpYyBBREQgQ09OU1RSQUlOVCBi YXNpY19uYW1lX25vdF9udWxsIE5PVCBOVUxMIG5hbWU7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRs X3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfcGtleSBQUklNQVJZIEtFWSAoaWQpOwor KDQgcm93cykKKworLS0gSWRlbnRpdHkgY29sdW1ucyAod2l0aCBkZWZhdWx0IGFuZCBjdXN0b20g c2VxdWVuY2Ugb3B0aW9ucykuCitDUkVBVEUgVEFCTEUgaWRfY29scyAoCisgICAgaWRfYWx3YXlz IGludCBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZLAorICAgIGlkX2RlZmF1bHQgaW50IEdF TkVSQVRFRCBCWSBERUZBVUxUIEFTIElERU5USVRZCispOworU0VMRUNUICogRlJPTSBwZ19nZXRf dGFibGVfZGRsKCdpZF9jb2xzJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rl c3QuaWRfY29scyAoIGlkX2Fsd2F5cyBpbnRlZ2VyIEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJ VFkgTk9UIE5VTEwsIGlkX2RlZmF1bHQgaW50ZWdlciBHRU5FUkFURUQgQlkgREVGQVVMVCBBUyBJ REVOVElUWSBOT1QgTlVMTCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWRfY29scyBB REQgQ09OU1RSQUlOVCBpZF9jb2xzX2lkX2Fsd2F5c19ub3RfbnVsbCBOT1QgTlVMTCBpZF9hbHdh eXM7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWRfY29scyBBREQgQ09OU1RSQUlOVCBp ZF9jb2xzX2lkX2RlZmF1bHRfbm90X251bGwgTk9UIE5VTEwgaWRfZGVmYXVsdDsKKygzIHJvd3Mp CisKK0NSRUFURSBUQUJMRSBpZF9jdXN0b20gKAorICAgIHYgaW50IEdFTkVSQVRFRCBBTFdBWVMg QVMgSURFTlRJVFkgKAorICAgICAgICBTRVFVRU5DRSBOQU1FIGlkX2N1c3RvbV92X3NlcQorICAg ICAgICBTVEFSVCBXSVRIIDEwMCBJTkNSRU1FTlQgQlkgNQorICAgICAgICBNSU5WQUxVRSA1MCBN QVhWQUxVRSAxMDAwCisgICAgICAgIENBQ0hFIDEwIENZQ0xFCisgICAgKQorKTsKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnaWRfY3VzdG9tJzo6cmVnY2xhc3MsICdvd25lcicsICdm YWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg Q1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmlkX2N1c3RvbSAoIHYgaW50ZWdlciBHRU5FUkFU RUQgQUxXQVlTIEFTIElERU5USVRZIChTVEFSVCBXSVRIIDEwMCBJTkNSRU1FTlQgQlkgNSBNSU5W QUxVRSA1MCBNQVhWQUxVRSAxMDAwIENBQ0hFIDEwIENZQ0xFKSBOT1QgTlVMTCk7CisgQUxURVIg VEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWRfY3VzdG9tIEFERCBDT05TVFJBSU5UIGlkX2N1c3RvbV92 X25vdF9udWxsIE5PVCBOVUxMIHY7CisoMiByb3dzKQorCistLSBHZW5lcmF0ZWQgc3RvcmVkIGNv bHVtbi4KK0NSRUFURSBUQUJMRSBnZW5fY29scyAoCisgICAgY2VudHMgaW50LAorICAgIGRvbGxh cnMgbnVtZXJpYyBHRU5FUkFURUQgQUxXQVlTIEFTIChjZW50cyAvIDEwMC4wKSBTVE9SRUQKKyk7 CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2dlbl9jb2xzJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVB VEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuZ2VuX2NvbHMgKCBjZW50cyBpbnRlZ2VyLCBkb2xsYXJz IG51bWVyaWMgR0VORVJBVEVEIEFMV0FZUyBBUyAoKChjZW50cyk6Om51bWVyaWMgLyAxMDAuMCkp IFNUT1JFRCk7CisoMSByb3cpCisKKy0tIFNUT1JBR0UgYW5kIENPTVBSRVNTSU9OIChvbmx5IGVt aXR0ZWQgd2hlbiBub24tZGVmYXVsdCBmb3IgdGhlIHR5cGUpLgorQ1JFQVRFIFRBQkxFIHN0b3Jh Z2VfY29scyAoCisgICAgYSB0ZXh0IFNUT1JBR0UgRVhURVJOQUwsCisgICAgYiB0ZXh0IFNUT1JB R0UgTUFJTiwKKyAgICBjIHRleHQgQ09NUFJFU1NJT04gcGdsegorKTsKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgnc3RvcmFnZV9jb2xzJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxz ZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw Z19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnN0b3JhZ2VfY29scyAo IGEgdGV4dCBTVE9SQUdFIEVYVEVSTkFMLCBiIHRleHQgU1RPUkFHRSBNQUlOLCBjIHRleHQgQ09N UFJFU1NJT04gcGdseik7CisoMSByb3cpCisKKy0tIENvbnN0cmFpbnRzOiBDSEVDSywgVU5JUVVF LCBGT1JFSUdOIEtFWSAoREVGRVJSQUJMRSkuCitDUkVBVEUgVEFCTEUgcmVmZCAoaWQgaW50IFBS SU1BUlkgS0VZKTsKK0NSRUFURSBUQUJMRSBjb25zICgKKyAgICBhIGludCBDSEVDSyAoYSA+IDAp LAorICAgIGIgaW50IFVOSVFVRSwKKyAgICBjIGludCBSRUZFUkVOQ0VTIHJlZmQoaWQpIERFRkVS UkFCTEUgSU5JVElBTExZIERFRkVSUkVECispOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdjb25zJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5jb25zICggYSBpbnRl Z2VyLCBiIGludGVnZXIsIGMgaW50ZWdlciwgQ09OU1RSQUlOVCBjb25zX2FfY2hlY2sgQ0hFQ0sg KChhID4gMCkpKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5jb25zIEFERCBDT05TVFJB SU5UIGNvbnNfYl9rZXkgVU5JUVVFIChiKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5j b25zIEFERCBDT05TVFJBSU5UIGNvbnNfY19ma2V5IEZPUkVJR04gS0VZIChjKSBSRUZFUkVOQ0VT IHJlZmQoaWQpIERFRkVSUkFCTEUgSU5JVElBTExZIERFRkVSUkVEOworKDMgcm93cykKKworLS0g SW5kZXhlczogZnVuY3Rpb25hbCBhbmQgcGFydGlhbC4gIENvbnN0cmFpbnQtYmFja2luZyBpbmRl eGVzIGFyZQorLS0gc3VwcHJlc3NlZCAodGhleSBhcmUgZW1pdHRlZCBieSB0aGUgY29uc3RyYWlu dCBsb29wKS4KK0NSRUFURSBUQUJMRSBpZHhkIChpZCBpbnQgUFJJTUFSWSBLRVksIG5hbWUgdGV4 dCk7CitDUkVBVEUgSU5ERVggaWR4ZF9sb3dlciBPTiBpZHhkIChsb3dlcihuYW1lKSk7CitDUkVB VEUgSU5ERVggaWR4ZF9wYXJ0aWFsIE9OIGlkeGQgKGlkKSBXSEVSRSBpZCA+IDEwMDsKK1NFTEVD VCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnaWR4ZCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFs c2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWR4ZCAoIGlkIGludGVnZXIg Tk9UIE5VTEwsIG5hbWUgdGV4dCk7CisgQ1JFQVRFIElOREVYIGlkeGRfbG93ZXIgT04gcGd0Ymxf ZGRsX3Rlc3QuaWR4ZCBVU0lORyBidHJlZSAobG93ZXIobmFtZSkpOworIENSRUFURSBJTkRFWCBp ZHhkX3BhcnRpYWwgT04gcGd0YmxfZGRsX3Rlc3QuaWR4ZCBVU0lORyBidHJlZSAoaWQpIFdIRVJF IChpZCA+IDEwMCk7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWR4ZCBBREQgQ09OU1RS QUlOVCBpZHhkX2lkX25vdF9udWxsIE5PVCBOVUxMIGlkOworIEFMVEVSIFRBQkxFIHBndGJsX2Rk bF90ZXN0LmlkeGQgQUREIENPTlNUUkFJTlQgaWR4ZF9wa2V5IFBSSU1BUlkgS0VZIChpZCk7Ciso NSByb3dzKQorCistLSBJbmhlcml0YW5jZSwgaW5jbHVkaW5nIGEgY2hpbGQgREVGQVVMVCBvdmVy cmlkZSBvbiBhbiBpbmhlcml0ZWQgY29sdW1uLgorQ1JFQVRFIFRBQkxFIHBhciAoYSBpbnQgREVG QVVMVCAxLCBiIHRleHQpOworQ1JFQVRFIFRBQkxFIGNoIChjIGludCkgSU5IRVJJVFMgKHBhcik7 CitBTFRFUiBUQUJMRSBjaCBBTFRFUiBDT0xVTU4gYSBTRVQgREVGQVVMVCA5OTk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NoJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScp OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJM RSBwZ3RibF9kZGxfdGVzdC5jaCAoIGMgaW50ZWdlcikgSU5IRVJJVFMgKHBndGJsX2RkbF90ZXN0 LnBhcik7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY2ggQUxURVIgQ09MVU1OIGEgU0VU IERFRkFVTFQgOTk5OworKDIgcm93cykKKworLS0gUGVyLWNvbHVtbiBhdHRvcHRpb25zOiBlbWl0 dGVkIGFzIEFMVEVSIENPTFVNTiBTRVQgKC4uLikuCitDUkVBVEUgVEFCTEUgYXR0b3B0IChhIGlu dCwgYiB0ZXh0KTsKK0FMVEVSIFRBQkxFIGF0dG9wdCBBTFRFUiBDT0xVTU4gYSBTRVQgKG5fZGlz dGluY3QgPSAxMDApOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdhdHRvcHQnOjpy ZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuYXR0b3B0ICggYSBpbnRlZ2Vy LCBiIHRleHQpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LmF0dG9wdCBBTFRFUiBDT0xV TU4gYSBTRVQgKG5fZGlzdGluY3Q9JzEwMCcpOworKDIgcm93cykKKworLS0gUGFydGl0aW9uZWQg dGFibGUgcGFyZW50IChSQU5HRSBhbmQgSEFTSCkuCitDUkVBVEUgVEFCTEUgcGFydGVkX3Jhbmdl IChpZCBpbnQsIGsgaW50KSBQQVJUSVRJT04gQlkgUkFOR0UgKGlkKTsKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3JhbmdlJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxz ZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVf ZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRl ZF9yYW5nZSAoIGlkIGludGVnZXIsIGsgaW50ZWdlcikgUEFSVElUSU9OIEJZIFJBTkdFIChpZCk7 CisoMSByb3cpCisKK0NSRUFURSBUQUJMRSBwYXJ0ZWRfaGFzaCAoaWQgaW50KSBQQVJUSVRJT04g QlkgSEFTSCAoaWQpOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfaGFz aCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucGFy dGVkX2hhc2ggKCBpZCBpbnRlZ2VyKSBQQVJUSVRJT04gQlkgSEFTSCAoaWQpOworKDEgcm93KQor CistLSBQYXJ0aXRpb24gY2hpbGRyZW46IEZST00vVE8sIFdJVEggKG1vZHVsdXMsIHJlbWFpbmRl ciksIERFRkFVTFQuCitDUkVBVEUgVEFCTEUgcGFydGVkX3JhbmdlXzEgUEFSVElUSU9OIE9GIHBh cnRlZF9yYW5nZQorICAgIEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8gKDEwMCk7CitBTFRFUiBUQUJM RSBwYXJ0ZWRfcmFuZ2VfMSBBTFRFUiBDT0xVTU4gayBTRVQgREVGQVVMVCA3OworU0VMRUNUICog RlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfcmFuZ2VfMSc6OnJlZ2NsYXNzLCAnb3duZXIn LCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucGFydGVkX3Jh bmdlXzEgUEFSVElUSU9OIE9GIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9yYW5nZSBGT1IgVkFMVUVT IEZST00gKDApIFRPICgxMDApOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9y YW5nZV8xIEFMVEVSIENPTFVNTiBrIFNFVCBERUZBVUxUIDc7CisoMiByb3dzKQorCitDUkVBVEUg VEFCTEUgcGFydGVkX2hhc2hfMCBQQVJUSVRJT04gT0YgcGFydGVkX2hhc2gKKyAgICBGT1IgVkFM VUVTIFdJVEggKG1vZHVsdXMgMiwgcmVtYWluZGVyIDApOworU0VMRUNUICogRlJPTSBwZ19nZXRf dGFibGVfZGRsKCdwYXJ0ZWRfaGFzaF8wJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdf Z2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBh cnRlZF9oYXNoXzAgUEFSVElUSU9OIE9GIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9oYXNoIEZPUiBW QUxVRVMgV0lUSCAobW9kdWx1cyAyLCByZW1haW5kZXIgMCk7CisoMSByb3cpCisKK0NSRUFURSBU QUJMRSBwYXJ0ZWRfcmFuZ2VfZGVmIFBBUlRJVElPTiBPRiBwYXJ0ZWRfcmFuZ2UgREVGQVVMVDsK K1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3JhbmdlX2RlZic6OnJlZ2Ns YXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRF IFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9yYW5nZV9kZWYgUEFSVElUSU9OIE9GIHBndGJs X2RkbF90ZXN0LnBhcnRlZF9yYW5nZSBERUZBVUxUOworKDEgcm93KQorCistLSBSdWxlcy4KK0NS RUFURSBUQUJMRSBydCAoaWQgaW50KTsKK0NSRUFURSBUQUJMRSBydF9sb2cgKGlkIGludCk7CitD UkVBVEUgUlVMRSBydF9sb2dfaW5zZXJ0IEFTIE9OIElOU0VSVCBUTyBydAorICAgIERPIEFMU08g SU5TRVJUIElOVE8gcnRfbG9nIFZBTFVFUyAoTkVXLmlkKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3RhYmxlX2RkbCgncnQnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAgICAg ICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJ0ICggaWQgaW50ZWdlcik7Cisg Q1JFQVRFIFJVTEUgcnRfbG9nX2luc2VydCBBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICArCisgICAgIE9OIElOU0VSVCBUTyBwZ3RibF9kZGxfdGVzdC5ydCBETyAgSU5TRVJUIElO VE8gcnRfbG9nIChpZCkrCisgICBWQUxVRVMgKG5ldy5pZCk7CisoMiByb3dzKQorCistLSBFeHRl bmRlZCBzdGF0aXN0aWNzLgorQ1JFQVRFIFRBQkxFIHN0eCAoYSBpbnQsIGIgaW50LCBjIGludCk7 CitDUkVBVEUgU1RBVElTVElDUyBzdHhfbmR2IChuZGlzdGluY3QpIE9OIGEsIGIgRlJPTSBzdHg7 CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3N0eCc6OnJlZ2NsYXNzLCAnb3duZXIn LCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRs ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRB QkxFIHBndGJsX2RkbF90ZXN0LnN0eCAoIGEgaW50ZWdlciwgYiBpbnRlZ2VyLCBjIGludGVnZXIp OworIENSRUFURSBTVEFUSVNUSUNTIHBndGJsX2RkbF90ZXN0LnN0eF9uZHYgKG5kaXN0aW5jdCkg T04gYSwgYiBGUk9NIHN0eDsKKygyIHJvd3MpCisKKy0tIFJvdy1sZXZlbCBzZWN1cml0eSB0b2dn bGVzLgorQ1JFQVRFIFRBQkxFIHJscyAoaWQgaW50KTsKK0FMVEVSIFRBQkxFIHJscyBFTkFCTEUg Uk9XIExFVkVMIFNFQ1VSSVRZOworQUxURVIgVEFCTEUgcmxzIEZPUkNFIFJPVyBMRVZFTCBTRUNV UklUWTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmxzJzo6cmVnY2xhc3MsICdv d25lcicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAg ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJs cyAoIGlkIGludGVnZXIpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJscyBFTkFCTEUg Uk9XIExFVkVMIFNFQ1VSSVRZOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJscyBGT1JD RSBST1cgTEVWRUwgU0VDVVJJVFk7CisoMyByb3dzKQorCistLSBSRVBMSUNBIElERU5USVRZOiBl bWl0dGVkIG9ubHkgd2hlbiBub3QgdGhlIGRlZmF1bHQuCitDUkVBVEUgVEFCTEUgcmlfZnVsbCAo YSBpbnQpOworQUxURVIgVEFCTEUgcmlfZnVsbCBSRVBMSUNBIElERU5USVRZIEZVTEw7CitTRUxF Q1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3JpX2Z1bGwnOjpyZWdjbGFzcywgJ293bmVyJywg J2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucmlfZnVsbCAo IGEgaW50ZWdlcik7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucmlfZnVsbCBSRVBMSUNB IElERU5USVRZIEZVTEw7CisoMiByb3dzKQorCitDUkVBVEUgVEFCTEUgcmlfaWR4IChhIGludCBO T1QgTlVMTCk7CitDUkVBVEUgVU5JUVVFIElOREVYIHJpX2lkeF9hIE9OIHJpX2lkeCAoYSk7CitB TFRFUiBUQUJMRSByaV9pZHggUkVQTElDQSBJREVOVElUWSBVU0lORyBJTkRFWCByaV9pZHhfYTsK K1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmlfaWR4Jzo6cmVnY2xhc3MsICdvd25l cicsICdmYWxzZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFi bGVfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJpX2lkeCAoIGEgaW50ZWdlciBO T1QgTlVMTCk7CisgQ1JFQVRFIFVOSVFVRSBJTkRFWCByaV9pZHhfYSBPTiBwZ3RibF9kZGxfdGVz dC5yaV9pZHggVVNJTkcgYnRyZWUgKGEpOworIEFMVEVSIFRBQkxFIHBndGJsX2RkbF90ZXN0LnJp X2lkeCBBREQgQ09OU1RSQUlOVCByaV9pZHhfYV9ub3RfbnVsbCBOT1QgTlVMTCBhOworIEFMVEVS IFRBQkxFIHBndGJsX2RkbF90ZXN0LnJpX2lkeCBSRVBMSUNBIElERU5USVRZIFVTSU5HIElOREVY IHJpX2lkeF9hOworKDQgcm93cykKKworLS0gVU5MT0dHRUQgKyByZWxvcHRpb25zLgorQ1JFQVRF IFVOTE9HR0VEIFRBQkxFIHVubyAoaWQgaW50KSBXSVRIIChmaWxsZmFjdG9yID0gNzApOworU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCd1bm8nOjpyZWdjbGFzcywgJ293bmVyJywgJ2Zh bHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBDUkVBVEUgVU5MT0dHRUQgVEFCTEUgcGd0YmxfZGRsX3Rlc3QudW5vICggaWQgaW50ZWdlcikg V0lUSCAoZmlsbGZhY3Rvcj0nNzAnKTsKKygxIHJvdykKKworLS0gVHlwZWQgdGFibGUgKENSRUFU RSBUQUJMRSBPRiB0eXBlX25hbWUpLiAgQ29sdW1ucyBpbmhlcml0ZWQgZnJvbSB0aGUKKy0tIHR5 cGUgZW1pdCBub3RoaW5nOyBsb2NhbGx5LWFwcGxpZWQgREVGQVVMVCwgTk9UIE5VTEwgYW5kIENI RUNLIGNvbWUKKy0tIG91dCB0aHJvdWdoIGEgc2luZ2xlICIoY29sIFdJVEggT1BUSU9OUyAuLi4p IiBsaXN0LgorQ1JFQVRFIFRZUEUgdHlwZWRfdCBBUyAoYSBpbnQsIGIgdGV4dCk7CitDUkVBVEUg VEFCTEUgdHlwZWRfcGxhaW4gT0YgdHlwZWRfdDsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxl X2RkbCgndHlwZWRfcGxhaW4nOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QudHlwZWRfcGxh aW4gT0YgcGd0YmxfZGRsX3Rlc3QudHlwZWRfdDsKKygxIHJvdykKKworQ1JFQVRFIFRBQkxFIHR5 cGVkX292ZXIgT0YgdHlwZWRfdCAoCisgICAgYSBXSVRIIE9QVElPTlMgREVGQVVMVCA3IE5PVCBO VUxMLAorICAgIGIgV0lUSCBPUFRJT05TIE5PVCBOVUxMLAorICAgIENPTlNUUkFJTlQgYl9ub25l bXB0eSBDSEVDSyAobGVuZ3RoKGIpID4gMCkKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJs ZV9kZGwoJ3R5cGVkX292ZXInOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QudHlwZWRfb3ZlciBPRiBwZ3RibF9k ZGxfdGVzdC50eXBlZF90ICggYSBXSVRIIE9QVElPTlMgREVGQVVMVCA3IE5PVCBOVUxMLCBiIFdJ VEggT1BUSU9OUyBOT1QgTlVMTCwgQ09OU1RSQUlOVCBiX25vbmVtcHR5IENIRUNLICgobGVuZ3Ro KGIpID4gMCkpKTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC50eXBlZF9vdmVyIEFERCBD T05TVFJBSU5UIHR5cGVkX292ZXJfYV9ub3RfbnVsbCBOT1QgTlVMTCBhOworIEFMVEVSIFRBQkxF IHBndGJsX2RkbF90ZXN0LnR5cGVkX292ZXIgQUREIENPTlNUUkFJTlQgdHlwZWRfb3Zlcl9iX25v dF9udWxsIE5PVCBOVUxMIGI7CisoMyByb3dzKQorCistLSBUZW1wb3JhcnkgdGFibGVzICsgT04g Q09NTUlULiAgVGVtcCB0YWJsZXMgbGl2ZSBpbiBhIHNlc3Npb24tbG9jYWwKKy0tIG5hbWVzcGFj ZSB3aG9zZSBuYW1lIHZhcmllcyBiZXR3ZWVuIHJ1bnMsIHNvIHdlIHN0cmlwIHRoZSBzY2hlbWEK Ky0tIHByZWZpeC4gIE9OIENPTU1JVCBEUk9QIG9ubHkgZmlyZXMgYXQgY29tbWl0LCBzbyB0aGUg cXVlcmllcyB0aGF0CistLSBuZWVkIHRvIHNlZSB0aGUgY2F0YWxvZyBlbnRyeSBtdXN0IHJ1biBp biB0aGUgc2FtZSB0cmFuc2FjdGlvbiBhcworLS0gdGhlIENSRUFURS4KK0JFR0lOOworQ1JFQVRF IFRFTVAgVEFCTEUgdGVtcF9kZWZhdWx0IChpZCBpbnQpOworQ1JFQVRFIFRFTVAgVEFCTEUgdGVt cF9kZWxldGUgKGlkIGludCkgT04gQ09NTUlUIERFTEVURSBST1dTOworQ1JFQVRFIFRFTVAgVEFC TEUgdGVtcF9kcm9wIChpZCBpbnQpIE9OIENPTU1JVCBEUk9QOworU0VMRUNUIHJlZ2V4cF9yZXBs YWNlKGxpbmUsICciP3BnX3RlbXBfP1swLTldKyI/XC4nLCAncGdfdGVtcC4nKSBBUyBsaW5lCitG Uk9NIHBnX2dldF90YWJsZV9kZGwoJ3RlbXBfZGVmYXVsdCc6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnKSBBUyBsaW5lCitXSEVSRSBsaW5lIExJS0UgJ0NSRUFURSAlJzsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICBsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg Q1JFQVRFIFRFTVBPUkFSWSBUQUJMRSBwZ190ZW1wLnRlbXBfZGVmYXVsdCAoIGlkIGludGVnZXIp OworKDEgcm93KQorCitTRUxFQ1QgcmVnZXhwX3JlcGxhY2UobGluZSwgJyI/cGdfdGVtcF8/WzAt OV0rIj9cLicsICdwZ190ZW1wLicpIEFTIGxpbmUKK0ZST00gcGdfZ2V0X3RhYmxlX2RkbCgndGVt cF9kZWxldGUnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJykgQVMgbGluZQorV0hFUkUgbGlu ZSBMSUtFICdDUkVBVEUgJSc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIENSRUFURSBURU1QT1JBUlkgVEFCTEUgcGdfdGVtcC50ZW1wX2RlbGV0 ZSAoIGlkIGludGVnZXIpIE9OIENPTU1JVCBERUxFVEUgUk9XUzsKKygxIHJvdykKKworU0VMRUNU IHJlZ2V4cF9yZXBsYWNlKGxpbmUsICciP3BnX3RlbXBfP1swLTldKyI/XC4nLCAncGdfdGVtcC4n KSBBUyBsaW5lCitGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3RlbXBfZHJvcCc6OnJlZ2NsYXNzLCAn b3duZXInLCAnZmFsc2UnKSBBUyBsaW5lCitXSEVSRSBsaW5lIExJS0UgJ0NSRUFURSAlJzsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRFTVBPUkFSWSBUQUJMRSBw Z190ZW1wLnRlbXBfZHJvcCAoIGlkIGludGVnZXIpIE9OIENPTU1JVCBEUk9QOworKDEgcm93KQor CitST0xMQkFDSzsKKy0tIFByZXR0eSBtb2RlLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLCAncHJldHR5JywgJ3RydWUn KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LmJhc2ljICggICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAgICAgaWQgaW50ZWdlciBOT1QgTlVM TCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKworICAgICBuYW1lIHRleHQgQ09MTEFURSAiQyIgREVGQVVMVCAnYW5vbic6OnRleHQgTk9U IE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICArCisgKTsKKyBBTFRFUiBUQUJMRSBwZ3Ri bF9kZGxfdGVzdC5iYXNpYyBBREQgQ09OU1RSQUlOVCBiYXNpY19pZF9ub3RfbnVsbCBOT1QgTlVM TCBpZDsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5iYXNpYyBBREQgQ09OU1RSQUlOVCBi YXNpY19uYW1lX25vdF9udWxsIE5PVCBOVUxMIG5hbWU7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRs X3Rlc3QuYmFzaWMgQUREIENPTlNUUkFJTlQgYmFzaWNfcGtleSBQUklNQVJZIEtFWSAoaWQpOwor KDQgcm93cykKKworLS0gaW5jbHVkZXNfKiBnYXRpbmc6IGVhY2ggc3ViLW9iamVjdCBjYXRlZ29y eSBjYW4gYmUgc3VwcHJlc3NlZCBpbmRpdmlkdWFsbHkuCistLSBpbmNsdWRlc19pbmRleGVzPWZh bHNlIGhpZGVzIHRoZSBDUkVBVEUgSU5ERVggc3RhdGVtZW50cy4KK1NFTEVDVCAqIEZST00gcGdf Z2V0X3RhYmxlX2RkbCgnaWR4ZCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19pbmRleGVzJywgJ2ZhbHNlJyk7Cisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJM RSBwZ3RibF9kZGxfdGVzdC5pZHhkICggaWQgaW50ZWdlciBOT1QgTlVMTCwgbmFtZSB0ZXh0KTsK KyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5pZHhkIEFERCBDT05TVFJBSU5UIGlkeGRfaWRf bm90X251bGwgTk9UIE5VTEwgaWQ7CisgQUxURVIgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuaWR4ZCBB REQgQ09OU1RSQUlOVCBpZHhkX3BrZXkgUFJJTUFSWSBLRVkgKGlkKTsKKygzIHJvd3MpCisKKy0t IGluY2x1ZGVzX2NvbnN0cmFpbnRzPWZhbHNlIGhpZGVzIGJvdGggaW5saW5lIENIRUNLIGluIENS RUFURSBUQUJMRSBhbmQKKy0tIHRoZSBBTFRFUiBUQUJMRSAuLi4gQUREIENPTlNUUkFJTlQgbGlu ZXMuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NvbnMnOjpyZWdjbGFzcywgJ293 bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNf Y29uc3RyYWludHMnLCAnZmFsc2UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dl dF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBD UkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QuY29ucyAoIGEgaW50ZWdlciwgYiBpbnRlZ2VyLCBj IGludGVnZXIpOworKDEgcm93KQorCistLSBpbmNsdWRlc19ydWxlcz1mYWxzZSBoaWRlcyB0aGUg Q1JFQVRFIFJVTEUuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3J0Jzo6cmVnY2xh c3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lu Y2x1ZGVzX3J1bGVzJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRs ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBDUkVBVEUgVEFCTEUgcGd0YmxfZGRsX3Rlc3QucnQgKCBpZCBpbnRlZ2VyKTsK KygxIHJvdykKKworLS0gaW5jbHVkZXNfc3RhdGlzdGljcz1mYWxzZSBoaWRlcyB0aGUgQ1JFQVRF IFNUQVRJU1RJQ1MuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3N0eCc6OnJlZ2Ns YXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdp bmNsdWRlc19zdGF0aXN0aWNzJywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAg IHBnX2dldF90YWJsZV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5zdHggKCBhIGludGVnZXIsIGIgaW50ZWdl ciwgYyBpbnRlZ2VyKTsKKygxIHJvdykKKworLS0gaW5jbHVkZXNfcmxzPWZhbHNlIGhpZGVzIHRo ZSBFTkFCTEUvRk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZIHRvZ2dsZXMuCitTRUxFQ1QgKiBGUk9N IHBnX2dldF90YWJsZV9kZGwoJ3Jscyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19ybHMnLCAnZmFsc2UnKTsKKyAg ICAgICAgICAgICAgICBwZ19nZXRfdGFibGVfZGRsICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBn dGJsX2RkbF90ZXN0LnJscyAoIGlkIGludGVnZXIpOworKDEgcm93KQorCistLSBpbmNsdWRlc19y ZXBsaWNhX2lkZW50aXR5PWZhbHNlIGhpZGVzIHRoZSBSRVBMSUNBIElERU5USVRZIGNsYXVzZS4K K1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmlfZnVsbCc6OnJlZ2NsYXNzLCAnb3du ZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19y ZXBsaWNhX2lkZW50aXR5JywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgIHBnX2dldF90YWJs ZV9kZGwgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5yaV9mdWxs ICggYSBpbnRlZ2VyKTsKKygxIHJvdykKKworLS0gaW5jbHVkZXNfcGFydGl0aW9uOiBkZWZhdWx0 IGlzIGZhbHNlLCBzbyB0aGUgcGFydGl0aW9uZWQtdGFibGUgcGFyZW50CistLSBEREwgb24gaXRz IG93biBkb2VzIG5vdCBpbmNsdWRlIGl0cyBjaGlsZHJlbi4gIFNldHRpbmcgaXQgdG8gdHJ1ZQor LS0gYXBwZW5kcyB0aGUgY2hpbGRyZW4ncyBEREwgYWZ0ZXIgdGhlIHBhcmVudC4KK1NFTEVDVCAq IEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3JhbmdlJzo6cmVnY2xhc3MsICdvd25lcics ICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVzX3BhcnRp dGlvbicsICd0cnVlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGdfZ2V0X3RhYmxlX2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRl ZF9yYW5nZSAoIGlkIGludGVnZXIsIGsgaW50ZWdlcikgUEFSVElUSU9OIEJZIFJBTkdFIChpZCk7 CisgQ1JFQVRFIFRBQkxFIHBndGJsX2RkbF90ZXN0LnBhcnRlZF9yYW5nZV8xIFBBUlRJVElPTiBP RiBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTAw KTsKKyBBTFRFUiBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2VfMSBBTFRFUiBDT0xV TU4gayBTRVQgREVGQVVMVCA3OworIENSRUFURSBUQUJMRSBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRf cmFuZ2VfZGVmIFBBUlRJVElPTiBPRiBwZ3RibF9kZGxfdGVzdC5wYXJ0ZWRfcmFuZ2UgREVGQVVM VDsKKyg0IHJvd3MpCisKKy0tIEVycm9yOiBub3QgYW4gb3JkaW5hcnkgb3IgcGFydGl0aW9uZWQg dGFibGUuCitDUkVBVEUgVklFVyB2IEFTIFNFTEVDVCAxIEFTIHg7CitTRUxFQ1QgKiBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ3YnOjpyZWdjbGFzcyk7CitFUlJPUjogICJ2IiBpcyBub3QgYW4gb3Jk aW5hcnkgb3IgcGFydGl0aW9uZWQgdGFibGUKK0NSRUFURSBTRVFVRU5DRSBzOworU0VMRUNUICog RlJPTSBwZ19nZXRfdGFibGVfZGRsKCdzJzo6cmVnY2xhc3MpOworRVJST1I6ICAicyIgaXMgbm90 IGFuIG9yZGluYXJ5IG9yIHBhcnRpdGlvbmVkIHRhYmxlCistLSBOVUxMIGFyZ3VtZW50IHJldHVy bnMgbm8gcm93cy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbChOVUxMKTsKKyBwZ19n ZXRfdGFibGVfZGRsIAorLS0tLS0tLS0tLS0tLS0tLS0tCisoMCByb3dzKQorCistLSBVbnJlY29n bml6ZWQgb3B0aW9uLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJl Z2NsYXNzLCAnYm9ndXMnLCAndHJ1ZScpOworRVJST1I6ICB1bnJlY29nbml6ZWQgb3B0aW9uOiAi Ym9ndXMiCistLSBPZGQgbnVtYmVyIG9mIHZhcmlhZGljIGFyZ3MuCitTRUxFQ1QgKiBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3MsICdwcmV0dHknKTsKK0VSUk9SOiAgdmFy aWFkaWMgYXJndW1lbnRzIG11c3QgYmUgbmFtZS92YWx1ZSBwYWlycworSElOVDogIFByb3ZpZGUg YW4gZXZlbiBudW1iZXIgb2YgdmFyaWFkaWMgYXJndW1lbnRzIHRoYXQgY2FuIGJlIGRpdmlkZWQg aW50byBwYWlycy4KKy0tIFJvdW5kLXRyaXAgdmVyaWZpY2F0aW9uLiAgRm9yIGV2ZXJ5IHRlc3Qg dGFibGUsIGNhcHR1cmUgdGhlIERETCB0aGUKKy0tIGZ1bmN0aW9uIGVtaXRzLCBkcm9wIHRoZSBz Y2hlbWEsIHJlcGxheSBlYWNoIHRhYmxlJ3MgRERMIGluCistLSBkZXBlbmRlbmN5IG9yZGVyLCBh bmQgY29uZmlybSB0aGF0IHBnX2dldF90YWJsZV9kZGwgb24gdGhlIHJlY3JlYXRlZAorLS0gcmVs YXRpb24gbWF0Y2hlcyB0aGUgb3JpZ2luYWwgbGluZS1mb3ItbGluZS4gIFRoZSBmaW5hbCBTRUxF Q1QgbXVzdAorLS0gcmV0dXJuIHplcm8gcm93cy4KK0NSRUFURSBURU1QIFRBQkxFIHBndGJsX2Rk bF9ydF9vcmlnIChuYW1lIHRleHQsIG9yZCBpbnQsIGxpbmUgdGV4dCk7CitJTlNFUlQgSU5UTyBw Z3RibF9kZGxfcnRfb3JpZworU0VMRUNUIHQubmFtZSwgby5vcmQsIG8ubGluZQorRlJPTSAoVkFM VUVTCisgICAgICAgICgnYmFzaWMnKSwgKCdpZF9jb2xzJyksICgnaWRfY3VzdG9tJyksICgnZ2Vu X2NvbHMnKSwgKCdzdG9yYWdlX2NvbHMnKSwKKyAgICAgICAgKCdyZWZkJyksICgnY29ucycpLCAo J2lkeGQnKSwKKyAgICAgICAgKCdwYXInKSwgKCdjaCcpLCAoJ2F0dG9wdCcpLAorICAgICAgICAo J3BhcnRlZF9yYW5nZScpLCAoJ3BhcnRlZF9yYW5nZV8xJyksICgncGFydGVkX3JhbmdlX2RlZicp LAorICAgICAgICAoJ3BhcnRlZF9oYXNoJyksICgncGFydGVkX2hhc2hfMCcpLAorICAgICAgICAo J3J0X2xvZycpLCAoJ3J0JyksCisgICAgICAgICgnc3R4JyksICgncmxzJyksICgncmlfZnVsbCcp LCAoJ3JpX2lkeCcpLCAoJ3VubycpCisgICAgICkgQVMgdChuYW1lKSwKKyAgICAgTEFURVJBTCBw Z19nZXRfdGFibGVfZGRsKCgncGd0YmxfZGRsX3Rlc3QuJyB8fCB0Lm5hbWUpOjpyZWdjbGFzcywK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvd25lcicsICdmYWxzZScpIFdJVEggT1JE SU5BTElUWSBvKGxpbmUsIG9yZCk7CitETyAkJAorREVDTEFSRQorICAgIHRhYmxlcyBDT05TVEFO VCB0ZXh0W10gOj0gQVJSQVlbCisgICAgICAgICdiYXNpYycsICdpZF9jb2xzJywgJ2lkX2N1c3Rv bScsICdnZW5fY29scycsICdzdG9yYWdlX2NvbHMnLAorICAgICAgICAncmVmZCcsICdjb25zJywg J2lkeGQnLAorICAgICAgICAncGFyJywgJ2NoJywgJ2F0dG9wdCcsCisgICAgICAgICdwYXJ0ZWRf cmFuZ2UnLCAncGFydGVkX3JhbmdlXzEnLCAncGFydGVkX3JhbmdlX2RlZicsCisgICAgICAgICdw YXJ0ZWRfaGFzaCcsICdwYXJ0ZWRfaGFzaF8wJywKKyAgICAgICAgJ3J0X2xvZycsICdydCcsCisg ICAgICAgICdzdHgnLCAncmxzJywgJ3JpX2Z1bGwnLCAncmlfaWR4JywgJ3VubycKKyAgICBdOwor ICAgIHQgdGV4dDsKKyAgICBzdG10IHRleHQ7CitCRUdJTgorICAgIERST1AgU0NIRU1BIHBndGJs X2RkbF90ZXN0IENBU0NBREU7CisgICAgQ1JFQVRFIFNDSEVNQSBwZ3RibF9kZGxfdGVzdDsKKyAg ICBGT1JFQUNIIHQgSU4gQVJSQVkgdGFibGVzIExPT1AKKyAgICAgICAgRk9SIHN0bXQgSU4KKyAg ICAgICAgICAgIFNFTEVDVCBsaW5lIEZST00gcGd0YmxfZGRsX3J0X29yaWcgV0hFUkUgbmFtZSA9 IHQgT1JERVIgQlkgb3JkCisgICAgICAgIExPT1AKKyAgICAgICAgICAgIEVYRUNVVEUgc3RtdDsK KyAgICAgICAgRU5EIExPT1A7CisgICAgRU5EIExPT1A7CitFTkQgJCQ7CitOT1RJQ0U6ICBkcm9w IGNhc2NhZGVzIHRvIDI1IG90aGVyIG9iamVjdHMKK0RFVEFJTDogIGRyb3AgY2FzY2FkZXMgdG8g dGFibGUgYmFzaWMKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgaWRfY29scworZHJvcCBjYXNjYWRl cyB0byB0YWJsZSBpZF9jdXN0b20KK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgZ2VuX2NvbHMKK2Ry b3AgY2FzY2FkZXMgdG8gdGFibGUgc3RvcmFnZV9jb2xzCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxl IHJlZmQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgY29ucworZHJvcCBjYXNjYWRlcyB0byB0YWJs ZSBpZHhkCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBhcgorZHJvcCBjYXNjYWRlcyB0byB0YWJs ZSBjaAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBhdHRvcHQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFi bGUgcGFydGVkX3JhbmdlCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHBhcnRlZF9oYXNoCitkcm9w IGNhc2NhZGVzIHRvIHRhYmxlIHJ0Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJ0X2xvZworZHJv cCBjYXNjYWRlcyB0byB0YWJsZSBzdHgKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmxzCitkcm9w IGNhc2NhZGVzIHRvIHRhYmxlIHJpX2Z1bGwKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmlfaWR4 Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHVubworZHJvcCBjYXNjYWRlcyB0byB0eXBlIHR5cGVk X3QKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgdHlwZWRfcGxhaW4KK2Ryb3AgY2FzY2FkZXMgdG8g dGFibGUgdHlwZWRfb3ZlcgorZHJvcCBjYXNjYWRlcyB0byB2aWV3IHYKK2Ryb3AgY2FzY2FkZXMg dG8gc2VxdWVuY2UgcworV0lUSCBhZnRlcl9kZGwgQVMgKAorICAgIFNFTEVDVCB0Lm5hbWUsIG8u b3JkLCBvLmxpbmUKKyAgICBGUk9NIChTRUxFQ1QgRElTVElOQ1QgbmFtZSBGUk9NIHBndGJsX2Rk bF9ydF9vcmlnKSBBUyB0LAorICAgICAgICAgTEFURVJBTCBwZ19nZXRfdGFibGVfZGRsKCgncGd0 YmxfZGRsX3Rlc3QuJyB8fCB0Lm5hbWUpOjpyZWdjbGFzcywKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAnb3duZXInLCAnZmFsc2UnKSBXSVRIIE9SRElOQUxJVFkgbyhsaW5lLCBv cmQpCispCisoU0VMRUNUICdtaXNzaW5nLWluLWNvcHknIEFTIGtpbmQsIG5hbWUsIG9yZCwgbGlu ZSBGUk9NIHBndGJsX2RkbF9ydF9vcmlnCisgRVhDRVBUCisgU0VMRUNUICdtaXNzaW5nLWluLWNv cHknLCBuYW1lLCBvcmQsIGxpbmUgRlJPTSBhZnRlcl9kZGwpCitVTklPTiBBTEwKKyhTRUxFQ1Qg J2V4dHJhLWluLWNvcHknIEFTIGtpbmQsIG5hbWUsIG9yZCwgbGluZSBGUk9NIGFmdGVyX2RkbAor IEVYQ0VQVAorIFNFTEVDVCAnZXh0cmEtaW4tY29weScsIG5hbWUsIG9yZCwgbGluZSBGUk9NIHBn dGJsX2RkbF9ydF9vcmlnKQorT1JERVIgQlkga2luZCwgbmFtZSwgb3JkOworIGtpbmQgfCBuYW1l IHwgb3JkIHwgbGluZSAKKy0tLS0tLSstLS0tLS0rLS0tLS0rLS0tLS0tCisoMCByb3dzKQorCist LSBDbGVhbnVwLgorRFJPUCBTQ0hFTUEgcGd0YmxfZGRsX3Rlc3QgQ0FTQ0FERTsKK05PVElDRTog IGRyb3AgY2FzY2FkZXMgdG8gMjAgb3RoZXIgb2JqZWN0cworREVUQUlMOiAgZHJvcCBjYXNjYWRl cyB0byB0YWJsZSBiYXNpYworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBpZF9jb2xzCitkcm9wIGNh c2NhZGVzIHRvIHRhYmxlIGlkX2N1c3RvbQorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBnZW5fY29s cworZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBzdG9yYWdlX2NvbHMKK2Ryb3AgY2FzY2FkZXMgdG8g dGFibGUgcmVmZAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBjb25zCitkcm9wIGNhc2NhZGVzIHRv IHRhYmxlIGlkeGQKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcGFyCitkcm9wIGNhc2NhZGVzIHRv IHRhYmxlIGNoCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIGF0dG9wdAorZHJvcCBjYXNjYWRlcyB0 byB0YWJsZSBwYXJ0ZWRfcmFuZ2UKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcGFydGVkX2hhc2gK K2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcnRfbG9nCitkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHJ0 Citkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHN0eAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBybHMK K2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgcmlfZnVsbAorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBy aV9pZHgKK2Ryb3AgY2FzY2FkZXMgdG8gdGFibGUgdW5vCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9y ZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlIGIvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hl ZHVsZQppbmRleCA4ZmEwYTZjNDdmYi4uOWVjYTY0Y2NhM2IgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0 L3JlZ3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxl bF9zY2hlZHVsZQpAQCAtODEsNyArODEsNyBAQCB0ZXN0OiBjcmVhdGVfdGFibGVfbGlrZSBhbHRl cl9nZW5lcmljIGFsdGVyX29wZXJhdG9yIG1pc2MgYXN5bmMgZGJzaXplIG1lcmdlIG1pcwogIyBj b2xsYXRlLmxpbnV4LnV0ZjggYW5kIGNvbGxhdGUuaWN1LnV0ZjggdGVzdHMgY2Fubm90IGJlIHJ1 biBpbiBwYXJhbGxlbCB3aXRoIGVhY2ggb3RoZXIKICMgcHNxbCBkZXBlbmRzIG9uIGNyZWF0ZV9h bQogIyBhbXV0aWxzIGRlcGVuZHMgb24gZ2VvbWV0cnksIGNyZWF0ZV9pbmRleF9zcGdpc3QsIGhh c2hfaW5kZXgsIGJyaW4KLXRlc3Q6IHJ1bGVzIHBzcWwgcHNxbF9jcm9zc3RhYiBwc3FsX3BpcGVs aW5lIGFtdXRpbHMgc3RhdHNfZXh0IGNvbGxhdGUubGludXgudXRmOCBjb2xsYXRlLndpbmRvd3Mu d2luMTI1MgordGVzdDogcnVsZXMgcHNxbCBwc3FsX2Nyb3NzdGFiIHBzcWxfcGlwZWxpbmUgYW11 dGlscyBzdGF0c19leHQgY29sbGF0ZS5saW51eC51dGY4IGNvbGxhdGUud2luZG93cy53aW4xMjUy IHBnX2dldF90YWJsZV9kZGwKIAogIyAtLS0tLS0tLS0tCiAjIFJ1biB0aGVzZSBhbG9uZSBzbyB0 aGV5IGRvbid0IHJ1biBvdXQgb2YgcGFyYWxsZWwgd29ya2VycwpkaWZmIC0tZ2l0IGEvc3JjL3Rl c3QvcmVncmVzcy9zcWwvcGdfZ2V0X3RhYmxlX2RkbC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9wZ19nZXRfdGFibGVfZGRsLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMC4uYzdmNzJiYjgyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9wZ19nZXRfdGFibGVfZGRsLnNxbApAQCAtMCwwICsxLDI3OCBAQAorLS0KKy0tIHBnX2dldF90 YWJsZV9kZGwKKy0tCistLSBBbGwgdGVzdHMgcGFzcyBvd25lcj0+ZmFsc2Ugc28gdGhlIEFMVEVS IFRBQkxFIE9XTkVSIFRPIGxpbmUgaXMgbm90CistLSBlbWl0dGVkLCBrZWVwaW5nIG91dHB1dCBz dGFibGUgYWNyb3NzIHRlc3QgcnVubmVycyAod2hpY2ggbWF5IHJ1biB1bmRlcgorLS0gZGlmZmVy ZW50IHJvbGUgbmFtZXMpLgorLS0KK0NSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX3Rlc3Q7CitTRVQg c2VhcmNoX3BhdGggPSBwZ3RibF9kZGxfdGVzdDsKKworLS0gQmFzaWMgdGFibGUgd2l0aCBQUklN QVJZIEtFWSwgTk9UIE5VTEwsIERFRkFVTFQsIENPTExBVEUuCitDUkVBVEUgVEFCTEUgYmFzaWMg KAorICAgIGlkIGludCBQUklNQVJZIEtFWSwKKyAgICBuYW1lIHRleHQgTk9UIE5VTEwgREVGQVVM VCAnYW5vbicgQ09MTEFURSAiQyIKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwo J2Jhc2ljJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCistLSBJZGVudGl0eSBjb2x1 bW5zICh3aXRoIGRlZmF1bHQgYW5kIGN1c3RvbSBzZXF1ZW5jZSBvcHRpb25zKS4KK0NSRUFURSBU QUJMRSBpZF9jb2xzICgKKyAgICBpZF9hbHdheXMgaW50IEdFTkVSQVRFRCBBTFdBWVMgQVMgSURF TlRJVFksCisgICAgaWRfZGVmYXVsdCBpbnQgR0VORVJBVEVEIEJZIERFRkFVTFQgQVMgSURFTlRJ VFkKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkX2NvbHMnOjpyZWdjbGFz cywgJ293bmVyJywgJ2ZhbHNlJyk7CisKK0NSRUFURSBUQUJMRSBpZF9jdXN0b20gKAorICAgIHYg aW50IEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJVFkgKAorICAgICAgICBTRVFVRU5DRSBOQU1F IGlkX2N1c3RvbV92X3NlcQorICAgICAgICBTVEFSVCBXSVRIIDEwMCBJTkNSRU1FTlQgQlkgNQor ICAgICAgICBNSU5WQUxVRSA1MCBNQVhWQUxVRSAxMDAwCisgICAgICAgIENBQ0hFIDEwIENZQ0xF CisgICAgKQorKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnaWRfY3VzdG9tJzo6 cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOworCistLSBHZW5lcmF0ZWQgc3RvcmVkIGNvbHVt bi4KK0NSRUFURSBUQUJMRSBnZW5fY29scyAoCisgICAgY2VudHMgaW50LAorICAgIGRvbGxhcnMg bnVtZXJpYyBHRU5FUkFURUQgQUxXQVlTIEFTIChjZW50cyAvIDEwMC4wKSBTVE9SRUQKKyk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2dlbl9jb2xzJzo6cmVnY2xhc3MsICdvd25l cicsICdmYWxzZScpOworCistLSBTVE9SQUdFIGFuZCBDT01QUkVTU0lPTiAob25seSBlbWl0dGVk IHdoZW4gbm9uLWRlZmF1bHQgZm9yIHRoZSB0eXBlKS4KK0NSRUFURSBUQUJMRSBzdG9yYWdlX2Nv bHMgKAorICAgIGEgdGV4dCBTVE9SQUdFIEVYVEVSTkFMLAorICAgIGIgdGV4dCBTVE9SQUdFIE1B SU4sCisgICAgYyB0ZXh0IENPTVBSRVNTSU9OIHBnbHoKKyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dl dF90YWJsZV9kZGwoJ3N0b3JhZ2VfY29scyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsK KworLS0gQ29uc3RyYWludHM6IENIRUNLLCBVTklRVUUsIEZPUkVJR04gS0VZIChERUZFUlJBQkxF KS4KK0NSRUFURSBUQUJMRSByZWZkIChpZCBpbnQgUFJJTUFSWSBLRVkpOworQ1JFQVRFIFRBQkxF IGNvbnMgKAorICAgIGEgaW50IENIRUNLIChhID4gMCksCisgICAgYiBpbnQgVU5JUVVFLAorICAg IGMgaW50IFJFRkVSRU5DRVMgcmVmZChpZCkgREVGRVJSQUJMRSBJTklUSUFMTFkgREVGRVJSRUQK Kyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2NvbnMnOjpyZWdjbGFzcywgJ293 bmVyJywgJ2ZhbHNlJyk7CisKKy0tIEluZGV4ZXM6IGZ1bmN0aW9uYWwgYW5kIHBhcnRpYWwuICBD b25zdHJhaW50LWJhY2tpbmcgaW5kZXhlcyBhcmUKKy0tIHN1cHByZXNzZWQgKHRoZXkgYXJlIGVt aXR0ZWQgYnkgdGhlIGNvbnN0cmFpbnQgbG9vcCkuCitDUkVBVEUgVEFCTEUgaWR4ZCAoaWQgaW50 IFBSSU1BUlkgS0VZLCBuYW1lIHRleHQpOworQ1JFQVRFIElOREVYIGlkeGRfbG93ZXIgT04gaWR4 ZCAobG93ZXIobmFtZSkpOworQ1JFQVRFIElOREVYIGlkeGRfcGFydGlhbCBPTiBpZHhkIChpZCkg V0hFUkUgaWQgPiAxMDA7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2lkeGQnOjpy ZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIEluaGVyaXRhbmNlLCBpbmNsdWRpbmcg YSBjaGlsZCBERUZBVUxUIG92ZXJyaWRlIG9uIGFuIGluaGVyaXRlZCBjb2x1bW4uCitDUkVBVEUg VEFCTEUgcGFyIChhIGludCBERUZBVUxUIDEsIGIgdGV4dCk7CitDUkVBVEUgVEFCTEUgY2ggKGMg aW50KSBJTkhFUklUUyAocGFyKTsKK0FMVEVSIFRBQkxFIGNoIEFMVEVSIENPTFVNTiBhIFNFVCBE RUZBVUxUIDk5OTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnY2gnOjpyZWdjbGFz cywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFBlci1jb2x1bW4gYXR0b3B0aW9uczogZW1pdHRl ZCBhcyBBTFRFUiBDT0xVTU4gU0VUICguLi4pLgorQ1JFQVRFIFRBQkxFIGF0dG9wdCAoYSBpbnQs IGIgdGV4dCk7CitBTFRFUiBUQUJMRSBhdHRvcHQgQUxURVIgQ09MVU1OIGEgU0VUIChuX2Rpc3Rp bmN0ID0gMTAwKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnYXR0b3B0Jzo6cmVn Y2xhc3MsICdvd25lcicsICdmYWxzZScpOworCistLSBQYXJ0aXRpb25lZCB0YWJsZSBwYXJlbnQg KFJBTkdFIGFuZCBIQVNIKS4KK0NSRUFURSBUQUJMRSBwYXJ0ZWRfcmFuZ2UgKGlkIGludCwgayBp bnQpIFBBUlRJVElPTiBCWSBSQU5HRSAoaWQpOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCdwYXJ0ZWRfcmFuZ2UnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKK0NSRUFU RSBUQUJMRSBwYXJ0ZWRfaGFzaCAoaWQgaW50KSBQQVJUSVRJT04gQlkgSEFTSCAoaWQpOworU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRfaGFzaCc6OnJlZ2NsYXNzLCAnb3du ZXInLCAnZmFsc2UnKTsKKworLS0gUGFydGl0aW9uIGNoaWxkcmVuOiBGUk9NL1RPLCBXSVRIICht b2R1bHVzLCByZW1haW5kZXIpLCBERUZBVUxULgorQ1JFQVRFIFRBQkxFIHBhcnRlZF9yYW5nZV8x IFBBUlRJVElPTiBPRiBwYXJ0ZWRfcmFuZ2UKKyAgICBGT1IgVkFMVUVTIEZST00gKDApIFRPICgx MDApOworQUxURVIgVEFCTEUgcGFydGVkX3JhbmdlXzEgQUxURVIgQ09MVU1OIGsgU0VUIERFRkFV TFQgNzsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3JhbmdlXzEnOjpy ZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKK0NSRUFURSBUQUJMRSBwYXJ0ZWRfaGFzaF8w IFBBUlRJVElPTiBPRiBwYXJ0ZWRfaGFzaAorICAgIEZPUiBWQUxVRVMgV0lUSCAobW9kdWx1cyAy LCByZW1haW5kZXIgMCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3BhcnRlZF9o YXNoXzAnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKK0NSRUFURSBUQUJMRSBwYXJ0 ZWRfcmFuZ2VfZGVmIFBBUlRJVElPTiBPRiBwYXJ0ZWRfcmFuZ2UgREVGQVVMVDsKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncGFydGVkX3JhbmdlX2RlZic6OnJlZ2NsYXNzLCAnb3du ZXInLCAnZmFsc2UnKTsKKworLS0gUnVsZXMuCitDUkVBVEUgVEFCTEUgcnQgKGlkIGludCk7CitD UkVBVEUgVEFCTEUgcnRfbG9nIChpZCBpbnQpOworQ1JFQVRFIFJVTEUgcnRfbG9nX2luc2VydCBB UyBPTiBJTlNFUlQgVE8gcnQKKyAgICBETyBBTFNPIElOU0VSVCBJTlRPIHJ0X2xvZyBWQUxVRVMg KE5FVy5pZCk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3J0Jzo6cmVnY2xhc3Ms ICdvd25lcicsICdmYWxzZScpOworCistLSBFeHRlbmRlZCBzdGF0aXN0aWNzLgorQ1JFQVRFIFRB QkxFIHN0eCAoYSBpbnQsIGIgaW50LCBjIGludCk7CitDUkVBVEUgU1RBVElTVElDUyBzdHhfbmR2 IChuZGlzdGluY3QpIE9OIGEsIGIgRlJPTSBzdHg7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJs ZV9kZGwoJ3N0eCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKworLS0gUm93LWxldmVs IHNlY3VyaXR5IHRvZ2dsZXMuCitDUkVBVEUgVEFCTEUgcmxzIChpZCBpbnQpOworQUxURVIgVEFC TEUgcmxzIEVOQUJMRSBST1cgTEVWRUwgU0VDVVJJVFk7CitBTFRFUiBUQUJMRSBybHMgRk9SQ0Ug Uk9XIExFVkVMIFNFQ1VSSVRZOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdybHMn OjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFJFUExJQ0EgSURFTlRJVFk6IGVt aXR0ZWQgb25seSB3aGVuIG5vdCB0aGUgZGVmYXVsdC4KK0NSRUFURSBUQUJMRSByaV9mdWxsIChh IGludCk7CitBTFRFUiBUQUJMRSByaV9mdWxsIFJFUExJQ0EgSURFTlRJVFkgRlVMTDsKK1NFTEVD VCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgncmlfZnVsbCc6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnKTsKKworQ1JFQVRFIFRBQkxFIHJpX2lkeCAoYSBpbnQgTk9UIE5VTEwpOworQ1JFQVRF IFVOSVFVRSBJTkRFWCByaV9pZHhfYSBPTiByaV9pZHggKGEpOworQUxURVIgVEFCTEUgcmlfaWR4 IFJFUExJQ0EgSURFTlRJVFkgVVNJTkcgSU5ERVggcmlfaWR4X2E7CitTRUxFQ1QgKiBGUk9NIHBn X2dldF90YWJsZV9kZGwoJ3JpX2lkeCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKTsKKwor LS0gVU5MT0dHRUQgKyByZWxvcHRpb25zLgorQ1JFQVRFIFVOTE9HR0VEIFRBQkxFIHVubyAoaWQg aW50KSBXSVRIIChmaWxsZmFjdG9yID0gNzApOworU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVf ZGRsKCd1bm8nOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJyk7CisKKy0tIFR5cGVkIHRhYmxl IChDUkVBVEUgVEFCTEUgT0YgdHlwZV9uYW1lKS4gIENvbHVtbnMgaW5oZXJpdGVkIGZyb20gdGhl CistLSB0eXBlIGVtaXQgbm90aGluZzsgbG9jYWxseS1hcHBsaWVkIERFRkFVTFQsIE5PVCBOVUxM IGFuZCBDSEVDSyBjb21lCistLSBvdXQgdGhyb3VnaCBhIHNpbmdsZSAiKGNvbCBXSVRIIE9QVElP TlMgLi4uKSIgbGlzdC4KK0NSRUFURSBUWVBFIHR5cGVkX3QgQVMgKGEgaW50LCBiIHRleHQpOwor Q1JFQVRFIFRBQkxFIHR5cGVkX3BsYWluIE9GIHR5cGVkX3Q7CitTRUxFQ1QgKiBGUk9NIHBnX2dl dF90YWJsZV9kZGwoJ3R5cGVkX3BsYWluJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpOwor CitDUkVBVEUgVEFCTEUgdHlwZWRfb3ZlciBPRiB0eXBlZF90ICgKKyAgICBhIFdJVEggT1BUSU9O UyBERUZBVUxUIDcgTk9UIE5VTEwsCisgICAgYiBXSVRIIE9QVElPTlMgTk9UIE5VTEwsCisgICAg Q09OU1RSQUlOVCBiX25vbmVtcHR5IENIRUNLIChsZW5ndGgoYikgPiAwKQorKTsKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3RhYmxlX2RkbCgndHlwZWRfb3Zlcic6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnKTsKKworLS0gVGVtcG9yYXJ5IHRhYmxlcyArIE9OIENPTU1JVC4gIFRlbXAgdGFibGVz IGxpdmUgaW4gYSBzZXNzaW9uLWxvY2FsCistLSBuYW1lc3BhY2Ugd2hvc2UgbmFtZSB2YXJpZXMg YmV0d2VlbiBydW5zLCBzbyB3ZSBzdHJpcCB0aGUgc2NoZW1hCistLSBwcmVmaXguICBPTiBDT01N SVQgRFJPUCBvbmx5IGZpcmVzIGF0IGNvbW1pdCwgc28gdGhlIHF1ZXJpZXMgdGhhdAorLS0gbmVl ZCB0byBzZWUgdGhlIGNhdGFsb2cgZW50cnkgbXVzdCBydW4gaW4gdGhlIHNhbWUgdHJhbnNhY3Rp b24gYXMKKy0tIHRoZSBDUkVBVEUuCitCRUdJTjsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZGVm YXVsdCAoaWQgaW50KTsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZGVsZXRlIChpZCBpbnQpIE9O IENPTU1JVCBERUxFVEUgUk9XUzsKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfZHJvcCAoaWQgaW50 KSBPTiBDT01NSVQgRFJPUDsKKworU0VMRUNUIHJlZ2V4cF9yZXBsYWNlKGxpbmUsICciP3BnX3Rl bXBfP1swLTldKyI/XC4nLCAncGdfdGVtcC4nKSBBUyBsaW5lCitGUk9NIHBnX2dldF90YWJsZV9k ZGwoJ3RlbXBfZGVmYXVsdCc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnKSBBUyBsaW5lCitX SEVSRSBsaW5lIExJS0UgJ0NSRUFURSAlJzsKKworU0VMRUNUIHJlZ2V4cF9yZXBsYWNlKGxpbmUs ICciP3BnX3RlbXBfP1swLTldKyI/XC4nLCAncGdfdGVtcC4nKSBBUyBsaW5lCitGUk9NIHBnX2dl dF90YWJsZV9kZGwoJ3RlbXBfZGVsZXRlJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxzZScpIEFT IGxpbmUKK1dIRVJFIGxpbmUgTElLRSAnQ1JFQVRFICUnOworCitTRUxFQ1QgcmVnZXhwX3JlcGxh Y2UobGluZSwgJyI/cGdfdGVtcF8/WzAtOV0rIj9cLicsICdwZ190ZW1wLicpIEFTIGxpbmUKK0ZS T00gcGdfZ2V0X3RhYmxlX2RkbCgndGVtcF9kcm9wJzo6cmVnY2xhc3MsICdvd25lcicsICdmYWxz ZScpIEFTIGxpbmUKK1dIRVJFIGxpbmUgTElLRSAnQ1JFQVRFICUnOworUk9MTEJBQ0s7CisKKy0t IFByZXR0eSBtb2RlLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJl Z2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLCAncHJldHR5JywgJ3RydWUnKTsKKworLS0gaW5jbHVk ZXNfKiBnYXRpbmc6IGVhY2ggc3ViLW9iamVjdCBjYXRlZ29yeSBjYW4gYmUgc3VwcHJlc3NlZCBp bmRpdmlkdWFsbHkuCistLSBpbmNsdWRlc19pbmRleGVzPWZhbHNlIGhpZGVzIHRoZSBDUkVBVEUg SU5ERVggc3RhdGVtZW50cy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnaWR4ZCc6 OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICdpbmNsdWRlc19pbmRleGVzJywgJ2ZhbHNlJyk7CisKKy0tIGluY2x1ZGVzX2NvbnN0cmFp bnRzPWZhbHNlIGhpZGVzIGJvdGggaW5saW5lIENIRUNLIGluIENSRUFURSBUQUJMRSBhbmQKKy0t IHRoZSBBTFRFUiBUQUJMRSAuLi4gQUREIENPTlNUUkFJTlQgbGluZXMuCitTRUxFQ1QgKiBGUk9N IHBnX2dldF90YWJsZV9kZGwoJ2NvbnMnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZXNfY29uc3RyYWludHMnLCAnZmFs c2UnKTsKKworLS0gaW5jbHVkZXNfcnVsZXM9ZmFsc2UgaGlkZXMgdGhlIENSRUFURSBSVUxFLgor U0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdydCc6OnJlZ2NsYXNzLCAnb3duZXInLCAn ZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19ydWxlcycs ICdmYWxzZScpOworCistLSBpbmNsdWRlc19zdGF0aXN0aWNzPWZhbHNlIGhpZGVzIHRoZSBDUkVB VEUgU1RBVElTVElDUy4KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgnc3R4Jzo6cmVn Y2xhc3MsICdvd25lcicsICdmYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg J2luY2x1ZGVzX3N0YXRpc3RpY3MnLCAnZmFsc2UnKTsKKworLS0gaW5jbHVkZXNfcmxzPWZhbHNl IGhpZGVzIHRoZSBFTkFCTEUvRk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZIHRvZ2dsZXMuCitTRUxF Q1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3Jscyc6OnJlZ2NsYXNzLCAnb3duZXInLCAnZmFs c2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlc19ybHMnLCAnZmFs c2UnKTsKKworLS0gaW5jbHVkZXNfcmVwbGljYV9pZGVudGl0eT1mYWxzZSBoaWRlcyB0aGUgUkVQ TElDQSBJREVOVElUWSBjbGF1c2UuCitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ3Jp X2Z1bGwnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAnaW5jbHVkZXNfcmVwbGljYV9pZGVudGl0eScsICdmYWxzZScpOworCistLSBp bmNsdWRlc19wYXJ0aXRpb246IGRlZmF1bHQgaXMgZmFsc2UsIHNvIHRoZSBwYXJ0aXRpb25lZC10 YWJsZSBwYXJlbnQKKy0tIERETCBvbiBpdHMgb3duIGRvZXMgbm90IGluY2x1ZGUgaXRzIGNoaWxk cmVuLiAgU2V0dGluZyBpdCB0byB0cnVlCistLSBhcHBlbmRzIHRoZSBjaGlsZHJlbidzIERETCBh ZnRlciB0aGUgcGFyZW50LgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdwYXJ0ZWRf cmFuZ2UnOjpyZWdjbGFzcywgJ293bmVyJywgJ2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAnaW5jbHVkZXNfcGFydGl0aW9uJywgJ3RydWUnKTsKKworLS0gRXJyb3I6IG5v dCBhbiBvcmRpbmFyeSBvciBwYXJ0aXRpb25lZCB0YWJsZS4KK0NSRUFURSBWSUVXIHYgQVMgU0VM RUNUIDEgQVMgeDsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3RhYmxlX2RkbCgndic6OnJlZ2NsYXNz KTsKKworQ1JFQVRFIFNFUVVFTkNFIHM7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwo J3MnOjpyZWdjbGFzcyk7CisKKy0tIE5VTEwgYXJndW1lbnQgcmV0dXJucyBubyByb3dzLgorU0VM RUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKE5VTEwpOworCistLSBVbnJlY29nbml6ZWQgb3B0 aW9uLgorU0VMRUNUICogRlJPTSBwZ19nZXRfdGFibGVfZGRsKCdiYXNpYyc6OnJlZ2NsYXNzLCAn Ym9ndXMnLCAndHJ1ZScpOworCistLSBPZGQgbnVtYmVyIG9mIHZhcmlhZGljIGFyZ3MuCitTRUxF Q1QgKiBGUk9NIHBnX2dldF90YWJsZV9kZGwoJ2Jhc2ljJzo6cmVnY2xhc3MsICdwcmV0dHknKTsK KworLS0gUm91bmQtdHJpcCB2ZXJpZmljYXRpb24uICBGb3IgZXZlcnkgdGVzdCB0YWJsZSwgY2Fw dHVyZSB0aGUgRERMIHRoZQorLS0gZnVuY3Rpb24gZW1pdHMsIGRyb3AgdGhlIHNjaGVtYSwgcmVw bGF5IGVhY2ggdGFibGUncyBEREwgaW4KKy0tIGRlcGVuZGVuY3kgb3JkZXIsIGFuZCBjb25maXJt IHRoYXQgcGdfZ2V0X3RhYmxlX2RkbCBvbiB0aGUgcmVjcmVhdGVkCistLSByZWxhdGlvbiBtYXRj aGVzIHRoZSBvcmlnaW5hbCBsaW5lLWZvci1saW5lLiAgVGhlIGZpbmFsIFNFTEVDVCBtdXN0Cist LSByZXR1cm4gemVybyByb3dzLgorQ1JFQVRFIFRFTVAgVEFCTEUgcGd0YmxfZGRsX3J0X29yaWcg KG5hbWUgdGV4dCwgb3JkIGludCwgbGluZSB0ZXh0KTsKK0lOU0VSVCBJTlRPIHBndGJsX2RkbF9y dF9vcmlnCitTRUxFQ1QgdC5uYW1lLCBvLm9yZCwgby5saW5lCitGUk9NIChWQUxVRVMKKyAgICAg ICAgKCdiYXNpYycpLCAoJ2lkX2NvbHMnKSwgKCdpZF9jdXN0b20nKSwgKCdnZW5fY29scycpLCAo J3N0b3JhZ2VfY29scycpLAorICAgICAgICAoJ3JlZmQnKSwgKCdjb25zJyksICgnaWR4ZCcpLAor ICAgICAgICAoJ3BhcicpLCAoJ2NoJyksICgnYXR0b3B0JyksCisgICAgICAgICgncGFydGVkX3Jh bmdlJyksICgncGFydGVkX3JhbmdlXzEnKSwgKCdwYXJ0ZWRfcmFuZ2VfZGVmJyksCisgICAgICAg ICgncGFydGVkX2hhc2gnKSwgKCdwYXJ0ZWRfaGFzaF8wJyksCisgICAgICAgICgncnRfbG9nJyks ICgncnQnKSwKKyAgICAgICAgKCdzdHgnKSwgKCdybHMnKSwgKCdyaV9mdWxsJyksICgncmlfaWR4 JyksICgndW5vJykKKyAgICAgKSBBUyB0KG5hbWUpLAorICAgICBMQVRFUkFMIHBnX2dldF90YWJs ZV9kZGwoKCdwZ3RibF9kZGxfdGVzdC4nIHx8IHQubmFtZSk6OnJlZ2NsYXNzLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJ293bmVyJywgJ2ZhbHNlJykgV0lUSCBPUkRJTkFMSVRZIG8o bGluZSwgb3JkKTsKKworRE8gJCQKK0RFQ0xBUkUKKyAgICB0YWJsZXMgQ09OU1RBTlQgdGV4dFtd IDo9IEFSUkFZWworICAgICAgICAnYmFzaWMnLCAnaWRfY29scycsICdpZF9jdXN0b20nLCAnZ2Vu X2NvbHMnLCAnc3RvcmFnZV9jb2xzJywKKyAgICAgICAgJ3JlZmQnLCAnY29ucycsICdpZHhkJywK KyAgICAgICAgJ3BhcicsICdjaCcsICdhdHRvcHQnLAorICAgICAgICAncGFydGVkX3JhbmdlJywg J3BhcnRlZF9yYW5nZV8xJywgJ3BhcnRlZF9yYW5nZV9kZWYnLAorICAgICAgICAncGFydGVkX2hh c2gnLCAncGFydGVkX2hhc2hfMCcsCisgICAgICAgICdydF9sb2cnLCAncnQnLAorICAgICAgICAn c3R4JywgJ3JscycsICdyaV9mdWxsJywgJ3JpX2lkeCcsICd1bm8nCisgICAgXTsKKyAgICB0IHRl eHQ7CisgICAgc3RtdCB0ZXh0OworQkVHSU4KKyAgICBEUk9QIFNDSEVNQSBwZ3RibF9kZGxfdGVz dCBDQVNDQURFOworICAgIENSRUFURSBTQ0hFTUEgcGd0YmxfZGRsX3Rlc3Q7CisgICAgRk9SRUFD SCB0IElOIEFSUkFZIHRhYmxlcyBMT09QCisgICAgICAgIEZPUiBzdG10IElOCisgICAgICAgICAg ICBTRUxFQ1QgbGluZSBGUk9NIHBndGJsX2RkbF9ydF9vcmlnIFdIRVJFIG5hbWUgPSB0IE9SREVS IEJZIG9yZAorICAgICAgICBMT09QCisgICAgICAgICAgICBFWEVDVVRFIHN0bXQ7CisgICAgICAg IEVORCBMT09QOworICAgIEVORCBMT09QOworRU5EICQkOworCitXSVRIIGFmdGVyX2RkbCBBUyAo CisgICAgU0VMRUNUIHQubmFtZSwgby5vcmQsIG8ubGluZQorICAgIEZST00gKFNFTEVDVCBESVNU SU5DVCBuYW1lIEZST00gcGd0YmxfZGRsX3J0X29yaWcpIEFTIHQsCisgICAgICAgICBMQVRFUkFM IHBnX2dldF90YWJsZV9kZGwoKCdwZ3RibF9kZGxfdGVzdC4nIHx8IHQubmFtZSk6OnJlZ2NsYXNz LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvd25lcicsICdmYWxzZScpIFdJ VEggT1JESU5BTElUWSBvKGxpbmUsIG9yZCkKKykKKyhTRUxFQ1QgJ21pc3NpbmctaW4tY29weScg QVMga2luZCwgbmFtZSwgb3JkLCBsaW5lIEZST00gcGd0YmxfZGRsX3J0X29yaWcKKyBFWENFUFQK KyBTRUxFQ1QgJ21pc3NpbmctaW4tY29weScsIG5hbWUsIG9yZCwgbGluZSBGUk9NIGFmdGVyX2Rk bCkKK1VOSU9OIEFMTAorKFNFTEVDVCAnZXh0cmEtaW4tY29weScgQVMga2luZCwgbmFtZSwgb3Jk LCBsaW5lIEZST00gYWZ0ZXJfZGRsCisgRVhDRVBUCisgU0VMRUNUICdleHRyYS1pbi1jb3B5Jywg bmFtZSwgb3JkLCBsaW5lIEZST00gcGd0YmxfZGRsX3J0X29yaWcpCitPUkRFUiBCWSBraW5kLCBu YW1lLCBvcmQ7CisKKy0tIENsZWFudXAuCitEUk9QIFNDSEVNQSBwZ3RibF9kZGxfdGVzdCBDQVND QURFOwotLSAKMi41MS4wCgo= --0000000000000ead26065358fe5c--