Received: from localhost (unknown [200.46.204.183]) by postgresql.org (Postfix) with ESMTP id A213464FD15 for ; Wed, 17 Sep 2008 11:29:42 -0300 (ADT) Received: from postgresql.org ([200.46.204.86]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 98343-02 for ; Wed, 17 Sep 2008 11:29:35 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mail.esilo.com (mail.esilo.com [63.150.152.211]) by postgresql.org (Postfix) with ESMTP id 6839264FCC0 for ; Wed, 17 Sep 2008 11:29:33 -0300 (ADT) Received: from [10.0.0.2] (fwext-esilo-jupiter.esilo.com [64.135.45.146]) (authenticated bits=0) by mail.esilo.com (8.13.1/8.13.1) with ESMTP id m8HETPWa003406; Wed, 17 Sep 2008 10:29:26 -0400 Message-ID: <48D11443.4010608@esilo.com> Date: Wed, 17 Sep 2008 10:29:23 -0400 From: Andrew Chernow User-Agent: Thunderbird 2.0.0.16 (Windows/20080708) MIME-Version: 1.0 To: Tom Lane CC: Alvaro Herrera , PostgreSQL-development , Merlin Moncure Subject: Re: [PATCHES] libpq events patch (with sgml docs) References: <48C18533.2000204@esilo.com> <20080905192215.GK4353@alvh.no-ip.org> <48C18B48.509@esilo.com> <20080905194853.GL4353@alvh.no-ip.org> <48C191A7.3000205@esilo.com> <20080905201504.GM4353@alvh.no-ip.org> <48C19759.90402@esilo.com> <27615.1221619326@sss.pgh.pa.us> <48D072E3.6010703@esilo.com> <28673.1221622817@sss.pgh.pa.us> <48D080B0.6070104@esilo.com> <454.1221626213@sss.pgh.pa.us> <48D0DFBE.9050900@esilo.com> <8872.1221653812@sss.pgh.pa.us> <48D1041D.5070808@esilo.com> <10839.1221658586@sss.pgh.pa.us> In-Reply-To: <10839.1221658586@sss.pgh.pa.us> Content-Type: multipart/mixed; boundary="------------070000090000090208020403" X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0 tagged_above=0 required=5 tests=none X-Spam-Level: X-Archive-Number: 200809/1106 X-Sequence-Number: 124235 This is a multi-part message in MIME format. --------------070000090000090208020403 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit New patch following our discussion with updated docs. >> few logical errors). I don't think it makes sense to do it otherwise, >> it would be like calling free after a malloc failure. > > I can live with that definition, but please document it. > > To build on this analogy, PGEVT_CONNRESET is like a realloc. Meaning, the initial malloc "PGEVT_REGISTER" worked by the realloc "PGEVT_CONNRESET" didn't ... you still have free "PGEVT_CONNDESTROY" the initial. Its documented that way. Basically if a register succeeds, a destroy will always be sent regardless of what happens with a reset. -- Andrew Chernow eSilo, LLC every bit counts http://www.esilo.com/ --------------070000090000090208020403 Content-Type: text/plain; name="libpq-events.patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="libpq-events.patch" SW5kZXg6IGRvYy9zcmMvc2dtbC9saWJwcS5zZ21sCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6 IC9wcm9qZWN0cy9jdnNyb290L3Bnc3FsL2RvYy9zcmMvc2dtbC9saWJwcS5zZ21sLHYKcmV0 cmlldmluZyByZXZpc2lvbiAxLjI2MApkaWZmIC1DNiAtcjEuMjYwIGxpYnBxLnNnbWwKKioq IGRvYy9zcmMvc2dtbC9saWJwcS5zZ21sCTI3IEp1biAyMDA4IDAyOjQ0OjMxIC0wMDAwCTEu MjYwCi0tLSBkb2Mvc3JjL3NnbWwvbGlicHEuc2dtbAkxNyBTZXAgMjAwOCAwMzo1NDoyMCAt MDAwMAoqKioqKioqKioqKioqKioKKioqIDIwOTIsMjEwMyAqKioqCi0tLSAyMDkyLDIyMjIg LS0tLQogICAgICAgICAgTm90ZSB0aGF0IDxmdW5jdGlvbj5QUWNsZWFyPC9mdW5jdGlvbj4g c2hvdWxkIGV2ZW50dWFsbHkgYmUgY2FsbGVkCiAgICAgICAgICBvbiB0aGUgb2JqZWN0LCBq dXN0IGFzIHdpdGggYSA8c3RydWN0bmFtZT5QR3Jlc3VsdDwvc3RydWN0bmFtZT4KICAgICAg ICAgIHJldHVybmVkIGJ5IDxhcHBsaWNhdGlvbj5saWJwcTwvYXBwbGljYXRpb24+IGl0c2Vs Zi4KICAgICAgICAgPC9wYXJhPgogICAgICAgIDwvbGlzdGl0ZW0+CiAgICAgICA8L3Zhcmxp c3RlbnRyeT4KKyAKKyAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgPHRlcm0+CisgICAg ICAgIDxmdW5jdGlvbj5QUWNvcHlSZXN1bHQ8L2Z1bmN0aW9uPgorICAgICAgICA8aW5kZXh0 ZXJtPgorICAgICAgICAgPHByaW1hcnk+UFFjb3B5UmVzdWx0PC9wcmltYXJ5PgorICAgICAg ICA8L2luZGV4dGVybT4KKyAgICAgICA8L3Rlcm0+CisgCisgICAgICAgPGxpc3RpdGVtPgor ICAgICAgICA8cGFyYT4KKyAgICAgICAgIE1ha2VzIGEgY29weSBvZiBhIDxzdHJ1Y3RuYW1l PlBHcmVzdWx0PC9zdHJ1Y3RuYW1lPiBvYmplY3QuCisgICAgICAgICA8c3lub3BzaXM+Cisg ICAgICAgICAgUEdyZXN1bHQgKlBRY29weVJlc3VsdChjb25zdCBQR3Jlc3VsdCAqc3JjLCBp bnQgZmxhZ3MpOworICAgICAgICAgPC9zeW5vcHNpcz4KKyAgICAgICAgPC9wYXJhPgorIAor ICAgICAgICA8cGFyYT4KKyAgICAgICAgIFRoZSByZXR1cm5lZCByZXN1bHQgaXMgYWx3YXlz IHB1dCBpbnRvIDxsaXRlcmFsPlBHUkVTX1RVUExFU19PSzwvbGl0ZXJhbD4gc3RhdHVzLgor ICAgICAgICAgSXQgaXMgbm90IGxpbmtlZCB0byB0aGUgc291cmNlIHJlc3VsdCBpbiBhbnkg d2F5IGFuZAorICAgICAgICAgPGZ1bmN0aW9uPlBRY2xlYXI8L2Z1bmN0aW9uPiBtdXN0IGJl IGNhbGxlZCB3aGVuIHRoZSByZXN1bHQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgICAg IElmIHRoZSBmdW5jdGlvbiBmYWlscywgTlVMTCBpcyByZXR1cm5lZC4KKyAgICAgICAgPC9w YXJhPgorIAorICAgICAgICA8cGFyYT4KKyAgICAgICAgIE9wdGlvbmFsbHksIHRoZSA8cGFy YW1ldGVyPmZsYWdzPC9wYXJhbWV0ZXI+IGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIGNvcHkK KyAgICAgICAgIG1vcmUgcGFydHMgb2YgdGhlIHJlc3VsdC4gIDxsaXRlcmFsPlBHX0NPUFlS RVNfQVRUUlM8L2xpdGVyYWw+IHdpbGwgY29weSB0aGUKKyAgICAgICAgIHNvdXJjZSByZXN1 bHQncyBhdHRyaWJ1dGVzLiAgPGxpdGVyYWw+UEdfQ09QWVJFU19UVVBMRVM8L2xpdGVyYWw+ IHdpbGwgY29weQorICAgICAgICAgdGhlIHNvdXJjZSByZXN1bHQncyB0dXBsZXMuICBUaGlz IGltcGxpZXMgY29weWluZyB0aGUgYXR0cnMsIGJlaW5nIGhvdyB0aGUKKyAgICAgICAgIGF0 dHJzIGFyZSBuZWVkZWQgYnkgdGhlIHR1cGxlcy4gIDxsaXRlcmFsPlBHX0NPUFlSRVNfRVZF TlRTPC9saXRlcmFsPiB3aWxsCisgICAgICAgICBjb3B5IHRoZSBzb3VyY2UgcmVzdWx0J3Mg ZXZlbnRzLiAgPGxpdGVyYWw+UEdfQ09QWVJFU19OT1RJQ0VIT09LUzwvbGl0ZXJhbD4KKyAg ICAgICAgIHdpbGwgY29weSB0aGUgc291cmNlIHJlc3VsdCdzIG5vdGlmeSBob29rcy4KKyAg ICAgICAgPC9wYXJhPgorICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRy eT4KKyAKKyAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgPHRlcm0+CisgICAgICAgIDxm dW5jdGlvbj5QUXNldFJlc3VsdEF0dHJzPC9mdW5jdGlvbj4KKyAgICAgICAgPGluZGV4dGVy bT4KKyAgICAgICAgIDxwcmltYXJ5PlBRc2V0UmVzdWx0QXR0cnM8L3ByaW1hcnk+CisgICAg ICAgIDwvaW5kZXh0ZXJtPgorICAgICAgIDwvdGVybT4KKyAKKyAgICAgICA8bGlzdGl0ZW0+ CisgICAgICAgIDxwYXJhPgorICAgICAgICAgU2V0cyB0aGUgYXR0cmlidXRlcyBvZiBhIDxz dHJ1Y3RuYW1lPlBHcmVzdWx0PC9zdHJ1Y3RuYW1lPiBvYmplY3QuCisgICAgICAgICA8c3lu b3BzaXM+CisgICAgICAgICAgaW50IFBRc2V0UmVzdWx0QXR0cnMoUEdyZXN1bHQgKnJlcywg aW50IG51bUF0dHJpYnV0ZXMsIFBHcmVzQXR0RGVzYyAqYXR0RGVzY3MpOworICAgICAgICAg PC9zeW5vcHNpcz4KKyAgICAgICAgPC9wYXJhPgorIAorICAgICAgICA8cGFyYT4KKyAgICAg ICAgIFRoZSBwcm92aWRlZCA8cGFyYW1ldGVyPmF0dERlc2NzPC9wYXJhbWV0ZXI+IGFyZSBj b3BpZWQgaW50byB0aGUgcmVzdWx0LCB0aHVzIHRoZQorICAgICAgICAgPHBhcmFtZXRlcj5h dHREZXNjczwvcGFyYW1ldGVyPiBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBieSA8cGFyYW1ldGVy PnJlczwvcGFyYW1ldGVyPiBhZnRlcgorICAgICAgICAgdGhlIGZ1bmN0aW9uIHJldHVybnMu ICBJZiB0aGUgPHBhcmFtZXRlcj5hdHREZXNjczwvcGFyYW1ldGVyPiBhcmUgTlVMTCBvcgor ICAgICAgICAgPHBhcmFtZXRlcj5udW1BdHRyaWJ1dGVzPC9wYXJhbWV0ZXI+IGlzIGxlc3Mg dGhhbiBvbmUsIHRoZSByZXF1ZXN0IGlzIGlnbm9yZWQgYW5kCisgICAgICAgICB0aGUgZnVu Y3Rpb24gc3VjY2VlZHMuICBJZiA8cGFyYW1ldGVyPnJlczwvcGFyYW1ldGVyPiBhbHJlYWR5 IGNvbnRhaW5zIGF0dHJpYnV0ZXMsCisgICAgICAgICB0aGUgZnVuY3Rpb24gd2lsbCBmYWls LiAgSWYgdGhlIGZ1bmN0aW9uIGZhaWxzLCB0aGUgcmV0dXJuIHZhbHVlIGlzIHplcm8uICBJ ZiB0aGUKKyAgICAgICAgIGZ1bmN0aW9uIHN1Y2NlZWRzLCB0aGUgcmV0dXJuIHZhbHVlIGlz IG5vbi16ZXJvLgorICAgICAgICA8L3BhcmE+CisgICAgICAgPC9saXN0aXRlbT4KKyAgICAg IDwvdmFybGlzdGVudHJ5PgorIAorICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICA8dGVy bT4KKyAgICAgICAgPGZ1bmN0aW9uPlBRc2V0dmFsdWU8L2Z1bmN0aW9uPgorICAgICAgICA8 aW5kZXh0ZXJtPgorICAgICAgICAgPHByaW1hcnk+UFFzZXR2YWx1ZTwvcHJpbWFyeT4KKyAg ICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgPC90ZXJtPgorIAorICAgICAgIDxsaXN0aXRl bT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICBTZXRzIGEgdHVwbGUgZmllbGQgdmFsdWUg b2YgYSA8c3RydWN0bmFtZT5QR3Jlc3VsdDwvc3RydWN0bmFtZT4gb2JqZWN0LgorICAgICAg ICAgPHN5bm9wc2lzPgorICAgICAgICAgIGludCBQUXNldHZhbHVlKFBHcmVzdWx0ICpyZXMs IGludCB0dXBfbnVtLCBpbnQgZmllbGRfbnVtLCBjaGFyICp2YWx1ZSwgaW50IGxlbik7Cisg ICAgICAgICA8L3N5bm9wc2lzPgorICAgICAgICA8L3BhcmE+CisgCisgICAgICAgIDxwYXJh PgorICAgICAgICAgVGhlIGZ1bmN0aW9uIHdpbGwgYXV0b21hdGljYWxseSBncm93IHRoZSBy ZXN1bHQncyBpbnRlcm5hbCB0dXBsZXMgYXJyYXkgYXMgbmVlZGVkLgorICAgICAgICAgVGhl IDxwYXJhbWV0ZXI+dHVwX251bTwvcGFyYW1ldGVyPiBhcmd1bWVudCBtdXN0IGJlIGxlc3Mg dGhhbiBvciBlcXVhbCB0bworICAgICAgICAgPGZ1bmN0aW9uPlBRbnR1cGxlczwvZnVuY3Rp b24+LCBtZWFuaW5nIHRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgZ3JvdyB0aGUKKyAgICAgICAg IHR1cGxlcyBhcnJheSBpbiBvcmRlciBvbmUgdHVwbGUgYXQgYSB0aW1lLiAgQWx0aG91Z2gs IGFueSBmaWVsZCBmcm9tIGFueQorICAgICAgICAgZXhpc3RpbmcgdHVwbGUgY2FuIGJlIG1v ZGlmaWVkIGluIGFueSBvcmRlci4gIElmIGEgdmFsdWUgYXQgPHBhcmFtZXRlcj5maWVsZF9u dW08L3BhcmFtZXRlcj4KKyAgICAgICAgIGFscmVhZHkgZWl4c3RzLCBpdCB3aWxsIGJlIG92 ZXJ3cml0dGVuLiAgSWYgPHBhcmFtZXRlcj5sZW48L3BhcmFtZXRlcj4gaXMgPGxpdGVyYWw+ LTE8L2xpdGVyYWw+IG9yCisgICAgICAgICA8cGFyYW1ldGVyPnZhbHVlPC9wYXJhbWV0ZXI+ IGlzIDxsaXRlcmFsPk5VTEw8L2xpdGVyYWw+LCB0aGUgZmllbGQgdmFsdWUgd2lsbAorICAg ICAgICAgYmUgc2V0IHRvIGFuIFNRTCA8bGl0ZXJhbD5OVUxMPC9saXRlcmFsPi4gIFRoZSA8 cGFyYW1ldGVyPnZhbHVlPC9wYXJhbWV0ZXI+IGlzIGNvcGllZAorICAgICAgICAgaW50byBy ZXN1bHQncyBwcml2YXRlIHN0b3JhZ2UsIHRodXMgbm8gbG9uZ2VyIG5lZWRlZCBieSA8cGFy YW1ldGVyPnJlczwvcGFyYW1ldGVyPiBhZnRlcgorICAgICAgICAgdGhlIGZ1bmN0aW9uIHJl dHVybnMuICBJZiB0aGUgZnVuY3Rpb24gZmFpbHMsIHRoZSByZXR1cm4gdmFsdWUKKyAgICAg ICAgIGlzIHplcm8uICBJZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMsIHRoZSByZXR1cm4gdmFs dWUgaXMgbm9uLXplcm8uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICA8L2xpc3RpdGVtPgor ICAgICAgPC92YXJsaXN0ZW50cnk+CisgCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAg IDx0ZXJtPgorICAgICAgICA8ZnVuY3Rpb24+UFFyZXN1bHRBbGxvYzwvZnVuY3Rpb24+Cisg ICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICA8cHJpbWFyeT5QUXJlc3VsdEFsbG9jPC9w cmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICA8L3Rlcm0+CisgCisgICAg ICAgPGxpc3RpdGVtPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgIEFsbG9jYXRlIHN1YnNp ZGlhcnkgc3RvcmFnZSBmb3IgYSA8c3RydWN0bmFtZT5QR3Jlc3VsdDwvc3RydWN0bmFtZT4g b2JqZWN0LgorICAgICAgICAgPHN5bm9wc2lzPgorICAgICAgICAgIHZvaWQgKlBRcmVzdWx0 QWxsb2MoUEdyZXN1bHQgKnJlcywgc2l6ZV90IG5CeXRlcyk7CisgICAgICAgICA8L3N5bm9w c2lzPgorICAgICAgICA8L3BhcmE+CisgCisgICAgICAgIDxwYXJhPgorICAgICAgICAgQW55 IG1lbW9yeSBhbGxvY2F0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLCB3aWxsIGJlIGZyZWVkIHdo ZW4KKyAgICAgICAgIDxwYXJhbWV0ZXI+cmVzPC9wYXJhbWV0ZXI+IGlzIGNsZWFyZWQuICBJ ZiB0aGUgZnVuY3Rpb24gZmFpbHMsCisgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIGlzIDxs aXRlcmFsPk5VTEw8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgPC9saXN0 aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgICA8L3ZhcmlhYmxlbGlzdD4KICAg ICA8L3BhcmE+CiAgICA8L3NlY3QyPgogIAogICAgPHNlY3QyIGlkPSJsaWJwcS1leGVjLXNl bGVjdC1pbmZvIj4KICAgICA8dGl0bGU+UmV0cmlldmluZyBRdWVyeSBSZXN1bHQgSW5mb3Jt YXRpb248L3RpdGxlPgoqKioqKioqKioqKioqKioKKioqIDQ1NTgsNDU2OSAqKioqCi0tLSA0 Njc3LDUxNTcgLS0tLQogICAgICA8L2xpc3RpdGVtPgogICAgIDwvdmFybGlzdGVudHJ5Pgog ICAgPC92YXJpYWJsZWxpc3Q+CiAgCiAgIDwvc2VjdDE+CiAgCisgIDxzZWN0MSBpZD0ibGli cHEtZXZlbnRzIj4KKyAgIDx0aXRsZT5FdmVudCBTeXN0ZW08L3RpdGxlPgorIAorICAgPHBh cmE+CisgICAgVGhlIGV2ZW50IHN5c3RlbSBpcyBkZXNpZ25lZCB0byBub3RpZnkgcmVnaXN0 ZXJlZCBldmVudCBoYW5kbGVycworICAgIGFib3V0IHBhcnRpY3VsYXIgbGlicHEgZXZlbnRz OyBzdWNoIGFzIHRoZSBjcmVhdGlvbiBvciBkZXN0cnVjdGlvbgorICAgIG9mIDxzdHJ1Y3Ru YW1lPlBHY29ubjwvc3RydWN0bmFtZT4gYW5kIDxzdHJ1Y3RuYW1lPlBHcmVzdWx0PC9zdHJ1 Y3RuYW1lPgorICAgIG9iamVjdHMuICBPbmUgdXNlIGNhc2UgaXMgdGhhdCB0aGlzIGFsbG93 cyBhcHBsaWNhdGlvbnMgdG8gYXNzb2NpYXRlCisgICAgdGhlaXIgb3duIGRhdGEgd2l0aCBh IDxzdHJ1Y3RuYW1lPlBHY29ubjwvc3RydWN0bmFtZT4gYW5kCisgICAgPHN0cnVjdG5hbWU+ UEdyZXN1bHQ8L3N0cnVjdG5hbWU+LCB0aGF0IGNhbiByZXRyaWV2ZWQgdmlhCisgICAgPGZ1 bmN0aW9uPlBRaW5zdGFuY2VEYXRhPC9mdW5jdGlvbj4gYW5kIDxmdW5jdGlvbj5QUXJlc3Vs dEluc3RhbmNlRGF0YTwvZnVuY3Rpb24+LgorICAgIEJhc2ljYWxseSwgaXRzIGxpa2UgYWRk aW5nIG1lbWJlcnMgdG8gdGhlIG9wYXF1ZSBjb25uIG9yIHJlc3VsdAorICAgIHN0cnVjdHVy ZXMgYXQgcnVudGltZS4KKyAgIDwvcGFyYT4KKyAKKyAgIDxwYXJhPgorICAgIEJlbG93IGlz IGEgbGlzdCBvZiBldmVudCBzeXN0ZW0gY29uY2VwdHM6CisgICAgPGl0ZW1pemVkbGlzdCBt YXJrPSdidWxsZXQnPgorICAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT4KKyAgICAgICA8 bGl0ZXJhbD5ldmVudElkPC9saXRlcmFsPiAtIElkZW50aWZpZXMgd2hpY2ggZXZlbnQgd2Fz IGZpcmVkIGJ5IGxpYnBxLiAgQWxsCisgICAgICAgZXZlbnRzIGJlZ2luIHdpdGggPGxpdGVy YWw+UEdFVlRfPC9saXRlcmFsPi4KKyAgICAgIDwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4K KyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgPGxpdGVyYWw+ZXZlbnRJ bmZvPC9saXRlcmFsPiAtIEV2ZXJ5IDxsaXRlcmFsPmV2ZW50SWQ8L2xpdGVyYWw+IGhhcyBh IGNvcnJlc3BvbmRpbmcKKyAgICAgICBldmVudCBpbmZvIHN0cnVjdHVyZSwgdGhhdCBjb250 YWlucyBkYXRhIHRvIGFpZCBpbiBwcm9jZXNzaW5nIHRoZSBldmVudC4KKyAgICAgIDwvcGFy YT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+Cisg ICAgICAgPGxpdGVyYWw+aW5zdGFuY2VEYXRhPC9saXRlcmFsPiAtIFRoZSBpbnN0YW5jZSBk YXRhIGlzIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYQorICAgICAgIDxzdHJ1Y3RuYW1lPlBH Y29ubjwvc3RydWN0bmFtZT4gb3IgPHN0cnVjdG5hbWU+UEdyZXN1bHQ8L3N0cnVjdG5hbWU+ LiAgVGhlIGRhdGEgaXMKKyAgICAgICBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgYWxvbmcgd2l0 aCB3aXRoIHRoZSBjb25uZWN0aW9uIG9yIHJlc3VsdC4KKyAgICAgICBUeXBpY2FsbHksIGlu c3RhbmNlIGRhdGEgaXMgY3JlYXRlZCBpbiByZXNwb25zZSB0bworICAgICAgIGEgPGxpdGVy YWw+UEdFVlRfUkVHSVNURVI8L2xpdGVyYWw+IGV2ZW50LCBidXQgY2FuIGJlIGNyZWF0ZWQg YXQgYW55IHRpbWUgb3IKKyAgICAgICBub3QgYXQgYWxsLiAgTWFuYWdlbWVudCBvZiBpbnN0 YW5jZSBkYXRhIGlzIGRvbmUgdXNpbmcgdGhlIDxmdW5jdGlvbj5QUWluc3RhbmNlRGF0YTwv ZnVuY3Rpb24+LAorICAgICAgIDxmdW5jdGlvbj5QUXNldEluc3RhbmNlRGF0YTwvZnVuY3Rp b24+LCA8ZnVuY3Rpb24+UFFyZXN1bHRJbnN0YW5jZURhdGE8L2Z1bmN0aW9uPiBhbmQKKyAg ICAgICA8ZnVuY3Rpb24+UFFzZXRSZXN1bHRJbnN0YW5jZURhdGE8L2Z1bmN0aW9uPiBmdW5j dGlvbnMuCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+CisgICAgPC9pdGVtaXpl ZGxpc3Q+CisgICA8L3BhcmE+CisgCisgCisgICA8c2VjdDIgaWQ9ImxpYnBxLWV2ZW50cy10 eXBlcyI+CisgICAgPHRpdGxlPkV2ZW50IFR5cGVzPC90aXRsZT4KKyAgICAgPHBhcmE+Cisg ICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0 ZXJtPjxsaXRlcmFsPlBHRVZUX1JFR0lTVEVSPC9saXRlcmFsPjwvdGVybT4KKyAgICAgICAg PGxpc3RpdGVtPgorICAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIHJlZ2lzdGVyIGV2 ZW50IG9jY3VycyB3aGVuIDxmdW5jdGlvbj5QUXJlZ2lzdGVyRXZlbnRQcm9jPC9mdW5jdGlv bj4gaXMKKyAgICAgICAgICBjYWxsZWQuICBJdCBpcyB0aGUgaWRlYWwgdGltZSB0byBpbml0 aWFsaXplIGFueSA8bGl0ZXJhbD5pbnN0YW5jZURhdGE8L2xpdGVyYWw+CisgICAgICAgICAg YW4gZXZlbnQgcHJvY2VkdXJlIG1heSBuZWVkLiAgT25seSBvbmUgcmVnaXN0ZXIgZXZlbnQg d2lsbCBiZSBmaXJlZCBwZXIgY29ubmVjdGlvbi4KKyAgICAgICAgICBJZiB0aGUgZXZlbnQg cHJvY2VkdXJlIGZhaWxzLCB0aGUgcmVnaXN0cmF0aW9uIGlzIGFib3J0ZWQuCisgCisgICAg ICAgICA8c3lub3BzaXM+CisgdHlwZWRlZiBzdHJ1Y3QKKyB7CisgICAgIGNvbnN0IFBHY29u biAqY29ubjsKKyB9IFBHRXZlbnRSZWdpc3Rlcjs8L3N5bm9wc2lzPgorIAorICAgICAgICAg IFdoZW4gYSA8bGl0ZXJhbD5QR0VWVF9SRUdJU1RFUjwvbGl0ZXJhbD4gZXZlbnQgaXMgcmVj ZWl2ZWQsIHRoZSA8cGFyYW1ldGVyPmV2dEluZm88L3BhcmFtZXRlcj4KKyAgICAgICAgICBw b2ludGVyIHNob3VsZCBiZSBjYXN0ZWQgdG8gYSA8c3RydWN0bmFtZT5QR0V2ZW50UmVnaXN0 ZXIqPC9zdHJ1Y3RuYW1lPi4gIFRoaXMgc3RydWN0dXJlCisgICAgICAgICAgY29udGFpbnMg YSA8c3RydWN0bmFtZT5QR2Nvbm48L3N0cnVjdG5hbWU+IHRoYXQgc2hvdWxkIGJlIGluIHRo ZSA8bGl0ZXJhbD5DT05ORUNUSU9OX09LPC9saXRlcmFsPgorICAgICAgICAgIHN0YXR1czsg Z3VhcmFudGVlZCBpZiBvbmUgY2FsbHMgPGZ1bmN0aW9uPlBRcmVnaXN0ZXJFdmVudFByb2M8 L2Z1bmN0aW9uPiByaWdodCBhZnRlciBvYnRhaW5pbmcKKyAgICAgICAgICBhIGdvb2QgPHN0 cnVjdG5hbWU+UEdjb25uPC9zdHJ1Y3RuYW1lPi4gIFRoZSBjb25uZWN0aW9uIGNhbiBiZSB1 c2VkIHRvIGluaXRpYWxpemUgYW55CisgICAgICAgICAgYXBwbGljYXRpb24gc3BlY2lmaWMg bmVlZHM6IGxpa2UgYWxsb2NhdGluZyBzdHJ1Y3R1cmVzIGFzIHRoZSBldmVudCA8bGl0ZXJh bD5pbnN0YW5jZURhdGE8L2xpdGVyYWw+CisgICAgICAgICAgb3IgZXhlY3V0aW5nIFNRTCBz dGF0ZW1lbnRzLgorICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAg ICAgIDwvdmFybGlzdGVudHJ5PgorIAorICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAg IDx0ZXJtPjxsaXRlcmFsPlBHRVZUX0NPTk5SRVNFVDwvbGl0ZXJhbD48L3Rlcm0+CisgICAg ICAgIDxsaXN0aXRlbT4KKyAgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBjb25uZWN0 aW9uIHJlc2V0IGV2ZW50IGlzIGZpcmVkIGluIHJlc3BvbnNlIHRvIGEgPGZ1bmN0aW9uPlBR cmVzZXQ8L2Z1bmN0aW9uPiBvciA8ZnVuY3Rpb24+UFFyZXNldFBvbGw8L2Z1bmN0aW9uPi4K KyAgICAgICAgICBJbiBib3RoIGNhc2VzLCB0aGUgZXZlbnQgaXMgb25seSBmaXJlZCBpZiB0 aGUgcmVzZXQgd2FzIHN1Y2Nlc3NmdWwuICBJZiB0aGUgZXZlbnQgcHJvY2VkdXJlIGZhaWxz LAorICAgICAgICAgIHRoZSBlbnRpcmUgY29ubmVjdGlvbiByZXNldCB3aWxsIGZhaWw7IHRo ZSA8c3RydWN0bmFtZT5QR2Nvbm48L3N0cnVjdG5hbWU+IGlzIHB1dCBpbnRvCisgICAgICAg ICAgPGxpdGVyYWw+Q09OTkVDVElPTl9CQUQ8L2xpdGVyYWw+IHN0YXR1cyBhbmQgPGZ1bmN0 aW9uPlBRcmVzZXRQb2xsPC9mdW5jdGlvbj4gd2lsbCByZXR1cm4KKyAgICAgICAgICA8bGl0 ZXJhbD5QR1JFU19QT0xMSU5HX0ZBSUxFRDwvbGl0ZXJhbD4uCisgICAgICAgICA8c3lub3Bz aXM+CisgdHlwZWRlZiBzdHJ1Y3QKKyB7CisgICAgIGNvbnN0IFBHY29ubiAqY29ubjsKKyB9 IFBHRXZlbnRSZXNldDs8L3N5bm9wc2lzPgorIAorICAgICAgICAgIFdoZW4gYSA8bGl0ZXJh bD5QR0VWVF9DT05OUkVTRVQ8L2xpdGVyYWw+IGV2ZW50IGlzIHJlY2VpdmVkLCB0aGUgPHBh cmFtZXRlcj5ldnRJbmZvPC9wYXJhbWV0ZXI+CisgICAgICAgICAgcG9pbnRlciBzaG91bGQg YmUgY2FzdGVkIHRvIGEgPHN0cnVjdG5hbWU+UEdFdmVudFJlc2V0Kjwvc3RydWN0bmFtZT4u ICBBbHRob3VnaCB0aGUgY29udGFpbmVkCisgICAgICAgICAgPHN0cnVjdG5hbWU+UEdjb25u PC9zdHJ1Y3RuYW1lPiB3YXMganVzdCByZXNldCwgYWxsIGV2ZW50IGRhdGEgcmVtYWlucyB1 bmNoYW5nZWQuICBUaGlzIGV2ZW50CisgICAgICAgICAgc2hvdWxkIGJlIHVzZWQgdG8gcmVz ZXQvcmVsb2FkL3JlcXVlcnkgYW55IGFzc29jYWl0ZWQgPGxpdGVyYWw+aW5zdGFuY2VEYXRh PC9saXRlcmFsPi4KKyAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAg ICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAKKyAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAg ICA8dGVybT48bGl0ZXJhbD5QR0VWVF9DT05OREVTVFJPWTwvbGl0ZXJhbD48L3Rlcm0+Cisg ICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBjb25u ZWN0aW9uIGRlc3Ryb3kgZXZlbnQgaXMgZmlyZWQgaW4gcmVzcG9uc2UgdG8gYSA8ZnVuY3Rp b24+UFFmaW5pc2g8L2Z1bmN0aW9uPi4KKyAgICAgICAgICBJdCBpcyB0aGUgZXZlbnQgcHJv Y2VkdXJlJ3MgcmVzcG9uc2liaWxpdHkgdG8gcHJvcGVybHkgY2xlYW51cCBpdHMgZXZlbnQg ZGF0YSBhcyBsaWJwcQorICAgICAgICAgIGhhcyBubyBhYmlsaXR5IHRvIG1hbmFnZSB0aGlz IG1lbW9yeS4gIEZhaWx1cmUgdG8gcHJvcGVybHkgY2xlYW51cCB3aWxsIGxlYWQgdG8gbWVt b3J5CisgICAgICAgICAgbGVha3MuCisgICAgICAgICA8c3lub3BzaXM+CisgdHlwZWRlZiBz dHJ1Y3QKKyB7CisgICAgIGNvbnN0IFBHY29ubiAqY29ubjsKKyB9IFBHRXZlbnRDb25uRGVz dHJveTs8L3N5bm9wc2lzPgorIAorICAgICAgICAgIFdoZW4gYSA8bGl0ZXJhbD5QR0VWVF9D T05OREVTVFJPWTwvbGl0ZXJhbD4gZXZlbnQgaXMgcmVjZWl2ZWQsIHRoZSA8cGFyYW1ldGVy PmV2dEluZm88L3BhcmFtZXRlcj4KKyAgICAgICAgICBwb2ludGVyIHNob3VsZCBiZSBjYXN0 ZWQgdG8gYSA8c3RydWN0bmFtZT5QR0V2ZW50Q29ubkRlc3Ryb3kqPC9zdHJ1Y3RuYW1lPi4g IFRoaXMgZXZlbnQgaXMgZmlyZWQKKyAgICAgICAgICBwcmlvciB0byA8ZnVuY3Rpb24+UFFm aW5pc2g8L2Z1bmN0aW9uPiBwZXJmb3JtaW5nIGFueSBjbGVhbnVwLiAgVGhlIHJldHVybiB2 YWx1ZSBvZiB0aGUgZXZlbnQKKyAgICAgICAgICBwcm9jZWR1cmUgaXMgaWdub3JlZCBzaW5j ZSB0aGVyZSBpcyBubyB3YXkgb2YgaW5kaWNhdGluZyBhIGZhaWx1cmUgZnJvbSA8ZnVuY3Rp b24+UFFmaW5pc2g8L2Z1bmN0aW9uPi4KKyAgICAgICAgICBBbHNvLCBhbiBldmVudCBwcm9j ZWR1cmUgZmFpbHVyZSBzaG91bGQgbm90IGFib3J0IHRoZSBwcm9jZXNzIG9mIGNsZWFuaW5n IHVwIHVud2FudGVkIG1lbW9yeS4KKyAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0 aXRlbT4KKyAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAKKyAgICAgICA8dmFybGlzdGVudHJ5 PgorICAgICAgICA8dGVybT48bGl0ZXJhbD5QR0VWVF9SRVNVTFRDUkVBVEU8L2xpdGVyYWw+ PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICA8cGFyYT4KKyAgICAgICAg ICBUaGUgcmVzdWx0IGNyZWF0ZSBldmVudCBpcyBmaXJlZCBpbiByZXNwb25zZSB0byBhbnkg ZXhlYyBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyBhIHJlc3VsdCwKKyAgICAgICAgICBpbmNs dWRpbmcgPGZ1bmN0aW9uPlBRZ2V0UmVzdWx0PC9mdW5jdGlvbj4uICBUaGlzIGV2ZW50IHdp bGwgb25seSBiZSBmaXJlZCBhZnRlciB0aGUgcmVzdWx0CisgICAgICAgICAgaGFzIGJlZW4g Y3JlYXRlZCBzdWNjZXNzZnVsbHksIHdpdGggYSByZXN1bHQgc3RhdHVzIG9mIGVpdGhlciA8 bGl0ZXJhbD5QR1JFU19DT01NQU5EX09LPC9saXRlcmFsPiwKKyAgICAgICAgICA8bGl0ZXJh bD5QR1JFU19UVVBMRVNfT0s8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPlBHUkVTX0VNUFRZX1FV RVJZPC9saXRlcmFsPi4KKyAgICAgICAgIDxzeW5vcHNpcz4KKyB0eXBlZGVmIHN0cnVjdAor IHsKKyAgICAgY29uc3QgUEdjb25uICpjb25uOworICAgICBjb25zdCBQR3Jlc3VsdCAqcmVz dWx0OworIH0gUEdFdmVudFJlc3VsdENyZWF0ZTs8L3N5bm9wc2lzPgorIAorICAgICAgICAg IFdoZW4gYSA8bGl0ZXJhbD5QR0VWVF9SRVNVTFRDUkVBVEU8L2xpdGVyYWw+IGV2ZW50IGlz IHJlY2VpdmVkLCB0aGUgPHBhcmFtZXRlcj5ldnRJbmZvPC9wYXJhbWV0ZXI+CisgICAgICAg ICAgcG9pbnRlciBzaG91bGQgYmUgY2FzdGVkIHRvIGEgPHN0cnVjdG5hbWU+UEdFdmVudFJl c3VsdENyZWF0ZSo8L3N0cnVjdG5hbWU+LiAgVGhlIDxwYXJhbWV0ZXI+Y29ubjwvcGFyYW1l dGVyPgorICAgICAgICAgIHdhcyB0aGUgY29ubmVjdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRo ZSByZXN1bHQuICBUaGlzIGlzIHRoZSBpZGVhbCBwbGFjZSB0byBpbml0aWFsaXplCisgICAg ICAgICAgYW55IDxsaXRlcmFsPmluc3RhbmNlRGF0YTwvbGl0ZXJhbD4gdGhhdCBuZWVkcyB0 byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc3VsdC4gIElmIHRoZSBldmVudCBwcm9jZWR1 cmUgZmFpbHMsCisgICAgICAgICAgdGhlIHJlc3VsdCB3aWxsIGJlIGNsZWFyZWQgYW5kIHRo ZSBmYWlsdXJlIHdpbGwgYmUgcHJvcGFnYXRlZC4gIERvIG5vdCBhdHRlbXB0IHRvCisgICAg ICAgICAgY2xlYXIgdGhlIHJlc3VsdCBvYmplY3QgY29udGFpbmVkIGluIHRoZSA8c3RydWN0 bmFtZT5QR0V2ZW50UmVzdWx0Q3JlYXRlPC9zdHJ1Y3RuYW1lPiBzdHJ1Y3R1cmUuCisgICAg ICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgPC92YXJsaXN0ZW50 cnk+CisgCisgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PGxpdGVyYWw+ UEdFVlRfUkVTVUxUQ09QWTwvbGl0ZXJhbD48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4K KyAgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSByZXN1bHQgY29weSBldmVudCBpcyBm aXJlZCBpbiByZXNwb25zZSB0byA8ZnVuY3Rpb24+UFFjb3B5UmVzdWx0PC9mdW5jdGlvbj4u CisgICAgICAgICAgVGhpcyBldmVudCB3aWxsIG9ubHkgYmUgZmlyZWQgYWZ0ZXIgdGhlIGNv cHkgaXMgY29tcGxldGUuCisgICAgICAgICA8c3lub3BzaXM+CisgdHlwZWRlZiBzdHJ1Y3QK KyB7CisgICAgIGNvbnN0IFBHcmVzdWx0ICpzcmM7CisgICAgIFBHcmVzdWx0ICpkZXN0Owor IH0gUEdFdmVudFJlc3VsdENvcHk7PC9zeW5vcHNpcz4KKyAKKyAgICAgICAgICBXaGVuIGEg PGxpdGVyYWw+UEdFVlRfUkVTVUxUQ09QWTwvbGl0ZXJhbD4gZXZlbnQgaXMgcmVjZWl2ZWQs IHRoZSA8cGFyYW1ldGVyPmV2dEluZm88L3BhcmFtZXRlcj4KKyAgICAgICAgICBwb2ludGVy IHNob3VsZCBiZSBjYXN0ZWQgdG8gYSA8c3RydWN0bmFtZT5QR0V2ZW50UmVzdWx0Q29weSo8 L3N0cnVjdG5hbWU+LiAgVGhlIDxwYXJhbWV0ZXI+c3JjPC9wYXJhbWV0ZXI+CisgICAgICAg ICAgcmVzdWx0IGlzIHdoYXQgaXMgYmVpbmcgY29waWVkIHdoaWxlIHRoZSA8cGFyYW1ldGVy PmRlc3Q8L3BhcmFtZXRlcj4gcmVzdWx0IGlzIHRoZSBjb3B5IGRlc3RpbmF0aW9uLgorICAg ICAgICAgIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIGRlZXAgY29weSBv ZiA8bGl0ZXJhbD5pbnN0YW5jZURhdGE8L2xpdGVyYWw+LCBzaW5jZQorICAgICAgICAgIDxs aXRlcmFsPlBRY29weVJlc3VsdDwvbGl0ZXJhbD4gY2Fubm90IGRvIHRoYXQuICBJZiB0aGUg ZXZlbnQgcHJvY2VkdXJlIGZhaWxzLCB0aGUgZW50aXJlIGNvcHkgb3BlcmF0aW9uCisgICAg ICAgICAgd2lsbCBmYWlsIGFuZCB0aGUgPHBhcmFtZXRlcj5kZXN0PC9wYXJhbWV0ZXI+IHJl c3VsdCB3aWxsIGJlIGNsZWFyZWQuCisgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlz dGl0ZW0+CisgICAgICAgPC92YXJsaXN0ZW50cnk+CisgCisgICAgICAgPHZhcmxpc3RlbnRy eT4KKyAgICAgICAgPHRlcm0+PGxpdGVyYWw+UEdFVlRfUkVTVUxUREVTVFJPWTwvbGl0ZXJh bD48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgIDxwYXJhPgorICAgICAg ICAgIFRoZSByZXN1bHQgZGVzdHJveSBldmVudCBpcyBmaXJlZCBpbiByZXNwb25zZSB0byBh IDxmdW5jdGlvbj5QUWNsZWFyPC9mdW5jdGlvbj4uCisgICAgICAgICAgSXQgaXMgdGhlIGV2 ZW50IHByb2NlZHVyZSdzIHJlc3BvbnNpYmlsaXR5IHRvIHByb3Blcmx5IGNsZWFudXAgaXRz IGV2ZW50IGRhdGEgYXMgbGlicHEKKyAgICAgICAgICBoYXMgbm8gYWJpbGl0eSB0byBtYW5h Z2UgdGhpcyBtZW1vcnkuICBGYWlsdXJlIHRvIHByb3Blcmx5IGNsZWFudXAgd2lsbCBsZWFk IHRvIG1lbW9yeQorICAgICAgICAgIGxlYWtzLgorICAgICAgICAgPHN5bm9wc2lzPgorIHR5 cGVkZWYgc3RydWN0CisgeworICAgICBjb25zdCBQR3Jlc3VsdCAqcmVzdWx0OworIH0gUEdF dmVudFJlc3VsdERlc3Ryb3k7PC9zeW5vcHNpcz4KKyAKKyAgICAgICAgICBXaGVuIGEgPGxp dGVyYWw+UEdFVlRfUkVTVUxUREVTVFJPWTwvbGl0ZXJhbD4gZXZlbnQgaXMgcmVjZWl2ZWQs IHRoZSA8cGFyYW1ldGVyPmV2dEluZm88L3BhcmFtZXRlcj4KKyAgICAgICAgICBwb2ludGVy IHNob3VsZCBiZSBjYXN0ZWQgdG8gYSA8c3RydWN0bmFtZT5QR0V2ZW50UmVzdWx0RGVzdHJv eSo8L3N0cnVjdG5hbWU+LiAgVGhpcyBldmVudCBpcyBmaXJlZAorICAgICAgICAgIHByaW9y IHRvIDxmdW5jdGlvbj5QUWNsZWFyPC9mdW5jdGlvbj4gcGVyZm9ybWluZyBhbnkgY2xlYW51 cC4gIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGV2ZW50CisgICAgICAgICAgcHJvY2VkdXJl IGlzIGlnbm9yZWQgc2luY2UgdGhlcmUgaXMgbm8gd2F5IG9mIGluZGljYXRpbmcgYSBmYWls dXJlIGZyb20gPGZ1bmN0aW9uPlBRY2xlYXI8L2Z1bmN0aW9uPi4KKyAgICAgICAgICBBbHNv LCBhbiBldmVudCBwcm9jZWR1cmUgZmFpbHVyZSBzaG91bGQgbm90IGFib3J0IHRoZSBwcm9j ZXNzIG9mIGNsZWFuaW5nIHVwIHVud2FudGVkIG1lbW9yeS4KKyAgICAgICAgIDwvcGFyYT4K KyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgIDwv dmFyaWFibGVsaXN0PgorICAgIDwvcGFyYT4KKyAgIDwvc2VjdDI+CisgCisgICA8c2VjdDIg aWQ9ImxpYnBxLWV2ZW50cy1wcm9jIj4KKyAgICA8dGl0bGU+RXZlbnQgQ2FsbGJhY2sgUHJv Y2VkdXJlPC90aXRsZT4KKyAgICA8dmFyaWFibGVsaXN0PgorICAgICA8dmFybGlzdGVudHJ5 PgorICAgICAgPHRlcm0+CisgICAgICAgPGZ1bmN0aW9uPlBHRXZlbnRQcm9jPC9mdW5jdGlv bj4KKyAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICA8cHJpbWFyeT5QR0V2ZW50UHJvYzwv cHJpbWFyeT4KKyAgICAgICA8L2luZGV4dGVybT4KKyAgICAgIDwvdGVybT4KKyAKKyAgICAg IDxsaXN0aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgVXNlciBjYWxsYmFjayBmdW5j dGlvbiB0aGF0IHJlY2VpdmVzIGV2ZW50cyBmcm9tIGxpYnBxLiBUaGUgYWRkcmVzcyBvZiB0 aGUgZXZlbnQKKyAgICAgICAgcHJvYyBpcyBhbHNvIHVzZWQgdG8gbG9va3VwIHRoZSA8bGl0 ZXJhbD5pbnN0YW5jZURhdGE8L2xpdGVyYWw+CisgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBh IDxzdHJ1Y3RuYW1lPlBHY29ubjwvc3RydWN0bmFtZT4gb3IgPHN0cnVjdG5hbWU+UEdyZXN1 bHQ8L3N0cnVjdG5hbWU+LgorICAgICAgICA8c3lub3BzaXM+dHlwZWRlZiBpbnQgKCpQR0V2 ZW50UHJvYykoUEdFdmVudElkIGV2dElkLCB2b2lkICpldnRJbmZvLCB2b2lkICpwYXNzVGhy b3VnaCk7PC9zeW5vcHNpcz4KKyAgICAgICA8L3BhcmE+CisgCisgICAgICAgPHBhcmE+Cisg ICAgICAgIFRoZSA8cGFyYW1ldGVyPmV2dElkPC9wYXJhbWV0ZXI+IGluaWRjYXRlcyB3aGlj aCA8bGl0ZXJhbD5QR0VWVF88L2xpdGVyYWw+IGV2ZW50IG9jY3VycmVkLgorICAgICAgICBU aGUgPHBhcmFtZXRlcj5ldnRJbmZvPC9wYXJhbWV0ZXI+IG11c3QgYmUgY2FzdGVkIHRvIHRo ZSBhcHByb3ByaWF0ZSBzdHJ1Y3R1cmU6IGV4LiBQR0VWVF9SRUdJU1RFUgorICAgICAgICBt ZWFucyBjYXN0IGV2dEluZm8gdG8gYSBQR0V2ZW50UmVnaXN0ZXIgcG9pbnRlci4gIFRoZSA8 cGFyYW1ldGVyPnBhc3NUaHJvdWdoPC9wYXJhbWV0ZXI+IGlzIHRoZQorICAgICAgICBwb2lu dGVyIHByb3ZpZGVkIHRvIHRoZSA8ZnVuY3Rpb24+UFFyZWdpc3RlckV2ZW50UHJvYzwvZnVu Y3Rpb24+LCB3aGljaCBjYW4gYmUgTlVMTC4gIFRoZSBmdW5jdGlvbgorICAgICAgICBzaG91 bGQgcmV0dXJuIGEgbm9uLXplcm8gdmFsdWUgaWYgaXQgc3VjY2VlZHMgYW5kIHplcm8gaWYg aXQgZmFpbHMuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92 YXJsaXN0ZW50cnk+CisgICAgPC92YXJpYWJsZWxpc3Q+CisgICA8L3NlY3QyPgorIAorICAg PHNlY3QyIGlkPSJsaWJwcS1ldmVudHMtZnVuY3MiPgorICAgIDx0aXRsZT5FdmVudCBGdW5j dGlvbnM8L3RpdGxlPgorICAgICA8dmFyaWFibGVsaXN0PgorICAgICA8dmFybGlzdGVudHJ5 PgorICAgICAgPHRlcm0+CisgICAgICAgPGZ1bmN0aW9uPlBRcmVnaXN0ZXJFdmVudFByb2M8 L2Z1bmN0aW9uPgorICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgIDxwcmltYXJ5PlBRcmVn aXN0ZXJFdmVudFByb2M8L3ByaW1hcnk+CisgICAgICAgPC9pbmRleHRlcm0+CisgICAgICA8 L3Rlcm0+CisgCisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIFJl Z2lzdGVycyBhbiBldmVudCBjYWxsYmFjayBwcm9jZWR1cmUgd2l0aCBsaWJwcS4KKyAgICAg ICAgPHN5bm9wc2lzPmludCBQUXJlZ2lzdGVyRXZlbnRQcm9jKFBHY29ubiAqY29ubiwgUEdF dmVudFByb2MgcHJvYywgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcGFzc1Rocm91Z2gpOzwv c3lub3BzaXM+CisgICAgICAgPC9wYXJhPgorIAorICAgICAgIDxwYXJhPgorICAgICAgICBS ZWdpc3RyYXRpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBvbiBldmVyeSBQR2Nvbm4geW91IHdh bnQgdG8gcmVjZWl2ZSBldmVudHMgYWJvdXQuCisgICAgICAgIFRoZXJlIGlzIG5vIGxpbWl0 IG9uIHRoZSBudW1iZXIgb2YgZXZlbnQgcHJvY2VkdXJlcyB0aGF0IGNhbiBiZSByZWdpc3Rl cmVkIHdpdGggYSBjb25uZWN0aW9uLgorICAgICAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyBh IG5vbi16ZXJvIHZhbHVlIGlmIGl0IHN1Y2NlZWRzIGFuZCB6ZXJvIGlmIGl0IGZhaWxzLgor ICAgICAgIDwvcGFyYT4KKyAKKyAgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIDxwYXJhbWV0 ZXI+cHJvYzwvcGFyYW1ldGVyPiBhcmd1bWVudCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgbGli cHEgZXZlbnQgaXMgZmlyZWQuICBJdHMKKyAgICAgICAgbWVtb3J5IGFkZHJlc3MgaXMgYWxz byB1c2VkIHRvIGxvb2t1cCA8bGl0ZXJhbD5pbnN0YW5jZURhdGE8L2xpdGVyYWw+LgorICAg ICAgICBUaGUgPHBhcmFtZXRlcj5uYW1lPC9wYXJhbWV0ZXI+IGFyZ3VtZW50IGlzIHVzZWQg dG8gY29udHJ1Y3QgZXJyb3IgbWVzc2FnZXMgdG8gYWlkCisgICAgICAgIGluIGRlYnVnZ2lu Zy4gIFRoaXMgdmFsdWUgY2Fubm90IGJlIE5VTEwgb3IgYSB6ZXJvLWxlbmd0aCBzdHJpbmcu CisgICAgICAgIFRoZSA8cGFyYW1ldGVyPnBhc3NUaHJvdWdoPC9wYXJhbWV0ZXI+IHBvaW50 ZXIgaXMgcGFzc2VkIHRvIHRoZSA8cGFyYW1ldGVyPnByb2M8L3BhcmFtZXRlcj4gd2hlbmV2 ZXIKKyAgICAgICAgYW4gZXZlbnQgb2NjdXJzLiBUaGlzIGFyZ3VtZW50IGNhbiBiZSBOVUxM LgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFybGlzdGVu dHJ5PgorIAorICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgPHRlcm0+CisgICAgICAgPGZ1 bmN0aW9uPlBRaW5zdGFuY2VEYXRhPC9mdW5jdGlvbj4KKyAgICAgICA8aW5kZXh0ZXJtPgor ICAgICAgICA8cHJpbWFyeT5QUWluc3RhbmNlRGF0YTwvcHJpbWFyeT4KKyAgICAgICA8L2lu ZGV4dGVybT4KKyAgICAgIDwvdGVybT4KKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFy YT4KKyAgICAgICAgUmV0dXJucyB0aGUgY29ubidzIGluc3RhbmNlRGF0YSBhc3NvY2lhdGVk IHdpdGggcHJvYy4KKyAgICAgICAgPHN5bm9wc2lzPnZvaWQgKlBRaW5zdGFuY2VEYXRhKGNv bnN0IFBHY29ubiAqY29ubiwgUEdFdmVudFByb2MgcHJvYyk7PC9zeW5vcHNpcz4KKyAgICAg ICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAK KyAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgIDx0ZXJtPgorICAgICAgIDxmdW5jdGlvbj5Q UXNldEluc3RhbmNlRGF0YTwvZnVuY3Rpb24+CisgICAgICAgPGluZGV4dGVybT4KKyAgICAg ICAgPHByaW1hcnk+UFFzZXRJbnN0YW5jZURhdGE8L3ByaW1hcnk+CisgICAgICAgPC9pbmRl eHRlcm0+CisgICAgICA8L3Rlcm0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+ CisgICAgICAgIFNldHMgdGhlIGNvbm4ncyBpbnN0YW5jZURhdGEgZm9yIHByb2MgdG8gZGF0 YS4gIFRoaXMgcmV1dHJucyBub24temVybyBmb3IKKyAgICAgICAgc3VjY2VlcyBhbmQgemVy byBmb3IgZmFpbHVyZS4KKyAgICAgICAgPHN5bm9wc2lzPmludCBQUXNldEluc3RhbmNlRGF0 YShQR2Nvbm4gKmNvbm4sIFBHRXZlbnRQcm9jIHByb2MsIHZvaWQgKmRhdGEpOzwvc3lub3Bz aXM+CisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0 ZW50cnk+CisgCisgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICA8dGVybT4KKyAgICAgICA8 ZnVuY3Rpb24+UFFyZXN1bHRJbnN0YW5jZURhdGE8L2Z1bmN0aW9uPgorICAgICAgIDxpbmRl eHRlcm0+CisgICAgICAgIDxwcmltYXJ5PlBRcmVzdWx0SW5zdGFuY2VEYXRhPC9wcmltYXJ5 PgorICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgPC90ZXJtPgorICAgICAgPGxpc3RpdGVt PgorICAgICAgIDxwYXJhPgorICAgICAgICBSZXR1cm5zIHRoZSByZXN1bHQncyBpbnN0YW5j ZURhdGEgYXNzb2NpYXRlZCBieSBwcm9jLgorICAgICAgICA8c3lub3BzaXM+dm9pZCAqUFFy ZXN1bHRJbnN0YW5jZURhdGEoY29uc3QgUEdyZXN1bHQgKnJlcywgUEdFdmVudFByb2MgcHJv Yyk7PC9zeW5vcHNpcz4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAg ICA8L3Zhcmxpc3RlbnRyeT4KKyAKKyAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgIDx0ZXJt PgorICAgICAgIDxmdW5jdGlvbj5QUXJlc3VsdFNldEluc3RhbmNlRGF0YTwvZnVuY3Rpb24+ CisgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgPHByaW1hcnk+UFFyZXN1bHRTZXRJbnN0 YW5jZURhdGE8L3ByaW1hcnk+CisgICAgICAgPC9pbmRleHRlcm0+CisgICAgICA8L3Rlcm0+ CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIFNldHMgdGhlIHJl c3VsdCdzIGluc3RhbmNlRGF0YSBmb3IgcHJvYyB0byBkYXRhLiAgVGhpcyByZXV0cm5zIG5v bi16ZXJvIGZvcgorICAgICAgICBzdWNjZWVzIGFuZCB6ZXJvIGZvciBmYWlsdXJlLgorICAg ICAgICA8c3lub3BzaXM+aW50IFBRcmVzdWx0U2V0SW5zdGFuY2VEYXRhKFBHcmVzdWx0ICpy ZXMsIFBHRXZlbnRQcm9jIHByb2MsIHZvaWQgKmRhdGEpOzwvc3lub3BzaXM+CisgICAgICAg PC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisgICAg PC92YXJpYWJsZWxpc3Q+CisgICA8L3NlY3QyPgorIAorICAgPHNlY3QyIGlkPSJsaWJwcS1l dmVudHMtZXhhbXBsZSI+CisgICAgPHRpdGxlPkV2ZW50IEV4YW1wbGU8L3RpdGxlPgorICAg IDxwcm9ncmFtbGlzdGluZz4KKyAvKiByZXF1aXJlZCBoZWFkZXIgZm9yIGxpYnBxIGV2ZW50 cyAobm90ZTogaW5jbHVkZXMgbGlicHEtZmUuaCkqLworICNpbmNsdWRlICZsdDtsaWJwcS1l dmVudHMuaCZndDsKKyAKKyAvKiBUaGUgaW5zdGFuY2VEYXRhICovCisgdHlwZWRlZiBzdHJ1 Y3QKKyB7CisgICAgIGludCBuOworICAgICBjaGFyICpzdHI7CisgfSBteWRhdGE7CisgCisg LyogUEdFdmVudFByb2MgKi8KKyBpbnQgbXlFdmVudFByb2MoUEdFdmVudElkIGV2dElkLCB2 b2lkICpldnRJbmZvLCB2b2lkICpwYXNzVGhyb3VnaCk7CisgCisgaW50IG1haW4odm9pZCkK KyB7CisgICAgIG15ZGF0YSAqZGF0YTsKKyAgICAgUEdyZXN1bHQgKnJlczsKKyAgICAgUEdj b25uICpjb25uID0gUFFjb25uZWN0ZGIoImRibmFtZSA9IHBvc3RncmVzIik7CisgCisgICAg IGlmIChQUXN0YXR1cyhjb25uKSAhPSBDT05ORUNUSU9OX09LKQorICAgICB7CisgICAgICAg ICBmcHJpbnRmKHN0ZGVyciwgIkNvbm5lY3Rpb24gdG8gZGF0YWJhc2UgZmFpbGVkOiAlcyIs CisgICAgICAgICAgICAgUFFlcnJvck1lc3NhZ2UoY29ubikpOworICAgICAgICAgUFFmaW5p c2goY29ubik7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgfQorIAorICAgICAvKiBjYWxs ZWQgb25jZSBvbiBhbnkgY29ubmVjdGlvbiB0aGF0IHNob3VsZCByZWNlaXZlIGV2ZW50cy4K KyAgICAgICogU2VuZHMgYSBQR0VWVF9SRUdJU1RFUiB0byBteUV2ZW50UHJvYy4KKyAgICAg ICovCisgICAgIGlmICghUFFyZWdpc3RlckV2ZW50UHJvYyhjb25uLCBteUV2ZW50UHJvYywg Im15ZGF0YV9wcm9jIiwgTlVMTCkpCisgICAgIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJy LCAiQ2Fubm90IHJlZ2lzdGVyIFBHRXZlbnRQcm9jXG4iKTsKKyAgICAgICAgIFBRZmluaXNo KGNvbm4pOworICAgICAgICAgcmV0dXJuIDE7CisgICAgIH0KKyAKKyAgICAgLyogY29ubiBp bnN0YW5jZURhdGEgaXMgYXZhaWxhYmxlICovCisgICAgIGRhdGEgPSBQUWluc3RhbmNlRGF0 YShjb25uLCBteUV2ZW50UHJvYyk7CisgCisgICAgIC8qIFNlbmRzIGEgUEdFVlRfUkVTVUxU Q1JFQVRFIHRvIG15RXZlbnRQcm9jICovCisgICAgIHJlcyA9IFBRZXhlYyhjb25uLCAiU0VM RUNUIDEgKyAxIik7CisgCisgICAgIC8qIHJlc3VsdCBpbnN0YW5jZURhdGEgaXMgYXZhaWxh YmxlICovCisgICAgIGRhdGEgPSBQUXJlc3VsdEluc3RhbmNlRGF0YShyZXMsIG15RXZlbnRQ cm9jKTsKKyAKKyAgICAgLyogSWYgUEdfQ09QWVJFU19FVkVOVFMgaXMgdXNlZCwgc2VuZHMg YSBQR0VWVF9SRVNVTFRDT1BZIHRvIG15RXZlbnRQcm9jICovCisgICAgIHJlc19jb3B5ID0g UFFjb3B5UmVzdWx0KHJlcywgUEdfQ09QWVJFU19UVVBMRVMgfCBQR19DT1BZUkVTX0VWRU5U Uyk7CisgCisgICAgIC8qIHJlc3VsdCBpbnN0YW5jZURhdGEgaXMgYXZhaWxhYmxlIGlmIFBH X0NPUFlSRVNfRVZFTlRTIHdhcworICAgICAgKiB1c2VkIGR1cmluZyB0aGUgUFFjb3B5UmVz dWx0IGNhbGwuCisgICAgICAqLworICAgICBkYXRhID0gUFFyZXN1bHRJbnN0YW5jZURhdGEo cmVzX2NvcHksIG15RXZlbnRQcm9jKTsKKyAKKyAgICAgLyogQm90aCBjbGVhcnMgc2VuZCBh IFBHRVZUX1JFU1VMVERFU1RPUlkgdG8gbXlFdmVudFByb2MgKi8KKyAgICAgUFFjbGVhcihy ZXMpOworICAgICBQUWNsZWFyKHJlc19jb3B5KTsKKyAKKyAgICAgLyogU2VuZHMgYSBQR0VW VF9DT05OREVTVFJPWSB0byBteUV2ZW50UHJvYyAqLworICAgICBQUWZpbmlzaChjb25uKTsK KyAKKyAgICAgcmV0dXJuIDA7CisgfQorIAorIGludCBteUV2ZW50UHJvYyhQR0V2ZW50SWQg ZXZ0SWQsIHZvaWQgKmV2dEluZm8sIHZvaWQgKnBhc3NUaHJvdWdoKQorIHsKKyAgICAgc3dp dGNoIChldnRJZCkKKyAgICAgeworICAgICAgICAgY2FzZSBQR0VWVF9SRUdJU1RFUjoKKyAg ICAgICAgIHsKKyAgICAgICAgICAgICBQR0V2ZW50UmVnaXN0ZXIgKmUgPSAoUEdFdmVudFJl Z2lzdGVyICopZXZ0SW5mbzsKKyAgICAgICAgICAgICBteWRhdGEgKmRhdGEgPSBnZXRfbXlk YXRhKGUtPmNvbm4pOworIAorICAgICAgICAgICAgIC8qIGFzc29jaWF0ZSBhcHAgc3BlY2lm aWMgZGF0YSB3aXRoIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgICBQUXNldEluc3RhbmNl RGF0YShlLT5jb25uLCBteUV2ZW50UHJvYywgZGF0YSk7CisgICAgICAgICAgICAgYnJlYWs7 CisgICAgICAgICB9CisgCisgICAgICAgICBjYXNlIFBHRVZUX0NPTk5SRVNFVDoKKyAgICAg ICAgIHsKKyAgICAgICAgICAgICBQR0V2ZW50Q29ublJlc2V0ICplID0gKFBHRXZlbnRDb25u UmVzZXQgKilldnRJbmZvOworICAgICAgICAgICAgIG15ZGF0YSAqZGF0YSA9IFBRaW5zdGFu Y2VEYXRhKGUtPmNvbm4sIG15RXZlbnRQcm9jKTsKKyAgICAgICAgICAgICBpZiAoZGF0YSkK KyAgICAgICAgICAgICAgIG1lbXNldChkYXRhLCAwLCBzaXplb2YobXlkYXRhKSk7CisgICAg ICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgCisgICAgICAgICBjYXNlIFBHRVZUX0NP Tk5ERVNUUk9ZOgorICAgICAgICAgeworICAgICAgICAgICAgIFBHRXZlbnRDb25uRGVzdHJv eSAqZSA9IChQR0V2ZW50Q29ubkRlc3Ryb3kgKilldnRJbmZvOworICAgICAgICAgICAgIG15 ZGF0YSAqZGF0YSA9IFBRaW5zdGFuY2VEYXRhKGUtPmNvbm4sIG15RXZlbnRQcm9jKTsKKyAK KyAgICAgICAgICAgICAvKiBmcmVlIGluc3RhbmNlIGRhdGEgYmVjYXVzZSB0aGUgY29ubiBp cyBiZWluZyBkZXN0cm95ZWQgKi8KKyAgICAgICAgICAgICBpZiAoZGF0YSkKKyAgICAgICAg ICAgICAgIGZyZWVfbXlkYXRhKGRhdGEpOworICAgICAgICAgICAgIGJyZWFrOworICAgICAg ICAgfQorIAorICAgICAgICAgY2FzZSBQR0VWVF9SRVNVTFRDUkVBVEU6CisgICAgICAgICB7 CisgICAgICAgICAgICAgUEdFdmVudFJlc3VsdENyZWF0ZSAqZSA9IChQR0V2ZW50UmVzdWx0 Q3JlYXRlICopZXZ0SW5mbzsKKyAgICAgICAgICAgICBteWRhdGEgKmNvbm5fZGF0YSA9IFBR aW5zdGFuY2VEYXRhKGUtPmNvbm4sIG15RXZlbnRQcm9jKTsKKyAgICAgICAgICAgICBteWRh dGEgKnJlc19kYXRhID0gZHVwX215ZGF0YShjb25uX2RhdGEpOworIAorICAgICAgICAgICAg IC8qIGFzc29jaWF0ZSBhcHAgc3BlY2lmaWMgZGF0YSB3aXRoIHJlc3VsdCAoY29weSBpdCBm cm9tIGNvbm4pICovCisgICAgICAgICAgICAgUFFzZXRSZXN1bHRJbnN0YW5jZURhdGEoZS0+ cmVzdWx0LCBteUV2ZW50UHJvYywgcmVzX2RhdGEpOworICAgICAgICAgICAgIGJyZWFrOwor ICAgICAgICAgfQorIAorICAgICAgICAgY2FzZSBQR0VWVF9SRVNVTFRDT1BZOgorICAgICAg ICAgeworICAgICAgICAgICAgIFBHRXZlbnRSZXN1bHRDb3B5ICplID0gKFBHRXZlbnRSZXN1 bHRDb3B5ICopZXZ0SW5mbzsKKyAgICAgICAgICAgICBteWRhdGEgKnNyY19kYXRhID0gUFFy ZXN1bHRJbnN0YW5jZURhdGEoZS0+c3JjLCBteUV2ZW50UHJvYyk7CisgICAgICAgICAgICAg bXlkYXRhICpkZXN0X2RhdGEgPSBkdXBfbXlkYXRhKHNyY19kYXRhKTsKKyAKKyAgICAgICAg ICAgICAvKiBhc3NvY2lhdGUgYXBwIHNwZWNpZmljIGRhdGEgd2l0aCByZXN1bHQgKGNvcHkg aXQgZnJvbSBhIHJlc3VsdCkgKi8KKyAgICAgICAgICAgICBQUXNldFJlc3VsdEluc3RhbmNl RGF0YShlLT5kZXN0LCBteUV2ZW50UHJvYywgZGVzdF9kYXRhKTsKKyAgICAgICAgICAgICBi cmVhazsKKyAgICAgICAgIH0KKyAKKyAgICAgICAgIGNhc2UgUEdFVlRfUkVTVUxUREVTVFJP WToKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBQR0V2ZW50UmVzdWx0RGVzdHJveSAqZSA9 IChQR0V2ZW50UmVzdWx0RGVzdHJveSAqKWV2dEluZm87CisgICAgICAgICAgICAgbXlkYXRh ICpkYXRhID0gUFFyZXN1bHRJbnN0YW5jZURhdGEoZS0+cmVzdWx0LCBteUV2ZW50UHJvYyk7 CisgCisgICAgICAgICAgICAgLyogZnJlZSBpbnN0YW5jZSBkYXRhIGJlY2F1c2UgdGhlIHJl c3VsdCBpcyBiZWluZyBkZXN0cm95ZWQgKi8KKyAgICAgICAgICAgICBpZiggZGF0YSkKKyAg ICAgICAgICAgICAgIGZyZWVfbXlkYXRhKGRhdGEpOworICAgICAgICAgICAgIGJyZWFrOwor ICAgICAgICAgfQorIAorICAgICAgICAgLyogdW5rbm93biBldmVudCBpZCwganVzdCByZXR1 cm4gVFJVRS4gKi8KKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgYnJlYWs7Cisg ICAgIH0KKyAKKyAgICAgcmV0dXJuIFRSVUU7IC8qIGV2ZW50IHByb2Nlc3Npbmcgc3VjY2Vl ZGVkICovCisgfSAgPC9wcm9ncmFtbGlzdGluZz4KKyAgIDwvc2VjdDI+CisgIDwvc2VjdDE+ CisgCiAgIDxzZWN0MSBpZD0ibGlicHEtbWlzYyI+CiAgICA8dGl0bGU+TWlzY2VsbGFuZW91 cyBGdW5jdGlvbnM8L3RpdGxlPgogIAogICAgPHBhcmE+CiAgICAgQXMgYWx3YXlzLCB0aGVy ZSBhcmUgc29tZSBmdW5jdGlvbnMgdGhhdCBqdXN0IGRvbid0IGZpdCBhbnl3aGVyZS4KICAg IDwvcGFyYT4KSW5kZXg6IHNyYy9pbnRlcmZhY2VzL2xpYnBxL01ha2VmaWxlCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KUkNTIGZpbGU6IC9wcm9qZWN0cy9jdnNyb290L3Bnc3FsL3NyYy9pbnRlcmZhY2Vz L2xpYnBxL01ha2VmaWxlLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjE2NgpkaWZmIC1DNiAt cjEuMTY2IE1ha2VmaWxlCioqKiBzcmMvaW50ZXJmYWNlcy9saWJwcS9NYWtlZmlsZQkxNiBB cHIgMjAwOCAxNDoxOTo1NiAtMDAwMAkxLjE2NgotLS0gc3JjL2ludGVyZmFjZXMvbGlicHEv TWFrZWZpbGUJMTcgU2VwIDIwMDggMDM6NTQ6MjAgLTAwMDAKKioqKioqKioqKioqKioqCioq KiAyOSw0MSAqKioqCiAgIyB0aGUgb2JqZWN0IGZpbGVzIGZyb20gbGlicGdwb3J0LCB0aGlz IHdvdWxkIG5vdCBiZSB0cnVlIG9uIGFsbAogICMgcGxhdGZvcm1zLgogIExJQlMgOj0gJChM SUJTOi1scGdwb3J0PSkKICAKICBPQkpTPQlmZS1hdXRoLm8gZmUtY29ubmVjdC5vIGZlLWV4 ZWMubyBmZS1taXNjLm8gZmUtcHJpbnQubyBmZS1sb2JqLm8gXAogIAlmZS1wcm90b2NvbDIu byBmZS1wcm90b2NvbDMubyBwcWV4cGJ1ZmZlci5vIHBxc2lnbmFsLm8gZmUtc2VjdXJlLm8g XAohIAltZDUubyBpcC5vIHdjaGFyLm8gZW5jbmFtZXMubyBub2Jsb2NrLm8gcGdzdHJjYXNl Y21wLm8gdGhyZWFkLm8gXAogIAkkKGZpbHRlciBjcnlwdC5vIGdldGFkZHJpbmZvLm8gaW5l dF9hdG9uLm8gb3Blbi5vIHNucHJpbnRmLm8gc3RyZXJyb3IubyBzdHJsY3B5Lm8gd2luMzJl cnJvci5vLCAkKExJQk9CSlMpKQogIAogIGlmZXEgKCQoUE9SVE5BTUUpLCBjeWd3aW4pCiAg b3ZlcnJpZGUgc2hsaWIgPSBjeWckKE5BTUUpJChETFNVRkZJWCkKICBlbmRpZgogIAotLS0g MjksNDEgLS0tLQogICMgdGhlIG9iamVjdCBmaWxlcyBmcm9tIGxpYnBncG9ydCwgdGhpcyB3 b3VsZCBub3QgYmUgdHJ1ZSBvbiBhbGwKICAjIHBsYXRmb3Jtcy4KICBMSUJTIDo9ICQoTElC UzotbHBncG9ydD0pCiAgCiAgT0JKUz0JZmUtYXV0aC5vIGZlLWNvbm5lY3QubyBmZS1leGVj Lm8gZmUtbWlzYy5vIGZlLXByaW50Lm8gZmUtbG9iai5vIFwKICAJZmUtcHJvdG9jb2wyLm8g ZmUtcHJvdG9jb2wzLm8gcHFleHBidWZmZXIubyBwcXNpZ25hbC5vIGZlLXNlY3VyZS5vIFwK ISAJbWQ1Lm8gaXAubyB3Y2hhci5vIGVuY25hbWVzLm8gbm9ibG9jay5vIHBnc3RyY2FzZWNt cC5vIHRocmVhZC5vIGxpYnBxLWV2ZW50cy5vIFwKICAJJChmaWx0ZXIgY3J5cHQubyBnZXRh ZGRyaW5mby5vIGluZXRfYXRvbi5vIG9wZW4ubyBzbnByaW50Zi5vIHN0cmVycm9yLm8gc3Ry bGNweS5vIHdpbjMyZXJyb3IubywgJChMSUJPQkpTKSkKICAKICBpZmVxICgkKFBPUlROQU1F KSwgY3lnd2luKQogIG92ZXJyaWRlIHNobGliID0gY3lnJChOQU1FKSQoRExTVUZGSVgpCiAg ZW5kaWYKICAKKioqKioqKioqKioqKioqCioqKiAxMDMsMTIzICoqKioKICAKICAkKHRvcF9i dWlsZGRpcikvc3JjL3BvcnQvcGdfY29uZmlnX3BhdGhzLmg6CiAgCSQoTUFLRSkgLUMgJCh0 b3BfYnVpbGRkaXIpL3NyYy9wb3J0IHBnX2NvbmZpZ19wYXRocy5oCiAgCiAgaW5zdGFsbDog YWxsIGluc3RhbGxkaXJzIGluc3RhbGwtbGliCiAgCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2Rp cikvbGlicHEtZmUuaCAnJChERVNURElSKSQoaW5jbHVkZWRpciknCiAgCSQoSU5TVEFMTF9E QVRBKSAkKHNyY2RpcikvbGlicHEtaW50LmggJyQoREVTVERJUikkKGluY2x1ZGVkaXJfaW50 ZXJuYWwpJwogIAkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL3BxZXhwYnVmZmVyLmggJyQo REVTVERJUikkKGluY2x1ZGVkaXJfaW50ZXJuYWwpJwogIAkkKElOU1RBTExfREFUQSkgJChz cmNkaXIpL3BnX3NlcnZpY2UuY29uZi5zYW1wbGUgJyQoREVTVERJUikkKGRhdGFkaXIpL3Bn X3NlcnZpY2UuY29uZi5zYW1wbGUnCiAgCiAgaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLWxp YgogIAkkKG1raW5zdGFsbGRpcnMpICckKERFU1RESVIpJChpbmNsdWRlZGlyKScgJyQoREVT VERJUikkKGluY2x1ZGVkaXJfaW50ZXJuYWwpJwogIAogIHVuaW5zdGFsbDogdW5pbnN0YWxs LWxpYgohIAlybSAtZiAnJChERVNURElSKSQoaW5jbHVkZWRpcikvbGlicHEtZmUuaCcgJyQo REVTVERJUikkKGluY2x1ZGVkaXJfaW50ZXJuYWwpL2xpYnBxLWludC5oJyAnJChERVNURElS KSQoaW5jbHVkZWRpcl9pbnRlcm5hbCkvcHFleHBidWZmZXIuaCcgJyQoREVTVERJUikkKGRh dGFkaXIpL3BnX3NlcnZpY2UuY29uZi5zYW1wbGUnCiAgCiAgY2xlYW4gZGlzdGNsZWFuOiBj bGVhbi1saWIKICAJcm0gLWYgJChPQkpTKSBwZ19jb25maWdfcGF0aHMuaCBjcnlwdC5jIGdl dGFkZHJpbmZvLmMgaW5ldF9hdG9uLmMgbm9ibG9jay5jIG9wZW4uYyBwZ3N0cmNhc2VjbXAu YyBzbnByaW50Zi5jIHN0cmVycm9yLmMgc3RybGNweS5jIHRocmVhZC5jIG1kNS5jIGlwLmMg ZW5jbmFtZXMuYyB3Y2hhci5jIHdpbjMyZXJyb3IuYyBwZ3NsZWVwLmMgcHRocmVhZC5oIGxp YnBxLnJjCiAgIyBNaWdodCBiZSBsZWZ0IG92ZXIgZnJvbSBhIFdpbjMyIGNsaWVudC1vbmx5 IGJ1aWxkCiAgCXJtIC1mIHBnX2NvbmZpZ19wYXRocy5oCiAgCi0tLSAxMDMsMTI0IC0tLS0K ICAKICAkKHRvcF9idWlsZGRpcikvc3JjL3BvcnQvcGdfY29uZmlnX3BhdGhzLmg6CiAgCSQo TUFLRSkgLUMgJCh0b3BfYnVpbGRkaXIpL3NyYy9wb3J0IHBnX2NvbmZpZ19wYXRocy5oCiAg CiAgaW5zdGFsbDogYWxsIGluc3RhbGxkaXJzIGluc3RhbGwtbGliCiAgCSQoSU5TVEFMTF9E QVRBKSAkKHNyY2RpcikvbGlicHEtZmUuaCAnJChERVNURElSKSQoaW5jbHVkZWRpciknCisg CSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvbGlicHEtZXZlbnRzLmggJyQoREVTVERJUikk KGluY2x1ZGVkaXIpJwogIAkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2xpYnBxLWludC5o ICckKERFU1RESVIpJChpbmNsdWRlZGlyX2ludGVybmFsKScKICAJJChJTlNUQUxMX0RBVEEp ICQoc3JjZGlyKS9wcWV4cGJ1ZmZlci5oICckKERFU1RESVIpJChpbmNsdWRlZGlyX2ludGVy bmFsKScKICAJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9wZ19zZXJ2aWNlLmNvbmYuc2Ft cGxlICckKERFU1RESVIpJChkYXRhZGlyKS9wZ19zZXJ2aWNlLmNvbmYuc2FtcGxlJwogIAog IGluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1saWIKICAJJChta2luc3RhbGxkaXJzKSAnJChE RVNURElSKSQoaW5jbHVkZWRpciknICckKERFU1RESVIpJChpbmNsdWRlZGlyX2ludGVybmFs KScKICAKICB1bmluc3RhbGw6IHVuaW5zdGFsbC1saWIKISAJcm0gLWYgJyQoREVTVERJUikk KGluY2x1ZGVkaXIpL2xpYnBxLWZlLmgnICckKERFU1RESVIpJChpbmNsdWRlZGlyKS9saWJw cS1ldmVudHMuaCcgJyQoREVTVERJUikkKGluY2x1ZGVkaXJfaW50ZXJuYWwpL2xpYnBxLWlu dC5oJyAnJChERVNURElSKSQoaW5jbHVkZWRpcl9pbnRlcm5hbCkvcHFleHBidWZmZXIuaCcg JyQoREVTVERJUikkKGRhdGFkaXIpL3BnX3NlcnZpY2UuY29uZi5zYW1wbGUnCiAgCiAgY2xl YW4gZGlzdGNsZWFuOiBjbGVhbi1saWIKICAJcm0gLWYgJChPQkpTKSBwZ19jb25maWdfcGF0 aHMuaCBjcnlwdC5jIGdldGFkZHJpbmZvLmMgaW5ldF9hdG9uLmMgbm9ibG9jay5jIG9wZW4u YyBwZ3N0cmNhc2VjbXAuYyBzbnByaW50Zi5jIHN0cmVycm9yLmMgc3RybGNweS5jIHRocmVh ZC5jIG1kNS5jIGlwLmMgZW5jbmFtZXMuYyB3Y2hhci5jIHdpbjMyZXJyb3IuYyBwZ3NsZWVw LmMgcHRocmVhZC5oIGxpYnBxLnJjCiAgIyBNaWdodCBiZSBsZWZ0IG92ZXIgZnJvbSBhIFdp bjMyIGNsaWVudC1vbmx5IGJ1aWxkCiAgCXJtIC1mIHBnX2NvbmZpZ19wYXRocy5oCiAgCklu ZGV4OiBzcmMvaW50ZXJmYWNlcy9saWJwcS9leHBvcnRzLnR4dAo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJD UyBmaWxlOiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMvaW50ZXJmYWNlcy9saWJwcS9l eHBvcnRzLnR4dCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xOQpkaWZmIC1DNiAtcjEuMTkg ZXhwb3J0cy50eHQKKioqIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2V4cG9ydHMudHh0CTE5IE1h ciAyMDA4IDAwOjM5OjMzIC0wMDAwCTEuMTkKLS0tIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2V4 cG9ydHMudHh0CTE3IFNlcCAyMDA4IDAzOjU0OjIwIC0wMDAwCioqKioqKioqKioqKioqKgoq KiogMTM4LDE0MyAqKioqCi0tLSAxMzgsMTUyIC0tLS0KICBQUXNlbmREZXNjcmliZVBvcnRh bCAgICAgIDEzNgogIGxvX3RydW5jYXRlICAgICAgICAgICAgICAgMTM3CiAgUFFjb25uZWN0 aW9uVXNlZFBhc3N3b3JkICAxMzgKICBwZ192YWxpZF9zZXJ2ZXJfZW5jb2RpbmdfaWQgMTM5 CiAgUFFjb25uZWN0aW9uTmVlZHNQYXNzd29yZCAxNDAKICBsb19pbXBvcnRfd2l0aF9vaWQJ CSAgMTQxCisgUFFjb3B5UmVzdWx0ICAgICAgICAgICAgICAxNDIKKyBQUXNldFJlc3VsdEF0 dHJzICAgICAgICAgIDE0MworIFBRc2V0dmFsdWUgICAgICAgICAgICAgICAgMTQ0CisgUFFy ZXN1bHRBbGxvYyAgICAgICAgICAgICAxNDUKKyBQUXJlZ2lzdGVyRXZlbnRQcm9jICAgICAg IDE0NgorIFBRaW5zdGFuY2VEYXRhICAgICAgICAgICAgMTQ3CisgUFFzZXRJbnN0YW5jZURh dGEgICAgICAgICAxNDgKKyBQUXJlc3VsdEluc3RhbmNlRGF0YSAgICAgIDE0OQorIFBRcmVz dWx0U2V0SW5zdGFuY2VEYXRhICAgMTUwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpJ bmRleDogc3JjL2ludGVyZmFjZXMvbGlicHEvZmUtY29ubmVjdC5jCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K UkNTIGZpbGU6IC9wcm9qZWN0cy9jdnNyb290L3Bnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBx L2ZlLWNvbm5lY3QuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4zNTkKZGlmZiAtQzYgLXIx LjM1OSBmZS1jb25uZWN0LmMKKioqIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3Qu YwkyOSBNYXkgMjAwOCAyMjowMjo0NCAtMDAwMAkxLjM1OQotLS0gc3JjL2ludGVyZmFjZXMv bGlicHEvZmUtY29ubmVjdC5jCTE3IFNlcCAyMDA4IDAzOjU0OjIwIC0wMDAwCioqKioqKioq KioqKioqKgoqKiogMTk3MSwxOTgyICoqKioKLS0tIDE5NzEsMjAwMSAtLS0tCiAgICogcmVs ZWFzZSBkYXRhIHRoYXQgaXMgdG8gYmUgaGVsZCBmb3IgdGhlIGxpZmUgb2YgdGhlIFBHY29u biBzdHJ1Y3R1cmUuCiAgICogSWYgYSB2YWx1ZSBvdWdodCB0byBiZSBjbGVhcmVkL2ZyZWVk IGR1cmluZyBQUXJlc2V0KCksIGRvIGl0IHRoZXJlIG5vdCBoZXJlLgogICAqLwogIHN0YXRp YyB2b2lkCiAgZnJlZVBHY29ubihQR2Nvbm4gKmNvbm4pCiAgeworIAlpbnQgaTsKKyAJUEdF dmVudENvbm5EZXN0cm95IGV2dDsKKyAKKyAJLyogTGV0IHRoZSBldmVudCBwcm9jcyBjbGVh bnVwIHRoZWlyIHN0YXRlIGRhdGEgKi8KKyAJZm9yIChpID0gMDsgaSA8IGNvbm4tPm5FdmVu dHM7IGkrKykKKyAJeworIAkJZXZ0LmNvbm4gPSBjb25uOworIAkJKHZvaWQpY29ubi0+ZXZl bnRzW2ldLnByb2MoUEdFVlRfQ09OTkRFU1RST1ksICZldnQsIGNvbm4tPmV2ZW50c1tpXS5w YXNzVGhyb3VnaCk7CisgCQlmcmVlKGNvbm4tPmV2ZW50c1tpXS5uYW1lKTsKKyAJfQorIAor IAkvKiBmcmVlIHRoZSBQR0V2ZW50IGFycmF5ICovCisgCWlmIChjb25uLT5ldmVudHMpCisg CXsKKyAJCWZyZWUoY29ubi0+ZXZlbnRzKTsKKyAJCWNvbm4tPmV2ZW50cyA9IE5VTEw7Cisg CQljb25uLT5uRXZlbnRzID0gY29ubi0+ZXZlbnRBcnJTaXplID0gMDsKKyAJfQorIAogIAlp ZiAoY29ubi0+cGdob3N0KQogIAkJZnJlZShjb25uLT5wZ2hvc3QpOwogIAlpZiAoY29ubi0+ cGdob3N0YWRkcikKICAJCWZyZWUoY29ubi0+cGdob3N0YWRkcik7CiAgCWlmIChjb25uLT5w Z3BvcnQpCiAgCQlmcmVlKGNvbm4tPnBncG9ydCk7CioqKioqKioqKioqKioqKgoqKiogMjE1 MiwyMTY1ICoqKioKICBQUXJlc2V0KFBHY29ubiAqY29ubikKICB7CiAgCWlmIChjb25uKQog IAl7CiAgCQljbG9zZVBHY29ubihjb25uKTsKICAKISAJCWlmIChjb25uZWN0REJTdGFydChj b25uKSkKISAJCQkodm9pZCkgY29ubmVjdERCQ29tcGxldGUoY29ubik7CiAgCX0KICB9CiAg CiAgCiAgLyoKICAgKiBQUXJlc2V0U3RhcnQ6Ci0tLSAyMTcxLDIyMDEgLS0tLQogIFBRcmVz ZXQoUEdjb25uICpjb25uKQogIHsKICAJaWYgKGNvbm4pCiAgCXsKICAJCWNsb3NlUEdjb25u KGNvbm4pOwogIAohIAkJaWYgKGNvbm5lY3REQlN0YXJ0KGNvbm4pICYmIGNvbm5lY3REQkNv bXBsZXRlKGNvbm4pKQohIAkJewohIAkJCWludCBpOwohIAkJCVBHRXZlbnRDb25uUmVzZXQg ZXZ0OwohIAohIAkJCWZvciAoaSA9IDA7IGkgPCBjb25uLT5uRXZlbnRzOyBpKyspCiEgCQkJ ewohIAkJCQlldnQuY29ubiA9IGNvbm47CiEgCiEgCQkJCWlmICghY29ubi0+ZXZlbnRzW2ld LnByb2MoUEdFVlRfQ09OTlJFU0VULCAmZXZ0LCBjb25uLT5ldmVudHNbaV0ucGFzc1Rocm91 Z2gpKQohIAkJCQl7CiEgCQkJCQljb25uLT5zdGF0dXMgPSBDT05ORUNUSU9OX0JBRDsKISAJ CQkJCXByaW50ZlBRRXhwQnVmZmVyKCZjb25uLT5lcnJvck1lc3NhZ2UsCiEgCQkJCQkJbGli cHFfZ2V0dGV4dCgiUEdFdmVudFByb2MgXCIlc1wiIGZhaWxlZCBkdXJpbmcgUEdFVlRfQ09O TlJFU0VUIGV2ZW50XG4iKSwKISAJCQkJCQljb25uLT5ldmVudHNbaV0ubmFtZSk7CiEgCQkJ CQlicmVhazsKISAJCQkJfQohIAkJCX0KISAJCX0KICAJfQogIH0KICAKICAKICAvKgogICAq IFBRcmVzZXRTdGFydDoKKioqKioqKioqKioqKioqCioqKiAyMTg3LDIxOTkgKioqKgogICAq IGNsb3NlcyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBhbmQgbWFrZXMgYSBuZXcgb25lCiAg ICovCiAgUG9zdGdyZXNQb2xsaW5nU3RhdHVzVHlwZQogIFBRcmVzZXRQb2xsKFBHY29ubiAq Y29ubikKICB7CiAgCWlmIChjb25uKQohIAkJcmV0dXJuIFBRY29ubmVjdFBvbGwoY29ubik7 CiAgCiAgCXJldHVybiBQR1JFU19QT0xMSU5HX0ZBSUxFRDsKICB9CiAgCiAgLyoKICAgKiBQ UWNhbmNlbEdldDogZ2V0IGEgUEdjYW5jZWwgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8g YSBjb25uZWN0aW9uLgotLS0gMjIyMywyMjU5IC0tLS0KICAgKiBjbG9zZXMgdGhlIGV4aXN0 aW5nIGNvbm5lY3Rpb24gYW5kIG1ha2VzIGEgbmV3IG9uZQogICAqLwogIFBvc3RncmVzUG9s bGluZ1N0YXR1c1R5cGUKICBQUXJlc2V0UG9sbChQR2Nvbm4gKmNvbm4pCiAgewogIAlpZiAo Y29ubikKISAJewohIAkJUG9zdGdyZXNQb2xsaW5nU3RhdHVzVHlwZSBzdGF0dXMgPSBQUWNv bm5lY3RQb2xsKGNvbm4pOwohIAohIAkJaWYgKHN0YXR1cyA9PSBQR1JFU19QT0xMSU5HX09L KQohIAkJewohIAkJCWludCBpOwohIAkJCVBHRXZlbnRDb25uUmVzZXQgZXZ0OwohIAohIAkJ CWZvciAoaSA9IDA7IGkgPCBjb25uLT5uRXZlbnRzOyBpKyspCiEgCQkJewohIAkJCQlldnQu Y29ubiA9IGNvbm47CiEgCiEgCQkJCWlmICghY29ubi0+ZXZlbnRzW2ldLnByb2MoUEdFVlRf Q09OTlJFU0VULCAmZXZ0LCBjb25uLT5ldmVudHNbaV0ucGFzc1Rocm91Z2gpKQohIAkJCQl7 CiEgCQkJCQljb25uLT5zdGF0dXMgPSBDT05ORUNUSU9OX0JBRDsKISAJCQkJCXByaW50ZlBR RXhwQnVmZmVyKCZjb25uLT5lcnJvck1lc3NhZ2UsCiEgCQkJCQkJbGlicHFfZ2V0dGV4dCgi UEdFdmVudFByb2MgXCIlc1wiIGZhaWxlZCBkdXJpbmcgUEdFVlRfQ09OTlJFU0VUIGV2ZW50 XG4iKSwKISAJCQkJCQljb25uLT5ldmVudHNbaV0ubmFtZSk7CiEgCQkJCQlyZXR1cm4gUEdS RVNfUE9MTElOR19GQUlMRUQ7CiEgCQkJCX0KISAJCQl9CiEgCQl9CiEgCiEgCQlyZXR1cm4g c3RhdHVzOwohIAl9CiAgCiAgCXJldHVybiBQR1JFU19QT0xMSU5HX0ZBSUxFRDsKICB9CiAg CiAgLyoKICAgKiBQUWNhbmNlbEdldDogZ2V0IGEgUEdjYW5jZWwgc3RydWN0dXJlIGNvcnJl c3BvbmRpbmcgdG8gYSBjb25uZWN0aW9uLgpJbmRleDogc3JjL2ludGVyZmFjZXMvbGlicHEv ZmUtZXhlYy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9wcm9qZWN0cy9jdnNyb290L3Bn c3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWV4ZWMuYyx2CnJldHJpZXZpbmcgcmV2aXNp b24gMS4xOTcKZGlmZiAtQzYgLXIxLjE5NyBmZS1leGVjLmMKKioqIHNyYy9pbnRlcmZhY2Vz L2xpYnBxL2ZlLWV4ZWMuYwkxMCBTZXAgMjAwOCAxNzowMTowNyAtMDAwMAkxLjE5NwotLS0g c3JjL2ludGVyZmFjZXMvbGlicHEvZmUtZXhlYy5jCTE3IFNlcCAyMDA4IDAzOjU0OjIwIC0w MDAwCioqKioqKioqKioqKioqKgoqKiogNjAsNzIgKioqKgogIAkJCQlpbnQgcmVzdWx0Rm9y bWF0KTsKICBzdGF0aWMgdm9pZCBwYXJzZUlucHV0KFBHY29ubiAqY29ubik7CiAgc3RhdGlj IGJvb2wgUFFleGVjU3RhcnQoUEdjb25uICpjb25uKTsKICBzdGF0aWMgUEdyZXN1bHQgKlBR ZXhlY0ZpbmlzaChQR2Nvbm4gKmNvbm4pOwogIHN0YXRpYyBpbnQgUFFzZW5kRGVzY3JpYmUo UEdjb25uICpjb25uLCBjaGFyIGRlc2NfdHlwZSwKICAJCQkgICBjb25zdCBjaGFyICpkZXNj X3RhcmdldCk7CiEgCiAgCiAgLyogLS0tLS0tLS0tLS0tLS0tLQogICAqIFNwYWNlIG1hbmFn ZW1lbnQgZm9yIFBHcmVzdWx0LgogICAqCiAgICogRm9ybWVybHksIGxpYnBxIGRpZCBhIHNl cGFyYXRlIG1hbGxvYygpIGZvciBlYWNoIGZpZWxkIG9mIGVhY2ggdHVwbGUKICAgKiByZXR1 cm5lZCBieSBhIHF1ZXJ5LiAgVGhpcyB3YXMgcmVtYXJrYWJseSBleHBlbnNpdmUgLS0tIG1h bGxvYy9mcmVlCi0tLSA2MCw3MiAtLS0tCiAgCQkJCWludCByZXN1bHRGb3JtYXQpOwogIHN0 YXRpYyB2b2lkIHBhcnNlSW5wdXQoUEdjb25uICpjb25uKTsKICBzdGF0aWMgYm9vbCBQUWV4 ZWNTdGFydChQR2Nvbm4gKmNvbm4pOwogIHN0YXRpYyBQR3Jlc3VsdCAqUFFleGVjRmluaXNo KFBHY29ubiAqY29ubik7CiAgc3RhdGljIGludCBQUXNlbmREZXNjcmliZShQR2Nvbm4gKmNv bm4sIGNoYXIgZGVzY190eXBlLAogIAkJCSAgIGNvbnN0IGNoYXIgKmRlc2NfdGFyZ2V0KTsK ISBzdGF0aWMgaW50IGNoZWNrX2ZpZWxkX251bWJlcihjb25zdCBQR3Jlc3VsdCAqcmVzLCBp bnQgZmllbGRfbnVtKTsKICAKICAvKiAtLS0tLS0tLS0tLS0tLS0tCiAgICogU3BhY2UgbWFu YWdlbWVudCBmb3IgUEdyZXN1bHQuCiAgICoKICAgKiBGb3JtZXJseSwgbGlicHEgZGlkIGEg c2VwYXJhdGUgbWFsbG9jKCkgZm9yIGVhY2ggZmllbGQgb2YgZWFjaCB0dXBsZQogICAqIHJl dHVybmVkIGJ5IGEgcXVlcnkuICBUaGlzIHdhcyByZW1hcmthYmx5IGV4cGVuc2l2ZSAtLS0g bWFsbG9jL2ZyZWUKKioqKioqKioqKioqKioqCioqKiAxMjEsMTQxICoqKioKICAjZGVmaW5l IFBHUkVTVUxUX0RBVEFfQkxPQ0tTSVpFCQkyMDQ4CiAgI2RlZmluZSBQR1JFU1VMVF9BTElH Tl9CT1VOREFSWQkJTUFYSU1VTV9BTElHTk9GCQkvKiBmcm9tIGNvbmZpZ3VyZSAqLwogICNk ZWZpbmUgUEdSRVNVTFRfQkxPQ0tfT1ZFUkhFQUQJCU1heChzaXplb2YoUEdyZXN1bHRfZGF0 YSksIFBHUkVTVUxUX0FMSUdOX0JPVU5EQVJZKQogICNkZWZpbmUgUEdSRVNVTFRfU0VQX0FM TE9DX1RIUkVTSE9MRAkoUEdSRVNVTFRfREFUQV9CTE9DS1NJWkUgLyAyKQogIAogIAogIC8q CiAgICogUFFtYWtlRW1wdHlQR3Jlc3VsdAogICAqCSByZXR1cm5zIGEgbmV3bHkgYWxsb2Nh dGVkLCBpbml0aWFsaXplZCBQR3Jlc3VsdCB3aXRoIGdpdmVuIHN0YXR1cy4KICAgKgkgSWYg Y29ubiBpcyBub3QgTlVMTCBhbmQgc3RhdHVzIGluZGljYXRlcyBhbiBlcnJvciwgdGhlIGNv bm4ncwogICAqCSBlcnJvck1lc3NhZ2UgaXMgY29waWVkLgogICAqCiAgICogTm90ZSB0aGlz IGlzIGV4cG9ydGVkIC0tLSB5b3Ugd291bGRuJ3QgdGhpbmsgYW4gYXBwbGljYXRpb24gd291 bGQgbmVlZAogICAqIHRvIGJ1aWxkIGl0cyBvd24gUEdyZXN1bHRzLCBidXQgdGhpcyBoYXMg cHJvdmVuIHVzZWZ1bCBpbiBib3RoIGxpYnBndGNsCiEgICogYW5kIHRoZSBQZXJsNSBpbnRl cmZhY2UsIHNvIG1heWJlIGl0J3Mgbm90IHNvIHVucmVhc29uYWJsZS4KICAgKi8KICAKICBQ R3Jlc3VsdCAqCiAgUFFtYWtlRW1wdHlQR3Jlc3VsdChQR2Nvbm4gKmNvbm4sIEV4ZWNTdGF0 dXNUeXBlIHN0YXR1cykKICB7CiAgCVBHcmVzdWx0ICAgKnJlc3VsdDsKLS0tIDEyMSwxNzcg LS0tLQogICNkZWZpbmUgUEdSRVNVTFRfREFUQV9CTE9DS1NJWkUJCTIwNDgKICAjZGVmaW5l IFBHUkVTVUxUX0FMSUdOX0JPVU5EQVJZCQlNQVhJTVVNX0FMSUdOT0YJCS8qIGZyb20gY29u ZmlndXJlICovCiAgI2RlZmluZSBQR1JFU1VMVF9CTE9DS19PVkVSSEVBRAkJTWF4KHNpemVv ZihQR3Jlc3VsdF9kYXRhKSwgUEdSRVNVTFRfQUxJR05fQk9VTkRBUlkpCiAgI2RlZmluZSBQ R1JFU1VMVF9TRVBfQUxMT0NfVEhSRVNIT0xECShQR1JFU1VMVF9EQVRBX0JMT0NLU0laRSAv IDIpCiAgCiAgCisgLyogRG9lcyBub3QgZHVwbGljYXRlIHRoZSBldmVudCBpbnN0YW5jZSBk YXRhLCBzZXRzIHRoaXMgdG8gTlVMTCAqLworIHN0YXRpYyBQR0V2ZW50ICoKKyBkdXBFdmVu dHMoUEdFdmVudCAqZXZlbnRzLCBpbnQgY291bnQpCisgeworIAlpbnQgaTsKKyAJUEdFdmVu dCAqbmV3RXZlbnRzOworIAorIAlpZiAoIWV2ZW50cyB8fCBjb3VudCA8PSAwKQorIAkJcmV0 dXJuIE5VTEw7CisgCisgCW5ld0V2ZW50cyA9IChQR0V2ZW50ICopIG1hbGxvYyhjb3VudCAq IHNpemVvZihQR0V2ZW50KSk7CisgCWlmICghbmV3RXZlbnRzKQorIAkJcmV0dXJuIE5VTEw7 CisgCisgCW1lbWNweShuZXdFdmVudHMsIGV2ZW50cywgY291bnQgKiBzaXplb2YoUEdFdmVu dCkpOworIAorIAkvKiBOVUxMIG91dCB0aGUgZGF0YSBwb2ludGVyIGFuZCBkZWVwIGNvcHkg bmFtZSAqLworIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAJeworIAkJbmV3RXZl bnRzW2ldLm5hbWUgPSBzdHJkdXAobmV3RXZlbnRzW2ldLm5hbWUpOworIAkJaWYgKCFuZXdF dmVudHNbaV0ubmFtZSkKKyAJCXsKKyAJCQl3aGlsZSAoLS1pID49IDApCisgCQkJCWZyZWUo bmV3RXZlbnRzW2ldLm5hbWUpOworIAkJCWZyZWUobmV3RXZlbnRzKTsKKyAJCQlyZXR1cm4g TlVMTDsKKyAJCX0KKyAKKyAJCW5ld0V2ZW50c1tpXS5kYXRhID0gTlVMTDsKKyAJfQorIAor IAlyZXR1cm4gbmV3RXZlbnRzOworIH0KKyAKICAvKgogICAqIFBRbWFrZUVtcHR5UEdyZXN1 bHQKICAgKgkgcmV0dXJucyBhIG5ld2x5IGFsbG9jYXRlZCwgaW5pdGlhbGl6ZWQgUEdyZXN1 bHQgd2l0aCBnaXZlbiBzdGF0dXMuCiAgICoJIElmIGNvbm4gaXMgbm90IE5VTEwgYW5kIHN0 YXR1cyBpbmRpY2F0ZXMgYW4gZXJyb3IsIHRoZSBjb25uJ3MKICAgKgkgZXJyb3JNZXNzYWdl IGlzIGNvcGllZC4KICAgKgogICAqIE5vdGUgdGhpcyBpcyBleHBvcnRlZCAtLS0geW91IHdv dWxkbid0IHRoaW5rIGFuIGFwcGxpY2F0aW9uIHdvdWxkIG5lZWQKICAgKiB0byBidWlsZCBp dHMgb3duIFBHcmVzdWx0cywgYnV0IHRoaXMgaGFzIHByb3ZlbiB1c2VmdWwgaW4gYm90aCBs aWJwZ3RjbAohICAqIGFuZCB0aGUgUGVybDUgaW50ZXJmYWNlLCBzbyBtYXliZSBpdCdzIG5v dCBzbyB1bnJlYXNvbmFibGUuICBJZiBjb25uIGlzCiEgICogbm90IE5VTEwsIHRoZSBQR2V2 ZW50cyBhcnJheSB3aWxsIGJlIGNvcGllZCBmcm9tIHRoZSBQR2Nvbm4gdG8gdGhlCiEgICog Y3JlYXRlZCBQR3Jlc3VsdC4KICAgKi8KICAKICBQR3Jlc3VsdCAqCiAgUFFtYWtlRW1wdHlQ R3Jlc3VsdChQR2Nvbm4gKmNvbm4sIEV4ZWNTdGF0dXNUeXBlIHN0YXR1cykKICB7CiAgCVBH cmVzdWx0ICAgKnJlc3VsdDsKKioqKioqKioqKioqKioqCioqKiAxNTcsMTc1ICoqKioKLS0t IDE5MywyMjYgLS0tLQogIAlyZXN1bHQtPmVyck1zZyA9IE5VTEw7CiAgCXJlc3VsdC0+ZXJy RmllbGRzID0gTlVMTDsKICAJcmVzdWx0LT5udWxsX2ZpZWxkWzBdID0gJ1wwJzsKICAJcmVz dWx0LT5jdXJCbG9jayA9IE5VTEw7CiAgCXJlc3VsdC0+Y3VyT2Zmc2V0ID0gMDsKICAJcmVz dWx0LT5zcGFjZUxlZnQgPSAwOworIAlyZXN1bHQtPm5FdmVudHMgPSAwOworIAlyZXN1bHQt PmV2ZW50cyA9IE5VTEw7CiAgCiAgCWlmIChjb25uKQogIAl7CiAgCQkvKiBjb3B5IGNvbm5l Y3Rpb24gZGF0YSB3ZSBtaWdodCBuZWVkIGZvciBvcGVyYXRpb25zIG9uIFBHcmVzdWx0ICov CiAgCQlyZXN1bHQtPm5vdGljZUhvb2tzID0gY29ubi0+bm90aWNlSG9va3M7CiAgCQlyZXN1 bHQtPmNsaWVudF9lbmNvZGluZyA9IGNvbm4tPmNsaWVudF9lbmNvZGluZzsKICAKKyAJCS8q IGNvcHkgZXZlbnRzIGZyb20gY29ubmVjdGlvbiAqLworIAkJaWYgKGNvbm4tPm5FdmVudHMg PiAwKQorIAkJeworIAkJCXJlc3VsdC0+ZXZlbnRzID0gZHVwRXZlbnRzKGNvbm4tPmV2ZW50 cywgY29ubi0+bkV2ZW50cyk7CisgCQkJaWYgKCFyZXN1bHQtPmV2ZW50cykKKyAJCQl7Cisg CQkJCVBRY2xlYXIocmVzdWx0KTsKKyAJCQkJcmV0dXJuIE5VTEw7CisgCQkJfQorIAorIAkJ CXJlc3VsdC0+bkV2ZW50cyA9IGNvbm4tPm5FdmVudHM7CisgCQl9CisgCiAgCQkvKiBjb25z aWRlciBjb3B5aW5nIGNvbm4ncyBlcnJvck1lc3NhZ2UgKi8KICAJCXN3aXRjaCAoc3RhdHVz KQogIAkJewogIAkJCWNhc2UgUEdSRVNfRU1QVFlfUVVFUlk6CiAgCQkJY2FzZSBQR1JFU19D T01NQU5EX09LOgogIAkJCWNhc2UgUEdSRVNfVFVQTEVTX09LOgoqKioqKioqKioqKioqKioK KioqIDE5MiwyMDMgKioqKgotLS0gMjQzLDUwMSAtLS0tCiAgCQlyZXN1bHQtPmNsaWVudF9l bmNvZGluZyA9IFBHX1NRTF9BU0NJSTsKICAJfQogIAogIAlyZXR1cm4gcmVzdWx0OwogIH0K ICAKKyAvKiBQUXNldFJlc3VsdEF0dHJzCisgICogU2V0IHRoZSBhdHRyaWJ1dGVzIGZvciBh IGdpdmVuIHJlc3VsdC4gIFRoaXMgZnVuY3Rpb24gZmFpbHMgaWYgdGhlcmUgYXJlCisgICog YWxyZWFkeSBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgcHJvdmlkZWQgcmVzdWx0LiAg VGhlIGNhbGwgaXMKKyAgKiBpZ25vcmVkIGlmIG51bUF0dHJpYnV0ZXMgaXMgaXMgemVybyBv ciBhdHREZXNjcyBpcyBOVUxMLiAgSWYgdGhlCisgICogZnVuY3Rpb24gZmFpbHMsIGl0IHJl dHVybnMgemVyby4gIElmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcywgaXQKKyAgKiByZXR1cm5z IGEgbm9uLXplcm8gdmFsdWUuCisgICovCisgaW50CisgUFFzZXRSZXN1bHRBdHRycyhQR3Jl c3VsdCAqcmVzLCBpbnQgbnVtQXR0cmlidXRlcywgUEdyZXNBdHREZXNjICphdHREZXNjcykK KyB7CisgCWludCBpOworIAorIAkvKiBJZiBhdHRycyBhbHJlYWR5IGV4aXN0LCB0aGV5IGNh bm5vdCBiZSBvdmVyd3JpdHRlbi4gKi8KKyAJaWYgKCFyZXMgfHwgcmVzLT5udW1BdHRyaWJ1 dGVzID4gMCkKKyAJCXJldHVybiBGQUxTRTsKKyAKKyAJLyogaWdub3JlIHJlcXVlc3QgKi8K KyAJaWYgKG51bUF0dHJpYnV0ZXMgPD0gMCB8fCAhYXR0RGVzY3MpCisgCQlyZXR1cm4gVFJV RTsKKyAKKyAJcmVzLT5hdHREZXNjcyA9IChQR3Jlc0F0dERlc2MgKikgUFFyZXN1bHRBbGxv YyhyZXMsCisgCQludW1BdHRyaWJ1dGVzICogc2l6ZW9mKFBHcmVzQXR0RGVzYykpOworIAor IAlpZiAoIXJlcy0+YXR0RGVzY3MpCisgCQlyZXR1cm4gRkFMU0U7CisgCisgCXJlcy0+bnVt QXR0cmlidXRlcyA9IG51bUF0dHJpYnV0ZXM7CisgCW1lbWNweShyZXMtPmF0dERlc2NzLCBh dHREZXNjcywKKyAJCW51bUF0dHJpYnV0ZXMgKiBzaXplb2YoUEdyZXNBdHREZXNjKSk7Cisg CisgCS8qIHJlc3VsdGFsbG9jIHRoZSBhdHRyaWJ1dGUgbmFtZXMuICBUaGUgYWJvdmUgbWVt Y3B5IGhhcyB0aGUgYXR0cgorIAkgKiBuYW1lcyBwb2ludGluZyBhdCB0aGUgY2FsbGVycyBw cm92aWRlZCBhdHREZXNjcyBtZW1vcnkuCisgCSAqLworIAlyZXMtPmJpbmFyeSA9IDE7Cisg CWZvciAoaSA9IDA7IGkgPCByZXMtPm51bUF0dHJpYnV0ZXM7IGkrKykKKyAJeworIAkJaWYg KHJlcy0+YXR0RGVzY3NbaV0ubmFtZSkKKyAJCQlyZXMtPmF0dERlc2NzW2ldLm5hbWUgPSBw cVJlc3VsdFN0cmR1cChyZXMsIHJlcy0+YXR0RGVzY3NbaV0ubmFtZSk7CisgCQllbHNlCisg CQkJcmVzLT5hdHREZXNjc1tpXS5uYW1lID0gcmVzLT5udWxsX2ZpZWxkOworIAorIAkJaWYg KCFyZXMtPmF0dERlc2NzW2ldLm5hbWUpCisgCQkJcmV0dXJuIEZBTFNFOworIAorIAkJLyog QWx0aG91Z2ggZGVwcmVjYXRlZCwgYmVjYXVzZSByZXN1bHRzIGNhbiBoYXZlIHRleHQrYmlu YXJ5IGNvbHVtbnMsCisgCQkgKiBpdHMgZWFzeSBlbm91Z2ggdG8gZGVkdWNlIHNvIHNldCBp dCBmb3IgY29tcGxldGVuZXNzLgorIAkJICovCisgCQlpZiAocmVzLT5hdHREZXNjc1tpXS5m b3JtYXQgPT0gMCkKKyAJCQlyZXMtPmJpbmFyeSA9IDA7CisgCX0KKyAKKyAJcmV0dXJuIFRS VUU7CisgfQorIAorIC8qCisgICogUFFjb3B5UmVzdWx0CisgICogUmV0dXJucyBhIGRlZXAg Y29weSBvZiB0aGUgcHJvdmlkZWQgJ3NyYycgUEdyZXN1bHQsIHdoaWNoIGNhbm5vdCBiZSBO VUxMLgorICAqIFRoZSAnZmxhZ3MnIGFyZ3VtZW50IGNvbnRyb2xzIHdoaWNoIHBvcnRpb25z IG9mIHRoZSByZXN1bHQgd2lsbCBvciB3aWxsCisgICogTk9UIGJlIGNvcGllZC4gIFRoZSBj cmVhdGVkIHJlc3VsdCBpcyBhbHdheXMgcHV0IGludG8gdGhlCisgICogUEdSRVNfVFVQTEVT X09LIHN0YXR1cy4gIFRoZSBzb3VyY2UgcmVzdWx0IGVycm9yIG1lc3NhZ2UgaXMgbm90IGNv cGllZCwKKyAgKiBhbHRob3VnaCBjbWRTdGF0dXMgaXMuCisgICoKKyAgKiBUbyBzZXQgY3Vz dG9tIGF0dHJpYnV0ZXMsIHNlZSBQUXNldFJlc3VsdEF0dHJzLiAgVGhhdCBmdW5jdGlvbiBy ZXF1aXJlcworICAqIHRoYXQgdGhlcmUgYXJlIG5vIGF0dHJzIGNvbnRhaW5lZCBpbiB0aGUg cmVzdWx0LCBzbyB0byB1c2UgdGhhdAorICAqIGZ1bmN0aW9uIHlvdSBjYW5ub3QgdXNlIHRo ZSBQR19DT1BZUkVTX0FUVFJTIG9yIFBHX0NPUFlSRVNfVFVQTEVTCisgICogb3B0aW9ucyB3 aXRoIHRoaXMgZnVuY3Rpb24uCisgICoKKyAgKiBPcHRpb25zOgorICAqICAgUEdfQ09QWVJF U19BVFRSUyAtIENvcHkgdGhlIHNvdXJjZSByZXN1bHQncyBhdHRyaWJ1dGVzCisgICoKKyAg KiAgIFBHX0NPUFlSRVNfVFVQTEVTIC0gQ29weSB0aGUgc291cmNlIHJlc3VsdCdzIHR1cGxl cy4gIFRoaXMgaW1wbGllcworICAqICAgY29weWluZyB0aGUgYXR0cnMsIGJlaW5nIGhvdyB0 aGUgYXR0cnMgYXJlIG5lZWRlZCBieSB0aGUgdHVwbGVzLgorICAqCisgICogICBQR19DT1BZ UkVTX0VWRU5UUyAtIENvcHkgdGhlIHNvdXJjZSByZXN1bHQncyBldmVudHMuCisgICoKKyAg KiAgIFBHX0NPUFlSRVNfTk9USUNFSE9PS1MgLSBDb3B5IHRoZSBzb3VyY2UgcmVzdWx0J3Mg bm90aWNlIGhvb2tzLgorICAqLworIAorIFBHcmVzdWx0ICoKKyBQUWNvcHlSZXN1bHQoY29u c3QgUEdyZXN1bHQgKnNyYywgaW50IGZsYWdzKQorIHsKKyAJaW50IGk7CisgCVBHcmVzdWx0 ICpkZXN0OworIAlQR0V2ZW50UmVzdWx0Q29weSBldnQ7CisgCisgCWlmICghc3JjKQorIAkJ cmV0dXJuIE5VTEw7CisgCisgCS8qIEF1dG9tYXRpY2FsbHkgdHVybiBvbiBhdHRycyBmbGFn cyBiZWNhdXNlIHlvdSBjYW4ndCBjb3B5IHR1cGxlcworIAkgKiB3aXRob3V0IGNvcHlpbmcg dGhlIGF0dHJzLiAgX1RVUExFUyBpbXBsaWVzIF9BVFRSUy4KKyAJICovCisgCWlmIChmbGFn cyAmIFBHX0NPUFlSRVNfVFVQTEVTKQorIAkJZmxhZ3MgfD0gUEdfQ09QWVJFU19BVFRSUzsK KyAKKyAJZGVzdCA9IFBRbWFrZUVtcHR5UEdyZXN1bHQoKFBHY29ubiAqKU5VTEwsIFBHUkVT X1RVUExFU19PSyk7CisgCWlmICghZGVzdCkKKyAJCXJldHVybiBOVUxMOworIAorIAkvKiBh bHdheXMgY29weSB0aGVzZSBvdmVyLiAgSXMgY21kU3RhdHVzIHVzZWZ1bCBoZXJlPyAqLwor IAlkZXN0LT5jbGllbnRfZW5jb2RpbmcgPSBzcmMtPmNsaWVudF9lbmNvZGluZzsKKyAJc3Ry Y3B5KGRlc3QtPmNtZFN0YXR1cywgc3JjLT5jbWRTdGF0dXMpOworIAorIAkvKiBXYW50cyB0 byBjb3B5IG5vdGljZSBob29rcyAqLworIAlpZiAoZmxhZ3MgJiBQR19DT1BZUkVTX05PVElD RUhPT0tTKQorIAkJZGVzdC0+bm90aWNlSG9va3MgPSBzcmMtPm5vdGljZUhvb2tzOworIAor IAkvKiBXYW50cyBhdHRycyAqLworIAlpZiAoKGZsYWdzICYgUEdfQ09QWVJFU19BVFRSUykg JiYKKyAJCSAhUFFzZXRSZXN1bHRBdHRycyhkZXN0LCBzcmMtPm51bUF0dHJpYnV0ZXMsIHNy Yy0+YXR0RGVzY3MpKQorIAl7CisgCQlQUWNsZWFyKGRlc3QpOworIAkJcmV0dXJuIE5VTEw7 CisgCX0KKyAKKyAJLyogV2FudHMgdG8gY29weSByZXN1bHQgdHVwbGVzOiB1c2UgUFFzZXR2 YWx1ZSgpLiAqLworIAlpZiAoKGZsYWdzICYgUEdfQ09QWVJFU19UVVBMRVMpICYmIHNyYy0+ bnR1cHMgPiAwKQorIAl7CisgCQlpbnQgdHVwLCBmaWVsZDsKKyAJCWZvciAodHVwID0gMDsg dHVwIDwgc3JjLT5udHVwczsgdHVwKyspCisgCQkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwg c3JjLT5udW1BdHRyaWJ1dGVzOyBmaWVsZCsrKQorIAkJCQlQUXNldHZhbHVlKGRlc3QsIHR1 cCwgZmllbGQsIHNyYy0+dHVwbGVzW3R1cF1bZmllbGRdLnZhbHVlLAorIAkJCQkJc3JjLT50 dXBsZXNbdHVwXVtmaWVsZF0ubGVuKTsKKyAJfQorIAorIAkvKiBXYW50cyB0byBjb3B5IFBH RXZlbnRzLiAqLworIAlpZiAoKGZsYWdzICYgUEdfQ09QWVJFU19FVkVOVFMpICYmIHNyYy0+ bkV2ZW50cyA+IDApCisgCXsKKyAJCWRlc3QtPmV2ZW50cyA9IGR1cEV2ZW50cyhzcmMtPmV2 ZW50cywgc3JjLT5uRXZlbnRzKTsKKyAJCWlmICghZGVzdC0+ZXZlbnRzKQorIAkJeworIAkJ CVBRY2xlYXIoZGVzdCk7CisgCQkJcmV0dXJuIE5VTEw7CisgCQl9CisgCisgCQlkZXN0LT5u RXZlbnRzID0gc3JjLT5uRXZlbnRzOworIAl9CisgCisgCS8qIFRyaWdnZXIgUEdFVlRfUkVT VUxUQ09QWSBldmVudCAqLworIAlmb3IgKGkgPSAwOyBpIDwgZGVzdC0+bkV2ZW50czsgaSsr KQorIAl7CisgCQlldnQuc3JjID0gc3JjOworIAkJZXZ0LmRlc3QgPSBkZXN0OworIAkJaWYg KCFkZXN0LT5ldmVudHNbaV0ucHJvYyhQR0VWVF9SRVNVTFRDT1BZLCAmZXZ0LCBkZXN0LT5l dmVudHNbaV0ucGFzc1Rocm91Z2gpKQorIAkJeworIAkJCVBRY2xlYXIoZGVzdCk7CisgCQkJ cmV0dXJuIE5VTEw7CisgCQl9CisgCX0KKyAKKyAJcmV0dXJuIGRlc3Q7CisgfQorIAorIGlu dAorIFBRc2V0dmFsdWUoUEdyZXN1bHQgKnJlcywgaW50IHR1cF9udW0sIGludCBmaWVsZF9u dW0sCisgCWNoYXIgKnZhbHVlLCBpbnQgbGVuKQorIHsKKyAJUEdyZXNBdHRWYWx1ZSAqYXR0 dmFsOworIAorIAlpZiAoIWNoZWNrX2ZpZWxkX251bWJlcihyZXMsIGZpZWxkX251bSkpCisg CQlyZXR1cm4gRkFMU0U7CisgCisgCS8qIEludmFsaWQgdHVwX251bSwgbXVzdCBiZSA8PSBu dHVwcyAqLworIAlpZiAodHVwX251bSA+IHJlcy0+bnR1cHMpCisgCQlyZXR1cm4gRkFMU0U7 CisgCisgCS8qIG5lZWQgdG8gZ3JvdyB0aGUgdHVwbGUgdGFibGUgKi8KKyAJaWYgKHJlcy0+ bnR1cHMgPj0gcmVzLT50dXBBcnJTaXplKQorIAl7CisgCQlpbnQgbiA9IHJlcy0+dHVwQXJy U2l6ZSA/IHJlcy0+dHVwQXJyU2l6ZSAqIDIgOiAxMjg7CisgCQlQR3Jlc0F0dFZhbHVlICoq dHVwczsKKyAKKyAJCWlmIChyZXMtPnR1cGxlcykKKyAJCQl0dXBzID0gKFBHcmVzQXR0VmFs dWUgKiopIHJlYWxsb2MocmVzLT50dXBsZXMsIG4gKiBzaXplb2YoUEdyZXNBdHRWYWx1ZSAq KSk7CisgCQllbHNlCisgCQkJdHVwcyA9IChQR3Jlc0F0dFZhbHVlICoqKSBtYWxsb2MobiAq IHNpemVvZihQR3Jlc0F0dFZhbHVlICopKTsKKyAKKyAJCWlmICghdHVwcykKKyAJCQlyZXR1 cm4gRkFMU0U7CisgCisgCQltZW1zZXQodHVwcyArIHJlcy0+dHVwQXJyU2l6ZSwgMCwKKyAJ CQkobiAtIHJlcy0+dHVwQXJyU2l6ZSkgKiBzaXplb2YoUEdyZXNBdHRWYWx1ZSAqKSk7Cisg CQlyZXMtPnR1cGxlcyA9IHR1cHM7CisgCQlyZXMtPnR1cEFyclNpemUgPSBuOworIAl9Cisg CisgCS8qIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgdHVwbGUgKi8KKyAJaWYgKHR1cF9udW0g PT0gcmVzLT5udHVwcyAmJiAhcmVzLT50dXBsZXNbdHVwX251bV0pCisgCXsKKyAJCWludCBp OworIAkJUEdyZXNBdHRWYWx1ZSAqdHVwOworIAorIAkJdHVwID0gKFBHcmVzQXR0VmFsdWUg KikgcHFSZXN1bHRBbGxvYyhyZXMsCisgCQkJcmVzLT5udW1BdHRyaWJ1dGVzICogc2l6ZW9m KFBHcmVzQXR0VmFsdWUpLCBUUlVFKTsKKyAKKyAJCWlmICghdHVwKQorIAkJCXJldHVybiBG QUxTRTsKKyAKKyAJCS8qIGluaXRpYWxpemUgZWFjaCBjb2x1bW4gdG8gTlVMTCAqLworIAkJ Zm9yIChpID0gMDsgaSA8IHJlcy0+bnVtQXR0cmlidXRlczsgaSsrKQorIAkJeworIAkJCXR1 cFtpXS5sZW4gPSBOVUxMX0xFTjsKKyAJCQl0dXBbaV0udmFsdWUgPSByZXMtPm51bGxfZmll bGQ7CisgCQl9CisgCisgCQlyZXMtPnR1cGxlc1t0dXBfbnVtXSA9IHR1cDsKKyAJCXJlcy0+ bnR1cHMrKzsKKyAJfQorIAorIAlhdHR2YWwgPSAmcmVzLT50dXBsZXNbdHVwX251bV1bZmll bGRfbnVtXTsKKyAKKyAJLyogT24gdG9wIG9mIE5VTExfTEVOLCB0cmVhdCBhIE5VTEwgdmFs dWUgYXMgYSBOVUxMIGZpZWxkICovCisgCWlmIChsZW4gPT0gTlVMTF9MRU4gfHwgdmFsdWUg PT0gTlVMTCkKKyAJeworIAkJYXR0dmFsLT5sZW4gPSBOVUxMX0xFTjsKKyAJCWF0dHZhbC0+ dmFsdWUgPSByZXMtPm51bGxfZmllbGQ7CisgCX0KKyAJZWxzZQorIAl7CisgCQlpZiAobGVu IDwgMCkKKyAJCQlsZW4gPSAwOworIAorIAkJaWYgKGxlbiA9PSAwKQorIAkJeworIAkJCWF0 dHZhbC0+bGVuID0gMDsKKyAJCQlhdHR2YWwtPnZhbHVlID0gcmVzLT5udWxsX2ZpZWxkOwor IAkJfQorIAkJZWxzZQorIAkJeworIAkJCWF0dHZhbC0+dmFsdWUgPSAoY2hhciAqKSBQUXJl c3VsdEFsbG9jKHJlcywgbGVuICsgMSk7CisgCQkJaWYgKCFhdHR2YWwtPnZhbHVlKQorIAkJ CQlyZXR1cm4gRkFMU0U7CisgCisgCQkJYXR0dmFsLT5sZW4gPSBsZW47CisgCQkJbWVtY3B5 KGF0dHZhbC0+dmFsdWUsIHZhbHVlLCBsZW4pOworIAkJCWF0dHZhbC0+dmFsdWVbbGVuXSA9 ICdcMCc7CisgCQl9CisgCX0KKyAKKyAJcmV0dXJuIFRSVUU7CisgfQorIAorIHZvaWQgKgor IFBRcmVzdWx0QWxsb2MoUEdyZXN1bHQgKnJlcywgc2l6ZV90IG5CeXRlcykKKyB7CisgCXJl dHVybiBwcVJlc3VsdEFsbG9jKHJlcywgbkJ5dGVzLCBUUlVFKTsKKyB9CisgCiAgLyoKICAg KiBwcVJlc3VsdEFsbG9jIC0KICAgKgkJQWxsb2NhdGUgc3Vic2lkaWFyeSBzdG9yYWdlIGZv ciBhIFBHcmVzdWx0LgogICAqCiAgICogbkJ5dGVzIGlzIHRoZSBhbW91bnQgb2Ygc3BhY2Ug bmVlZGVkIGZvciB0aGUgb2JqZWN0LgogICAqIElmIGlzQmluYXJ5IGlzIHRydWUsIHdlIGFz c3VtZSB0aGF0IHdlIG5lZWQgdG8gYWxpZ24gdGhlIG9iamVjdCBvbgoqKioqKioqKioqKioq KioKKioqIDM0OSwzNjUgKioqKgotLS0gNjQ3LDY3OSAtLS0tCiAgICogUFFjbGVhciAtCiAg ICoJICBmcmVlJ3MgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYSBQR3Jlc3VsdAogICAq LwogIHZvaWQKICBQUWNsZWFyKFBHcmVzdWx0ICpyZXMpCiAgeworIAlpbnQgaTsKICAJUEdy ZXN1bHRfZGF0YSAqYmxvY2s7CisgCVBHRXZlbnRSZXN1bHREZXN0cm95IGV2dDsKICAKICAJ aWYgKCFyZXMpCiAgCQlyZXR1cm47CiAgCisgCWZvciAoaSA9IDA7IGkgPCByZXMtPm5FdmVu dHM7IGkrKykKKyAJeworIAkJZXZ0LnJlc3VsdCA9IHJlczsKKyAJCSh2b2lkKXJlcy0+ZXZl bnRzW2ldLnByb2MoUEdFVlRfUkVTVUxUREVTVFJPWSwgJmV2dCwgcmVzLT5ldmVudHNbaV0u cGFzc1Rocm91Z2gpOworIAkJZnJlZShyZXMtPmV2ZW50c1tpXS5uYW1lKTsKKyAJfQorIAor IAlpZiAocmVzLT5ldmVudHMpCisgCXsKKyAJCWZyZWUocmVzLT5ldmVudHMpOworIAkJcmVz LT5ldmVudHMgPSBOVUxMOworIAkJcmVzLT5uRXZlbnRzID0gMDsKKyAJfQorIAogIAkvKiBG cmVlIGFsbCB0aGUgc3Vic2lkaWFyeSBibG9ja3MgKi8KICAJd2hpbGUgKChibG9jayA9IHJl cy0+Y3VyQmxvY2spICE9IE5VTEwpCiAgCXsKICAJCXJlcy0+Y3VyQmxvY2sgPSBibG9jay0+ bmV4dDsKICAJCWZyZWUoYmxvY2spOwogIAl9CioqKioqKioqKioqKioqKgoqKiogMTE5Miwx MjA0ICoqKioKICAgKgkgIG1lbW9yeSkuCiAgICovCiAgCiAgUEdyZXN1bHQgKgogIFBRZ2V0 UmVzdWx0KFBHY29ubiAqY29ubikKICB7CiEgCVBHcmVzdWx0ICAgKnJlczsKICAKICAJaWYg KCFjb25uKQogIAkJcmV0dXJuIE5VTEw7CiAgCiAgCS8qIFBhcnNlIGFueSBhdmFpbGFibGUg ZGF0YSwgaWYgb3VyIHN0YXRlIHBlcm1pdHMuICovCiAgCXBhcnNlSW5wdXQoY29ubik7Ci0t LSAxNTA2LDE1MTggLS0tLQogICAqCSAgbWVtb3J5KS4KICAgKi8KICAKICBQR3Jlc3VsdCAq CiAgUFFnZXRSZXN1bHQoUEdjb25uICpjb25uKQogIHsKISAJUEdyZXN1bHQgICAqcmVzPU5V TEw7CiAgCiAgCWlmICghY29ubikKICAJCXJldHVybiBOVUxMOwogIAogIAkvKiBQYXJzZSBh bnkgYXZhaWxhYmxlIGRhdGEsIGlmIG91ciBzdGF0ZSBwZXJtaXRzLiAqLwogIAlwYXJzZUlu cHV0KGNvbm4pOwoqKioqKioqKioqKioqKioKKioqIDEyNjcsMTI3OCAqKioqCi0tLSAxNTgx LDE2MTcgLS0tLQogIAkJCQkJCQkgIGxpYnBxX2dldHRleHQoInVuZXhwZWN0ZWQgYXN5bmNT dGF0dXM6ICVkXG4iKSwKICAJCQkJCQkJICAoaW50KSBjb25uLT5hc3luY1N0YXR1cyk7CiAg CQkJcmVzID0gUFFtYWtlRW1wdHlQR3Jlc3VsdChjb25uLCBQR1JFU19GQVRBTF9FUlJPUik7 CiAgCQkJYnJlYWs7CiAgCX0KICAKKyAJaWYgKHJlcykKKyAJeworIAkJaW50IGk7CisgCQlQ R0V2ZW50UmVzdWx0Q3JlYXRlIGV2dDsKKyAKKyAJCWZvciAoaSA9IDA7IGkgPCByZXMtPm5F dmVudHM7IGkrKykKKyAJCXsKKyAJCQlldnQuY29ubiA9IGNvbm47CisgCQkJZXZ0LnJlc3Vs dCA9IHJlczsKKyAKKyAJCQlpZiAoIXJlcy0+ZXZlbnRzW2ldLnByb2MoUEdFVlRfUkVTVUxU Q1JFQVRFLCAmZXZ0LCByZXMtPmV2ZW50c1tpXS5wYXNzVGhyb3VnaCkpCisgCQkJeworIAkJ CQljaGFyIG1zZ1syNTZdOworIAorIAkJCQlzcHJpbnRmKG1zZywKKyAJCQkJCSJQR0V2ZW50 UHJvYyBcIiVzXCIgZmFpbGVkIGR1cmluZyBQR0VWVF9SRVNVTFRDUkVBVEUgZXZlbnQiLAor IAkJCQkJcmVzLT5ldmVudHNbaV0ubmFtZSk7CisgCisgCQkJCXBxU2V0UmVzdWx0RXJyb3Io cmVzLCBtc2cpOworIAkJCQlyZXMtPnJlc3VsdFN0YXR1cyA9IFBHUkVTX0ZBVEFMX0VSUk9S OworIAkJCQlicmVhazsKKyAJCQl9CisgCQl9CisgCX0KKyAKICAJcmV0dXJuIHJlczsKICB9 CiAgCiAgCiAgLyoKICAgKiBQUWV4ZWMKSW5kZXg6IHNyYy9pbnRlcmZhY2VzL2xpYnBxL2xp YnBxLWZlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3Byb2plY3RzL2N2c3Jvb3QvcGdz cWwvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtZmUuaCx2CnJldHJpZXZpbmcgcmV2aXNp b24gMS4xNDIKZGlmZiAtQzYgLXIxLjE0MiBsaWJwcS1mZS5oCioqKiBzcmMvaW50ZXJmYWNl cy9saWJwcS9saWJwcS1mZS5oCTE5IE1hciAyMDA4IDAwOjM5OjMzIC0wMDAwCTEuMTQyCi0t LSBzcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1mZS5oCTE3IFNlcCAyMDA4IDAzOjU0OjIw IC0wMDAwCioqKioqKioqKioqKioqKgoqKiogMjUsMzYgKioqKgotLS0gMjUsNDUgLS0tLQog IC8qCiAgICogcG9zdGdyZXNfZXh0LmggZGVmaW5lcyB0aGUgYmFja2VuZCdzIGV4dGVybmFs bHkgdmlzaWJsZSB0eXBlcywKICAgKiBzdWNoIGFzIE9pZC4KICAgKi8KICAjaW5jbHVkZSAi cG9zdGdyZXNfZXh0LmgiCiAgCisgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKiBP cHRpb25zIGZvciBQUWNvcHlSZXN1bHQKKyAgKi8KKyAKKyAjZGVmaW5lIFBHX0NPUFlSRVNf QVRUUlMgICAgICAgICAgMHgwMQorICNkZWZpbmUgUEdfQ09QWVJFU19UVVBMRVMgICAgICAg ICAweDAyIC8qIEltcGxpZXMgUEdfQ09QWVJFU19BVFRSUyAqLworICNkZWZpbmUgUEdfQ09Q WVJFU19FVkVOVFMgICAgICAgICAweDA0CisgI2RlZmluZSBQR19DT1BZUkVTX05PVElDRUhP T0tTICAgIDB4MDgKKyAKICAvKiBBcHBsaWNhdGlvbi12aXNpYmxlIGVudW0gdHlwZXMgKi8K ICAKICB0eXBlZGVmIGVudW0KICB7CiAgCS8qCiAgCSAqIEFsdGhvdWdoIGl0IGlzIG9rYXkg dG8gYWRkIHRvIHRoaXMgbGlzdCwgdmFsdWVzIHdoaWNoIGJlY29tZSB1bnVzZWQKKioqKioq KioqKioqKioqCioqKiAxOTAsMjAxICoqKioKLS0tIDE5OSwyMjUgLS0tLQogIAkJaW50CQkg ICAqcHRyOwkJLyogY2FuJ3QgdXNlIHZvaWQgKGRlYyBjb21waWxlciBiYXJmcykJICovCiAg CQlpbnQJCQlpbnRlZ2VyOwogIAl9CQkJdTsKICB9IFBRQXJnQmxvY2s7CiAgCiAgLyogLS0t LS0tLS0tLS0tLS0tLQorICAqIFBHcmVzQXR0RGVzYyAtLSBEYXRhIGFib3V0IGEgc2luZ2xl IGF0dHJpYnV0ZSAoY29sdW1uKSBvZiBhIHF1ZXJ5IHJlc3VsdAorICAqIC0tLS0tLS0tLS0t LS0tLS0KKyAgKi8KKyB0eXBlZGVmIHN0cnVjdCBwZ3Jlc0F0dERlc2MKKyB7CisgCWNoYXIJ ICAgKm5hbWU7CQkJLyogY29sdW1uIG5hbWUgKi8KKyAJT2lkCQkJdGFibGVpZDsJCS8qIHNv dXJjZSB0YWJsZSwgaWYga25vd24gKi8KKyAJaW50CQkJY29sdW1uaWQ7CQkvKiBzb3VyY2Ug Y29sdW1uLCBpZiBrbm93biAqLworIAlpbnQJCQlmb3JtYXQ7CQkJLyogZm9ybWF0IGNvZGUg Zm9yIHZhbHVlICh0ZXh0L2JpbmFyeSkgKi8KKyAJT2lkCQkJdHlwaWQ7CQkJLyogdHlwZSBp ZCAqLworIAlpbnQJCQl0eXBsZW47CQkJLyogdHlwZSBzaXplICovCisgCWludAkJCWF0dHR5 cG1vZDsgIC8qIHR5cGUtc3BlY2lmaWMgbW9kaWZpZXIgaW5mbyAqLworIH0gUEdyZXNBdHRE ZXNjOworIAorIC8qIC0tLS0tLS0tLS0tLS0tLS0KICAgKiBFeHBvcnRlZCBmdW5jdGlvbnMg b2YgbGlicHEKICAgKiAtLS0tLS0tLS0tLS0tLS0tCiAgICovCiAgCiAgLyogPT09CWluIGZl LWNvbm5lY3QuYyA9PT0gKi8KICAKKioqKioqKioqKioqKioqCioqKiA0MzQsNDQ1ICoqKioK LS0tIDQ1OCw0ODcgLS0tLQogICAqIE1ha2UgYW4gZW1wdHkgUEdyZXN1bHQgd2l0aCBnaXZl biBzdGF0dXMgKHNvbWUgYXBwcyBmaW5kIHRoaXMKICAgKiB1c2VmdWwpLiBJZiBjb25uIGlz IG5vdCBOVUxMIGFuZCBzdGF0dXMgaW5kaWNhdGVzIGFuIGVycm9yLCB0aGUKICAgKiBjb25u J3MgZXJyb3JNZXNzYWdlIGlzIGNvcGllZC4KICAgKi8KICBleHRlcm4gUEdyZXN1bHQgKlBR bWFrZUVtcHR5UEdyZXN1bHQoUEdjb25uICpjb25uLCBFeGVjU3RhdHVzVHlwZSBzdGF0dXMp OwogIAorIC8qIG1ha2VzIGEgY29weSBvZiBhIHJlc3VsdCAqLworIGV4dGVybiBQR3Jlc3Vs dCAqUFFjb3B5UmVzdWx0KGNvbnN0IFBHcmVzdWx0ICpzcmMsIGludCBmbGFncyk7CisgCisg LyogU2V0cyB0aGUgYXR0cmlidXRlcyBvZiBhIHJlc3VsdCwgbm8gYXR0cmlidXRlcyBjYW4g YWxyZWFkeSBleGlzdC4gKi8KKyBleHRlcm4gaW50IFBRc2V0UmVzdWx0QXR0cnMoUEdyZXN1 bHQgKnJlcywgaW50IG51bUF0dHJpYnV0ZXMsIFBHcmVzQXR0RGVzYyAqYXR0RGVzY3MpOwor IAorIC8qIEFsbG9jYXRlIHN1YnNpZGlhcnkgc3RvcmFnZSBmb3IgYSBQR3Jlc3VsdC4gKi8K KyBleHRlcm4gdm9pZCAqUFFyZXN1bHRBbGxvYyhQR3Jlc3VsdCAqcmVzLCBzaXplX3QgbkJ5 dGVzKTsKKyAKKyAvKgorICAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHR1cGxlIGZpZWxkLiAg VGhlIHR1cF9udW0gbXVzdCBiZSBsZXNzIHRoYW4gb3IKKyAgKiBlcXVhbCB0byBQUW50dXBs ZXMocmVzKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSB0dXBsZXMgYXMgbmVlZGVk LgorICAqIEEgbmV3IHR1cGxlIGlzIGdlbmVyYXRlZCB3aGVuIHR1cF9udW0gZXF1YWxzIFBR bnR1cGxlcyhyZXMpIGFuZCB0aGVyZQorICAqIGFyZSBubyBmaWVsZHMgZGVmaW5lZCBmb3Ig dGhhdCB0dXBsZS4KKyAgKgorICAqIFJldHVybnMgYSBub24temVybyB2YWx1ZSBmb3Igc3Vj Y2VzcyBhbmQgemVybyBmb3IgZmFpbHVyZS4KKyAgKi8KKyBleHRlcm4gaW50IFBRc2V0dmFs dWUoUEdyZXN1bHQgKnJlcywgaW50IHR1cF9udW0sIGludCBmaWVsZF9udW0sIGNoYXIgKnZh bHVlLCBpbnQgbGVuKTsKICAKICAvKiBRdW90aW5nIHN0cmluZ3MgYmVmb3JlIGluY2x1c2lv biBpbiBxdWVyaWVzLiAqLwogIGV4dGVybiBzaXplX3QgUFFlc2NhcGVTdHJpbmdDb25uKFBH Y29ubiAqY29ubiwKICAJCQkJICAgY2hhciAqdG8sIGNvbnN0IGNoYXIgKmZyb20sIHNpemVf dCBsZW5ndGgsCiAgCQkJCSAgIGludCAqZXJyb3IpOwogIGV4dGVybiB1bnNpZ25lZCBjaGFy ICpQUWVzY2FwZUJ5dGVhQ29ubihQR2Nvbm4gKmNvbm4sCkluZGV4OiBzcmMvaW50ZXJmYWNl cy9saWJwcS9saWJwcS1pbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvcHJvamVjdHMv Y3Zzcm9vdC9wZ3NxbC9zcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1pbnQuaCx2CnJldHJp ZXZpbmcgcmV2aXNpb24gMS4xMzEKZGlmZiAtQzYgLXIxLjEzMSBsaWJwcS1pbnQuaAoqKiog c3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtaW50LmgJMjkgTWF5IDIwMDggMjI6MDI6NDQg LTAwMDAJMS4xMzEKLS0tIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWludC5oCTE3IFNl cCAyMDA4IDAzOjU0OjIwIC0wMDAwCioqKioqKioqKioqKioqKgoqKiogMTksMzAgKioqKgot LS0gMTksMzEgLS0tLQogIAogICNpZm5kZWYgTElCUFFfSU5UX0gKICAjZGVmaW5lIExJQlBR X0lOVF9ICiAgCiAgLyogV2UgYXNzdW1lIGxpYnBxLWZlLmggaGFzIGFscmVhZHkgYmVlbiBp bmNsdWRlZC4gKi8KICAjaW5jbHVkZSAicG9zdGdyZXNfZmUuaCIKKyAjaW5jbHVkZSAibGli cHEtZXZlbnRzLmgiCiAgCiAgI2luY2x1ZGUgPHRpbWUuaD4KICAjaW5jbHVkZSA8c3lzL3R5 cGVzLmg+CiAgI2lmbmRlZiBXSU4zMgogICNpbmNsdWRlIDxzeXMvdGltZS5oPgogICNlbmRp ZgoqKioqKioqKioqKioqKioKKioqIDk3LDEyMSAqKioqCiAgdW5pb24gcGdyZXN1bHRfZGF0 YQogIHsKICAJUEdyZXN1bHRfZGF0YSAqbmV4dDsJCS8qIGxpbmsgdG8gbmV4dCBibG9jaywg b3IgTlVMTCAqLwogIAljaGFyCQlzcGFjZVsxXTsJCS8qIGR1bW15IGZvciBhY2Nlc3Npbmcg YmxvY2sgYXMgYnl0ZXMgKi8KICB9OwogIAotIC8qIERhdGEgYWJvdXQgYSBzaW5nbGUgYXR0 cmlidXRlIChjb2x1bW4pIG9mIGEgcXVlcnkgcmVzdWx0ICovCi0gCi0gdHlwZWRlZiBzdHJ1 Y3QgcGdyZXNBdHREZXNjCi0gewotIAljaGFyCSAgICpuYW1lOwkJCS8qIGNvbHVtbiBuYW1l ICovCi0gCU9pZAkJCXRhYmxlaWQ7CQkvKiBzb3VyY2UgdGFibGUsIGlmIGtub3duICovCi0g CWludAkJCWNvbHVtbmlkOwkJLyogc291cmNlIGNvbHVtbiwgaWYga25vd24gKi8KLSAJaW50 CQkJZm9ybWF0OwkJCS8qIGZvcm1hdCBjb2RlIGZvciB2YWx1ZSAodGV4dC9iaW5hcnkpICov Ci0gCU9pZAkJCXR5cGlkOwkJCS8qIHR5cGUgaWQgKi8KLSAJaW50CQkJdHlwbGVuOwkJCS8q IHR5cGUgc2l6ZSAqLwotIAlpbnQJCQlhdHR0eXBtb2Q7CQkvKiB0eXBlLXNwZWNpZmljIG1v ZGlmaWVyIGluZm8gKi8KLSB9IFBHcmVzQXR0RGVzYzsKLSAKICAvKiBEYXRhIGFib3V0IGEg c2luZ2xlIHBhcmFtZXRlciBvZiBhIHByZXBhcmVkIHN0YXRlbWVudCAqLwogIHR5cGVkZWYg c3RydWN0IHBncmVzUGFyYW1EZXNjCiAgewogIAlPaWQJCQl0eXBpZDsJCQkvKiB0eXBlIGlk ICovCiAgfSBQR3Jlc1BhcmFtRGVzYzsKICAKLS0tIDk4LDEwOSAtLS0tCioqKioqKioqKioq KioqKgoqKiogMTU5LDE3MCAqKioqCi0tLSAxNDcsMTY2IC0tLS0KICAJUFFub3RpY2VSZWNl aXZlciBub3RpY2VSZWM7IC8qIG5vdGljZSBtZXNzYWdlIHJlY2VpdmVyICovCiAgCXZvaWQJ ICAgKm5vdGljZVJlY0FyZzsKICAJUFFub3RpY2VQcm9jZXNzb3Igbm90aWNlUHJvYzsJCS8q IG5vdGljZSBtZXNzYWdlIHByb2Nlc3NvciAqLwogIAl2b2lkCSAgICpub3RpY2VQcm9jQXJn OwogIH0gUEdOb3RpY2VIb29rczsKICAKKyB0eXBlZGVmIHN0cnVjdAorIHsKKyAJY2hhcgkg ICAqbmFtZTsJLyogZm9yIGVycm9yIG1lc3NhZ2VzICovCisgCXZvaWQJICAgKnBhc3NUaHJv dWdoOyAvKiBwb2ludGVyIHN1cHBsaWVkIGJ5IHVzZXIgKi8KKyAJdm9pZAkgICAqZGF0YTsg Lyogc3RhdGUgKGluc3RhbmNlKSBkYXRhLCBvcHRpb25hbGx5IGdlbmVyYXRlZCBieSBldmVu dCBwcm9jICovCisgCVBHRXZlbnRQcm9jIHByb2M7IC8qIHRoZSBmdW5jdGlvbiB0byBjYWxs IG9uIGV2ZW50cyAqLworIH0gUEdFdmVudDsKKyAKICBzdHJ1Y3QgcGdfcmVzdWx0CiAgewog IAlpbnQJCQludHVwczsKICAJaW50CQkJbnVtQXR0cmlidXRlczsKICAJUEdyZXNBdHREZXNj ICphdHREZXNjczsKICAJUEdyZXNBdHRWYWx1ZSAqKnR1cGxlczsJCS8qIGVhY2ggUEdyZXNU dXBsZSBpcyBhbiBhcnJheSBvZgoqKioqKioqKioqKioqKioKKioqIDE4MSwxOTIgKioqKgot LS0gMTc3LDE5MiAtLS0tCiAgCSAqIFRoZXNlIGZpZWxkcyBhcmUgY29waWVkIGZyb20gdGhl IG9yaWdpbmF0aW5nIFBHY29ubiwgc28gdGhhdCBvcGVyYXRpb25zCiAgCSAqIG9uIHRoZSBQ R3Jlc3VsdCBkb24ndCBoYXZlIHRvIHJlZmVyZW5jZSB0aGUgUEdjb25uLgogIAkgKi8KICAJ UEdOb3RpY2VIb29rcyBub3RpY2VIb29rczsKICAJaW50CQkJY2xpZW50X2VuY29kaW5nOwkv KiBlbmNvZGluZyBpZCAqLwogIAorIAkvKiByZWdpc3RlcmVkIGV2ZW50cywgY29waWVkIGZy b20gY29ubiAqLworIAlpbnQgbkV2ZW50czsKKyAJUEdFdmVudCAqZXZlbnRzOworIAogIAkv KgogIAkgKiBFcnJvciBpbmZvcm1hdGlvbiAoYWxsIE5VTEwgaWYgbm90IGFuIGVycm9yIHJl c3VsdCkuICBlcnJNc2cgaXMgdGhlCiAgCSAqICJvdmVyYWxsIiBlcnJvciBtZXNzYWdlIHJl dHVybmVkIGJ5IFBRcmVzdWx0RXJyb3JNZXNzYWdlLiAgSWYgd2UgaGF2ZQogIAkgKiBwZXIt ZmllbGQgaW5mbyB0aGVuIGl0IGlzIHN0b3JlZCBpbiBhIGxpbmtlZCBsaXN0LgogIAkgKi8K ICAJY2hhcgkgICAqZXJyTXNnOwkJCS8qIGVycm9yIG1lc3NhZ2UsIG9yIE5VTEwgaWYgbm8g ZXJyb3IgKi8KKioqKioqKioqKioqKioqCioqKiAzMDAsMzExICoqKioKLS0tIDMwMCwzMTYg LS0tLQogIAkvKiBPcHRpb25hbCBmaWxlIHRvIHdyaXRlIHRyYWNlIGluZm8gdG8gKi8KICAJ RklMRQkgICAqUGZkZWJ1ZzsKICAKICAJLyogQ2FsbGJhY2sgcHJvY2VkdXJlcyBmb3Igbm90 aWNlIG1lc3NhZ2UgcHJvY2Vzc2luZyAqLwogIAlQR05vdGljZUhvb2tzIG5vdGljZUhvb2tz OwogIAorIAkvKiByZWdpc3RlcmVkIGV2ZW50cyB2aWEgUFFyZWdpc3RlckV2ZW50UHJvYyAq LworIAlpbnQgbkV2ZW50czsKKyAJaW50IGV2ZW50QXJyU2l6ZTsKKyAJUEdFdmVudCAqZXZl bnRzOworIAogIAkvKiBTdGF0dXMgaW5kaWNhdG9ycyAqLwogIAlDb25uU3RhdHVzVHlwZSBz dGF0dXM7CiAgCVBHQXN5bmNTdGF0dXNUeXBlIGFzeW5jU3RhdHVzOwogIAlQR1RyYW5zYWN0 aW9uU3RhdHVzVHlwZSB4YWN0U3RhdHVzOyAvKiBuZXZlciBjaGFuZ2VzIHRvIEFDVElWRSAq LwogIAlQR1F1ZXJ5Q2xhc3MgcXVlcnljbGFzczsKICAJY2hhcgkgICAqbGFzdF9xdWVyeTsJ CS8qIGxhc3QgU1FMIGNvbW1hbmQsIG9yIE5VTEwgaWYgdW5rbm93biAqLwo= --------------070000090000090208020403--