Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1Ya5PI-0004cu-1L for pgsql-hackers@arkaria.postgresql.org; Mon, 23 Mar 2015 16:40:52 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.80) (envelope-from ) id 1Ya5PG-0001pv-PI for pgsql-hackers@arkaria.postgresql.org; Mon, 23 Mar 2015 16:40:50 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1Ya5PC-0001ng-CA for pgsql-hackers@postgresql.org; Mon, 23 Mar 2015 16:40:47 +0000 Received: from linode.thelabyrinth.net ([198.58.117.137] helo=mail.thelabyrinth.net) by makus.postgresql.org with esmtps (TLS1.1:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1Ya5P4-0005Nl-Py for pgsql-hackers@postgresql.org; Mon, 23 Mar 2015 16:40:44 +0000 Received: from theseus.local (unknown [98.204.177.190]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: dsteele) by mail.thelabyrinth.net (Postfix) with ESMTPSA id 26DD312D0A; Mon, 23 Mar 2015 16:40:37 +0000 (UTC) Message-ID: <55104204.80008@pgmasters.net> Date: Mon, 23 Mar 2015 12:40:36 -0400 From: David Steele User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Abhijit Menon-Sen CC: Stephen Frost , =?UTF-8?B?w4FsdmFybyBIZXJyZXJh?= , Fujii Masao , PostgreSQL-development Subject: Re: Auditing extension for PostgreSQL (Take 2) References: <54E005CC.1060605@pgmasters.net> <20150217153402.GQ6717@tamriel.snowman.net> <54EB4E56.7050102@pgmasters.net> <54ECA551.8060306@pgmasters.net> <20150323053146.GA1919@toroid.org> In-Reply-To: <20150323053146.GA1919@toroid.org> OpenPGP: id=2624538721DAF9D5FDF4952A9FCDF424A2739CF3 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="3pCSnoopXtSbx5dtH8iHf5TPc92ikjpcV" X-Pg-Spam-Score: -1.9 (-) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-hackers Precedence: bulk Sender: pgsql-hackers-owner@postgresql.org This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --3pCSnoopXtSbx5dtH8iHf5TPc92ikjpcV Content-Type: multipart/mixed; boundary="------------070701020002040400050607" This is a multi-part message in MIME format. --------------070701020002040400050607 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Thanks for the review, Abhijit. On 3/23/15 1:31 AM, Abhijit Menon-Sen wrote: > At 2015-02-24 11:22:41 -0500, david@pgmasters.net wrote: >> >> Patch v3 is attached. >> + >> + /* Function execution */ >> + LOG_MISC =3D (1 << 5), >=20 > The comment above LOG_MISC should be changed. Fixed. > More fundamentally, this classification makes it easy to reuse LOGSTMT_= * > (and a nice job you've done of that, with just a few additional special= > cases), I don't think this level is quite enough for our needs. I think= > it should at least be possible to specifically log commands that affect= > privileges and roles. I agree, but this turns out to be easier said than done. In the prior code for instance, CREATE ROLE was classified as USER, while ALTER ROLE =2E. RENAME was classified as DDL. This is because any rename gets the command tag T_RenameStmt. CreateCommandTag does return "ALTER ROLE", but now we're in the realm of string-matching again which is not my favorite thing. Let me see if there is a clean way to get this accomplished. I've also felt this is the one thing I'd like to see broken out. > I'm fond of finer categorisation for DDL as well, but I could live with= > all DDL being lumped together. >=20 > I'm experimenting with a few approaches to do this without reintroducin= g > switch statements to test every command. That will require core changes= , > but I think we can find an acceptable arrangement. I'll post a proof of= > concept in a few days. I also think finer-grained categorization would be best accomplished with some core changes. It seemed too late to get those in for 9.5 so I decided to proceed with what I knew could be done reliably with the idea to improve it with core changes going forward. I look forward to your proof-of-concept. >> + * Takes an AuditEvent and, if it log_check(), writes it to the audit= >> log. >=20 > I don't think log_check is the most useful name, because this sentence > doesn't tell me what the function may do. Similarly, I would prefer to > have log_acl_check be renamed acl_grants_audit or similar. (These are > all static functions anyway, I don't think a log_ prefix is needed.) log_check() has become somewhat vestigial at this point since it is only called from one place - I've been considering removing it and merging into log_audit_event(). For the moment I've improved the comments. I like acl_grants_audit() and agree that it's a clearer name. I'll incorporate that into the next version and apply the same scheme to the other ACL functionsas well as do a general review of naming. >> + /* Free the column set */ >> + bms_free(tmpSet); >=20 > (An aside, really: there are lots of comments like this, which I don't > think add anything to understanding the code, and should be removed.) I generally feel like you can't have too many comments. I think even the less interesting/helpful comments help break the code into functional sections for readability. >> + /* >> + * We don't have access to the parsetree here, so we have to genera= te >> + * the node type, object type, and command tag by decoding >> + * rte->requiredPerms and rte->relkind. >> + */ >> + auditEvent.logStmtLevel =3D LOGSTMT_MOD; >=20 > (I am also trying to find a way to avoid having to do this.) That would be excellent. >> + /* Set object type based on relkind */ >> + switch (class->relkind) >> + { >> + case RELKIND_RELATION: >> + utilityAuditEvent.objectType =3D OBJECT_TYPE_TABLE; >> + break; >=20 > This occurs elsewhere too. But I suppose new relkinds are added less > frequently than new commands. Well, that's the hope at least. I should mention that ALL statements will be logged no matter what additional classification happens. The amount of information returned may not be ideal, but nothing is ever excluded from logging (depending on the classes selected, of course). > Again on a larger level, I'm not sure how I feel about _avoiding_ the > use of event triggers for audit logging. Regardless of whether we use > the deparse code (which I personally think is a good idea; =C3=81lvaro = has > been working on it, and it looks very nice) to log extra information, > using the object access hook inevitably means we have to reimplement > the identification/classification code here. >=20 > In "old" pgaudit, I think that extra effort is justified by the need to= > be backwards compatible with pre-event trigger releases. In a 9.5-only > version, I am not at all convinced that this makes sense. >=20 > Thoughts? I was nervous about basing pg_audit on code that I wasn't sure would be committed (at the time). Since pg_event_trigger_get_creation_commands() is tied up with deparse, I honestly didn't feel like the triggers were bringing much to the table. That being said, I agree that the deparse code is very useful and now looks certain to be committed for 9.5. I have prepared a patch that brings event triggers and deparse back to pg_audit based on the Alvaro's dev/deparse branch at git://git.postgresql.org/git/2ndquadrant_bdr.git (commit 0447fc5). I've updated the unit tests accordingly. I left in the OAT code for now. It does add detail to one event that the event triggers do not handle (creating PK indexes) and I feel that it lends an element of safety in case something happens to the event triggers. OAT is also required for function calls so the code path cannot be eliminated entirely. I'm not committed to keeping the redundant OAT code, but I'd rather not remove it until deparse is committed to master. I've been hesitant to post this patch as it will not work in master (though it will compile), but I don't want to hold on to it any longer since the end of the CF is nominally just weeks away. If you want to run the patch in master, you'll need to disable the pg_audit_ddl_command_end trigger. I've also addressed Fujii's concerns about logging parameters - this is now an option. The event stack has been formalized and MemoryContextRegisterResetCallback() is used to cleanup the stack on erro= rs. Let me know what you think. --=20 - David Steele david@pgmasters.net --------------070701020002040400050607 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="pg_audit-v4.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pg_audit-v4.patch" ZGlmZiAtLWdpdCBhL2NvbnRyaWIvTWFrZWZpbGUgYi9jb250cmliL01ha2VmaWxlCmluZGV4 IDE5NWQ0NDcuLmQ4ZTc1ZjQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvTWFrZWZpbGUKKysrIGIv Y29udHJpYi9NYWtlZmlsZQpAQCAtMjksNiArMjksNyBAQCBTVUJESVJTID0gXAogCQlwYWdl aW5zcGVjdAlcCiAJCXBhc3N3b3JkY2hlY2sJXAogCQlwZ19hcmNoaXZlY2xlYW51cCBcCisJ CXBnX2F1ZGl0CVwKIAkJcGdfYnVmZmVyY2FjaGUJXAogCQlwZ19mcmVlc3BhY2VtYXAgXAog CQlwZ19wcmV3YXJtCVwKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfYXVkaXQvTWFrZWZpbGUg Yi9jb250cmliL3BnX2F1ZGl0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAuLjMyYmM2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3BnX2F1ZGl0 L01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKKyMgcGdfYXVkaXQvTWFrZWZpbGUKKworTU9E VUxFID0gcGdfYXVkaXQKK01PRFVMRV9iaWcgPSBwZ19hdWRpdAorT0JKUyA9IHBnX2F1ZGl0 Lm8KKworRVhURU5TSU9OID0gcGdfYXVkaXQKKworREFUQSA9IHBnX2F1ZGl0LS0xLjAuMC5z cWwKKworaWZkZWYgVVNFX1BHWFMKK1BHX0NPTkZJRyA9IHBnX2NvbmZpZworUEdYUyA6PSAk KHNoZWxsICQoUEdfQ09ORklHKSAtLXBneHMpCitpbmNsdWRlICQoUEdYUykKK2Vsc2UKK3N1 YmRpciA9IGNvbnRyaWIvcGdfYXVkaXQKK3RvcF9idWlsZGRpciA9IC4uLy4uCitpbmNsdWRl ICQodG9wX2J1aWxkZGlyKS9zcmMvTWFrZWZpbGUuZ2xvYmFsCitpbmNsdWRlICQodG9wX3Ny Y2RpcikvY29udHJpYi9jb250cmliLWdsb2JhbC5taworZW5kaWYKZGlmZiAtLWdpdCBhL2Nv bnRyaWIvcGdfYXVkaXQvcGdfYXVkaXQtLTEuMC4wLnNxbCBiL2NvbnRyaWIvcGdfYXVkaXQv cGdfYXVkaXQtLTEuMC4wLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li45ZDllZTgzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wZ19hdWRpdC9wZ19hdWRp dC0tMS4wLjAuc3FsCkBAIC0wLDAgKzEsMjIgQEAKKy8qIHBnX2F1ZGl0L3BnX2F1ZGl0LS0x LjAuMC5zcWwgKi8KKworLS0gY29tcGxhaW4gaWYgc2NyaXB0IGlzIHNvdXJjZWQgaW4gcHNx bCwgcmF0aGVyIHRoYW4gdmlhIENSRUFURSBFWFRFTlNJT04KK1xlY2hvIFVzZSAiQ1JFQVRF IEVYVEVOU0lPTiBwZ19hdWRpdCIgdG8gbG9hZCB0aGlzIGZpbGUuXHF1aXQKKworQ1JFQVRF IEZVTkNUSU9OIHBnX2F1ZGl0X2RkbF9jb21tYW5kX2VuZCgpCisJUkVUVVJOUyBldmVudF90 cmlnZ2VyCisJTEFOR1VBR0UgQworCUFTICdNT0RVTEVfUEFUSE5BTUUnLCAncGdfYXVkaXRf ZGRsX2NvbW1hbmRfZW5kJzsKKworQ1JFQVRFIEVWRU5UIFRSSUdHRVIgcGdfYXVkaXRfZGRs X2NvbW1hbmRfZW5kCisJT04gZGRsX2NvbW1hbmRfZW5kCisJRVhFQ1VURSBQUk9DRURVUkUg cGdfYXVkaXRfZGRsX2NvbW1hbmRfZW5kKCk7CisKK0NSRUFURSBGVU5DVElPTiBwZ19hdWRp dF9zcWxfZHJvcCgpCisJUkVUVVJOUyBldmVudF90cmlnZ2VyCisJTEFOR1VBR0UgQworCUFT ICdNT0RVTEVfUEFUSE5BTUUnLCAncGdfYXVkaXRfc3FsX2Ryb3AnOworCitDUkVBVEUgRVZF TlQgVFJJR0dFUiBwZ19hdWRpdF9zcWxfZHJvcAorCU9OIHNxbF9kcm9wCisJRVhFQ1VURSBQ Uk9DRURVUkUgcGdfYXVkaXRfc3FsX2Ryb3AoKTsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdf YXVkaXQvcGdfYXVkaXQuYyBiL2NvbnRyaWIvcGdfYXVkaXQvcGdfYXVkaXQuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzI0NjUwCi0tLSAvZGV2L251bGwKKysr IGIvY29udHJpYi9wZ19hdWRpdC9wZ19hdWRpdC5jCkBAIC0wLDAgKzEsMTcxNiBAQAorLyot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHBnX2F1ZGl0LmMKKyAqCisgKiBBbiBhdWRp dGluZyBleHRlbnNpb24gZm9yIFBvc3RncmVTUUwuIEltcHJvdmVzIG9uIHN0YW5kYXJkIHN0 YXRlbWVudCBsb2dnaW5nCisgKiBieSBhZGRpbmcgbW9yZSBsb2dnaW5nIGNsYXNzZXMsIG9i amVjdCBsZXZlbCBsb2dnaW5nLCBhbmQgcHJvdmlkaW5nCisgKiBmdWxseS1xdWFsaWZpZWQg b2JqZWN0IG5hbWVzIGZvciBhbGwgRE1MIGFuZCBtYW55IERETCBzdGF0ZW1lbnRzIChTZWUK KyAqIHBnX2F1ZGl0LnNnbWwgZm9yIGRldGFpbHMpLgorICoKKyAqIENvcHlyaWdodCAoYykg MjAxNC0yMDE1LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICoKKyAq IElERU5USUZJQ0FUSU9OCisgKgkJICBjb250cmliL3BnX2F1ZGl0L3BnX2F1ZGl0LmMKKyAq LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgor CisjaW5jbHVkZSAiYWNjZXNzL2h0dXBfZGV0YWlscy5oIgorI2luY2x1ZGUgImFjY2Vzcy9z eXNhdHRyLmgiCisjaW5jbHVkZSAiYWNjZXNzL3hhY3QuaCIKKyNpbmNsdWRlICJjYXRhbG9n L2NhdGFsb2cuaCIKKyNpbmNsdWRlICJjYXRhbG9nL29iamVjdGFjY2Vzcy5oIgorI2luY2x1 ZGUgImNhdGFsb2cvcGdfY2xhc3MuaCIKKyNpbmNsdWRlICJjYXRhbG9nL25hbWVzcGFjZS5o IgorI2luY2x1ZGUgImNvbW1hbmRzL2RiY29tbWFuZHMuaCIKKyNpbmNsdWRlICJjYXRhbG9n L3BnX3Byb2MuaCIKKyNpbmNsdWRlICJjb21tYW5kcy9ldmVudF90cmlnZ2VyLmgiCisjaW5j bHVkZSAiZXhlY3V0b3IvZXhlY3V0b3IuaCIKKyNpbmNsdWRlICJleGVjdXRvci9zcGkuaCIK KyNpbmNsdWRlICJtaXNjYWRtaW4uaCIKKyNpbmNsdWRlICJsaWJwcS9hdXRoLmgiCisjaW5j bHVkZSAibm9kZXMvbm9kZXMuaCIKKyNpbmNsdWRlICJ0Y29wL3V0aWxpdHkuaCIKKyNpbmNs dWRlICJ1dGlscy9hY2wuaCIKKyNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1 ZGUgInV0aWxzL2d1Yy5oIgorI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgorI2luY2x1 ZGUgInV0aWxzL21lbXV0aWxzLmgiCisjaW5jbHVkZSAidXRpbHMvcmVsLmgiCisjaW5jbHVk ZSAidXRpbHMvc3lzY2FjaGUuaCIKKyNpbmNsdWRlICJ1dGlscy90aW1lc3RhbXAuaCIKKwor UEdfTU9EVUxFX01BR0lDOworCit2b2lkIF9QR19pbml0KHZvaWQpOworCisvKgorICogRXZl bnQgdHJpZ2dlciBwcm90b3R5cGVzCisgKi8KK0RhdHVtIHBnX2F1ZGl0X2RkbF9jb21tYW5k X2VuZChQR19GVU5DVElPTl9BUkdTKTsKK0RhdHVtIHBnX2F1ZGl0X3NxbF9kcm9wKFBHX0ZV TkNUSU9OX0FSR1MpOworCitQR19GVU5DVElPTl9JTkZPX1YxKHBnX2F1ZGl0X2RkbF9jb21t YW5kX2VuZCk7CitQR19GVU5DVElPTl9JTkZPX1YxKHBnX2F1ZGl0X3NxbF9kcm9wKTsKKwor LyoKKyAqIGF1ZGl0Um9sZSBpcyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBwZ2F1ZGl0LnJv bGUgR1VDLCB3aGljaCBjb250YWlucyB0aGUKKyAqIHJvbGUgZm9yIGdyYW50LWJhc2VkIGF1 ZGl0aW5nLgorICovCitjaGFyICphdWRpdFJvbGUgPSBOVUxMOworCisvKgorICogYXVkaXRM b2cgaXMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgcGdhdWRpdC5sb2cgR1VDLCBlLmcuICJy ZWFkLCB3cml0ZSwgZGRsIgorICogKGl0J3Mgbm90IHVzZWQgYnkgdGhlIG1vZHVsZSBidXQg aXMgcmVxdWlyZWQgYnkgRGVmaW5lQ3VzdG9tU3RyaW5nVmFyaWFibGUpLgorICogRWFjaCB0 b2tlbiBjb3JyZXNwb25kcyB0byBhIGZsYWcgaW4gZW51bSBMb2dDbGFzcyBiZWxvdy4gV2Ug Y29udmVydCB0aGUgbGlzdAorICogb2YgdG9rZW5zIGludG8gYSBiaXRtYXAgaW4gYXVkaXRM b2dCaXRtYXAgZm9yIGludGVybmFsIHVzZS4KKyAqLworY2hhciAqYXVkaXRMb2cgPSBOVUxM Oworc3RhdGljIHVpbnQ2NCBhdWRpdExvZ0JpdG1hcCA9IDA7CisKKy8qCisgKiBTdHJpbmcg Y29uc3RhbnRzIGZvciBhdWRpdCB0eXBlcyAtIHVzZWQgd2hlbiBsb2dnaW5nIHRvIGRpc3Rp bmd1aXNoIHNlc3Npb24KKyAqIHZzLiBvYmplY3QgYXVkaXRpbmcuCisgKi8KKyNkZWZpbmUg QVVESVRfVFlQRV9PQkpFQ1QJIk9CSkVDVCIKKyNkZWZpbmUgQVVESVRfVFlQRV9TRVNTSU9O CSJTRVNTSU9OIgorCisvKgorICogU3RyaW5nIGNvbnN0YW50cyBmb3IgbG9nIGNsYXNzZXMg LSB1c2VkIHdoZW4gcHJvY2Vzc2luZyB0b2tlbnMgaW4gdGhlCisgKiBwZ2F1ZGl0LmxvZyBH VUMuCisgKi8KKyNkZWZpbmUgQ0xBU1NfRERMCQkJIkRETCIKKyNkZWZpbmUgQ0xBU1NfRlVO Q1RJT04JCSJGVU5DVElPTiIKKyNkZWZpbmUgQ0xBU1NfTUlTQwkJCSJNSVNDIgorI2RlZmlu ZSBDTEFTU19QQVJBTUVURVIJCSJQQVJBTUVURVIiCisjZGVmaW5lIENMQVNTX1JFQUQJCQki UkVBRCIKKyNkZWZpbmUgQ0xBU1NfV1JJVEUJCQkiV1JJVEUiCisKKyNkZWZpbmUgQ0xBU1Nf QUxMCQkJIkFMTCIKKyNkZWZpbmUgQ0xBU1NfTk9ORQkJCSJOT05FIgorCisvKiBMb2cgY2xh c3MgZW51bSB1c2VkIHRvIHJlcHJlc2VudCBiaXRzIGluIGF1ZGl0TG9nQml0bWFwICovCitl bnVtIExvZ0NsYXNzCit7CisJTE9HX05PTkUgPSAwLAorCisJLyogRERMOiBDUkVBVEUvRFJP UC9BTFRFUiAqLworCUxPR19EREwgPSAoMSA8PCAxKSwKKworCS8qIEZ1bmN0aW9uIGV4ZWN1 dGlvbiAqLworCUxPR19GVU5DVElPTiA9ICgxIDw8IDIpLAorCisJLyogU3RhdGVtZW50cyBu b3QgY292ZXJlZCBieSBhbm90aGVyIGNsYXNzICovCisJTE9HX01JU0MgPSAoMSA8PCAzKSwK KworCS8qIEZ1bmN0aW9uIGV4ZWN1dGlvbiAqLworCUxPR19QQVJBTUVURVIgPSAoMSA8PCA0 KSwKKworCS8qIFNFTEVDVCAqLworCUxPR19SRUFEID0gKDEgPDwgNSksCisKKwkvKiBJTlNF UlQsIFVQREFURSwgREVMRVRFLCBUUlVOQ0FURSAqLworCUxPR19XUklURSA9ICgxIDw8IDYp LAorCisJLyogQWJzb2x1dGVseSBldmVyeXRoaW5nICovCisJTE9HX0FMTCA9IH4odWludDY0 KTAKK307CisKKy8qIFN0cmluZyBjb25zdGFudHMgZm9yIGxvZ2dpbmcgY29tbWFuZHMgKi8K KyNkZWZpbmUgQ09NTUFORF9ERUxFVEUJCSJERUxFVEUiCisjZGVmaW5lIENPTU1BTkRfRVhF Q1VURQkJIkVYRUNVVEUiCisjZGVmaW5lIENPTU1BTkRfSU5TRVJUCQkiSU5TRVJUIgorI2Rl ZmluZSBDT01NQU5EX1VQREFURQkJIlVQREFURSIKKyNkZWZpbmUgQ09NTUFORF9TRUxFQ1QJ CSJTRUxFQ1QiCisKKyNkZWZpbmUgQ09NTUFORF9VTktOT1dOCQkiVU5LTk9XTiIKKworLyog U3RyaW5nIGNvbnN0YW50cyBmb3IgbG9nZ2luZyBvYmplY3QgdHlwZXMgKi8KKyNkZWZpbmUg T0JKRUNUX1RZUEVfQ09NUE9TSVRFX1RZUEUJIkNPTVBPU0lURSBUWVBFIgorI2RlZmluZSBP QkpFQ1RfVFlQRV9GT1JFSUdOX1RBQkxFCSJGT1JFSUdOIFRBQkxFIgorI2RlZmluZSBPQkpF Q1RfVFlQRV9GVU5DVElPTgkJIkZVTkNUSU9OIgorI2RlZmluZSBPQkpFQ1RfVFlQRV9JTkRF WAkJCSJJTkRFWCIKKyNkZWZpbmUgT0JKRUNUX1RZUEVfVEFCTEUJCQkiVEFCTEUiCisjZGVm aW5lIE9CSkVDVF9UWVBFX1RPQVNUVkFMVUUJCSJUT0FTVFZBTFVFIgorI2RlZmluZSBPQkpF Q1RfVFlQRV9NQVRWSUVXCQkJIk1BVEVSSUFMSVpFRCBWSUVXIgorI2RlZmluZSBPQkpFQ1Rf VFlQRV9TRVFVRU5DRQkJIlNFUVVFTkNFIgorI2RlZmluZSBPQkpFQ1RfVFlQRV9WSUVXCQkJ IlZJRVciCisKKyNkZWZpbmUgT0JKRUNUX1RZUEVfVU5LTk9XTgkJCSJVTktOT1dOIgorCisv KgorICogQW4gQXVkaXRFdmVudCByZXByZXNlbnRzIGFuIG9wZXJhdGlvbiB0aGF0IHBvdGVu dGlhbGx5IGFmZmVjdHMgYSBzaW5nbGUKKyAqIG9iamVjdC4gSWYgYSBzdGF0ZW1lbnQgYWZm ZWN0cyBtdWx0aXBsZSBvYmplY3RzIG11bHRpcGxlIEF1ZGl0RXZlbnRzIG11c3QgYmUKKyAq IGNyZWF0ZWQgdG8gcmVwcmVzZW50IGl0LgorICovCit0eXBlZGVmIHN0cnVjdAoreworCWlu dDY0IHN0YXRlbWVudElkOworCWludDY0IHN1YnN0YXRlbWVudElkOworCisJTG9nU3RtdExl dmVsIGxvZ1N0bXRMZXZlbDsKKwlOb2RlVGFnIGNvbW1hbmRUYWc7CisJY29uc3QgY2hhciAq Y29tbWFuZDsKKwljb25zdCBjaGFyICpvYmplY3RUeXBlOworCWNoYXIgKm9iamVjdE5hbWU7 CisJY29uc3QgY2hhciAqY29tbWFuZFRleHQ7CisJUGFyYW1MaXN0SW5mbyBwYXJhbUxpc3Q7 CisKKwlib29sIGdyYW50ZWQ7CisJYm9vbCBsb2dnZWQ7Cit9IEF1ZGl0RXZlbnQ7CisKKy8q CisgKiBBIHNpbXBsZSBGSUZPIHF1ZXVlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQg c3RhY2sgb2YgYXVkaXQgZXZlbnRzLgorICovCit0eXBlZGVmIHN0cnVjdCBBdWRpdEV2ZW50 U3RhY2tJdGVtCit7CisJc3RydWN0IEF1ZGl0RXZlbnRTdGFja0l0ZW0gKm5leHQ7CisKKwlB dWRpdEV2ZW50IGF1ZGl0RXZlbnQ7CisKKwlNZW1vcnlDb250ZXh0IGNvbnRleHRBdWRpdDsK KwlNZW1vcnlDb250ZXh0Q2FsbGJhY2sgY29udGV4dENhbGxiYWNrOworfSBBdWRpdEV2ZW50 U3RhY2tJdGVtOworCitBdWRpdEV2ZW50U3RhY2tJdGVtICphdWRpdEV2ZW50U3RhY2sgPSBO VUxMOworCisvKgorICogVHJhY2sgd2hlbiBhbiBpbnRlcm5hbCBzdGF0ZW1lbnQgaXMgcnVu bmluZyBzbyBpdCBpcyBub3QgbG9nZ2VkCisgKi8KK3N0YXRpYyBib29sIGludGVybmFsU3Rh dGVtZW50ID0gZmFsc2U7CisKKy8qCisgKiBUcmFjayBydW5uaW5nIHRvdGFsIGZvciBzdGF0 ZW1lbnRzIGFuZCBzdWJzdGF0ZW1lbnRzIGFuZCB3aGV0aGVyIG9yIG5vdAorICogYW55dGhp bmcgaGFzIGJlZW4gbG9nZ2VkIHNpbmNlIHRoaXMgc3RhdGVtZW50IGJlZ2FuLgorICovCitz dGF0aWMgdWludDY0IHN0YXRlbWVudFRvdGFsID0gMDsKK3N0YXRpYyB1aW50NjQgc3Vic3Rh dGVtZW50VG90YWwgPSAwOworCitzdGF0aWMgYm9vbCBzdGF0ZW1lbnRMb2dnZWQgPSBmYWxz ZTsKKworLyoKKyAqIFN0YWNrIGZ1bmN0aW9ucworICoKKyAqIEF1ZGl0IGV2ZW50cyBjYW4g Z28gZG93biB0byBtdWx0aXBsZSBsZXZlbHMgc28gYSBzdGFjayBpcyBtYWludGFpbmVkIHRv IGtlZXAKKyAqIHRyYWNrIG9mIHRoZW0uCisgKi8KKworLyoKKyAqIFJlc3BvbmQgdG8gY2Fs bGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCBNZW1vcnlDb250ZXh0UmVnaXN0ZXJSZXNldENhbGxi YWNrKCkuCisgKiBSZW1vdmVzIHRoZSBldmVudChzKSBvZmYgdGhlIHN0YWNrIHRoYXQgaGF2 ZSBiZWNvbWUgb2Jzb2xldGUgb25jZSB0aGUKKyAqIE1lbW9yeUNvbnRleHQgaGFzIGJlZW4g ZnJlZWQuICBUaGUgY2FsbGJhY2sgc2hvdWxkIGFsd2F5cyBiZSBmcmVlaW5nIHRoZSB0b3AK KyAqIG9mIHRoZSBzdGFjaywgYnV0IHRoZSBjb2RlIGlzIHRvbGVyYW50IG9mIG91dC1vZi1v cmRlciBjYWxsYmFja3MuCisgKi8KK3N0YXRpYyB2b2lkCitzdGFja19mcmVlKHZvaWQgKnN0 YWNrRnJlZSkKK3sKKwlBdWRpdEV2ZW50U3RhY2tJdGVtICpuZXh0SXRlbSA9IGF1ZGl0RXZl bnRTdGFjazsKKworCS8qIE9ubHkgcHJvY2VzcyBpZiB0aGUgc3RhY2sgY29udGFpbnMgaXRl bXMgKi8KKwl3aGlsZSAobmV4dEl0ZW0gIT0gTlVMTCkKKwl7CisJCS8qIENoZWNrIGlmIHRo aXMgaXRlbSBtYXRjaGVzIHRoZSBpdGVtIHRvIGJlIGZyZWVkICovCisJCWlmIChuZXh0SXRl bSA9PSAoQXVkaXRFdmVudFN0YWNrSXRlbSAqKXN0YWNrRnJlZSkKKwkJeworCQkJLyogTW92 ZSB0b3Agb2Ygc3RhY2sgdGhlIHRoZSBpdGVtIGFmdGVyIHRoZSBmcmVlZCBpdGVtICovCisJ CQlhdWRpdEV2ZW50U3RhY2sgPSBuZXh0SXRlbS0+bmV4dDsKKworCQkJLyogSWYgdGhlIHN0 YWNrIGlzIG5vdCBlbXB0eSAqLworCQkJaWYgKGF1ZGl0RXZlbnRTdGFjayA9PSBOVUxMKQor CQkJeworCQkJCS8qIFJlc2V0IGludGVybmFsIHN0YXRlbWVudCBpbiBjYXNlIG9mIGVycm9y ICovCisJCQkJaW50ZXJuYWxTdGF0ZW1lbnQgPSBmYWxzZTsKKworCQkJCS8qIFJlc2V0IHN1 YiBzdGF0ZW1lbnQgdG90YWwgKi8KKwkJCQlzdWJzdGF0ZW1lbnRUb3RhbCA9IDA7CisKKwkJ CQkvKiBSZXNldCBzdGF0ZW1lbnQgbG9nZ2VkIGZsYWcgdG90YWwgKi8KKwkJCQlzdGF0ZW1l bnRMb2dnZWQgPSBmYWxzZTsKKwkJCX0KKworCQkJcmV0dXJuOworCQl9CisKKwkJLyogU3Rp bGwgbG9va2luZywgdGVzdCB0aGUgbmV4dCBpdGVtICovCisJCW5leHRJdGVtID0gbmV4dEl0 ZW0tPm5leHQ7CisJfQorfQorCisvKgorICogUHVzaCBhIG5ldyBhdWRpdCBldmVudCBvbnRv IHRoZSBzdGFjayBhbmQgY3JlYXRlIGEgbmV3IG1lbW9yeSBjb250ZXh0IHRvCisgKiBzdG9y ZSBpdC4KKyAqLworc3RhdGljIEF1ZGl0RXZlbnRTdGFja0l0ZW0gKgorc3RhY2tfcHVzaCgp Cit7CisJTWVtb3J5Q29udGV4dCBjb250ZXh0QXVkaXQ7CisJTWVtb3J5Q29udGV4dCBjb250 ZXh0T2xkOworCUF1ZGl0RXZlbnRTdGFja0l0ZW0gKnN0YWNrSXRlbTsKKworCS8qIENyZWF0 ZSBhIG5ldyBtZW1vcnkgY29udGV4dCAqLworCWNvbnRleHRBdWRpdCA9IEFsbG9jU2V0Q29u dGV4dENyZWF0ZShDdXJyZW50TWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCQkgInBnX2F1ZGl0 IHN0YWNrIGNvbnRleHQiLAorCQkJCQkJCQkJCSBBTExPQ1NFVF9ERUZBVUxUX01JTlNJWkUs CisJCQkJCQkJCQkJIEFMTE9DU0VUX0RFRkFVTFRfSU5JVFNJWkUsCisJCQkJCQkJCQkJIEFM TE9DU0VUX0RFRkFVTFRfTUFYU0laRSk7CisJY29udGV4dE9sZCA9IE1lbW9yeUNvbnRleHRT d2l0Y2hUbyhjb250ZXh0QXVkaXQpOworCisJLyogQWxsb2NhdGUgdGhlIHN0YWNrIGl0ZW0g Ki8KKwlzdGFja0l0ZW0gPSBwYWxsb2MwKHNpemVvZihBdWRpdEV2ZW50U3RhY2tJdGVtKSk7 CisKKwkvKiBTdG9yZSBtZW1vcnkgY29udGV4dHMgKi8KKwlzdGFja0l0ZW0tPmNvbnRleHRB dWRpdCA9IGNvbnRleHRBdWRpdDsKKworCS8qIElmIGl0ZW0gYWxyZWFkeSBvbiBzdGFjayB0 aGVuIHB1c2ggaXQgZG93biAqLworCWlmIChhdWRpdEV2ZW50U3RhY2sgIT0gTlVMTCkKKwkJ c3RhY2tJdGVtLT5uZXh0ID0gYXVkaXRFdmVudFN0YWNrOworCWVsc2UKKwkJc3RhY2tJdGVt LT5uZXh0ID0gTlVMTDsKKworCS8qCisJICogU2V0dXAgYSBjYWxsYmFjayBpbiBjYXNlIGFu IGVycm9yIGhhcHBlbnMuICBzdGFja19mcmVlKCkgd2lsbCB0cnVuY2F0ZQorCSAqIHRoZSBz dGFjayBhdCB0aGlzIGl0ZW0uCisJICovCisJc3RhY2tJdGVtLT5jb250ZXh0Q2FsbGJhY2su ZnVuYyA9IHN0YWNrX2ZyZWU7CisJc3RhY2tJdGVtLT5jb250ZXh0Q2FsbGJhY2suYXJnID0g KHZvaWQgKilzdGFja0l0ZW07CisJTWVtb3J5Q29udGV4dFJlZ2lzdGVyUmVzZXRDYWxsYmFj ayhjb250ZXh0QXVkaXQsCisJCQkJCQkJCQkgICAmc3RhY2tJdGVtLT5jb250ZXh0Q2FsbGJh Y2spOworCisJLyogUHVzaCBpdGVtIG9uIHRoZSBzdGFjayAqLworCWF1ZGl0RXZlbnRTdGFj ayA9IHN0YWNrSXRlbTsKKworCS8qIFJldHVybiB0byB0aGUgb2xkIG1lbW9yeSBjb250ZXh0 ICovCisJTWVtb3J5Q29udGV4dFN3aXRjaFRvKGNvbnRleHRPbGQpOworCisJLyogUmV0dXJu IHRoZSBzdGFjayBpdGVtICovCisJcmV0dXJuIHN0YWNrSXRlbTsKK30KKworLyoKKyAqIFBv cCBhbiBhdWRpdCBldmVudCBmcm9tIHRoZSBzdGFjayBieSBkZWxldGluZyB0aGUgbWVtb3J5 IGNvbnRleHQgdGhhdAorICogY29udGFpbnMgaXQuICBUaGUgY2FsbGJhY2sgdG8gc3RhY2tf ZnJlZSgpIGRvZXMgdGhlIGFjdHVhbCBwb3AuCisgKi8KK3N0YXRpYyB2b2lkCitzdGFja19w b3AoKQoreworCS8qIEVycm9yIGlmIHRoZSBzdGFjayBpcyBhbHJlYWR5IGVtcHR5ICovCisJ aWYgKGF1ZGl0RXZlbnRTdGFjayA9PSBOVUxMKQorCQllbG9nKEVSUk9SLCAicGdfYXVkaXQg c3RhY2sgaXMgYWxyZWFkeSBlbXB0eSIpOworCisJLyogU3dpdGNoIHRoZSBvbGQgbWVtb3J5 IGNvbnRleHQgYW5kIGRlbGV0ZSB0aGUgYXVkaXQgY29udGV4dCAqLworCU1lbW9yeUNvbnRl eHREZWxldGUoYXVkaXRFdmVudFN0YWNrLT5jb250ZXh0QXVkaXQpOworfQorCisvKgorICog VGFrZXMgYW4gQXVkaXRFdmVudCBhbmQgcmV0dXJucyB0cnVlIG9yIGZhbHNlIGRlcGVuZGlu ZyBvbiB3aGV0aGVyIHRoZSBldmVudAorICogc2hvdWxkIGJlIGxvZ2dlZCBhY2NvcmRpbmcg dG8gdGhlIHBnYXVkaXQucm9sZXMvbG9nIHNldHRpbmdzLiBJZiBpdCByZXR1cm5zCisgKiB0 cnVlLCBhbHNvIGZpbGxzIGluIHRoZSBuYW1lIG9mIHRoZSBMb2dDbGFzcyB3aGljaCBpdCBp cyBsb2dnZWQgdW5kZXIuCisgKi8KK3N0YXRpYyBib29sCitsb2dfY2hlY2soQXVkaXRFdmVu dCAqZSwgY29uc3QgY2hhciAqKmNsYXNzbmFtZSkKK3sKKwllbnVtIExvZ0NsYXNzIGNsYXNz ID0gTE9HX05PTkU7CisKKwkvKiBCeSBkZWZhdWx0IHB1dCBldmVyeXRoaW5nIGluIHRoZSBN SVNDIGNsYXNzLiAqLworCSpjbGFzc25hbWUgPSBDTEFTU19NSVNDOworCWNsYXNzID0gTE9H X01JU0M7CisKKwkvKgorCSAqIExvb2sgYXQgdGhlIHR5cGUgb2YgdGhlIGNvbW1hbmQgYW5k IGRlY2lkZSB3aGF0IExvZ0NsYXNzIG5lZWRzIHRvIGJlCisJICogZW5hYmxlZCBmb3IgdGhl IGNvbW1hbmQgdG8gYmUgbG9nZ2VkLgorCSAqLworCXN3aXRjaCAoZS0+bG9nU3RtdExldmVs KQorCXsKKwkJY2FzZSBMT0dTVE1UX01PRDoKKwkJCSpjbGFzc25hbWUgPSBDTEFTU19XUklU RTsKKwkJCWNsYXNzID0gTE9HX1dSSVRFOworCQkJYnJlYWs7CisKKwkJY2FzZSBMT0dTVE1U X0RETDoKKwkJCSpjbGFzc25hbWUgPSBDTEFTU19EREw7CisJCQljbGFzcyA9IExPR19EREw7 CisKKwkJY2FzZSBMT0dTVE1UX0FMTDoKKwkJCXN3aXRjaCAoZS0+Y29tbWFuZFRhZykKKwkJ CXsKKwkJCQljYXNlIFRfQ29weVN0bXQ6CisJCQkJY2FzZSBUX1NlbGVjdFN0bXQ6CisJCQkJ Y2FzZSBUX1ByZXBhcmVTdG10OgorCQkJCWNhc2UgVF9QbGFubmVkU3RtdDoKKwkJCQljYXNl IFRfRXhlY3V0ZVN0bXQ6CisJCQkJCSpjbGFzc25hbWUgPSBDTEFTU19SRUFEOworCQkJCQlj bGFzcyA9IExPR19SRUFEOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVF9WYWN1dW1TdG10 OgorCQkJCWNhc2UgVF9SZWluZGV4U3RtdDoKKwkJCQkJKmNsYXNzbmFtZSA9IENMQVNTX0RE TDsKKwkJCQkJY2xhc3MgPSBMT0dfRERMOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVF9E b1N0bXQ6CisJCQkJCSpjbGFzc25hbWUgPSBDTEFTU19GVU5DVElPTjsKKwkJCQkJY2xhc3Mg PSBMT0dfRlVOQ1RJT047CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJYnJl YWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIExPR1NUTVRfTk9ORToKKwkJCWJyZWFr OworCX0KKworCS8qCisJICogV2UgbG9nIGF1ZGl0IGV2ZW50cyB1bmRlciB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnM6CisJICoKKwkgKiAxLiBJZiB0aGUgYXVkaXQgcm9sZSBoYXMgYmVl biBleHBsaWNpdGx5IGdyYW50ZWQgcGVybWlzc2lvbiBmb3IKKwkgKiAgICBhbiBvcGVyYXRp b24uCisJICovCisJaWYgKGUtPmdyYW50ZWQpCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisK KwkvKiAyLiBJZiB0aGUgZXZlbnQgYmVsb25ncyB0byBhIGNsYXNzIGNvdmVyZWQgYnkgcGdh dWRpdC5sb2cuICovCisJaWYgKChhdWRpdExvZ0JpdG1hcCAmIGNsYXNzKSA9PSBjbGFzcykK Kwl7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAq IEFwcGVuZHMgYSBwcm9wZXJseSBxdW90ZWQgQ1NWIGZpZWxkIHRvIFN0cmluZ0luZm8uCisg Ki8KK3N0YXRpYyB2b2lkCithcHBlbmRfdmFsaWRfY3N2KFN0cmluZ0luZm9EYXRhICpidWZm ZXIsIGNvbnN0IGNoYXIgKmFwcGVuZFN0cikKK3sKKwljb25zdCBjaGFyICpwQ2hhcjsKKwor CS8qCisJICogSWYgdGhlIGFwcGVuZCBzdHJpbmcgaXMgbnVsbCB0aGVuIHJldHVybi4gIE5V TEwgZmllbGRzIGFyZSBub3QgcXVvdGVkCisJICogaW4gQ1NWCisJICovCisJaWYgKGFwcGVu ZFN0ciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBPbmx5IGZvcm1hdCBmb3IgQ1NWIGlm IGFwcGVuZFN0ciBjb250YWluczogIiwgY29tbWEsIFxuLCBcciAqLworCWlmIChzdHJzdHIo YXBwZW5kU3RyLCAiLCIpIHx8IHN0cnN0cihhcHBlbmRTdHIsICJcIiIpIHx8CisJCXN0cnN0 cihhcHBlbmRTdHIsICJcbiIpIHx8IHN0cnN0cihhcHBlbmRTdHIsICJcciIpKQorCXsKKwkJ YXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybyhidWZmZXIsICciJyk7CisKKwkJZm9yIChwQ2hh ciA9IGFwcGVuZFN0cjsgKnBDaGFyOyBwQ2hhcisrKQorCQl7CisJCQlpZiAoKnBDaGFyID09 ICciJykgLyogZG91YmxlIHNpbmdsZSBxdW90ZXMgKi8KKwkJCQlhcHBlbmRTdHJpbmdJbmZv Q2hhck1hY3JvKGJ1ZmZlciwgKnBDaGFyKTsKKworCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXJN YWNybyhidWZmZXIsICpwQ2hhcik7CisJCX0KKworCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1h Y3JvKGJ1ZmZlciwgJyInKTsKKwl9CisJLyogRWxzZSBqdXN0IGFwcGVuZCAqLworCWVsc2UK Kwl7CisJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmZmVyLCBhcHBlbmRTdHIpOworCX0K K30KKworLyoKKyAqIFRha2VzIGFuIEF1ZGl0RXZlbnQgYW5kLCBpZiBpdCBsb2dfY2hlY2so KSwgd3JpdGVzIGl0IHRvIHRoZSBhdWRpdCBsb2cuIFRoZQorICogQXVkaXRFdmVudCBpcyBh c3N1bWVkIHRvIGJlIGNvbXBsZXRlbHkgZmlsbGVkIGluIGJ5IHRoZSBjYWxsZXIgKHVua25v d24KKyAqIHZhbHVlcyBtdXN0IGJlIHNldCB0byAiIiBzbyB0aGF0IHRoZXkgY2FuIGJlIGxv Z2dlZCB3aXRob3V0IGVycm9yIGNoZWNraW5nKS4KKyAqLworc3RhdGljIHZvaWQKK2xvZ19h dWRpdF9ldmVudChBdWRpdEV2ZW50U3RhY2tJdGVtICpzdGFja0l0ZW0pCit7CisJY29uc3Qg Y2hhciAqY2xhc3NuYW1lOworCU1lbW9yeUNvbnRleHQgY29udGV4dE9sZDsKKworCS8qIENo ZWNrIHRoYXQgdGhpcyBldmVudCBzaG91bGQgYmUgbG9nZ2VkLiAqLworCWlmICghbG9nX2No ZWNrKCZzdGFja0l0ZW0tPmF1ZGl0RXZlbnQsICZjbGFzc25hbWUpKQorCQlyZXR1cm47CisK KwkvKiBVc2UgYXVkaXQgbWVtb3J5IGNvbnRleHQgaW4gY2FzZSBzb21ldGhpbmcgaXMgbm90 IGZyZWVkICovCisJY29udGV4dE9sZCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhzdGFja0l0 ZW0tPmNvbnRleHRBdWRpdCk7CisKKwkvKiBTZXQgc3RhdGVtZW50IGFuZCBzdWJzdGF0ZW1l bnQgSWRzICovCisJaWYgKHN0YWNrSXRlbS0+YXVkaXRFdmVudC5zdGF0ZW1lbnRJZCA9PSAw KQorCXsKKwkJLyogSWYgbm90aGluZyBoYXMgYmVlbiBsb2dnZWQgeWV0IHRoZW4gY3JlYXRl IGEgbmV3IHN0YXRlbWVudCBJZCAqLworCQlpZiAoIXN0YXRlbWVudExvZ2dlZCkKKwkJewor CQkJc3RhdGVtZW50VG90YWwrKzsKKwkJCXN0YXRlbWVudExvZ2dlZCA9IHRydWU7CisJCX0K KworCQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQuc3RhdGVtZW50SWQgPSBzdGF0ZW1lbnRUb3Rh bDsKKwkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50LnN1YnN0YXRlbWVudElkID0gKytzdWJzdGF0 ZW1lbnRUb3RhbDsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIGF1ZGl0IHN0cmluZyAqLworCVN0 cmluZ0luZm9EYXRhIGF1ZGl0U3RyOworCWluaXRTdHJpbmdJbmZvKCZhdWRpdFN0cik7CisK KwlhcHBlbmRfdmFsaWRfY3N2KCZhdWRpdFN0ciwgc3RhY2tJdGVtLT5hdWRpdEV2ZW50LmNv bW1hbmQpOworCWFwcGVuZFN0cmluZ0luZm9DaGFyTWFjcm8oJmF1ZGl0U3RyLCAnLCcpOwor CisJYXBwZW5kX3ZhbGlkX2NzdigmYXVkaXRTdHIsIHN0YWNrSXRlbS0+YXVkaXRFdmVudC5v YmplY3RUeXBlKTsKKwlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3JvKCZhdWRpdFN0ciwgJywn KTsKKworCWFwcGVuZF92YWxpZF9jc3YoJmF1ZGl0U3RyLCBzdGFja0l0ZW0tPmF1ZGl0RXZl bnQub2JqZWN0TmFtZSk7CisJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybygmYXVkaXRTdHIs ICcsJyk7CisKKwlhcHBlbmRfdmFsaWRfY3N2KCZhdWRpdFN0ciwgc3RhY2tJdGVtLT5hdWRp dEV2ZW50LmNvbW1hbmRUZXh0KTsKKworCS8qIElmIHBhcmFtZXRlciBsb2dnaW5nIGlzIHR1 cm5lZCBvbiBhbmQgdGhlcmUgYXJlIHBhcmFtZXRlcnMgdG8gbG9nICovCisJaWYgKGF1ZGl0 TG9nQml0bWFwICYgTE9HX1BBUkFNRVRFUiAmJgorCQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQu cGFyYW1MaXN0ICE9IE5VTEwgJiYKKwkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50LnBhcmFtTGlz dC0+bnVtUGFyYW1zID4gMCAmJgorCQkhSXNBYm9ydGVkVHJhbnNhY3Rpb25CbG9ja1N0YXRl KCkpCisJeworCQlQYXJhbUxpc3RJbmZvIHBhcmFtTGlzdCA9IHN0YWNrSXRlbS0+YXVkaXRF dmVudC5wYXJhbUxpc3Q7CisJCWludCBwYXJhbUlkeDsKKworCQkvKiBJdGVyYXRlIHRocm91 Z2ggYWxsIHBhcmFtcyAqLworCQlmb3IgKHBhcmFtSWR4ID0gMDsgcGFyYW1JZHggPCBwYXJh bUxpc3QtPm51bVBhcmFtczsgcGFyYW1JZHgrKykKKwkJeworCQkJUGFyYW1FeHRlcm5EYXRh ICpwcm0gPSAmcGFyYW1MaXN0LT5wYXJhbXNbcGFyYW1JZHhdOworCQkJT2lkIAkJCSB0eXBl T3V0cHV0OworCQkJYm9vbCAJCQkgdHlwZUlzVmFyTGVuYTsKKwkJCWNoYXIgCQkJKnBhcmFt U3RyOworCisJCQkvKiBBZGQgYSBjb21tYSBmb3IgZWFjaCBwYXJhbSAqLworCQkJYXBwZW5k U3RyaW5nSW5mb0NoYXJNYWNybygmYXVkaXRTdHIsICcsJyk7CisKKwkJCS8qIFNraXAgdGhp cyBwYXJhbSBpZiBudWxsIG9yIGlmIG9pZCBpcyBpbnZhbGlkICovCisJCQlpZiAocHJtLT5p c251bGwgfHwgIU9pZElzVmFsaWQocHJtLT5wdHlwZSkpCisJCQl7CisJCQkJY29udGludWU7 CisJCQl9CisKKwkJCS8qIE91dHB1dCB0aGUgc3RyaW5nICovCisJCQlnZXRUeXBlT3V0cHV0 SW5mbyhwcm0tPnB0eXBlLCAmdHlwZU91dHB1dCwgJnR5cGVJc1ZhckxlbmEpOworCQkJcGFy YW1TdHIgPSBPaWRPdXRwdXRGdW5jdGlvbkNhbGwodHlwZU91dHB1dCwgcHJtLT52YWx1ZSk7 CisKKwkJCWFwcGVuZF92YWxpZF9jc3YoJmF1ZGl0U3RyLCBwYXJhbVN0cik7CisJCQlwZnJl ZShwYXJhbVN0cik7CisJCX0KKwl9CisKKwkvKiBMb2cgdGhlIGF1ZGl0IHN0cmluZyAqLwor CWVyZXBvcnQoTE9HLAorCQkoZXJybXNnKCJBVURJVDogJXMsJWxkLCVsZCwlcywlcyIsCisJ CQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQuZ3JhbnRlZCA/CisJCQkJQVVESVRfVFlQRV9PQkpF Q1QgOiBBVURJVF9UWVBFX1NFU1NJT04sCisJCQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQuc3Rh dGVtZW50SWQsCisJCQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQuc3Vic3RhdGVtZW50SWQsCisJ CQljbGFzc25hbWUsIGF1ZGl0U3RyLmRhdGEpLAorCQkgZXJyaGlkZXN0bXQodHJ1ZSkpKTsK KworCS8qIE1hcmsgdGhlIGF1ZGl0IGV2ZW50IGFzIGxvZ2dlZCAqLworCXN0YWNrSXRlbS0+ YXVkaXRFdmVudC5sb2dnZWQgPSB0cnVlOworCisJLyogU3dpdGNoIGJhY2sgdG8gdGhlIG9s ZCBtZW1vcnkgY29udGV4dCAqLworCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhjb250ZXh0T2xk KTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSByb2xlIG9yIGFueSBpbmhlcml0ZWQgcm9s ZSBoYXMgYW55IHBlcm1pc3Npb24gaW4gdGhlIG1hc2suICBUaGUKKyAqIHB1YmxpYyByb2xl IGlzIGV4Y2x1ZGVkIGZyb20gdGhpcyBjaGVjayBhbmQgc3VwZXJ1c2VyIHBlcm1pc3Npb25z IGFyZSBub3QKKyAqIGNvbnNpZGVyZWQuCisgKi8KK3N0YXRpYyBib29sCitsb2dfYWNsX2No ZWNrKERhdHVtIGFjbERhdHVtLCBPaWQgYXVkaXRPaWQsIEFjbE1vZGUgbWFzaykKK3sKKwli b29sCQlyZXN1bHQgPSBmYWxzZTsKKwlBY2wJCSAgICphY2w7CisJQWNsSXRlbQkgICAqYWNs SXRlbURhdGE7CisJaW50CQkJYWNsSW5kZXg7CisJaW50CQkJYWNsVG90YWw7CisKKwkvKiBE ZXRvYXN0IGNvbHVtbidzIEFDTCBpZiBuZWNlc3NhcnkgKi8KKwlhY2wgPSBEYXR1bUdldEFj bFAoYWNsRGF0dW0pOworCisJLyogR2V0IHRoZSBhY2wgbGlzdCBhbmQgdG90YWwgKi8KKwlh Y2xUb3RhbCA9IEFDTF9OVU0oYWNsKTsKKwlhY2xJdGVtRGF0YSA9IEFDTF9EQVQoYWNsKTsK KworCS8qIENoZWNrIHByaXZpbGVnZXMgZ3JhbnRlZCBkaXJlY3RseSB0byBhdWRpdE9pZCAq LworCWZvciAoYWNsSW5kZXggPSAwOyBhY2xJbmRleCA8IGFjbFRvdGFsOyBhY2xJbmRleCsr KQorCXsKKwkJQWNsSXRlbSAqYWNsSXRlbSA9ICZhY2xJdGVtRGF0YVthY2xJbmRleF07CisK KwkJaWYgKGFjbEl0ZW0tPmFpX2dyYW50ZWUgPT0gYXVkaXRPaWQgJiYKKwkJCWFjbEl0ZW0t PmFpX3ByaXZzICYgbWFzaykKKwkJeworCQkJcmVzdWx0ID0gdHJ1ZTsKKwkJCWJyZWFrOwor CQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBwcml2aWxlZ2VzIGdyYW50ZWQgaW5kaXJlY3Rs eSB2aWEgcm9sZSBtZW1iZXJzaGlwcy4gV2UgZG8gdGhpcyBpbgorCSAqIGEgc2VwYXJhdGUg cGFzcyB0byBtaW5pbWl6ZSBleHBlbnNpdmUgaW5kaXJlY3QgbWVtYmVyc2hpcCB0ZXN0cy4g IEluCisJICogcGFydGljdWxhciwgaXQncyB3b3J0aCB0ZXN0aW5nIHdoZXRoZXIgYSBnaXZl biBBQ0wgZW50cnkgZ3JhbnRzIGFueQorCSAqIHByaXZpbGVnZXMgc3RpbGwgb2YgaW50ZXJl c3QgYmVmb3JlIHdlIHBlcmZvcm0gdGhlIGhhc19wcml2c19vZl9yb2xlCisJICogdGVzdC4K KwkgKi8KKwlpZiAoIXJlc3VsdCkKKwl7CisJCWZvciAoYWNsSW5kZXggPSAwOyBhY2xJbmRl eCA8IGFjbFRvdGFsOyBhY2xJbmRleCsrKQorCQl7CisJCQlBY2xJdGVtICphY2xJdGVtID0g JmFjbEl0ZW1EYXRhW2FjbEluZGV4XTsKKworCQkJLyogRG9uJ3QgdGVzdCBwdWJsaWMgb3Ig YXVkaXRPaWQgKGl0IGhhcyBiZWVuIHRlc3RlZCBhbHJlYWR5KSAqLworCQkJaWYgKGFjbEl0 ZW0tPmFpX2dyYW50ZWUgPT0gQUNMX0lEX1BVQkxJQyB8fAorCQkJCWFjbEl0ZW0tPmFpX2dy YW50ZWUgPT0gYXVkaXRPaWQpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBDaGVj ayB0aGF0IHRoZSByb2xlIGhhcyB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlcyBhbmQgdGhhdCBp dCBpcworCQkJICogaW5oZXJpdGVkIGJ5IGF1ZGl0T2lkLgorCQkJICovCisJCQlpZiAoYWNs SXRlbS0+YWlfcHJpdnMgJiBtYXNrICYmCisJCQkJaGFzX3ByaXZzX29mX3JvbGUoYXVkaXRP aWQsIGFjbEl0ZW0tPmFpX2dyYW50ZWUpKQorCQkJeworCQkJCXJlc3VsdCA9IHRydWU7CisJ CQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBpZiB3ZSBoYXZlIGEgZGV0b2FzdGVk IGNvcHksIGZyZWUgaXQgKi8KKwlpZiAoYWNsICYmIChQb2ludGVyKSBhY2wgIT0gRGF0dW1H ZXRQb2ludGVyKGFjbERhdHVtKSkKKwkJcGZyZWUoYWNsKTsKKworCXJldHVybiByZXN1bHQ7 Cit9CisKKy8qCisgKiBDaGVjayBpZiBhIHJvbGUgaGFzIGFueSBvZiB0aGUgcGVybWlzc2lv bnMgaW4gdGhlIG1hc2sgb24gYSByZWxhdGlvbi4KKyAqLworc3RhdGljIGJvb2wKK2xvZ19y ZWxhdGlvbl9jaGVjayhPaWQgcmVsT2lkLAorCQkJCSAgIE9pZCBhdWRpdE9pZCwKKwkJCQkg ICBBY2xNb2RlIG1hc2spCit7CisJYm9vbAkJcmVzdWx0ID0gZmFsc2U7CisJSGVhcFR1cGxl CXR1cGxlOworCURhdHVtCQlhY2xEYXR1bTsKKwlib29sCQlpc051bGw7CisKKwkvKiBHZXQg cmVsYXRpb24gdHVwbGUgZnJvbSBwZ19jbGFzcyAqLworCXR1cGxlID0gU2VhcmNoU3lzQ2Fj aGUxKFJFTE9JRCwgT2JqZWN0SWRHZXREYXR1bShyZWxPaWQpKTsKKworCS8qIFJldHVybiBm YWxzZSBpZiB0dXBsZSBpcyBub3QgdmFsaWQgKi8KKwlpZiAoIUhlYXBUdXBsZUlzVmFsaWQo dHVwbGUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBHZXQgdGhlIHJlbGF0aW9uJ3MgQUNM ICovCisJYWNsRGF0dW0gPSBTeXNDYWNoZUdldEF0dHIoUkVMT0lELCB0dXBsZSwgQW51bV9w Z19jbGFzc19yZWxhY2wsCisJCQkJCQkJICAgJmlzTnVsbCk7CisKKwkvKiBJZiBub3QgbnVs bCB0aGVuIHRlc3QgKi8KKwlpZiAoIWlzTnVsbCkKKwkJcmVzdWx0ID0gbG9nX2FjbF9jaGVj ayhhY2xEYXR1bSwgYXVkaXRPaWQsIG1hc2spOworCisJLyogRnJlZSB0aGUgcmVsYXRpb24g dHVwbGUgKi8KKwlSZWxlYXNlU3lzQ2FjaGUodHVwbGUpOworCisJcmV0dXJuIHJlc3VsdDsK K30KKworLyoKKyAqIENoZWNrIGlmIGEgcm9sZSBoYXMgYW55IG9mIHRoZSBwZXJtaXNzaW9u cyBpbiB0aGUgbWFzayBvbiBhbiBhdHRyaWJ1dGUuCisgKi8KK3N0YXRpYyBib29sCitsb2df YXR0cmlidXRlX2NoZWNrKE9pZCByZWxPaWQsCisJCQkJCUF0dHJOdW1iZXIgYXR0TnVtLAor CQkJCQlPaWQgYXVkaXRPaWQsCisJCQkJCUFjbE1vZGUgbWFzaykKK3sKKwlib29sCQlyZXN1 bHQgPSBmYWxzZTsKKwlIZWFwVHVwbGUJYXR0VHVwbGU7CisJRGF0dW0JCWFjbERhdHVtOwor CWJvb2wJCWlzTnVsbDsKKworCS8qIEdldCB0aGUgYXR0cmlidXRlJ3MgQUNMICovCisJYXR0 VHVwbGUgPSBTZWFyY2hTeXNDYWNoZTIoQVRUTlVNLAorCQkJCQkJCSAgIE9iamVjdElkR2V0 RGF0dW0ocmVsT2lkKSwKKwkJCQkJCQkgICBJbnQxNkdldERhdHVtKGF0dE51bSkpOworCisJ LyogUmV0dXJuIGZhbHNlIGlmIGF0dHJpYnV0ZSBpcyBpbnZhbGlkICovCisJaWYgKCFIZWFw VHVwbGVJc1ZhbGlkKGF0dFR1cGxlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogT25seSBw cm9jZXNzIGF0dHJpYnV0ZSB0aGF0IGhhdmUgbm90IGJlZW4gZHJvcHBlZCAqLworCWlmICgh KChGb3JtX3BnX2F0dHJpYnV0ZSkgR0VUU1RSVUNUKGF0dFR1cGxlKSktPmF0dGlzZHJvcHBl ZCkKKwl7CisJCWFjbERhdHVtID0gU3lzQ2FjaGVHZXRBdHRyKEFUVE5VTSwgYXR0VHVwbGUs IEFudW1fcGdfYXR0cmlidXRlX2F0dGFjbCwKKwkJCQkJCQkJICAgJmlzTnVsbCk7CisKKwkJ aWYgKCFpc051bGwpCisJCQlyZXN1bHQgPSBsb2dfYWNsX2NoZWNrKGFjbERhdHVtLCBhdWRp dE9pZCwgbWFzayk7CisJfQorCisJLyogRnJlZSBhdHRyaWJ1dGUgKi8KKwlSZWxlYXNlU3lz Q2FjaGUoYXR0VHVwbGUpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIENoZWNr IGlmIGEgcm9sZSBoYXMgYW55IG9mIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgbWFzayBvbiBh biBhdHRyaWJ1dGUgaW4KKyAqIHRoZSBwcm92aWRlZCBzZXQuICBJZiB0aGUgc2V0IGlzIGVt cHR5LCB0aGVuIGFsbCB2YWxpZCBhdHRyaWJ1dGVzIGluIHRoZQorICogcmVsYXRpb24gd2ls bCBiZSB0ZXN0ZWQuCisgKi8KK3N0YXRpYyBib29sCitsb2dfYXR0cmlidXRlX2NoZWNrX2Fu eShPaWQgcmVsT2lkLAorCQkJCQkJT2lkIGF1ZGl0T2lkLAorCQkJCQkJQml0bWFwc2V0ICph dHRyaWJ1dGVTZXQsCisJCQkJCQlBY2xNb2RlIG1vZGUpCit7CisJYm9vbCByZXN1bHQgPSBm YWxzZTsKKwlBdHRyTnVtYmVyIGNvbDsKKwlCaXRtYXBzZXQgKnRtcFNldDsKKworCS8qIElm IGJtcyBpcyBlbXB0eSB0aGVuIGNoZWNrIGZvciBhbnkgY29sdW1uIG1hdGNoICovCisJaWYg KGJtc19pc19lbXB0eShhdHRyaWJ1dGVTZXQpKQorCXsKKwkJSGVhcFR1cGxlCWNsYXNzVHVw bGU7CisJCUF0dHJOdW1iZXIJbmF0dHJzOworCQlBdHRyTnVtYmVyCWN1cnJfYXR0OworCisJ CS8qIEdldCByZWxhdGlvbiB0byBkZXRlcm1pbmUgdG90YWwgYXR0cmlidXRlICovCisJCWNs YXNzVHVwbGUgPSBTZWFyY2hTeXNDYWNoZTEoUkVMT0lELCBPYmplY3RJZEdldERhdHVtKHJl bE9pZCkpOworCisJCWlmICghSGVhcFR1cGxlSXNWYWxpZChjbGFzc1R1cGxlKSkKKwkJCXJl dHVybiBmYWxzZTsKKworCQluYXR0cnMgPSAoKEZvcm1fcGdfY2xhc3MpIEdFVFNUUlVDVChj bGFzc1R1cGxlKSktPnJlbG5hdHRzOworCQlSZWxlYXNlU3lzQ2FjaGUoY2xhc3NUdXBsZSk7 CisKKwkJLyogQ2hlY2sgZWFjaCBjb2x1bW4gKi8KKwkJZm9yIChjdXJyX2F0dCA9IDE7IGN1 cnJfYXR0IDw9IG5hdHRyczsgY3Vycl9hdHQrKykKKwkJeworCQkJaWYgKGxvZ19hdHRyaWJ1 dGVfY2hlY2socmVsT2lkLCBjdXJyX2F0dCwgYXVkaXRPaWQsIG1vZGUpKQorCQkJCXJldHVy biB0cnVlOworCQl9CisJfQorCisJLyogYm1zX2ZpcnN0X21lbWJlciBpcyBkZXN0cnVjdGl2 ZSwgc28gbWFrZSBhIGNvcHkgYmVmb3JlIHVzaW5nIGl0LiAqLworCXRtcFNldCA9IGJtc19j b3B5KGF0dHJpYnV0ZVNldCk7CisKKwkvKiBDaGVjayBlYWNoIGNvbHVtbiAqLworCXdoaWxl ICgoY29sID0gYm1zX2ZpcnN0X21lbWJlcih0bXBTZXQpKSA+PSAwKQorCXsKKwkJY29sICs9 IEZpcnN0TG93SW52YWxpZEhlYXBBdHRyaWJ1dGVOdW1iZXI7CisKKwkJaWYgKGNvbCAhPSBJ bnZhbGlkQXR0ck51bWJlciAmJgorCQkJbG9nX2F0dHJpYnV0ZV9jaGVjayhyZWxPaWQsIGNv bCwgYXVkaXRPaWQsIG1vZGUpKQorCQl7CisJCQlyZXN1bHQgPSB0cnVlOworCQkJYnJlYWs7 CisJCX0KKwl9CisKKwkvKiBGcmVlIHRoZSBjb2x1bW4gc2V0ICovCisJYm1zX2ZyZWUodG1w U2V0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBDcmVhdGUgQXVkaXRFdmVu dHMgZm9yIFNFTEVDVC9ETUwgb3BlcmF0aW9ucyB2aWEgZXhlY3V0b3IgcGVybWlzc2lvbnMg Y2hlY2tzLgorICovCitzdGF0aWMgdm9pZAorbG9nX3NlbGVjdF9kbWwoT2lkIGF1ZGl0T2lk LCBMaXN0ICpyYW5nZVRhYmxzKQoreworCUxpc3RDZWxsICpscjsKKwlib29sIGZpcnN0ID0g dHJ1ZTsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwkvKiBEbyBub3QgbG9nIGlmIHRoaXMg aXMgYW4gaW50ZXJuYWwgc3RhdGVtZW50ICovCisJaWYgKGludGVybmFsU3RhdGVtZW50KQor CQlyZXR1cm47CisKKwlmb3JlYWNoKGxyLCByYW5nZVRhYmxzKQorCXsKKwkJT2lkIHJlbE9p ZDsKKwkJUmVsYXRpb24gcmVsOworCQlSYW5nZVRibEVudHJ5ICpydGUgPSBsZmlyc3QobHIp OworCisJCS8qIFdlIG9ubHkgY2FyZSBhYm91dCB0YWJsZXMsIGFuZCBjYW4gaWdub3JlIHN1 YnF1ZXJpZXMgZXRjLiAqLworCQlpZiAocnRlLT5ydGVraW5kICE9IFJURV9SRUxBVElPTikK KwkJCWNvbnRpbnVlOworCisJCWZvdW5kID0gdHJ1ZTsKKworCQkvKgorCQkgKiBGaWx0ZXIg b3V0IGFueSBzeXN0ZW0gcmVsYXRpb25zCisJCSAqLworCQlyZWxPaWQgPSBydGUtPnJlbGlk OworCQlyZWwgPSByZWxhdGlvbl9vcGVuKHJlbE9pZCwgTm9Mb2NrKTsKKworCQlpZiAoSXNT eXN0ZW1OYW1lc3BhY2UoUmVsYXRpb25HZXROYW1lc3BhY2UocmVsKSkpCisJCXsKKwkJCXJl bGF0aW9uX2Nsb3NlKHJlbCwgTm9Mb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoK KwkJICogV2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHBhcnNldHJlZSBoZXJlLCBzbyB3 ZSBoYXZlIHRvIGdlbmVyYXRlCisJCSAqIHRoZSBub2RlIHR5cGUsIG9iamVjdCB0eXBlLCBh bmQgY29tbWFuZCB0YWcgYnkgZGVjb2RpbmcKKwkJICogcnRlLT5yZXF1aXJlZFBlcm1zIGFu ZCBydGUtPnJlbGtpbmQuCisJCSAqLworCQlpZiAocnRlLT5yZXF1aXJlZFBlcm1zICYgQUNM X0lOU0VSVCkKKwkJeworCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50LmxvZ1N0bXRM ZXZlbCA9IExPR1NUTVRfTU9EOworCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50LmNv bW1hbmRUYWcgPSBUX0luc2VydFN0bXQ7CisJCQlhdWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZl bnQuY29tbWFuZCA9IENPTU1BTkRfSU5TRVJUOworCQl9CisJCWVsc2UgaWYgKHJ0ZS0+cmVx dWlyZWRQZXJtcyAmIEFDTF9VUERBVEUpCisJCXsKKwkJCWF1ZGl0RXZlbnRTdGFjay0+YXVk aXRFdmVudC5sb2dTdG10TGV2ZWwgPSBMT0dTVE1UX01PRDsKKwkJCWF1ZGl0RXZlbnRTdGFj ay0+YXVkaXRFdmVudC5jb21tYW5kVGFnID0gVF9VcGRhdGVTdG10OworCQkJYXVkaXRFdmVu dFN0YWNrLT5hdWRpdEV2ZW50LmNvbW1hbmQgPSBDT01NQU5EX1VQREFURTsKKwkJfQorCQll bHNlIGlmIChydGUtPnJlcXVpcmVkUGVybXMgJiBBQ0xfREVMRVRFKQorCQl7CisJCQlhdWRp dEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQubG9nU3RtdExldmVsID0gTE9HU1RNVF9NT0Q7CisJ CQlhdWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQuY29tbWFuZFRhZyA9IFRfRGVsZXRlU3Rt dDsKKwkJCWF1ZGl0RXZlbnRTdGFjay0+YXVkaXRFdmVudC5jb21tYW5kID0gQ09NTUFORF9E RUxFVEU7CisJCX0KKwkJZWxzZSBpZiAocnRlLT5yZXF1aXJlZFBlcm1zICYgQUNMX1NFTEVD VCkKKwkJeworCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50LmxvZ1N0bXRMZXZlbCA9 IExPR1NUTVRfQUxMOworCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50LmNvbW1hbmRU YWcgPSBUX1NlbGVjdFN0bXQ7CisJCQlhdWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQuY29t bWFuZCA9IENPTU1BTkRfU0VMRUNUOworCQl9CisJCWVsc2UKKwkJeworCQkJYXVkaXRFdmVu dFN0YWNrLT5hdWRpdEV2ZW50LmxvZ1N0bXRMZXZlbCA9IExPR1NUTVRfQUxMOworCQkJYXVk aXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50LmNvbW1hbmRUYWcgPSBUX0ludmFsaWQ7CisJCQlh dWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQuY29tbWFuZCA9IENPTU1BTkRfVU5LTk9XTjsK KwkJfQorCisJCS8qCisJCSAqIEZpbGwgdmFsdWVzIGluIHRoZSBldmVudCBzdHJ1Y3QgdGhh dCBhcmUgcmVxdWlyZWQgZm9yIHNlc3Npb24KKwkJICogbG9nZ2luZy4KKwkJICovCisJCWF1 ZGl0RXZlbnRTdGFjay0+YXVkaXRFdmVudC5ncmFudGVkID0gZmFsc2U7CisKKwkJLyogSWYg dGhpcyBpcyB0aGUgZmlyc3QgcnRlIHRoZW4gc2Vzc2lvbiBsb2cgKi8KKwkJaWYgKGZpcnN0 KQorCQl7CisJCQlhdWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQub2JqZWN0TmFtZSA9ICIi OworCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50Lm9iamVjdFR5cGUgPSAiIjsKKwor CQkJbG9nX2F1ZGl0X2V2ZW50KGF1ZGl0RXZlbnRTdGFjayk7CisKKwkJCWZpcnN0ID0gZmFs c2U7CisJCX0KKworCQkvKiBHZXQgdGhlIHJlbGF0aW9uIHR5cGUgKi8KKwkJc3dpdGNoIChy dGUtPnJlbGtpbmQpCisJCXsKKwkJCWNhc2UgUkVMS0lORF9SRUxBVElPTjoKKwkJCQlhdWRp dEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQub2JqZWN0VHlwZSA9CisJCQkJCU9CSkVDVF9UWVBF X1RBQkxFOworCQkJCWJyZWFrOworCisJCQljYXNlIFJFTEtJTkRfSU5ERVg6CisJCQkJYXVk aXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50Lm9iamVjdFR5cGUgPQorCQkJCQlPQkpFQ1RfVFlQ RV9JTkRFWDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSRUxLSU5EX1NFUVVFTkNFOgorCQkJ CWF1ZGl0RXZlbnRTdGFjay0+YXVkaXRFdmVudC5vYmplY3RUeXBlID0KKwkJCQkJT0JKRUNU X1RZUEVfU0VRVUVOQ0U7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVMS0lORF9UT0FTVFZB TFVFOgorCQkJCWF1ZGl0RXZlbnRTdGFjay0+YXVkaXRFdmVudC5vYmplY3RUeXBlID0KKwkJ CQkJT0JKRUNUX1RZUEVfVE9BU1RWQUxVRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSRUxL SU5EX1ZJRVc6CisJCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50Lm9iamVjdFR5cGUg PQorCQkJCQlPQkpFQ1RfVFlQRV9WSUVXOworCQkJCWJyZWFrOworCisJCQljYXNlIFJFTEtJ TkRfQ09NUE9TSVRFX1RZUEU6CisJCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50Lm9i amVjdFR5cGUgPQorCQkJCQlPQkpFQ1RfVFlQRV9DT01QT1NJVEVfVFlQRTsKKwkJCQlicmVh azsKKworCQkJY2FzZSBSRUxLSU5EX0ZPUkVJR05fVEFCTEU6CisJCQkJYXVkaXRFdmVudFN0 YWNrLT5hdWRpdEV2ZW50Lm9iamVjdFR5cGUgPQorCQkJCQlPQkpFQ1RfVFlQRV9GT1JFSUdO X1RBQkxFOworCQkJCWJyZWFrOworCisJCQljYXNlIFJFTEtJTkRfTUFUVklFVzoKKwkJCQlh dWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQub2JqZWN0VHlwZSA9CisJCQkJCU9CSkVDVF9U WVBFX01BVFZJRVc7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYXVkaXRFdmVu dFN0YWNrLT5hdWRpdEV2ZW50Lm9iamVjdFR5cGUgPQorCQkJCQlPQkpFQ1RfVFlQRV9VTktO T1dOOworCQkJCWJyZWFrOworCQl9CisKKwkJLyogR2V0IHRoZSByZWxhdGlvbiBuYW1lICov CisJCWF1ZGl0RXZlbnRTdGFjay0+YXVkaXRFdmVudC5vYmplY3ROYW1lID0KKwkJCXF1b3Rl X3F1YWxpZmllZF9pZGVudGlmaWVyKGdldF9uYW1lc3BhY2VfbmFtZSgKKwkJCQkJCQkJCSAg IFJlbGF0aW9uR2V0TmFtZXNwYWNlKHJlbCkpLAorCQkJCQkJCQkJICAgUmVsYXRpb25HZXRS ZWxhdGlvbk5hbWUocmVsKSk7CisJCXJlbGF0aW9uX2Nsb3NlKHJlbCwgTm9Mb2NrKTsKKwor CQkvKiBQZXJmb3JtIG9iamVjdCBhdWRpdGluZyBvbmx5IGlmIHRoZSBhdWRpdCByb2xlIGlz IHZhbGlkICovCisJCWlmIChhdWRpdE9pZCAhPSBJbnZhbGlkT2lkKQorCQl7CisJCQlBY2xN b2RlIGF1ZGl0UGVybXMgPSAoQUNMX1NFTEVDVCB8IEFDTF9VUERBVEUgfCBBQ0xfSU5TRVJU KSAmCisJCQkJCQkJCSBydGUtPnJlcXVpcmVkUGVybXM7CisKKwkJCS8qCisJCQkgKiBJZiBh bnkgb2YgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIGZvciB0aGUgcmVsYXRpb24gYXJlIGdy YW50ZWQKKwkJCSAqIHRvIHRoZSBhdWRpdCByb2xlIHRoZW4gYXVkaXQgdGhlIHJlbGF0aW9u CisJCQkgKi8KKwkJCWlmIChsb2dfcmVsYXRpb25fY2hlY2socmVsT2lkLCBhdWRpdE9pZCwg YXVkaXRQZXJtcykpCisJCQl7CisJCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50Lmdy YW50ZWQgPSB0cnVlOworCQkJfQorCisJCQkvKgorCQkJICogRWxzZSBjaGVjayBpZiB0aGUg YXVkaXQgcm9sZSBoYXMgY29sdW1uLWxldmVsIHBlcm1pc3Npb25zIGZvcgorCQkJICogc2Vs ZWN0LCBpbnNlcnQsIG9yIHVwZGF0ZS4KKwkJCSAqLworCQkJZWxzZSBpZiAoYXVkaXRQZXJt cyAhPSAwKQorCQkJeworCQkJCS8qCisJCQkJICogQ2hlY2sgdGhlIHNlbGVjdCBjb2x1bW5z IHRvIHNlZSBpZiB0aGUgYXVkaXQgcm9sZSBoYXMKKwkJCQkgKiBwcml2ZWxlZ2VzIG9uIGFu eSBvZiB0aGVtLgorCQkJCSAqLworCQkJCWlmIChhdWRpdFBlcm1zICYgQUNMX1NFTEVDVCkK KwkJCQl7CisJCQkJCWF1ZGl0RXZlbnRTdGFjay0+YXVkaXRFdmVudC5ncmFudGVkID0KKwkJ CQkJCWxvZ19hdHRyaWJ1dGVfY2hlY2tfYW55KHJlbE9pZCwgYXVkaXRPaWQsCisJCQkJCQkJ CQkJCQlydGUtPnNlbGVjdGVkQ29scywKKwkJCQkJCQkJCQkJCUFDTF9TRUxFQ1QpOworCQkJ CX0KKworCQkJCS8qCisJCQkJICogQ2hlY2sgdGhlIG1vZGlmaWVkIGNvbHVtbnMgdG8gc2Vl IGlmIHRoZSBhdWRpdCByb2xlIGhhcworCQkJCSAqIHByaXZpbGVnZXMgb24gYW55IG9mIHRo ZW0uCisJCQkJICovCisJCQkJaWYgKCFhdWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQuZ3Jh bnRlZCkKKwkJCQl7CisJCQkJCWF1ZGl0UGVybXMgJj0gKEFDTF9JTlNFUlQgfCBBQ0xfVVBE QVRFKTsKKworCQkJCQlpZiAoYXVkaXRQZXJtcykKKwkJCQkJeworCQkJCQkJYXVkaXRFdmVu dFN0YWNrLT5hdWRpdEV2ZW50LmdyYW50ZWQgPQorCQkJCQkJCWxvZ19hdHRyaWJ1dGVfY2hl Y2tfYW55KHJlbE9pZCwgYXVkaXRPaWQsCisJCQkJCQkJCQkJCQkJcnRlLT5tb2RpZmllZENv bHMsCisJCQkJCQkJCQkJCQkJYXVkaXRQZXJtcyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJ CX0KKworCQkvKiBPbmx5IGRvIHJlbGF0aW9uIGxldmVsIGxvZ2dpbmcgaWYgYSBncmFudCB3 YXMgZm91bmQuICovCisJCWlmIChhdWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQuZ3JhbnRl ZCkKKwkJeworCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50LmxvZ2dlZCA9IGZhbHNl OworCQkJbG9nX2F1ZGl0X2V2ZW50KGF1ZGl0RXZlbnRTdGFjayk7CisJCX0KKworCQlwZnJl ZShhdWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQub2JqZWN0TmFtZSk7CisJfQorCisJLyoK KwkgKiBJZiBubyB0YWJsZXMgd2VyZSBmb3VuZCB0aGF0IG1lYW5zIHRoYXQgUmFuZ2VUYmxz IHdhcyBlbXB0eSBvciBhbGwKKwkgKiByZWxhdGlvbnMgd2VyZSBpbiB0aGUgc3lzdGVtIHNj aGVtYS4gIEluIHRoYXQgY2FzZSBzdGlsbCBsb2cgYQorCSAqIHNlc3Npb24gcmVjb3JkLgor CSAqLworCWlmICghZm91bmQpCisJeworCQlhdWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQu Z3JhbnRlZCA9IGZhbHNlOworCQlhdWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQubG9nZ2Vk ID0gZmFsc2U7CisKKwkJbG9nX2F1ZGl0X2V2ZW50KGF1ZGl0RXZlbnRTdGFjayk7CisJfQor fQorCisvKgorICogQ3JlYXRlIEF1ZGl0RXZlbnRzIGZvciBjZXJ0YWluIGtpbmRzIG9mIENS RUFURSwgQUxURVIsIGFuZCBERUxFVEUgc3RhdGVtZW50cworICogd2hlcmUgdGhlIG9iamVj dCBjYW4gYmUgbG9nZ2VkLgorICovCitzdGF0aWMgdm9pZAorbG9nX2NyZWF0ZV9hbHRlcl9k cm9wKE9pZCBjbGFzc0lkLAorCQkJCQkgIE9pZCBvYmplY3RJZCkKK3sKKwkvKiBPbmx5IHBl cmZvcm0gd2hlbiBjbGFzcyBpcyByZWxhdGlvbiAqLworCWlmIChjbGFzc0lkID09IFJlbGF0 aW9uUmVsYXRpb25JZCkKKwl7CisJCVJlbGF0aW9uIHJlbDsKKwkJRm9ybV9wZ19jbGFzcyBj bGFzczsKKworCQkvKiBPcGVuIHRoZSByZWxhdGlvbiAqLworCQlyZWwgPSByZWxhdGlvbl9v cGVuKG9iamVjdElkLCBOb0xvY2spOworCisJCS8qIEZpbHRlciBvdXQgYW55IHN5c3RlbSBy ZWxhdGlvbnMgKi8KKwkJaWYgKElzVG9hc3ROYW1lc3BhY2UoUmVsYXRpb25HZXROYW1lc3Bh Y2UocmVsKSkpCisJCXsKKwkJCXJlbGF0aW9uX2Nsb3NlKHJlbCwgTm9Mb2NrKTsKKwkJCXJl dHVybjsKKwkJfQorCisJCS8qIEdldCByZWwgaW5mb3JtYXRpb24gYW5kIGNsb3NlIGl0ICov CisJCWNsYXNzID0gUmVsYXRpb25HZXRGb3JtKHJlbCk7CisJCWF1ZGl0RXZlbnRTdGFjay0+ YXVkaXRFdmVudC5vYmplY3ROYW1lID0KKwkJCXF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVy KGdldF9uYW1lc3BhY2VfbmFtZSgKKwkJCQkJCQkJCSAgIFJlbGF0aW9uR2V0TmFtZXNwYWNl KHJlbCkpLAorCQkJCQkJCQkJICAgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSk7CisJ CXJlbGF0aW9uX2Nsb3NlKHJlbCwgTm9Mb2NrKTsKKworCQkvKiBTZXQgb2JqZWN0IHR5cGUg YmFzZWQgb24gcmVsa2luZCAqLworCQlzd2l0Y2ggKGNsYXNzLT5yZWxraW5kKQorCQl7CisJ CQljYXNlIFJFTEtJTkRfUkVMQVRJT046CisJCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2 ZW50Lm9iamVjdFR5cGUgPQorCQkJCQlPQkpFQ1RfVFlQRV9UQUJMRTsKKwkJCQlicmVhazsK KworCQkJY2FzZSBSRUxLSU5EX0lOREVYOgorCQkJCWF1ZGl0RXZlbnRTdGFjay0+YXVkaXRF dmVudC5vYmplY3RUeXBlID0KKwkJCQkJT0JKRUNUX1RZUEVfSU5ERVg7CisJCQkJYnJlYWs7 CisKKwkJCWNhc2UgUkVMS0lORF9TRVFVRU5DRToKKwkJCQlhdWRpdEV2ZW50U3RhY2stPmF1 ZGl0RXZlbnQub2JqZWN0VHlwZSA9CisJCQkJCU9CSkVDVF9UWVBFX1NFUVVFTkNFOworCQkJ CWJyZWFrOworCisJCQljYXNlIFJFTEtJTkRfVklFVzoKKwkJCQlhdWRpdEV2ZW50U3RhY2st PmF1ZGl0RXZlbnQub2JqZWN0VHlwZSA9CisJCQkJCU9CSkVDVF9UWVBFX1ZJRVc7CisJCQkJ YnJlYWs7CisKKwkJCWNhc2UgUkVMS0lORF9DT01QT1NJVEVfVFlQRToKKwkJCQlhdWRpdEV2 ZW50U3RhY2stPmF1ZGl0RXZlbnQub2JqZWN0VHlwZSA9CisJCQkJCU9CSkVDVF9UWVBFX0NP TVBPU0lURV9UWVBFOworCQkJCWJyZWFrOworCisJCQljYXNlIFJFTEtJTkRfRk9SRUlHTl9U QUJMRToKKwkJCQlhdWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQub2JqZWN0VHlwZSA9CisJ CQkJCU9CSkVDVF9UWVBFX0ZPUkVJR05fVEFCTEU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2Ug UkVMS0lORF9NQVRWSUVXOgorCQkJCWF1ZGl0RXZlbnRTdGFjay0+YXVkaXRFdmVudC5vYmpl Y3RUeXBlID0KKwkJCQkJT0JKRUNUX1RZUEVfTUFUVklFVzsKKwkJCQlicmVhazsKKworCQkJ LyoKKwkJCSAqIEFueSBvdGhlciBjYXNlcyB3aWxsIGJlIGhhbmRsZWQgYnkgbG9nX3V0aWxp dHlfY29tbWFuZCgpLgorCQkJICovCisJCQlkZWZhdWx0OgorCQkJCXJldHVybjsKKwkJCQli cmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIENyZWF0ZSBBdWRpdEV2ZW50cyBmb3Igbm9u LWNhdGFsb2cgZnVuY3Rpb24gZXhlY3V0aW9uLCBhcyBkZXRlY3RlZCBieQorICogbG9nX29i amVjdF9hY2Nlc3MoKSBiZWxvdy4KKyAqLworc3RhdGljIHZvaWQKK2xvZ19mdW5jdGlvbl9l eGVjdXRlKE9pZCBvYmplY3RJZCkKK3sKKwlIZWFwVHVwbGUgcHJvY3R1cDsKKwlGb3JtX3Bn X3Byb2MgcHJvYzsKKwlBdWRpdEV2ZW50U3RhY2tJdGVtICpzdGFja0l0ZW07CisKKwkvKiBH ZXQgaW5mbyBhYm91dCB0aGUgZnVuY3Rpb24uICovCisJcHJvY3R1cCA9IFNlYXJjaFN5c0Nh Y2hlMShQUk9DT0lELCBPYmplY3RJZEdldERhdHVtKG9iamVjdElkKSk7CisKKwlpZiAoIXBy b2N0dXApCisJCWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciBmdW5jdGlv biAldSIsIG9iamVjdElkKTsKKwlwcm9jID0gKEZvcm1fcGdfcHJvYykgR0VUU1RSVUNUKHBy b2N0dXApOworCisJLyoKKwkgKiBMb2dnaW5nIGV4ZWN1dGlvbiBvZiBhbGwgcGdfY2F0YWxv ZyBmdW5jdGlvbnMgd291bGQgbWFrZSB0aGUgbG9nCisJICogdW51c2FibHkgbm9pc3kuCisJ ICovCisJaWYgKElzU3lzdGVtTmFtZXNwYWNlKHByb2MtPnByb25hbWVzcGFjZSkpCisJewor CQlSZWxlYXNlU3lzQ2FjaGUocHJvY3R1cCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBQdXNo IGF1ZGl0IGV2ZW50IG9udG8gdGhlIHN0YWNrICovCisJc3RhY2tJdGVtID0gc3RhY2tfcHVz aCgpOworCisJLyogR2VuZXJhdGUgdGhlIGZ1bGx5LXF1YWxpZmllZCBmdW5jdGlvbiBuYW1l LiAqLworCXN0YWNrSXRlbS0+YXVkaXRFdmVudC5vYmplY3ROYW1lID0KKwkJcXVvdGVfcXVh bGlmaWVkX2lkZW50aWZpZXIoZ2V0X25hbWVzcGFjZV9uYW1lKHByb2MtPnByb25hbWVzcGFj ZSksCisJCQkJCQkJCSAgIE5hbWVTdHIocHJvYy0+cHJvbmFtZSkpOworCVJlbGVhc2VTeXND YWNoZShwcm9jdHVwKTsKKworCS8qIExvZyB0aGUgZnVuY3Rpb24gY2FsbCAqLworCXN0YWNr SXRlbS0+YXVkaXRFdmVudC5sb2dTdG10TGV2ZWwgPSBMT0dTVE1UX0FMTDsKKwlzdGFja0l0 ZW0tPmF1ZGl0RXZlbnQuY29tbWFuZFRhZyA9IFRfRG9TdG10OworCXN0YWNrSXRlbS0+YXVk aXRFdmVudC5jb21tYW5kID0gQ09NTUFORF9FWEVDVVRFOworCXN0YWNrSXRlbS0+YXVkaXRF dmVudC5vYmplY3RUeXBlID0gT0JKRUNUX1RZUEVfRlVOQ1RJT047CisJc3RhY2tJdGVtLT5h dWRpdEV2ZW50LmNvbW1hbmRUZXh0ID0gc3RhY2tJdGVtLT5uZXh0LT5hdWRpdEV2ZW50LmNv bW1hbmRUZXh0OworCisJbG9nX2F1ZGl0X2V2ZW50KHN0YWNrSXRlbSk7CisKKwkvKiBQb3Ag YXVkaXQgZXZlbnQgZnJvbSB0aGUgc3RhY2sgKi8KKwlzdGFja19wb3AoKTsKK30KKworLyoK KyAqIExvZyBvYmplY3QgYWNjZXNzZXMgKHdoaWNoIGlzIG1vcmUgYWJvdXQgRERMIHRoYW4g RE1MLCBldmVuIHRob3VnaCBpdAorICogc291bmRzIGxpa2UgdGhlIGxhdHRlcikuCisgKi8K K3N0YXRpYyB2b2lkCitsb2dfb2JqZWN0X2FjY2VzcyhPYmplY3RBY2Nlc3NUeXBlIGFjY2Vz cywKKwkJCQkgIE9pZCBjbGFzc0lkLAorCQkJCSAgT2lkIG9iamVjdElkLAorCQkJCSAgaW50 IHN1YklkLAorCQkJCSAgdm9pZCAqYXJnKQoreworCXN3aXRjaCAoYWNjZXNzKQorCXsKKwkJ LyogTG9nIGV4ZWN1dGUgKi8KKwkJY2FzZSBPQVRfRlVOQ1RJT05fRVhFQ1VURToKKwkJCWlm IChhdWRpdExvZ0JpdG1hcCAmIExPR19GVU5DVElPTikKKwkJCQlsb2dfZnVuY3Rpb25fZXhl Y3V0ZShvYmplY3RJZCk7CisJCQlicmVhazsKKworCQkvKiBMb2cgY3JlYXRlICovCisJCWNh c2UgT0FUX1BPU1RfQ1JFQVRFOgorCQkJaWYgKGF1ZGl0TG9nQml0bWFwICYgTE9HX0RETCkK KwkJCXsKKwkJCQlPYmplY3RBY2Nlc3NQb3N0Q3JlYXRlICpwYyA9IGFyZzsKKworCQkJCWlm IChwYy0+aXNfaW50ZXJuYWwpCisJCQkJCXJldHVybjsKKworCQkJCWxvZ19jcmVhdGVfYWx0 ZXJfZHJvcChjbGFzc0lkLCBvYmplY3RJZCk7CisJCQl9CisJCQlicmVhazsKKworCQkvKiBM b2cgYWx0ZXIgKi8KKwkJY2FzZSBPQVRfUE9TVF9BTFRFUjoKKwkJCWlmIChhdWRpdExvZ0Jp dG1hcCAmIExPR19EREwpCisJCQl7CisJCQkJT2JqZWN0QWNjZXNzUG9zdEFsdGVyICpwYSA9 IGFyZzsKKworCQkJCWlmIChwYS0+aXNfaW50ZXJuYWwpCisJCQkJCXJldHVybjsKKworCQkJ CWxvZ19jcmVhdGVfYWx0ZXJfZHJvcChjbGFzc0lkLCBvYmplY3RJZCk7CisJCQl9CisJCQli cmVhazsKKworCQkvKiBMb2cgZHJvcCAqLworCQljYXNlIE9BVF9EUk9QOgorCQkJaWYgKGF1 ZGl0TG9nQml0bWFwICYgTE9HX0RETCkKKwkJCXsKKwkJCQlPYmplY3RBY2Nlc3NEcm9wICpk cm9wID0gYXJnOworCisJCQkJaWYgKGRyb3AtPmRyb3BmbGFncyAmIFBFUkZPUk1fREVMRVRJ T05fSU5URVJOQUwpCisJCQkJCXJldHVybjsKKworCQkJCWxvZ19jcmVhdGVfYWx0ZXJfZHJv cChjbGFzc0lkLCBvYmplY3RJZCk7CisJCQl9CisJCQlicmVhazsKKworCQkvKiBBbGwgb3Ro ZXJzIHByb2Nlc3NlZCBieSBsb2dfdXRpbGl0eV9jb21tYW5kKCkgKi8KKwkJZGVmYXVsdDoK KwkJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEhvb2sgZnVuY3Rpb25zCisgKi8KK3N0YXRp YyBFeGVjdXRvckNoZWNrUGVybXNfaG9va190eXBlIG5leHRfRXhlY3V0b3JDaGVja1Blcm1z X2hvb2sgPSBOVUxMOworc3RhdGljIFByb2Nlc3NVdGlsaXR5X2hvb2tfdHlwZSBuZXh0X1By b2Nlc3NVdGlsaXR5X2hvb2sgPSBOVUxMOworc3RhdGljIG9iamVjdF9hY2Nlc3NfaG9va190 eXBlIG5leHRfb2JqZWN0X2FjY2Vzc19ob29rID0gTlVMTDsKK3N0YXRpYyBFeGVjdXRvclN0 YXJ0X2hvb2tfdHlwZSBuZXh0X0V4ZWN1dG9yU3RhcnRfaG9vayA9IE5VTEw7CitzdGF0aWMg RXhlY3V0b3JFbmRfaG9va190eXBlIG5leHRfRXhlY3V0b3JFbmRfaG9vayA9IE5VTEw7CisK Ky8qCisgKiBIb29rIEV4ZWN1dG9yU3RhcnQgdG8gZ2V0IHRoZSBxdWVyeSB0ZXh0IGFuZCBi YXNpYyBjb21tYW5kIHR5cGUgZm9yIHF1ZXJpZXMKKyAqIHRoYXQgZG8gbm90IGNvbnRhaW4g YSB0YWJsZSBzbyBjYW4ndCBiZSBpZGVuaXRpZmllZCBhY2N1cmF0ZWx5IGluCisgKiBFeGVj dXRvckNoZWNrUGVybXMuCisgKi8KK3N0YXRpYyB2b2lkCitwZ2F1ZGl0X0V4ZWN1dG9yU3Rh cnRfaG9vayhRdWVyeURlc2MgKnF1ZXJ5RGVzYywgaW50IGVmbGFncykKK3sKKwlBdWRpdEV2 ZW50U3RhY2tJdGVtICpzdGFja0l0ZW0gPSBOVUxMOworCisJaWYgKCFpbnRlcm5hbFN0YXRl bWVudCkKKwl7CisJCS8qIEFsbG9jYXRlIHRoZSBhdWRpdCBldmVudCAqLworCQlzdGFja0l0 ZW0gPSBzdGFja19wdXNoKCk7CisKKwkJLyogSW5pdGlhbGl6ZSBjb21tYW5kICovCisJCXN3 aXRjaCAocXVlcnlEZXNjLT5vcGVyYXRpb24pCisJCXsKKwkJCWNhc2UgQ01EX1NFTEVDVDoK KwkJCQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQubG9nU3RtdExldmVsID0gTE9HU1RNVF9BTEw7 CisJCQkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50LmNvbW1hbmRUYWcgPSBUX1NlbGVjdFN0bXQ7 CisJCQkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50LmNvbW1hbmQgPSBDT01NQU5EX1NFTEVDVDsK KwkJCQlicmVhazsKKworCQkJY2FzZSBDTURfSU5TRVJUOgorCQkJCXN0YWNrSXRlbS0+YXVk aXRFdmVudC5sb2dTdG10TGV2ZWwgPSBMT0dTVE1UX01PRDsKKwkJCQlzdGFja0l0ZW0tPmF1 ZGl0RXZlbnQuY29tbWFuZFRhZyA9IFRfSW5zZXJ0U3RtdDsKKwkJCQlzdGFja0l0ZW0tPmF1 ZGl0RXZlbnQuY29tbWFuZCA9IENPTU1BTkRfSU5TRVJUOworCQkJCWJyZWFrOworCisJCQlj YXNlIENNRF9VUERBVEU6CisJCQkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50LmxvZ1N0bXRMZXZl bCA9IExPR1NUTVRfTU9EOworCQkJCXN0YWNrSXRlbS0+YXVkaXRFdmVudC5jb21tYW5kVGFn ID0gVF9VcGRhdGVTdG10OworCQkJCXN0YWNrSXRlbS0+YXVkaXRFdmVudC5jb21tYW5kID0g Q09NTUFORF9VUERBVEU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ01EX0RFTEVURToKKwkJ CQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQubG9nU3RtdExldmVsID0gTE9HU1RNVF9NT0Q7CisJ CQkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50LmNvbW1hbmRUYWcgPSBUX0RlbGV0ZVN0bXQ7CisJ CQkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50LmNvbW1hbmQgPSBDT01NQU5EX0RFTEVURTsKKwkJ CQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQubG9n U3RtdExldmVsID0gTE9HU1RNVF9BTEw7CisJCQkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50LmNv bW1hbmRUYWcgPSBUX0ludmFsaWQ7CisJCQkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50LmNvbW1h bmQgPSBDT01NQU5EX1VOS05PV047CisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBJbml0aWFs aXplIHRoZSBhdWRpdCBldmVudCAqLworCQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQub2JqZWN0 TmFtZSA9ICIiOworCQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQub2JqZWN0VHlwZSA9ICIiOwor CQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQuY29tbWFuZFRleHQgPSBxdWVyeURlc2MtPnNvdXJj ZVRleHQ7CisJCXN0YWNrSXRlbS0+YXVkaXRFdmVudC5wYXJhbUxpc3QgPSBxdWVyeURlc2Mt PnBhcmFtczsKKwl9CisKKwkvKiBDYWxsIHRoZSBwcmV2aW91cyBob29rIG9yIHN0YW5kYXJk IGZ1bmN0aW9uICovCisJaWYgKG5leHRfRXhlY3V0b3JTdGFydF9ob29rKQorCQluZXh0X0V4 ZWN1dG9yU3RhcnRfaG9vayhxdWVyeURlc2MsIGVmbGFncyk7CisJZWxzZQorCQlzdGFuZGFy ZF9FeGVjdXRvclN0YXJ0KHF1ZXJ5RGVzYywgZWZsYWdzKTsKK30KKworLyoKKyAqIEhvb2sg RXhlY3V0b3JDaGVja1Blcm1zIHRvIGRvIHNlc3Npb24gYW5kIG9iamVjdCBhdWRpdGluZyBm b3IgRE1MLgorICovCitzdGF0aWMgYm9vbAorcGdhdWRpdF9FeGVjdXRvckNoZWNrUGVybXNf aG9vayhMaXN0ICpyYW5nZVRhYmxzLCBib29sIGFib3J0KQoreworCU9pZCBhdWRpdE9pZDsK KworCS8qIEdldCB0aGUgYXVkaXQgb2lkIGlmIHRoZSByb2xlIGV4aXN0cy4gKi8KKwlhdWRp dE9pZCA9IGdldF9yb2xlX29pZChhdWRpdFJvbGUsIHRydWUpOworCisJLyogTG9nIERNTCBp ZiB0aGUgYXVkaXQgcm9sZSBpcyB2YWxpZCBvciBzZXNzaW9uIGxvZ2dpbmcgaXMgZW5hYmxl ZC4gKi8KKwlpZiAoKGF1ZGl0T2lkICE9IEludmFsaWRPaWQgfHwgYXVkaXRMb2dCaXRtYXAg IT0gMCkgJiYKKwkJIUlzQWJvcnRlZFRyYW5zYWN0aW9uQmxvY2tTdGF0ZSgpKQorCQlsb2df c2VsZWN0X2RtbChhdWRpdE9pZCwgcmFuZ2VUYWJscyk7CisKKwkvKiBDYWxsIHRoZSBuZXh0 IGhvb2sgZnVuY3Rpb24uICovCisJaWYgKG5leHRfRXhlY3V0b3JDaGVja1Blcm1zX2hvb2sg JiYKKwkJISgqbmV4dF9FeGVjdXRvckNoZWNrUGVybXNfaG9vaykgKHJhbmdlVGFibHMsIGFi b3J0KSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBI b29rIEV4ZWN1dG9yRW5kIHRvIHBvcCBzdGF0ZW1lbnQgYXVkaXQgZXZlbnQgb2ZmIHRoZSBz dGFjay4KKyAqLworc3RhdGljIHZvaWQKK3BnYXVkaXRfRXhlY3V0b3JFbmRfaG9vayhRdWVy eURlc2MgKnF1ZXJ5RGVzYykKK3sKKwkvKiBDYWxsIHRoZSBuZXh0IGhvb2sgb3Igc3RhbmRh cmQgZnVuY3Rpb24gKi8KKwlpZiAobmV4dF9FeGVjdXRvckVuZF9ob29rKQorCQluZXh0X0V4 ZWN1dG9yRW5kX2hvb2socXVlcnlEZXNjKTsKKwllbHNlCisJCXN0YW5kYXJkX0V4ZWN1dG9y RW5kKHF1ZXJ5RGVzYyk7CisKKwkvKiBQb3AgdGhlIGF1ZGl0IGV2ZW50IG9mZiB0aGUgc3Rh Y2sgKi8KKwlpZiAoIWludGVybmFsU3RhdGVtZW50KQorCXsKKwkJc3RhY2tfcG9wKCk7CisJ fQorfQorCisvKgorICogSG9vayBQcm9jZXNzVXRpbGl0eSB0byBkbyBzZXNzaW9uIGF1ZGl0 aW5nIGZvciBEREwgYW5kIHV0aWxpdHkgY29tbWFuZHMuCisgKi8KK3N0YXRpYyB2b2lkCitw Z2F1ZGl0X1Byb2Nlc3NVdGlsaXR5X2hvb2soTm9kZSAqcGFyc2V0cmVlLAorCQkJCQkJCWNv bnN0IGNoYXIgKnF1ZXJ5U3RyaW5nLAorCQkJCQkJCVByb2Nlc3NVdGlsaXR5Q29udGV4dCBj b250ZXh0LAorCQkJCQkJCVBhcmFtTGlzdEluZm8gcGFyYW1zLAorCQkJCQkJCURlc3RSZWNl aXZlciAqZGVzdCwKKwkJCQkJCQljaGFyICpjb21wbGV0aW9uVGFnKQoreworCUF1ZGl0RXZl bnRTdGFja0l0ZW0gKnN0YWNrSXRlbSA9IE5VTEw7CisKKwkvKiBBbGxvY2F0ZSB0aGUgYXVk aXQgZXZlbnQgKi8KKwlpZiAoIUlzQWJvcnRlZFRyYW5zYWN0aW9uQmxvY2tTdGF0ZSgpKQor CXsKKwkJLyogUHJvY2VzcyB0b3AgbGV2ZWwgdXRpbGl0eSBzdGF0ZW1lbnQgKi8KKwkJaWYg KGNvbnRleHQgPT0gUFJPQ0VTU19VVElMSVRZX1RPUExFVkVMKQorCQl7CisJCQlpZiAoYXVk aXRFdmVudFN0YWNrICE9IE5VTEwpCisJCQkJZWxvZyhFUlJPUiwgInBnX2F1ZGl0IHN0YWNr IGlzIG5vdCBlbXB0eSIpOworCisJCQkvKiBTZXQgcGFyYW1zICovCisJCQlzdGFja0l0ZW0g PSBzdGFja19wdXNoKCk7CisJCQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQucGFyYW1MaXN0ID0g cGFyYW1zOworCQl9CisJCWVsc2UKKwkJCXN0YWNrSXRlbSA9IHN0YWNrX3B1c2goKTsKKwor CQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQubG9nU3RtdExldmVsID0gR2V0Q29tbWFuZExvZ0xl dmVsKHBhcnNldHJlZSk7CisJCXN0YWNrSXRlbS0+YXVkaXRFdmVudC5jb21tYW5kVGFnID0g bm9kZVRhZyhwYXJzZXRyZWUpOworCQlzdGFja0l0ZW0tPmF1ZGl0RXZlbnQuY29tbWFuZCA9 IENyZWF0ZUNvbW1hbmRUYWcocGFyc2V0cmVlKTsKKwkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50 Lm9iamVjdE5hbWUgPSAiIjsKKwkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50Lm9iamVjdFR5cGUg PSAiIjsKKwkJc3RhY2tJdGVtLT5hdWRpdEV2ZW50LmNvbW1hbmRUZXh0ID0gcXVlcnlTdHJp bmc7CisKKwkJLyoKKwkJICogSWYgdGhpcyBpcyBhIERPIGJsb2NrIGxvZyBpdCBiZWZvcmUg Y2FsbGluZyB0aGUgbmV4dCBQcm9jZXNzVXRpbGl0eQorCQkgKiBob29rLgorCQkgKi8KKwkJ aWYgKGF1ZGl0TG9nQml0bWFwICE9IDAgJiYKKwkJCXN0YWNrSXRlbS0+YXVkaXRFdmVudC5j b21tYW5kVGFnID09IFRfRG9TdG10ICYmCisJCQkhSXNBYm9ydGVkVHJhbnNhY3Rpb25CbG9j a1N0YXRlKCkpCisJCXsKKwkJCWxvZ19hdWRpdF9ldmVudChzdGFja0l0ZW0pOworCQl9CisJ fQorCisJLyogQ2FsbCB0aGUgc3RhbmRhcmQgcHJvY2VzcyB1dGlsaXR5IGNoYWluLiAqLwor CWlmIChuZXh0X1Byb2Nlc3NVdGlsaXR5X2hvb2spCisJCSgqbmV4dF9Qcm9jZXNzVXRpbGl0 eV9ob29rKSAocGFyc2V0cmVlLCBxdWVyeVN0cmluZywgY29udGV4dCwKKwkJCQkJCQkJCSBw YXJhbXMsIGRlc3QsIGNvbXBsZXRpb25UYWcpOworCWVsc2UKKwkJc3RhbmRhcmRfUHJvY2Vz c1V0aWxpdHkocGFyc2V0cmVlLCBxdWVyeVN0cmluZywgY29udGV4dCwKKwkJCQkJCQkJcGFy YW1zLCBkZXN0LCBjb21wbGV0aW9uVGFnKTsKKworCS8qIFByb2Nlc3MgdGhlIGF1ZGl0IGV2 ZW50IGlmIHRoZXJlIGlzIG9uZS4gKi8KKwlpZiAoc3RhY2tJdGVtICE9IE5VTEwpCisJewor CQkvKiBMb2cgdGhlIHV0aWxpdHkgY29tbWFuZCBpZiBsb2dnaW5nIGlzIG9uLCB0aGUgY29t bWFuZCBoYXMgbm90IGFscmVhZHkKKwkJICogYmVlbiBsb2dnZWQgYnkgYW5vdGhlciBob29r LCBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIG5vdCBhYm9ydGVkLiAqLworCQlpZiAoYXVkaXRM b2dCaXRtYXAgIT0gMCAmJiAhc3RhY2tJdGVtLT5hdWRpdEV2ZW50LmxvZ2dlZCAmJgorCQkJ IUlzQWJvcnRlZFRyYW5zYWN0aW9uQmxvY2tTdGF0ZSgpKQorCQkJbG9nX2F1ZGl0X2V2ZW50 KHN0YWNrSXRlbSk7CisKKwkJaWYgKGNvbnRleHQgPT0gUFJPQ0VTU19VVElMSVRZX1RPUExF VkVMKQorCQl7CisJCQl3aGlsZSAoYXVkaXRFdmVudFN0YWNrICE9IE5VTEwpCisJCQkJc3Rh Y2tfcG9wKCk7CisJCX0KKwkJZWxzZQorCQkJc3RhY2tfcG9wKCk7CisJfQorfQorCisvKgor ICogSG9vayBvYmplY3RfYWNjZXNzX2hvb2sgdG8gcHJvdmlkZSBmdWxseS1xdWFsaWZpZWQg b2JqZWN0IG5hbWVzIGZvciBleGVjdXRlLAorICogY3JlYXRlLCBkcm9wLCBhbmQgYWx0ZXIg Y29tbWFuZHMuICBNb3N0IG9mIHRoZSBhdWRpdCBpbmZvcm1hdGlvbiBpcyBmaWxsZWQgaW4K KyAqIGJ5IGxvZ191dGlsaXR5X2NvbW1hbmQoKS4KKyAqLworc3RhdGljIHZvaWQKK3BnYXVk aXRfb2JqZWN0X2FjY2Vzc19ob29rKE9iamVjdEFjY2Vzc1R5cGUgYWNjZXNzLAorCQkJCQkJ ICAgT2lkIGNsYXNzSWQsCisJCQkJCQkgICBPaWQgb2JqZWN0SWQsCisJCQkJCQkgICBpbnQg c3ViSWQsCisJCQkJCQkgICB2b2lkICphcmcpCit7CisJaWYgKGF1ZGl0TG9nQml0bWFwICE9 IDAgJiYgIUlzQWJvcnRlZFRyYW5zYWN0aW9uQmxvY2tTdGF0ZSgpICYmCisJCWF1ZGl0TG9n Qml0bWFwICYgKExPR19EREwgfCBMT0dfRlVOQ1RJT04pKQorCQlsb2dfb2JqZWN0X2FjY2Vz cyhhY2Nlc3MsIGNsYXNzSWQsIG9iamVjdElkLCBzdWJJZCwgYXJnKTsKKworCWlmIChuZXh0 X29iamVjdF9hY2Nlc3NfaG9vaykKKwkJKCpuZXh0X29iamVjdF9hY2Nlc3NfaG9vaykgKGFj Y2VzcywgY2xhc3NJZCwgb2JqZWN0SWQsIHN1YklkLCBhcmcpOworfQorCisvKgorICogRXZl bnQgdHJpZ2dlciBmdW5jdGlvbnMKKyAqLworCisvKgorICogU3VwcGx5IGFkZGl0aW9uYWwg ZGF0YSBmb3IgKG5vbiBkcm9wKSBzdGF0ZW1lbnRzIHRoYXQgaGF2ZSBldmVudCB0cmlnZ2Vy CisgKiBzdXBwb3J0IGFuZCBjYW4gYmUgZGVwYXJzZWQuCisgKi8KK0RhdHVtCitwZ19hdWRp dF9kZGxfY29tbWFuZF9lbmQoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwkvKiBDb250aW51ZSBv bmx5IGlmIHNlc3Npb24gbG9nZ2luZyBpcyBlbmFibGVkICovCisJaWYgKGF1ZGl0TG9nQml0 bWFwICE9IExPR19EREwpCisJeworCQlFdmVudFRyaWdnZXJEYXRhICpldmVudERhdGE7CisJ CWludAkJCQkgIHJlc3VsdCwgcm93OworCQlUdXBsZURlc2MJCSAgc3BpVHVwRGVzYzsKKwkJ Y29uc3QgY2hhcgkJICpxdWVyeTsKKwkJTWVtb3J5Q29udGV4dCAJICBjb250ZXh0UXVlcnk7 CisJCU1lbW9yeUNvbnRleHQgCSAgY29udGV4dE9sZDsKKworCQkvKiBUaGlzIGlzIGFuIGlu dGVybmFsIHN0YXRlbWVudCAtIGRvIG5vdCBsb2cgaXQgKi8KKwkJaW50ZXJuYWxTdGF0ZW1l bnQgPSB0cnVlOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgZnVjdGlvbiB3YXMgZmlyZWQgYXMg YSB0cmlnZ2VyICovCisJCWlmICghQ0FMTEVEX0FTX0VWRU5UX1RSSUdHRVIoZmNpbmZvKSkK KwkJCWVsb2coRVJST1IsICJub3QgZmlyZWQgYnkgZXZlbnQgdHJpZ2dlciBtYW5hZ2VyIik7 CisKKwkJLyogU3dpdGNoIG1lbW9yeSBjb250ZXh0ICovCisJCWNvbnRleHRRdWVyeSA9IEFs bG9jU2V0Q29udGV4dENyZWF0ZSgKKwkJCQkJCUN1cnJlbnRNZW1vcnlDb250ZXh0LAorCQkJ CQkJInBnYXVkaXRfZnVuY19kZGxfY29tbWFuZF9lbmQgdGVtcG9yYXJ5IGNvbnRleHQiLAor CQkJCQkJQUxMT0NTRVRfREVGQVVMVF9NSU5TSVpFLAorCQkJCQkJQUxMT0NTRVRfREVGQVVM VF9JTklUU0laRSwKKwkJCQkJCUFMTE9DU0VUX0RFRkFVTFRfTUFYU0laRSk7CisJCWNvbnRl eHRPbGQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oY29udGV4dFF1ZXJ5KTsKKworCQkvKiBH ZXQgaW5mb3JtYXRpb24gYWJvdXQgdHJpZ2dlcmVkIGV2ZW50cyAqLworCQlldmVudERhdGEg PSAoRXZlbnRUcmlnZ2VyRGF0YSAqKSBmY2luZm8tPmNvbnRleHQ7CisKKwkJLyogUmV0dXJu IG9iamVjdHMgYWZmZWN0ZWQgYnkgdGhlIChub24gZHJvcCkgRERMIHN0YXRlbWVudCAqLwor CQlxdWVyeSA9ICJTRUxFQ1QgY2xhc3NpZCwgb2JqaWQsIG9ianN1YmlkLCBVUFBFUihvYmpl Y3RfdHlwZSksIHNjaGVtYSxcbiIKKwkJCQkiICAgICAgIGlkZW50aXR5LCBjb21tYW5kXG4i CisJCQkJIiAgRlJPTSBwZ19ldmVudF90cmlnZ2VyX2dldF9jcmVhdGlvbl9jb21tYW5kcygp IjsKKworCQkvKiBBdHRlbXB0IHRvIGNvbm5lY3QgKi8KKwkJcmVzdWx0ID0gU1BJX2Nvbm5l Y3QoKTsKKworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWVsb2coRVJST1IsICJwZ19hdWRpdF9k ZGxfY29tbWFuZF9lbmQ6IFNQSV9jb25uZWN0IHJldHVybmVkICVkIiwKKwkJCQkJCXJlc3Vs dCk7CisKKwkJLyogRXhlY3V0ZSB0aGUgcXVlcnkgKi8KKwkJcmVzdWx0ID0gU1BJX2V4ZWN1 dGUocXVlcnksIHRydWUsIDApOworCisJCWlmIChyZXN1bHQgIT0gU1BJX09LX1NFTEVDVCkK KwkJCWVsb2coRVJST1IsICJwZ19hdWRpdF9kZGxfY29tbWFuZF9lbmQ6IFNQSV9leGVjdXRl IHJldHVybmVkICVkIiwKKwkJCQkJCXJlc3VsdCk7CisKKwkJLyogSXRlcmF0ZSByZXR1cm5l ZCByb3dzICovCisJCXNwaVR1cERlc2MgPSBTUElfdHVwdGFibGUtPnR1cGRlc2M7CisKKwkJ Zm9yIChyb3cgPSAwOyByb3cgPCBTUElfcHJvY2Vzc2VkOyByb3crKykKKwkJeworCQkJSGVh cFR1cGxlICBzcGlUdXBsZTsKKwkJCWJvb2wJICAgaXNOdWxsOworCisJCQlzcGlUdXBsZSA9 IFNQSV90dXB0YWJsZS0+dmFsc1tyb3ddOworCisJCQkvKiBTdXBwbHkgYWRkaXRpb24gZGF0 YSB0byBjdXJyZW50IGF1ZGl0IGV2ZW50ICovCisJCQlhdWRpdEV2ZW50U3RhY2stPmF1ZGl0 RXZlbnQubG9nU3RtdExldmVsID0KKwkJCQlHZXRDb21tYW5kTG9nTGV2ZWwoZXZlbnREYXRh LT5wYXJzZXRyZWUpOworCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50LmNvbW1hbmRU YWcgPQorCQkJCW5vZGVUYWcoZXZlbnREYXRhLT5wYXJzZXRyZWUpOworCQkJYXVkaXRFdmVu dFN0YWNrLT5hdWRpdEV2ZW50LmNvbW1hbmQgPQorCQkJCUNyZWF0ZUNvbW1hbmRUYWcoZXZl bnREYXRhLT5wYXJzZXRyZWUpOworCQkJYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50Lm9i amVjdE5hbWUgPQorCQkJCVNQSV9nZXR2YWx1ZShzcGlUdXBsZSwgc3BpVHVwRGVzYywgNik7 CisJCQlhdWRpdEV2ZW50U3RhY2stPmF1ZGl0RXZlbnQub2JqZWN0VHlwZSA9CisJCQkJU1BJ X2dldHZhbHVlKHNwaVR1cGxlLCBzcGlUdXBEZXNjLCA0KTsKKwkJCWF1ZGl0RXZlbnRTdGFj ay0+YXVkaXRFdmVudC5jb21tYW5kVGV4dCA9CisJCQkJVGV4dERhdHVtR2V0Q1N0cmluZygK KwkJCQkJRGlyZWN0RnVuY3Rpb25DYWxsMShwZ19ldmVudF90cmlnZ2VyX2V4cGFuZF9jb21t YW5kLAorCQkJCQkJCQkJCVNQSV9nZXRiaW52YWwoc3BpVHVwbGUsIHNwaVR1cERlc2MsCisJ CQkJCQkJCQkJCQkJICA3LCAmaXNOdWxsKSkpOworCisJCQkvKiBMb2cgdGhlIGF1ZGl0IGV2 ZW50ICovCisJCQlsb2dfYXVkaXRfZXZlbnQoYXVkaXRFdmVudFN0YWNrKTsKKwkJfQorCisJ CS8qIENvbXBsZXRlIHRoZSBxdWVyeSAqLworCQlTUElfZmluaXNoKCk7CisKKwkJLyogU3dp dGNoIHRvIHRoZSBvbGQgbWVtb3J5IGNvbnRleHQgKi8KKwkJTWVtb3J5Q29udGV4dFN3aXRj aFRvKGNvbnRleHRPbGQpOworCQlNZW1vcnlDb250ZXh0RGVsZXRlKGNvbnRleHRRdWVyeSk7 CisKKwkJLyogTm8gbG9uZ2VyIGluIGFuIGludGVybmFsIHN0YXRlbWVudCAqLworCQlpbnRl cm5hbFN0YXRlbWVudCA9IGZhbHNlOworCX0KKworCVBHX1JFVFVSTl9OVUxMKCk7Cit9CisK Ky8qCisgKiBTdXBwbHkgYWRkaXRpb25hbCBkYXRhIGZvciBkcm9wIHN0YXRlbWVudHMgdGhh dCBoYXZlIGV2ZW50IHRyaWdnZXIgc3VwcG9ydC4KKyAqLworRGF0dW0KK3BnX2F1ZGl0X3Nx bF9kcm9wKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJaWYgKGF1ZGl0TG9nQml0bWFwICYgTE9H X0RETCkKKwl7CisJCUV2ZW50VHJpZ2dlckRhdGEgKmV2ZW50RGF0YTsKKwkJaW50CQkJCSAg cmVzdWx0LCByb3c7CisJCVR1cGxlRGVzYwkJICBzcGlUdXBEZXNjOworCQljb25zdCBjaGFy CQkgKnF1ZXJ5OworCQlNZW1vcnlDb250ZXh0IAkgIGNvbnRleHRRdWVyeTsKKwkJTWVtb3J5 Q29udGV4dCAJICBjb250ZXh0T2xkOworCisJCS8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgc3Rh dGVtZW50IC0gZG8gbm90IGxvZyBpdCAqLworCQlpbnRlcm5hbFN0YXRlbWVudCA9IHRydWU7 CisKKwkJLyogTWFrZSBzdXJlIHRoZSBmdWN0aW9uIHdhcyBmaXJlZCBhcyBhIHRyaWdnZXIg Ki8KKwkJaWYgKCFDQUxMRURfQVNfRVZFTlRfVFJJR0dFUihmY2luZm8pKQorCQkJZWxvZyhF UlJPUiwgIm5vdCBmaXJlZCBieSBldmVudCB0cmlnZ2VyIG1hbmFnZXIiKTsKKworCQkvKiBT d2l0Y2ggbWVtb3J5IGNvbnRleHQgKi8KKwkJY29udGV4dFF1ZXJ5ID0gQWxsb2NTZXRDb250 ZXh0Q3JlYXRlKAorCQkJCQkJQ3VycmVudE1lbW9yeUNvbnRleHQsCisJCQkJCQkicGdhdWRp dF9mdW5jX2RkbF9jb21tYW5kX2VuZCB0ZW1wb3JhcnkgY29udGV4dCIsCisJCQkJCQlBTExP Q1NFVF9ERUZBVUxUX01JTlNJWkUsCisJCQkJCQlBTExPQ1NFVF9ERUZBVUxUX0lOSVRTSVpF LAorCQkJCQkJQUxMT0NTRVRfREVGQVVMVF9NQVhTSVpFKTsKKwkJY29udGV4dE9sZCA9IE1l bW9yeUNvbnRleHRTd2l0Y2hUbyhjb250ZXh0UXVlcnkpOworCisJCS8qIEdldCBpbmZvcm1h dGlvbiBhYm91dCB0cmlnZ2VyZWQgZXZlbnRzICovCisJCWV2ZW50RGF0YSA9IChFdmVudFRy aWdnZXJEYXRhICopIGZjaW5mby0+Y29udGV4dDsKKworCQkvKiBSZXR1cm4gb2JqZWN0cyBh ZmZlY3RlZCBieSB0aGUgZHJvcCBzdGF0ZW1lbnQgKi8KKwkJcXVlcnkgPSAiU0VMRUNUIGNs YXNzaWQsIG9iamlkLCBvYmpzdWJpZCwgVVBQRVIob2JqZWN0X3R5cGUpLFxuIgorCQkJCSIg ICAgICAgc2NoZW1hX25hbWUsIG9iamVjdF9uYW1lLCBvYmplY3RfaWRlbnRpdHlcbiIKKwkJ CQkiICBGUk9NIHBnX2V2ZW50X3RyaWdnZXJfZHJvcHBlZF9vYmplY3RzKCkiOworCisJCS8q IEF0dGVtcHQgdG8gY29ubmVjdCAqLworCQlyZXN1bHQgPSBTUElfY29ubmVjdCgpOworCisJ CWlmIChyZXN1bHQgPCAwKQorCQkJZWxvZyhFUlJPUiwgInBnX2F1ZGl0X2RkbF9kcm9wOiBT UElfY29ubmVjdCByZXR1cm5lZCAlZCIsCisJCQkJCQlyZXN1bHQpOworCisJCS8qIEV4ZWN1 dGUgdGhlIHF1ZXJ5ICovCisJCXJlc3VsdCA9IFNQSV9leGVjdXRlKHF1ZXJ5LCB0cnVlLCAw KTsKKworCQlpZiAocmVzdWx0ICE9IFNQSV9PS19TRUxFQ1QpCisJCQllbG9nKEVSUk9SLCAi cGdfYXVkaXRfZGRsX2Ryb3A6IFNQSV9leGVjdXRlIHJldHVybmVkICVkIiwKKwkJCQkJCXJl c3VsdCk7CisKKwkJLyogSXRlcmF0ZSByZXR1cm5lZCByb3dzICovCisJCXNwaVR1cERlc2Mg PSBTUElfdHVwdGFibGUtPnR1cGRlc2M7CisKKwkJZm9yIChyb3cgPSAwOyByb3cgPCBTUElf cHJvY2Vzc2VkOyByb3crKykKKwkJeworCQkJSGVhcFR1cGxlICBzcGlUdXBsZTsKKwkJCWNo YXIgKnNjaGVtYU5hbWU7CisKKwkJCXNwaVR1cGxlID0gU1BJX3R1cHRhYmxlLT52YWxzW3Jv d107CisKKwkJCWF1ZGl0RXZlbnRTdGFjay0+YXVkaXRFdmVudC5vYmplY3RUeXBlID0KKwkJ CQlTUElfZ2V0dmFsdWUoc3BpVHVwbGUsIHNwaVR1cERlc2MsIDQpOworCQkJc2NoZW1hTmFt ZSA9IFNQSV9nZXR2YWx1ZShzcGlUdXBsZSwgc3BpVHVwRGVzYywgNSk7CisKKwkJCWlmICgh KHBnX3N0cmNhc2VjbXAoYXVkaXRFdmVudFN0YWNrLT5hdWRpdEV2ZW50Lm9iamVjdFR5cGUs CisJCQkJCQkJIlRZUEUiKSA9PSAwIHx8CisJCQkJICBwZ19zdHJjYXNlY21wKHNjaGVtYU5h bWUsICJwZ190b2FzdCIpID09IDApKQorCQkJeworCQkJCWF1ZGl0RXZlbnRTdGFjay0+YXVk aXRFdmVudC5vYmplY3ROYW1lID0KKwkJCQkJCVNQSV9nZXR2YWx1ZShzcGlUdXBsZSwgc3Bp VHVwRGVzYywgNyk7CisKKwkJCQlsb2dfYXVkaXRfZXZlbnQoYXVkaXRFdmVudFN0YWNrKTsK KwkJCX0KKwkJfQorCisJCS8qIENvbXBsZXRlIHRoZSBxdWVyeSAqLworCQlTUElfZmluaXNo KCk7CisKKwkJLyogU3dpdGNoIHRvIHRoZSBvbGQgbWVtb3J5IGNvbnRleHQgKi8KKwkJTWVt b3J5Q29udGV4dFN3aXRjaFRvKGNvbnRleHRPbGQpOworCQlNZW1vcnlDb250ZXh0RGVsZXRl KGNvbnRleHRRdWVyeSk7CisKKwkJLyogTm8gbG9uZ2VyIGluIGFuIGludGVybmFsIHN0YXRl bWVudCAqLworCQlpbnRlcm5hbFN0YXRlbWVudCA9IGZhbHNlOworCX0KKworCVBHX1JFVFVS Tl9OVUxMKCk7Cit9CisKKy8qCisgKiBHVUMgY2hlY2sgYW5kIGFzc2lnbiBmdW5jdGlvbnMK KyAqLworCisvKgorICogVGFrZSBhIHBnX2F1ZGl0LmxvZyB2YWx1ZSBzdWNoIGFzICJyZWFk LCB3cml0ZSwgZG1sIiwgdmVyaWZ5IHRoYXQgZWFjaCBvZiB0aGUKKyAqIGNvbW1hLXNlcGFy YXRlZCB0b2tlbnMgY29ycmVzcG9uZHMgdG8gYSBMb2dDbGFzcyB2YWx1ZSwgYW5kIGNvbnZl cnQgdGhlbSBpbnRvCisgKiBhIGJpdG1hcCB0aGF0IGxvZ19hdWRpdF9ldmVudCBjYW4gY2hl Y2suCisgKi8KK3N0YXRpYyBib29sCitjaGVja19wZ2F1ZGl0X2xvZyhjaGFyICoqbmV3dmFs LCB2b2lkICoqZXh0cmEsIEd1Y1NvdXJjZSBzb3VyY2UpCit7CisJTGlzdCAqZmxhZ3M7CisJ Y2hhciAqcmF3dmFsOworCUxpc3RDZWxsICpsdDsKKwl1aW50NjQgKmY7CisKKwkvKiBNYWtl IHN1cmUgbmV3dmFsIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdG9rZW5zLiAqLwor CXJhd3ZhbCA9IHBzdHJkdXAoKm5ld3ZhbCk7CisJaWYgKCFTcGxpdElkZW50aWZpZXJTdHJp bmcocmF3dmFsLCAnLCcsICZmbGFncykpCisJeworCQlHVUNfY2hlY2tfZXJyZGV0YWlsKCJM aXN0IHN5bnRheCBpcyBpbnZhbGlkIik7CisJCWxpc3RfZnJlZShmbGFncyk7CisJCXBmcmVl KHJhd3ZhbCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQg d2UgcmVjb2duaXNlIGVhY2ggdG9rZW4sIGFuZCBhZGQgaXQgdG8gdGhlIGJpdG1hcCB3ZSdy ZQorCSAqIGJ1aWxkaW5nIHVwIGluIGEgbmV3bHktYWxsb2NhdGVkIHVpbnQ2NCAqZi4KKwkg Ki8KKwlmID0gKHVpbnQ2NCAqKSBtYWxsb2Moc2l6ZW9mKHVpbnQ2NCkpOworCWlmICghZikK KwkJcmV0dXJuIGZhbHNlOworCSpmID0gMDsKKworCWZvcmVhY2gobHQsIGZsYWdzKQorCXsK KwkJYm9vbCBzdWJ0cmFjdCA9IGZhbHNlOworCQl1aW50NjQgY2xhc3M7CisKKwkJLyogUmV0 cmlldmUgYSB0b2tlbiAqLworCQljaGFyICp0b2tlbiA9IChjaGFyICopbGZpcnN0KGx0KTsK KworCQkvKiBJZiB0b2tlbiBpcyBwcmVjZWRlZCBieSAtLCB0aGVuIHRoZW4gdG9rZW4gaXMg c3VidHJhY3RpdmUuICovCisJCWlmIChzdHJzdHIodG9rZW4sICItIikgPT0gdG9rZW4pCisJ CXsKKwkJCXRva2VuID0gdG9rZW4gKyAxOworCQkJc3VidHJhY3QgPSB0cnVlOworCQl9CisK KwkJLyogVGVzdCBlYWNoIHRva2VuLiAqLworCQlpZiAocGdfc3RyY2FzZWNtcCh0b2tlbiwg Q0xBU1NfTk9ORSkgPT0gMCkKKwkJCWNsYXNzID0gTE9HX05PTkU7CisJCWVsc2UgaWYgKHBn X3N0cmNhc2VjbXAodG9rZW4sIENMQVNTX0FMTCkgPT0gMCkKKwkJCWNsYXNzID0gTE9HX0FM TDsKKwkJZWxzZSBpZiAocGdfc3RyY2FzZWNtcCh0b2tlbiwgQ0xBU1NfRERMKSA9PSAwKQor CQkJY2xhc3MgPSBMT0dfRERMOworCQllbHNlIGlmIChwZ19zdHJjYXNlY21wKHRva2VuLCBD TEFTU19GVU5DVElPTikgPT0gMCkKKwkJCWNsYXNzID0gTE9HX0ZVTkNUSU9OOworCQllbHNl IGlmIChwZ19zdHJjYXNlY21wKHRva2VuLCBDTEFTU19NSVNDKSA9PSAwKQorCQkJY2xhc3Mg PSBMT0dfTUlTQzsKKwkJZWxzZSBpZiAocGdfc3RyY2FzZWNtcCh0b2tlbiwgQ0xBU1NfUEFS QU1FVEVSKSA9PSAwKQorCQkJY2xhc3MgPSBMT0dfUEFSQU1FVEVSOworCQllbHNlIGlmIChw Z19zdHJjYXNlY21wKHRva2VuLCBDTEFTU19SRUFEKSA9PSAwKQorCQkJY2xhc3MgPSBMT0df UkVBRDsKKwkJZWxzZSBpZiAocGdfc3RyY2FzZWNtcCh0b2tlbiwgQ0xBU1NfV1JJVEUpID09 IDApCisJCQljbGFzcyA9IExPR19XUklURTsKKwkJZWxzZQorCQl7CisJCQlmcmVlKGYpOwor CQkJcGZyZWUocmF3dmFsKTsKKwkJCWxpc3RfZnJlZShmbGFncyk7CisJCQlyZXR1cm4gZmFs c2U7CisJCX0KKworCQkvKiBBZGQgb3Igc3VidHJhY3QgY2xhc3MgYml0cyBmcm9tIHRoZSBs b2cgYml0bWFwLiAqLworCQlpZiAoc3VidHJhY3QpCisJCQkqZiAmPSB+Y2xhc3M7CisJCWVs c2UKKwkJCSpmIHw9IGNsYXNzOworCX0KKworCXBmcmVlKHJhd3ZhbCk7CisJbGlzdF9mcmVl KGZsYWdzKTsKKworCS8qCisJICogU3RvcmUgdGhlIGJpdG1hcCBmb3IgYXNzaWduX3BnYXVk aXRfbG9nLgorCSAqLworCSpleHRyYSA9IGY7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoK KyAqIFNldCBwZ2F1ZGl0X2xvZyBmcm9tIGV4dHJhIChpZ25vcmluZyBuZXd2YWwsIHdoaWNo IGhhcyBhbHJlYWR5IGJlZW4gY29udmVydGVkCisgKiB0byBhIGJpdG1hcCBhYm92ZSkuIE5v dGUgdGhhdCBleHRyYSBtYXkgbm90IGJlIHNldCBpZiB0aGUgYXNzaWdubWVudCBpcyB0byBi ZQorICogc3VwcHJlc3NlZC4KKyAqLworc3RhdGljIHZvaWQKK2Fzc2lnbl9wZ2F1ZGl0X2xv Zyhjb25zdCBjaGFyICpuZXd2YWwsIHZvaWQgKmV4dHJhKQoreworCWlmIChleHRyYSkKKwkJ YXVkaXRMb2dCaXRtYXAgPSAqKHVpbnQ2NCAqKWV4dHJhOworfQorCisvKgorICogRGVmaW5l IEdVQyB2YXJpYWJsZXMgYW5kIGluc3RhbGwgaG9va3MgdXBvbiBtb2R1bGUgbG9hZC4KKyAq Lwordm9pZAorX1BHX2luaXQodm9pZCkKK3sKKwlpZiAoSXNVbmRlclBvc3RtYXN0ZXIpCisJ CWVyZXBvcnQoRVJST1IsCisJCQkoZXJyY29kZShFUlJDT0RFX09CSkVDVF9OT1RfSU5fUFJF UkVRVUlTSVRFX1NUQVRFKSwKKwkJCWVycm1zZygicGdfYXVkaXQgbXVzdCBiZSBsb2FkZWQg dmlhIHNoYXJlZF9wcmVsb2FkX2xpYnJhcmllcyIpKSk7CisKKwkvKgorCSAqIHBnX2F1ZGl0 LnJvbGUgPSAiYXVkaXQiCisJICoKKwkgKiBUaGlzIHZhcmlhYmxlIGRlZmluZXMgYSByb2xl IHRvIGJlIHVzZWQgZm9yIGF1ZGl0aW5nLgorCSAqLworCURlZmluZUN1c3RvbVN0cmluZ1Zh cmlhYmxlKCJwZ19hdWRpdC5yb2xlIiwKKwkJCQkJCQkgICAiRW5hYmxlIGF1ZGl0aW5nIGZv ciByb2xlIiwKKwkJCQkJCQkgICBOVUxMLAorCQkJCQkJCSAgICZhdWRpdFJvbGUsCisJCQkJ CQkJICAgIiIsCisJCQkJCQkJICAgUEdDX1NVU0VULAorCQkJCQkJCSAgIEdVQ19OT1RfSU5f U0FNUExFLAorCQkJCQkJCSAgIE5VTEwsIE5VTEwsIE5VTEwpOworCisJLyoKKwkgKiBwZ19h dWRpdC5sb2cgPSAicmVhZCwgd3JpdGUsIGRkbCIKKwkgKgorCSAqIFRoaXMgdmFyaWFibGVz IGNvbnRyb2xzIHdoYXQgY2xhc3NlcyBvZiBjb21tYW5kcyBhcmUgbG9nZ2VkLgorCSAqLwor CURlZmluZUN1c3RvbVN0cmluZ1ZhcmlhYmxlKCJwZ19hdWRpdC5sb2ciLAorCQkJCQkJCSAg ICJFbmFibGUgYXVkaXRpbmcgZm9yIGNsYXNzZXMgb2YgY29tbWFuZHMiLAorCQkJCQkJCSAg IE5VTEwsCisJCQkJCQkJICAgJmF1ZGl0TG9nLAorCQkJCQkJCSAgICJub25lIiwKKwkJCQkJ CQkgICBQR0NfU1VTRVQsCisJCQkJCQkJICAgR1VDX0xJU1RfSU5QVVQgfCBHVUNfTk9UX0lO X1NBTVBMRSwKKwkJCQkJCQkgICBjaGVja19wZ2F1ZGl0X2xvZywKKwkJCQkJCQkgICBhc3Np Z25fcGdhdWRpdF9sb2csCisJCQkJCQkJICAgTlVMTCk7CisKKwkvKgorCSAqIEluc3RhbGwg b3VyIGhvb2sgZnVuY3Rpb25zIGFmdGVyIHNhdmluZyB0aGUgZXhpc3RpbmcgcG9pbnRlcnMg dG8gcHJlc2VydmUKKwkgKiB0aGUgY2hhaW4uCisJICovCisJbmV4dF9FeGVjdXRvclN0YXJ0 X2hvb2sgPSBFeGVjdXRvclN0YXJ0X2hvb2s7CisJRXhlY3V0b3JTdGFydF9ob29rID0gcGdh dWRpdF9FeGVjdXRvclN0YXJ0X2hvb2s7CisKKwluZXh0X0V4ZWN1dG9yQ2hlY2tQZXJtc19o b29rID0gRXhlY3V0b3JDaGVja1Blcm1zX2hvb2s7CisJRXhlY3V0b3JDaGVja1Blcm1zX2hv b2sgPSBwZ2F1ZGl0X0V4ZWN1dG9yQ2hlY2tQZXJtc19ob29rOworCisJbmV4dF9FeGVjdXRv ckVuZF9ob29rID0gRXhlY3V0b3JFbmRfaG9vazsKKwlFeGVjdXRvckVuZF9ob29rID0gcGdh dWRpdF9FeGVjdXRvckVuZF9ob29rOworCisJbmV4dF9Qcm9jZXNzVXRpbGl0eV9ob29rID0g UHJvY2Vzc1V0aWxpdHlfaG9vazsKKwlQcm9jZXNzVXRpbGl0eV9ob29rID0gcGdhdWRpdF9Q cm9jZXNzVXRpbGl0eV9ob29rOworCisJbmV4dF9vYmplY3RfYWNjZXNzX2hvb2sgPSBvYmpl Y3RfYWNjZXNzX2hvb2s7CisJb2JqZWN0X2FjY2Vzc19ob29rID0gcGdhdWRpdF9vYmplY3Rf YWNjZXNzX2hvb2s7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3BnX2F1ZGl0L3BnX2F1ZGl0 LmNvbnRyb2wgYi9jb250cmliL3BnX2F1ZGl0L3BnX2F1ZGl0LmNvbnRyb2wKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczMGM2OAotLS0gL2Rldi9udWxsCisrKyBi L2NvbnRyaWIvcGdfYXVkaXQvcGdfYXVkaXQuY29udHJvbApAQCAtMCwwICsxLDUgQEAKKyMg cGdfYXVkaXQgZXh0ZW5zaW9uCitjb21tZW50ID0gJ3Byb3ZpZGVzIGF1ZGl0aW5nIGZ1bmN0 aW9uYWxpdHknCitkZWZhdWx0X3ZlcnNpb24gPSAnMS4wLjAnCittb2R1bGVfcGF0aG5hbWUg PSAnJGxpYmRpci9wZ19hdWRpdCcKK3JlbG9jYXRhYmxlID0gdHJ1ZQpkaWZmIC0tZ2l0IGEv Y29udHJpYi9wZ19hdWRpdC90ZXN0L3Rlc3QucGwgYi9jb250cmliL3BnX2F1ZGl0L3Rlc3Qv dGVzdC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNWNiZGUyCi0t LSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wZ19hdWRpdC90ZXN0L3Rlc3QucGwKQEAgLTAs MCArMSwxNDEyIEBACisjIS91c3IvYmluL3BlcmwKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjCisjIHRlc3QucGwgLSBwZ19hdWRpdCBVbml0IFRlc3RzCisjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQZXJsIGluY2x1 ZGVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwordXNlIHN0cmljdDsKK3VzZSB3YXJu aW5nczsKK3VzZSBDYXJwOworCit1c2UgR2V0b3B0OjpMb25nOwordXNlIFBvZDo6VXNhZ2U7 Cit1c2UgREJJOwordXNlIEN3ZCBxdyhhYnNfcGF0aCk7Cit1c2UgSVBDOjpTeXN0ZW06OlNp bXBsZSBxdyhjYXB0dXJlKTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29u c3RhbnRzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwordXNlIGNvbnN0YW50Cit7CisJ dHJ1ZSAgPT4gMSwKKwlmYWxzZSA9PiAwCit9OworCit1c2UgY29uc3RhbnQKK3sKKwlDT05U RVhUX0dMT0JBTCAgID0+ICdHTE9CQUwnLAorCUNPTlRFWFRfREFUQUJBU0UgPT4gJ0RBVEFC QVNFJywKKwlDT05URVhUX1JPTEUJID0+ICdST0xFJworfTsKKwordXNlIGNvbnN0YW50Cit7 CisJQ0xBU1MJCQk9PiAnQ0xBU1MnLAorCisJQ0xBU1NfRERMCQk9PiAnRERMJywKKwlDTEFT U19GVU5DVElPTgk9PiAnRlVOQ1RJT04nLAorCUNMQVNTX01JU0MJCT0+ICdNSVNDJywKKwlD TEFTU19QQVJBTUVURVIgPT4gJ1BBUkFNRVRFUicsCisJQ0xBU1NfUkVBRAkJPT4gJ1JFQUQn LAorCUNMQVNTX1dSSVRFCQk9PiAnV1JJVEUnLAorCisJQ0xBU1NfQUxMCQk9PiAnQUxMJywK KwlDTEFTU19OT05FCQk9PiAnTk9ORScKK307CisKK3VzZSBjb25zdGFudAoreworCUNPTU1B TkQJCQkJCQk9PiAnQ09NTUFORCcsCisJQ09NTUFORF9MT0cJCQkJCT0+ICdDT01NQU5EX0xP RycsCisKKwlDT01NQU5EX0FOQUxZWkUJCQkJCT0+ICdBTkFMWVpFJywKKwlDT01NQU5EX0FM VEVSX0FHR1JFR0FURQkJCT0+ICdBTFRFUiBBR0dSRUdBVEUnLAorCUNPTU1BTkRfQUxURVJf Q09MTEFUSU9OCQkJPT4gJ0FMVEVSIENPTExBVElPTicsCisJQ09NTUFORF9BTFRFUl9DT05W RVJTSU9OCQk9PiAnQUxURVIgQ09OVkVSU0lPTicsCisJQ09NTUFORF9BTFRFUl9EQVRBQkFT RQkJCT0+ICdBTFRFUiBEQVRBQkFTRScsCisJQ09NTUFORF9BTFRFUl9ST0xFCQkJCT0+ICdB TFRFUiBST0xFJywKKwlDT01NQU5EX0FMVEVSX1JPTEVfU0VUCQkJPT4gJ0FMVEVSIFJPTEUg U0VUJywKKwlDT01NQU5EX0FMVEVSX1RBQkxFCQkJCT0+ICdBTFRFUiBUQUJMRScsCisJQ09N TUFORF9BTFRFUl9UQUJMRV9DT0xVTU4JCT0+ICdBTFRFUiBUQUJMRSBDT0xVTU4nLAorCUNP TU1BTkRfQUxURVJfVEFCTEVfSU5ERVgJCT0+ICdBTFRFUiBUQUJMRSBJTkRFWCcsCisJQ09N TUFORF9CRUdJTgkJCQkJPT4gJ0JFR0lOJywKKwlDT01NQU5EX0NMT1NFCQkJCQk9PiAnQ0xP U0UgQ1VSU09SJywKKwlDT01NQU5EX0NPTU1JVAkJCQkJPT4gJ0NPTU1JVCcsCisJQ09NTUFO RF9DT1BZCQkJCQk9PiAnQ09QWScsCisJQ09NTUFORF9DT1BZX1RPCQkJCQk9PiAnQ09QWSBU TycsCisJQ09NTUFORF9DT1BZX0ZST00JCQkJPT4gJ0NPUFkgRlJPTScsCisJQ09NTUFORF9D UkVBVEVfQUdHUkVHQVRFCQk9PiAnQ1JFQVRFIEFHR1JFR0FURScsCisJQ09NTUFORF9DUkVB VEVfQ09MTEFUSU9OCQk9PiAnQ1JFQVRFIENPTExBVElPTicsCisJQ09NTUFORF9DUkVBVEVf Q09OVkVSU0lPTgkJPT4gJ0NSRUFURSBDT05WRVJTSU9OJywKKwlDT01NQU5EX0NSRUFURV9E QVRBQkFTRQkJCT0+ICdDUkVBVEUgREFUQUJBU0UnLAorCUNPTU1BTkRfQ1JFQVRFX0lOREVY CQkJPT4gJ0NSRUFURSBJTkRFWCcsCisJQ09NTUFORF9ERUFMTE9DQVRFCQkJCT0+ICdERUFM TE9DQVRFJywKKwlDT01NQU5EX0RFQ0xBUkVfQ1VSU09SCQkJPT4gJ0RFQ0xBUkUgQ1VSU09S JywKKwlDT01NQU5EX0RPCQkJCQkJPT4gJ0RPJywKKwlDT01NQU5EX0RJU0NBUkRfQUxMCQkJ CT0+ICdESVNDQVJEIEFMTCcsCisJQ09NTUFORF9DUkVBVEVfRlVOQ1RJT04JCQk9PiAnQ1JF QVRFIEZVTkNUSU9OJywKKwlDT01NQU5EX0NSRUFURV9ST0xFCQkJCT0+ICdDUkVBVEUgUk9M RScsCisJQ09NTUFORF9DUkVBVEVfU0NIRU1BCQkJPT4gJ0NSRUFURSBTQ0hFTUEnLAorCUNP TU1BTkRfQ1JFQVRFX1RBQkxFCQkJPT4gJ0NSRUFURSBUQUJMRScsCisJQ09NTUFORF9DUkVB VEVfVEFCTEVfQVMJCQk9PiAnQ1JFQVRFIFRBQkxFIEFTJywKKwlDT01NQU5EX0RST1BfREFU QUJBU0UJCQk9PiAnRFJPUCBEQVRBQkFTRScsCisJQ09NTUFORF9EUk9QX1NDSEVNQQkJCQk9 PiAnRFJPUCBTQ0hFTUEnLAorCUNPTU1BTkRfRFJPUF9UQUJMRQkJCQk9PiAnRFJPUCBUQUJM RScsCisJQ09NTUFORF9EUk9QX1RBQkxFX0NPTlNUUkFJTlQJPT4gJ0RST1AgVEFCTEUgQ09O U1RSQUlOVCcsCisJQ09NTUFORF9EUk9QX1RBQkxFX0lOREVYCQk9PiAnRFJPUCBUQUJMRSBJ TkRFWCcsCisJQ09NTUFORF9EUk9QX1RBQkxFX1RPQVNUCQk9PiAnRFJPUCBUQUJMRSBUT0FT VCcsCisJQ09NTUFORF9EUk9QX1RBQkxFX1RZUEUJCQk9PiAnRFJPUCBUQUJMRSBUWVBFJywK KwlDT01NQU5EX0VYRUNVVEUJCQkJCT0+ICdFWEVDVVRFJywKKwlDT01NQU5EX0VYRUNVVEVf UkVBRAkJCT0+ICdFWEVDVVRFIFJFQUQnLAorCUNPTU1BTkRfRVhFQ1VURV9XUklURQkJCT0+ ICdFWEVDVVRFIFdSSVRFJywKKwlDT01NQU5EX0VYRUNVVEVfRlVOQ1RJT04JCT0+ICdFWEVD VVRFIEZVTkNUSU9OJywKKwlDT01NQU5EX0VYUExBSU4JCQkJCT0+ICdFWFBMQUlOJywKKwlD T01NQU5EX0ZFVENICQkJCQk9PiAnRkVUQ0gnLAorCUNPTU1BTkRfR1JBTlQJCQkJCT0+ICdH UkFOVCcsCisJQ09NTUFORF9JTlNFUlQJCQkJCT0+ICdJTlNFUlQnLAorCSMgQ09NTUFORF9Q QVJBTUVURVIJCQkJPT4gJ1BBUkFNRVRFUicsCisJIyBDT01NQU5EX1BBUkFNRVRFUl9SRUFE CQkJPT4gJ1BBUkFNRVRFUl9SRUFEJywKKwkjIENPTU1BTkRfUEFSQU1FVEVSX1dSSVRFCQkJ PT4gJ1BBUkFNRVRFUl9XUklURScsCisJQ09NTUFORF9QUkVQQVJFCQkJCQk9PiAnUFJFUEFS RScsCisJQ09NTUFORF9QUkVQQVJFX1JFQUQJCQk9PiAnUFJFUEFSRSBSRUFEJywKKwlDT01N QU5EX1BSRVBBUkVfV1JJVEUJCQk9PiAnUFJFUEFSRSBXUklURScsCisJQ09NTUFORF9SRVZP S0UJCQkJCT0+ICdSRVZPS0UnLAorCUNPTU1BTkRfU0VMRUNUCQkJCQk9PiAnU0VMRUNUJywK KwlDT01NQU5EX1NFVAkJCQkJCT0+ICdTRVQnLAorCUNPTU1BTkRfVVBEQVRFCQkJCQk9PiAn VVBEQVRFJworfTsKKwordXNlIGNvbnN0YW50Cit7CisJVFlQRQkJCQkJPT4gJ1RZUEUnLAor CVRZUEVfTk9ORQkJCQk9PiAnJywKKworCVRZUEVfQUdHUkVHQVRFCQkJPT4gJ0FHR1JFR0FU RScsCisJVFlQRV9DT0xMQVRJT04JCQk9PiAnQ09MTEFUSU9OJywKKwlUWVBFX0NPTlZFUlNJ T04JCQk9PiAnQ09OVkVSU0lPTicsCisJVFlQRV9TQ0hFTUEJCQkJPT4gJ1NDSEVNQScsCisJ VFlQRV9GVU5DVElPTgkJCT0+ICdGVU5DVElPTicsCisJVFlQRV9JTkRFWAkJCQk9PiAnSU5E RVgnLAorCVRZUEVfVEFCTEUJCQkJPT4gJ1RBQkxFJywKKwlUWVBFX1RBQkxFX0NPTFVNTgkJ PT4gJ1RBQkxFIENPTFVNTicsCisJVFlQRV9UQUJMRV9DT05TVFJBSU5UCT0+ICdUQUJMRSBD T05TVFJBSU5UJywKKwlUWVBFX1RBQkxFX1RPQVNUCQk9PiAnVEFCTEUgVE9BU1QnLAorCVRZ UEVfVFlQRQkJCQk9PiAnVFlQRScKK307CisKK3VzZSBjb25zdGFudAoreworCU5BTUUJCQk9 PiAnTkFNRScKK307CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbW1hbmQg bGluZSBwYXJhbWV0ZXJzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworbXkgJHN0clBn U3FsQmluID0gJy4uLy4uLy4uLy4uL2Jpbi9iaW4nOwkjIFBhdGggb2YgUEcgYmluYXJpZXMg dG8gdXNlIGZvcgorCQkJCQkJCQkJCQkjIHRoaXMgdGVzdAorbXkgJHN0clRlc3RQYXRoID0g Jy4uLy4uLy4uLy4uL2RhdGEnOwkJIyBQYXRoIHdoZXJlIHRlc3Rpbmcgd2lsbCBvY2N1cgor bXkgJGlEZWZhdWx0UG9ydCA9IDYwMDA7CQkJCQkjIERlZmF1bHQgcG9ydCB0byBydW4gUG9z dGdyZXMgb24KK215ICRiSGVscCA9IGZhbHNlOwkJCQkJCQkjIERpc3BsYXkgaGVscAorbXkg JGJRdWlldCA9IGZhbHNlOwkJCQkJCQkjIFN1cHJlc3Mgb3V0cHV0IGV4Y2VwdCBmb3IgZXJy b3JzCitteSAkYk5vQ2xlYW51cCA9IGZhbHNlOwkJCQkJCSMgQ2xlYW51cCBkYXRhYmFzZSBv biBleGl0CisKK0dldE9wdGlvbnMgKCdxfHF1aWV0JyA9PiBcJGJRdWlldCwKKwkJCSduby1j bGVhbnVwJyA9PiBcJGJOb0NsZWFudXAsCisJCQknaGVscCcgPT4gXCRiSGVscCwKKwkJCSdw Z3NxbC1iaW49cycgPT4gXCRzdHJQZ1NxbEJpbiwKKwkJCSd0ZXN0LXBhdGg9cycgPT4gXCRz dHJUZXN0UGF0aCkKKwlvciBwb2QydXNhZ2UoMik7CisKKyMgRGlzcGxheSB2ZXJzaW9uIGFu ZCBleGl0IGlmIHJlcXVlc3RlZAoraWYgKCRiSGVscCkKK3sKKwlwcmludCAncGdfYXVkaXQg dW5pdCB0ZXN0XG5cbic7CisJcG9kMnVzYWdlKCk7CisKKwlleGl0IDA7Cit9CisKKyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdsb2JhbCB2YXJpYWJsZXMKKyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjCitteSAkaERiOwkJCQkJIyBDb25uZWN0aW9uIHRvIFBvc3RncmVz CitteSAkc3RyTG9nRXhwZWN0ZWQgPSAnJzsJIyBUaGUgZXhwZWN0ZWQgbG9nIGNvbXBhcmVk IHdpdGggZ3JlcHBpbmcgQVVESVQKKwkJCQkJCQkjIGVudHJpZXMgZnJvbSB0aGUgcG9zdGdy ZXMgbG9nLgorCitteSAkc3RyRGF0YWJhc2UgPSAncG9zdGdyZXMnOwkjIENvbm5lY3RlZCBk YXRhYmFzZSAobW9kaWZpZWQgYnkgUGdTZXREYXRhYmFzZSkKK215ICRzdHJVc2VyID0gJ3Bv c3RncmVzJzsJCSMgQ29ubmVjdGVkIHVzZXIgKG1vZGlmaWVkIGJ5IFBnU2V0VXNlcikKK215 ICRzdHJBdWRpdFJvbGUgPSAnYXVkaXQnOwkJIyBSb2xlIHRvIHVzZSBmb3IgYXVkaXRpbmcK KworbXkgJW9BdWRpdExvZ0hhc2g7CQkJCSMgSGFzaCB0byBzdG9yZSBwZ19hdWRpdC5sb2cg R1VDUworbXkgJW9BdWRpdEdyYW50SGFzaDsJCQkjIEhhc2ggdG8gc3RvcmUgcGdfYXVkaXQg Z3JhbnRzCisKK215ICRzdHJDdXJyZW50QXVkaXRMb2c7CQkjIHBnX2F1ZGl0LmxvZyBzZXR0 aW5nIHdhcyBQb3N0Z3JlcyB3YXMgc3RhcnRlZCB3aXRoCitteSAkc3RyVGVtcG9yYXJ5QXVk aXRMb2c7CSMgcGdfYXVkaXQubG9nIHNldHRpbmcgdGhhdCB3YXMgc2V0IGhvdAorCisjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTdG9yZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBj b21tYW5kcywgY2xhc3NlcywgYW5kIHR5cGVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IworbXkgJW9Db21tYW5kSGFzaCA9CisoJkNPTU1BTkRfQU5BTFlaRSA9PiB7CisJJkNMQVNT ID0+ICZDTEFTU19EREwsICZUWVBFID0+ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0FMVEVS X0FHR1JFR0FURSA9PiB7JkNMQVNTID0+ICZDTEFTU19EREwsCisJCSZUWVBFID0+ICZUWVBF X0FHR1JFR0FURX0sCisJJkNPTU1BTkRfQUxURVJfREFUQUJBU0UgPT4geyZDTEFTUyA9PiAm Q0xBU1NfRERMLCAmVFlQRSA9PiAmVFlQRV9OT05FfSwKKwkmQ09NTUFORF9BTFRFUl9DT0xM QVRJT04gPT4geyZDTEFTUyA9PiAmQ0xBU1NfRERMLAorCQkmVFlQRSA9PiAmVFlQRV9DT0xM QVRJT059LAorCSZDT01NQU5EX0FMVEVSX0NPTlZFUlNJT04gPT4geyZDTEFTUyA9PiAmQ0xB U1NfRERMLAorCQkmVFlQRSA9PiAmVFlQRV9DT05WRVJTSU9OfSwKKwkmQ09NTUFORF9BTFRF Ul9ST0xFID0+IHsmQ0xBU1MgPT4gJkNMQVNTX0RETCwgJlRZUEUgPT4gJlRZUEVfTk9ORX0s CisJJkNPTU1BTkRfQUxURVJfUk9MRV9TRVQgPT4geyZDTEFTUyA9PiAmQ0xBU1NfRERMLCAm VFlQRSA9PiAmVFlQRV9OT05FLAorCQkmQ09NTUFORCA9PiAmQ09NTUFORF9BTFRFUl9ST0xF fSwKKwkmQ09NTUFORF9BTFRFUl9UQUJMRSA9PiB7JkNMQVNTID0+ICZDTEFTU19EREwsICZU WVBFID0+ICZUWVBFX1RBQkxFfSwKKwkmQ09NTUFORF9BTFRFUl9UQUJMRV9DT0xVTU4gPT4g eyZDTEFTUyA9PiAmQ0xBU1NfRERMLAorCQkmVFlQRSA9PiAmVFlQRV9UQUJMRV9DT0xVTU4s ICZDT01NQU5EID0+ICZDT01NQU5EX0FMVEVSX1RBQkxFfSwKKwkmQ09NTUFORF9BTFRFUl9U QUJMRV9JTkRFWCA9PiB7JkNMQVNTID0+ICZDTEFTU19EREwsICZUWVBFID0+ICZUWVBFX0lO REVYLAorCQkmQ09NTUFORCA9PiAmQ09NTUFORF9BTFRFUl9UQUJMRX0sCisJJkNPTU1BTkRf QkVHSU4gPT4geyZDTEFTUyA9PiAmQ0xBU1NfTUlTQywgJlRZUEUgPT4gJlRZUEVfTk9ORX0s CisJJkNPTU1BTkRfQ0xPU0UgPT4geyZDTEFTUyA9PiAmQ0xBU1NfTUlTQywgJlRZUEUgPT4g JlRZUEVfTk9ORX0sCisJJkNPTU1BTkRfQ09NTUlUID0+IHsmQ0xBU1MgPT4gJkNMQVNTX01J U0MsICZUWVBFID0+ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0NPUFlfRlJPTSA9PiB7JkNM QVNTID0+ICZDTEFTU19XUklURSwgJlRZUEUgPT4gJlRZUEVfTk9ORSwKKwkJJkNPTU1BTkQg PT4gJkNPTU1BTkRfQ09QWX0sCisJJkNPTU1BTkRfQ09QWV9UTyA9PiB7JkNMQVNTID0+ICZD TEFTU19SRUFELCAmVFlQRSA9PiAmVFlQRV9OT05FLAorCQkmQ09NTUFORCA9PiAmQ09NTUFO RF9DT1BZfSwKKwkmQ09NTUFORF9DUkVBVEVfQUdHUkVHQVRFID0+IHsmQ0xBU1MgPT4gJkNM QVNTX0RETCwKKwkJJlRZUEUgPT4gJlRZUEVfQUdHUkVHQVRFfSwKKwkmQ09NTUFORF9DUkVB VEVfQ09OVkVSU0lPTiA9PiB7JkNMQVNTID0+ICZDTEFTU19EREwsCisJCSZUWVBFID0+ICZU WVBFX0NPTlZFUlNJT059LAorCSZDT01NQU5EX0NSRUFURV9DT0xMQVRJT04gPT4geyZDTEFT UyA9PiAmQ0xBU1NfRERMLAorCQkmVFlQRSA9PiAmVFlQRV9DT0xMQVRJT059LAorCSZDT01N QU5EX0NSRUFURV9EQVRBQkFTRSA9PiB7JkNMQVNTID0+ICZDTEFTU19EREwsICZUWVBFID0+ ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0NSRUFURV9JTkRFWCA9PiB7JkNMQVNTID0+ICZD TEFTU19EREwsICZUWVBFID0+ICZUWVBFX0lOREVYfSwKKwkmQ09NTUFORF9ERUFMTE9DQVRF ID0+IHsmQ0xBU1MgPT4gJkNMQVNTX01JU0MsICZUWVBFID0+ICZUWVBFX05PTkV9LAorCSZD T01NQU5EX0RFQ0xBUkVfQ1VSU09SID0+IHsmQ0xBU1MgPT4gJkNMQVNTX1JFQUQsICZUWVBF ID0+ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0RPID0+IHsmQ0xBU1MgPT4gJkNMQVNTX0ZV TkNUSU9OLCAmVFlQRSA9PiAmVFlQRV9OT05FfSwKKwkmQ09NTUFORF9ESVNDQVJEX0FMTCA9 PiB7JkNMQVNTID0+ICZDTEFTU19NSVNDLCAmVFlQRSA9PiAmVFlQRV9OT05FfSwKKwkmQ09N TUFORF9DUkVBVEVfRlVOQ1RJT04gPT4geyZDTEFTUyA9PiAmQ0xBU1NfRERMLCAmVFlQRSA9 PiAmVFlQRV9GVU5DVElPTn0sCisJJkNPTU1BTkRfQ1JFQVRFX1JPTEUgPT4geyZDTEFTUyA9 PiAmQ0xBU1NfRERMLCAmVFlQRSA9PiAmVFlQRV9OT05FfSwKKwkmQ09NTUFORF9DUkVBVEVf U0NIRU1BID0+IHsmQ0xBU1MgPT4gJkNMQVNTX0RETCwgJlRZUEUgPT4gJlRZUEVfU0NIRU1B fSwKKwkmQ09NTUFORF9DUkVBVEVfVEFCTEUgPT4geyZDTEFTUyA9PiAmQ0xBU1NfRERMLCAm VFlQRSA9PiAmVFlQRV9UQUJMRX0sCisJJkNPTU1BTkRfQ1JFQVRFX1RBQkxFX0FTID0+IHsm Q0xBU1MgPT4gJkNMQVNTX0RETCwgJlRZUEUgPT4gJlRZUEVfVEFCTEV9LAorCSZDT01NQU5E X0RST1BfREFUQUJBU0UgPT4geyZDTEFTUyA9PiAmQ0xBU1NfRERMLCAmVFlQRSA9PiAmVFlQ RV9OT05FfSwKKwkmQ09NTUFORF9EUk9QX1NDSEVNQSA9PiB7JkNMQVNTID0+ICZDTEFTU19E REwsICZUWVBFID0+ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0RST1BfVEFCTEUgPT4geyZD TEFTUyA9PiAmQ0xBU1NfRERMLCAmVFlQRSA9PiAmVFlQRV9UQUJMRX0sCisJJkNPTU1BTkRf RFJPUF9UQUJMRV9DT05TVFJBSU5UID0+IHsmQ0xBU1MgPT4gJkNMQVNTX0RETCwKKwkJJlRZ UEUgPT4gJlRZUEVfVEFCTEVfQ09OU1RSQUlOVCwgJkNPTU1BTkQgPT4gJkNPTU1BTkRfRFJP UF9UQUJMRX0sCisJJkNPTU1BTkRfRFJPUF9UQUJMRV9JTkRFWCA9PiB7JkNMQVNTID0+ICZD TEFTU19EREwsICZUWVBFID0+ICZUWVBFX0lOREVYLAorCQkmQ09NTUFORCA9PiAmQ09NTUFO RF9EUk9QX1RBQkxFfSwKKwkmQ09NTUFORF9EUk9QX1RBQkxFX1RPQVNUID0+IHsmQ0xBU1Mg PT4gJkNMQVNTX0RETCwKKwkJJlRZUEUgPT4gJlRZUEVfVEFCTEVfVE9BU1QsICZDT01NQU5E ID0+ICZDT01NQU5EX0RST1BfVEFCTEV9LAorCSZDT01NQU5EX0RST1BfVEFCTEVfVFlQRSA9 PiB7JkNMQVNTID0+ICZDTEFTU19EREwsICZUWVBFID0+ICZUWVBFX1RZUEUsCisJCSZDT01N QU5EID0+ICZDT01NQU5EX0RST1BfVEFCTEV9LAorCSZDT01NQU5EX0VYRUNVVEVfUkVBRCA9 PiB7JkNMQVNTID0+ICZDTEFTU19SRUFELCAmVFlQRSA9PiAmVFlQRV9OT05FLAorCQkmQ09N TUFORCA9PiAmQ09NTUFORF9FWEVDVVRFfSwKKwkmQ09NTUFORF9FWEVDVVRFX1dSSVRFID0+ IHsmQ0xBU1MgPT4gJkNMQVNTX1dSSVRFLCAmVFlQRSA9PiAmVFlQRV9OT05FLAorCQkmQ09N TUFORCA9PiAmQ09NTUFORF9FWEVDVVRFfSwKKwkmQ09NTUFORF9FWEVDVVRFX0ZVTkNUSU9O ID0+IHsmQ0xBU1MgPT4gJkNMQVNTX0ZVTkNUSU9OLAorCQkmVFlQRSA9PiAmVFlQRV9GVU5D VElPTiwgJkNPTU1BTkQgPT4gJkNPTU1BTkRfRVhFQ1VURX0sCisJJkNPTU1BTkRfRVhQTEFJ TiA9PiB7JkNMQVNTID0+ICZDTEFTU19NSVNDLCAmVFlQRSA9PiAmVFlQRV9OT05FfSwKKwkm Q09NTUFORF9GRVRDSCA9PiB7JkNMQVNTID0+ICZDTEFTU19NSVNDLCAmVFlQRSA9PiAmVFlQ RV9OT05FfSwKKwkmQ09NTUFORF9HUkFOVCA9PiB7JkNMQVNTID0+ICZDTEFTU19EREwsICZU WVBFID0+ICZUWVBFX1RBQkxFfSwKKwkmQ09NTUFORF9QUkVQQVJFX1JFQUQgPT4geyZDTEFT UyA9PiAmQ0xBU1NfUkVBRCwgJlRZUEUgPT4gJlRZUEVfTk9ORSwKKwkJJkNPTU1BTkQgPT4g JkNPTU1BTkRfUFJFUEFSRX0sCisJJkNPTU1BTkRfUFJFUEFSRV9XUklURSA9PiB7JkNMQVNT ID0+ICZDTEFTU19XUklURSwgJlRZUEUgPT4gJlRZUEVfTk9ORSwKKwkJJkNPTU1BTkQgPT4g JkNPTU1BTkRfUFJFUEFSRX0sCisJJkNPTU1BTkRfSU5TRVJUID0+IHsmQ0xBU1MgPT4gJkNM QVNTX1dSSVRFLCAmVFlQRSA9PiAmVFlQRV9OT05FfSwKKwkmQ09NTUFORF9SRVZPS0UgPT4g eyZDTEFTUyA9PiAmQ0xBU1NfRERMLCAmVFlQRSA9PiAmVFlQRV9UQUJMRX0sCisJJkNPTU1B TkRfU0VMRUNUID0+IHsmQ0xBU1MgPT4gJkNMQVNTX1JFQUQsICZUWVBFID0+ICZUWVBFX05P TkV9LAorCSZDT01NQU5EX1NFVCA9PiB7JkNMQVNTID0+ICZDTEFTU19NSVNDLCAmVFlQRSA9 PiAmVFlQRV9OT05FfSwKKwkmQ09NTUFORF9VUERBVEUgPT4geyZDTEFTUyA9PiAmQ0xBU1Nf V1JJVEUsICZUWVBFID0+ICZUWVBFX05PTkV9CispOworCisjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIworIyBDb21tYW5kRXhlY3V0ZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK K3N1YiBDb21tYW5kRXhlY3V0ZQoreworCW15ICRzdHJDb21tYW5kID0gc2hpZnQ7CisJbXkg JGJTdXBwcmVzc0Vycm9yID0gc2hpZnQ7CisKKwkjIFNldCBkZWZhdWx0CisJJGJTdXBwcmVz c0Vycm9yID0gZGVmaW5lZCgkYlN1cHByZXNzRXJyb3IpID8gJGJTdXBwcmVzc0Vycm9yIDog ZmFsc2U7CisKKwkjIFJ1biB0aGUgY29tbWFuZAorCW15ICRpUmVzdWx0ID0gc3lzdGVtKCRz dHJDb21tYW5kKTsKKworCWlmICgkaVJlc3VsdCAhPSAwICYmICEkYlN1cHByZXNzRXJyb3Ip CisJeworCQljb25mZXNzICJjb21tYW5kICcke3N0ckNvbW1hbmR9JyBmYWlsZWQgd2l0aCBl cnJvciAke2lSZXN1bHR9IjsKKwl9Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj CisjIGxvZworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1YiBsb2cKK3sKKwlteSAk c3RyTWVzc2FnZSA9IHNoaWZ0OworCW15ICRiRXJyb3IgPSBzaGlmdDsKKworCSMgU2V0IGRl ZmF1bHQKKwkkYkVycm9yID0gZGVmaW5lZCgkYkVycm9yKSA/ICRiRXJyb3IgOiBmYWxzZTsK KworCWlmICghJGJRdWlldCkKKwl7CisJCXByaW50ICIke3N0ck1lc3NhZ2V9XG4iOworCX0K KworCWlmICgkYkVycm9yKQorCXsKKwkJZXhpdCAxOworCX0KK30KKworIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMKKyMgQXJyYXlUb1N0cmluZworIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKK3N1YiBBcnJheVRvU3RyaW5nCit7CisJbXkgQHN0cnlBcnJheSA9IEBfOworCisJ bXkgJHN0clJlc3VsdCA9ICcnOworCisJZm9yIChteSAkaUluZGV4ID0gMDsgJGlJbmRleCA8 IEBzdHJ5QXJyYXk7ICRpSW5kZXgrKykKKwl7CisJCWlmICgkaUluZGV4ICE9IDApCisJCXsK KwkJCSRzdHJSZXN1bHQgLj0gJywgJzsKKwkJfQorCisJCSRzdHJSZXN1bHQgLj0gJHN0cnlB cnJheVskaUluZGV4XTsKKwl9CisKKwlyZXR1cm4gJHN0clJlc3VsdDsKK30KKworIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnVpbGRNb2R1bGUKKyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjCitzdWIgQnVpbGRNb2R1bGUKK3sKKwljYXB0dXJlKCdjZCAuLjttYWtlJyk7 CisJQ29tbWFuZEV4ZWN1dGUoImNwIC4uL3BnX2F1ZGl0LnNvIiAuCisJCQkJICAgIiAke3N0 clBnU3FsQmlufS8uLi9saWIvcG9zdGdyZXNxbCIpOworCUNvbW1hbmRFeGVjdXRlKCJjcCAu Li9wZ19hdWRpdC5jb250cm9sIiAuCisJCQkJICAgIiAke3N0clBnU3FsQmlufS8uLi9zaGFy ZS9wb3N0Z3Jlc3FsL2V4dGVuc2lvbiIpOworCUNvbW1hbmRFeGVjdXRlKCJjcCAuLi9wZ19h dWRpdC0tMS4wLjAuc3FsIiAuCisJCQkJICAgIiAke3N0clBnU3FsQmlufS8uLi9zaGFyZS9w b3N0Z3Jlc3FsL2V4dGVuc2lvbiIpOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IworIyBQZ0Nvbm5lY3QKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdDb25u ZWN0Cit7CisJbXkgJGlQb3J0ID0gc2hpZnQ7CisKKwkjIFNldCBkZWZhdWx0CisJJGlQb3J0 ID0gZGVmaW5lZCgkaVBvcnQpID8gJGlQb3J0IDogJGlEZWZhdWx0UG9ydDsKKworCSMgTG9n IENvbm5lY3Rpb24KKwkmbG9nKCIgICBEQjogY29ubmVjdCB1c2VyICR7c3RyVXNlcn0sIGRh dGFiYXNlICR7c3RyRGF0YWJhc2V9Iik7CisKKwkjIERpc2Nvbm5lY3QgdXNlciBzZXNzaW9u CisJUGdEaXNjb25uZWN0KCk7CisKKwkjIENvbm5lY3QgdG8gdGhlIGRiCisJJGhEYiA9IERC SS0+Y29ubmVjdCgiZGJpOlBnOmRibmFtZT0ke3N0ckRhdGFiYXNlfTtwb3J0PSR7aVBvcnR9 O2hvc3Q9L3RtcCIsCisJCQkJCQkkc3RyVXNlciwgdW5kZWYsCisJCQkJCQl7QXV0b0NvbW1p dCA9PiAxLCBSYWlzZUVycm9yID0+IDF9KTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKKyMgUGdEaXNjb25uZWN0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3Vi IFBnRGlzY29ubmVjdAoreworCSMgQ29ubmVjdCB0byB0aGUgZGIgKHdoZXRoZXIgaXQgaXMg bG9jYWwgb3IgcmVtb3RlKQorCWlmIChkZWZpbmVkKCRoRGIpKQorCXsKKwkJJGhEYi0+ZGlz Y29ubmVjdDsKKwkJdW5kZWYoJGhEYik7CisJfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIworIyBQZ0V4ZWN1dGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIg UGdFeGVjdXRlCit7CisJbXkgJHN0clNxbCA9IHNoaWZ0OworCisJIyBMb2cgdGhlIHN0YXRl bWVudAorCSZsb2coIiAgU1FMOiAke3N0clNxbH0iKTsKKworCSMgRXhlY3V0ZSB0aGUgc3Rh dGVtZW50CisJbXkgJGhTdGF0ZW1lbnQgPSAkaERiLT5wcmVwYXJlKCRzdHJTcWwpOworCisJ JGhTdGF0ZW1lbnQtPmV4ZWN1dGUoKTsKKwkkaFN0YXRlbWVudC0+ZmluaXNoKCk7Cit9CisK KyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBnRXhlY3V0ZU9ubHkKKyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdFeGVjdXRlT25seQoreworCW15ICRzdHJTcWwg PSBzaGlmdDsKKworCSMgTG9nIHRoZSBzdGF0ZW1lbnQKKwkmbG9nKCIgIFNRTDogJHtzdHJT cWx9Iik7CisKKwkjIEV4ZWN1dGUgdGhlIHN0YXRlbWVudAorCSRoRGItPmRvKCRzdHJTcWwp OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQZ1NldERhdGFiYXNlCisj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3ViIFBnU2V0RGF0YWJhc2UKK3sKKwlteSAk c3RyRGF0YWJhc2VQYXJhbSA9IHNoaWZ0OworCisJIyBTdG9wIGFuZCBzdGFydCB0aGUgZGF0 YWJhc2UgdG8gcmVzZXQgcGdjb25mIGVudHJpZXMKKwlQZ1N0b3AoKTsKKwlQZ1N0YXJ0KCk7 CisKKwkjIEV4ZWN1dGUgdGhlIHN0YXRlbWVudAorCSRzdHJEYXRhYmFzZSA9ICRzdHJEYXRh YmFzZVBhcmFtOworCVBnQ29ubmVjdCgpOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIworIyBQZ1NldFVzZXIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdT ZXRVc2VyCit7CisJbXkgJHN0clVzZXJQYXJhbSA9IHNoaWZ0OworCisJJHN0clVzZXIgPSAk c3RyVXNlclBhcmFtOworCisJIyBTdG9wIGFuZCBzdGFydCB0aGUgZGF0YWJhc2UgdG8gcmVz ZXQgcGdjb25mIGVudHJpZXMKKwlpZiAoKGRlZmluZWQoJHN0clRlbXBvcmFyeUF1ZGl0TG9n KSAmJiAhZGVmaW5lZCgkc3RyQ3VycmVudEF1ZGl0TG9nKSkgfHwKKwkJKGRlZmluZWQoJHN0 ckN1cnJlbnRBdWRpdExvZykgJiYgIWRlZmluZWQoJHN0clRlbXBvcmFyeUF1ZGl0TG9nKSkg fHwKKwkJJHN0ckN1cnJlbnRBdWRpdExvZyBuZSAkc3RyVGVtcG9yYXJ5QXVkaXRMb2cpCisJ eworCQkkc3RyQ3VycmVudEF1ZGl0TG9nID0gJHN0clRlbXBvcmFyeUF1ZGl0TG9nOworCisJ CVBnU3RvcCgpOworCQlQZ1N0YXJ0KCk7CisJfQorCWVsc2UKKwl7CisJCSMgRXhlY3V0ZSB0 aGUgc3RhdGVtZW50CisJCVBnQ29ubmVjdCgpOworCX0KK30KKworIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMKKyMgU2F2ZVN0cmluZworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK K3N1YiBTYXZlU3RyaW5nCit7CisJbXkgJHN0ckZpbGUgPSBzaGlmdDsKKwlteSAkc3RyU3Ry aW5nID0gc2hpZnQ7CisKKwkjIE9wZW4gdGhlIGZpbGUgZm9yIHdyaXRpbmcKKwlteSAkaEZp bGU7CisKKwlvcGVuKCRoRmlsZSwgJz4nLCAkc3RyRmlsZSkKKwkJb3IgY29uZmVzcyAidW5h YmxlIHRvIG9wZW4gJHtzdHJGaWxlfSI7CisKKwlpZiAoJHN0clN0cmluZyBuZSAnJykKKwl7 CisJCXN5c3dyaXRlKCRoRmlsZSwgJHN0clN0cmluZykKKwkJCW9yIGNvbmZlc3MgInVuYWJs ZSB0byB3cml0ZSB0byAke3N0ckZpbGV9OiAkISI7CisJfQorCisJY2xvc2UoJGhGaWxlKTsK K30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUGdMb2dFeGVjdXRlCisjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3ViIFBnTG9nRXhlY3V0ZQoreworCW15ICRzdHJD b21tYW5kID0gc2hpZnQ7CisJbXkgJHN0clNxbCA9IHNoaWZ0OworCW15ICRvRGF0YSA9IHNo aWZ0OworCW15ICRiRXhlY3V0ZSA9IHNoaWZ0OworCW15ICRiV2FpdCA9IHNoaWZ0OworCW15 ICRiTG9nU3FsID0gc2hpZnQ7CisJbXkgJHN0clBhcmFtZXRlciA9IHNoaWZ0OworCW15ICRi RXhwZWN0RXJyb3IgPSBzaGlmdDsKKworCSMgU2V0IGRlZmF1bHRzCisJJGJFeGVjdXRlID0g ZGVmaW5lZCgkYkV4ZWN1dGUpID8gJGJFeGVjdXRlIDogdHJ1ZTsKKwkkYldhaXQgPSBkZWZp bmVkKCRiV2FpdCkgPyAkYldhaXQgOiB0cnVlOworCSRiTG9nU3FsID0gZGVmaW5lZCgkYkxv Z1NxbCkgPyAkYkxvZ1NxbCA6IHRydWU7CisKKwlpZiAoJGJFeGVjdXRlKQorCXsKKwkJZXZh bAorCQl7CisJCQlQZ0V4ZWN1dGVPbmx5KCRzdHJTcWwpOworCQl9OworCisJCWlmICgkQCAm JiAhJGJFeHBlY3RFcnJvcikKKwkJeworCQkJY29uZmVzcyAkQDsKKwkJfQorCX0KKworCVBn TG9nRXhwZWN0KCRzdHJDb21tYW5kLCAkYkxvZ1NxbCA/ICRzdHJTcWwgOiAnJywgJHN0clBh cmFtZXRlciwgJG9EYXRhKTsKKworCWlmICgkYldhaXQpCisJeworCQlQZ0xvZ1dhaXQoKTsK Kwl9Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFF1b3RlQ1NWCisjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3ViIFF1b3RlQ1NWCit7CisJbXkgJHN0ckNTViA9 IHNoaWZ0OworCisJaWYgKGRlZmluZWQoJHN0ckNTVikgJiYKKwkJKGluZGV4KCRzdHJDU1Ys ICcsJykgPj0gMCB8fCBpbmRleCgkc3RyQ1NWLCAnIicpID4gMCB8fAorCQkgaW5kZXgoJHN0 ckNTViwgIlxuIikgPiAwIHx8IGluZGV4KCRzdHJDU1YsICJcciIpID49IDApKQorCXsKKwkJ JHN0ckNTViA9fiBzLyIvIiIvZzsKKwkJJHN0ckNTViA9ICJcIiR7c3RyQ1NWfVwiIjsKKwl9 CisKKwlyZXR1cm4gJHN0ckNTVjsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK KyMgUGdMb2dFeHBlY3QKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdMb2dF eHBlY3QKK3sKKwlteSAkc3RyQ29tbWFuZCA9IHNoaWZ0OworCW15ICRzdHJTcWwgPSBzaGlm dDsKKwlteSAkc3RyUGFyYW1ldGVyID0gc2hpZnQ7CisJbXkgJG9EYXRhID0gc2hpZnQ7CisK KwkjIElmIG9EYXRhIGlzIGZhbHNlIHRoZW4gbm8gbG9nZ2luZworCWlmIChkZWZpbmVkKCRv RGF0YSkgJiYgcmVmKCRvRGF0YSkgZXEgJycgJiYgISRvRGF0YSkKKwl7CisJCXJldHVybjsK Kwl9CisKKwkjIFF1b3RlIFNRTCBpZiBuZWVkcyB0byBiZSBxdW90ZWQKKwkkc3RyU3FsID0g UXVvdGVDU1YoJHN0clNxbCk7CisKKwlpZiAoZGVmaW5lZCgkc3RyUGFyYW1ldGVyKSkKKwl7 CisJCSRzdHJTcWwgLj0gIiwke3N0clBhcmFtZXRlcn0iOworCX0KKworCSMgTG9nIGJhc2Vk IG9uIHNlc3Npb24KKwlpZiAoUGdTaG91bGRMb2coJHN0ckNvbW1hbmQpKQorCXsKKwkJIyBN YWtlIHN1cmUgY2xhc3MgaXMgZGVmaW5lZAorCQlteSAkc3RyQ2xhc3MgPSAkb0NvbW1hbmRI YXNoeyRzdHJDb21tYW5kfXsmQ0xBU1N9OworCisJCWlmICghZGVmaW5lZCgkc3RyQ2xhc3Mp KQorCQl7CisJCQljb25mZXNzICJjbGFzcyBpcyBub3QgZGVmaW5lZCBmb3IgY29tbWFuZCAk e3N0ckNvbW1hbmR9IjsKKwkJfQorCisJCSMgTWFrZSBzdXJlIG9iamVjdCB0eXBlIGlzIGRl ZmluZWQKKwkJbXkgJHN0ck9iamVjdFR5cGUgPSAkb0NvbW1hbmRIYXNoeyRzdHJDb21tYW5k fXsmVFlQRX07CisKKwkJaWYgKCFkZWZpbmVkKCRzdHJPYmplY3RUeXBlKSkKKwkJeworCQkJ Y29uZmVzcyAib2JqZWN0IHR5cGUgaXMgbm90IGRlZmluZWQgZm9yIGNvbW1hbmQgJHtzdHJD b21tYW5kfSI7CisJCX0KKworCQkjIENoZWNrIGZvciBjb21tYW5kIG92ZXJyaWRlCisJCW15 ICRzdHJDb21tYW5kTG9nID0gJHN0ckNvbW1hbmQ7CisKKwkJaWYgKCRvQ29tbWFuZEhhc2h7 JHN0ckNvbW1hbmR9eyZDT01NQU5EfSkKKwkJeworCQkJJHN0ckNvbW1hbmRMb2cgPSAkb0Nv bW1hbmRIYXNoeyRzdHJDb21tYW5kfXsmQ09NTUFORH07CisJCX0KKworCQlteSAkc3RyT2Jq ZWN0TmFtZSA9ICcnOworCisJCWlmIChkZWZpbmVkKCRvRGF0YSkgJiYgcmVmKCRvRGF0YSkg bmUgJ0FSUkFZJykKKwkJeworCQkJJHN0ck9iamVjdE5hbWUgPSBRdW90ZUNTVigkb0RhdGEp OworCQl9CisKKwkJbXkgJHN0ckxvZyAuPSAiU0VTU0lPTiwke3N0ckNsYXNzfSwke3N0ckNv bW1hbmRMb2d9LCIgLgorCQkJCQkgICIke3N0ck9iamVjdFR5cGV9LCR7c3RyT2JqZWN0TmFt ZX0sJHtzdHJTcWx9IjsKKwkJJmxvZygiQVVESVQ6ICR7c3RyTG9nfSIpOworCisJCSRzdHJM b2dFeHBlY3RlZCAuPSAiJHtzdHJMb2d9XG4iOworCX0KKworCSMgTG9nIGJhc2VkIG9uIGdy YW50cworCWlmIChyZWYoJG9EYXRhKSBlcSAnQVJSQVknICYmICgkc3RyQ29tbWFuZCBlcSBD T01NQU5EX1NFTEVDVCB8fAorCQkkb0NvbW1hbmRIYXNoeyRzdHJDb21tYW5kfXsmQ0xBU1N9 IGVxIENMQVNTX1dSSVRFKSkKKwl7CisJCWZvcmVhY2ggbXkgJG9UYWJsZUhhc2ggKEB7JG9E YXRhfSkKKwkJeworCQkJbXkgJHN0ck9iamVjdE5hbWUgPSBRdW90ZUNTVigkeyRvVGFibGVI YXNofXsmTkFNRX0pOworCQkJbXkgJHN0ckNvbW1hbmRMb2cgPSAkeyRvVGFibGVIYXNofXsm Q09NTUFORH07CisKKwkJCWlmIChkZWZpbmVkKCRvQXVkaXRHcmFudEhhc2h7JHN0ckF1ZGl0 Um9sZX0KKwkJCQkJCQkJCQl7JHN0ck9iamVjdE5hbWV9eyRzdHJDb21tYW5kTG9nfSkpCisJ CQl7CisJCQkJbXkgJHN0ckNvbW1hbmRMb2cgPSBkZWZpbmVkKCR7JG9UYWJsZUhhc2h9eyZD T01NQU5EX0xPR30pID8KKwkJCQkJJHskb1RhYmxlSGFzaH17JkNPTU1BTkRfTE9HfSA6ICRz dHJDb21tYW5kTG9nOworCQkJCW15ICRzdHJDbGFzcyA9ICRvQ29tbWFuZEhhc2h7JHN0ckNv bW1hbmRMb2d9eyZDTEFTU307CisJCQkJbXkgJHN0ck9iamVjdFR5cGUgPSAkeyRvVGFibGVI YXNofXsmVFlQRX07CisKKwkJCQlteSAkc3RyTG9nIC49ICJPQkpFQ1QsJHtzdHJDbGFzc30s JHtzdHJDb21tYW5kTG9nfSwiIC4KKwkJCQkJCQkgICIke3N0ck9iamVjdFR5cGV9LCR7c3Ry T2JqZWN0TmFtZX0sJHtzdHJTcWx9IjsKKwkJCQkmbG9nKCJBVURJVDogJHtzdHJMb2d9Iik7 CisKKwkJCQkkc3RyTG9nRXhwZWN0ZWQgLj0gIiR7c3RyTG9nfVxuIjsKKwkJCX0KKwkJfQor CisJCSRvRGF0YSA9IHVuZGVmOworCX0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKKyMgUGdTaG91bGRMb2cKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdT aG91bGRMb2cKK3sKKwlteSAkc3RyQ29tbWFuZCA9IHNoaWZ0OworCisJIyBNYWtlIHN1cmUg Y2xhc3MgaXMgZGVmaW5lZAorCW15ICRzdHJDbGFzcyA9ICRvQ29tbWFuZEhhc2h7JHN0ckNv bW1hbmR9eyZDTEFTU307CisKKwlpZiAoIWRlZmluZWQoJHN0ckNsYXNzKSkKKwl7CisJCWNv bmZlc3MgImNsYXNzIGlzIG5vdCBkZWZpbmVkIGZvciBjb21tYW5kICR7c3RyQ29tbWFuZH0i OworCX0KKworCSMgQ2hlY2sgbG9nZ2luZyBmb3IgdGhlIHJvbGUKKwlteSAkYkxvZyA9IHVu ZGVmOworCisJaWYgKGRlZmluZWQoJG9BdWRpdExvZ0hhc2h7JkNPTlRFWFRfUk9MRX17JHN0 clVzZXJ9KSkKKwl7CisJCSRiTG9nID0gJG9BdWRpdExvZ0hhc2h7JkNPTlRFWFRfUk9MRX17 JHN0clVzZXJ9eyRzdHJDbGFzc307CisJfQorCisJIyBFbHNlIGNoZWNrIGxvZ2dpbmcgZm9y IHRoZSBkYgorCWVsc2lmIChkZWZpbmVkKCRvQXVkaXRMb2dIYXNoeyZDT05URVhUX0RBVEFC QVNFfXskc3RyRGF0YWJhc2V9KSkKKwl7CisJCSRiTG9nID0gJG9BdWRpdExvZ0hhc2h7JkNP TlRFWFRfREFUQUJBU0V9eyRzdHJEYXRhYmFzZX17JHN0ckNsYXNzfTsKKwl9CisKKwkjIEVs c2UgY2hlY2sgbG9nZ2luZyBmb3IgZ2xvYmFsCisJZWxzaWYgKGRlZmluZWQoJG9BdWRpdExv Z0hhc2h7JkNPTlRFWFRfR0xPQkFMfXsmQ09OVEVYVF9HTE9CQUx9KSkKKwl7CisJCSRiTG9n ID0gJG9BdWRpdExvZ0hhc2h7JkNPTlRFWFRfR0xPQkFMfXsmQ09OVEVYVF9HTE9CQUx9eyRz dHJDbGFzc307CisJfQorCisJcmV0dXJuIGRlZmluZWQoJGJMb2cpID8gdHJ1ZSA6IGZhbHNl OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQZ0xvZ1dhaXQKKyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdMb2dXYWl0Cit7CisJbXkgJHN0ckxvZ0Fj dHVhbDsKKworCSMgUnVuIGluIGFuIGV2YWwgYmxvY2sgc2luY2UgZ3JlcCByZXR1cm5zIDEg d2hlbiBub3RoaW5nIHdhcyBmb3VuZAorCWV2YWwKKwl7CisJCSRzdHJMb2dBY3R1YWwgPSBj YXB0dXJlKCJncmVwICdMT0c6ICBBVURJVDogJyIgLgorCQkJCQkJCQkiICR7c3RyVGVzdFBh dGh9L3Bvc3RncmVzcWwubG9nIik7CisJfTsKKworCSMgSWYgYW4gZXJyb3Igd2FzIHJldHVy bmVkLCBjb250aW51ZSBpZiBpdCB3YXMgMSwgb3RoZXJ3aXNlIGNvbmZlc3MKKwlpZiAoJEAp CisJeworCQlteSAkaUV4aXRTdGF0dXMgPSAkPyA+PiA4OworCisJCWlmICgkaUV4aXRTdGF0 dXMgIT0gMSkKKwkJeworCQkJY29uZmVzcyAiZ3JlcCByZXR1cm5lZCAke2lFeGl0U3RhdHVz fSI7CisJCX0KKworCQkkc3RyTG9nQWN0dWFsID0gJyc7CisJfQorCisJIyBTdHJpcCB0aGUg QVVESVQgYW5kIHRpbWVzdGFtcCBmcm9tIHRoZSBhY3R1YWwgbG9nCisJJHN0ckxvZ0FjdHVh bCA9fiBzL3ByZWZpeCBMT0c6ICBBVURJVFw6IC8vZzsKKwkkc3RyTG9nQWN0dWFsID1+IHMv U0VTU0lPTixbMC05XSssWzAtOV0rLC9TRVNTSU9OLC9nOworCSRzdHJMb2dBY3R1YWwgPX4g cy9PQkpFQ1QsWzAtOV0rLFswLTldKywvT0JKRUNULC9nOworCisJIyBTYXZlIHRoZSBsb2dz CisJU2F2ZVN0cmluZygiJHtzdHJUZXN0UGF0aH0vYXVkaXQuYWN0dWFsIiwgJHN0ckxvZ0Fj dHVhbCk7CisJU2F2ZVN0cmluZygiJHtzdHJUZXN0UGF0aH0vYXVkaXQuZXhwZWN0ZWQiLCAk c3RyTG9nRXhwZWN0ZWQpOworCisJQ29tbWFuZEV4ZWN1dGUoImRpZmYgJHtzdHJUZXN0UGF0 aH0vYXVkaXQuZXhwZWN0ZWQiIC4KKwkJCQkgICAiICR7c3RyVGVzdFBhdGh9L2F1ZGl0LmFj dHVhbCIpOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQZ0Ryb3AKKyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdEcm9wCit7CisJbXkgJHN0clBhdGgg PSBzaGlmdDsKKworCSMgU2V0IGRlZmF1bHQKKwkkc3RyUGF0aCA9IGRlZmluZWQoJHN0clBh dGgpID8gJHN0clBhdGggOiAkc3RyVGVzdFBhdGg7CisKKwkjIFN0b3AgdGhlIGNsdXN0ZXIK KwlQZ1N0b3AodHJ1ZSwgJHN0clBhdGgpOworCisJIyBSZW1vdmUgdGhlIGRpcmVjdG9yeQor CUNvbW1hbmRFeGVjdXRlKCJybSAtcmYgJHtzdHJUZXN0UGF0aH0iKTsKK30KKworIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUGdDcmVhdGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjCitzdWIgUGdDcmVhdGUKK3sKKwlteSAkc3RyUGF0aCA9IHNoaWZ0OworCisJIyBT ZXQgZGVmYXVsdAorCSRzdHJQYXRoID0gZGVmaW5lZCgkc3RyUGF0aCkgPyAkc3RyUGF0aCA6 ICRzdHJUZXN0UGF0aDsKKworCUNvbW1hbmRFeGVjdXRlKCIke3N0clBnU3FsQmlufS9pbml0 ZGIgLUQgJHtzdHJQYXRofSAtVSAke3N0clVzZXJ9IiAuCisJCQkJICAgJyAtQSB0cnVzdCA+ IC9kZXYvbnVsbCcpOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQZ1N0 b3AKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdTdG9wCit7CisJbXkgJGJJ bW1lZGlhdGUgPSBzaGlmdDsKKwlteSAkc3RyUGF0aCA9IHNoaWZ0OworCisJIyBTZXQgZGVm YXVsdAorCSRzdHJQYXRoID0gZGVmaW5lZCgkc3RyUGF0aCkgPyAkc3RyUGF0aCA6ICRzdHJU ZXN0UGF0aDsKKwkkYkltbWVkaWF0ZSA9IGRlZmluZWQoJGJJbW1lZGlhdGUpID8gJGJJbW1l ZGlhdGUgOiBmYWxzZTsKKworCSMgRGlzY29ubmVjdCB1c2VyIHNlc3Npb24KKwlQZ0Rpc2Nv bm5lY3QoKTsKKworCSMgSWYgcG9zdG1hc3RlciBwcm9jZXNzIGlzIHJ1bm5pbmcgdGhlbiBz dG9wIHRoZSBjbHVzdGVyCisJaWYgKC1lICRzdHJQYXRoIC4gJy9wb3N0bWFzdGVyLnBpZCcp CisJeworCQlDb21tYW5kRXhlY3V0ZSgiJHtzdHJQZ1NxbEJpbn0vcGdfY3RsIHN0b3AgLUQg JHtzdHJQYXRofSAtdyAtcyAtbSAiIC4KKwkJCQkJICAoJGJJbW1lZGlhdGUgPyAnaW1tZWRp YXRlJyA6ICdmYXN0JykpOworCX0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK KyMgUGdTdGFydAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1YiBQZ1N0YXJ0Cit7 CisJbXkgJGlQb3J0ID0gc2hpZnQ7CisJbXkgJHN0clBhdGggPSBzaGlmdDsKKworCSMgU2V0 IGRlZmF1bHQKKwkkaVBvcnQgPSBkZWZpbmVkKCRpUG9ydCkgPyAkaVBvcnQgOiAkaURlZmF1 bHRQb3J0OworCSRzdHJQYXRoID0gZGVmaW5lZCgkc3RyUGF0aCkgPyAkc3RyUGF0aCA6ICRz dHJUZXN0UGF0aDsKKworCSMgTWFrZSBzdXJlIHBvc3RncmVzIGlzIG5vdCBydW5uaW5nCisJ aWYgKC1lICRzdHJQYXRoIC4gJy9wb3N0bWFzdGVyLnBpZCcpCisJeworCQljb25mZXNzICIk e3N0clBhdGh9L3Bvc3RtYXN0ZXIucGlkIGV4aXN0cywgY2Fubm90IHN0YXJ0IjsKKwl9CisK KwkjIFN0YXJ0IHRoZSBjbHVzdGVyCisJQ29tbWFuZEV4ZWN1dGUoIiR7c3RyUGdTcWxCaW59 L3BnX2N0bCBzdGFydCAtbyBcIiIgLgorCQkJCSAgICItYyBwb3J0PSR7aVBvcnR9IiAuCisJ CQkJICAgIiAtYyB1bml4X3NvY2tldF9kaXJlY3Rvcmllcz0nL3RtcCciIC4KKwkJCQkgICAi IC1jIHNoYXJlZF9wcmVsb2FkX2xpYnJhcmllcz0ncGdfYXVkaXQnIiAuCisJCQkJICAgIiAt YyBsb2dfbWluX21lc3NhZ2VzPWRlYnVnMSIgLgorCQkJCSAgICIgLWMgbG9nX2xpbmVfcHJl Zml4PSdwcmVmaXggJyIgLgorCQkJCSAgICIgLWMgbG9nX3N0YXRlbWVudD1hbGwiIC4KKwkJ CQkgICAoZGVmaW5lZCgkc3RyQ3VycmVudEF1ZGl0TG9nKSA/CisJCQkJCSAgICIgLWMgcGdf YXVkaXQubG9nPScke3N0ckN1cnJlbnRBdWRpdExvZ30nIiA6ICcnKSAuCisJCQkJICAgIiAt YyBwZ19hdWRpdC5yb2xlPScke3N0ckF1ZGl0Um9sZX0nIiAuCisJCQkJICAgIiAtYyBsb2df Y29ubmVjdGlvbnM9b24iIC4KKwkJCQkgICAiXCIgLUQgJHtzdHJQYXRofSAtbCAke3N0clBh dGh9L3Bvc3RncmVzcWwubG9nIC13IC1zIik7CisKKwkjIENvbm5lY3QgdXNlciBzZXNzaW9u CisJUGdDb25uZWN0KCk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBn QXVkaXRMb2dTZXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdBdWRpdExv Z1NldAoreworCW15ICRzdHJDb250ZXh0ID0gc2hpZnQ7CisJbXkgJHN0ck5hbWUgPSBzaGlm dDsKKwlteSBAc3RyeUNsYXNzID0gQF87CisKKwkjIENyZWF0ZSBTUUwgdG8gc2V0IHRoZSBH VUMKKwlteSAkc3RyQ29tbWFuZDsKKwlteSAkc3RyU3FsOworCisJaWYgKCRzdHJDb250ZXh0 IGVxIENPTlRFWFRfR0xPQkFMKQorCXsKKwkJJHN0ckNvbW1hbmQgPSBDT01NQU5EX1NFVDsK KwkJJHN0clNxbCA9ICJzZXQgcGdfYXVkaXQubG9nID0gJyIgLgorCQkJCSAgQXJyYXlUb1N0 cmluZyhAc3RyeUNsYXNzKSAuICInIjsKKwkJJHN0clRlbXBvcmFyeUF1ZGl0TG9nID0gQXJy YXlUb1N0cmluZyhAc3RyeUNsYXNzKTsKKwl9CisJZWxzaWYgKCRzdHJDb250ZXh0IGVxIENP TlRFWFRfUk9MRSkKKwl7CisJCSRzdHJDb21tYW5kID0gQ09NTUFORF9BTFRFUl9ST0xFX1NF VDsKKwkJJHN0clNxbCA9ICJhbHRlciByb2xlICR7c3RyTmFtZX0gc2V0IHBnX2F1ZGl0Lmxv ZyA9ICciIC4KKwkJCQkgIEFycmF5VG9TdHJpbmcoQHN0cnlDbGFzcykgLiAiJyI7CisJfQor CWVsc2UKKwl7CisJCWNvbmZlc3MgInVuYWJsZSB0byBzZXQgcGdfYXVkaXQubG9nIGZvciBj b250ZXh0ICR7c3RyQ29udGV4dH0iOworCX0KKworCSMgUmVzZXQgdGhlIGF1ZGl0IGxvZwor CWlmICgkc3RyQ29udGV4dCBlcSBDT05URVhUX0dMT0JBTCkKKwl7CisJCWRlbGV0ZSgkb0F1 ZGl0TG9nSGFzaHskc3RyQ29udGV4dH0pOworCQkkc3RyTmFtZSA9IENPTlRFWFRfR0xPQkFM OworCX0KKwllbHNlCisJeworCQlkZWxldGUoJG9BdWRpdExvZ0hhc2h7JHN0ckNvbnRleHR9 eyRzdHJOYW1lfSk7CisJfQorCisJIyBTdG9yZSBhbGwgdGhlIGNsYXNzZXMgaW4gdGhlIGhh c2ggYW5kIGJ1aWxkIHRoZSBHVUMKKwlmb3JlYWNoIG15ICRzdHJDbGFzcyAoQHN0cnlDbGFz cykKKwl7CisJCWlmICgkc3RyQ2xhc3MgZXEgQ0xBU1NfQUxMKQorCQl7CisJCQkkb0F1ZGl0 TG9nSGFzaHskc3RyQ29udGV4dH17JHN0ck5hbWV9eyZDTEFTU19EREx9ID0gdHJ1ZTsKKwkJ CSRvQXVkaXRMb2dIYXNoeyRzdHJDb250ZXh0fXskc3RyTmFtZX17JkNMQVNTX0ZVTkNUSU9O fSA9IHRydWU7CisJCQkkb0F1ZGl0TG9nSGFzaHskc3RyQ29udGV4dH17JHN0ck5hbWV9eyZD TEFTU19NSVNDfSA9IHRydWU7CisJCQkkb0F1ZGl0TG9nSGFzaHskc3RyQ29udGV4dH17JHN0 ck5hbWV9eyZDTEFTU19SRUFEfSA9IHRydWU7CisJCQkkb0F1ZGl0TG9nSGFzaHskc3RyQ29u dGV4dH17JHN0ck5hbWV9eyZDTEFTU19XUklURX0gPSB0cnVlOworCQl9CisKKwkJaWYgKGlu ZGV4KCRzdHJDbGFzcywgJy0nKSA9PSAwKQorCQl7CisJCQkkc3RyQ2xhc3MgPSBzdWJzdHIo JHN0ckNsYXNzLCAxKTsKKworCQkJZGVsZXRlKCRvQXVkaXRMb2dIYXNoeyRzdHJDb250ZXh0 fXskc3RyTmFtZX17JHN0ckNsYXNzfSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkkb0F1ZGl0 TG9nSGFzaHskc3RyQ29udGV4dH17JHN0ck5hbWV9eyRzdHJDbGFzc30gPSB0cnVlOworCQl9 CisJfQorCisJUGdMb2dFeGVjdXRlKCRzdHJDb21tYW5kLCAkc3RyU3FsKTsKK30KKworIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUGdBdWRpdEdyYW50U2V0CisjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIworc3ViIFBnQXVkaXRHcmFudFNldAoreworCW15ICRzdHJSb2xl ID0gc2hpZnQ7CisJbXkgJHN0clByaXZpbGVnZSA9IHNoaWZ0OworCW15ICRzdHJPYmplY3Qg PSBzaGlmdDsKKwlteSAkc3RyQ29sdW1uID0gc2hpZnQ7CisKKwkjIENyZWF0ZSBTUUwgdG8g c2V0IHRoZSBncmFudAorCVBnTG9nRXhlY3V0ZShDT01NQU5EX0dSQU5ULCAiR1JBTlQgIiAu CisJCQkJCQkJCShkZWZpbmVkKCRzdHJDb2x1bW4pID8KKwkJCQkJCQkJCWxjKCR7c3RyUHJp dmlsZWdlfSkgLiIgKCR7c3RyQ29sdW1ufSkiIDoKKwkJCQkJCQkJCXVjKCR7c3RyUHJpdmls ZWdlfSkpIC4KKwkJCQkJCQkJIiBPTiBUQUJMRSAke3N0ck9iamVjdH0gVE8gJHtzdHJSb2xl fSAiKTsKKworCSRvQXVkaXRHcmFudEhhc2h7JHN0clJvbGV9eyRzdHJPYmplY3R9eyRzdHJQ cml2aWxlZ2V9ID0gdHJ1ZTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMg UGdBdWRpdEdyYW50UmVzZXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdB dWRpdEdyYW50UmVzZXQKK3sKKwlteSAkc3RyUm9sZSA9IHNoaWZ0OworCW15ICRzdHJQcml2 aWxlZ2UgPSBzaGlmdDsKKwlteSAkc3RyT2JqZWN0ID0gc2hpZnQ7CisJbXkgJHN0ckNvbHVt biA9IHNoaWZ0OworCisJIyBDcmVhdGUgU1FMIHRvIHNldCB0aGUgZ3JhbnQKKwlQZ0xvZ0V4 ZWN1dGUoQ09NTUFORF9SRVZPS0UsICJSRVZPS0UgICIgLiB1Yygke3N0clByaXZpbGVnZX0p IC4KKwkJCQkgKGRlZmluZWQoJHN0ckNvbHVtbikgPyAiICgke3N0ckNvbHVtbn0pIiA6ICcn KSAuCisJCQkJICIgT04gVEFCTEUgJHtzdHJPYmplY3R9IEZST00gJHtzdHJSb2xlfSAiKTsK KworCWRlbGV0ZSgkb0F1ZGl0R3JhbnRIYXNoeyRzdHJSb2xlfXskc3RyT2JqZWN0fXskc3Ry UHJpdmlsZWdlfSk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1haW4K KyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitteSBAb3lUYWJsZTsJICAgIyBTdG9yZSB0 YWJsZSBpbmZvIGZvciBzZWxlY3QsIGluc2VydCwgdXBkYXRlLCBkZWxldGUKK215ICRzdHJT cWw7CQkjIEhvbGQgU3FsIGNvbW1hbmRzCisKKyMgRHJvcCB0aGUgb2xkIGNsdXN0ZXIsIGJ1 aWxkIHRoZSBjb2RlLCBhbmQgY3JlYXRlIGEgbmV3IGNsdXN0ZXIKK1BnRHJvcCgpOworQnVp bGRNb2R1bGUoKTsKK1BnQ3JlYXRlKCk7CitQZ1N0YXJ0KCk7CisKK1BnRXhlY3V0ZSgiY3Jl YXRlIGV4dGVuc2lvbiBwZ19hdWRpdCIpOworCisjIENyZWF0ZSB0ZXN0IHVzZXJzIGFuZCB0 aGUgYXVkaXQgcm9sZQorUGdFeGVjdXRlKCJjcmVhdGUgdXNlciB1c2VyMSIpOworUGdFeGVj dXRlKCJjcmVhdGUgdXNlciB1c2VyMiIpOworUGdFeGVjdXRlKCJjcmVhdGUgcm9sZSAke3N0 ckF1ZGl0Um9sZX0iKTsKKworUGdBdWRpdExvZ1NldChDT05URVhUX0dMT0JBTCwgdW5kZWYs IChDTEFTU19EREwpKTsKKworUGdBdWRpdExvZ1NldChDT05URVhUX1JPTEUsICd1c2VyMics IChDTEFTU19SRUFELCBDTEFTU19XUklURSkpOworCisjIFVzZXIxIGZvbGxvd3MgdGhlIGds b2JhbCBsb2cgc2V0dGluZ3MKK1BnU2V0VXNlcigndXNlcjEnKTsKKworJHN0clNxbCA9ICdD UkVBVEUgIFRBQkxFICBwdWJsaWMudGVzdCAoaWQgcGdfY2F0YWxvZy5pbnQ0ICAgKScgLgor CQkgICcgIFdJVEggKG9pZHM9T0ZGKSAgJzsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0NSRUFU RV9UQUJMRSwgJHN0clNxbCwgJ3B1YmxpYy50ZXN0Jyk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFO RF9TRUxFQ1QsICdzZWxlY3QgKiBmcm9tIHRlc3QnKTsKKworJHN0clNxbCA9ICdkcm9wIHRh YmxlIHRlc3QnOworUGdMb2dFeGVjdXRlKENPTU1BTkRfRFJPUF9UQUJMRSwgJHN0clNxbCwg J3B1YmxpYy50ZXN0Jyk7CisKK1BnU2V0VXNlcigndXNlcjInKTsKK1BnTG9nRXhlY3V0ZShD T01NQU5EX0NSRUFURV9UQUJMRSwKKwkJCSAnY3JlYXRlIHRhYmxlIHRlc3QyIChpZCBpbnQp JywgJ3B1YmxpYy50ZXN0MicpOworUGdBdWRpdEdyYW50U2V0KCRzdHJBdWRpdFJvbGUsICZD T01NQU5EX1NFTEVDVCwgJ3B1YmxpYy50ZXN0MicpOworUGdMb2dFeGVjdXRlKENPTU1BTkRf Q1JFQVRFX1RBQkxFLAorCQkJICdjcmVhdGUgdGFibGUgdGVzdDMgKGlkIGludCknLCAncHVi bGljLnRlc3QyJyk7CisKKyMgQ2F0YWxvZyBzZWxlY3Qgc2hvdWxkIG5vdCBsb2cKK1BnTG9n RXhlY3V0ZShDT01NQU5EX1NFTEVDVCwgJ3NlbGVjdCAqIGZyb20gcGdfY2xhc3MgbGltaXQg MScsCisJCQkJCQkJICAgZmFsc2UpOworCisjIE11bHRpLXRhYmxlIHNlbGVjdAorQG95VGFi bGUgPSAoeyZOQU1FID0+ICdwdWJsaWMudGVzdDMnLCAmVFlQRSA9PiAmVFlQRV9UQUJMRSwK KwkJCSAmQ09NTUFORCA9PiAmQ09NTUFORF9TRUxFQ1R9LAorCQkJeyZOQU1FID0+ICdwdWJs aWMudGVzdDInLCAmVFlQRSA9PiAmVFlQRV9UQUJMRSwKKwkJCSAmQ09NTUFORCA9PiAmQ09N TUFORF9TRUxFQ1R9KTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFTEVDVCwgJ3NlbGVjdCAq IGZyb20gdGVzdDMsIHRlc3QyJywKKwkJCQkJCQkgICBcQG95VGFibGUpOworCisjIFZhcmlv dXMgQ1RFIGNvbWJpbmF0aW9ucworUGdBdWRpdEdyYW50U2V0KCRzdHJBdWRpdFJvbGUsICZD T01NQU5EX0lOU0VSVCwgJ3B1YmxpYy50ZXN0MycpOworCitAb3lUYWJsZSA9ICh7Jk5BTUUg PT4gJ3B1YmxpYy50ZXN0MycsICZUWVBFID0+ICZUWVBFX1RBQkxFLAorCQkJICZDT01NQU5E ID0+ICZDT01NQU5EX0lOU0VSVH0sCisJCQl7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0MicsICZU WVBFID0+ICZUWVBFX1RBQkxFLAorCQkJICZDT01NQU5EID0+ICZDT01NQU5EX1NFTEVDVH0p OworUGdMb2dFeGVjdXRlKENPTU1BTkRfSU5TRVJULAorCQkJICd3aXRoIGN0ZSBhcyAoc2Vs ZWN0IGlkIGZyb20gdGVzdDIpJyAuCisJCQkgJyBpbnNlcnQgaW50byB0ZXN0MyBzZWxlY3Qg aWQgZnJvbSBjdGUnLAorCQkJIFxAb3lUYWJsZSk7CisKK0BveVRhYmxlID0gKHsmTkFNRSA9 PiAncHVibGljLnRlc3QyJywgJlRZUEUgPT4gJlRZUEVfVEFCTEUsCisJCQkgJkNPTU1BTkQg PT4gJkNPTU1BTkRfSU5TRVJUfSwKKwkJCXsmTkFNRSA9PiAncHVibGljLnRlc3QzJywgJlRZ UEUgPT4gJlRZUEVfVEFCTEUsCisJCQkgJkNPTU1BTkQgPT4gJkNPTU1BTkRfSU5TRVJUfSk7 CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9JTlNFUlQsCisJCQkgJ3dpdGggY3RlIGFzIChpbnNl cnQgaW50byB0ZXN0MyB2YWx1ZXMgKDEpIHJldHVybmluZyBpZCknIC4KKwkJCSAnIGluc2Vy dCBpbnRvIHRlc3QyIHNlbGVjdCBpZCBmcm9tIGN0ZScsCisJCQkgXEBveVRhYmxlKTsKKwor UGdBdWRpdEdyYW50U2V0KCRzdHJBdWRpdFJvbGUsICZDT01NQU5EX1VQREFURSwgJ3B1Ymxp Yy50ZXN0MicpOworCitAb3lUYWJsZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0MycsICZU WVBFID0+ICZUWVBFX1RBQkxFLAorCQkJICZDT01NQU5EID0+ICZDT01NQU5EX0lOU0VSVH0s CisJCQl7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0MicsICZUWVBFID0+ICZUWVBFX1RBQkxFLAor CQkJICZDT01NQU5EID0+ICZDT01NQU5EX1VQREFURX0pOworUGdMb2dFeGVjdXRlKENPTU1B TkRfSU5TRVJULAorCQkJICd3aXRoIGN0ZSBhcyAodXBkYXRlIHRlc3QyIHNldCBpZCA9IDEg cmV0dXJuaW5nIGlkKScgLgorCQkJICcgaW5zZXJ0IGludG8gdGVzdDMgc2VsZWN0IGlkIGZy b20gY3RlJywKKwkJCSBcQG95VGFibGUpOworCitAb3lUYWJsZSA9ICh7Jk5BTUUgPT4gJ3B1 YmxpYy50ZXN0MycsICZUWVBFID0+ICZUWVBFX1RBQkxFLAorCQkJICZDT01NQU5EID0+ICZD T01NQU5EX1VQREFURX0sCisJCQl7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0MicsICZUWVBFID0+ ICZUWVBFX1RBQkxFLAorCQkJICZDT01NQU5EID0+ICZDT01NQU5EX0lOU0VSVH0sCisJCQl7 Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0MicsICZUWVBFID0+ICZUWVBFX1RBQkxFLAorCQkJICZD T01NQU5EID0+ICZDT01NQU5EX1NFTEVDVCwgJkNPTU1BTkRfTE9HID0+ICZDT01NQU5EX0lO U0VSVH0pOworUGdMb2dFeGVjdXRlKENPTU1BTkRfVVBEQVRFLAorCQkJICd3aXRoIGN0ZSBh cyAoaW5zZXJ0IGludG8gdGVzdDIgdmFsdWVzICgxKSByZXR1cm5pbmcgaWQpJyAuCisJCQkg JyB1cGRhdGUgdGVzdDMgc2V0IGlkID0gY3RlLmlkJyAuCisJCQkgJyBmcm9tIGN0ZSB3aGVy ZSB0ZXN0My5pZCA8PiBjdGUuaWQnLAorCQkJIFxAb3lUYWJsZSk7CisKK1BnU2V0VXNlcign cG9zdGdyZXMnKTsKK1BnQXVkaXRMb2dTZXQoQ09OVEVYVF9ST0xFLCAndXNlcjInLCAoQ0xB U1NfTk9ORSkpOworUGdTZXRVc2VyKCd1c2VyMicpOworCisjIENvbHVtbi1iYXNlZCBhdWRp dHMKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0NSRUFURV9UQUJMRSwKKwkJCSAnY3JlYXRlIHRh YmxlIHRlc3Q0IChpZCBpbnQsIG5hbWUgdGV4dCknLCAncHVibGljLnRlc3Q0Jyk7CitQZ0F1 ZGl0R3JhbnRTZXQoJHN0ckF1ZGl0Um9sZSwgQ09NTUFORF9TRUxFQ1QsICdwdWJsaWMudGVz dDQnLCAnbmFtZScpOworUGdBdWRpdEdyYW50U2V0KCRzdHJBdWRpdFJvbGUsIENPTU1BTkRf VVBEQVRFLCAncHVibGljLnRlc3Q0JywgJ2lkJyk7CitQZ0F1ZGl0R3JhbnRTZXQoJHN0ckF1 ZGl0Um9sZSwgQ09NTUFORF9JTlNFUlQsICdwdWJsaWMudGVzdDQnLCAnbmFtZScpOworCisj IFNlbGVjdAorQG95VGFibGUgPSAoKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFTEVDVCwg J3NlbGVjdCBpZCBmcm9tIHB1YmxpYy50ZXN0NCcsCisJCQkJCQkJICBcQG95VGFibGUpOwor CitAb3lUYWJsZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0NCcsICZUWVBFID0+ICZUWVBF X1RBQkxFLAorCQkJICZDT01NQU5EID0+ICZDT01NQU5EX1NFTEVDVH0pOworUGdMb2dFeGVj dXRlKENPTU1BTkRfU0VMRUNULCAnc2VsZWN0IG5hbWUgZnJvbSBwdWJsaWMudGVzdDQnLAor CQkJCQkJCSAgXEBveVRhYmxlKTsKKworIyBJbnNlcnQKK0BveVRhYmxlID0gKCk7CitQZ0xv Z0V4ZWN1dGUoQ09NTUFORF9JTlNFUlQsICdpbnNlcnQgaW50byBwdWJsaWMudGVzdDQgKGlk KSB2YWx1ZXMgKDEpJywKKwkJCQkJCQkgICBcQG95VGFibGUpOworCitAb3lUYWJsZSA9ICh7 Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0NCcsICZUWVBFID0+ICZUWVBFX1RBQkxFLAorCQkJICZD T01NQU5EID0+ICZDT01NQU5EX0lOU0VSVH0pOworUGdMb2dFeGVjdXRlKENPTU1BTkRfSU5T RVJULCAiaW5zZXJ0IGludG8gcHVibGljLnRlc3Q0IChuYW1lKSB2YWx1ZXMgKCd0ZXN0Jyki LAorCQkJCQkJCSAgXEBveVRhYmxlKTsKKworIyBVcGRhdGUKK0BveVRhYmxlID0gKCk7CitQ Z0xvZ0V4ZWN1dGUoQ09NTUFORF9VUERBVEUsICJ1cGRhdGUgcHVibGljLnRlc3Q0IHNldCBu YW1lID0gJ2ZvbyciLAorCQkJCQkJCSAgIFxAb3lUYWJsZSk7CisKK0BveVRhYmxlID0gKHsm TkFNRSA9PiAncHVibGljLnRlc3Q0JywgJlRZUEUgPT4gJlRZUEVfVEFCTEUsCisJCQkgJkNP TU1BTkQgPT4gJkNPTU1BTkRfVVBEQVRFfSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9VUERB VEUsICJ1cGRhdGUgcHVibGljLnRlc3Q0IHNldCBpZCA9IDEiLAorCQkJCQkJCSAgXEBveVRh YmxlKTsKKworQG95VGFibGUgPSAoeyZOQU1FID0+ICdwdWJsaWMudGVzdDQnLCAmVFlQRSA9 PiAmVFlQRV9UQUJMRSwKKwkJCSZDT01NQU5EID0+ICZDT01NQU5EX1NFTEVDVCwgJkNPTU1B TkRfTE9HID0+ICZDT01NQU5EX1VQREFURX0pOworUGdMb2dFeGVjdXRlKENPTU1BTkRfVVBE QVRFLAorCQkJICJ1cGRhdGUgcHVibGljLnRlc3Q0IHNldCBuYW1lID0gJ2Zvbycgd2hlcmUg bmFtZSA9ICdiYXInIiwKKwkJCSBcQG95VGFibGUpOworCisjIERyb3AgdGVzdCB0YWJsZXMK K1BnTG9nRXhlY3V0ZShDT01NQU5EX0RST1BfVEFCTEUsICJkcm9wIHRhYmxlIHRlc3QyIiwg J3B1YmxpYy50ZXN0MicpOworUGdMb2dFeGVjdXRlKENPTU1BTkRfRFJPUF9UQUJMRSwgImRy b3AgdGFibGUgdGVzdDMiLCAncHVibGljLnRlc3QzJyk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFO RF9EUk9QX1RBQkxFLCAiZHJvcCB0YWJsZSB0ZXN0NCIsICdwdWJsaWMudGVzdDQnKTsKKwor CisjIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBhdWRpdCBldmVudHMgcGVuZGluZyBp biB0aGUgcG9zdGdyZXMgbG9nCitQZ0xvZ1dhaXQoKTsKKworIyBDcmVhdGUgc29tZSBlbWFp bCBmcmllbmRseSB0ZXN0cy4gIFRoZXNlIGZpcnN0IHRlc3RzIGFyZSBzZXNzaW9uIGxvZ2dp bmcgb25seS4KK1BnU2V0VXNlcigncG9zdGdyZXMnKTsKKworJmxvZygiXG5FeGFtcGxlczoi KTsKKworJmxvZygiXG5TZXNzaW9uIEF1ZGl0OlxuIik7CisKK1BnQXVkaXRMb2dTZXQoQ09O VEVYVF9HTE9CQUwsIHVuZGVmLCAoQ0xBU1NfRERMLCBDTEFTU19SRUFEKSk7CisKK1BnU2V0 VXNlcigndXNlcjEnKTsKKworJHN0clNxbCA9ICdDUkVBVEUgIFRBQkxFICBwdWJsaWMuYWNj b3VudCAoaWQgcGdfY2F0YWxvZy5pbnQ0ICAgLCcgLgorCQkgICcgbmFtZSBwZ19jYXRhbG9n LnRleHQgICBDT0xMQVRFIHBnX2NhdGFsb2cuImRlZmF1bHQiLCAnIC4KKwkJICAncGFzc3dv cmQgcGdfY2F0YWxvZy50ZXh0ICAgQ09MTEFURSBwZ19jYXRhbG9nLiJkZWZhdWx0IiwgJy4K KwkJICAnZGVzY3JpcHRpb24gcGdfY2F0YWxvZy50ZXh0ICAgQ09MTEFURSBwZ19jYXRhbG9n LiJkZWZhdWx0IikgICcuCisJCSAgJ1dJVEggKG9pZHM9T0ZGKSAgJzsKK1BnTG9nRXhlY3V0 ZShDT01NQU5EX0NSRUFURV9UQUJMRSwgJHN0clNxbCwgJ3B1YmxpYy5hY2NvdW50Jyk7CitQ Z0xvZ0V4ZWN1dGUoQ09NTUFORF9TRUxFQ1QsCisJCQkgJ3NlbGVjdCAqIGZyb20gYWNjb3Vu dCcpOworUGdMb2dFeGVjdXRlKENPTU1BTkRfSU5TRVJULAorCQkJICJpbnNlcnQgaW50byBh Y2NvdW50IChpZCwgbmFtZSwgcGFzc3dvcmQsIGRlc2NyaXB0aW9uKSIgLgorCQkJICIgdmFs dWVzICgxLCAndXNlcjEnLCAnSEFTSDEnLCAnYmxhaCwgYmxhaCcpIik7CismbG9nKCJBVURJ VDogPG5vdGhpbmcgbG9nZ2VkPiIpOworCisjIE5vdyB0ZXN0cyBmb3Igb2JqZWN0IGxvZ2dp bmcKKyZsb2coIlxuT2JqZWN0IEF1ZGl0OlxuIik7CisKK1BnU2V0VXNlcigncG9zdGdyZXMn KTsKK1BnQXVkaXRMb2dTZXQoQ09OVEVYVF9HTE9CQUwsIHVuZGVmLCAoQ0xBU1NfTk9ORSkp OworUGdFeGVjdXRlKCJzZXQgcGdfYXVkaXQucm9sZSA9ICdhdWRpdCciKTsKK1BnU2V0VXNl cigndXNlcjEnKTsKKworUGdBdWRpdEdyYW50U2V0KCRzdHJBdWRpdFJvbGUsICZDT01NQU5E X1NFTEVDVCwgJ3B1YmxpYy5hY2NvdW50JywgJ3Bhc3N3b3JkJyk7CisKK0BveVRhYmxlID0g KCk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9TRUxFQ1QsICdzZWxlY3QgaWQsIG5hbWUgZnJv bSBhY2NvdW50JywKKwkJCQkJCQkgIFxAb3lUYWJsZSk7CismbG9nKCJBVURJVDogPG5vdGhp bmcgbG9nZ2VkPiIpOworCitAb3lUYWJsZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy5hY2NvdW50 JywgJlRZUEUgPT4gJlRZUEVfVEFCTEUsCisJCQkgJkNPTU1BTkQgPT4gJkNPTU1BTkRfU0VM RUNUfSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9TRUxFQ1QsICdzZWxlY3QgcGFzc3dvcmQg ZnJvbSBhY2NvdW50JywKKwkJCQkJCQkgIFxAb3lUYWJsZSk7CisKK1BnQXVkaXRHcmFudFNl dCgkc3RyQXVkaXRSb2xlLCAmQ09NTUFORF9VUERBVEUsCisJCQkJJ3B1YmxpYy5hY2NvdW50 JywgJ25hbWUsIHBhc3N3b3JkJyk7CisKK0BveVRhYmxlID0gKCk7CitQZ0xvZ0V4ZWN1dGUo Q09NTUFORF9VUERBVEUsICJ1cGRhdGUgYWNjb3VudCBzZXQgZGVzY3JpcHRpb24gPSAneWFk YSwgeWFkYSciLAorCQkJCQkJCSAgXEBveVRhYmxlKTsKKyZsb2coIkFVRElUOiA8bm90aGlu ZyBsb2dnZWQ+Iik7CisKK0BveVRhYmxlID0gKHsmTkFNRSA9PiAncHVibGljLmFjY291bnQn LCAmVFlQRSA9PiAmVFlQRV9UQUJMRSwKKwkJCSAmQ09NTUFORCA9PiAmQ09NTUFORF9VUERB VEV9KTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1VQREFURSwgInVwZGF0ZSBhY2NvdW50IHNl dCBwYXNzd29yZCA9ICdIQVNIMiciLAorCQkJCQkJCSAgXEBveVRhYmxlKTsKKworIyBOb3cg dGVzdHMgZm9yIHNlc3Npb24vb2JqZWN0IGxvZ2dpbmcKKyZsb2coIlxuU2Vzc2lvbi9PYmpl Y3QgQXVkaXQ6XG4iKTsKKworUGdTZXRVc2VyKCdwb3N0Z3JlcycpOworUGdBdWRpdExvZ1Nl dChDT05URVhUX1JPTEUsICd1c2VyMScsIChDTEFTU19SRUFELCBDTEFTU19XUklURSkpOwor UGdTZXRVc2VyKCd1c2VyMScpOworCitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9DUkVBVEVfVEFC TEUsCisJCQkgJ2NyZWF0ZSB0YWJsZSBhY2NvdW50X3JvbGVfbWFwIChhY2NvdW50X2lkIGlu dCwgcm9sZV9pZCBpbnQpJywKKwkJCSAncHVibGljLmFjY291bnRfcm9sZV9tYXAnKTsKK1Bn QXVkaXRHcmFudFNldCgkc3RyQXVkaXRSb2xlLCAmQ09NTUFORF9TRUxFQ1QsICdwdWJsaWMu YWNjb3VudF9yb2xlX21hcCcpOworCitAb3lUYWJsZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy5h Y2NvdW50JywgJlRZUEUgPT4gJlRZUEVfVEFCTEUsCisJCQkgJkNPTU1BTkQgPT4gJkNPTU1B TkRfU0VMRUNUfSwKKwkJCXsmTkFNRSA9PiAncHVibGljLmFjY291bnRfcm9sZV9tYXAnLCAm VFlQRSA9PiAmVFlQRV9UQUJMRSwKKwkJCSAmQ09NTUFORCA9PiAmQ09NTUFORF9TRUxFQ1R9 KTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFTEVDVCwKKwkJCSAnc2VsZWN0IGFjY291bnQu cGFzc3dvcmQsIGFjY291bnRfcm9sZV9tYXAucm9sZV9pZCBmcm9tIGFjY291bnQnIC4KKwkJ CSAnIGlubmVyIGpvaW4gYWNjb3VudF9yb2xlX21hcCcgLgorCQkJICcgb24gYWNjb3VudC5p ZCA9IGFjY291bnRfcm9sZV9tYXAuYWNjb3VudF9pZCcsCisJCQkgXEBveVRhYmxlKTsKKwor QG95VGFibGUgPSAoeyZOQU1FID0+ICdwdWJsaWMuYWNjb3VudCcsICZUWVBFID0+ICZUWVBF X1RBQkxFLAorCQkJICZDT01NQU5EID0+ICZDT01NQU5EX1NFTEVDVH0pOworUGdMb2dFeGVj dXRlKENPTU1BTkRfU0VMRUNULCAnc2VsZWN0IHBhc3N3b3JkIGZyb20gYWNjb3VudCcsCisJ CQkJCQkJICBcQG95VGFibGUpOworCitAb3lUYWJsZSA9ICgpOworUGdMb2dFeGVjdXRlKENP TU1BTkRfVVBEQVRFLCAidXBkYXRlIGFjY291bnQgc2V0IGRlc2NyaXB0aW9uID0gJ3lhZGEs IHlhZGEnIiwKKwkJCQkJCQkgIFxAb3lUYWJsZSk7CismbG9nKCJBVURJVDogPG5vdGhpbmcg bG9nZ2VkPiIpOworCitAb3lUYWJsZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy5hY2NvdW50Jywg JlRZUEUgPT4gJlRZUEVfVEFCTEUsCisJCQkgJkNPTU1BTkQgPT4gJkNPTU1BTkRfU0VMRUNU LCAmQ09NTUFORF9MT0cgPT4gJkNPTU1BTkRfVVBEQVRFfSk7CitQZ0xvZ0V4ZWN1dGUoQ09N TUFORF9VUERBVEUsCisJCQkgInVwZGF0ZSBhY2NvdW50IHNldCBkZXNjcmlwdGlvbiA9ICd5 YWRhLCB5YWRhJyIgLgorCQkJICIgd2hlcmUgcGFzc3dvcmQgPSAnSEFTSDInIiwKKwkJCSBc QG95VGFibGUpOworCitAb3lUYWJsZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy5hY2NvdW50Jywg JlRZUEUgPT4gJlRZUEVfVEFCTEUsCisJCQkgJkNPTU1BTkQgPT4gJkNPTU1BTkRfVVBEQVRF fSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9VUERBVEUsICJ1cGRhdGUgYWNjb3VudCBzZXQg cGFzc3dvcmQgPSAnSEFTSDInIiwKKwkJCQkJCQkgIFxAb3lUYWJsZSk7CisKKyMgVGVzdCBh bGwgc3FsIGNvbW1hbmRzCismbG9nKCJcbkV4aGF1c3RpdmUgQ29tbWFuZCBUZXN0czpcbiIp OworCitQZ1NldFVzZXIoJ3Bvc3RncmVzJyk7CisKK1BnQXVkaXRMb2dTZXQoQ09OVEVYVF9H TE9CQUwsIHVuZGVmLCAoQ0xBU1NfQUxMKSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9TRVQs ICJzZXQgcGdfYXVkaXQucm9sZSA9ICdhdWRpdCciKTsKKworUGdMb2dFeGVjdXRlKENPTU1B TkRfRE8sICJkbyBcJFwkXCBiZWdpbiByYWlzZSBub3RpY2UgJ3Rlc3QnOyBlbmQ7IFwkXCQ7 Iik7CisKKyRzdHJTcWwgPSAnQ1JFQVRFIFNDSEVNQSAgdGVzdCAnOworUGdMb2dFeGVjdXRl KENPTU1BTkRfQ1JFQVRFX1NDSEVNQSwgJHN0clNxbCwgJ3Rlc3QnKTsKKworIyBUZXN0IENP UFkKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0NPUFlfVE8sCisJCQkgIkNPUFkgcGdfY2xhc3Mg dG8gJyIgLiBhYnNfcGF0aCgkc3RyVGVzdFBhdGgpIC4gIi9jbGFzcy5vdXQnIik7CisKKyRz dHJTcWwgPSAnQ1JFQVRFICBUQUJMRSAgdGVzdC5wZ19jbGFzcyAgV0lUSCAob2lkcz1PRkYp ICAgQVMgU0VMRUNUIHJlbG5hbWUsJyAuCisJCSAgJyByZWxuYW1lc3BhY2UsIHJlbHR5cGUs IHJlbG9mdHlwZSwgcmVsb3duZXIsIHJlbGFtLCByZWxmaWxlbm9kZSwgJyAuCisJCSAgJ3Jl bHRhYmxlc3BhY2UsIHJlbHBhZ2VzLCByZWx0dXBsZXMsIHJlbGFsbHZpc2libGUsIHJlbHRv YXN0cmVsaWQsICcgLgorCQkgICdyZWxoYXNpbmRleCwgcmVsaXNzaGFyZWQsIHJlbHBlcnNp c3RlbmNlLCByZWxraW5kLCByZWxuYXR0cywgJyAuCisJCSAgJ3JlbGNoZWNrcywgcmVsaGFz b2lkcywgcmVsaGFzcGtleSwgcmVsaGFzcnVsZXMsIHJlbGhhc3RyaWdnZXJzLCAnIC4KKwkJ ICAncmVsaGFzc3ViY2xhc3MsIHJlbHJvd3NlY3VyaXR5LCByZWxpc3BvcHVsYXRlZCwgcmVs cmVwbGlkZW50LCAnIC4KKwkJICAncmVsZnJvemVueGlkLCByZWxtaW5teGlkLCByZWxhY2ws IHJlbG9wdGlvbnMgJyAuCisJCSAgJ0ZST00gcGdfY2F0YWxvZy5wZ19jbGFzcyAnOworUGdM b2dFeGVjdXRlKENPTU1BTkRfSU5TRVJULCAkc3RyU3FsLCB1bmRlZiwgdHJ1ZSwgZmFsc2Up OworUGdMb2dFeGVjdXRlKENPTU1BTkRfQ1JFQVRFX1RBQkxFX0FTLCAkc3RyU3FsLCAndGVz dC5wZ19jbGFzcycsIGZhbHNlLCB0cnVlKTsKKworJHN0clNxbCA9ICJDT1BZIHRlc3QucGdf Y2xhc3MgZnJvbSAnIiAuIGFic19wYXRoKCRzdHJUZXN0UGF0aCkgLiAiL2NsYXNzLm91dCci OworUGdMb2dFeGVjdXRlKENPTU1BTkRfSU5TRVJULCAkc3RyU3FsKTsKKyNQZ0xvZ0V4ZWN1 dGUoQ09NTUFORF9DT1BZX0ZST00sICRzdHJTcWwsIHVuZGVmLCBmYWxzZSwgdHJ1ZSk7CisK KyMgVGVzdCBwcmVwYXJlZCBTRUxFQ1QKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1BSRVBBUkVf UkVBRCwKKwkJCSAnUFJFUEFSRSBwZ2NsYXNzc3RtdCAob2lkKSBhcyBzZWxlY3QgKicgLgor CQkJICcgZnJvbSBwZ19jbGFzcyB3aGVyZSBvaWQgPSAkMScpOworUGdMb2dFeGVjdXRlKENP TU1BTkRfRVhFQ1VURV9SRUFELAorCQkJICdFWEVDVVRFIHBnY2xhc3NzdG10ICgxKScpOwor UGdMb2dFeGVjdXRlKENPTU1BTkRfREVBTExPQ0FURSwKKwkJCSAnREVBTExPQ0FURSBwZ2Ns YXNzc3RtdCcpOworCisjIFRlc3QgY3Vyc29yCitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9CRUdJ TiwKKwkJCSAnQkVHSU4nKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0RFQ0xBUkVfQ1VSU09S LAorCQkJICdERUNMQVJFIGN0ZXN0IFNDUk9MTCBDVVJTT1IgRk9SIFNFTEVDVCAqIEZST00g cGdfY2xhc3MnKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0ZFVENILAorCQkJICdGRVRDSCBO RVhUIEZST00gY3Rlc3QnKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0NMT1NFLAorCQkJICdD TE9TRSBjdGVzdCcpOworUGdMb2dFeGVjdXRlKENPTU1BTkRfQ09NTUlULAorCQkJICdDT01N SVQnKTsKKworIyBUZXN0IHByZXBhcmVkIElOU0VSVAorJHN0clNxbCA9ICdDUkVBVEUgIFRB QkxFICB0ZXN0LnRlc3RfaW5zZXJ0IChpZCBwZ19jYXRhbG9nLmludDQgICApICAnIC4KKwkJ ICAnV0lUSCAob2lkcz1PRkYpICAnOworUGdMb2dFeGVjdXRlKENPTU1BTkRfQ1JFQVRFX1RB QkxFLCAkc3RyU3FsLCAndGVzdC50ZXN0X2luc2VydCcpOworCiskc3RyU3FsID0gJ1BSRVBB UkUgcGdjbGFzc3N0bXQgKG9pZCkgYXMgaW5zZXJ0IGludG8gdGVzdC50ZXN0X2luc2VydCAo aWQpICcgLgorCQkgICd2YWx1ZXMgKCQxKSc7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9QUkVQ QVJFX1dSSVRFLCAkc3RyU3FsKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0lOU0VSVCwgJHN0 clNxbCwgdW5kZWYsIGZhbHNlLCBmYWxzZSwgdW5kZWYsICIxIik7CisKKyRzdHJTcWwgPSAn RVhFQ1VURSBwZ2NsYXNzc3RtdCAoMSknOworUGdMb2dFeGVjdXRlKENPTU1BTkRfRVhFQ1VU RV9XUklURSwgJHN0clNxbCwgdW5kZWYsIHRydWUsIHRydWUpOworCisjIENyZWF0ZSBhIHRh YmxlIHdpdGggYSBwcmltYXJ5IGtleQorJHN0clNxbCA9ICdDUkVBVEUgIFRBQkxFICBwdWJs aWMudGVzdCAoaWQgcGdfY2F0YWxvZy5pbnQ0ICAgLCAnIC4KKwkJICAnbmFtZSBwZ19jYXRh bG9nLnRleHQgICBDT0xMQVRFIHBnX2NhdGFsb2cuImRlZmF1bHQiLCBkZXNjcmlwdGlvbiAn IC4KKwkJICAncGdfY2F0YWxvZy50ZXh0ICAgQ09MTEFURSBwZ19jYXRhbG9nLiJkZWZhdWx0 IiwgQ09OU1RSQUlOVCAnIC4KKwkJICAndGVzdF9wa2V5IFBSSU1BUlkgS0VZIChpZCkpICBX SVRIIChvaWRzPU9GRikgICc7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9DUkVBVEVfSU5ERVgs ICRzdHJTcWwsICdwdWJsaWMudGVzdF9wa2V5JywgdHJ1ZSwgZmFsc2UpOworUGdMb2dFeGVj dXRlKENPTU1BTkRfQ1JFQVRFX1RBQkxFLCAkc3RyU3FsLCAncHVibGljLnRlc3QnLCBmYWxz ZSwgdHJ1ZSk7CisKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0FOQUxZWkUsICdhbmFseXplIHRl c3QnKTsKKworIyBHcmFudCBzZWxlY3QgdG8gcHVibGljIC0gdGhpcyBzaG91bGQgaGF2ZSBu byBhZmZlY3Qgb24gYXVkaXRpbmcKKyRzdHJTcWwgPSAnR1JBTlQgU0VMRUNUIE9OIFRBQkxF IHB1YmxpYy50ZXN0IFRPIFBVQkxJQyAnOworUGdMb2dFeGVjdXRlKENPTU1BTkRfR1JBTlQs ICRzdHJTcWwpOworCitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9TRUxFQ1QsICdzZWxlY3QgKiBm cm9tIHRlc3QnKTsKKworIyBOb3cgZ3JhbnQgc2VsZWN0IHRvIGF1ZGl0IGFuZCBpdCBzaG91 bGQgYmUgbG9nZ2VkCitQZ0F1ZGl0R3JhbnRTZXQoJHN0ckF1ZGl0Um9sZSwgJkNPTU1BTkRf U0VMRUNULCAncHVibGljLnRlc3QnKTsKK0BveVRhYmxlID0gKHsmTkFNRSA9PiAncHVibGlj LnRlc3QnLCAmVFlQRSA9PiAmVFlQRV9UQUJMRSwKKwkJCSAmQ09NTUFORCA9PiAmQ09NTUFO RF9TRUxFQ1R9KTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFTEVDVCwgJ3NlbGVjdCAqIGZy b20gdGVzdCcsIFxAb3lUYWJsZSk7CisKKyMgQ2hlY2sgY29sdW1ucyBncmFudGVkIHRvIHB1 YmxpYyBhbmQgbWFrZSBzdXJlIHRoZXkgZG8gbm90IGxvZworUGdBdWRpdEdyYW50UmVzZXQo JHN0ckF1ZGl0Um9sZSwgJkNPTU1BTkRfU0VMRUNULCAncHVibGljLnRlc3QnKTsKKworJHN0 clNxbCA9ICdHUkFOVCBzZWxlY3QgKG5hbWUpIE9OIFRBQkxFIHB1YmxpYy50ZXN0IFRPIFBV QkxJQyAnOworUGdMb2dFeGVjdXRlKENPTU1BTkRfR1JBTlQsICRzdHJTcWwpOworCitQZ0xv Z0V4ZWN1dGUoQ09NTUFORF9TRUxFQ1QsICdzZWxlY3QgKiBmcm9tIHRlc3QnKTsKK1BnTG9n RXhlY3V0ZShDT01NQU5EX1NFTEVDVCwgJ3NlbGVjdCBmcm9tIHRlc3QnKTsKKworIyBUcnkg YSBzZWxlY3QgdGhhdCBkb2VzIG5vdCByZWZlcmVuY2UgYW55IHRhYmxlcworUGdMb2dFeGVj dXRlKENPTU1BTkRfU0VMRUNULCAnc2VsZWN0IDEsIGN1cnJlbnRfdGltZXN0YW1wJyk7CisK KyMgTm93IHRyeSB0aGUgc2FtZSBpbiBhIGRvIGJsb2NrCiskc3RyU3FsID0gJ2RvICQkIGRl Y2xhcmUgdGVzdCBpbnQ7IGJlZ2luIHNlbGVjdCAxIGludG8gdGVzdDsgZW5kICQkJzsKK1Bn TG9nRXhlY3V0ZShDT01NQU5EX0RPLCAkc3RyU3FsLCB1bmRlZiwgdHJ1ZSwgZmFsc2UpOwor Ciskc3RyU3FsID0gJ3NlbGVjdCAxJzsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFTEVDVCwg JHN0clNxbCwgdW5kZWYsIGZhbHNlLCB0cnVlKTsKKworIyBJbnNlcnQgc29tZSBkYXRhIGlu dG8gdGVzdCBhbmQgdHJ5IGEgbG9vcCBpbiBhIGRvIGJsb2NrCitQZ0xvZ0V4ZWN1dGUoQ09N TUFORF9JTlNFUlQsICdpbnNlcnQgaW50byB0ZXN0IChpZCkgdmFsdWVzICgxKScpOworUGdM b2dFeGVjdXRlKENPTU1BTkRfSU5TRVJULCAnaW5zZXJ0IGludG8gdGVzdCAoaWQpIHZhbHVl cyAoMiknKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0lOU0VSVCwgJ2luc2VydCBpbnRvIHRl c3QgKGlkKSB2YWx1ZXMgKDMpJyk7CisKKyRzdHJTcWwgPSAnZG8gJCQgJyAuCisJCSAgJ2Rl Y2xhcmUgJyAuCisJCSAgJwlyZXN1bHQgcmVjb3JkOycgLgorCQkgICdiZWdpbiAnIC4KKwkJ ICAnCWZvciByZXN1bHQgaW4gc2VsZWN0IGlkIGZyb20gdGVzdCBsb29wICcgLgorCQkgICcJ CWluc2VydCBpbnRvIHRlc3QgKGlkKSB2YWx1ZXMgKHJlc3VsdC5pZCArIDEwMCk7ICcgLgor CQkgICcJZW5kIGxvb3A7ICcgLgorCQkgICdlbmQ7ICQkJzsKKworUGdMb2dFeGVjdXRlKENP TU1BTkRfRE8sICRzdHJTcWwsIHVuZGVmLCB0cnVlLCBmYWxzZSk7CisKKyRzdHJTcWwgPSAn c2VsZWN0IGlkIGZyb20gdGVzdCc7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9TRUxFQ1QsICRz dHJTcWwsIHVuZGVmLCBmYWxzZSwgZmFsc2UpOworCiskc3RyU3FsID0gJ2luc2VydCBpbnRv IHRlc3QgKGlkKSB2YWx1ZXMgKHJlc3VsdC5pZCArIDEwMCknOworUGdMb2dFeGVjdXRlKENP TU1BTkRfSU5TRVJULCAkc3RyU3FsLCB1bmRlZiwgZmFsc2UsIGZhbHNlLCB1bmRlZiwgIiws Iik7CisKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0lOU0VSVCwgJHN0clNxbCwgdW5kZWYsIGZh bHNlLCBmYWxzZSwgdW5kZWYsICIsLCIpOworCitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9JTlNF UlQsICRzdHJTcWwsIHVuZGVmLCBmYWxzZSwgZmFsc2UsIHVuZGVmLCAiLCwiKTsKKworIyBU ZXN0IEVYRUNVVEUgd2l0aCBiaW5kCiskc3RyU3FsID0gInNlbGVjdCAqIGZyb20gdGVzdCB3 aGVyZSBpZCA9ID8iOworbXkgJGhTdGF0ZW1lbnQgPSAkaERiLT5wcmVwYXJlKCRzdHJTcWwp OworCiskc3RyU3FsID0gInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSBpZCA9IFwkMSI7Cisk aFN0YXRlbWVudC0+YmluZF9wYXJhbSgxLCAxMDEpOworJGhTdGF0ZW1lbnQtPmV4ZWN1dGUo KTsKKworUGdMb2dFeGVjdXRlKENPTU1BTkRfU0VMRUNULCAkc3RyU3FsLCB1bmRlZiwgZmFs c2UsIGZhbHNlLCB1bmRlZiwgIjEwMSIpOworCiskaFN0YXRlbWVudC0+YmluZF9wYXJhbSgx LCAxMDMpOworJGhTdGF0ZW1lbnQtPmV4ZWN1dGUoKTsKKworUGdMb2dFeGVjdXRlKENPTU1B TkRfU0VMRUNULCAkc3RyU3FsLCB1bmRlZiwgZmFsc2UsIGZhbHNlLCB1bmRlZiwgIjEwMyIp OworCiskaFN0YXRlbWVudC0+ZmluaXNoKCk7CisKKyMgTm93IHRyeSBzb21lIERETCBpbiBh IGRvIGJsb2NrCiskc3RyU3FsID0gJ2RvICQkICcgLgorCQkgICdiZWdpbiAnIC4KKwkJICAn CWNyZWF0ZSB0YWJsZSB0ZXN0X2Jsb2NrIChpZCBpbnQpOyAnIC4KKwkJICAnCWRyb3AgdGFi bGUgdGVzdF9ibG9jazsgJyAuCisJCSAgJ2VuZDsgJCQnOworCitQZ0xvZ0V4ZWN1dGUoQ09N TUFORF9ETywgJHN0clNxbCwgdW5kZWYsIHRydWUsIGZhbHNlKTsKKworJHN0clNxbCA9ICdD UkVBVEUgIFRBQkxFICBwdWJsaWMudGVzdF9ibG9jayAoaWQgcGdfY2F0YWxvZy5pbnQ0ICAg KSAgJyAuCisJCSAgJ1dJVEggKG9pZHM9T0ZGKSAgJzsKK1BnTG9nRXhlY3V0ZShDT01NQU5E X0NSRUFURV9UQUJMRSwgJHN0clNxbCwgJ3B1YmxpYy50ZXN0X2Jsb2NrJywgZmFsc2UsIGZh bHNlKTsKKworJHN0clNxbCA9ICdkcm9wIHRhYmxlIHRlc3RfYmxvY2snOworUGdMb2dFeGVj dXRlKENPTU1BTkRfRFJPUF9UQUJMRSwgJHN0clNxbCwgJ3B1YmxpYy50ZXN0X2Jsb2NrJywg ZmFsc2UsIGZhbHNlKTsKKworIyBHZW5lcmF0ZSBhbiBlcnJvciBpbiBhIGRvIGJsb2NrIGFu ZCBtYWtlIHN1cmUgdGhlIHN0YWNrIGdldHMgY2xlYW5lZCB1cAorJHN0clNxbCA9ICdkbyAk JCAnIC4KKwkJICAnYmVnaW4gJyAuCisJCSAgJwljcmVhdGUgdGFibGUgYm9idXMudGVzdF9i bG9jayAoaWQgaW50KTsgJyAuCisJCSAgJ2VuZDsgJCQnOworCitQZ0xvZ0V4ZWN1dGUoQ09N TUFORF9ETywgJHN0clNxbCwgdW5kZWYsIHVuZGVmLCB1bmRlZiwgdW5kZWYsIHVuZGVmLCB0 cnVlKTsKKyMgUGdMb2dFeGVjdXRlKENPTU1BTkRfU0VMRUNULCAnc2VsZWN0IDEnKTsKKyMg ZXhpdCAwOworCisjIFRyeSBleHBsYWluCitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9TRUxFQ1Qs ICdleHBsYWluIHNlbGVjdCAxJywgdW5kZWYsIHRydWUsIGZhbHNlKTsKK1BnTG9nRXhlY3V0 ZShDT01NQU5EX0VYUExBSU4sICdleHBsYWluIHNlbGVjdCAxJywgdW5kZWYsIGZhbHNlLCB0 cnVlKTsKKworIyBOb3cgc2V0IGdyYW50IHRvIGEgc3BlY2lmaWMgY29sdW1uIHRvIGF1ZGl0 IGFuZCBtYWtlIHN1cmUgaXQgbG9ncworIyBNYWtlIHN1cmUgdGhlIHRoZSBjb252ZXJzZSBp cyB0cnVlCitQZ0F1ZGl0R3JhbnRTZXQoJHN0ckF1ZGl0Um9sZSwgJkNPTU1BTkRfU0VMRUNU LCAncHVibGljLnRlc3QnLAorCQkJCSduYW1lLCBkZXNjcmlwdGlvbicpOworUGdMb2dFeGVj dXRlKENPTU1BTkRfU0VMRUNULCAnc2VsZWN0IGlkIGZyb20gdGVzdCcpOworCitAb3lUYWJs ZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0JywgJlRZUEUgPT4gJlRZUEVfVEFCTEUsCisJ CQkgJkNPTU1BTkQgPT4gJkNPTU1BTkRfU0VMRUNUfSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFO RF9TRUxFQ1QsICdzZWxlY3QgbmFtZSBmcm9tIHRlc3QnLCBcQG95VGFibGUpOworCisjIFRl c3QgYWx0ZXIgYW5kIGRyb3AgdGFibGUgc3RhdGVtZW50cworJHN0clNxbCA9ICdBTFRFUiBU QUJMRSBwdWJsaWMudGVzdCBEUk9QIENPTFVNTiBkZXNjcmlwdGlvbiAnOworUGdMb2dFeGVj dXRlKENPTU1BTkRfQUxURVJfVEFCTEVfQ09MVU1OLAorCQkJICRzdHJTcWwsICdwdWJsaWMu dGVzdC5kZXNjcmlwdGlvbicsIHRydWUsIGZhbHNlKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5E X0FMVEVSX1RBQkxFLAorCQkJICRzdHJTcWwsICdwdWJsaWMudGVzdCcsIGZhbHNlLCB0cnVl KTsKK0BveVRhYmxlID0gKHsmTkFNRSA9PiAncHVibGljLnRlc3QnLCAmVFlQRSA9PiAmVFlQ RV9UQUJMRSwKKwkJCSAmQ09NTUFORCA9PiAmQ09NTUFORF9TRUxFQ1R9KTsKK1BnTG9nRXhl Y3V0ZShDT01NQU5EX1NFTEVDVCwgJ3NlbGVjdCBmcm9tIHRlc3QnLCBcQG95VGFibGUpOwor Ciskc3RyU3FsID0gJ0FMVEVSIFRBQkxFICBwdWJsaWMudGVzdCBSRU5BTUUgVE8gdGVzdDIn OworUGdMb2dFeGVjdXRlKENPTU1BTkRfQUxURVJfVEFCTEUsICRzdHJTcWwsICdwdWJsaWMu dGVzdDInKTsKKworJHN0clNxbCA9ICdBTFRFUiBUQUJMRSBwdWJsaWMudGVzdDIgU0VUIFND SEVNQSB0ZXN0JzsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0FMVEVSX1RBQkxFLCAkc3RyU3Fs LCAndGVzdC50ZXN0MicpOworCiskc3RyU3FsID0gJ0FMVEVSIFRBQkxFIHRlc3QudGVzdDIg QUREIENPTFVNTiBkZXNjcmlwdGlvbiBwZ19jYXRhbG9nLnRleHQgICAnIC4KKwkJICAnQ09M TEFURSBwZ19jYXRhbG9nLiJkZWZhdWx0Iic7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9BTFRF Ul9UQUJMRSwgJHN0clNxbCwgJ3Rlc3QudGVzdDInKTsKKworJHN0clNxbCA9ICdBTFRFUiBU QUJMRSB0ZXN0LnRlc3QyIERST1AgQ09MVU1OIGRlc2NyaXB0aW9uICc7CitQZ0xvZ0V4ZWN1 dGUoQ09NTUFORF9BTFRFUl9UQUJMRV9DT0xVTU4sICRzdHJTcWwsCisJCQkgJ3Rlc3QudGVz dDIuZGVzY3JpcHRpb24nLCB0cnVlLCBmYWxzZSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9B TFRFUl9UQUJMRSwgJHN0clNxbCwKKwkJCSAndGVzdC50ZXN0MicsIGZhbHNlLCB0cnVlKTsK KworJHN0clNxbCA9ICdkcm9wIHRhYmxlIHRlc3QudGVzdDInOworUGdMb2dFeGVjdXRlKENP TU1BTkRfRFJPUF9UQUJMRSwgJHN0clNxbCwgJ3Rlc3QudGVzdDInLCB0cnVlLCBmYWxzZSk7 CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9EUk9QX1RBQkxFX0NPTlNUUkFJTlQsICRzdHJTcWws ICd0ZXN0X3BrZXkgb24gdGVzdC50ZXN0MicsCisJCQkgZmFsc2UsIGZhbHNlKTsKK1BnTG9n RXhlY3V0ZShDT01NQU5EX0RST1BfVEFCTEVfSU5ERVgsICRzdHJTcWwsICd0ZXN0LnRlc3Rf cGtleScsIGZhbHNlLCB0cnVlKTsKKworJHN0clNxbCA9ICJDUkVBVEUgIEZVTkNUSU9OIHB1 YmxpYy5pbnRfYWRkKElOIGEgcGdfY2F0YWxvZy5pbnQ0ICwgSU4gYiAiIC4KKwkJICAicGdf Y2F0YWxvZy5pbnQ0ICkgUkVUVVJOUyAgcGdfY2F0YWxvZy5pbnQ0IExBTkdVQUdFIHBscGdz cWwgICIgLgorCQkgICJWT0xBVElMRSAgQ0FMTEVEIE9OIE5VTEwgSU5QVVQgU0VDVVJJVFkg SU5WT0tFUiBDT1NUIDEwMCAgIEFTICciIC4KKwkJICAiIGJlZ2luIHJldHVybiBhICsgYjsg ZW5kICciOworUGdMb2dFeGVjdXRlKENPTU1BTkRfQ1JFQVRFX0ZVTkNUSU9OLCAkc3RyU3Fs LAorCQkJICdwdWJsaWMuaW50X2FkZChpbnRlZ2VyLGludGVnZXIpJyk7CitQZ0xvZ0V4ZWN1 dGUoQ09NTUFORF9TRUxFQ1QsICJzZWxlY3QgaW50X2FkZCgxLCAxKSIsCisJCQkJCQkJIHVu ZGVmLCB0cnVlLCBmYWxzZSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9FWEVDVVRFX0ZVTkNU SU9OLCAic2VsZWN0IGludF9hZGQoMSwgMSkiLAorCQkJCQkJCQkJICAgJ3B1YmxpYy5pbnRf YWRkJywgZmFsc2UsIHRydWUpOworCiskc3RyU3FsID0gIkNSRUFURSBBR0dSRUdBVEUgcHVi bGljLnN1bV90ZXN0KCAgcGdfY2F0YWxvZy5pbnQ0KSAiIC4KKwkJICAiKFNGVU5DPXB1Ymxp Yy5pbnRfYWRkLCBTVFlQRT1wZ19jYXRhbG9nLmludDQsIElOSVRDT05EPScwJykiOworUGdM b2dFeGVjdXRlKENPTU1BTkRfQ1JFQVRFX0FHR1JFR0FURSwgJHN0clNxbCwgJ3B1YmxpYy5z dW1fdGVzdChpbnRlZ2VyKScpOworCisjIFRoZXJlJ3MgYSBidWcgaGVyZSBpbiBkZXBhcnNl OgorJHN0clNxbCA9ICJBTFRFUiBBR0dSRUdBVEUgcHVibGljLnN1bV90ZXN0KGludGVnZXIp IFJFTkFNRSBUTyBzdW1fdGVzdDIiOworUGdMb2dFeGVjdXRlKENPTU1BTkRfQUxURVJfQUdH UkVHQVRFLCAkc3RyU3FsLCAncHVibGljLnN1bV90ZXN0MihpbnRlZ2VyKScpOworCiskc3Ry U3FsID0gIkNSRUFURSBDT0xMQVRJT04gcHVibGljLmNvbGxhdGlvbl90ZXN0IChMQ19DT0xM QVRFID0gJ2RlX0RFJywgIiAuCisJCSAgIkxDX0NUWVBFID0gJ2RlX0RFJykiOworUGdMb2dF eGVjdXRlKENPTU1BTkRfQ1JFQVRFX0NPTExBVElPTiwgJHN0clNxbCwgJ3B1YmxpYy5jb2xs YXRpb25fdGVzdCcpOworCiskc3RyU3FsID0gICJBTFRFUiBDT0xMQVRJT04gcHVibGljLmNv bGxhdGlvbl90ZXN0IFJFTkFNRSBUTyBjb2xsYXRpb25fdGVzdDIiOworUGdMb2dFeGVjdXRl KENPTU1BTkRfQUxURVJfQ09MTEFUSU9OLCAkc3RyU3FsLCAncHVibGljLmNvbGxhdGlvbl90 ZXN0MicpOworCiskc3RyU3FsID0gIkNSRUFURSAgQ09OVkVSU0lPTiBwdWJsaWMuY29udmVy c2lvbl90ZXN0IEZPUiAnU1FMX0FTQ0lJJyAiIC4KKwkJICAiVE8gJ01VTEVfSU5URVJOQUwn IEZST00gcGdfY2F0YWxvZy5hc2NpaV90b19taWMiOworUGdMb2dFeGVjdXRlKENPTU1BTkRf Q1JFQVRFX0NPTlZFUlNJT04sICRzdHJTcWwsICdwdWJsaWMuY29udmVyc2lvbl90ZXN0Jyk7 CisKKyRzdHJTcWwgPSAiQUxURVIgQ09OVkVSU0lPTiBwdWJsaWMuY29udmVyc2lvbl90ZXN0 IFJFTkFNRSBUTyBjb252ZXJzaW9uX3Rlc3QyIjsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0FM VEVSX0NPTlZFUlNJT04sICRzdHJTcWwsICdwdWJsaWMuY29udmVyc2lvbl90ZXN0MicpOwor CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9DUkVBVEVfREFUQUJBU0UsICJDUkVBVEUgREFUQUJB U0UgZGF0YWJhc2VfdGVzdCIpOworUGdMb2dFeGVjdXRlKENPTU1BTkRfQUxURVJfREFUQUJB U0UsCisJCQkgIkFMVEVSIERBVEFCQVNFIGRhdGFiYXNlX3Rlc3QgcmVuYW1lIHRvIGRhdGFi YXNlX3Rlc3QyIik7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9EUk9QX0RBVEFCQVNFLCAiRFJP UCBEQVRBQkFTRSBkYXRhYmFzZV90ZXN0MiIpOworCisjIE1ha2Ugc3VyZSB0aGVyZSBhcmUg bm8gbW9yZSBhdWRpdCBldmVudHMgcGVuZGluZyBpbiB0aGUgcG9zdGdyZXMgbG9nCitQZ0xv Z1dhaXQoKTsKKworIyBTdG9wIHRoZSBkYXRhYmFzZQoraWYgKCEkYk5vQ2xlYW51cCkKK3sK KwlQZ0Ryb3AoKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9jb250cmliLnNnbWwg Yi9kb2Mvc3JjL3NnbWwvY29udHJpYi5zZ21sCmluZGV4IGE2OThkMGYuLjViMjQ3YTkgMTAw NjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9jb250cmliLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21s L2NvbnRyaWIuc2dtbApAQCAtMTI0LDYgKzEyNCw3IEBAIENSRUFURSBFWFRFTlNJT04gPHJl cGxhY2VhYmxlPm1vZHVsZV9uYW1lPC8+IEZST00gdW5wYWNrYWdlZDsKICAmbHRyZWU7CiAg JnBhZ2VpbnNwZWN0OwogICZwYXNzd29yZGNoZWNrOworICZwZ2F1ZGl0OwogICZwZ2J1ZmZl cmNhY2hlOwogICZwZ2NyeXB0bzsKICAmcGdmcmVlc3BhY2VtYXA7CmRpZmYgLS1naXQgYS9k b2Mvc3JjL3NnbWwvZmlsZWxpc3Quc2dtbCBiL2RvYy9zcmMvc2dtbC9maWxlbGlzdC5zZ21s CmluZGV4IDg5ZmZmNzcuLjZiMGI0MDcgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9maWxl bGlzdC5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9maWxlbGlzdC5zZ21sCkBAIC0xMjUsNiAr MTI1LDcgQEAKIDwhRU5USVRZIG9pZDJuYW1lICAgICAgICBTWVNURU0gIm9pZDJuYW1lLnNn bWwiPgogPCFFTlRJVFkgcGFnZWluc3BlY3QgICAgIFNZU1RFTSAicGFnZWluc3BlY3Quc2dt bCI+CiA8IUVOVElUWSBwYXNzd29yZGNoZWNrICAgU1lTVEVNICJwYXNzd29yZGNoZWNrLnNn bWwiPgorPCFFTlRJVFkgcGdhdWRpdCAgICAgICAgIFNZU1RFTSAicGdhdWRpdC5zZ21sIj4K IDwhRU5USVRZIHBnYmVuY2ggICAgICAgICBTWVNURU0gInBnYmVuY2guc2dtbCI+CiA8IUVO VElUWSBwZ2FyY2hpdmVjbGVhbnVwIFNZU1RFTSAicGdhcmNoaXZlY2xlYW51cC5zZ21sIj4K IDwhRU5USVRZIHBnYnVmZmVyY2FjaGUgICBTWVNURU0gInBnYnVmZmVyY2FjaGUuc2dtbCI+ CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvcGdhdWRpdC5zZ21sIGIvZG9jL3NyYy9zZ21s L3BnYXVkaXQuc2dtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTE1 MmNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NyYy9zZ21sL3BnYXVkaXQuc2dtbApAQCAt MCwwICsxLDMzNSBAQAorPCEtLSBkb2Mvc3JjL3NnbWwvcGdhdWRpdC5zZ21sIC0tPgorCis8 c2VjdDEgaWQ9InBnYXVkaXQiIHhyZWZsYWJlbD0icGdhdWRpdCI+CisgIDx0aXRsZT5wZ19h dWRpdDwvdGl0bGU+CisKKyAgPGluZGV4dGVybSB6b25lPSJwZ2F1ZGl0Ij4KKyAgICA8cHJp bWFyeT5wZ19hdWRpdDwvcHJpbWFyeT4KKyAgPC9pbmRleHRlcm0+CisKKyAgPHBhcmE+Cisg ICAgVGhlIDxmaWxlbmFtZT5wZ19hdWRpdDwvZmlsZW5hbWU+IG1vZHVsZSBwcm92aWRlcyBz ZXNzaW9uIGFuZCBvYmplY3QKKyAgICBhdWRpdGluZyB2aWEgdGhlIHN0YW5kYXJkIGxvZ2dp bmcgZmFjaWxpdHkuICBTZXNzaW9uIGFuZCBvYmplY3QgYXVkaXRpbmcgYXJlCisgICAgY29t cGxldGVseSBpbmRlcGVuZGVudCBhbmQgY2FuIGJlIGNvbWJpbmVkLgorICA8L3BhcmE+CisK KyAgPHNlY3QyPgorICAgIDx0aXRsZT5TZXNzaW9uIEF1ZGl0aW5nPC90aXRsZT4KKworICAg IDxwYXJhPgorICAgICAgU2Vzc2lvbiBhdWRpdGluZyBhbGxvd3MgdGhlIGxvZ2dpbmcgb2Yg YWxsIGNvbW1hbmRzIHRoYXQgYXJlIGV4ZWN1dGVkIGJ5CisgICAgICBhIHVzZXIgaW4gdGhl IGJhY2tlbmQuICBFYWNoIGNvbW1hbmQgaXMgbG9nZ2VkIHdpdGggYSBzaW5nbGUgZW50cnkg YW5kCisgICAgICBpbmNsdWRlcyB0aGUgYXVkaXQgdHlwZSAoZS5nLiA8bGl0ZXJhbD5TRVNT SU9OPC9saXRlcmFsPiksIGNvbW1hbmQgdHlwZQorICAgICAgKGUuZy4gPGxpdGVyYWw+Q1JF QVRFIFRBQkxFPC9saXRlcmFsPiwgPGxpdGVyYWw+U0VMRUNUPC9saXRlcmFsPikgYW5kCisg ICAgICBzdGF0ZW1lbnQgKGUuZy4gPGxpdGVyYWw+InNlbGVjdCAqIGZyb20gdGVzdCI8L2xp dGVyYWw+KS4KKworICAgICAgRnVsbHktcXVhbGlmaWVkIG5hbWVzIGFuZCBvYmplY3QgdHlw ZXMgd2lsbCBiZSBsb2dnZWQgZm9yCisgICAgICA8bGl0ZXJhbD5DUkVBVEU8L2xpdGVyYWw+ LCA8bGl0ZXJhbD5VUERBVEU8L2xpdGVyYWw+LCBhbmQKKyAgICAgIDxsaXRlcmFsPkRST1A8 L2xpdGVyYWw+IGNvbW1hbmRzIG9uIDxsaXRlcmFsPlRBQkxFPC9saXRlcmFsPiwKKyAgICAg IDxsaXRlcmFsPk1BVFZJRVc8L2xpdGVyYWw+LCA8bGl0ZXJhbD5WSUVXPC9saXRlcmFsPiwK KyAgICAgIDxsaXRlcmFsPklOREVYPC9saXRlcmFsPiwgPGxpdGVyYWw+Rk9SRUlHTiBUQUJM RTwvbGl0ZXJhbD4sCisgICAgICA8bGl0ZXJhbD5DT01QT1NJVEUgVFlQRTwvbGl0ZXJhbD4s IDxsaXRlcmFsPklOREVYPC9saXRlcmFsPiwgYW5kCisgICAgICA8bGl0ZXJhbD5TRVFVRU5D RTwvbGl0ZXJhbD4gb2JqZWN0cyBhcyB3ZWxsIGFzIGZ1bmN0aW9uIGNhbGxzLgorICAgIDwv cGFyYT4KKworICAgIDxzZWN0Mz4KKyAgICAgIDx0aXRsZT5Db25maWd1cmF0aW9uPC90aXRs ZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFNlc3Npb24gbG9nZ2luZyBpcyBjb250cm9s bGVkIGJ5IHRoZSA8bGl0ZXJhbD5wZ19hdWRpdC5sb2c8L2xpdGVyYWw+CisgICAgICAgIEdV Qy4gVGhlcmUgYXJlIHNpeCBjbGFzc2VzIG9mIGNvbW1hbmRzIHRoYXQgYXJlIHJlY29nbml6 ZWQ6CisKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8bGlzdGl0ZW0+Cisg ICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgPGxpdGVyYWw+UkVBRDwvbGl0ZXJh bD4gLSA8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+IGFuZAorICAgICAgICAgICAgICA8bGl0 ZXJhbD5DT1BZPC9saXRlcmFsPiB3aGVuIHRoZSBzb3VyY2UgaXMgYSB0YWJsZSBvciBxdWVy eS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAg ICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICA8bGl0 ZXJhbD5XUklURTwvbGl0ZXJhbD4gLSA8bGl0ZXJhbD5JTlNFUlQ8L2xpdGVyYWw+LAorICAg ICAgICAgICAgICA8bGl0ZXJhbD5VUERBVEU8L2xpdGVyYWw+LCA8bGl0ZXJhbD5ERUxFVEU8 L2xpdGVyYWw+LAorICAgICAgICAgICAgICA8bGl0ZXJhbD5UUlVOQ0FURTwvbGl0ZXJhbD4s IGFuZCA8bGl0ZXJhbD5DT1BZPC9saXRlcmFsPiB3aGVuIHRoZQorICAgICAgICAgICAgICBk ZXN0aW5hdGlvbiBpcyBhIHRhYmxlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAg IDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+ CisgICAgICAgICAgICAgIDxsaXRlcmFsPkZVTkNUSU9OPC9saXRlcmFsPiAtIEZ1bmN0aW9u IGNhbGxzIGFuZAorICAgICAgICAgICAgICA8bGl0ZXJhbD5ETzwvbGl0ZXJhbD4gYmxvY2tz LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAg ICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIDxsaXRl cmFsPkRETDwvbGl0ZXJhbD4gLSBEREwsIHBsdXMgPGxpdGVyYWw+VkFDVVVNPC9saXRlcmFs PiwKKyAgICAgICAgICAgICAgPGxpdGVyYWw+UkVJTkRFWDwvbGl0ZXJhbD4sIGFuZCA8bGl0 ZXJhbD5BTkFMWVpFPC9saXRlcmFsPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAg ICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJh PgorICAgICAgICAgICAgICA8bGl0ZXJhbD5QQVJBTUVURVI8L2xpdGVyYWw+IC0gUGFyYW1l dGVycyB0aGF0IHdlcmUgcGFzc2VkIGZvciB0aGUgc3RhdGVtZW50LiAgUGFyYW1ldGVycyBp bW1lZGlhdGVseSBmb2xsb3cgdGhlIHN0YXRlbWVudCB0ZXh0LiAKKyAgICAgICAgICAgIDwv cGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAg ICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICA8bGl0ZXJhbD5NSVNDPC9saXRlcmFs PiAtIE1pc2NlbGxhbmVvdXMgY29tbWFuZHMsIGUuZy4KKyAgICAgICAgICAgICAgPGxpdGVy YWw+RElTQ0FSRDwvbGl0ZXJhbD4sIDxsaXRlcmFsPkZFVENIPC9saXRlcmFsPiwKKyAgICAg ICAgICAgICAgPGxpdGVyYWw+Q0hFQ0tQT0lOVDwvbGl0ZXJhbD4uCisgICAgICAgICAgICA8 L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+ CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBFbmFibGUgc2Vzc2lv biBsb2dnaW5nIGZvciBhbGwgd3JpdGVzIGFuZCBEREw6CisgICAgICAgICAgPHByb2dyYW1s aXN0aW5nPgorcGdfYXVkaXQubG9nID0gJ3dyaXRlLCBkZGwnCisgICAgICAgICAgPC9wcm9n cmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEVu YWJsZSBzZXNzaW9uIGxvZ2dpbmcgZm9yIGFsbCBjb21tYW5kcyBleGNlcHQgbWlzY2VsbGFu ZW91czoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CitwZ19hdWRpdC5sb2cgPSAnYWxs LCAtbWlzYycKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgor ICAgICAgCisgICAgICA8cGFyYT4KKyAgICAgIE5vdGUgdGhhdCA8bGl0ZXJhbD5wZ19hdWRp dC5sb2c8L2xpdGVyYWw+IGNhbiBiZSBzZXQgZ2xvYmFsbHkgKGluIAorICAgICAgPGZpbGVu YW1lPnBvc3RncmVzcWwuY29uZjwvZmlsZW5hbWU+KSwgYXQgdGhlIGRhdGFiYXNlIGxldmVs ICh1c2luZworICAgICAgPGxpdGVyYWw+YWx0ZXIgZGF0YWJhc2UgLi4uIHNldDwvbGl0ZXJh bD4pLCBvciBhdCB0aGUgcm9sZSBsZXZlbCAodXNpbmcKKyAgICAgIDxsaXRlcmFsPmFsdGVy IHJvbGUgLi4uIHNldDwvbGl0ZXJhbD4pLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDM+ CisKKyAgICA8c2VjdDM+CisgICAgICA8dGl0bGU+RXhhbXBsZXM8L3RpdGxlPgorCisgICAg ICA8cGFyYT4KKyAgICAgICAgU2V0IDxsaXRlcmFsPnBnX2F1ZGl0LmxvZyA9ICdyZWFkLCBk ZGwnPC9saXRlcmFsPiBpbgorICAgICAgICA8bGl0ZXJhbD5wb3N0Z3Jlc3FsLmNvbmY8L2xp dGVyYWw+LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgU1FMOgor ICAgICAgPC9wYXJhPgorCisgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CitjcmVhdGUgdGFibGUg YWNjb3VudAorKAorICAgIGlkIGludCwKKyAgICBuYW1lIHRleHQsCisgICAgcGFzc3dvcmQg dGV4dCwKKyAgICBkZXNjcmlwdGlvbiB0ZXh0CispOworCitzZWxlY3QgKgorICAgIGZyb20g YWNjb3VudDsKKworaW5zZXJ0IGludG8gYWNjb3VudCAoaWQsIG5hbWUsIHBhc3N3b3JkLCBk ZXNjcmlwdGlvbikKKyAgICAgICAgICAgICB2YWx1ZXMgKDEsICd1c2VyMScsICdIQVNIMScs ICdibGFoLCBibGFoJyk7CisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICA8cGFy YT4KKyAgICAgICAgTG9nIE91dHB1dDoKKyAgICAgIDwvcGFyYT4KKworICAgICAgPHByb2dy YW1saXN0aW5nPgorQVVESVQ6IFNFU1NJT04sRERMLENSRUFURSBUQUJMRSxUQUJMRSxwdWJs aWMuYWNjb3VudCxjcmVhdGUgdGFibGUgYWNjb3VudAorKAorICAgIGlkIGludCwKKyAgICBu YW1lIHRleHQsCisgICAgcGFzc3dvcmQgdGV4dCwKKyAgICBkZXNjcmlwdGlvbiB0ZXh0Cisp OworQVVESVQ6IFNFU1NJT04sUkVBRCxTRUxFQ1QsLCxzZWxlY3QgKgorICAgIGZyb20gYWNj b3VudAorICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3NlY3QzPgorICA8L3NlY3Qy PgorCisgIDxzZWN0Mj4KKyAgICA8dGl0bGU+T2JqZWN0IEF1ZGl0aW5nPC90aXRsZT4KKwor ICAgIDxwYXJhPgorICAgICAgT2JqZWN0IGF1ZGl0aW5nIGxvZ3MgY29tbWFuZHMgdGhhdCBh ZmZlY3QgYSBwYXJ0aWN1bGFyIG9iamVjdC4gIE9ubHkKKyAgICAgIDxsaXRlcmFsPlNFTEVD VDwvbGl0ZXJhbD4sIDxsaXRlcmFsPklOU0VSVDwvbGl0ZXJhbD4sCisgICAgICA8bGl0ZXJh bD5VUERBVEU8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5ERUxFVEU8L2xpdGVyYWw+IGNvbW1h bmRzIGFyZQorICAgICAgc3VwcG9ydGVkLgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0Mz4K KyAgICAgIDx0aXRsZT5Db25maWd1cmF0aW9uPC90aXRsZT4KKworICAgICAgPHBhcmE+Cisg ICAgICAgIE9iamVjdC1sZXZlbCBhdWRpdGluZyBpcyBpbXBsZW1lbnRlZCB2aWEgdGhlIHJv bGVzIHN5c3RlbS4gIFRoZQorICAgICAgICA8bGl0ZXJhbD5wZ19hdWRpdC5yb2xlPC9saXRl cmFsPiBHVUMgZGVmaW5lcyB0aGUgcm9sZSB0aGF0IHdpbGwgYmUgdXNlZAorICAgICAgICBm b3IgYXVkaXRpbmcuICBBbiBvYmplY3Qgd2lsbCBiZSBhdWRpdGVkIHdoZW4gdGhlIGF1ZGl0 IHJvbGUgaGFzCisgICAgICAgIHBlcm1pc3Npb25zIGZvciB0aGUgY29tbWFuZCBleGVjdXRl ZCBvciBpbmhlcml0cyB0aGUgcGVybWlzc2lvbnMgZnJvbQorICAgICAgICBhbm90aGVyIHJv bGUuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwcm9ncmFtbGlzdGluZz4KK3Bvc3RyZXNx bC5jb25mOiBwZ19hdWRpdC5yb2xlID0gJ2F1ZGl0JworCitncmFudCBzZWxlY3QsIGRlbGV0 ZQorICAgb24gcHVibGljLmFjY291bnQ7CisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorCisg ICAgICA8cGFyYT4KKyAgICAgIE5vdGUgdGhhdCA8bGl0ZXJhbD5wZ19hdWRpdC5yb2xlPC9s aXRlcmFsPiBjYW4gYmUgc2V0IGdsb2JhbGx5IChpbiAKKyAgICAgIDxmaWxlbmFtZT5wb3N0 Z3Jlc3FsLmNvbmY8L2ZpbGVuYW1lPiksIGF0IHRoZSBkYXRhYmFzZSBsZXZlbCAodXNpbmcK KyAgICAgIDxsaXRlcmFsPmFsdGVyIGRhdGFiYXNlIC4uLiBzZXQ8L2xpdGVyYWw+KSwgb3Ig YXQgdGhlIHJvbGUgbGV2ZWwgKHVzaW5nCisgICAgICA8bGl0ZXJhbD5hbHRlciByb2xlIC4u LiBzZXQ8L2xpdGVyYWw+KS4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QzPgorCisgICAg PHNlY3QzPgorICAgICAgPHRpdGxlPkV4YW1wbGVzPC90aXRsZT4KKworICAgICAgPHBhcmE+ CisgICAgICAgIFNldCA8bGl0ZXJhbD5wZ19hdWRpdC5yb2xlID0gJ2F1ZGl0JzwvbGl0ZXJh bD4gaW4KKyAgICAgICAgPGxpdGVyYWw+cG9zdGdyZXNxbC5jb25mPC9saXRlcmFsPi4KKyAg ICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFNRTDoKKyAgICAgIDwvcGFy YT4KKworICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CitjcmVhdGUgdGFibGUgYWNjb3VudAor KAorICAgIGlkIGludCwKKyAgICBuYW1lIHRleHQsCisgICAgcGFzc3dvcmQgdGV4dCwKKyAg ICBkZXNjcmlwdGlvbiB0ZXh0CispOworCitncmFudCBzZWxlY3QgKHBhc3N3b3JkKQorICAg b24gcHVibGljLmFjY291bnQKKyAgIHRvIGF1ZGl0OworCitzZWxlY3QgaWQsIG5hbWUKKyAg ZnJvbSBhY2NvdW50OworCitzZWxlY3QgcGFzc3dvcmQKKyAgZnJvbSBhY2NvdW50OworCitn cmFudCB1cGRhdGUgKG5hbWUsIHBhc3N3b3JkKQorICAgb24gcHVibGljLmFjY291bnQKKyAg IHRvIGF1ZGl0OworCit1cGRhdGUgYWNjb3VudAorICAgc2V0IGRlc2NyaXB0aW9uID0gJ3lh ZGEsIHlhZGEnOworCit1cGRhdGUgYWNjb3VudAorICAgc2V0IHBhc3N3b3JkID0gJ0hBU0gy JzsKKworY3JlYXRlIHRhYmxlIGFjY291bnRfcm9sZV9tYXAKKygKKyAgICBhY2NvdW50X2lk IGludCwKKyAgICByb2xlX2lkIGludAorKTsKKworZ3JhbnQgc2VsZWN0CisgICBvbiBwdWJs aWMuYWNjb3VudF9yb2xlX21hcAorICAgdG8gYXVkaXQ7CisKK3NlbGVjdCBhY2NvdW50LnBh c3N3b3JkLAorICAgICAgIGFjY291bnRfcm9sZV9tYXAucm9sZV9pZAorICBmcm9tIGFjY291 bnQKKyAgICAgICBpbm5lciBqb2luIGFjY291bnRfcm9sZV9tYXAKKyAgICAgICAgICAgIG9u IGFjY291bnQuaWQgPSBhY2NvdW50X3JvbGVfbWFwLmFjY291bnRfaWQKKyAgICAgICAgPC9w cm9ncmFtbGlzdGluZz4KKworICAgICAgPHBhcmE+CisgICAgICAgIExvZyBPdXRwdXQ6Cisg ICAgICA8L3BhcmE+CisKKyAgICAgIDxwcm9ncmFtbGlzdGluZz4KK0FVRElUOiBPQkpFQ1Qs UkVBRCxTRUxFQ1QsVEFCTEUscHVibGljLmFjY291bnQsc2VsZWN0IHBhc3N3b3JkCisgIGZy b20gYWNjb3VudAorQVVESVQ6IE9CSkVDVCxXUklURSxVUERBVEUsVEFCTEUscHVibGljLmFj Y291bnQsdXBkYXRlIGFjY291bnQKKyAgIHNldCBwYXNzd29yZCA9ICdIQVNIMicKK0FVRElU OiBPQkpFQ1QsUkVBRCxTRUxFQ1QsVEFCTEUscHVibGljLmFjY291bnQsc2VsZWN0IGFjY291 bnQucGFzc3dvcmQsCisgICAgICAgYWNjb3VudF9yb2xlX21hcC5yb2xlX2lkCisgIGZyb20g YWNjb3VudAorICAgICAgIGlubmVyIGpvaW4gYWNjb3VudF9yb2xlX21hcAorICAgICAgICAg ICAgb24gYWNjb3VudC5pZCA9IGFjY291bnRfcm9sZV9tYXAuYWNjb3VudF9pZAorQVVESVQ6 IE9CSkVDVCxSRUFELFNFTEVDVCxUQUJMRSxwdWJsaWMuYWNjb3VudF9yb2xlX21hcCxzZWxl Y3QgYWNjb3VudC5wYXNzd29yZCwKKyAgICAgICBhY2NvdW50X3JvbGVfbWFwLnJvbGVfaWQK KyAgZnJvbSBhY2NvdW50CisgICAgICAgaW5uZXIgam9pbiBhY2NvdW50X3JvbGVfbWFwCisg ICAgICAgICAgICBvbiBhY2NvdW50LmlkID0gYWNjb3VudF9yb2xlX21hcC5hY2NvdW50X2lk CisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgIDwvc2VjdDM+CisgIDwvc2VjdDI+CisK KyAgPHNlY3QyPgorICAgIDx0aXRsZT5Gb3JtYXQ8L3RpdGxlPgorCisgICAgPHBhcmE+Cisg ICAgICBBdWRpdCBlbnRyaWVzIGFyZSB3cml0dGVuIHRvIHRoZSBzdGFuZGFyZCBsb2dnaW5n IGZhY2lsaXR5IGFuZCBjb250YWluCisgICAgICB0aGUgZm9sbG93aW5nIGNvbHVtbnMgaW4g Y29tbWEtc2VwYXJhdGVkIGZvcm1hdDoKKworICAgICAgPG5vdGU+CisgICAgICAgIDxwYXJh PgorICAgICAgICAgIE91dHB1dCBpcyBub3QgaW4gY29tcGxpYW50IENTViBmb3JtYXQuICBJ ZiBtYWNoaW5lLXJlYWRhYmlsaXR5IGlzCisgICAgICAgICAgcmVxdWlyZWQgdGhlbiBjb25z aWRlciBzZXR0aW5nCisgICAgICAgICAgPGxpdGVyYWw+bG9nX2Rlc3RpbmF0aW9uID0gJ2Nz dmxvZyc8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L25vdGU+CisKKyAg ICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFy YT4KKyAgICAgICAgICAgIDxsaXRlcmFsPkFVRElUX1RZUEU8L2xpdGVyYWw+IC0gPGxpdGVy YWw+U0VTU0lPTjwvbGl0ZXJhbD4gb3IKKyAgICAgICAgICAgIDxsaXRlcmFsPk9CSkVDVDwv bGl0ZXJhbD4uCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAg ICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8bGl0ZXJh bD5DTEFTUzwvbGl0ZXJhbD4gLSA8bGl0ZXJhbD5SRUFEPC9saXRlcmFsPiwKKyAgICAgICAg ICAgIDxsaXRlcmFsPldSSVRFPC9saXRlcmFsPiwgPGxpdGVyYWw+RlVOQ1RJT048L2xpdGVy YWw+LAorICAgICAgICAgICAgPGxpdGVyYWw+RERMPC9saXRlcmFsPiwgb3IgPGxpdGVyYWw+ TUlTQzwvbGl0ZXJhbD4uCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVt PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8 bGl0ZXJhbD5DT01NQU5EPC9saXRlcmFsPiAtIDxsaXRlcmFsPkFMVEVSIFRBQkxFPC9saXRl cmFsPiwKKyAgICAgICAgICAgIDxsaXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4sIDxsaXRlcmFs PkNSRUFURSBJTkRFWDwvbGl0ZXJhbD4sCisgICAgICAgICAgICA8bGl0ZXJhbD5VUERBVEU8 L2xpdGVyYWw+LCBldGMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVt PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8 bGl0ZXJhbD5PQkpFQ1RfVFlQRTwvbGl0ZXJhbD4gLSA8bGl0ZXJhbD5UQUJMRTwvbGl0ZXJh bD4sCisgICAgICAgICAgICA8bGl0ZXJhbD5JTkRFWDwvbGl0ZXJhbD4sIDxsaXRlcmFsPlZJ RVc8L2xpdGVyYWw+LCBldGMuICBPbmx5CisgICAgICAgICAgICBhdmFpbGFibGUgZm9yIERN TCBhbmQgY2VydGFpbiBEREwgY29tbWFuZHMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAg ICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+Cisg ICAgICAgICAgICA8bGl0ZXJhbD5PQkpFQ1RfTkFNRTwvbGl0ZXJhbD4gLSBUaGUgZnVsbHkt cXVhbGlmaWVkIG9iamVjdCBuYW1lCisgICAgICAgICAgICAoZS5nLiBwdWJsaWMuYWNjb3Vu dCkuICBPbmx5IGF2YWlsYWJsZSBmb3IgRE1MIGFuZCBjZXJ0YWluIERETAorICAgICAgICAg ICAgY29tbWFuZHMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgor ICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8bGl0 ZXJhbD5TVEFURU1FTlQ8L2xpdGVyYWw+IC0gU3RhdGVtZW50IGV4ZWN1dGUgb24gdGhlIGJh Y2tlbmQuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAg PC9pdGVtaXplZGxpc3Q+CisgICAgPC9wYXJhPgorICA8L3NlY3QyPgorCisgIDxzZWN0Mj4K KyAgICA8dGl0bGU+QXV0aG9yczwvdGl0bGU+CisKKyAgICA8cGFyYT4KKyAgICAgIEFiaGlq aXQgTWVub24tU2VuIDxlbWFpbD5hbXNAMm5kUXVhZHJhbnQuY29tPC9lbWFpbD4sIElhbiBC YXJ3aWNrIDxlbWFpbD5pYW5AMm5kUXVhZHJhbnQuY29tPC9lbWFpbD4sIGFuZCBEYXZpZCBT dGVlbGUgPGVtYWlsPmRhdmlkQHBnbWFzdGVycy5uZXQ8L2VtYWlsPi4KKyAgICA8L3BhcmE+ CisgIDwvc2VjdDI+Cis8L3NlY3QxPgo= --------------070701020002040400050607-- --3pCSnoopXtSbx5dtH8iHf5TPc92ikjpcV Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJVEEIEAAoJEIA2uIJQ5SFAeUcP/RC/wOze0akl5gfIrNvjN2az m30YAltJ+R1H5b+wT1jQHrO8YuwSlrkO+gfn+my3jBxkMZiojUKCiYjt4OAmhwen c57eit0mqADCDNJ7nIEqW1Hz04YWUdhNI89jKGigP1g32aEll33AU8wnxFiz5ixE CFeYOgJrueenZIm/wJevJ6Oxm0Fdl6+cI3yLfK4HFRT08XV4We1tuO6Vtomg0dLd SrNQCIUIKM3fF5WIVLZsVjKj2UJ+845pn1vobSQMyHf+28yG8y1UbAM/Qg9dehyt koNWV95BzmBBqCLNzJYLgsw4r8gZP/aZQ40gXld4I2o9xUgo9/b3alvxB5wNaWDu fVHKJDhLMFQawtZWENyiS8yKsfcfmzNq4scezoMkUXWibV95csnVM1mL9tIzHWBt ihmvNRPw5i9ghvFfyMBcePpZbt04ew2s9CKKWI4bnPB0DqMaCYkHS4cghKR33kJW kcuVQwN3C4ey2m6N5J98KR5I2aNwWOBMI/WbqsqZdeeHoNmZB/74UB0uh9qFz+Ms 1Y/ly7Y9zqwiMmo3UcQdEjFi+O7WZt2/6yPHclbkPwaBzvh9wunb/jlb2PKC2XaK XEUrqDKEkbzq78hHvjTBXv0AhbSlp6xhrBXBg1GO6eTy8AYfirw7R87ThaNx7TNN GzST8GwOCZS72SFo6OcC =hiw9 -----END PGP SIGNATURE----- --3pCSnoopXtSbx5dtH8iHf5TPc92ikjpcV--