From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1410 invoked by alias); 4 Jun 2017 08:35:17 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 41220 Received: (qmail 22043 invoked from network); 4 Jun 2017 08:35:17 -0000 X-Qmail-Scanner-Diagnostics: from aok120.rev.netart.pl by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(85.128.245.120):SA:0(0.0/5.0):. Processed in 2.301403 secs); 04 Jun 2017 08:35:17 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: psprint@zdharma.org X-Qmail-Scanner-Mime-Attachments: |db_redis.diff|v12db_redis.ztst| X-Qmail-Scanner-Zip-Files: | Received-SPF: none (ns1.primenet.com.au: domain at zdharma.org does not designate permitted sender hosts) X-Virus-Scanned: by amavisd-new using ClamAV (4) Date: Sun, 4 Jun 2017 10:35:03 +0200 From: Sebastian Gniazdowski To: Bart Schaefer , zsh-workers@zsh.org Message-ID: In-Reply-To: <170603100908.ZM13230@torch.brasslantern.com> References: <170603100908.ZM13230@torch.brasslantern.com> Subject: Re: Add redis-db module to upstream? X-Mailer: Airmail (231) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="5933c637_46e87ccd_c8d8" --5933c637_46e87ccd_c8d8 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline On 3 czerwca 2017 at 19:09:26, Bart Schaefer (schaefer=40brasslantern.com= ) wrote: > I have no objection to including this module's functionality in the bas= e > distribution. However, I don't think we should just chuck it in there > exactly as-is. > =20 > Primarily, we should first decide where this should live in the module > hierarchy, i.e., what name should it have=3F > =20 > =46or example would it be appropriate to put it under zsh/db/redis and Done that, sending patch to have basic concretes. Tests are difficult bec= ause they require a running redis with no password and databases 10 and 1= 1 available for pruning and filling, etc. The test I send should be someh= ow disabled by default. > finally do the work of abstracting ztie out of db=5Fgdbm=3F (I know thi= s > supports some operations that the base ztie interface does not.) The -p option is =22passthrough=22, disables read-cache on the parameter.= Gdbm module can easily support this too. Then, -a is for in-arguments pa= ssword, -A is password from file. It's not perfect that -p isn't password= . =22a=22 letter is for =22authentication=22, so basic sanity is kept, bu= t a new mnemonic word for no-cache option to free -p would be best. Canno= t come up with any. Then there is the -f option. -a for =22address=22 would be probably bette= r, but it would harm current gdbm users. However it could be -f OR -a, us= ers will easily learn that it's in general about address, which can be fi= le in some databases. So maybe a clever outcome from this legacy-problems= . =46or the abstract ztie, I should search builtintab for zrtie and zgtie (= a new name for gdbm), and route the call=3F Earlier I was thinking about = some libdl calls to check if a call is available and it was rather a show= stopper. Searching builtintab could also lead to interesting approach =E2=80=93 zs= h/db module would allow to use custom implementations. Custom plugin-modu= le would provide zrtie or zgtie and routing would work. To support older = Zsh, custom module could detect if generic ztie is absent, and provide on= e. But current ztie isn't abstract, so loading pre-5.3.2 db/gdbm would bl= ock this. Rather a minor problem. > In that vein, this also introduces a question of whether zsh/db/ needs > to generically support a password mechanism. I'd suggest that it use > a parameter, possibly a hash with PM=5FHIDEVAL set whose keys are chose= n > from arguments of ztie, but that's just a first reaction and probably > needs more thought. Unlike the naming decision, this doesn't need to > be determined before the module is otherwise integrated. So this would be a way to block direct zrtie and zgtie usage. It may be a= good thing. Like with mkfs: if there wouldn't be mkfs.ext4, people or fo= r sure I would take time to learn generic mkfs syntax. --=C2=A0 Sebastian Gniazdowski psprint /at/ zdharma.org --5933c637_46e87ccd_c8d8 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?utf-8?Q?db=5Fredis.diff?=" Y29tbWl0IGZiNGU0ZGNlM2JmMDc5ODAzZTk0OTg5NzdmMGM1NDQzM2IwYjk2NzAKQXV0aG9yOiBT ZWJhc3RpYW4gR25pYXpkb3dza2kgPHNnbmlhemRvd3NraUBnbWFpbC5jb20+CkRhdGU6ICAgU3Vu IEp1biA0IDA5OjQyOjQyIDIwMTcgKzAyMDAKCiAgICBSZWRpcwoKZGlmZiAtLWdpdCBhL1NyYy9N b2R1bGVzL2RiX3JlZGlzLmMgYi9TcmMvTW9kdWxlcy9kYl9yZWRpcy5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYTFhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvTW9k dWxlcy9kYl9yZWRpcy5jCkBAIC0wLDAgKzEsMzQ5NCBAQAorLyogLSotIE1vZGU6IEM7IGMtYmFz aWMtb2Zmc2V0OiA0IC0qLQorICogdmltOnN3PTQ6c3RzPTQ6ZXQKKyAqLworCisvKgorICogZGJf cmVkaXMuYyAtIGJpbmRpbmdzIGZvciAoaGkpcmVkaXMKKyAqCisgKiBCYXNlZCBvbiBkYl9nZGJt LmMgZnJvbSBac2ggZGlzdHJpYnV0aW9uLCBDb3B5cmlnaHQgKGMpIDIwMDggQ2xpbnQgQWRhbXMK KyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFNlYmFz dGlhbiBHbmlhemRvd3NraQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNz aW9uIGlzIGhlcmVieSBncmFudGVkLCB3aXRob3V0IHdyaXR0ZW4gYWdyZWVtZW50IGFuZCB3aXRo b3V0CisgKiBsaWNlbnNlIG9yIHJveWFsdHkgZmVlcywgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFu ZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVk IHZlcnNpb25zIG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSwgcHJvdmlkZWQg dGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZworICogdHdv IHBhcmFncmFwaHMgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhpcyBzb2Z0d2FyZS4KKyAqLwor CisjaW5jbHVkZSAiZGJfcmVkaXMubWRoIgorI2luY2x1ZGUgImRiX3JlZGlzLnBybyIKKworLyog TUFDUk9TIHt7eyAqLworI2lmbmRlZiBQTV9VUFRPREFURQorI2RlZmluZSBQTV9VUFRPREFURSAg ICAgKDE8PDE5KSAvKiBQYXJhbWV0ZXIgaGFzIHVwLXRvLWRhdGUgZGF0YSAoZS5nLiBsb2FkZWQg ZnJvbSBEQikgKi8KKyNlbmRpZgorCisjZGVmaW5lIFJFU0VUICAgICAgICAgIlwwMzNbbSIKKyNk ZWZpbmUgQk9MRCAgICAgICAgICAiXDAzM1sxbSIKKyNkZWZpbmUgUkVEICAgICAgICAgICAiXDAz M1szMW0iCisjZGVmaW5lIEdSRUVOICAgICAgICAgIlwwMzNbMzJtIgorI2RlZmluZSBZRUxMT1cg ICAgICAgICJcMDMzWzMzbSIKKyNkZWZpbmUgQkxVRSAgICAgICAgICAiXDAzM1szNG0iCisjZGVm aW5lIE1BR0VOVEEgICAgICAgIlwwMzNbMzVtIgorI2RlZmluZSBDWUFOICAgICAgICAgICJcMDMz WzM2bSIKKyNkZWZpbmUgQk9MRF9SRUQgICAgICAiXDAzM1sxOzMxbSIKKyNkZWZpbmUgQk9MRF9H UkVFTiAgICAiXDAzM1sxOzMybSIKKyNkZWZpbmUgQk9MRF9ZRUxMT1cgICAiXDAzM1sxOzMzbSIK KyNkZWZpbmUgQk9MRF9CTFVFICAgICAiXDAzM1sxOzM0bSIKKyNkZWZpbmUgQk9MRF9NQUdFTlRB ICAiXDAzM1sxOzM1bSIKKyNkZWZpbmUgQk9MRF9DWUFOICAgICAiXDAzM1sxOzM2bSIKKyNkZWZp bmUgQkdfUkVEICAgICAgICAiXDAzM1s0MW0iCisjZGVmaW5lIEJHX0dSRUVOICAgICAgIlwwMzNb NDJtIgorI2RlZmluZSBCR19ZRUxMT1cgICAgICJcMDMzWzQzbSIKKyNkZWZpbmUgQkdfQkxVRSAg ICAgICAiXDAzM1s0NG0iCisjZGVmaW5lIEJHX01BR0VOVEEgICAgIlwwMzNbNDVtIgorI2RlZmlu ZSBCR19DWUFOICAgICAgICJcMDMzWzQ2bSIKKworI2RlZmluZSBSRF9UWVBFX1VOS05PV04gMAor I2RlZmluZSBSRF9UWVBFX1NUUklORyAxCisjZGVmaW5lIFJEX1RZUEVfTElTVCAyCisjZGVmaW5l IFJEX1RZUEVfU0VUIDMKKyNkZWZpbmUgUkRfVFlQRV9aU0VUIDQKKyNkZWZpbmUgUkRfVFlQRV9I QVNIIDUKKy8qIH19fSAqLworCisjaWYgZGVmaW5lZChIQVZFX0hJUkVESVNfSElSRURJU19IKSAm JiBkZWZpbmVkKEhBVkVfUkVESVNDT05ORUNUKQorCisvKiBERUNMQVJBVElPTlMge3t7ICovCitz dGF0aWMgY2hhciAqdHlwZV9uYW1lc1s3XSA9IHsgImludmFsaWQiLCAic3RyaW5nIiwgImxpc3Qi LCAic2V0IiwgInNvcnRlZC1zZXQiLCAiaGFzaCIsICJlcnJvciIgfTsKKworI2luY2x1ZGUgPGhp cmVkaXMvaGlyZWRpcy5oPgorCitzdGF0aWMgUGFyYW0gY3JlYXRlaGFzaChjaGFyICpuYW1lLCBp bnQgZmxhZ3MsIGludCB3aGljaCk7CitzdGF0aWMgaW50IGFwcGVuZF90aWVkX25hbWUoY29uc3Qg Y2hhciAqbmFtZSk7CitzdGF0aWMgaW50IHJlbW92ZV90aWVkX25hbWUoY29uc3QgY2hhciAqbmFt ZSk7CitzdGF0aWMgY2hhciAqdW5tZXRhZnlfemFsbG9jKGNvbnN0IGNoYXIgKnRvX2NvcHksIGlu dCAqbmV3X2xlbik7CitzdGF0aWMgdm9pZCBzZXRfbGVuZ3RoKGNoYXIgKmJ1ZiwgaW50IHNpemUp Oworc3RhdGljIHZvaWQgcGFyc2VfaG9zdF9zdHJpbmcoY29uc3QgY2hhciAqaW5wdXQsIGNoYXIg KmJ1ZmZlciwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIg Kipob3N0LCBpbnQgKnBvcnQsIGludCAqZGJfaW5kZXgsIGNoYXIgKiprZXkpOworc3RhdGljIGlu dCBjb25uZWN0KGNoYXIgKm5hbSwgcmVkaXNDb250ZXh0ICoqcmMsIGNvbnN0IGNoYXIqIHBhc3N3 b3JkLCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgaW50IGRiX2luZGV4LAorICAgICAgICAg ICAgICAgICAgICBjb25zdCBjaGFyICpyZXNvdXJjZV9uYW1lX2luKTsKK3N0YXRpYyBpbnQgdHlw ZShyZWRpc0NvbnRleHQgKipyYywgY29uc3QgY2hhciAqcmVkaXNfaG9zdF9wb3J0LCBjb25zdCBj aGFyICpwYXNzd29yZCwgY2hhciAqa2V5LCBzaXplX3Qga2V5X2xlbik7CitzdGF0aWMgaW50IGlz X3RpZWQoUGFyYW0gcG0pOworc3RhdGljIHZvaWQgenJ0aWVfdXNhZ2UoKTsKK3N0YXRpYyB2b2lk IHpyenNldF91c2FnZSgpOworc3RhdGljIHZvaWQgenJ1bnRpZV91c2FnZSgpOworc3RhdGljIHZv aWQgenJlZGlzaG9zdF91c2FnZSgpOworc3RhdGljIHZvaWQgenJlZGlzY2xlYXJfdXNhZ2UoKTsK K3N0YXRpYyB2b2lkIG15ZnJlZXBhcmFtbm9kZShIYXNoTm9kZSBobik7CitzdGF0aWMgaW50IHJl Y29ubmVjdChyZWRpc0NvbnRleHQgKipyYywgY29uc3QgY2hhciAqaG9zdHNwZWMsIGNvbnN0IGNo YXIgKnBhc3N3b3JkKTsKK3N0YXRpYyBpbnQgYXV0aChyZWRpc0NvbnRleHQgKipyYywgY29uc3Qg Y2hhciAqcGFzc3dvcmQpOworCitzdGF0aWMgY2hhciAqYmFja3R5cGUgPSAiZGIvcmVkaXMiOwor c3RhdGljIGNoYXIgKm15X251bGxhcnJheSA9IE5VTEw7CitzdGF0aWMgaW50IG5vX2RhdGFiYXNl X2FjdGlvbiA9IDA7CisvKiB9fX0gKi8KKy8qIEFSUkFZOiBHU1Uge3t7ICovCisKKy8qCisgKiBM b25nZXIgR1NVIHN0cnVjdHVyZSwgdG8gY2FycnkgcmVkaXNDb250ZXh0IG9mIG93bmluZworICog ZGF0YWJhc2UuIEV2ZXJ5IHBhcmFtZXRlciAoaGFzaCB2YWx1ZSkgcmVjZWl2ZXMgR1NVCisgKiBw b2ludGVyIGFuZCB0aHVzIGFsc28gcmVjZWl2ZXMgcmVkaXNDb250ZXh0IC0gdGhpcyB3YXkKKyAq IHBhcmFtZXRlcnMgY2FuIGFjY2VzcyBwcm9wZXIgZGF0YWJhc2UuCisgKgorICogTWFpbiBIYXNo VGFibGUgcGFyYW1ldGVyIGhhcyB0aGUgc2FtZSBpbnN0YW5jZSBvZgorICogdGhlIGN1c3RvbSBH U1Ugc3RydWN0IGluIHUuaGFzaC0+dG1wZGF0YSBmaWVsZC4KKyAqIFdoZW4gZGF0YWJhc2UgaXMg Y2xvc2VkLCBgcmNgIGZpZWxkIGlzIHNldCB0byBOVUxMCisgKiBhbmQgaGFzaCB2YWx1ZXMga25v dyB0byBub3QgYWNjZXNzIGRhdGFiYXNlIHdoZW4KKyAqIGJlaW5nIHVuc2V0ICh0b3RhbCBwdXJn ZSBhdCB6dW50aWUpLgorICoKKyAqIFdoZW4gZGF0YWJhc2UgY2xvc2luZyBpcyBlbmRlZCwgdGhl IGN1c3RvbSBHU1Ugc3RydWN0CisgKiBpcyBmcmVlZC4gT25seSBuZXcgenRpZSBjcmVhdGVzIG5l dyBjdXN0b20gR1NVIHN0cnVjdAorICogaW5zdGFuY2UuCisgKgorICogVGhpcyBpcyBhbHNvIGZv ciBoYXNoZXMsIGFuZCBpcyBjYWxsZWQgKnNjYWxhciosIGJlY2F1c2UKKyAqIGl0J3MgZm9yIGhh c2ggKmVsZW1lbnRzKiwgUE1fU0NBTEFSIHwgUE1fSEFTSEVMRU0uIEFsc28KKyAqIGZvciBzdHJp bmdzLgorICovCitzdHJ1Y3QgZ3N1X3NjYWxhcl9leHQgeworICAgIHN0cnVjdCBnc3Vfc2NhbGFy IHN0ZDsKKyAgICBpbnQgdXNlX2NhY2hlOworICAgIHJlZGlzQ29udGV4dCAqcmM7CisgICAgY2hh ciAqcmVkaXNfaG9zdF9wb3J0OworICAgIGNoYXIgKmtleTsKKyAgICBzaXplX3Qga2V5X2xlbjsK KyAgICBjaGFyICpwYXNzd29yZDsKK307CisKKy8qIFVzZWQgYnkgc2V0cyAqLworc3RydWN0IGdz dV9hcnJheV9leHQgeworICAgIHN0cnVjdCBnc3VfYXJyYXkgc3RkOworICAgIGludCB1c2VfY2Fj aGU7CisgICAgcmVkaXNDb250ZXh0ICpyYzsKKyAgICBjaGFyICpyZWRpc19ob3N0X3BvcnQ7Cisg ICAgY2hhciAqa2V5OworICAgIHNpemVfdCBrZXlfbGVuOworICAgIGNoYXIgKnBhc3N3b3JkOwor fTsKKworLyogU291cmNlIHN0cnVjdHVyZSAtIHdpbGwgYmUgY29waWVkIHRvIGFsbG9jYXRlZCBv bmUsCisgKiB3aXRoIGByY2AgZmlsbGVkLiBgcmNgIGFsbG9jYXRpb24gPC0+IGdzdSBhbGxvY2F0 aW9uLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCBoYXNoZWxfZ3N1X2V4 dCA9CisgICAgeyB7IHJlZGlzX2dldGZuLCByZWRpc19zZXRmbiwgcmVkaXNfdW5zZXRmbiB9LCAw LCAwLCAwLCAwLCAwIH07CisKKy8qIEhhc2ggR1NVLCBub3JtYWwgb25lICovCitzdGF0aWMgY29u c3Qgc3RydWN0IGdzdV9oYXNoIHJlZGlzX2hhc2hfZ3N1ID0KKyAgICB7IGhhc2hnZXRmbiwgcmVk aXNfaGFzaF9zZXRmbiwgcmVkaXNfaGFzaF91bnNldGZuIH07CisKKy8qIFN0cmluZyAoc2NhbGFy IHRvIGtleSkgbWFwcGluZyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCBz dHJpbmdfZ3N1X2V4dCA9CisgICAgeyB7IHJlZGlzX3N0cl9nZXRmbiwgcmVkaXNfc3RyX3NldGZu LCByZWRpc19zdHJfdW5zZXRmbiB9LCAwLCAwLCAwLCAwLCAwIH07CisKKy8qIEFycmF5IHRvIHNl dCBtYXBwaW5nICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGdzdV9hcnJheV9leHQgYXJyc2V0X2dz dV9leHQgPQorICAgIHsgeyByZWRpc19hcnJzZXRfZ2V0Zm4sIHJlZGlzX2FycnNldF9zZXRmbiwg cmVkaXNfYXJyc2V0X3Vuc2V0Zm4gfSwgMCwgMCwgMCwgMCwgMCB9OworCisvKiBQTV9IQVNIRUxF TSBHU1UgZm9yIHpzZXQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3N1X3NjYWxhcl9leHQgaGFz aGVsX3pzZXRfZ3N1X2V4dCA9CisgICAgeyB7IHJlZGlzX3pzZXRfZ2V0Zm4sIHJlZGlzX3pzZXRf c2V0Zm4sIHJlZGlzX3pzZXRfdW5zZXRmbiB9LCAwLCAwLCAwLCAwLCAwIH07CisKKy8qIEhhc2gg R1NVIGZvciB6c2V0LCBub3JtYWwgb25lICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGdzdV9oYXNo IGhhc2hfenNldF9nc3UgPQorICAgIHsgaGFzaGdldGZuLCByZWRpc19oYXNoX3pzZXRfc2V0Zm4s IHJlZGlzX2hhc2hfenNldF91bnNldGZuIH07CisKKy8qIFBNX0hBU0hFTEVNIEdTVSBmb3IgaHNl dCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCBoYXNoZWxfaHNldF9nc3Vf ZXh0ID0KKyAgICB7IHsgcmVkaXNfaHNldF9nZXRmbiwgcmVkaXNfaHNldF9zZXRmbiwgcmVkaXNf aHNldF91bnNldGZuIH0sIDAsIDAsIDAsIDAsIDAgfTsKKworLyogSGFzaCBHU1UgZm9yIGhzZXQs IG5vcm1hbCBvbmUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3N1X2hhc2ggaGFzaF9oc2V0X2dz dSA9CisgICAgeyBoYXNoZ2V0Zm4sIHJlZGlzX2hhc2hfaHNldF9zZXRmbiwgcmVkaXNfaGFzaF9o c2V0X3Vuc2V0Zm4gfTsKKworLyogQXJyYXkgdG8gbGlzdCBtYXBwaW5nICovCitzdGF0aWMgY29u c3Qgc3RydWN0IGdzdV9hcnJheV9leHQgYXJybGlzdF9nc3VfZXh0ID0KKyAgICB7IHsgcmVkaXNf YXJybGlzdF9nZXRmbiwgcmVkaXNfYXJybGlzdF9zZXRmbiwgcmVkaXNfYXJybGlzdF91bnNldGZu IH0sIDAsIDAsIDAsIDAsIDAgfTsKKworLyogfX19ICovCisvKiBBUlJBWTogYnVpbHRpbiB7e3sg Ki8KK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBiaW50YWJbXSA9IHsKKyAgICBCVUlMVElOKCJ6cnRp ZSIsIDAsIGJpbl96cnRpZSwgMCwgLTEsIDAsICJkOmY6cnBoYTpBOiIsIE5VTEwpLAorICAgIEJV SUxUSU4oInpydW50aWUiLCAwLCBiaW5fenJ1bnRpZSwgMCwgLTEsIDAsICJ1aCIsIE5VTEwpLAor ICAgIEJVSUxUSU4oInpyZWRpc2hvc3QiLCAwLCBiaW5fenJlZGlzaG9zdCwgMCwgLTEsIDAsICJo IiwgTlVMTCksCisgICAgQlVJTFRJTigienJlZGlzY2xlYXIiLCAwLCBiaW5fenJlZGlzY2xlYXIs IDAsIDIsIDAsICJoIiwgTlVMTCksCisgICAgQlVJTFRJTigienJ6c2V0IiwgMCwgYmluX3pyenNl dCwgMCwgMSwgMCwgImgiLCBOVUxMKSwKK307CisvKiB9fX0gKi8KKy8qIEFSUkFZOiBvdGhlciB7 e3sgKi8KKyNkZWZpbmUgUk9BUlJQQVJBTURFRihuYW1lLCB2YXIpIFwKKyAgICB7IG5hbWUsIFBN X0FSUkFZIHwgUE1fUkVBRE9OTFksICh2b2lkICopIHZhciwgTlVMTCwgIE5VTEwsIE5VTEwsIE5V TEwgfQorCisvKiBIb2xkcyBuYW1lcyBvZiBhbGwgdGllZCBwYXJhbWV0ZXJzICovCitjaGFyICoq enJlZGlzX3RpZWQ7CisKK3N0YXRpYyBzdHJ1Y3QgcGFyYW1kZWYgcGF0YWJbXSA9IHsKKyAgICBS T0FSUlBBUkFNREVGKCJ6cmVkaXNfdGllZCIsICZ6cmVkaXNfdGllZCksCit9OworLyogfX19ICov CisKKy8qIEZVTkNUSU9OOiBiaW5fenJ0aWUge3t7ICovCisvKiovCitzdGF0aWMgaW50CitiaW5f enJ0aWUoY2hhciAqbmFtLCBjaGFyICoqYXJncywgT3B0aW9ucyBvcHMsIFVOVVNFRChpbnQgZnVu YykpCit7CisgICAgcmVkaXNDb250ZXh0ICpyYyA9IE5VTEw7CisgICAgaW50IHJlYWRfd3JpdGUg PSAxLCBwbWZsYWdzID0gUE1fUkVNT1ZBQkxFOworICAgIFBhcmFtIHRpZWRfcGFyYW07CisKKyAg ICAvKiBDaGVjayBvcHRpb25zICovCisKKyAgICBpZiAoT1BUX0lTU0VUKG9wcywnaCcpKSB7Cisg ICAgICAgIHpydGllX3VzYWdlKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlm ICghT1BUX0lTU0VUKG9wcywnZCcpKSB7CisgICAgICAgIHp3YXJubmFtKG5hbSwgInlvdSBtdXN0 IHBhc3MgYC1kICVzJywgc2VlIGAtaCciLCBiYWNrdHlwZSk7CisgICAgICAgIHJldHVybiAxOwor ICAgIH0KKyAgICBpZiAoIU9QVF9JU1NFVChvcHMsJ2YnKSkgeworICAgICAgICB6d2Fybm5hbShu YW0sICJ5b3UgbXVzdCBwYXNzIGAtZicgd2l0aCB7aG9zdH1bOnBvcnRdWy9bZGJfaWR4XVsva2V5 XV0sIHNlZSBgLWgnIiwgTlVMTCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAo T1BUX0lTU0VUKG9wcywncicpKSB7CisgICAgICAgIHJlYWRfd3JpdGUgPSAwOworICAgICAgICBw bWZsYWdzIHw9IFBNX1JFQURPTkxZOworICAgIH0KKworICAgIGlmIChzdHJjbXAoT1BUX0FSRyhv cHMsICdkJyksIGJhY2t0eXBlKSAhPSAwKSB7CisgICAgICAgIHp3YXJubmFtKG5hbSwgInVuc3Vw cG9ydGVkIGJhY2tlbmQgdHlwZSBgJXMnLCBzZWUgYC1oJyIsIE9QVF9BUkcob3BzLCAnZCcpKTsK KyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogUGFyc2UgaG9zdCBkYXRhICovCisK KyAgICBjaGFyICpwbW5hbWUsICpyZXNvdXJjZV9uYW1lX2luLCByZXNvdXJjZV9uYW1lWzE5Ml07 CisgICAgY2hhciAqaG9zdD0iMTI3LjAuMC4xIiwgKmtleT0iIiwgKnBhc3N3b3JkID0gTlVMTDsK KyAgICBpbnQgcG9ydCA9IDYzNzksIGRiX2luZGV4ID0gMDsKKworICAgIHJlc291cmNlX25hbWVf aW4gPSBPUFRfQVJHKG9wcywgJ2YnKTsKKyAgICBwbW5hbWUgPSAqYXJnczsKKworICAgIGlmICgh cG1uYW1lKSB7CisgICAgICAgIHp3YXJubmFtKG5hbSwgInlvdSBtdXN0IHBhc3Mgbm9uLW9wdGlv biBhcmd1bWVudCAtIHRoZSB0YXJnZXQgcGFyYW1ldGVyIHRvIGNyZWF0ZSwgc2VlIC1oIiwgYmFj a3R5cGUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwYXJzZV9ob3N0X3N0cmlu ZyhyZXNvdXJjZV9uYW1lX2luLCByZXNvdXJjZV9uYW1lLCAxOTIsICZob3N0LCAmcG9ydCwgJmRi X2luZGV4LCAma2V5KTsKKworICAgIC8qIFVuc2V0IGV4aXN0aW5nIHBhcmFtZXRlciAqLworCisg ICAgaWYgKCh0aWVkX3BhcmFtID0gKFBhcmFtKXBhcmFtdGFiLT5nZXRub2RlKHBhcmFtdGFiLCBw bW5hbWUpKSAmJiAhKHRpZWRfcGFyYW0tPm5vZGUuZmxhZ3MgJiBQTV9VTlNFVCkpIHsKKyAgICAg ICAgaWYgKGlzX3RpZWQodGllZF9wYXJhbSkpIHsKKyAgICAgICAgICAgIHp3YXJubmFtKG5hbSwg IlJlZnVzaW5nIHRvIHJlLXRpZSBhbHJlYWR5IHRpZWQgcGFyYW1ldGVyIGAlcyciLCBwbW5hbWUp OworICAgICAgICAgICAgendhcm5uYW0obmFtLCAiVGhlIGludm9sdmVkIGB1bnNldCcgY291bGQg Y2xlYXIgdGhlIGRhdGFiYXNlLXBhcnQgaGFuZGxlZCBieSBgJXMnIiwgcG1uYW1lKTsKKyAgICAg ICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgICAqIFVuc2V0 IGFueSBleGlzdGluZyBwYXJhbWV0ZXIuIE5vdGUgdGhlcmUncyBubyBpbXBsaWNpdAorICAgICAg ICAgKiAibG9jYWwiIGhlcmUsIGJ1dCBpZiB0aGUgZXhpc3RpbmcgcGFyYW1ldGVyIGlzIGxvY2Fs CisgICAgICAgICAqIHRoZW4gbmV3IHBhcmFtZXRlciB3aWxsIGJlIGFsc28gbG9jYWwgd2l0aG91 dCBmb2xsb3dpbmcKKyAgICAgICAgICogdW5zZXQuCisgICAgICAgICAqCisgICAgICAgICAqIFdl IG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgYXR0ZW1wdGluZyB0byBvcGVuIHRoZSBEQgorICAgICAg ICAgKiBpbiBjYXNlIHRoaXMgdmFyaWFibGUgaXMgYWxyZWFkeSB0aWVkIHRvIGEgREIuCisgICAg ICAgICAqCisgICAgICAgICAqIFRoaXMgY2FuIGZhaWwgaWYgdGhlIHZhcmlhYmxlIGlzIHJlYWRv bmx5IG9yIHJlc3RyaWN0ZWQuCisgICAgICAgICAqIFdlIGNvdWxkIGNhbGwgdW5zZXRwYXJhbSgp IGFuZCBjaGVjayBlcnJmbGFnIGluc3RlYWQKKyAgICAgICAgICogb2YgdGhlIHJldHVybiBzdGF0 dXMuCisgICAgICAgICAqLworICAgICAgICBpZiAodW5zZXRwYXJhbV9wbSh0aWVkX3BhcmFtLCAw LCAxKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIENvbm5lY3QgKi8K KworICAgIGNoYXIgYnVmWzEwMjVdOworICAgIGlmIChPUFRfSVNTRVQob3BzLCdhJykpIHsKKyAg ICAgICAgcGFzc3dvcmQgPSBPUFRfQVJHKG9wcywgJ2EnKTsKKyAgICB9IGVsc2UgaWYgKE9QVF9J U1NFVChvcHMsICdBJykpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcGZpbGVfcGF0aCA9IE9QVF9B Ukcob3BzLCdBJyk7CisgICAgICAgIEZJTEUgKnBmaWxlID0gZm9wZW4ocGZpbGVfcGF0aCwgInIi KTsKKyAgICAgICAgaWYgKHBmaWxlKSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGZyZWFkKGJ1 ZiwgMSwgMTAyNCwgcGZpbGUpOworICAgICAgICAgICAgZmNsb3NlKHBmaWxlKTsKKyAgICAgICAg ICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChzaXplID4gMTAyNCkKKyAg ICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEwMjQ7CisgICAgICAgICAgICAgICAgd2hpbGUoIGJ1 ZltzaXplLTFdID09ICdccicgfHwgYnVmW3NpemUtMV0gPT0gJ1xuJyApIHsKKyAgICAgICAgICAg ICAgICAgICAgLS1zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZb c2l6ZV0gPSAnXDAnOworICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gYnVmOworICAgICAgICAg ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB6d2Fybm5hbShuYW0sICJDb3VsZG4ndCByZWFk IHBhc3N3b3JkIGZpbGU6IGAlcycsIGFib3J0aW5nIiwgcGZpbGVfcGF0aCk7CisgICAgICAgICAg ICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg ICAgICB6d2Fybm5hbShuYW0sICJDb3VsZG4ndCBvcGVuIHBhc3N3b3JkIGZpbGU6IGAlcycsIGFi b3J0aW5nIiwgcGZpbGVfcGF0aCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQor ICAgIH0KKworICAgIGlmKCFjb25uZWN0KG5hbSwgJnJjLCBwYXNzd29yZCwgaG9zdCwgcG9ydCwg ZGJfaW5kZXgsIHJlc291cmNlX25hbWVfaW4pKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0K KworICAgIC8qIE1haW4gc3RyaW5nIHN0b3JhZ2U/ICovCisgICAgaWYgKDAgPT0gc3RyY21wKGtl eSwiIikpIHsKKyAgICAgICAgLyogQ3JlYXRlIGhhc2ggKi8KKyAgICAgICAgaWYgKCEodGllZF9w YXJhbSA9IGNyZWF0ZWhhc2gocG1uYW1lLCBwbWZsYWdzLCAwKSkpIHsKKyAgICAgICAgICAgIHp3 YXJubmFtKG5hbSwgImNhbm5vdCBjcmVhdGUgdGhlIHJlcXVlc3RlZCBoYXNoIHBhcmFtZXRlcjog JXMiLCBwbW5hbWUpOworICAgICAgICAgICAgcmVkaXNGcmVlKHJjKTsKKyAgICAgICAgICAgIHJl dHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgLyogQWxsb2NhdGUgcGFyYW1ldGVyIHN1Yi1n c3UsIGZpbGwgcmMgZmllbGQuCisgICAgICAgICAqIHJjIGFsbG9jYXRpb24gaXMgMSB0byAxIGFj Y29tcGFuaWVkIGJ5CisgICAgICAgICAqIGdzdV9zY2FsYXJfZXh0IGFsbG9jYXRpb24uICovCisK KyAgICAgICAgc3RydWN0IGdzdV9zY2FsYXJfZXh0ICpyY19jYXJyaWVyID0gTlVMTDsKKyAgICAg ICAgcmNfY2FycmllciA9IChzdHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKikgemFsbG9jKHNpemVvZihz dHJ1Y3QgZ3N1X3NjYWxhcl9leHQpKTsKKyAgICAgICAgcmNfY2Fycmllci0+c3RkID0gaGFzaGVs X2dzdV9leHQuc3RkOworICAgICAgICByY19jYXJyaWVyLT51c2VfY2FjaGUgPSAxOworICAgICAg ICBpZiAoT1BUX0lTU0VUKG9wcywncCcpKQorICAgICAgICAgICAgcmNfY2Fycmllci0+dXNlX2Nh Y2hlID0gMDsKKyAgICAgICAgcmNfY2Fycmllci0+cmMgPSByYzsKKworICAgICAgICAvKiBGaWxs IGFsc28gaG9zdDpwb3J0Ly8gYW5kIHBhc3N3b3JkIGZpZWxkcyAqLworICAgICAgICByY19jYXJy aWVyLT5yZWRpc19ob3N0X3BvcnQgPSB6dHJkdXAocmVzb3VyY2VfbmFtZV9pbik7CisgICAgICAg IGlmIChwYXNzd29yZCkKKyAgICAgICAgICAgIHJjX2NhcnJpZXItPnBhc3N3b3JkID0genRyZHVw KHBhc3N3b3JkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmNfY2Fycmllci0+cGFzc3dv cmQgPSBOVUxMOworCisgICAgICAgIHRpZWRfcGFyYW0tPnUuaGFzaC0+dG1wZGF0YSA9ICh2b2lk ICopcmNfY2FycmllcjsKKyAgICAgICAgdGllZF9wYXJhbS0+Z3N1LmggPSAmcmVkaXNfaGFzaF9n c3U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHRwZSA9IHR5cGUoJnJjLCByZXNvdXJjZV9u YW1lX2luLCBwYXNzd29yZCwga2V5LCAoc2l6ZV90KSBzdHJsZW4oa2V5KSk7CisgICAgICAgIGlm ICh0cGUgPT0gUkRfVFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICAgIGlmICghKHRpZWRfcGFyYW0g PSBjcmVhdGVwYXJhbShwbW5hbWUsIHBtZmxhZ3MgfCBQTV9TUEVDSUFMKSkpIHsKKyAgICAgICAg ICAgICAgICB6d2Fybm5hbShuYW0sICJjYW5ub3QgY3JlYXRlIHRoZSByZXF1ZXN0ZWQgc2NhbGFy IHBhcmFtZXRlcjogJXMiLCBwbW5hbWUpOworICAgICAgICAgICAgICAgIHJlZGlzRnJlZShyYyk7 CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBz dHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKnJjX2NhcnJpZXIgPSBOVUxMOworICAgICAgICAgICAgcmNf Y2FycmllciA9IChzdHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKikgemFsbG9jKHNpemVvZihzdHJ1Y3Qg Z3N1X3NjYWxhcl9leHQpKTsKKyAgICAgICAgICAgIHJjX2NhcnJpZXItPnN0ZCA9IHN0cmluZ19n c3VfZXh0LnN0ZDsKKyAgICAgICAgICAgIHJjX2NhcnJpZXItPnVzZV9jYWNoZSA9IDE7CisgICAg ICAgICAgICBpZiAoT1BUX0lTU0VUKG9wcywncCcpKQorICAgICAgICAgICAgICAgIHJjX2NhcnJp ZXItPnVzZV9jYWNoZSA9IDA7CisgICAgICAgICAgICByY19jYXJyaWVyLT5yYyA9IHJjOworICAg ICAgICAgICAgcmNfY2Fycmllci0+a2V5ID0genRyZHVwKGtleSk7CisgICAgICAgICAgICByY19j YXJyaWVyLT5rZXlfbGVuID0gc3RybGVuKGtleSk7CisKKyAgICAgICAgICAgIC8qIEZpbGwgYWxz byBob3N0OnBvcnQvLyBhbmQgcGFzc3dvcmQgZmllbGRzICovCisgICAgICAgICAgICByY19jYXJy aWVyLT5yZWRpc19ob3N0X3BvcnQgPSB6dHJkdXAocmVzb3VyY2VfbmFtZV9pbik7CisgICAgICAg ICAgICBpZiAocGFzc3dvcmQpCisgICAgICAgICAgICAgICAgcmNfY2Fycmllci0+cGFzc3dvcmQg PSB6dHJkdXAocGFzc3dvcmQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJj X2NhcnJpZXItPnBhc3N3b3JkID0gTlVMTDsKKworICAgICAgICAgICAgdGllZF9wYXJhbS0+Z3N1 LnMgPSAoR3N1U2NhbGFyKSByY19jYXJyaWVyOworICAgICAgICB9IGVsc2UgaWYgKHRwZSA9PSBS RF9UWVBFX1NFVCkgeworICAgICAgICAgICAgaWYgKCEodGllZF9wYXJhbSA9IGNyZWF0ZXBhcmFt KHBtbmFtZSwgcG1mbGFncyB8IFBNX0FSUkFZIHwgUE1fU1BFQ0lBTCkpKSB7CisgICAgICAgICAg ICAgICAgendhcm5uYW0obmFtLCAiY2Fubm90IGNyZWF0ZSB0aGUgcmVxdWVzdGVkIGFycmF5IChm b3Igc2V0KSBwYXJhbWV0ZXI6ICVzIiwgcG1uYW1lKTsKKyAgICAgICAgICAgICAgICByZWRpc0Zy ZWUocmMpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAg ICAgICAgc3RydWN0IGdzdV9hcnJheV9leHQgKnJjX2NhcnJpZXIgPSBOVUxMOworICAgICAgICAg ICAgcmNfY2FycmllciA9IChzdHJ1Y3QgZ3N1X2FycmF5X2V4dCAqKSB6YWxsb2Moc2l6ZW9mKHN0 cnVjdCBnc3VfYXJyYXlfZXh0KSk7CisgICAgICAgICAgICByY19jYXJyaWVyLT5zdGQgPSBhcnJz ZXRfZ3N1X2V4dC5zdGQ7CisgICAgICAgICAgICByY19jYXJyaWVyLT51c2VfY2FjaGUgPSAxOwor ICAgICAgICAgICAgaWYgKE9QVF9JU1NFVChvcHMsJ3AnKSkKKyAgICAgICAgICAgICAgICByY19j YXJyaWVyLT51c2VfY2FjaGUgPSAwOworICAgICAgICAgICAgcmNfY2Fycmllci0+cmMgPSByYzsK KyAgICAgICAgICAgIHJjX2NhcnJpZXItPmtleSA9IHp0cmR1cChrZXkpOworICAgICAgICAgICAg cmNfY2Fycmllci0+a2V5X2xlbiA9IHN0cmxlbihrZXkpOworCisgICAgICAgICAgICAvKiBGaWxs IGFsc28gaG9zdDpwb3J0Ly8gYW5kIHBhc3N3b3JkIGZpZWxkcyAqLworICAgICAgICAgICAgcmNf Y2Fycmllci0+cmVkaXNfaG9zdF9wb3J0ID0genRyZHVwKHJlc291cmNlX25hbWVfaW4pOworICAg ICAgICAgICAgaWYgKHBhc3N3b3JkKQorICAgICAgICAgICAgICAgIHJjX2NhcnJpZXItPnBhc3N3 b3JkID0genRyZHVwKHBhc3N3b3JkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg ICByY19jYXJyaWVyLT5wYXNzd29yZCA9IE5VTEw7CisKKyAgICAgICAgICAgIHRpZWRfcGFyYW0t PmdzdS5zID0gKEdzdVNjYWxhcikgcmNfY2FycmllcjsKKyAgICAgICAgfSBlbHNlIGlmICh0cGUg PT0gUkRfVFlQRV9aU0VUKSB7CisgICAgICAgICAgICAvKiBDcmVhdGUgaGFzaCAqLworICAgICAg ICAgICAgaWYgKCEodGllZF9wYXJhbSA9IGNyZWF0ZWhhc2gocG1uYW1lLCBwbWZsYWdzLCAxKSkp IHsKKyAgICAgICAgICAgICAgICB6d2Fybm5hbShuYW0sICJjYW5ub3QgY3JlYXRlIHRoZSByZXF1 ZXN0ZWQgaGFzaCAoZm9yIHpzZXQpIHBhcmFtZXRlcjogJXMiLCBwbW5hbWUpOworICAgICAgICAg ICAgICAgIHJlZGlzRnJlZShyYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAg ICAgICB9CisKKyAgICAgICAgICAgIHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCAqcmNfY2FycmllciA9 IE5VTEw7CisgICAgICAgICAgICByY19jYXJyaWVyID0gKHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCAq KSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCkpOworICAgICAgICAgICAgcmNf Y2Fycmllci0+c3RkID0gaGFzaGVsX3pzZXRfZ3N1X2V4dC5zdGQ7CisgICAgICAgICAgICByY19j YXJyaWVyLT51c2VfY2FjaGUgPSAxOworICAgICAgICAgICAgaWYgKE9QVF9JU1NFVChvcHMsJ3An KSkKKyAgICAgICAgICAgICAgICByY19jYXJyaWVyLT51c2VfY2FjaGUgPSAwOworICAgICAgICAg ICAgcmNfY2Fycmllci0+cmMgPSByYzsKKyAgICAgICAgICAgIHJjX2NhcnJpZXItPmtleSA9IHp0 cmR1cChrZXkpOworICAgICAgICAgICAgcmNfY2Fycmllci0+a2V5X2xlbiA9IHN0cmxlbihrZXkp OworCisgICAgICAgICAgICAvKiBGaWxsIGFsc28gaG9zdDpwb3J0Ly8gYW5kIHBhc3N3b3JkIGZp ZWxkcyAqLworICAgICAgICAgICAgcmNfY2Fycmllci0+cmVkaXNfaG9zdF9wb3J0ID0genRyZHVw KHJlc291cmNlX25hbWVfaW4pOworICAgICAgICAgICAgaWYgKHBhc3N3b3JkKQorICAgICAgICAg ICAgICAgIHJjX2NhcnJpZXItPnBhc3N3b3JkID0genRyZHVwKHBhc3N3b3JkKTsKKyAgICAgICAg ICAgIGVsc2UKKyAgICAgICAgICAgICAgICByY19jYXJyaWVyLT5wYXNzd29yZCA9IE5VTEw7CisK KyAgICAgICAgICAgIHRpZWRfcGFyYW0tPnUuaGFzaC0+dG1wZGF0YSA9ICh2b2lkICopcmNfY2Fy cmllcjsKKyAgICAgICAgICAgIHRpZWRfcGFyYW0tPmdzdS5oID0gJmhhc2hfenNldF9nc3U7Cisg ICAgICAgIH0gZWxzZSBpZiAodHBlID09IFJEX1RZUEVfSEFTSCkgeworICAgICAgICAgICAgLyog Q3JlYXRlIGhhc2ggKi8KKyAgICAgICAgICAgIGlmICghKHRpZWRfcGFyYW0gPSBjcmVhdGVoYXNo KHBtbmFtZSwgcG1mbGFncywgMikpKSB7CisgICAgICAgICAgICAgICAgendhcm5uYW0obmFtLCAi Y2Fubm90IGNyZWF0ZSB0aGUgcmVxdWVzdGVkIGhhc2ggKGZvciBoc2V0KSBwYXJhbWV0ZXI6ICVz IiwgcG1uYW1lKTsKKyAgICAgICAgICAgICAgICByZWRpc0ZyZWUocmMpOworICAgICAgICAgICAg ICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJ1Y3QgZ3N1X3Nj YWxhcl9leHQgKnJjX2NhcnJpZXIgPSBOVUxMOworICAgICAgICAgICAgcmNfY2FycmllciA9IChz dHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKikgemFsbG9jKHNpemVvZihzdHJ1Y3QgZ3N1X3NjYWxhcl9l eHQpKTsKKyAgICAgICAgICAgIHJjX2NhcnJpZXItPnN0ZCA9IGhhc2hlbF9oc2V0X2dzdV9leHQu c3RkOworICAgICAgICAgICAgcmNfY2Fycmllci0+dXNlX2NhY2hlID0gMTsKKyAgICAgICAgICAg IGlmIChPUFRfSVNTRVQob3BzLCdwJykpCisgICAgICAgICAgICAgICAgcmNfY2Fycmllci0+dXNl X2NhY2hlID0gMDsKKyAgICAgICAgICAgIHJjX2NhcnJpZXItPnJjID0gcmM7CisgICAgICAgICAg ICByY19jYXJyaWVyLT5rZXkgPSB6dHJkdXAoa2V5KTsKKyAgICAgICAgICAgIHJjX2NhcnJpZXIt PmtleV9sZW4gPSBzdHJsZW4oa2V5KTsKKworICAgICAgICAgICAgLyogRmlsbCBhbHNvIGhvc3Q6 cG9ydC8vIGFuZCBwYXNzd29yZCBmaWVsZHMgKi8KKyAgICAgICAgICAgIHJjX2NhcnJpZXItPnJl ZGlzX2hvc3RfcG9ydCA9IHp0cmR1cChyZXNvdXJjZV9uYW1lX2luKTsKKyAgICAgICAgICAgIGlm IChwYXNzd29yZCkKKyAgICAgICAgICAgICAgICByY19jYXJyaWVyLT5wYXNzd29yZCA9IHp0cmR1 cChwYXNzd29yZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmNfY2Fycmll ci0+cGFzc3dvcmQgPSBOVUxMOworCisgICAgICAgICAgICB0aWVkX3BhcmFtLT51Lmhhc2gtPnRt cGRhdGEgPSAodm9pZCAqKXJjX2NhcnJpZXI7CisgICAgICAgICAgICB0aWVkX3BhcmFtLT5nc3Uu aCA9ICZoYXNoX2hzZXRfZ3N1OworICAgICAgICB9IGVsc2UgaWYgKHRwZSA9PSBSRF9UWVBFX0xJ U1QpIHsKKyAgICAgICAgICAgIGlmICghKHRpZWRfcGFyYW0gPSBjcmVhdGVwYXJhbShwbW5hbWUs IHBtZmxhZ3MgfCBQTV9BUlJBWSB8IFBNX1NQRUNJQUwpKSkgeworICAgICAgICAgICAgICAgIHp3 YXJubmFtKG5hbSwgImNhbm5vdCBjcmVhdGUgdGhlIHJlcXVlc3RlZCBhcnJheSAoZm9yIGxpc3Qp IHBhcmFtZXRlcjogJXMiLCBwbW5hbWUpOworICAgICAgICAgICAgICAgIHJlZGlzRnJlZShyYyk7 CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBz dHJ1Y3QgZ3N1X2FycmF5X2V4dCAqcmNfY2FycmllciA9IE5VTEw7CisgICAgICAgICAgICByY19j YXJyaWVyID0gKHN0cnVjdCBnc3VfYXJyYXlfZXh0ICopIHphbGxvYyhzaXplb2Yoc3RydWN0IGdz dV9hcnJheV9leHQpKTsKKyAgICAgICAgICAgIHJjX2NhcnJpZXItPnN0ZCA9IGFycmxpc3RfZ3N1 X2V4dC5zdGQ7CisgICAgICAgICAgICByY19jYXJyaWVyLT51c2VfY2FjaGUgPSAxOworICAgICAg ICAgICAgaWYgKE9QVF9JU1NFVChvcHMsJ3AnKSkKKyAgICAgICAgICAgICAgICByY19jYXJyaWVy LT51c2VfY2FjaGUgPSAwOworICAgICAgICAgICAgcmNfY2Fycmllci0+cmMgPSByYzsKKyAgICAg ICAgICAgIHJjX2NhcnJpZXItPmtleSA9IHp0cmR1cChrZXkpOworICAgICAgICAgICAgcmNfY2Fy cmllci0+a2V5X2xlbiA9IHN0cmxlbihrZXkpOworCisgICAgICAgICAgICAvKiBGaWxsIGFsc28g aG9zdDpwb3J0Ly8gYW5kIHBhc3N3b3JkIGZpZWxkcyAqLworICAgICAgICAgICAgcmNfY2Fycmll ci0+cmVkaXNfaG9zdF9wb3J0ID0genRyZHVwKHJlc291cmNlX25hbWVfaW4pOworICAgICAgICAg ICAgaWYgKHBhc3N3b3JkKQorICAgICAgICAgICAgICAgIHJjX2NhcnJpZXItPnBhc3N3b3JkID0g enRyZHVwKHBhc3N3b3JkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByY19j YXJyaWVyLT5wYXNzd29yZCA9IE5VTEw7CisKKyAgICAgICAgICAgIHRpZWRfcGFyYW0tPmdzdS5z ID0gKEdzdVNjYWxhcikgcmNfY2FycmllcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg IHJlZGlzRnJlZShyYyk7CisgICAgICAgICAgICB6d2Fybm5hbShuYW0sICJVbmtub3duIGtleSB0 eXBlOiAlcyIsIHR5cGVfbmFtZXNbdHBlXSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAg ICAgfQorICAgIH0KKworICAgIC8qIFNhdmUgaW4gdGllZC1lbnVtZXJhdGlvbiBhcnJheSAqLwor ICAgIGFwcGVuZF90aWVkX25hbWUocG1uYW1lKTsKKworICAgIHJldHVybiAwOworfQorLyogfX19 ICovCisvKiBGVU5DVElPTjogYmluX3pydW50aWUge3t7ICovCisvKiovCitzdGF0aWMgaW50Citi aW5fenJ1bnRpZShjaGFyICpuYW0sIGNoYXIgKiphcmdzLCBPcHRpb25zIG9wcywgVU5VU0VEKGlu dCBmdW5jKSkKK3sKKyAgICBQYXJhbSBwbTsKKyAgICBjaGFyICpwbW5hbWU7CisgICAgaW50IHJl dCA9IDA7CisKKyAgICBpZiAoT1BUX0lTU0VUKG9wcywnaCcpKSB7CisgICAgICAgIHpydW50aWVf dXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCEqYXJncykgewor ICAgICAgICB6d2Fybm5hbShuYW0sICJBdCBsZWFzdCBvbmUgdmFyaWFibGUgbmFtZSBpcyBuZWVk ZWQsIHNlZSAtaCIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBmb3IgKHBtbmFt ZSA9ICphcmdzOyAqYXJncysrOyBwbW5hbWUgPSAqYXJncykgeworICAgICAgICAvKiBHZXQgcGFy YW0gKi8KKyAgICAgICAgcG0gPSAoUGFyYW0pIHBhcmFtdGFiLT5nZXRub2RlKHBhcmFtdGFiLCBw bW5hbWUpOworICAgICAgICBpZighcG0pIHsKKyAgICAgICAgICAgIHp3YXJubmFtKG5hbSwgImNh bm5vdCB1bnRpZSBgJXMnLCBwYXJhbWV0ZXIgbm90IGZvdW5kIiwgcG1uYW1lKTsKKyAgICAgICAg ICAgIHJldCA9IDE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAg IGlmIChwbS0+Z3N1LmggPT0gJnJlZGlzX2hhc2hfZ3N1KSB7CisgICAgICAgICAgICBxdWV1ZV9z aWduYWxzKCk7CisgICAgICAgICAgICBpZiAoT1BUX0lTU0VUKG9wcywndScpKQorICAgICAgICAg ICAgICAgIHBtLT5ub2RlLmZsYWdzICY9IH5QTV9SRUFET05MWTsKKyAgICAgICAgICAgIGlmICh1 bnNldHBhcmFtX3BtKHBtLCAwLCAxKSkgeworICAgICAgICAgICAgICAgIC8qIGFzc3VtZSBhbHJl YWR5IHJlcG9ydGVkICovCisgICAgICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIH0K KyAgICAgICAgICAgIHVucXVldWVfc2lnbmFscygpOworICAgICAgICB9IGVsc2UgaWYgKHBtLT5n c3Uucy0+Z2V0Zm4gPT0gJnJlZGlzX3N0cl9nZXRmbikgeworICAgICAgICAgICAgaWYgKHBtLT5u b2RlLmZsYWdzICYgUE1fUkVBRE9OTFkgJiYgIU9QVF9JU1NFVChvcHMsJ3UnKSkgeworICAgICAg ICAgICAgICAgIHp3YXJubmFtKG5hbSwgImNhbm5vdCB1bnRpZSBgJXMnLCBwYXJhbWV0ZXIgaXMg cmVhZCBvbmx5LCB1c2UgLXUgb3B0aW9uIiwgcG1uYW1lKTsKKyAgICAgICAgICAgICAgICBjb250 aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBtLT5ub2RlLmZsYWdzICY9IH5QTV9S RUFET05MWTsKKworICAgICAgICAgICAgcXVldWVfc2lnbmFscygpOworICAgICAgICAgICAgLyog RGV0YWNoIGZyb20gZGF0YWJhc2UsIHVudGllIGRvZXNuJ3QgY2xlYXIgdGhlIGRhdGFiYXNlICov CisgICAgICAgICAgICByZWRpc19zdHJfdW50aWUocG0pOworCisgICAgICAgICAgICBpZiAodW5z ZXRwYXJhbV9wbShwbSwgMCwgMSkpIHsKKyAgICAgICAgICAgICAgICAvKiBhc3N1bWUgYWxyZWFk eSByZXBvcnRlZCAqLworICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICB9Cisg ICAgICAgICAgICB1bnF1ZXVlX3NpZ25hbHMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChwbS0+Z3N1 LmEtPmdldGZuID09ICZyZWRpc19hcnJzZXRfZ2V0Zm4pIHsKKyAgICAgICAgICAgIGlmIChwbS0+ bm9kZS5mbGFncyAmIFBNX1JFQURPTkxZICYmICFPUFRfSVNTRVQob3BzLCd1JykpIHsKKyAgICAg ICAgICAgICAgICB6d2Fybm5hbShuYW0sICJjYW5ub3QgdW50aWUgYXJyYXkgYCVzJywgdGhlIHNl dC1ib3VuZCBwYXJhbWV0ZXIgaXMgcmVhZCBvbmx5LCB1c2UgLXUgb3B0aW9uIiwgcG1uYW1lKTsK KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBt LT5ub2RlLmZsYWdzICY9IH5QTV9SRUFET05MWTsKKyAgICAgICAgICAgIHF1ZXVlX3NpZ25hbHMo KTsKKyAgICAgICAgICAgIC8qIERldGFjaCBmcm9tIGRhdGFiYXNlLCB1bnRpZSBkb2Vzbid0IGNs ZWFyIHRoZSBkYXRhYmFzZSAqLworICAgICAgICAgICAgcmVkaXNfYXJyc2V0X3VudGllKHBtKTsK KworICAgICAgICAgICAgaWYgKHVuc2V0cGFyYW1fcG0ocG0sIDAsIDEpKSB7CisgICAgICAgICAg ICAgICAgLyogYXNzdW1lIGFscmVhZHkgcmVwb3J0ZWQgKi8KKyAgICAgICAgICAgICAgICByZXQg PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5xdWV1ZV9zaWduYWxzKCk7CisgICAg ICAgIH0gZWxzZSBpZiAocG0tPmdzdS5oID09ICZoYXNoX3pzZXRfZ3N1KSB7CisgICAgICAgICAg ICBxdWV1ZV9zaWduYWxzKCk7CisgICAgICAgICAgICBpZiAoT1BUX0lTU0VUKG9wcywndScpKQor ICAgICAgICAgICAgICAgIHBtLT5ub2RlLmZsYWdzICY9IH5QTV9SRUFET05MWTsKKyAgICAgICAg ICAgIGlmICh1bnNldHBhcmFtX3BtKHBtLCAwLCAxKSkgeworICAgICAgICAgICAgICAgIC8qIGFz c3VtZSBhbHJlYWR5IHJlcG9ydGVkICovCisgICAgICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAg ICAgICAgIH0KKyAgICAgICAgICAgIHVucXVldWVfc2lnbmFscygpOworICAgICAgICB9IGVsc2Ug aWYgKHBtLT5nc3UuaCA9PSAmaGFzaF9oc2V0X2dzdSkgeworICAgICAgICAgICAgcXVldWVfc2ln bmFscygpOworICAgICAgICAgICAgaWYgKE9QVF9JU1NFVChvcHMsJ3UnKSkKKyAgICAgICAgICAg ICAgICBwbS0+bm9kZS5mbGFncyAmPSB+UE1fUkVBRE9OTFk7CisgICAgICAgICAgICBpZiAodW5z ZXRwYXJhbV9wbShwbSwgMCwgMSkpIHsKKyAgICAgICAgICAgICAgICAvKiBhc3N1bWUgYWxyZWFk eSByZXBvcnRlZCAqLworICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICB9Cisg ICAgICAgICAgICB1bnF1ZXVlX3NpZ25hbHMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChwbS0+Z3N1 LmEtPmdldGZuID09ICZyZWRpc19hcnJsaXN0X2dldGZuKSB7CisgICAgICAgICAgICBpZiAocG0t Pm5vZGUuZmxhZ3MgJiBQTV9SRUFET05MWSAmJiAhT1BUX0lTU0VUKG9wcywndScpKSB7CisgICAg ICAgICAgICAgICAgendhcm5uYW0obmFtLCAiY2Fubm90IHVudGllIGFycmF5IGAlcycsIHRoZSBs aXN0LWJvdW5kIHBhcmFtZXRlciBpcyByZWFkIG9ubHksIHVzZSAtdSBvcHRpb24iLCBwbW5hbWUp OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAg cG0tPm5vZGUuZmxhZ3MgJj0gflBNX1JFQURPTkxZOworICAgICAgICAgICAgcXVldWVfc2lnbmFs cygpOworICAgICAgICAgICAgLyogRGV0YWNoIGZyb20gZGF0YWJhc2UsIHVudGllIGRvZXNuJ3Qg Y2xlYXIgdGhlIGRhdGFiYXNlICovCisgICAgICAgICAgICByZWRpc19hcnJzZXRfdW50aWUocG0p OworCisgICAgICAgICAgICBpZiAodW5zZXRwYXJhbV9wbShwbSwgMCwgMSkpIHsKKyAgICAgICAg ICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5xdWV1ZV9zaWdu YWxzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6d2Fybm5hbShuYW0sICJub3Qg YSB0aWVkIHJlZGlzIHBhcmFtZXRlcjogYCVzJyIsIHBtbmFtZSk7CisgICAgICAgICAgICByZXQg PSAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1 cm4gcmV0OworfQorLyogfX19ICovCisvKiBGVU5DVElPTjogYmluX3pyZWRpc2hvc3Qge3t7ICov CisvKiovCitzdGF0aWMgaW50CitiaW5fenJlZGlzaG9zdChjaGFyICpuYW0sIGNoYXIgKiphcmdz LCBPcHRpb25zIG9wcywgVU5VU0VEKGludCBmdW5jKSkKK3sKKyAgICBQYXJhbSBwbTsKKyAgICBj aGFyICpwbW5hbWU7CisKKyAgICBpZiAoT1BUX0lTU0VUKG9wcywgJ2gnKSkgeworICAgICAgICB6 cmVkaXNob3N0X3VzYWdlKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHBtbmFt ZSA9ICphcmdzOworCisgICAgaWYgKCFwbW5hbWUpIHsKKyAgICAgICAgendhcm5uYW0obmFtLCAi cGFyYW1ldGVyIG5hbWUgKHdob3NlIGhvc3Qtc3BlYyBpcyB0byBiZSB3cml0dGVuIHRvICRSRVBM WSkgaXMgcmVxdWlyZWQsIHNlZSAtaCIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAg ICBwbSA9IChQYXJhbSkgcGFyYW10YWItPmdldG5vZGUocGFyYW10YWIsIHBtbmFtZSk7CisgICAg aWYoIXBtKSB7CisgICAgICAgIHp3YXJubmFtKG5hbSwgIm5vIHN1Y2ggcGFyYW1ldGVyOiAlcyIs IHBtbmFtZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKmhv c3RzcGVjID0gTlVMTDsKKworICAgIGlmIChwbS0+Z3N1LmggPT0gJnJlZGlzX2hhc2hfZ3N1KSB7 CisgICAgICAgIC8qIFBhcmFub2lhLCBpdCAqd2lsbCogYmUgYWx3YXlzIHNldCAqLworICAgICAg ICBob3N0c3BlYyA9ICgoc3RydWN0IGdzdV9zY2FsYXJfZXh0ICopcG0tPnUuaGFzaC0+dG1wZGF0 YSktPnJlZGlzX2hvc3RfcG9ydDsKKyAgICB9IGVsc2UgaWYocG0tPmdzdS5zLT5nZXRmbiA9PSAm cmVkaXNfc3RyX2dldGZuKSB7CisgICAgICAgIGhvc3RzcGVjID0gKChzdHJ1Y3QgZ3N1X3NjYWxh cl9leHQgKilwbS0+Z3N1LnMpLT5yZWRpc19ob3N0X3BvcnQ7CisgICAgfSBlbHNlIGlmKHBtLT5n c3UuYS0+Z2V0Zm4gPT0gJnJlZGlzX2FycnNldF9nZXRmbikgeworICAgICAgICBob3N0c3BlYyA9 ICgoc3RydWN0IGdzdV9hcnJheV9leHQgKilwbS0+Z3N1LmEpLT5yZWRpc19ob3N0X3BvcnQ7Cisg ICAgfSBlbHNlIGlmKHBtLT5nc3UuaCA9PSAmaGFzaF96c2V0X2dzdSkgeworICAgICAgICBob3N0 c3BlYyA9ICgoc3RydWN0IGdzdV9zY2FsYXJfZXh0ICopcG0tPnUuaGFzaC0+dG1wZGF0YSktPnJl ZGlzX2hvc3RfcG9ydDsKKyAgICB9IGVsc2UgaWYocG0tPmdzdS5oID09ICZoYXNoX2hzZXRfZ3N1 KSB7CisgICAgICAgIGhvc3RzcGVjID0gKChzdHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKilwbS0+dS5o YXNoLT50bXBkYXRhKS0+cmVkaXNfaG9zdF9wb3J0OworICAgIH0gZWxzZSBpZihwbS0+Z3N1LmEt PmdldGZuID09ICZyZWRpc19hcnJsaXN0X2dldGZuKSB7CisgICAgICAgIGhvc3RzcGVjID0gKChz dHJ1Y3QgZ3N1X2FycmF5X2V4dCAqKXBtLT5nc3UuYSktPnJlZGlzX2hvc3RfcG9ydDsKKyAgICB9 IGVsc2UgeworICAgICAgICB6d2Fybm5hbShuYW0sICJub3QgYSB0aWVkIHpyZWRpcyBwYXJhbWV0 ZXI6IGAlcycsIFJFUExZIHVuY2hhbmdlZCIsIHBtbmFtZSk7CisgICAgICAgIHJldHVybiAxOwor ICAgIH0KKworICAgIGlmIChob3N0c3BlYykgeworICAgICAgICBzZXRzcGFyYW0oIlJFUExZIiwg enRyZHVwKGhvc3RzcGVjKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0c3BhcmFtKCJSRVBM WSIsIHp0cmR1cCgiIikpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKy8qIH19fSAqLworLyog RlVOQ1RJT046IGJpbl96cmVkaXNjbGVhciB7e3sgKi8KKy8qKi8KK3N0YXRpYyBpbnQKK2Jpbl96 cmVkaXNjbGVhcihjaGFyICpuYW0sIGNoYXIgKiphcmdzLCBPcHRpb25zIG9wcywgVU5VU0VEKGlu dCBmdW5jKSkKK3sKKyAgICBQYXJhbSBwbTsKKyAgICBjaGFyICpwbW5hbWUsICprZXk7CisKKyAg ICBwbW5hbWUgPSAqYXJncysrOworICAgIGtleSA9ICphcmdzOworCisgICAgaWYgKE9QVF9JU1NF VChvcHMsJ2gnKSkgeworICAgICAgICB6cmVkaXNjbGVhcl91c2FnZSgpOworICAgICAgICByZXR1 cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIXBtbmFtZSkgeworICAgICAgICB6d2Fybm5hbShuYW0s ICJwYXJhbWV0ZXIgbmFtZSAod2hvc2UgY2FjaGUgaXMgdG8gYmUgY2xlYXJlZCkgaXMgcmVxdWly ZWQsIHNlZSAtaCIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwbSA9IChQYXJh bSkgcGFyYW10YWItPmdldG5vZGUocGFyYW10YWIsIHBtbmFtZSk7CisgICAgaWYgKCFwbSkgewor ICAgICAgICB6d2Fybm5hbShuYW0sICJubyBzdWNoIHBhcmFtZXRlcjogJXMiLCBwbW5hbWUpOwor ICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAocG0tPmdzdS5oID09ICZyZWRpc19o YXNoX2dzdSkgeworICAgICAgICBpZiAoIWtleSkgeworICAgICAgICAgICAgendhcm5uYW0obmFt LCAiS2V5IG5hbWUsIHdoaWNoIGlzIHRvIGJlIGNhY2hlLWNsZWFyZWQgaW4gaGFzaCBgJXMnLCBp cyByZXF1aXJlZCIsIHBtbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQor ICAgICAgICBIYXNoVGFibGUgaHQgPSBwbS0+dS5oYXNoOworICAgICAgICBIYXNoTm9kZSBobiA9 IGdldGhhc2hub2RlMihodCwga2V5KTsKKyAgICAgICAgUGFyYW0gdmFsX3BtID0gKFBhcmFtKSBo bjsKKyAgICAgICAgaWYgKHZhbF9wbSkgeworICAgICAgICAgICAgdmFsX3BtLT5ub2RlLmZsYWdz ICY9IH4oUE1fVVBUT0RBVEUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwbS0+Z3N1LnMt PmdldGZuID09ICZyZWRpc19zdHJfZ2V0Zm4pIHsKKyAgICAgICAgcG0tPm5vZGUuZmxhZ3MgJj0g fihQTV9VUFRPREFURSk7CisgICAgICAgIGlmIChrZXkpCisgICAgICAgICAgICB6d2Fybm5hbShu YW0sICJJZ25vcmVkIGFyZ3VtZW50IGAlcyciLCBrZXkpOworICAgIH0gZWxzZSBpZiAocG0tPmdz dS5hLT5nZXRmbiA9PSAmcmVkaXNfYXJyc2V0X2dldGZuKSB7CisgICAgICAgIHBtLT5ub2RlLmZs YWdzICY9IH4oUE1fVVBUT0RBVEUpOworICAgICAgICBpZiAoa2V5KQorICAgICAgICAgICAgendh cm5uYW0obmFtLCAiSWdub3JlZCBhcmd1bWVudCBgJXMnIiwga2V5KTsKKyAgICB9IGVsc2UgaWYo cG0tPmdzdS5oID09ICZoYXNoX3pzZXRfZ3N1KSB7CisgICAgICAgIGlmICgha2V5KSB7CisgICAg ICAgICAgICB6d2Fybm5hbShuYW0sICJLZXkgbmFtZSwgd2hpY2ggaXMgdG8gYmUgY2FjaGUtY2xl YXJlZCBpbiBoYXNoL3pzZXQgYCVzJywgaXMgcmVxdWlyZWQiLCBwbW5hbWUpOworICAgICAgICAg ICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgSGFzaFRhYmxlIGh0ID0gcG0tPnUuaGFz aDsKKyAgICAgICAgSGFzaE5vZGUgaG4gPSBnZXRoYXNobm9kZTIoaHQsIGtleSk7CisgICAgICAg IFBhcmFtIHZhbF9wbSA9IChQYXJhbSkgaG47CisgICAgICAgIGlmICh2YWxfcG0pIHsKKyAgICAg ICAgICAgIHZhbF9wbS0+bm9kZS5mbGFncyAmPSB+KFBNX1VQVE9EQVRFKTsKKyAgICAgICAgfQor ICAgIH0gZWxzZSBpZihwbS0+Z3N1LmggPT0gJmhhc2hfaHNldF9nc3UpIHsKKyAgICAgICAgaWYg KCFrZXkpIHsKKyAgICAgICAgICAgIHp3YXJubmFtKG5hbSwgIktleSBuYW1lLCB3aGljaCBpcyB0 byBiZSBjYWNoZS1jbGVhcmVkIGluIGhhc2gvaHNldCBgJXMnLCBpcyByZXF1aXJlZCIsIHBtbmFt ZSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBIYXNoVGFibGUg aHQgPSBwbS0+dS5oYXNoOworICAgICAgICBIYXNoTm9kZSBobiA9IGdldGhhc2hub2RlMihodCwg a2V5KTsKKyAgICAgICAgUGFyYW0gdmFsX3BtID0gKFBhcmFtKSBobjsKKyAgICAgICAgaWYgKHZh bF9wbSkgeworICAgICAgICAgICAgdmFsX3BtLT5ub2RlLmZsYWdzICY9IH4oUE1fVVBUT0RBVEUp OworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwbS0+Z3N1LmEtPmdldGZuID09ICZyZWRpc19h cnJsaXN0X2dldGZuKSB7CisgICAgICAgIHBtLT5ub2RlLmZsYWdzICY9IH4oUE1fVVBUT0RBVEUp OworICAgICAgICBpZiAoa2V5KQorICAgICAgICAgICAgendhcm5uYW0obmFtLCAiSWdub3JlZCBh cmd1bWVudCBgJXMnIiwga2V5KTsKKyAgICB9IGVsc2UgeworICAgICAgICB6d2Fybm5hbShuYW0s ICJub3QgYSB0aWVkIHpyZWRpcyBwYXJhbWV0ZXI6ICVzIiwgcG1uYW1lKTsKKyAgICAgICAgcmV0 dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisvKiB9fX0gKi8KKworLyoqKioqKioq KioqKioqKiBIQVNIIEVMRU0gKioqKioqKioqKioqKioqLworCisvKiBGVU5DVElPTjogcmVkaXNf Z2V0Zm4ge3t7ICovCisKKy8qCisgKiBUaGUgcGFyYW0gaXMgYWN0dWFsIHBhcmFtIGluIGhhc2gg 4oCTwqBhbHdheXMsIGJlY2F1c2UKKyAqIHJlZGlzX2dldF9ub2RlIGNyZWF0ZXMgZXZlcnkgbmV3 IGtleSBzZWVuLiBIb3dldmVyLCBpdAorICogbWlnaHQgYmUgbm90IFBNX1VQVE9EQVRFIC0gd2hp Y2ggbWVhbnMgdGhhdCBkYXRhYmFzZQorICogd2Fzbid0IHlldCBxdWVyaWVkLgorICoKKyAqIEl0 IHdpbGwgYmUgbGVmdCBpbiB0aGlzIHN0YXRlIGlmIGRhdGFiYXNlIGRvZXNuJ3QKKyAqIGNvbnRh aW4gc3VjaCBrZXkuIFRoYXQgbWlnaHQgYmUgYSBkcmF3YmFjaywgbWF5YmUKKyAqIHNldHRpbmcg dG8gZW1wdHkgdmFsdWUgaGFzIHNlbnNlLiBUaGlzIHdvdWxkIHJlbW92ZQorICogc3VidGxlIGhj YWxsb2MoMSkgbGVhay4KKyAqLworCisvKiovCitzdGF0aWMgY2hhciAqCityZWRpc19nZXRmbihQ YXJhbSBwbSkKK3sKKyAgICBzdHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKmdzdV9leHQ7CisgICAgY2hh ciAqa2V5OworICAgIHNpemVfdCBrZXlfbGVuOworICAgIHJlZGlzQ29udGV4dCAqcmM7CisgICAg cmVkaXNSZXBseSAqcmVwbHk7CisKKyAgICBnc3VfZXh0ID0gKHN0cnVjdCBnc3Vfc2NhbGFyX2V4 dCAqKSBwbS0+Z3N1LnM7CisKKyAgICAvKiBLZXkgYWxyZWFkeSByZXRyaWV2ZWQ/ICovCisgICAg aWYgKChwbS0+bm9kZS5mbGFncyAmIFBNX1VQVE9EQVRFKSAmJiBnc3VfZXh0LT51c2VfY2FjaGUp IHsKKyAgICAgICAgcmV0dXJuIHBtLT51LnN0ciA/IHBtLT51LnN0ciA6IChjaGFyICopIGhjYWxs b2MoMSk7CisgICAgfQorCisgICAgLyogVW5tZXRhZnkga2V5LiBSZWRpcyBmaXRzIG5pY2UgaW50 byB0aGlzCisgICAgICogcHJvY2VzcywgYXMgaXQgY2FuIHVzZSBsZW5ndGggb2YgZGF0YSAqLwor ICAgIGludCB1bWxlbiA9IDA7CisgICAgY2hhciAqdW1rZXkgPSB1bm1ldGFmeV96YWxsb2MocG0t Pm5vZGUubmFtLCAmdW1sZW4pOworCisgICAga2V5ID0gdW1rZXk7CisgICAga2V5X2xlbiA9IHVt bGVuOworCisgICAgaW50IHJldHJ5ID0gMDsKKyByZXRyeToKKyAgICByYyA9IGdzdV9leHQtPnJj OworCisgICAgaWYgKHJjKSB7CisgICAgICAgIHJlcGx5ID0gcmVkaXNDb21tYW5kKHJjLCAiRVhJ U1RTICViIiwga2V5LCAoc2l6ZV90KSBrZXlfbGVuKTsKKyAgICAgICAgaWYgKHJlcGx5ICYmIHJl cGx5LT50eXBlID09IFJFRElTX1JFUExZX0lOVEVHRVIgJiYgcmVwbHktPmludGVnZXIgPT0gMSkg eworICAgICAgICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsKKworICAgICAgICAgICAgcmVw bHkgPSByZWRpc0NvbW1hbmQocmMsICJHRVQgJWIiLCBrZXksIChzaXplX3QpIGtleV9sZW4pOwor ICAgICAgICAgICAgaWYgKHJlcGx5ICYmIHJlcGx5LT50eXBlID09IFJFRElTX1JFUExZX1NUUklO RykgeworICAgICAgICAgICAgICAgIC8qIFdlIGhhdmUgZGF0YSDigJMgc3RvcmUgaXQsIHJldHVy biBpdCAqLworICAgICAgICAgICAgICAgIHBtLT5ub2RlLmZsYWdzIHw9IFBNX1VQVE9EQVRFOwor CisgICAgICAgICAgICAgICAgLyogRW5zdXJlIHRoZXJlJ3Mgbm8gbGVhayAqLworICAgICAgICAg ICAgICAgIGlmIChwbS0+dS5zdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgenNmcmVlKHBtLT51 LnN0cik7CisgICAgICAgICAgICAgICAgICAgIHBtLT51LnN0ciA9IE5VTEw7CisgICAgICAgICAg ICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTWV0YWZ5IHJldHVybmVkIGRhdGEuIEFsbCBm aXRzIC0gbWV0YWZ5CisgICAgICAgICAgICAgICAgICogY2FuIG9idGFpbiBkYXRhIGxlbmd0aCB0 byBhdm9pZCB1c2luZyBcMCAqLworICAgICAgICAgICAgICAgIHBtLT51LnN0ciA9IG1ldGFmeShy ZXBseS0+c3RyLCByZXBseS0+bGVuLCBNRVRBX0RVUCk7CisgICAgICAgICAgICAgICAgZnJlZVJl cGx5T2JqZWN0KHJlcGx5KTsKKworICAgICAgICAgICAgICAgIC8qIEZyZWUga2V5LCByZXN0b3Jp bmcgaXRzIG9yaWdpbmFsIGxlbmd0aCAqLworICAgICAgICAgICAgICAgIHNldF9sZW5ndGgodW1r ZXksIGtleV9sZW4pOworICAgICAgICAgICAgICAgIHpzZnJlZSh1bWtleSk7CisKKyAgICAgICAg ICAgICAgICAvKiBDYW4gcmV0dXJuIHBvaW50ZXIsIGNvcnJlY3RseSBzYXZlZCBpbnNpZGUgaGFz aCAqLworICAgICAgICAgICAgICAgIHJldHVybiBwbS0+dS5zdHI7CisgICAgICAgICAgICB9IGVs c2UgaWYgKHJlcGx5KSB7CisgICAgICAgICAgICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsK KyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXBseSkgeworICAgICAgICAgICAg ZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmV0cnkg JiYgKHJjLT5lcnIgJiAoUkVESVNfRVJSX0lPIHwgUkVESVNfRVJSX0VPRikpKSB7CisgICAgICAg ICAgICByZXRyeSA9IDE7CisgICAgICAgICAgICBpZihyZWNvbm5lY3QoJmdzdV9leHQtPnJjLCBn c3VfZXh0LT5yZWRpc19ob3N0X3BvcnQsIGdzdV9leHQtPnBhc3N3b3JkKSkKKyAgICAgICAgICAg ICAgICBnb3RvIHJldHJ5OworICAgICAgICB9IGVsc2UgaWYgKHJldHJ5ICYmIChyYy0+ZXJyICYg KFJFRElTX0VSUl9JTyB8IFJFRElTX0VSUl9FT0YpKSkgeworICAgICAgICAgICAgendhcm4oIkFi b3J0aW5nIChubyBjb25uZWN0aW9uKSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJl ZSBrZXksIHJlc3RvcmluZyBpdHMgb3JpZ2luYWwgbGVuZ3RoICovCisgICAgc2V0X2xlbmd0aCh1 bWtleSwga2V5X2xlbik7CisgICAgenNmcmVlKHVta2V5KTsKKworICAgIHJldHVybiAiIjsKK30K Ky8qIH19fSAqLworLyogRlVOQ1RJT046IHJlZGlzX3NldGZuIHt7eyAqLworLyoqLworc3RhdGlj IHZvaWQKK3JlZGlzX3NldGZuKFBhcmFtIHBtLCBjaGFyICp2YWwpCit7CisgICAgY2hhciAqa2V5 LCAqY29udGVudDsKKyAgICBzaXplX3Qga2V5X2xlbiwgY29udGVudF9sZW47CisgICAgcmVkaXND b250ZXh0ICpyYzsKKyAgICByZWRpc1JlcGx5ICpyZXBseTsKKyAgICBzdHJ1Y3QgZ3N1X3NjYWxh cl9leHQgKmdzdV9leHQ7CisKKyAgICBnc3VfZXh0ID0gKHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCAq KSBwbS0+Z3N1LnM7CisKKyAgICAvKiBTZXQgaXMgZG9uZSBvbiBwYXJhbWV0ZXIgYW5kIG9uIGRh dGFiYXNlLiAqLworCisgICAgLyogUGFyYW1ldGVyICovCisgICAgaWYgKHBtLT51LnN0cikgewor ICAgICAgICB6c2ZyZWUocG0tPnUuc3RyKTsKKyAgICAgICAgcG0tPnUuc3RyID0gTlVMTDsKKyAg ICAgICAgcG0tPm5vZGUuZmxhZ3MgJj0gfihQTV9VUFRPREFURSk7CisgICAgfQorCisgICAgaWYg KHZhbCkgeworICAgICAgICBwbS0+dS5zdHIgPSB6dHJkdXAodmFsKTsKKyAgICAgICAgcG0tPm5v ZGUuZmxhZ3MgfD0gUE1fVVBUT0RBVEU7CisgICAgfQorCisgICAgaW50IHJldHJ5ID0gMDsKKyBy ZXRyeToKKworICAgIC8qIERhdGFiYXNlICovCisgICAgcmMgPSBnc3VfZXh0LT5yYzsKKworICAg IC8qIENhbiBiZSBOVUxMLCB3aGVuIGNhbGxpbmcgdW5zZXQgYWZ0ZXIgdW50aWUgKi8KKyAgICBp ZiAocmMgJiYgbm9fZGF0YWJhc2VfYWN0aW9uID09IDApIHsKKyAgICAgICAgaW50IHVtbGVuID0g MDsKKyAgICAgICAgY2hhciAqdW1rZXkgPSB1bm1ldGFmeV96YWxsb2MocG0tPm5vZGUubmFtLCAm dW1sZW4pOworCisgICAgICAgIGtleSA9IHVta2V5OworICAgICAgICBrZXlfbGVuID0gdW1sZW47 CisKKyAgICAgICAgaWYgKHZhbCkgeworICAgICAgICAgICAgLyogVW5tZXRhZnkgd2l0aCBleGFj dCB6YWxsb2Mgc2l6ZSAqLworICAgICAgICAgICAgY2hhciAqdW12YWwgPSB1bm1ldGFmeV96YWxs b2ModmFsLCAmdW1sZW4pOworCisgICAgICAgICAgICAvKiBTdG9yZSAqLworICAgICAgICAgICAg Y29udGVudCA9IHVtdmFsOworICAgICAgICAgICAgY29udGVudF9sZW4gPSB1bWxlbjsKKyAgICAg ICAgICAgIHJlcGx5ID0gcmVkaXNDb21tYW5kKHJjLCAiU0VUICViICViIiwga2V5LCAoc2l6ZV90 KSBrZXlfbGVuLCBjb250ZW50LCAoc2l6ZV90KSBjb250ZW50X2xlbik7CisgICAgICAgICAgICBp ZiAocmVwbHkpCisgICAgICAgICAgICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsKKworICAg ICAgICAgICAgLyogRnJlZSAqLworICAgICAgICAgICAgc2V0X2xlbmd0aCh1bXZhbCwgY29udGVu dF9sZW4pOworICAgICAgICAgICAgenNmcmVlKHVtdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAg ICAgICAgICAgIHJlcGx5ID0gcmVkaXNDb21tYW5kKHJjLCAiREVMICViIiwga2V5LCAoc2l6ZV90 KSBrZXlfbGVuKTsKKyAgICAgICAgICAgIGlmIChyZXBseSkKKyAgICAgICAgICAgICAgICBmcmVl UmVwbHlPYmplY3QocmVwbHkpOworICAgICAgICB9CisKKyAgICAgICAgLyogRnJlZSBrZXkgKi8K KyAgICAgICAgc2V0X2xlbmd0aCh1bWtleSwga2V5X2xlbik7CisgICAgICAgIHpzZnJlZSh1bWtl eSk7CisKKyAgICAgICAgaWYgKCFyZXRyeSAmJiAocmMtPmVyciAmIChSRURJU19FUlJfSU8gfCBS RURJU19FUlJfRU9GKSkpIHsKKyAgICAgICAgICAgIHJldHJ5ID0gMTsKKyAgICAgICAgICAgIGlm KHJlY29ubmVjdCgmZ3N1X2V4dC0+cmMsIGdzdV9leHQtPnJlZGlzX2hvc3RfcG9ydCwgZ3N1X2V4 dC0+cGFzc3dvcmQpKQorICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgIH0gZWxz ZSBpZiAocmV0cnkgJiYgKHJjLT5lcnIgJiAoUkVESVNfRVJSX0lPIHwgUkVESVNfRVJSX0VPRikp KSB7CisgICAgICAgICAgICB6d2FybigiQWJvcnRpbmcgKG5vIGNvbm5lY3Rpb24pIik7CisgICAg ICAgIH0KKyAgICB9Cit9CisvKiB9fX0gKi8KKy8qIEZVTkNUSU9OOiByZWRpc191bnNldGZuIHt7 eyAqLworLyoqLworc3RhdGljIHZvaWQKK3JlZGlzX3Vuc2V0Zm4oUGFyYW0gcG0sIFVOVVNFRChp bnQgdW0pKQoreworICAgIC8qIFNldCB3aXRoIE5VTEwgKi8KKyAgICByZWRpc19zZXRmbihwbSwg TlVMTCk7Cit9CisvKiB9fX0gKi8KKworLyoqKioqKioqKioqKioqKioqIEhBU0ggKioqKioqKioq KioqKioqKioqLworCisvKiBGVU5DVElPTjogcmVkaXNfZ2V0X25vZGUge3t7ICovCisvKiovCitz dGF0aWMgSGFzaE5vZGUKK3JlZGlzX2dldF9ub2RlKEhhc2hUYWJsZSBodCwgY29uc3QgY2hhciAq bmFtZSkKK3sKKyAgICBIYXNoTm9kZSBobiA9IGdldGhhc2hub2RlMihodCwgbmFtZSk7CisgICAg UGFyYW0gdmFsX3BtID0gKFBhcmFtKSBobjsKKworICAgIC8qIEVudHJ5IGZvciBrZXkgZG9lc24n dCBleGlzdD8gQ3JlYXRlIGl0IG5vdywKKyAgICAgKiBpdCB3aWxsIGJlIGludGVyZmFjaW5nIGJl dHdlZW4gdGhlIGRhdGFiYXNlCisgICAgICogYW5kIFpzaCAtIHRocm91Z2ggc3BlY2lhbCBnc3Uu IFNvLCBhbnkgc2VlbgorICAgICAqIGtleSByZXN1bHRzIGluIG5ldyBpbnRlcmZhY2luZyBwYXJh bWV0ZXIuCisgICAgICoKKyAgICAgKiBBZGQgdGhlIFBhcmFtIHRvIGl0cyBoYXNoLCBpdCBpcyBu b3QgUE1fVVBUT0RBVEUuCisgICAgICogSXQgd2lsbCBiZSBsb2FkZWQgZnJvbSBkYXRhYmFzZSAq YW5kIGZpbGxlZCoKKyAgICAgKiBvciBsZWZ0IGluIHRoYXQgc3RhdGUgaWYgdGhlIGRhdGFiYXNl IGRvZXNuJ3QKKyAgICAgKiBjb250YWluIGl0LgorICAgICAqLworCisgICAgaWYgKCF2YWxfcG0p IHsKKyAgICAgICAgdmFsX3BtID0gKFBhcmFtKSB6c2hjYWxsb2Moc2l6ZW9mICgqdmFsX3BtKSk7 CisgICAgICAgIHZhbF9wbS0+bm9kZS5mbGFncyA9IFBNX1NDQUxBUiB8IFBNX0hBU0hFTEVNOyAv KiBubyBQTV9VUFRPREFURSAqLworICAgICAgICB2YWxfcG0tPmdzdS5zID0gKEdzdVNjYWxhcikg aHQtPnRtcGRhdGE7CisgICAgICAgIGh0LT5hZGRub2RlKGh0LCB6dHJkdXAobmFtZSksIHZhbF9w bSk7IC8vIHNldHMgcG0tPm5vZGUubmFtCisgICAgfQorCisgICAgcmV0dXJuIChIYXNoTm9kZSkg dmFsX3BtOworfQorLyogfX19ICovCisvKiBGVU5DVElPTjogc2Nhbl9rZXlzIHt7eyAqLworLyoq Lworc3RhdGljIHZvaWQKK3NjYW5fa2V5cyhIYXNoVGFibGUgaHQsIFNjYW5GdW5jIGZ1bmMsIGlu dCBmbGFncykKK3sKKyAgICBjaGFyICprZXk7CisgICAgc2l6ZV90IGtleV9sZW47CisgICAgcmVk aXNDb250ZXh0ICpyYzsKKyAgICByZWRpc1JlcGx5ICpyZXBseTsKKyAgICBzdHJ1Y3QgZ3N1X3Nj YWxhcl9leHQgKmdzdV9leHQ7CisKKyAgICBnc3VfZXh0ID0gKHN0cnVjdCBnc3Vfc2NhbGFyX2V4 dCAqKWh0LT50bXBkYXRhOworCisgICAgaW50IHJldHJ5ID0gMDsKKyByZXRyeToKKyAgICByYyA9 IGdzdV9leHQtPnJjOworCisgICAgaWYgKCFyYykKKyAgICAgICAgcmV0dXJuOworCisgICAgLyog SXRlcmF0ZSBrZXlzIGFkZGluZyB0aGVtIHRvIGhhc2gsIHNvCisgICAgICogd2UgaGF2ZSBQYXJh bSB0byB1c2UgaW4gYGZ1bmNgICovCisgICAgcmVwbHkgPSByZWRpc0NvbW1hbmQocmMsICJLRVlT ICoiKTsKKworICAgIC8qIERpc2Nvbm5lY3QgZGV0ZWN0aW9uICovCisgICAgaWYgKHJjLT5lcnIg JiAoUkVESVNfRVJSX0lPIHwgUkVESVNfRVJSX0VPRikpIHsKKyAgICAgICAgaWYgKHJlcGx5KQor ICAgICAgICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsKKyAgICAgICAgaWYgKHJldHJ5KSB7 CisgICAgICAgICAgICB6d2FybigiQWJvcnRpbmcgKG5vIGNvbm5lY3Rpb24pIik7CisgICAgICAg ICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmV0cnkgPSAxOworICAgICAgICBpZihy ZWNvbm5lY3QoJmdzdV9leHQtPnJjLCBnc3VfZXh0LT5yZWRpc19ob3N0X3BvcnQsIGdzdV9leHQt PnBhc3N3b3JkKSkKKyAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgIGVsc2UKKyAgICAg ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXJlcGx5IHx8IHJlcGx5LT50eXBlICE9 IFJFRElTX1JFUExZX0FSUkFZKSB7CisgICAgICAgIHp3YXJuKCJJbmNvcnJlY3QgcmVwbHkgZnJv bSByZWRpcyBjb21tYW5kIEtFWVMsIGFib3J0aW5nIik7CisgICAgICAgIGlmIChyZXBseSkKKyAg ICAgICAgICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7CisgICAgICAgIHJldHVybjsKKyAgICB9 CisKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlcGx5LT5lbGVtZW50czsgaisrKSB7Cisg ICAgICAgIHJlZGlzUmVwbHkgKmVudHJ5ID0gcmVwbHktPmVsZW1lbnRbal07CisgICAgICAgIGlm IChlbnRyeSA9PSBOVUxMIHx8IGVudHJ5LT50eXBlICE9IFJFRElTX1JFUExZX1NUUklORykgewor ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBrZXkgPSBlbnRyeS0+ c3RyOworICAgICAgICBrZXlfbGVuID0gZW50cnktPmxlbjsKKworICAgICAgICAvKiBPbmx5IHNj YW4gc3RyaW5nIGtleXMsIGlnbm9yZSB0aGUgcmVzdCAoaGFzaGVzLCBzZXRzLCBldGMuKSAqLwor ICAgICAgICBpZiAoUkRfVFlQRV9TVFJJTkcgIT0gdHlwZSgmZ3N1X2V4dC0+cmMsIGdzdV9leHQt PnJlZGlzX2hvc3RfcG9ydCwgZ3N1X2V4dC0+cGFzc3dvcmQsIGtleSwgKHNpemVfdCkga2V5X2xl bikpIHsKKyAgICAgICAgICAgIHJjID0gZ3N1X2V4dC0+cmM7CisgICAgICAgICAgICBjb250aW51 ZTsKKyAgICAgICAgfQorICAgICAgICByYyA9IGdzdV9leHQtPnJjOworCisgICAgICAgIC8qIFRo aXMgcmV0dXJucyBkYXRhYmFzZS1pbnRlcmZhY2luZyBQYXJhbSwKKyAgICAgICAgICogaXQgd2ls bCByZXR1cm4gdS5zdHIgb3IgZmlyc3QgZmV0Y2ggZGF0YQorICAgICAgICAgKiBpZiBub3QgUE1f VVBUT0RBVEUgKG5ld2x5IGNyZWF0ZWQpICovCisgICAgICAgIGNoYXIgKnprZXkgPSBtZXRhZnko a2V5LCBrZXlfbGVuLCBNRVRBX0RVUCk7CisgICAgICAgIEhhc2hOb2RlIGhuID0gcmVkaXNfZ2V0 X25vZGUoaHQsIHprZXkpOworICAgICAgICB6c2ZyZWUoemtleSk7CisKKyAgICAgICAgZnVuYyho biwgZmxhZ3MpOworICAgIH0KKworICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7Cit9CisvKiB9 fX0gKi8KKy8qIEZVTkNUSU9OOiByZWRpc19oYXNoX3NldGZuIHt7eyAqLworCisvKgorICogUmVw bGFjZSBkYXRhYmFzZSB3aXRoIG5ldyBoYXNoCisgKi8KKworLyoqLworc3RhdGljIHZvaWQKK3Jl ZGlzX2hhc2hfc2V0Zm4oUGFyYW0gcG0sIEhhc2hUYWJsZSBodCkKK3sKKyAgICBzaXplX3QgaSwg ajsKKyAgICBIYXNoTm9kZSBobjsKKyAgICBjaGFyICprZXksICpjb250ZW50OworICAgIHNpemVf dCBrZXlfbGVuLCBjb250ZW50X2xlbjsKKyAgICByZWRpc0NvbnRleHQgKnJjOworICAgIHJlZGlz UmVwbHkgKnJlcGx5LCAqZW50cnksICpyZXBseTI7CisgICAgc3RydWN0IGdzdV9zY2FsYXJfZXh0 ICpnc3VfZXh0OworCisgICAgaWYgKCFwbS0+dS5oYXNoIHx8IHBtLT51Lmhhc2ggPT0gaHQpCisg ICAgICAgIHJldHVybjsKKworICAgIGdzdV9leHQgPSAoc3RydWN0IGdzdV9zY2FsYXJfZXh0ICop cG0tPnUuaGFzaC0+dG1wZGF0YTsKKworICAgIGludCByZXRyeSA9IDA7CisgcmV0cnk6CisgICAg cmMgPSBnc3VfZXh0LT5yYzsKKworICAgIGlmICghcmMpCisgICAgICAgIHJldHVybjsKKworICAg IC8qIEtFWVMgKi8KKyAgICByZXBseSA9IHJlZGlzQ29tbWFuZChyYywgIktFWVMgKiIpOworICAg IGlmIChyZXBseSA9PSBOVUxMIHx8IHJlcGx5LT50eXBlICE9IFJFRElTX1JFUExZX0FSUkFZKSB7 CisgICAgICAgIGlmIChyZXBseSkKKyAgICAgICAgICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7 CisgICAgICAgIGdvdG8gZG9fcmV0cnk7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IHJl cGx5LT5lbGVtZW50czsgaisrKSB7CisgICAgICAgIGVudHJ5ID0gcmVwbHktPmVsZW1lbnRbal07 CisgICAgICAgIGlmIChlbnRyeSA9PSBOVUxMIHx8IGVudHJ5LT50eXBlICE9IFJFRElTX1JFUExZ X1NUUklORykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAga2V5 ID0gZW50cnktPnN0cjsKKyAgICAgICAga2V5X2xlbiA9IGVudHJ5LT5sZW47CisKKyAgICAgICAg LyogT25seSBzY2FuIHN0cmluZyBrZXlzLCBpZ25vcmUgdGhlIHJlc3QgKGhhc2hlcywgc2V0cywg ZXRjLikgKi8KKyAgICAgICAgaWYgKFJEX1RZUEVfU1RSSU5HICE9IHR5cGUoJmdzdV9leHQtPnJj LCBnc3VfZXh0LT5yZWRpc19ob3N0X3BvcnQsIGdzdV9leHQtPnBhc3N3b3JkLCBrZXksIChzaXpl X3QpIGtleV9sZW4pKSB7CisgICAgICAgICAgICByYyA9IGdzdV9leHQtPnJjOworICAgICAgICAg ICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBnc3VfZXh0LT5yYzsKKworICAg ICAgICBxdWV1ZV9zaWduYWxzKCk7CisKKyAgICAgICAgLyogREVMICovCisgICAgICAgIHJlcGx5 MiA9IHJlZGlzQ29tbWFuZChyYywgIkRFTCAlYiIsIGtleSwgKHNpemVfdCkga2V5X2xlbik7Cisg ICAgICAgIGlmIChyZXBseTIpIHsKKyAgICAgICAgICAgIGZyZWVSZXBseU9iamVjdChyZXBseTIp OworICAgICAgICAgICAgcmVwbHkyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmMt PmVyciAmIChSRURJU19FUlJfSU8gfCBSRURJU19FUlJfRU9GKSkKKyAgICAgICAgICAgIGJyZWFr OworCisgICAgICAgIHVucXVldWVfc2lnbmFscygpOworICAgIH0KKyAgICBmcmVlUmVwbHlPYmpl Y3QocmVwbHkpOworCisgZG9fcmV0cnk6CisgICAgaWYgKCFyZXRyeSAmJiAocmMtPmVyciAmIChS RURJU19FUlJfSU8gfCBSRURJU19FUlJfRU9GKSkpIHsKKyAgICAgICAgcmV0cnkgPSAxOworICAg ICAgICBpZihyZWNvbm5lY3QoJmdzdV9leHQtPnJjLCBnc3VfZXh0LT5yZWRpc19ob3N0X3BvcnQs IGdzdV9leHQtPnBhc3N3b3JkKSkKKyAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgIGVs c2UKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKHJldHJ5ICYmIChyYy0+ZXJy ICYgKFJFRElTX0VSUl9JTyB8IFJFRElTX0VSUl9FT0YpKSkgeworICAgICAgICB6d2FybigiQWJv cnRpbmcgKG5vIGNvbm5lY3Rpb24pIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBu b19kYXRhYmFzZV9hY3Rpb24gPSAxOworICAgIGVtcHR5aGFzaHRhYmxlKHBtLT51Lmhhc2gpOwor ICAgIG5vX2RhdGFiYXNlX2FjdGlvbiA9IDA7CisKKyAgICBpZiAoIWh0KQorICAgICAgICByZXR1 cm47CisKKyAgICAgLyogUHV0IG5ldyBzdHJpbmdzIGludG8gZGF0YWJhc2UsIGhhdmluZworICAg ICAgKiB0aGVpciBpbnRlcmZhY2luZy1QYXJhbXMgY3JlYXRlZCAqLworCisgICAgcmV0cnkgPSAw OworIHJldHJ5MjoKKyAgICByYyA9IGdzdV9leHQtPnJjOworCisgICAgZm9yIChpID0gMDsgaSA8 IGh0LT5oc2l6ZTsgaSsrKSB7CisgICAgICAgIGZvciAoaG4gPSBodC0+bm9kZXNbaV07IGhuOyBo biA9IGhuLT5uZXh0KSB7CisgICAgICAgICAgICBzdHJ1Y3QgdmFsdWUgdjsKKworICAgICAgICAg ICAgdi5pc2FyciA9IHYuZmxhZ3MgPSB2LnN0YXJ0ID0gMDsKKyAgICAgICAgICAgIHYuZW5kID0g LTE7CisgICAgICAgICAgICB2LmFyciA9IE5VTEw7CisgICAgICAgICAgICB2LnBtID0gKFBhcmFt KSBobjsKKworICAgICAgICAgICAgLyogVW5tZXRhZnkga2V5ICovCisgICAgICAgICAgICBpbnQg dW1sZW4gPSAwOworICAgICAgICAgICAgY2hhciAqdW1rZXkgPSB1bm1ldGFmeV96YWxsb2Modi5w bS0+bm9kZS5uYW0sICZ1bWxlbik7CisKKyAgICAgICAgICAgIGtleSA9IHVta2V5OworICAgICAg ICAgICAga2V5X2xlbiA9IHVtbGVuOworCisgICAgICAgICAgICBxdWV1ZV9zaWduYWxzKCk7CisK KyAgICAgICAgICAgIC8qIFVubWV0YWZ5IGRhdGEgKi8KKyAgICAgICAgICAgIGNoYXIgKnVtdmFs ID0gdW5tZXRhZnlfemFsbG9jKGdldHN0cnZhbHVlKCZ2KSwgJnVtbGVuKTsKKworICAgICAgICAg ICAgY29udGVudCA9IHVtdmFsOworICAgICAgICAgICAgY29udGVudF9sZW4gPSB1bWxlbjsKKwor ICAgICAgICAgICAgLyogU0VUICovCisgICAgICAgICAgICByZXBseSA9IHJlZGlzQ29tbWFuZChy YywgIlNFVCAlYiAlYiIsIGtleSwgKHNpemVfdCkga2V5X2xlbiwgY29udGVudCwgKHNpemVfdCkg Y29udGVudF9sZW4pOworICAgICAgICAgICAgaWYgKHJlcGx5KQorICAgICAgICAgICAgICAgIGZy ZWVSZXBseU9iamVjdChyZXBseSk7CisKKyAgICAgICAgICAgIC8qIEZyZWUsIHJlc3RvcmluZyBv cmlnaW5hbCBsZW5ndGggKi8KKyAgICAgICAgICAgIHNldF9sZW5ndGgodW12YWwsIGNvbnRlbnRf bGVuKTsKKyAgICAgICAgICAgIHpzZnJlZSh1bXZhbCk7CisgICAgICAgICAgICBzZXRfbGVuZ3Ro KHVta2V5LCBrZXlfbGVuKTsKKyAgICAgICAgICAgIHpzZnJlZSh1bWtleSk7CisKKyAgICAgICAg ICAgIHVucXVldWVfc2lnbmFscygpOworICAgICAgICB9CisKKyAgICAgICAgLyogRGlzY29ubmVj dCBkZXRlY3Rpb24gKi8KKyAgICAgICAgaWYgKCFyZXRyeSAmJiAocmMtPmVyciAmIChSRURJU19F UlJfSU8gfCBSRURJU19FUlJfRU9GKSkpIHsKKyAgICAgICAgICAgIHJldHJ5ID0gMTsKKyAgICAg ICAgICAgIGlmKHJlY29ubmVjdCgmZ3N1X2V4dC0+cmMsIGdzdV9leHQtPnJlZGlzX2hvc3RfcG9y dCwgZ3N1X2V4dC0+cGFzc3dvcmQpKQorICAgICAgICAgICAgICAgIGdvdG8gcmV0cnkyOworICAg ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlm IChyZXRyeSAmJiAocmMtPmVyciAmIChSRURJU19FUlJfSU8gfCBSRURJU19FUlJfRU9GKSkpIHsK KyAgICAgICAgICAgIHp3YXJuKCJBYm9ydGluZyAobm8gY29ubmVjdGlvbikiKTsKKyAgICAgICAg ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046 IHJlZGlzX2hhc2hfdW5zZXRmbiB7e3sgKi8KKy8qKi8KK3N0YXRpYyB2b2lkCityZWRpc19oYXNo X3Vuc2V0Zm4oUGFyYW0gcG0sIFVOVVNFRChpbnQgZXhwKSkKK3sKKyAgICAvKiBUaGlzIHdpbGwg bWFrZSBkYXRhYmFzZSBjb250ZW50cyBzdXJ2aXZlIHRoZQorICAgICAqIHVuc2V0LCBhcyBzdGFu ZGFyZCBHU1Ugd2lsbCBiZSBwdXQgaW4gcGxhY2UgKi8KKyAgICByZWRpc19oYXNoX3VudGllKHBt KTsKKworICAgIC8qIFJlbWVtYmVyIGN1c3RvbSBHU1Ugc3RydWN0dXJlIGFzc2lnbmVkIHRvCisg ICAgICogdS5oYXNoLT50bXBkYXRhIGJlZm9yZSBoYXNoIGdldHMgZGVsZXRlZCAqLworICAgIHN0 cnVjdCBnc3Vfc2NhbGFyX2V4dCAqIGdzdV9leHQgPSBwbS0+dS5oYXNoLT50bXBkYXRhOworCisg ICAgLyogVXNlcyBub3JtYWwgdW5zZXR0ZXIuIFdpbGwgZGVsZXRlIGFsbCBvd25lZAorICAgICAq IHBhcmFtZXRlcnMgYW5kIGFsc28gaGFzaHRhYmxlLiAqLworICAgIHBtLT5nc3UuaC0+c2V0Zm4o cG0sIE5VTEwpOworCisgICAgLyogRG9uJ3QgbmVlZCBjdXN0b20gR1NVIHN0cnVjdHVyZSB3aXRo IGl0cworICAgICAqIHJlZGlzQ29udGV4dCBwb2ludGVyIGFueW1vcmUgKi8KKyAgICB6c2ZyZWUo Z3N1X2V4dC0+cmVkaXNfaG9zdF9wb3J0KTsKKyAgICBpZiAoZ3N1X2V4dC0+cGFzc3dvcmQpCisg ICAgICAgIHpzZnJlZShnc3VfZXh0LT5wYXNzd29yZCk7CisgICAgemZyZWUoZ3N1X2V4dCwgc2l6 ZW9mKHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCkpOworCisgICAgcG0tPm5vZGUuZmxhZ3MgfD0gUE1f VU5TRVQ7Cit9CisvKiB9fX0gKi8KKy8qIEZVTkNUSU9OOiByZWRpc19oYXNoX3VudGllIHt7eyAq LworLyoqLworc3RhdGljIHZvaWQKK3JlZGlzX2hhc2hfdW50aWUoUGFyYW0gcG0pCit7CisgICAg cmVkaXNDb250ZXh0ICpyYyA9ICgoc3RydWN0IGdzdV9zY2FsYXJfZXh0ICopcG0tPnUuaGFzaC0+ dG1wZGF0YSktPnJjOworICAgIEhhc2hUYWJsZSBodCA9IHBtLT51Lmhhc2g7CisKKyAgICBpZiAo cmMpIHsgLyogcGFyYW5vaWEgKi8KKyAgICAgICAgcmVkaXNGcmVlKHJjKTsKKworICAgICAgICAv KiBMZXQgaGFzaCBmaWVsZHMga25vdyB0aGVyZSdzIG5vIGJhY2tlbmQgKi8KKyAgICAgICAgKChz dHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKilodC0+dG1wZGF0YSktPnJjID0gTlVMTDsKKworICAgICAg ICAvKiBSZW1vdmUgZnJvbSBsaXN0IG9mIHRpZWQgcGFyYW1ldGVycyAqLworICAgICAgICByZW1v dmVfdGllZF9uYW1lKHBtLT5ub2RlLm5hbSk7CisgICAgfQorCisgICAgLyogZm9yIGNvbXBsZXRl bmVzcyAuLi4gY3JlYXRlc3BlY2lhbGhhc2goKSBzaG91bGQgaGF2ZSBhbiBpbnZlcnNlICovCisg ICAgaHQtPmdldG5vZGUgPSBodC0+Z2V0bm9kZTIgPSBnZXRoYXNobm9kZTI7CisgICAgaHQtPnNj YW50YWIgPSBOVUxMOworCisgICAgcG0tPm5vZGUuZmxhZ3MgJj0gfihQTV9TUEVDSUFMfFBNX1JF QURPTkxZKTsKKyAgICBwbS0+Z3N1LmggPSAmc3RkaGFzaF9nc3U7Cit9CisvKiB9fX0gKi8KKwor LyoqKioqKioqKioqKioqKiogU1RSSU5HICoqKioqKioqKioqKioqKioqLworCisvKiBGVU5DVElP TjogcmVkaXNfc3RyX2dldGZuIHt7eyAqLworLyoqLworc3RhdGljIGNoYXIgKgorcmVkaXNfc3Ry X2dldGZuKFBhcmFtIHBtKQoreworICAgIHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCAqZ3N1X2V4dDsK KyAgICBjaGFyICprZXk7CisgICAgc2l6ZV90IGtleV9sZW47CisgICAgcmVkaXNDb250ZXh0ICpy YzsKKyAgICByZWRpc1JlcGx5ICpyZXBseTsKKworICAgIGdzdV9leHQgPSAoc3RydWN0IGdzdV9z Y2FsYXJfZXh0ICopIHBtLT5nc3UuczsKKyAgICAvKiBLZXkgYWxyZWFkeSByZXRyaWV2ZWQ/ICov CisgICAgaWYgKChwbS0+bm9kZS5mbGFncyAmIFBNX1VQVE9EQVRFKSAmJiBnc3VfZXh0LT51c2Vf Y2FjaGUpIHsKKyAgICAgICAgcmV0dXJuIHBtLT51LnN0ciA/IHBtLT51LnN0ciA6IChjaGFyICop IGhjYWxsb2MoMSk7CisgICAgfQorCisgICAga2V5ID0gZ3N1X2V4dC0+a2V5OworICAgIGtleV9s ZW4gPSBnc3VfZXh0LT5rZXlfbGVuOworCisgICAgaW50IHJldHJ5ID0gMDsKKyByZXRyeToKKyAg ICByYyA9IGdzdV9leHQtPnJjOworCisgICAgcmVwbHkgPSByZWRpc0NvbW1hbmQocmMsICJFWElT VFMgJWIiLCBrZXksIChzaXplX3QpIGtleV9sZW4pOworICAgIGlmIChyZXBseSAmJiByZXBseS0+ dHlwZSA9PSBSRURJU19SRVBMWV9JTlRFR0VSICYmIHJlcGx5LT5pbnRlZ2VyID09IDEpIHsKKyAg ICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsKKworICAgICAgICByZXBseSA9IHJlZGlzQ29t bWFuZChyYywgIkdFVCAlYiIsIGtleSwgKHNpemVfdCkga2V5X2xlbik7CisgICAgICAgIGlmIChy ZXBseSAmJiByZXBseS0+dHlwZSA9PSBSRURJU19SRVBMWV9TVFJJTkcpIHsKKyAgICAgICAgICAg IC8qIFdlIGhhdmUgZGF0YSDigJMgc3RvcmUgaXQgYW5kIHJldHVybiBpdCAqLworICAgICAgICAg ICAgcG0tPm5vZGUuZmxhZ3MgfD0gUE1fVVBUT0RBVEU7CisKKyAgICAgICAgICAgIC8qIEVuc3Vy ZSB0aGVyZSdzIG5vIGxlYWsgKi8KKyAgICAgICAgICAgIGlmIChwbS0+dS5zdHIpIHsKKyAgICAg ICAgICAgICAgICB6c2ZyZWUocG0tPnUuc3RyKTsKKyAgICAgICAgICAgICAgICBwbS0+dS5zdHIg PSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBNZXRhZnkgcmV0dXJuZWQg ZGF0YS4gQWxsIGZpdHMgLSBtZXRhZnkKKyAgICAgICAgICAgICAqIGNhbiBvYnRhaW4gZGF0YSBs ZW5ndGggdG8gYXZvaWQgdXNpbmcgXDAgKi8KKyAgICAgICAgICAgIHBtLT51LnN0ciA9IG1ldGFm eShyZXBseS0+c3RyLCByZXBseS0+bGVuLCBNRVRBX0RVUCk7CisgICAgICAgICAgICBmcmVlUmVw bHlPYmplY3QocmVwbHkpOworCisgICAgICAgICAgICAvKiBDYW4gcmV0dXJuIHBvaW50ZXIsIGNv cnJlY3RseSBzYXZlZCBpbnNpZGUgUGFyYW0gKi8KKyAgICAgICAgICAgIHJldHVybiBwbS0+dS5z dHI7CisgICAgICAgIH0gZWxzZSBpZiAocmVwbHkpIHsKKyAgICAgICAgICAgIGZyZWVSZXBseU9i amVjdChyZXBseSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJlcGx5KSB7CisgICAgICAg IGZyZWVSZXBseU9iamVjdChyZXBseSk7CisgICAgfQorCisgICAgaWYgKCFyZXRyeSAmJiAocmMt PmVyciAmIChSRURJU19FUlJfSU8gfCBSRURJU19FUlJfRU9GKSkpIHsKKyAgICAgICAgcmV0cnkg PSAxOworICAgICAgICBpZihyZWNvbm5lY3QoJmdzdV9leHQtPnJjLCBnc3VfZXh0LT5yZWRpc19o b3N0X3BvcnQsIGdzdV9leHQtPnBhc3N3b3JkKSkKKyAgICAgICAgICAgIGdvdG8gcmV0cnk7Cisg ICAgfSBlbHNlIGlmIChyZXRyeSAmJiAocmMtPmVyciAmIChSRURJU19FUlJfSU8gfCBSRURJU19F UlJfRU9GKSkpIHsKKyAgICAgICAgendhcm4oIkFib3J0aW5nIChubyBjb25uZWN0aW9uKSIpOwor ICAgIH0KKworICAgIHJldHVybiAiIjsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHJlZGlz X3N0cl9zZXRmbiB7e3sgKi8KKy8qKi8KK3N0YXRpYyB2b2lkCityZWRpc19zdHJfc2V0Zm4oUGFy YW0gcG0sIGNoYXIgKnZhbCkKK3sKKyAgICBjaGFyICprZXksICpjb250ZW50OworICAgIHNpemVf dCBrZXlfbGVuLCBjb250ZW50X2xlbjsKKyAgICByZWRpc0NvbnRleHQgKnJjOworICAgIHJlZGlz UmVwbHkgKnJlcGx5OworCisgICAgLyogU2V0IGlzIGRvbmUgb24gcGFyYW1ldGVyIGFuZCBvbiBk YXRhYmFzZS4gKi8KKworICAgIC8qIFBhcmFtZXRlciAqLworICAgIGlmIChwbS0+dS5zdHIpIHsK KyAgICAgICAgenNmcmVlKHBtLT51LnN0cik7CisgICAgICAgIHBtLT51LnN0ciA9IE5VTEw7Cisg ICAgICAgIHBtLT5ub2RlLmZsYWdzICY9IH4oUE1fVVBUT0RBVEUpOworICAgIH0KKworICAgIGlm ICh2YWwpIHsKKyAgICAgICAgcG0tPnUuc3RyID0genRyZHVwKHZhbCk7CisgICAgICAgIHBtLT5u b2RlLmZsYWdzIHw9IFBNX1VQVE9EQVRFOworICAgIH0KKworICAgIC8qIERhdGFiYXNlICovCisg ICAgc3RydWN0IGdzdV9zY2FsYXJfZXh0ICpnc3VfZXh0ID0gKHN0cnVjdCBnc3Vfc2NhbGFyX2V4 dCAqKSBwbS0+Z3N1LnM7CisgICAga2V5ID0gZ3N1X2V4dC0+a2V5OworICAgIGtleV9sZW4gPSBn c3VfZXh0LT5rZXlfbGVuOworCisgICAgaW50IHJldHJ5ID0gMDsKKyByZXRyeToKKyAgICByYyA9 IGdzdV9leHQtPnJjOworCisgICAgaWYgKHJjKSB7CisgICAgICAgIGlmICh2YWwpIHsKKyAgICAg ICAgICAgIC8qIFVubWV0YWZ5IHdpdGggZXhhY3QgemFsbG9jIHNpemUgKi8KKyAgICAgICAgICAg IGludCB1bWxlbiA9IDA7CisgICAgICAgICAgICBjaGFyICp1bXZhbCA9IHVubWV0YWZ5X3phbGxv Yyh2YWwsICZ1bWxlbik7CisKKyAgICAgICAgICAgIC8qIFN0b3JlICovCisgICAgICAgICAgICBj b250ZW50ID0gdW12YWw7CisgICAgICAgICAgICBjb250ZW50X2xlbiA9IHVtbGVuOworICAgICAg ICAgICAgcmVwbHkgPSByZWRpc0NvbW1hbmQocmMsICJTRVQgJWIgJWIiLCBrZXksIChzaXplX3Qp IGtleV9sZW4sIGNvbnRlbnQsIChzaXplX3QpIGNvbnRlbnRfbGVuKTsKKyAgICAgICAgICAgIGlm IChyZXBseSkKKyAgICAgICAgICAgICAgICBmcmVlUmVwbHlPYmplY3QocmVwbHkpOworCisgICAg ICAgICAgICAvKiBGcmVlICovCisgICAgICAgICAgICBzZXRfbGVuZ3RoKHVtdmFsLCBjb250ZW50 X2xlbik7CisgICAgICAgICAgICB6c2ZyZWUodW12YWwpOworICAgICAgICB9IGVsc2UgeworICAg ICAgICAgICAgcmVwbHkgPSByZWRpc0NvbW1hbmQocmMsICJERUwgJWIiLCBrZXksIChzaXplX3Qp IGtleV9sZW4pOworICAgICAgICAgICAgaWYgKHJlcGx5KQorICAgICAgICAgICAgICAgIGZyZWVS ZXBseU9iamVjdChyZXBseSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJldHJ5ICYmIChy Yy0+ZXJyICYgKFJFRElTX0VSUl9JTyB8IFJFRElTX0VSUl9FT0YpKSkgeworICAgICAgICAgICAg cmV0cnkgPSAxOworICAgICAgICAgICAgaWYocmVjb25uZWN0KCZnc3VfZXh0LT5yYywgZ3N1X2V4 dC0+cmVkaXNfaG9zdF9wb3J0LCBnc3VfZXh0LT5wYXNzd29yZCkpCisgICAgICAgICAgICAgICAg Z290byByZXRyeTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXRyeSAmJiAocmMtPmVyciAmIChSRURJ U19FUlJfSU8gfCBSRURJU19FUlJfRU9GKSkpIHsKKyAgICAgICAgICAgIHp3YXJuKCJBYm9ydGlu ZyAobm8gY29ubmVjdGlvbikiKTsKKyAgICAgICAgfQorICAgIH0KK30KKy8qIH19fSAqLworLyog RlVOQ1RJT046IHJlZGlzX3N0cl91bnNldGZuIHt7eyAqLworLyoqLworc3RhdGljIHZvaWQKK3Jl ZGlzX3N0cl91bnNldGZuKFBhcmFtIHBtLCBVTlVTRUQoaW50IHVtKSkKK3sKKyAgICAvKiBXaWxs IGNsZWFyIHRoZSBkYXRhYmFzZSAqLworICAgIHJlZGlzX3N0cl9zZXRmbihwbSwgTlVMTCk7CisK KyAgICAvKiBXaWxsIGRldGFjaCBmcm9tIGRhdGFiYXNlIGFuZCBmcmVlIGN1c3RvbSBtZW1vcnkg Ki8KKyAgICByZWRpc19zdHJfdW50aWUocG0pOworCisgICAgcG0tPm5vZGUuZmxhZ3MgfD0gUE1f VU5TRVQ7Cit9CisvKiB9fX0gKi8KKy8qIEZVTkNUSU9OOiByZWRpc19zdHJfdW50aWUge3t7ICov CisvKiovCitzdGF0aWMgdm9pZAorcmVkaXNfc3RyX3VudGllKFBhcmFtIHBtKQoreworICAgIHN0 cnVjdCBnc3Vfc2NhbGFyX2V4dCAqZ3N1X2V4dCA9IChzdHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKikg cG0tPmdzdS5zOworCisgICAgaWYgKGdzdV9leHQtPnJjKSAvKiBwYXJhbm9pYSAqLworICAgICAg ICByZWRpc0ZyZWUoZ3N1X2V4dC0+cmMpOworCisgICAgLyogUmVtb3ZlIGZyb20gbGlzdCBvZiB0 aWVkIHBhcmFtZXRlcnMgKi8KKyAgICByZW1vdmVfdGllZF9uYW1lKHBtLT5ub2RlLm5hbSk7CisK KyAgICBwbS0+bm9kZS5mbGFncyAmPSB+KFBNX1NQRUNJQUx8UE1fUkVBRE9OTFkpOworICAgIHBt LT5nc3UucyA9ICZzdGRzY2FsYXJfZ3N1OworCisgICAgLyogRnJlZSBnc3VfZXh0ICovCisgICAg enNmcmVlKGdzdV9leHQtPnJlZGlzX2hvc3RfcG9ydCk7CisgICAgaWYgKGdzdV9leHQtPnBhc3N3 b3JkKQorICAgICAgICB6c2ZyZWUoZ3N1X2V4dC0+cGFzc3dvcmQpOworICAgIHpzZnJlZShnc3Vf ZXh0LT5rZXkpOworICAgIHpmcmVlKGdzdV9leHQsIHNpemVvZihzdHJ1Y3QgZ3N1X3NjYWxhcl9l eHQpKTsKK30KKy8qIH19fSAqLworCisvKioqKioqKioqKioqKioqKioqIFNFVCAqKioqKioqKioq KioqKioqKiovCisKKy8qIEZVTkNUSU9OOiByZWRpc19hcnJzZXRfZ2V0Zm4ge3t7ICovCisKKy8q Ki8KK2NoYXIgKioKK3JlZGlzX2FycnNldF9nZXRmbihQYXJhbSBwbSkKK3sKKyAgICBzdHJ1Y3Qg Z3N1X2FycmF5X2V4dCAqZ3N1X2V4dDsKKyAgICBjaGFyICprZXk7CisgICAgc2l6ZV90IGtleV9s ZW47CisgICAgcmVkaXNDb250ZXh0ICpyYzsKKyAgICByZWRpc1JlcGx5ICpyZXBseTsKKyAgICBp bnQgajsKKworICAgIGdzdV9leHQgPSAoc3RydWN0IGdzdV9hcnJheV9leHQgKikgcG0tPmdzdS5h OworICAgIC8qIEtleSBhbHJlYWR5IHJldHJpZXZlZD8gKi8KKyAgICBpZiAoKHBtLT5ub2RlLmZs YWdzICYgUE1fVVBUT0RBVEUpICYmIGdzdV9leHQtPnVzZV9jYWNoZSkgeworICAgICAgICByZXR1 cm4gcG0tPnUuYXJyID8gcG0tPnUuYXJyIDogJm15X251bGxhcnJheTsKKyAgICB9CisKKyAgICBr ZXkgPSBnc3VfZXh0LT5rZXk7CisgICAga2V5X2xlbiA9IGdzdV9leHQtPmtleV9sZW47CisKKyAg ICBpbnQgcmV0cnkgPSAwOworIHJldHJ5OgorICAgIHJjID0gZ3N1X2V4dC0+cmM7CisKKyAgICBp ZiAoIXJjKQorICAgICAgICByZXR1cm4gJm15X251bGxhcnJheTsKKworICAgIHJlcGx5ID0gcmVk aXNDb21tYW5kKHJjLCAiRVhJU1RTICViIiwga2V5LCAoc2l6ZV90KSBrZXlfbGVuKTsKKyAgICBp ZiAocmVwbHkgJiYgcmVwbHktPnR5cGUgPT0gUkVESVNfUkVQTFlfSU5URUdFUiAmJiByZXBseS0+ aW50ZWdlciA9PSAxKSB7CisgICAgICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7CisgICAgICAg IHJlcGx5ID0gTlVMTDsKKworICAgICAgICByZXBseSA9IHJlZGlzQ29tbWFuZChyYywgIlNNRU1C RVJTICViIiwga2V5LCAoc2l6ZV90KSBrZXlfbGVuKTsKKyAgICAgICAgaWYgKHJlcGx5ICYmIHJl cGx5LT50eXBlID09IFJFRElTX1JFUExZX0FSUkFZKSB7CisgICAgICAgICAgICAvKiBXZSBoYXZl IGRhdGEg4oCTIHN0b3JlIGl0IGFuZCByZXR1cm4gaXQgKi8KKyAgICAgICAgICAgIHBtLT5ub2Rl LmZsYWdzIHw9IFBNX1VQVE9EQVRFOworCisgICAgICAgICAgICAvKiBFbnN1cmUgdGhlcmUncyBu byBsZWFrICovCisgICAgICAgICAgICBpZiAocG0tPnUuYXJyKSB7CisgICAgICAgICAgICAgICAg ZnJlZWFycmF5KHBtLT51LmFycik7CisgICAgICAgICAgICAgICAgcG0tPnUuYXJyID0gTlVMTDsK KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG0tPnUuYXJyID0gemFsbG9jKChyZXBseS0+ ZWxlbWVudHMgKyAxKSAqIHNpemVvZihjaGFyKikpOworCisgICAgICAgICAgICBmb3IgKGogPSAw OyBqIDwgcmVwbHktPmVsZW1lbnRzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCA9 PSByZXBseS0+ZWxlbWVudFtqXSkgeworICAgICAgICAgICAgICAgICAgICBwbS0+dS5hcnJbal0g PSB6dHJkdXAoIiIpOworICAgICAgICAgICAgICAgICAgICB6d2FybigiRXJyb3IgMTAgd2hlbiBm ZXRjaGluZyBzZXQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cisg ICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXBseS0+ZWxlbWVudFtqXS0+dHlwZSAhPSBSRURJ U19SRVBMWV9TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgcG0tPnUuYXJyW2pdID0genRy ZHVwKCIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gcmVwbHktPmVsZW1lbnRb al0tPnN0ciAmJiByZXBseS0+ZWxlbWVudFtqXS0+bGVuID4gMCkgeworICAgICAgICAgICAgICAg ICAgICAgICAgendhcm4oIkVycm9yIDExIHdoZW4gZmV0Y2hpbmcgc2V0IGVsZW1lbnRzIChtZXNz YWdlOiAlcykiLCByZXBseS0+ZWxlbWVudFtqXS0+c3RyKTsKKyAgICAgICAgICAgICAgICAgICAg fSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHp3YXJuKCJFcnJvciAxMSB3aGVuIGZl dGNoaW5nIHNldCBlbGVtZW50cyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAv KiBNZXRhZnkgcmV0dXJuZWQgZGF0YS4gQWxsIGZpdHMgLSBtZXRhZnkKKyAgICAgICAgICAgICAg ICAgKiBjYW4gb2J0YWluIGRhdGEgbGVuZ3RoIHRvIGF2b2lkIHVzaW5nIFwwICovCisgICAgICAg ICAgICAgICAgcG0tPnUuYXJyW2pdID0gbWV0YWZ5KHJlcGx5LT5lbGVtZW50W2pdLT5zdHIsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LT5lbGVtZW50W2pdLT5s ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FVEFfRFVQKTsKKyAg ICAgICAgICAgIH0KKyAgICAgICAgICAgIHBtLT51LmFycltyZXBseS0+ZWxlbWVudHNdID0gTlVM TDsKKworICAgICAgICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsKKyAgICAgICAgICAgIHJl cGx5ID0gTlVMTDsKKworICAgICAgICAgICAgLyogQ2FuIHJldHVybiBwb2ludGVyLCBjb3JyZWN0 bHkgc2F2ZWQgaW5zaWRlIFBhcmFtICovCisgICAgICAgICAgICByZXR1cm4gcG0tPnUuYXJyOwor ICAgICAgICB9IGVsc2UgaWYgKHJlcGx5KSB7CisgICAgICAgICAgICBmcmVlUmVwbHlPYmplY3Qo cmVwbHkpOworICAgICAgICAgICAgcmVwbHkgPSBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNl IGlmIChyZXBseSkgeworICAgICAgICBmcmVlUmVwbHlPYmplY3QocmVwbHkpOworICAgICAgICBy ZXBseSA9IE5VTEw7CisgICAgfQorCisgICAgLyogRGlzY29ubmVjdCBkZXRlY3Rpb24gKi8KKyAg ICBpZiAocmMtPmVyciAmIChSRURJU19FUlJfSU8gfCBSRURJU19FUlJfRU9GKSkgeworICAgICAg ICBpZiAocmVwbHkpIHsKKyAgICAgICAgICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7CisgICAg ICAgICAgICByZXBseSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldHJ5KSB7Cisg ICAgICAgICAgICB6d2FybigiQWJvcnRpbmcgKG5vIGNvbm5lY3Rpb24pIik7CisgICAgICAgICAg ICByZXR1cm4gJm15X251bGxhcnJheTsKKyAgICAgICAgfQorICAgICAgICByZXRyeSA9IDE7Cisg ICAgICAgIGlmKHJlY29ubmVjdCgmZ3N1X2V4dC0+cmMsIGdzdV9leHQtPnJlZGlzX2hvc3RfcG9y dCwgZ3N1X2V4dC0+cGFzc3dvcmQpKQorICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisK KyAgICAvKiBBcnJheSB3aXRoIDAgZWxlbWVudHMgKi8KKyAgICByZXR1cm4gJm15X251bGxhcnJh eTsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHJlZGlzX2FycnNldF9zZXRmbiB7e3sgKi8K Ky8qKi8KK21vZF9leHBvcnQgdm9pZAorcmVkaXNfYXJyc2V0X3NldGZuKFBhcmFtIHBtLCBjaGFy ICoqdmFsKQoreworICAgIGNoYXIgKmtleSwgKmNvbnRlbnQ7CisgICAgc2l6ZV90IGtleV9sZW4s IGNvbnRlbnRfbGVuOworICAgIGludCBhbGVuID0gMCwgajsKKyAgICByZWRpc0NvbnRleHQgKnJj OworICAgIHJlZGlzUmVwbHkgKnJlcGx5OworCisgICAgLyogU2V0IGlzIGRvbmUgb24gcGFyYW1l dGVyIGFuZCBvbiBkYXRhYmFzZS4gKi8KKworICAgIC8qIFBhcmFtZXRlciAqLworICAgIGlmIChw bS0+dS5hcnIgJiYgcG0tPnUuYXJyICE9IHZhbCkgeworICAgICAgICBmcmVlYXJyYXkocG0tPnUu YXJyKTsKKyAgICAgICAgcG0tPnUuYXJyID0gTlVMTDsKKyAgICAgICAgcG0tPm5vZGUuZmxhZ3Mg Jj0gfihQTV9VUFRPREFURSk7CisgICAgfQorCisgICAgaWYgKHZhbCkgeworICAgICAgICB1bmlx YXJyYXkodmFsKTsKKyAgICAgICAgYWxlbiA9IGFycmxlbih2YWwpOworICAgICAgICBwbS0+dS5h cnIgPSB2YWw7CisgICAgICAgIHBtLT5ub2RlLmZsYWdzIHw9IFBNX1VQVE9EQVRFOworICAgIH0K KworICAgIC8qIERhdGFiYXNlICovCisgICAgc3RydWN0IGdzdV9hcnJheV9leHQgKmdzdV9leHQg PSAoc3RydWN0IGdzdV9hcnJheV9leHQgKikgcG0tPmdzdS5hOworICAgIHJjID0gZ3N1X2V4dC0+ cmM7CisgICAga2V5ID0gZ3N1X2V4dC0+a2V5OworICAgIGtleV9sZW4gPSBnc3VfZXh0LT5rZXlf bGVuOworCisgICAgaWYgKHJjKSB7CisKKyAgICAgICAgaW50IHJldHJ5ID0gMDsKKyAgICByZXRy eToKKyAgICAgICAgcmMgPSBnc3VfZXh0LT5yYzsKKworICAgICAgICBpZiAoIXJjKQorICAgICAg ICAgICAgcmV0dXJuOworCisgICAgICAgIHJlcGx5ID0gcmVkaXNDb21tYW5kKHJjLCAiREVMICVi Iiwga2V5LCAoc2l6ZV90KSBrZXlfbGVuKTsKKyAgICAgICAgaWYgKHJlcGx5KSB7CisgICAgICAg ICAgICBmcmVlUmVwbHlPYmplY3QocmVwbHkpOworICAgICAgICAgICAgcmVwbHkgPSBOVUxMOwor ICAgICAgICB9CisKKyAgICAgICAgLyogRGlzY29ubmVjdCBkZXRlY3Rpb24gKi8KKyAgICAgICAg aWYgKHJjLT5lcnIgJiAoUkVESVNfRVJSX0lPIHwgUkVESVNfRVJSX0VPRikpIHsKKyAgICAgICAg ICAgIGlmIChyZXRyeSkgeworICAgICAgICAgICAgICAgIHp3YXJuKCJBYm9ydGluZyAobm8gY29u bmVjdGlvbikiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAg ICAgICAgICByZXRyeSA9IDE7CisgICAgICAgICAgICBpZihyZWNvbm5lY3QoJmdzdV9leHQtPnJj LCBnc3VfZXh0LT5yZWRpc19ob3N0X3BvcnQsIGdzdV9leHQtPnBhc3N3b3JkKSkKKyAgICAgICAg ICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJl dHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWwpIHsKKyAgICAgICAgICAgIGZvciAo aj0wOyBqPGFsZW47IGogKyspIHsKKyAgICAgICAgICAgICAgICAvKiBVbm1ldGFmeSB3aXRoIGV4 YWN0IHphbGxvYyBzaXplICovCisgICAgICAgICAgICAgICAgaW50IHVtbGVuID0gMDsKKyAgICAg ICAgICAgICAgICBjaGFyICp1bXZhbCA9IHVubWV0YWZ5X3phbGxvYyh2YWxbal0sICZ1bWxlbik7 CisKKyAgICAgICAgICAgICAgICAvKiBTdG9yZSAqLworICAgICAgICAgICAgICAgIGNvbnRlbnQg PSB1bXZhbDsKKyAgICAgICAgICAgICAgICBjb250ZW50X2xlbiA9IHVtbGVuOworICAgICAgICAg ICAgICAgIHJlcGx5ID0gcmVkaXNDb21tYW5kKHJjLCAiU0FERCAlYiAlYiIsIGtleSwgKHNpemVf dCkga2V5X2xlbiwgY29udGVudCwgKHNpemVfdCkgY29udGVudF9sZW4pOworICAgICAgICAgICAg ICAgIGlmIChyZXBseSkgeworICAgICAgICAgICAgICAgICAgICBmcmVlUmVwbHlPYmplY3QocmVw bHkpOworICAgICAgICAgICAgICAgICAgICByZXBseSA9IE5VTEw7CisgICAgICAgICAgICAgICAg fQorICAgICAgICAgICAgICAgIGlmIChyYy0+ZXJyICYgKFJFRElTX0VSUl9JTyB8IFJFRElTX0VS Ul9FT0YpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0K KworICAgICAgICAgICAgICAgIC8qIEZyZWUgKi8KKyAgICAgICAgICAgICAgICBzZXRfbGVuZ3Ro KHVtdmFsLCB1bWxlbik7CisgICAgICAgICAgICAgICAgenNmcmVlKHVtdmFsKTsKKyAgICAgICAg ICAgIH0KKworICAgICAgICAgICAgLyogRGlzY29ubmVjdCBkZXRlY3Rpb24gKi8KKyAgICAgICAg ICAgIGlmIChyYy0+ZXJyICYgKFJFRElTX0VSUl9JTyB8IFJFRElTX0VSUl9FT0YpKSB7CisgICAg ICAgICAgICAgICAgaWYgKHJldHJ5KSB7CisgICAgICAgICAgICAgICAgICAgIHp3YXJuKCJBYm9y dGluZyAobm8gY29ubmVjdGlvbikiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXRyeSA9IDE7CisgICAgICAgICAgICAg ICAgaWYocmVjb25uZWN0KCZnc3VfZXh0LT5yYywgZ3N1X2V4dC0+cmVkaXNfaG9zdF9wb3J0LCBn c3VfZXh0LT5wYXNzd29yZCkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAg ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocG0tPmVuYW1lICYmIHZhbCkK KyAgICAgICAgYXJyZml4ZW52KHBtLT5lbmFtZSwgdmFsKTsKK30KKy8qIH19fSAqLworLyogRlVO Q1RJT046IHJlZGlzX2FycnNldF91bnNldGZuIHt7eyAqLworLyoqLworbW9kX2V4cG9ydCB2b2lk CityZWRpc19hcnJzZXRfdW5zZXRmbihQYXJhbSBwbSwgVU5VU0VEKGludCBleHApKQoreworICAg IC8qIFdpbGwgY2xlYXIgdGhlIGRhdGFiYXNlICovCisgICAgcmVkaXNfYXJyc2V0X3NldGZuKHBt LCBOVUxMKTsKKworICAgIC8qIFdpbGwgZGV0YWNoIGZyb20gZGF0YWJhc2UgYW5kIGZyZWUgY3Vz dG9tIG1lbW9yeSAqLworICAgIHJlZGlzX2FycnNldF91bnRpZShwbSk7CisKKyAgICBwbS0+bm9k ZS5mbGFncyB8PSBQTV9VTlNFVDsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHJlZGlzX2Fy cnNldF91bnRpZSB7e3sgKi8KKy8qKi8KK3N0YXRpYyB2b2lkCityZWRpc19hcnJzZXRfdW50aWUo UGFyYW0gcG0pCit7CisgICAgc3RydWN0IGdzdV9hcnJheV9leHQgKmdzdV9leHQgPSAoc3RydWN0 IGdzdV9hcnJheV9leHQgKikgcG0tPmdzdS5hOworCisgICAgaWYgKGdzdV9leHQtPnJjKSAvKiBw YXJhbm9pYSAqLworICAgICAgICByZWRpc0ZyZWUoZ3N1X2V4dC0+cmMpOworCisgICAgLyogUmVt b3ZlIGZyb20gbGlzdCBvZiB0aWVkIHBhcmFtZXRlcnMgKi8KKyAgICByZW1vdmVfdGllZF9uYW1l KHBtLT5ub2RlLm5hbSk7CisKKyAgICBwbS0+bm9kZS5mbGFncyAmPSB+KFBNX1NQRUNJQUx8UE1f UkVBRE9OTFkpOworICAgIHBtLT5nc3UuYSA9ICZzdGRhcnJheV9nc3U7CisKKyAgICAvKiBGcmVl IGdzdV9leHQgKi8KKyAgICB6c2ZyZWUoZ3N1X2V4dC0+cmVkaXNfaG9zdF9wb3J0KTsKKyAgICBp ZiAoZ3N1X2V4dC0+cGFzc3dvcmQpCisgICAgICAgIHpzZnJlZShnc3VfZXh0LT5wYXNzd29yZCk7 CisgICAgenNmcmVlKGdzdV9leHQtPmtleSk7CisgICAgemZyZWUoZ3N1X2V4dCwgc2l6ZW9mKHN0 cnVjdCBnc3VfYXJyYXlfZXh0KSk7Cit9CisvKiB9fX0gKi8KKworLyoqKioqKioqKioqKiBaU0VU IEhBU0ggRUxFTSAqKioqKioqKioqKioqLworCisvKiBGVU5DVElPTjogcmVkaXNfenNldF9nZXRm biB7e3sgKi8KKworLyoKKyAqIFRoZSBwYXJhbSBpcyBhY3R1YWwgcGFyYW0gaW4gaGFzaCDigJPC oGFsd2F5cywgYmVjYXVzZQorICogcmVkaXNfenNldF9nZXRfbm9kZSBjcmVhdGVzIGV2ZXJ5IG5l dyBrZXkgc2Vlbi4gSG93ZXZlciwKKyAqIGl0IG1pZ2h0IGJlIG5vdCBQTV9VUFRPREFURSAtIHdo aWNoIG1lYW5zIHRoYXQgZGF0YWJhc2UKKyAqIHdhc24ndCB5ZXQgcXVlcmllZC4KKyAqCisgKiBJ dCB3aWxsIGJlIGxlZnQgaW4gdGhpcyBzdGF0ZSBpZiBkYXRhYmFzZSBkb2Vzbid0CisgKiBjb250 YWluIHN1Y2gga2V5LiBUaGF0IG1pZ2h0IGJlIGEgZHJhd2JhY2ssIG1heWJlCisgKiBzZXR0aW5n IHRvIGVtcHR5IHZhbHVlIGhhcyBzZW5zZS4KKyAqLworCisvKiovCitzdGF0aWMgY2hhciAqCity ZWRpc196c2V0X2dldGZuKFBhcmFtIHBtKQoreworICAgIHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCAq Z3N1X2V4dDsKKyAgICBjaGFyICptYWluX2tleSwgKmtleTsKKyAgICBzaXplX3QgbWFpbl9rZXlf bGVuLCBrZXlfbGVuOworICAgIHJlZGlzQ29udGV4dCAqcmM7CisgICAgcmVkaXNSZXBseSAqcmVw bHk7CisKKyAgICBnc3VfZXh0ID0gKHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCAqKSBwbS0+Z3N1LnM7 CisKKyAgICAvKiBLZXkgYWxyZWFkeSByZXRyaWV2ZWQ/ICovCisgICAgaWYgKChwbS0+bm9kZS5m bGFncyAmIFBNX1VQVE9EQVRFKSAmJiBnc3VfZXh0LT51c2VfY2FjaGUpIHsKKyAgICAgICAgcmV0 dXJuIHBtLT51LnN0ciA/IHBtLT51LnN0ciA6IChjaGFyICopIGhjYWxsb2MoMSk7CisgICAgfQor CisgICAgLyogVW5tZXRhZnkga2V5LiBSZWRpcyBmaXRzIG5pY2UgaW50byB0aGlzCisgICAgICog cHJvY2VzcywgYXMgaXQgY2FuIHVzZSBsZW5ndGggb2YgZGF0YSAqLworICAgIGludCB1bWxlbiA9 IDA7CisgICAgY2hhciAqdW1rZXkgPSB1bm1ldGFmeV96YWxsb2MocG0tPm5vZGUubmFtLCAmdW1s ZW4pOworCisgICAga2V5ID0gdW1rZXk7CisgICAga2V5X2xlbiA9IHVtbGVuOworCisgICAgbWFp bl9rZXkgPSBnc3VfZXh0LT5rZXk7CisgICAgbWFpbl9rZXlfbGVuID0gZ3N1X2V4dC0+a2V5X2xl bjsKKworICAgIGludCByZXRyeSA9IDA7CisgcmV0cnk6CisgICAgcmMgPSBnc3VfZXh0LT5yYzsK KworICAgIGlmKHJjKSB7CisgICAgICAgIHJlcGx5ID0gcmVkaXNDb21tYW5kKHJjLCAiWlNDT1JF ICViICViIiwgbWFpbl9rZXksIChzaXplX3QpIG1haW5fa2V5X2xlbiwga2V5LCAoc2l6ZV90KSBr ZXlfbGVuKTsKKyAgICAgICAgaWYgKHJlcGx5ICYmIHJlcGx5LT50eXBlID09IFJFRElTX1JFUExZ X1NUUklORykgeworICAgICAgICAgICAgLyogV2UgaGF2ZSBkYXRhIOKAkyBzdG9yZSBpdCBhbmQg cmV0dXJuIGl0ICovCisgICAgICAgICAgICBwbS0+bm9kZS5mbGFncyB8PSBQTV9VUFRPREFURTsK KworICAgICAgICAgICAgLyogRW5zdXJlIHRoZXJlJ3Mgbm8gbGVhayAqLworICAgICAgICAgICAg aWYgKHBtLT51LnN0cikgeworICAgICAgICAgICAgICAgIHpzZnJlZShwbS0+dS5zdHIpOworICAg ICAgICAgICAgICAgIHBtLT51LnN0ciA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAg ICAgIC8qIE1ldGFmeSByZXR1cm5lZCBkYXRhLiBBbGwgZml0cyAtIG1ldGFmeQorICAgICAgICAg ICAgICogY2FuIG9idGFpbiBkYXRhIGxlbmd0aCB0byBhdm9pZCB1c2luZyBcMCAqLworICAgICAg ICAgICAgcG0tPnUuc3RyID0gbWV0YWZ5KHJlcGx5LT5zdHIsIHJlcGx5LT5sZW4sIE1FVEFfRFVQ KTsKKyAgICAgICAgICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7CisKKyAgICAgICAgICAgIC8q IEZyZWUga2V5LCByZXN0b3JpbmcgaXRzIG9yaWdpbmFsIGxlbmd0aCAqLworICAgICAgICAgICAg c2V0X2xlbmd0aCh1bWtleSwga2V5X2xlbik7CisgICAgICAgICAgICB6c2ZyZWUodW1rZXkpOwor CisgICAgICAgICAgICAvKiBDYW4gcmV0dXJuIHBvaW50ZXIsIGNvcnJlY3RseSBzYXZlZCBpbnNp ZGUgaGFzaCAqLworICAgICAgICAgICAgcmV0dXJuIHBtLT51LnN0cjsKKyAgICAgICAgfSBlbHNl IGlmIChyZXBseSkgeworICAgICAgICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsKKyAgICAg ICAgfQorCisgICAgICAgIGlmICghcmV0cnkgJiYgKHJjLT5lcnIgJiAoUkVESVNfRVJSX0lPIHwg UkVESVNfRVJSX0VPRikpKSB7CisgICAgICAgICAgICByZXRyeSA9IDE7CisgICAgICAgICAgICBp ZihyZWNvbm5lY3QoJmdzdV9leHQtPnJjLCBnc3VfZXh0LT5yZWRpc19ob3N0X3BvcnQsIGdzdV9l eHQtPnBhc3N3b3JkKSkKKyAgICAgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICB9IGVs c2UgaWYgKHJldHJ5ICYmIChyYy0+ZXJyICYgKFJFRElTX0VSUl9JTyB8IFJFRElTX0VSUl9FT0Yp KSkgeworICAgICAgICAgICAgendhcm4oIkFib3J0aW5nIChubyBjb25uZWN0aW9uKSIpOworICAg ICAgICB9CisgICAgfQorCisgICAgLyogRnJlZSBrZXksIHJlc3RvcmluZyBpdHMgb3JpZ2luYWwg bGVuZ3RoICovCisgICAgc2V0X2xlbmd0aCh1bWtleSwga2V5X2xlbik7CisgICAgenNmcmVlKHVt a2V5KTsKKworICAgIHJldHVybiAiIjsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHJlZGlz X3pzZXRfc2V0Zm4ge3t7ICovCisvKiovCitzdGF0aWMgdm9pZAorcmVkaXNfenNldF9zZXRmbihQ YXJhbSBwbSwgY2hhciAqdmFsKQoreworICAgIGNoYXIgKm1haW5fa2V5LCAqa2V5LCAqY29udGVu dDsKKyAgICBzaXplX3QgbWFpbl9rZXlfbGVuLCBrZXlfbGVuLCBjb250ZW50X2xlbjsKKyAgICBz dHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKmdzdV9leHQ7CisgICAgcmVkaXNDb250ZXh0ICpyYzsKKyAg ICByZWRpc1JlcGx5ICpyZXBseTsKKworICAgIC8qIFNldCBpcyBkb25lIG9uIHBhcmFtZXRlciBh bmQgb24gZGF0YWJhc2UuICovCisKKyAgICAvKiBQYXJhbWV0ZXIgKi8KKyAgICBpZiAocG0tPnUu c3RyKSB7CisgICAgICAgIHpzZnJlZShwbS0+dS5zdHIpOworICAgICAgICBwbS0+dS5zdHIgPSBO VUxMOworICAgICAgICBwbS0+bm9kZS5mbGFncyAmPSB+KFBNX1VQVE9EQVRFKTsKKyAgICB9CisK KyAgICBpZiAodmFsKSB7CisgICAgICAgIHBtLT51LnN0ciA9IHp0cmR1cCh2YWwpOworICAgICAg ICBwbS0+bm9kZS5mbGFncyB8PSBQTV9VUFRPREFURTsKKyAgICB9CisKKyAgICAvKiBEYXRhYmFz ZSAqLworICAgIGdzdV9leHQgPSAoc3RydWN0IGdzdV9zY2FsYXJfZXh0ICopIHBtLT5nc3UuczsK KworICAgIGludCByZXRyeSA9IDA7CisgcmV0cnk6CisgICAgcmMgPSBnc3VfZXh0LT5yYzsKKwor ICAgIC8qIENhbiBiZSBOVUxMLCB3aGVuIGNhbGxpbmcgdW5zZXQgYWZ0ZXIgdW50aWUgKi8KKyAg ICBpZiAocmMgJiYgbm9fZGF0YWJhc2VfYWN0aW9uID09IDApIHsKKyAgICAgICAgaW50IHVtbGVu ID0gMDsKKyAgICAgICAgY2hhciAqdW1rZXkgPSB1bm1ldGFmeV96YWxsb2MocG0tPm5vZGUubmFt LCAmdW1sZW4pOworCisgICAgICAgIGtleSA9IHVta2V5OworICAgICAgICBrZXlfbGVuID0gdW1s ZW47CisKKyAgICAgICAgbWFpbl9rZXkgPSBnc3VfZXh0LT5rZXk7CisgICAgICAgIG1haW5fa2V5 X2xlbiA9IGdzdV9leHQtPmtleV9sZW47CisKKyAgICAgICAgaWYgKHZhbCkgeworICAgICAgICAg ICAgLyogVW5tZXRhZnkgd2l0aCBleGFjdCB6YWxsb2Mgc2l6ZSAqLworICAgICAgICAgICAgY2hh ciAqdW12YWwgPSB1bm1ldGFmeV96YWxsb2ModmFsLCAmdW1sZW4pOworCisgICAgICAgICAgICBj b250ZW50ID0gdW12YWw7CisgICAgICAgICAgICBjb250ZW50X2xlbiA9IHVtbGVuOworCisgICAg ICAgICAgICAvKiBaQUREIG15enNldCAxLjAgZWxlbWVudDEgKi8KKyAgICAgICAgICAgIHJlcGx5 ID0gcmVkaXNDb21tYW5kKHJjLCAiWkFERCAlYiAlYiAlYiIsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBtYWluX2tleSwgKHNpemVfdCkgbWFpbl9rZXlfbGVuLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCwgKHNpemVfdCkgY29udGVudF9sZW4sCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIChzaXplX3QpIGtleV9sZW4gKTsK KyAgICAgICAgICAgIGlmIChyZXBseSkKKyAgICAgICAgICAgICAgICBmcmVlUmVwbHlPYmplY3Qo cmVwbHkpOworCisgICAgICAgICAgICAvKiBGcmVlICovCisgICAgICAgICAgICBzZXRfbGVuZ3Ro KHVtdmFsLCBjb250ZW50X2xlbik7CisgICAgICAgICAgICB6c2ZyZWUodW12YWwpOworICAgICAg ICB9IGVsc2UgeworICAgICAgICAgICAgcmVwbHkgPSByZWRpc0NvbW1hbmQocmMsICJaUkVNICVi ICViIiwgbWFpbl9rZXksIChzaXplX3QpIG1haW5fa2V5X2xlbiwga2V5LCAoc2l6ZV90KSBrZXlf bGVuKTsKKyAgICAgICAgICAgIGlmIChyZXBseSkKKyAgICAgICAgICAgICAgICBmcmVlUmVwbHlP YmplY3QocmVwbHkpOworICAgICAgICB9CisKKyAgICAgICAgLyogRnJlZSBrZXkgKi8KKyAgICAg ICAgc2V0X2xlbmd0aCh1bWtleSwga2V5X2xlbik7CisgICAgICAgIHpzZnJlZSh1bWtleSk7CisK KyAgICAgICAgaWYgKCFyZXRyeSAmJiAocmMtPmVyciAmIChSRURJU19FUlJfSU8gfCBSRURJU19F UlJfRU9GKSkpIHsKKyAgICAgICAgICAgIHJldHJ5ID0gMTsKKyAgICAgICAgICAgIGlmKHJlY29u bmVjdCgmZ3N1X2V4dC0+cmMsIGdzdV9leHQtPnJlZGlzX2hvc3RfcG9ydCwgZ3N1X2V4dC0+cGFz c3dvcmQpKQorICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgIH0gZWxzZSBpZiAo cmV0cnkgJiYgKHJjLT5lcnIgJiAoUkVESVNfRVJSX0lPIHwgUkVESVNfRVJSX0VPRikpKSB7Cisg ICAgICAgICAgICB6d2FybigiQWJvcnRpbmcgKG5vIGNvbm5lY3Rpb24pIik7CisgICAgICAgIH0K KyAgICB9Cit9CisvKiB9fX0gKi8KKy8qIEZVTkNUSU9OOiByZWRpc196c2V0X3Vuc2V0Zm4ge3t7 ICovCisvKiovCitzdGF0aWMgdm9pZAorcmVkaXNfenNldF91bnNldGZuKFBhcmFtIHBtLCBVTlVT RUQoaW50IHVtKSkKK3sKKyAgICAvKiBTZXQgd2l0aCBOVUxMICovCisgICAgcmVkaXNfenNldF9z ZXRmbihwbSwgTlVMTCk7Cit9CisvKiB9fX0gKi8KKworLyoqKioqKioqKioqKioqKiBaU0VUIEhB U0ggKioqKioqKioqKioqKioqLworCisvKiBGVU5DVElPTjogcmVkaXNfenNldF9nZXRfbm9kZSB7 e3sgKi8KKy8qKi8KK3N0YXRpYyBIYXNoTm9kZQorcmVkaXNfenNldF9nZXRfbm9kZShIYXNoVGFi bGUgaHQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgSGFzaE5vZGUgaG4gPSBnZXRoYXNobm9k ZTIoaHQsIG5hbWUpOworICAgIFBhcmFtIHZhbF9wbSA9IChQYXJhbSkgaG47CisKKyAgICAvKiBF bnRyeSBmb3Iga2V5IGRvZXNuJ3QgZXhpc3Q/IENyZWF0ZSBpdCBub3csCisgICAgICogaXQgd2ls bCBiZSBpbnRlcmZhY2luZyBiZXR3ZWVuIHRoZSBkYXRhYmFzZQorICAgICAqIGFuZCBac2ggLSB0 aHJvdWdoIHNwZWNpYWwgZ3N1LiBTbywgYW55IHNlZW4KKyAgICAgKiBrZXkgcmVzdWx0cyBpbiBu ZXcgaW50ZXJmYWNpbmcgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQWRkIHRoZSBQYXJhbSB0 byBpdHMgaGFzaCwgaXQgaXMgbm90IFBNX1VQVE9EQVRFLgorICAgICAqIEl0IHdpbGwgYmUgbG9h ZGVkIGZyb20gZGF0YWJhc2UgKmFuZCBmaWxsZWQqCisgICAgICogb3IgbGVmdCBpbiB0aGF0IHN0 YXRlIGlmIHRoZSBkYXRhYmFzZSBkb2Vzbid0CisgICAgICogY29udGFpbiBpdC4KKyAgICAgKi8K KworICAgIGlmICghdmFsX3BtKSB7CisgICAgICAgIHZhbF9wbSA9IChQYXJhbSkgenNoY2FsbG9j KHNpemVvZiAoKnZhbF9wbSkpOworICAgICAgICB2YWxfcG0tPm5vZGUuZmxhZ3MgPSBQTV9TQ0FM QVIgfCBQTV9IQVNIRUxFTTsgLyogbm8gUE1fVVBUT0RBVEUgKi8KKyAgICAgICAgdmFsX3BtLT5n c3UucyA9IChHc3VTY2FsYXIpIGh0LT50bXBkYXRhOworICAgICAgICBodC0+YWRkbm9kZShodCwg enRyZHVwKG5hbWUpLCB2YWxfcG0pOyAvLyBzZXRzIHBtLT5ub2RlLm5hbQorICAgIH0KKworICAg IHJldHVybiAoSGFzaE5vZGUpIHZhbF9wbTsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHpz ZXRfc2Nhbl9rZXlzIHt7eyAqLworLyoqLworc3RhdGljIHZvaWQKK3pzZXRfc2Nhbl9rZXlzKEhh c2hUYWJsZSBodCwgU2NhbkZ1bmMgZnVuYywgaW50IGZsYWdzKQoreworICAgIGNoYXIgKm1haW5f a2V5LCAqa2V5OworICAgIHNpemVfdCBtYWluX2tleV9sZW4sIGtleV9sZW47CisgICAgdW5zaWdu ZWQgbG9uZyBsb25nIGN1cnNvciA9IDA7CisgICAgcmVkaXNDb250ZXh0ICpyYzsKKyAgICByZWRp c1JlcGx5ICpyZXBseSwgKnJlcGx5MjsKKyAgICBzdHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKmdzdV9l eHQ7CisKKyAgICBnc3VfZXh0ID0gKHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCAqKSBodC0+dG1wZGF0 YTsKKyAgICBtYWluX2tleSA9IGdzdV9leHQtPmtleTsKKyAgICBtYWluX2tleV9sZW4gPSBnc3Vf ZXh0LT5rZXlfbGVuOworCisgICAgLyogSXRlcmF0ZSBrZXlzIGFkZGluZyB0aGVtIHRvIGhhc2gs IHNvIHdlIGhhdmUgUGFyYW0gdG8gdXNlIGluIGBmdW5jYCAqLworICAgIGRvIHsKKyAgICAgICAg aW50IHJldHJ5ID0gMDsKKyAgICByZXRyeToKKyAgICAgICAgcmMgPSBnc3VfZXh0LT5yYzsKKwor ICAgICAgICBpZiAoIXJjKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHJlcGx5ID0g cmVkaXNDb21tYW5kKHJjLCAiWlNDQU4gJWIgJWxsdSIsIG1haW5fa2V5LCAoc2l6ZV90KSBtYWlu X2tleV9sZW4sIGN1cnNvcik7CisKKyAgICAgICAgLyogRGlzY29ubmVjdCBkZXRlY3Rpb24gKi8K KyAgICAgICAgaWYgKHJjLT5lcnIgJiAoUkVESVNfRVJSX0lPIHwgUkVESVNfRVJSX0VPRikpIHsK KyAgICAgICAgICAgIGlmIChyZXBseSkKKyAgICAgICAgICAgICAgICBmcmVlUmVwbHlPYmplY3Qo cmVwbHkpOworICAgICAgICAgICAgaWYgKHJldHJ5KSB7CisgICAgICAgICAgICAgICAgendhcm4o IkFib3J0aW5nIChub3QgY29ubmVjdGVkKSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg ICAgICAgICAgfQorICAgICAgICAgICAgcmV0cnkgPSAxOworICAgICAgICAgICAgaWYocmVjb25u ZWN0KCZnc3VfZXh0LT5yYywgZ3N1X2V4dC0+cmVkaXNfaG9zdF9wb3J0LCBnc3VfZXh0LT5wYXNz d29yZCkpCisgICAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgIGVsc2UKKyAg ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXBseSA9PSBO VUxMIHx8IHJlcGx5LT50eXBlICE9IFJFRElTX1JFUExZX0FSUkFZIHx8IHJlcGx5LT5lbGVtZW50 cyAhPSAyKSB7CisgICAgICAgICAgICBpZiAocmVwbHkgJiYgcmVwbHktPnR5cGUgPT0gUkVESVNf UkVQTFlfRVJST1IpIHsKKyAgICAgICAgICAgICAgICB6d2FybigiQWJvcnRpbmcsIHByb2JsZW0g b2NjdXJlZCBkdXJpbmcgWlNDQU46ICVzIiwgcmVwbHktPnN0cik7CisgICAgICAgICAgICB9IGVs c2UgeworICAgICAgICAgICAgICAgIHp3YXJuKCJQcm9ibGVtIG9jY3VyZWQgZHVyaW5nIFpTQ0FO LCBubyBlcnJvciBtZXNzYWdlIGF2YWlsYWJsZSwgYWJvcnRpbmciKTsKKyAgICAgICAgICAgIH0K KyAgICAgICAgICAgIGlmIChyZXBseSkKKyAgICAgICAgICAgICAgICBmcmVlUmVwbHlPYmplY3Qo cmVwbHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQg bmV3IGN1cnNvciAqLworICAgICAgICBpZiAocmVwbHktPmVsZW1lbnRbMF0tPnR5cGUgPT0gUkVE SVNfUkVQTFlfU1RSSU5HKSB7CisgICAgICAgICAgICBjdXJzb3IgPSBzdHJ0b3VsbChyZXBseS0+ ZWxlbWVudFswXS0+c3RyLCBOVUxMLCAxMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg ICB6d2FybigiRXJyb3IgMiBvY2N1cmVkIGR1cmluZyBaU0NBTiIpOworICAgICAgICAgICAgYnJl YWs7CisgICAgICAgIH0KKworICAgICAgICByZXBseTIgPSByZXBseS0+ZWxlbWVudFsxXTsKKyAg ICAgICAgaWYgKHJlcGx5MiA9PSBOVUxMIHx8IHJlcGx5Mi0+dHlwZSAhPSBSRURJU19SRVBMWV9B UlJBWSkgeworICAgICAgICAgICAgendhcm4oIkVycm9yIDMgb2NjdXJlZCBkdXJpbmcgWlNDQU4i KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3Qg aiA9IDA7IGogPCByZXBseTItPmVsZW1lbnRzOyBqKz0gMikgeworICAgICAgICAgICAgcmVkaXNS ZXBseSAqZW50cnkgPSByZXBseTItPmVsZW1lbnRbal07CisgICAgICAgICAgICBpZiAoZW50cnkg PT0gTlVMTCB8fCBlbnRyeS0+dHlwZSAhPSBSRURJU19SRVBMWV9TVFJJTkcpIHsKKyAgICAgICAg ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAga2V5ID0gZW50 cnktPnN0cjsKKyAgICAgICAgICAgIGtleV9sZW4gPSBlbnRyeS0+bGVuOworCisgICAgICAgICAg ICAvKiBUaGlzIHJldHVybnMgZGF0YWJhc2UtaW50ZXJmYWNpbmcgUGFyYW0sCisgICAgICAgICAg ICAqIGl0IHdpbGwgcmV0dXJuIHUuc3RyIG9yIGZpcnN0IGZldGNoIGRhdGEKKyAgICAgICAgICAg ICogaWYgbm90IFBNX1VQVE9EQVRFIChuZXdseSBjcmVhdGVkKSAqLworICAgICAgICAgICAgY2hh ciAqemtleSA9IG1ldGFmeShrZXksIGtleV9sZW4sIE1FVEFfRFVQKTsKKyAgICAgICAgICAgIEhh c2hOb2RlIGhuID0gcmVkaXNfenNldF9nZXRfbm9kZShodCwgemtleSk7CisgICAgICAgICAgICB6 c2ZyZWUoemtleSk7CisKKyAgICAgICAgICAgIGZ1bmMoaG4sIGZsYWdzKTsKKyAgICAgICAgfQor ICAgICAgICBmcmVlUmVwbHlPYmplY3QocmVwbHkpOworICAgIH0gd2hpbGUgKGN1cnNvciAhPSAw KTsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHJlZGlzX2hhc2hfenNldF9zZXRmbiB7e3sg Ki8KKworLyoKKyAqIFJlcGxhY2UgZGF0YWJhc2Ugd2l0aCBuZXcgaGFzaAorICovCisKKy8qKi8K K3N0YXRpYyB2b2lkCityZWRpc19oYXNoX3pzZXRfc2V0Zm4oUGFyYW0gcG0sIEhhc2hUYWJsZSBo dCkKK3sKKyAgICBIYXNoTm9kZSBobjsKKyAgICBjaGFyICptYWluX2tleSwgKmtleSwgKmNvbnRl bnQ7CisgICAgc2l6ZV90IG1haW5fa2V5X2xlbiwga2V5X2xlbiwgY29udGVudF9sZW4sIGk7Cisg ICAgcmVkaXNDb250ZXh0ICpyYzsKKyAgICByZWRpc1JlcGx5ICpyZXBseTsKKyAgICBzdHJ1Y3Qg Z3N1X3NjYWxhcl9leHQgKmdzdV9leHQ7CisKKyAgICBpZiAoIXBtLT51Lmhhc2ggfHwgcG0tPnUu aGFzaCA9PSBodCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZ3N1X2V4dCA9IChzdHJ1Y3QgZ3N1 X3NjYWxhcl9leHQgKikgcG0tPnUuaGFzaC0+dG1wZGF0YTsKKworICAgIGludCByZXRyeSA9IDA7 CisgcmV0cnk6CisgICAgcmMgPSBnc3VfZXh0LT5yYzsKKyAgICBpZiAoIXJjKSB7CisgICAgICAg IHJldHVybjsKKyAgICB9CisKKyAgICBtYWluX2tleSA9IGdzdV9leHQtPmtleTsKKyAgICBtYWlu X2tleV9sZW4gPSBnc3VfZXh0LT5rZXlfbGVuOworCisgICAgLyogUFJVTkUgKi8KKyAgICByZXBs eSA9IHJlZGlzQ29tbWFuZChyYywgIlpSRU1SQU5HRUJZU0NPUkUgJWIgLWluZiAraW5mIiwgbWFp bl9rZXksIChzaXplX3QpIG1haW5fa2V5X2xlbik7CisgICAgaWYgKHJlcGx5ID09IE5VTEwgfHwg cmVwbHktPnR5cGUgIT0gUkVESVNfUkVQTFlfSU5URUdFUikgeworICAgICAgICB6d2FybigiRXJy b3IgNCBvY2N1cmVkLCBkYXRhYmFzZSBub3QgdXBkYXRlZCAobm8gcHVyZ2Ugb2YgenNldCkiKTsK KyAgICAgICAgaWYgKHJlcGx5KQorICAgICAgICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsK KyAgICAgICAgZ290byBkb19yZXRyeTsKKyAgICB9CisgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5 KTsKKworIGRvX3JldHJ5OgorICAgIGlmICghcmV0cnkgJiYgKHJjLT5lcnIgJiAoUkVESVNfRVJS X0lPIHwgUkVESVNfRVJSX0VPRikpKSB7CisgICAgICAgIHJldHJ5ID0gMTsKKyAgICAgICAgaWYo cmVjb25uZWN0KCZnc3VfZXh0LT5yYywgZ3N1X2V4dC0+cmVkaXNfaG9zdF9wb3J0LCBnc3VfZXh0 LT5wYXNzd29yZCkpCisgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICBlbHNlCisgICAg ICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChyZXRyeSAmJiAocmMtPmVyciAmIChSRURJ U19FUlJfSU8gfCBSRURJU19FUlJfRU9GKSkpIHsKKyAgICAgICAgendhcm4oIkFib3J0aW5nIChu byBjb25uZWN0aW9uKSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbm9fZGF0YWJh c2VfYWN0aW9uID0gMTsKKyAgICBlbXB0eWhhc2h0YWJsZShwbS0+dS5oYXNoKTsKKyAgICBub19k YXRhYmFzZV9hY3Rpb24gPSAwOworCisgICAgaWYgKCFodCkKKyAgICAgICAgcmV0dXJuOworCisg ICAgIC8qIFB1dCBuZXcgc3RyaW5ncyBpbnRvIGRhdGFiYXNlLCBoYXZpbmcKKyAgICAgICogdGhl aXIgaW50ZXJmYWNpbmctUGFyYW1zIGNyZWF0ZWQgKi8KKworICAgIHJldHJ5ID0gMDsKKyByZXRy eTI6CisgICAgcmMgPSBnc3VfZXh0LT5yYzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBodC0+aHNp emU7IGkrKykgeworICAgICAgICBmb3IgKGhuID0gaHQtPm5vZGVzW2ldOyBobjsgaG4gPSBobi0+ bmV4dCkgeworICAgICAgICAgICAgc3RydWN0IHZhbHVlIHY7CisKKyAgICAgICAgICAgIHYuaXNh cnIgPSB2LmZsYWdzID0gdi5zdGFydCA9IDA7CisgICAgICAgICAgICB2LmVuZCA9IC0xOworICAg ICAgICAgICAgdi5hcnIgPSBOVUxMOworICAgICAgICAgICAgdi5wbSA9IChQYXJhbSkgaG47CisK KyAgICAgICAgICAgIC8qIFVubWV0YWZ5IGtleSAqLworICAgICAgICAgICAgaW50IHVtbGVuID0g MDsKKyAgICAgICAgICAgIGNoYXIgKnVta2V5ID0gdW5tZXRhZnlfemFsbG9jKHYucG0tPm5vZGUu bmFtLCAmdW1sZW4pOworCisgICAgICAgICAgICBrZXkgPSB1bWtleTsKKyAgICAgICAgICAgIGtl eV9sZW4gPSB1bWxlbjsKKworICAgICAgICAgICAgcXVldWVfc2lnbmFscygpOworCisgICAgICAg ICAgICAvKiBVbm1ldGFmeSBkYXRhICovCisgICAgICAgICAgICBjaGFyICp1bXZhbCA9IHVubWV0 YWZ5X3phbGxvYyhnZXRzdHJ2YWx1ZSgmdiksICZ1bWxlbik7CisKKyAgICAgICAgICAgIGNvbnRl bnQgPSB1bXZhbDsKKyAgICAgICAgICAgIGNvbnRlbnRfbGVuID0gdW1sZW47CisKKyAgICAgICAg ICAgIC8qIFpBREQgbXl6c2V0IDEuMCBlbGVtZW50MSAqLworICAgICAgICAgICAgcmVwbHkgPSBy ZWRpc0NvbW1hbmQocmMsICJaQUREICViICViICViIiwgbWFpbl9rZXksIChzaXplX3QpIG1haW5f a2V5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsIChzaXpl X3QpIGNvbnRlbnRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCAo c2l6ZV90KSBrZXlfbGVuKTsKKyAgICAgICAgICAgIGlmIChyZXBseSkgeworICAgICAgICAgICAg ICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7CisgICAgICAgICAgICAgICAgcmVwbHkgPSBOVUxM OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJjLT5lcnIgJiAoUkVESVNfRVJSX0lP IHwgUkVESVNfRVJSX0VPRikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAg IC8qIEZyZWUsIHJlc3RvcmluZyBvcmlnaW5hbCBsZW5ndGggKi8KKyAgICAgICAgICAgIHNldF9s ZW5ndGgodW12YWwsIGNvbnRlbnRfbGVuKTsKKyAgICAgICAgICAgIHpzZnJlZSh1bXZhbCk7Cisg ICAgICAgICAgICBzZXRfbGVuZ3RoKHVta2V5LCBrZXlfbGVuKTsKKyAgICAgICAgICAgIHpzZnJl ZSh1bWtleSk7CisKKyAgICAgICAgICAgIHVucXVldWVfc2lnbmFscygpOworICAgICAgICB9CisK KyAgICAgICAgLyogRGlzY29ubmVjdCBkZXRlY3Rpb24gKi8KKyAgICAgICAgaWYgKCFyZXRyeSAm JiAocmMtPmVyciAmIChSRURJU19FUlJfSU8gfCBSRURJU19FUlJfRU9GKSkpIHsKKyAgICAgICAg ICAgIHJldHJ5ID0gMTsKKyAgICAgICAgICAgIGlmKHJlY29ubmVjdCgmZ3N1X2V4dC0+cmMsIGdz dV9leHQtPnJlZGlzX2hvc3RfcG9ydCwgZ3N1X2V4dC0+cGFzc3dvcmQpKQorICAgICAgICAgICAg ICAgIGdvdG8gcmV0cnkyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVy bjsKKyAgICAgICAgfSBlbHNlIGlmIChyZXRyeSAmJiAocmMtPmVyciAmIChSRURJU19FUlJfSU8g fCBSRURJU19FUlJfRU9GKSkpIHsKKyAgICAgICAgICAgIHp3YXJuKCJBYm9ydGluZyAobm8gY29u bmVjdGlvbikiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKy8q IH19fSAqLworLyogRlVOQ1RJT046IHJlZGlzX2hhc2hfenNldF91bnNldGZuIHt7eyAqLworLyoq Lworc3RhdGljIHZvaWQKK3JlZGlzX2hhc2hfenNldF91bnNldGZuKFBhcmFtIHBtLCBVTlVTRUQo aW50IGV4cCkpCit7CisgICAgLyogVGhpcyB3aWxsIG1ha2UgZGF0YWJhc2UgY29udGVudHMgc3Vy dml2ZSB0aGUKKyAgICAgKiB1bnNldCwgYXMgc3RhbmRhcmQgR1NVIHdpbGwgYmUgcHV0IGluIHBs YWNlICovCisgICAgcmVkaXNfaGFzaF96c2V0X3VudGllKHBtKTsKKworICAgIC8qIFJlbWVtYmVy IGN1c3RvbSBHU1Ugc3RydWN0dXJlIGFzc2lnbmVkIHRvCisgICAgICogdS5oYXNoLT50bXBkYXRh IGJlZm9yZSBoYXNoIGdldHMgZGVsZXRlZCAqLworICAgIHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCAq IGdzdV9leHQgPSBwbS0+dS5oYXNoLT50bXBkYXRhOworCisgICAgLyogVXNlcyBub3JtYWwgdW5z ZXR0ZXIuIFdpbGwgZGVsZXRlIGFsbCBvd25lZAorICAgICAqIHBhcmFtZXRlcnMgYW5kIGFsc28g aGFzaHRhYmxlLiAqLworICAgIHBtLT5nc3UuaC0+c2V0Zm4ocG0sIE5VTEwpOworCisgICAgLyog RG9uJ3QgbmVlZCBjdXN0b20gR1NVIHN0cnVjdHVyZSB3aXRoIGl0cworICAgICAqIHJlZGlzQ29u dGV4dCBwb2ludGVyIGFueW1vcmUgKi8KKyAgICB6c2ZyZWUoZ3N1X2V4dC0+cmVkaXNfaG9zdF9w b3J0KTsKKyAgICBpZiAoZ3N1X2V4dC0+cGFzc3dvcmQpCisgICAgICAgIHpzZnJlZShnc3VfZXh0 LT5wYXNzd29yZCk7CisgICAgenNmcmVlKGdzdV9leHQtPmtleSk7CisgICAgemZyZWUoZ3N1X2V4 dCwgc2l6ZW9mKHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCkpOworCisgICAgcG0tPm5vZGUuZmxhZ3Mg fD0gUE1fVU5TRVQ7Cit9CisvKiB9fX0gKi8KKy8qIEZVTkNUSU9OOiByZWRpc19oYXNoX3pzZXRf dW50aWUge3t7ICovCisvKiovCitzdGF0aWMgdm9pZAorcmVkaXNfaGFzaF96c2V0X3VudGllKFBh cmFtIHBtKQoreworICAgIHJlZGlzQ29udGV4dCAqcmMgPSAoKHN0cnVjdCBnc3Vfc2NhbGFyX2V4 dCAqKXBtLT51Lmhhc2gtPnRtcGRhdGEpLT5yYzsKKyAgICBIYXNoVGFibGUgaHQgPSBwbS0+dS5o YXNoOworCisgICAgaWYgKHJjKSB7IC8qIHBhcmFub2lhICovCisgICAgICAgIHJlZGlzRnJlZShy Yyk7CisKKyAgICAgICAgLyogTGV0IGhhc2ggZmllbGRzIGtub3cgdGhlcmUncyBubyBiYWNrZW5k ICovCisgICAgICAgICgoc3RydWN0IGdzdV9zY2FsYXJfZXh0ICopaHQtPnRtcGRhdGEpLT5yYyA9 IE5VTEw7CisKKyAgICAgICAgLyogUmVtb3ZlIGZyb20gbGlzdCBvZiB0aWVkIHBhcmFtZXRlcnMg Ki8KKyAgICAgICAgcmVtb3ZlX3RpZWRfbmFtZShwbS0+bm9kZS5uYW0pOworICAgIH0KKworICAg IC8qIGZvciBjb21wbGV0ZW5lc3MgLi4uIGNyZWF0ZXNwZWNpYWxoYXNoKCkgc2hvdWxkIGhhdmUg YW4gaW52ZXJzZSAqLworICAgIGh0LT5nZXRub2RlID0gaHQtPmdldG5vZGUyID0gZ2V0aGFzaG5v ZGUyOworICAgIGh0LT5zY2FudGFiID0gTlVMTDsKKworICAgIHBtLT5ub2RlLmZsYWdzICY9IH4o UE1fU1BFQ0lBTHxQTV9SRUFET05MWSk7CisgICAgcG0tPmdzdS5oID0gJnN0ZGhhc2hfZ3N1Owor fQorLyogfX19ICovCisKKy8qKioqKioqKioqKioqKiogWlNFVCBVVElMICoqKioqKioqKioqKioq Ki8KKworLyogRlVOQ1RJT046IGJpbl96cnpzZXQge3t7ICovCisvKiovCitzdGF0aWMgaW50Citi aW5fenJ6c2V0KGNoYXIgKm5hbSwgY2hhciAqKmFyZ3MsIE9wdGlvbnMgb3BzLCBVTlVTRUQoaW50 IGZ1bmMpKQoreworICAgIFBhcmFtIHBtOworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKnBt bmFtZTsKKworICAgIGlmIChPUFRfSVNTRVQob3BzLCdoJykpIHsKKyAgICAgICAgenJ6c2V0X3Vz YWdlKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHBtbmFtZSA9ICphcmdzOwor CisgICAgaWYgKCFwbW5hbWUpIHsKKyAgICAgICAgendhcm5uYW0obmFtLCAienNldCBwYXJhbWV0 ZXIgbmFtZSAodG8gYmUgY29waWVkIHRvICRyZXBseSkgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAg cmV0dXJuIDE7CisgICAgfQorCisgICAgcG0gPSAoUGFyYW0pIHBhcmFtdGFiLT5nZXRub2RlKHBh cmFtdGFiLCBwbW5hbWUpOworICAgIGlmKCFwbSkgeworICAgICAgICB6d2Fybm5hbShuYW0sICJu byBzdWNoIHBhcmFtZXRlcjogJXMiLCBwbW5hbWUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9 CisKKyAgICBpZiAocG0tPmdzdS5oID09ICZyZWRpc19oYXNoX2dzdSkgeworICAgICAgICB6d2Fy bm5hbShuYW0sICJgJXMnIGlzIGEgbWFpbi1zdG9yYWdlIGhhc2gsIGFib3J0aW5nIiwgcG1uYW1l KTsKKyAgICB9IGVsc2UgaWYocG0tPmdzdS5zLT5nZXRmbiA9PSAmcmVkaXNfc3RyX2dldGZuKSB7 CisgICAgICAgIHp3YXJubmFtKG5hbSwgImAlcycgaXMgYSBzdHJpbmcgcGFyYW1ldGVyLCBhYm9y dGluZyIsIHBtbmFtZSk7CisgICAgfSBlbHNlIGlmKHBtLT5nc3UuYS0+Z2V0Zm4gPT0gJnJlZGlz X2FycnNldF9nZXRmbikgeworICAgICAgICB6d2Fybm5hbShuYW0sICJgJXMnIGlzIGEgc2V0IChh cnJheSkgcGFyYW1ldGVyLCBhYm9ydGluZyIsIHBtbmFtZSk7CisgICAgfSBlbHNlIGlmKHBtLT5n c3UuaCA9PSAmaGFzaF96c2V0X2dzdSkgeworICAgICAgICBjaGFyICoqYXJyLCAqbWFpbl9rZXk7 CisgICAgICAgIHNpemVfdCBtYWluX2tleV9sZW47CisgICAgICAgIHJlZGlzQ29udGV4dCAqcmM7 CisgICAgICAgIHJlZGlzUmVwbHkgKnJlcGx5LCAqZW50cnk7CisgICAgICAgIHN0cnVjdCBnc3Vf c2NhbGFyX2V4dCAqZ3N1X2V4dDsKKworICAgICAgICBnc3VfZXh0ID0gKHN0cnVjdCBnc3Vfc2Nh bGFyX2V4dCAqKSBwbS0+dS5oYXNoLT50bXBkYXRhOworICAgICAgICByYyA9IGdzdV9leHQtPnJj OworICAgICAgICBtYWluX2tleSA9IGdzdV9leHQtPmtleTsKKyAgICAgICAgbWFpbl9rZXlfbGVu ID0gZ3N1X2V4dC0+a2V5X2xlbjsKKworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIHJl cGx5ID0gcmVkaXNDb21tYW5kKHJjLCAiWlJBTkdFICViIDAgLTEiLCBtYWluX2tleSwgKHNpemVf dCkgbWFpbl9rZXlfbGVuKTsKKyAgICAgICAgICAgIGlmIChyZXBseSA9PSBOVUxMIHx8IHJlcGx5 LT50eXBlICE9IFJFRElTX1JFUExZX0FSUkFZKSB7CisgICAgICAgICAgICAgICAgendhcm4oIkVy cm9yIDEyIG9jY3VyZWQgKFpSQU5HRSBjYWxsKSwgYWJvcnRpbmciKTsKKyAgICAgICAgICAgICAg ICBpZiAocmVwbHkpCisgICAgICAgICAgICAgICAgICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7 CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg IGFyciA9IHpzaGNhbGxvYygocmVwbHktPmVsZW1lbnRzKzEpICogc2l6ZW9mKGNoYXIgKikpOwor ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlcGx5LT5lbGVtZW50czsgaSsrKSB7CisgICAg ICAgICAgICAgICAgZW50cnkgPSByZXBseS0+ZWxlbWVudFtpXTsKKyAgICAgICAgICAgICAgICBh cnJbaV0gPSBtZXRhZnkoZW50cnktPnN0ciwgZW50cnktPmxlbiwgTUVUQV9EVVApOworICAgICAg ICAgICAgfQorICAgICAgICAgICAgYXJyW3JlcGx5LT5lbGVtZW50c10gPSBOVUxMOworICAgICAg ICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsKKworICAgICAgICAgICAgcG0gPSBhc3NpZ25h cGFyYW0oInJlcGx5IiwgYXJyLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9 IGVsc2UgeworICAgICAgICAgICAgendhcm4oIkVycm9yIDEzIG9jY3VyZWQ6IG5vIGRhdGFiYXNl IGNvbm5lY3Rpb24iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfSBl bHNlIGlmKHBtLT5nc3UuaCA9PSAmaGFzaF9oc2V0X2dzdSkgeworICAgICAgICB6d2Fybm5hbShu YW0sICJgJXMnIGlzIGEgaHNldCAoaGFzaCkgcGFyYW1ldGVyLCBhYm9ydGluZyIsIHBtbmFtZSk7 CisgICAgfSBlbHNlIGlmKHBtLT5nc3UuYS0+Z2V0Zm4gPT0gJnJlZGlzX2Fycmxpc3RfZ2V0Zm4p IHsKKyAgICAgICAgendhcm5uYW0obmFtLCAiYCVzJyBpcyBhIGxpc3QgKGFycmF5KSBwYXJhbWV0 ZXIsIGFib3J0aW5nIiwgcG1uYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICB6d2Fybm5hbShu YW0sICJub3QgYSB0aWVkIHpyZWRpcyBwYXJhbWV0ZXI6IGAlcycsICRyZXBseSBhcnJheSB1bmNo YW5nZWQiLCBwbW5hbWUpOworICAgIH0KKworICAgIHJldHVybiAxOworfQorLyogfX19ICovCisK Ky8qKioqKioqKioqKiogSFNFVCBIQVNIIEVMRU0gKioqKioqKioqKioqKi8KKworLyogRlVOQ1RJ T046IHJlZGlzX2hzZXRfZ2V0Zm4ge3t7ICovCisKKy8qCisgKiBUaGUgcGFyYW0gaXMgYWN0dWFs IHBhcmFtIGluIGhhc2gg4oCTwqBhbHdheXMsIGJlY2F1c2UKKyAqIHJlZGlzX2hzZXRfZ2V0X25v ZGUgY3JlYXRlcyBldmVyeSBuZXcga2V5IHNlZW4uIEhvd2V2ZXIsCisgKiBpdCBtaWdodCBiZSBu b3QgUE1fVVBUT0RBVEUgLSB3aGljaCBtZWFucyB0aGF0IGRhdGFiYXNlCisgKiB3YXNuJ3QgeWV0 IHF1ZXJpZWQuCisgKgorICogSXQgd2lsbCBiZSBsZWZ0IGluIHRoaXMgc3RhdGUgaWYgZGF0YWJh c2UgZG9lc24ndAorICogY29udGFpbiBzdWNoIGtleS4gVGhhdCBtaWdodCBiZSBhIGRyYXdiYWNr LCBtYXliZQorICogc2V0dGluZyB0byBlbXB0eSB2YWx1ZSBoYXMgc2Vuc2UuCisgKi8KKworLyoq Lworc3RhdGljIGNoYXIgKgorcmVkaXNfaHNldF9nZXRmbihQYXJhbSBwbSkKK3sKKyAgICBzdHJ1 Y3QgZ3N1X3NjYWxhcl9leHQgKmdzdV9leHQ7CisgICAgY2hhciAqbWFpbl9rZXksICprZXk7Cisg ICAgc2l6ZV90IG1haW5fa2V5X2xlbiwga2V5X2xlbjsKKyAgICByZWRpc0NvbnRleHQgKnJjOwor ICAgIHJlZGlzUmVwbHkgKnJlcGx5OworCisgICAgZ3N1X2V4dCA9IChzdHJ1Y3QgZ3N1X3NjYWxh cl9leHQgKikgcG0tPmdzdS5zOworCisgICAgLyogS2V5IGFscmVhZHkgcmV0cmlldmVkPyAqLwor ICAgIGlmICgocG0tPm5vZGUuZmxhZ3MgJiBQTV9VUFRPREFURSkgJiYgZ3N1X2V4dC0+dXNlX2Nh Y2hlKSB7CisgICAgICAgIHJldHVybiBwbS0+dS5zdHIgPyBwbS0+dS5zdHIgOiAoY2hhciAqKSBo Y2FsbG9jKDEpOworICAgIH0KKworICAgIC8qIFVubWV0YWZ5IGtleS4gUmVkaXMgZml0cyBuaWNl IGludG8gdGhpcworICAgICAqIHByb2Nlc3MsIGFzIGl0IGNhbiB1c2UgbGVuZ3RoIG9mIGRhdGEg Ki8KKyAgICBpbnQgdW1sZW4gPSAwOworICAgIGNoYXIgKnVta2V5ID0gdW5tZXRhZnlfemFsbG9j KHBtLT5ub2RlLm5hbSwgJnVtbGVuKTsKKworICAgIGtleSA9IHVta2V5OworICAgIGtleV9sZW4g PSB1bWxlbjsKKworICAgIG1haW5fa2V5ID0gZ3N1X2V4dC0+a2V5OworICAgIG1haW5fa2V5X2xl biA9IGdzdV9leHQtPmtleV9sZW47CisKKyAgICBpbnQgcmV0cnkgPSAwOworIHJldHJ5OgorICAg IHJjID0gZ3N1X2V4dC0+cmM7CisKKyAgICBpZiAocmMpIHsKKyAgICAgICAgcmVwbHkgPSByZWRp c0NvbW1hbmQocmMsICJIR0VUICViICViIiwgbWFpbl9rZXksIChzaXplX3QpIG1haW5fa2V5X2xl biwga2V5LCAoc2l6ZV90KSBrZXlfbGVuKTsKKyAgICAgICAgaWYgKHJlcGx5ICYmIHJlcGx5LT50 eXBlID09IFJFRElTX1JFUExZX1NUUklORykgeworICAgICAgICAgICAgLyogV2UgaGF2ZSBkYXRh IOKAkyBzdG9yZSBpdCBhbmQgcmV0dXJuIGl0ICovCisgICAgICAgICAgICBwbS0+bm9kZS5mbGFn cyB8PSBQTV9VUFRPREFURTsKKworICAgICAgICAgICAgLyogRW5zdXJlIHRoZXJlJ3Mgbm8gbGVh ayAqLworICAgICAgICAgICAgaWYgKHBtLT51LnN0cikgeworICAgICAgICAgICAgICAgIHpzZnJl ZShwbS0+dS5zdHIpOworICAgICAgICAgICAgICAgIHBtLT51LnN0ciA9IE5VTEw7CisgICAgICAg ICAgICB9CisKKyAgICAgICAgICAgIC8qIE1ldGFmeSByZXR1cm5lZCBkYXRhLiBBbGwgZml0cyAt IG1ldGFmeQorICAgICAgICAgICAgICogY2FuIG9idGFpbiBkYXRhIGxlbmd0aCB0byBhdm9pZCB1 c2luZyBcMCAqLworICAgICAgICAgICAgcG0tPnUuc3RyID0gbWV0YWZ5KHJlcGx5LT5zdHIsIHJl cGx5LT5sZW4sIE1FVEFfRFVQKTsKKyAgICAgICAgICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7 CisKKyAgICAgICAgICAgIC8qIEZyZWUga2V5LCByZXN0b3JpbmcgaXRzIG9yaWdpbmFsIGxlbmd0 aCAqLworICAgICAgICAgICAgc2V0X2xlbmd0aCh1bWtleSwga2V5X2xlbik7CisgICAgICAgICAg ICB6c2ZyZWUodW1rZXkpOworCisgICAgICAgICAgICAvKiBDYW4gcmV0dXJuIHBvaW50ZXIsIGNv cnJlY3RseSBzYXZlZCBpbnNpZGUgaGFzaCAqLworICAgICAgICAgICAgcmV0dXJuIHBtLT51LnN0 cjsKKyAgICAgICAgfSBlbHNlIGlmIChyZXBseSkgeworICAgICAgICAgICAgZnJlZVJlcGx5T2Jq ZWN0KHJlcGx5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmV0cnkgJiYgKHJjLT5lcnIg JiAoUkVESVNfRVJSX0lPIHwgUkVESVNfRVJSX0VPRikpKSB7CisgICAgICAgICAgICByZXRyeSA9 IDE7CisgICAgICAgICAgICBpZihyZWNvbm5lY3QoJmdzdV9leHQtPnJjLCBnc3VfZXh0LT5yZWRp c19ob3N0X3BvcnQsIGdzdV9leHQtPnBhc3N3b3JkKSkKKyAgICAgICAgICAgICAgICBnb3RvIHJl dHJ5OworICAgICAgICB9IGVsc2UgaWYgKHJldHJ5ICYmIChyYy0+ZXJyICYgKFJFRElTX0VSUl9J TyB8IFJFRElTX0VSUl9FT0YpKSkgeworICAgICAgICAgICAgendhcm4oIkFib3J0aW5nIChubyBj b25uZWN0aW9uKSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJlZSBrZXksIHJlc3Rv cmluZyBpdHMgb3JpZ2luYWwgbGVuZ3RoICovCisgICAgc2V0X2xlbmd0aCh1bWtleSwga2V5X2xl bik7CisgICAgenNmcmVlKHVta2V5KTsKKworICAgIC8qIENhbiB0aGlzIGJlICIiID8gKi8KKyAg ICByZXR1cm4gKGNoYXIgKikgaGNhbGxvYygxKTsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046 IHJlZGlzX2hzZXRfc2V0Zm4ge3t7ICovCisvKiovCitzdGF0aWMgdm9pZAorcmVkaXNfaHNldF9z ZXRmbihQYXJhbSBwbSwgY2hhciAqdmFsKQoreworICAgIGNoYXIgKm1haW5fa2V5LCAqa2V5LCAq Y29udGVudDsKKyAgICBzaXplX3QgbWFpbl9rZXlfbGVuLCBrZXlfbGVuLCBjb250ZW50X2xlbjsK KyAgICBzdHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKmdzdV9leHQ7CisgICAgcmVkaXNDb250ZXh0ICpy YzsKKyAgICByZWRpc1JlcGx5ICpyZXBseTsKKworICAgIC8qIFNldCBpcyBkb25lIG9uIHBhcmFt ZXRlciBhbmQgb24gZGF0YWJhc2UuICovCisKKyAgICAvKiBQYXJhbWV0ZXIgKi8KKyAgICBpZiAo cG0tPnUuc3RyKSB7CisgICAgICAgIHpzZnJlZShwbS0+dS5zdHIpOworICAgICAgICBwbS0+dS5z dHIgPSBOVUxMOworICAgICAgICBwbS0+bm9kZS5mbGFncyAmPSB+KFBNX1VQVE9EQVRFKTsKKyAg ICB9CisKKyAgICBpZiAodmFsKSB7CisgICAgICAgIHBtLT51LnN0ciA9IHp0cmR1cCh2YWwpOwor ICAgICAgICBwbS0+bm9kZS5mbGFncyB8PSBQTV9VUFRPREFURTsKKyAgICB9CisKKyAgICAvKiBE YXRhYmFzZSAqLworICAgIGdzdV9leHQgPSAoc3RydWN0IGdzdV9zY2FsYXJfZXh0ICopIHBtLT5n c3UuczsKKworICAgIGludCByZXRyeSA9IDA7CisgcmV0cnk6CisgICAgcmMgPSBnc3VfZXh0LT5y YzsKKworICAgIC8qIENhbiBiZSBOVUxMLCB3aGVuIGNhbGxpbmcgdW5zZXQgYWZ0ZXIgdW50aWUg Ki8KKyAgICBpZiAocmMgJiYgbm9fZGF0YWJhc2VfYWN0aW9uID09IDApIHsKKyAgICAgICAgaW50 IHVtbGVuID0gMDsKKyAgICAgICAgY2hhciAqdW1rZXkgPSB1bm1ldGFmeV96YWxsb2MocG0tPm5v ZGUubmFtLCAmdW1sZW4pOworCisgICAgICAgIGtleSA9IHVta2V5OworICAgICAgICBrZXlfbGVu ID0gdW1sZW47CisKKyAgICAgICAgbWFpbl9rZXkgPSBnc3VfZXh0LT5rZXk7CisgICAgICAgIG1h aW5fa2V5X2xlbiA9IGdzdV9leHQtPmtleV9sZW47CisKKyAgICAgICAgaWYgKHZhbCkgeworICAg ICAgICAgICAgLyogVW5tZXRhZnkgd2l0aCBleGFjdCB6YWxsb2Mgc2l6ZSAqLworICAgICAgICAg ICAgY2hhciAqdW12YWwgPSB1bm1ldGFmeV96YWxsb2ModmFsLCAmdW1sZW4pOworCisgICAgICAg ICAgICBjb250ZW50ID0gdW12YWw7CisgICAgICAgICAgICBjb250ZW50X2xlbiA9IHVtbGVuOwor CisgICAgICAgICAgICAvKiBIU0VUIG15aHNldCBmaWVsZDEgdmFsdWUgKi8KKyAgICAgICAgICAg IHJlcGx5ID0gcmVkaXNDb21tYW5kKHJjLCAiSFNFVCAlYiAlYiAlYiIsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBtYWluX2tleSwgKHNpemVfdCkgbWFpbl9rZXlfbGVuLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCAoc2l6ZV90KSBrZXlfbGVuLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCwgKHNpemVfdCkgY29udGVudF9s ZW4pOworICAgICAgICAgICAgaWYgKHJlcGx5KQorICAgICAgICAgICAgICAgIGZyZWVSZXBseU9i amVjdChyZXBseSk7CisKKyAgICAgICAgICAgIC8qIEZyZWUgKi8KKyAgICAgICAgICAgIHNldF9s ZW5ndGgodW12YWwsIGNvbnRlbnRfbGVuKTsKKyAgICAgICAgICAgIHpzZnJlZSh1bXZhbCk7Cisg ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXBseSA9IHJlZGlzQ29tbWFuZChyYywgIkhE RUwgJWIgJWIiLCBtYWluX2tleSwgKHNpemVfdCkgbWFpbl9rZXlfbGVuLCBrZXksIChzaXplX3Qp IGtleV9sZW4pOworICAgICAgICAgICAgaWYgKHJlcGx5KQorICAgICAgICAgICAgICAgIGZyZWVS ZXBseU9iamVjdChyZXBseSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGcmVlIGtleSAqLwor ICAgICAgICBzZXRfbGVuZ3RoKHVta2V5LCBrZXlfbGVuKTsKKyAgICAgICAgenNmcmVlKHVta2V5 KTsKKworICAgICAgICBpZiAoIXJldHJ5ICYmIChyYy0+ZXJyICYgKFJFRElTX0VSUl9JTyB8IFJF RElTX0VSUl9FT0YpKSkgeworICAgICAgICAgICAgcmV0cnkgPSAxOworICAgICAgICAgICAgaWYo cmVjb25uZWN0KCZnc3VfZXh0LT5yYywgZ3N1X2V4dC0+cmVkaXNfaG9zdF9wb3J0LCBnc3VfZXh0 LT5wYXNzd29yZCkpCisgICAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgfSBlbHNl IGlmIChyZXRyeSAmJiAocmMtPmVyciAmIChSRURJU19FUlJfSU8gfCBSRURJU19FUlJfRU9GKSkp IHsKKyAgICAgICAgICAgIHp3YXJuKCJBYm9ydGluZyAobm8gY29ubmVjdGlvbikiKTsKKyAgICAg ICAgfQorICAgIH0KK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHJlZGlzX2hzZXRfdW5zZXRm biB7e3sgKi8KKy8qKi8KK3N0YXRpYyB2b2lkCityZWRpc19oc2V0X3Vuc2V0Zm4oUGFyYW0gcG0s IFVOVVNFRChpbnQgdW0pKQoreworICAgIC8qIFNldCB3aXRoIE5VTEwgKi8KKyAgICByZWRpc19o c2V0X3NldGZuKHBtLCBOVUxMKTsKK30KKy8qIH19fSAqLworCisvKioqKioqKioqKioqKioqIEhT RVQgSEFTSCAqKioqKioqKioqKioqKiovCisKKy8qIEZVTkNUSU9OOiByZWRpc19oc2V0X2dldF9u b2RlIHt7eyAqLworLyoqLworc3RhdGljIEhhc2hOb2RlCityZWRpc19oc2V0X2dldF9ub2RlKEhh c2hUYWJsZSBodCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBIYXNoTm9kZSBobiA9IGdldGhh c2hub2RlMihodCwgbmFtZSk7CisgICAgUGFyYW0gdmFsX3BtID0gKFBhcmFtKSBobjsKKworICAg IC8qIEVudHJ5IGZvciBrZXkgZG9lc24ndCBleGlzdD8gQ3JlYXRlIGl0IG5vdywKKyAgICAgKiBp dCB3aWxsIGJlIGludGVyZmFjaW5nIGJldHdlZW4gdGhlIGRhdGFiYXNlCisgICAgICogYW5kIFpz aCAtIHRocm91Z2ggc3BlY2lhbCBnc3UuIFNvLCBhbnkgc2VlbgorICAgICAqIGtleSByZXN1bHRz IGluIG5ldyBpbnRlcmZhY2luZyBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBBZGQgdGhlIFBh cmFtIHRvIGl0cyBoYXNoLCBpdCBpcyBub3QgUE1fVVBUT0RBVEUuCisgICAgICogSXQgd2lsbCBi ZSBsb2FkZWQgZnJvbSBkYXRhYmFzZSAqYW5kIGZpbGxlZCoKKyAgICAgKiBvciBsZWZ0IGluIHRo YXQgc3RhdGUgaWYgdGhlIGRhdGFiYXNlIGRvZXNuJ3QKKyAgICAgKiBjb250YWluIGl0LgorICAg ICAqLworCisgICAgaWYgKCF2YWxfcG0pIHsKKyAgICAgICAgdmFsX3BtID0gKFBhcmFtKSB6c2hj YWxsb2Moc2l6ZW9mICgqdmFsX3BtKSk7CisgICAgICAgIHZhbF9wbS0+bm9kZS5mbGFncyA9IFBN X1NDQUxBUiB8IFBNX0hBU0hFTEVNOyAvKiBubyBQTV9VUFRPREFURSAqLworICAgICAgICB2YWxf cG0tPmdzdS5zID0gKEdzdVNjYWxhcikgaHQtPnRtcGRhdGE7CisgICAgICAgIGh0LT5hZGRub2Rl KGh0LCB6dHJkdXAobmFtZSksIHZhbF9wbSk7IC8vIHNldHMgcG0tPm5vZGUubmFtCisgICAgfQor CisgICAgcmV0dXJuIChIYXNoTm9kZSkgdmFsX3BtOworfQorLyogfX19ICovCisvKiBGVU5DVElP TjogaHNldF9zY2FuX2tleXMge3t7ICovCisvKiovCitzdGF0aWMgdm9pZAoraHNldF9zY2FuX2tl eXMoSGFzaFRhYmxlIGh0LCBTY2FuRnVuYyBmdW5jLCBpbnQgZmxhZ3MpCit7CisgICAgY2hhciAq bWFpbl9rZXksICprZXk7CisgICAgc2l6ZV90IG1haW5fa2V5X2xlbiwga2V5X2xlbjsKKyAgICB1 bnNpZ25lZCBsb25nIGxvbmcgY3Vyc29yID0gMDsKKyAgICByZWRpc0NvbnRleHQgKnJjOworICAg IHJlZGlzUmVwbHkgKnJlcGx5LCAqcmVwbHkyOworICAgIHN0cnVjdCBnc3Vfc2NhbGFyX2V4dCAq Z3N1X2V4dDsKKworICAgIGdzdV9leHQgPSAoc3RydWN0IGdzdV9zY2FsYXJfZXh0ICopIGh0LT50 bXBkYXRhOworICAgIG1haW5fa2V5ID0gZ3N1X2V4dC0+a2V5OworICAgIG1haW5fa2V5X2xlbiA9 IGdzdV9leHQtPmtleV9sZW47CisKKyAgICAvKiBJdGVyYXRlIGtleXMgYWRkaW5nIHRoZW0gdG8g aGFzaCwgc28gd2UgaGF2ZSBQYXJhbSB0byB1c2UgaW4gYGZ1bmNgICovCisgICAgZG8geworICAg ICAgICBpbnQgcmV0cnkgPSAwOworICAgIHJldHJ5OgorICAgICAgICByYyA9IGdzdV9leHQtPnJj OworCisgICAgICAgIGlmICghcmMpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmVw bHkgPSByZWRpc0NvbW1hbmQocmMsICJIU0NBTiAlYiAlbGx1IiwgbWFpbl9rZXksIChzaXplX3Qp IG1haW5fa2V5X2xlbiwgY3Vyc29yKTsKKworCisgICAgICAgIC8qIERpc2Nvbm5lY3QgZGV0ZWN0 aW9uICovCisgICAgICAgIGlmIChyYy0+ZXJyICYgKFJFRElTX0VSUl9JTyB8IFJFRElTX0VSUl9F T0YpKSB7CisgICAgICAgICAgICBpZiAocmVwbHkpCisgICAgICAgICAgICAgICAgZnJlZVJlcGx5 T2JqZWN0KHJlcGx5KTsKKyAgICAgICAgICAgIGlmIChyZXRyeSkgeworICAgICAgICAgICAgICAg IHp3YXJuKCJBYm9ydGluZyAobm90IGNvbm5lY3RlZCkiKTsKKyAgICAgICAgICAgICAgICBicmVh azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHJ5ID0gMTsKKyAgICAgICAgICAgIGlm KHJlY29ubmVjdCgmZ3N1X2V4dC0+cmMsIGdzdV9leHQtPnJlZGlzX2hvc3RfcG9ydCwgZ3N1X2V4 dC0+cGFzc3dvcmQpKQorICAgICAgICAgICAgICAgIC8vIFRoZSBzYW1lIGN1cnNvcgorICAgICAg ICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg YnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVwbHkgPT0gTlVMTCB8fCByZXBseS0+ dHlwZSAhPSBSRURJU19SRVBMWV9BUlJBWSB8fCByZXBseS0+ZWxlbWVudHMgIT0gMikgeworICAg ICAgICAgICAgaWYgKHJlcGx5ICYmIHJlcGx5LT50eXBlID09IFJFRElTX1JFUExZX0VSUk9SKSB7 CisgICAgICAgICAgICAgICAgendhcm4oIkFib3J0aW5nLCBwcm9ibGVtIG9jY3VyZWQgZHVyaW5n IEhTQ0FOOiAlcyIsIHJlcGx5LT5zdHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg ICAgICAgICB6d2FybigiUHJvYmxlbSBvY2N1cmVkIGR1cmluZyBIU0NBTiwgbm8gZXJyb3IgbWVz c2FnZSBhdmFpbGFibGUsIGFib3J0aW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBp ZiAocmVwbHkpCisgICAgICAgICAgICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsKKyAgICAg ICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IG5ldyBjdXJzb3IgKi8K KyAgICAgICAgaWYgKHJlcGx5LT5lbGVtZW50WzBdLT50eXBlID09IFJFRElTX1JFUExZX1NUUklO RykgeworICAgICAgICAgICAgY3Vyc29yID0gc3RydG91bGwocmVwbHktPmVsZW1lbnRbMF0tPnN0 ciwgTlVMTCwgMTApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgendhcm4oIkVycm9y IDIgb2NjdXJlZCBkdXJpbmcgSFNDQU4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9 CisKKyAgICAgICAgcmVwbHkyID0gcmVwbHktPmVsZW1lbnRbMV07CisgICAgICAgIGlmIChyZXBs eTIgPT0gTlVMTCB8fCByZXBseTItPnR5cGUgIT0gUkVESVNfUkVQTFlfQVJSQVkpIHsKKyAgICAg ICAgICAgIHp3YXJuKCJFcnJvciAzIG9jY3VyZWQgZHVyaW5nIEhTQ0FOIik7CisgICAgICAgICAg ICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVw bHkyLT5lbGVtZW50czsgais9IDIpIHsKKyAgICAgICAgICAgIHJlZGlzUmVwbHkgKmVudHJ5ID0g cmVwbHkyLT5lbGVtZW50W2pdOworICAgICAgICAgICAgaWYgKGVudHJ5ID09IE5VTEwgfHwgZW50 cnktPnR5cGUgIT0gUkVESVNfUkVQTFlfU1RSSU5HKSB7CisgICAgICAgICAgICAgICAgY29udGlu dWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGtleSA9IGVudHJ5LT5zdHI7CisgICAg ICAgICAgICBrZXlfbGVuID0gZW50cnktPmxlbjsKKworICAgICAgICAgICAgLyogVGhpcyByZXR1 cm5zIGRhdGFiYXNlLWludGVyZmFjaW5nIFBhcmFtLAorICAgICAgICAgICAgICogaXQgd2lsbCBy ZXR1cm4gdS5zdHIgb3IgZmlyc3QgZmV0Y2ggZGF0YQorICAgICAgICAgICAgICogaWYgbm90IFBN X1VQVE9EQVRFIChuZXdseSBjcmVhdGVkKSAqLworICAgICAgICAgICAgY2hhciAqemtleSA9IG1l dGFmeShrZXksIGtleV9sZW4sIE1FVEFfRFVQKTsKKyAgICAgICAgICAgIEhhc2hOb2RlIGhuID0g cmVkaXNfaHNldF9nZXRfbm9kZShodCwgemtleSk7CisgICAgICAgICAgICB6c2ZyZWUoemtleSk7 CisKKyAgICAgICAgICAgIGZ1bmMoaG4sIGZsYWdzKTsKKyAgICAgICAgfQorICAgICAgICBmcmVl UmVwbHlPYmplY3QocmVwbHkpOworICAgIH0gd2hpbGUgKGN1cnNvciAhPSAwKTsKK30KKy8qIH19 fSAqLworLyogRlVOQ1RJT046IHJlZGlzX2hhc2hfaHNldF9zZXRmbiB7e3sgKi8KKworLyoKKyAq IFJlcGxhY2UgZGF0YWJhc2Ugd2l0aCBuZXcgaGFzaAorICovCisKKy8qKi8KK3N0YXRpYyB2b2lk CityZWRpc19oYXNoX2hzZXRfc2V0Zm4oUGFyYW0gcG0sIEhhc2hUYWJsZSBodCkKK3sKKyAgICBI YXNoTm9kZSBobjsKKyAgICBjaGFyICptYWluX2tleSwgKmtleSwgKmNvbnRlbnQ7CisgICAgc2l6 ZV90IG1haW5fa2V5X2xlbiwga2V5X2xlbiwgY29udGVudF9sZW4sIGk7CisgICAgcmVkaXNDb250 ZXh0ICpyYzsKKyAgICByZWRpc1JlcGx5ICpyZXBseSwgKnJlcGx5MiwgKmVudHJ5OworICAgIHN0 cnVjdCBnc3Vfc2NhbGFyX2V4dCAqZ3N1X2V4dDsKKworICAgIGlmICghcG0tPnUuaGFzaCB8fCBw bS0+dS5oYXNoID09IGh0KQorICAgICAgICByZXR1cm47CisKKyAgICBnc3VfZXh0ID0gKHN0cnVj dCBnc3Vfc2NhbGFyX2V4dCAqKSBwbS0+dS5oYXNoLT50bXBkYXRhOworCisgICAgaW50IHJldHJ5 ID0gMDsKKyByZXRyeToKKyAgICByYyA9IGdzdV9leHQtPnJjOworICAgIGlmICghcmMpIHsKKyAg ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1haW5fa2V5ID0gZ3N1X2V4dC0+a2V5OworICAg IG1haW5fa2V5X2xlbiA9IGdzdV9leHQtPmtleV9sZW47CisKKyAgICAvKiBQUlVORSAqLworICAg IHJlcGx5ID0gcmVkaXNDb21tYW5kKHJjLCAiSEtFWVMgJWIiLCBtYWluX2tleSwgKHNpemVfdCkg bWFpbl9rZXlfbGVuKTsKKyAgICBpZiAocmVwbHkgPT0gTlVMTCB8fCByZXBseS0+dHlwZSAhPSBS RURJU19SRVBMWV9BUlJBWSkgeworICAgICAgICB6d2FybigiRXJyb3IgNSBvY2N1cmVkIChyZWRp cyBjb21tdW5pY2F0aW9uKSwgZGF0YWJhc2UgYW5kIHRpZWQgaGFzaCBub3QgdXBkYXRlZCIpOwor ICAgICAgICBpZiAocmVwbHkpIHsKKyAgICAgICAgICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7 CisgICAgICAgICAgICByZXBseSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZ290byBkb19y ZXRyeTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmVwbHktPmVsZW1lbnRzOyBpKysp IHsKKyAgICAgICAgZW50cnkgPSByZXBseS0+ZWxlbWVudFtpXTsKKyAgICAgICAgaWYgKE5VTEwg PT0gZW50cnkgfHwgZW50cnktPnR5cGUgIT0gUkVESVNfUkVQTFlfU1RSSU5HKSB7CisgICAgICAg ICAgICBpZiAoZW50cnkgJiYgZW50cnktPnN0ciAmJiBlbnRyeS0+bGVuID4gMCkgeworICAgICAg ICAgICAgICAgIHp3YXJuKCJFcnJvciA2IHdoZW4gcmVwbGFjaW5nIGRhdGFiYXNlIChlbGVtZW50 ICVkLCBtZXNzYWdlOiAlcykiLCBpKzEsIHJlcGx5Mi0+c3RyKTsKKyAgICAgICAgICAgIH0gZWxz ZSB7CisgICAgICAgICAgICAgICAgendhcm4oIkVycm9yIDYgd2hlbiByZXBsYWNpbmcgZGF0YWJh c2UgKGVsZW1lbnQgJWQpIiwgaSsxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRp bnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogSERFTCBteWhzZXQgbXlmaWVsZCAqLworICAg ICAgICByZXBseTIgPSByZWRpc0NvbW1hbmQocmMsICJIREVMICViICViIiwgbWFpbl9rZXksIChz aXplX3QpIG1haW5fa2V5X2xlbiwgZW50cnktPnN0ciwgKHNpemVfdCkgZW50cnktPmxlbik7Cisg ICAgICAgIGlmIChOVUxMID09IHJlcGx5MiB8fCByZXBseTItPnR5cGUgIT0gUkVESVNfUkVQTFlf SU5URUdFUikgeworICAgICAgICAgICAgendhcm4oIkVycm9yIDcgd2hlbiByZXBsYWNpbmcgZGF0 YWJhc2UiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZyZWVS ZXBseU9iamVjdChyZXBseTIpOworICAgICAgICByZXBseTIgPSBOVUxMOworICAgICAgICBpZiAo cmMtPmVyciAmIChSRURJU19FUlJfSU8gfCBSRURJU19FUlJfRU9GKSkKKyAgICAgICAgICAgIGJy ZWFrOworICAgIH0KKworIGRvX3JldHJ5OgorCisgICAgaWYgKHJlcGx5KSB7CisgICAgICAgIGZy ZWVSZXBseU9iamVjdChyZXBseSk7CisgICAgICAgIHJlcGx5ID0gTlVMTDsKKyAgICB9CisKKyAg ICBpZiAoIXJldHJ5ICYmIChyYy0+ZXJyICYgKFJFRElTX0VSUl9JTyB8IFJFRElTX0VSUl9FT0Yp KSkgeworICAgICAgICByZXRyeSA9IDE7CisgICAgICAgIGlmKHJlY29ubmVjdCgmZ3N1X2V4dC0+ cmMsIGdzdV9leHQtPnJlZGlzX2hvc3RfcG9ydCwgZ3N1X2V4dC0+cGFzc3dvcmQpKQorICAgICAg ICAgICAgZ290byByZXRyeTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuOworICAg IH0gZWxzZSBpZiAocmV0cnkgJiYgKHJjLT5lcnIgJiAoUkVESVNfRVJSX0lPIHwgUkVESVNfRVJS X0VPRikpKSB7CisgICAgICAgIHp3YXJuKCJBYm9ydGluZyAobm8gY29ubmVjdGlvbikiKTsKKyAg ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5vX2RhdGFiYXNlX2FjdGlvbiA9IDE7CisgICAg ZW1wdHloYXNodGFibGUocG0tPnUuaGFzaCk7CisgICAgbm9fZGF0YWJhc2VfYWN0aW9uID0gMDsK KworICAgIGlmICghaHQpCisgICAgICAgIHJldHVybjsKKworICAgICAvKiBQdXQgbmV3IHN0cmlu Z3MgaW50byBkYXRhYmFzZSwgaGF2aW5nCisgICAgICAqIHRoZWlyIGludGVyZmFjaW5nLVBhcmFt cyBjcmVhdGVkICovCisKKyAgICByZXRyeSA9IDA7CisgcmV0cnkyOgorICAgIHJjID0gZ3N1X2V4 dC0+cmM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaHQtPmhzaXplOyBpKyspIHsKKyAgICAgICAg Zm9yIChobiA9IGh0LT5ub2Rlc1tpXTsgaG47IGhuID0gaG4tPm5leHQpIHsKKyAgICAgICAgICAg IHN0cnVjdCB2YWx1ZSB2OworCisgICAgICAgICAgICB2LmlzYXJyID0gdi5mbGFncyA9IHYuc3Rh cnQgPSAwOworICAgICAgICAgICAgdi5lbmQgPSAtMTsKKyAgICAgICAgICAgIHYuYXJyID0gTlVM TDsKKyAgICAgICAgICAgIHYucG0gPSAoUGFyYW0pIGhuOworCisgICAgICAgICAgICAvKiBVbm1l dGFmeSBrZXkgKi8KKyAgICAgICAgICAgIGludCB1bWxlbiA9IDA7CisgICAgICAgICAgICBjaGFy ICp1bWtleSA9IHVubWV0YWZ5X3phbGxvYyh2LnBtLT5ub2RlLm5hbSwgJnVtbGVuKTsKKworICAg ICAgICAgICAga2V5ID0gdW1rZXk7CisgICAgICAgICAgICBrZXlfbGVuID0gdW1sZW47CisKKyAg ICAgICAgICAgIHF1ZXVlX3NpZ25hbHMoKTsKKworICAgICAgICAgICAgLyogVW5tZXRhZnkgZGF0 YSAqLworICAgICAgICAgICAgY2hhciAqdW12YWwgPSB1bm1ldGFmeV96YWxsb2MoZ2V0c3RydmFs dWUoJnYpLCAmdW1sZW4pOworCisgICAgICAgICAgICBjb250ZW50ID0gdW12YWw7CisgICAgICAg ICAgICBjb250ZW50X2xlbiA9IHVtbGVuOworCisgICAgICAgICAgICAvKiBIU0VUIG15aHNldCBl bGVtZW50MSB2YWx1ZSAqLworICAgICAgICAgICAgcmVwbHkgPSByZWRpc0NvbW1hbmQocmMsICJI U0VUICViICViICViIiwgbWFpbl9rZXksIChzaXplX3QpIG1haW5fa2V5X2xlbiwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgKHNpemVfdCkga2V5X2xlbiwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsIChzaXplX3QpIGNvbnRlbnRfbGVuKTsK KyAgICAgICAgICAgIGlmIChyZXBseSkKKyAgICAgICAgICAgICAgICBmcmVlUmVwbHlPYmplY3Qo cmVwbHkpOworCisgICAgICAgICAgICAvKiBGcmVlLCByZXN0b3Jpbmcgb3JpZ2luYWwgbGVuZ3Ro ICovCisgICAgICAgICAgICBzZXRfbGVuZ3RoKHVtdmFsLCBjb250ZW50X2xlbik7CisgICAgICAg ICAgICB6c2ZyZWUodW12YWwpOworICAgICAgICAgICAgc2V0X2xlbmd0aCh1bWtleSwga2V5X2xl bik7CisgICAgICAgICAgICB6c2ZyZWUodW1rZXkpOworCisgICAgICAgICAgICB1bnF1ZXVlX3Np Z25hbHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERpc2Nvbm5lY3QgZGV0ZWN0aW9uICov CisgICAgICAgIGlmICghcmV0cnkgJiYgKHJjLT5lcnIgJiAoUkVESVNfRVJSX0lPIHwgUkVESVNf RVJSX0VPRikpKSB7CisgICAgICAgICAgICByZXRyeSA9IDE7CisgICAgICAgICAgICBpZihyZWNv bm5lY3QoJmdzdV9leHQtPnJjLCBnc3VfZXh0LT5yZWRpc19ob3N0X3BvcnQsIGdzdV9leHQtPnBh c3N3b3JkKSkKKyAgICAgICAgICAgICAgICBnb3RvIHJldHJ5MjsKKyAgICAgICAgICAgIGVsc2UK KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAocmV0cnkgJiYgKHJj LT5lcnIgJiAoUkVESVNfRVJSX0lPIHwgUkVESVNfRVJSX0VPRikpKSB7CisgICAgICAgICAgICB6 d2FybigiQWJvcnRpbmcgKG5vIGNvbm5lY3Rpb24pIik7CisgICAgICAgICAgICByZXR1cm47Cisg ICAgICAgIH0KKyAgICB9Cit9CisvKiB9fX0gKi8KKy8qIEZVTkNUSU9OOiByZWRpc19oYXNoX2hz ZXRfdW5zZXRmbiB7e3sgKi8KKy8qKi8KK3N0YXRpYyB2b2lkCityZWRpc19oYXNoX2hzZXRfdW5z ZXRmbihQYXJhbSBwbSwgVU5VU0VEKGludCBleHApKQoreworICAgIC8qIFRoaXMgd2lsbCBtYWtl IGRhdGFiYXNlIGNvbnRlbnRzIHN1cnZpdmUgdGhlCisgICAgICogdW5zZXQsIGFzIHN0YW5kYXJk IEdTVSB3aWxsIGJlIHB1dCBpbiBwbGFjZSAqLworICAgIHJlZGlzX2hhc2hfaHNldF91bnRpZShw bSk7CisKKyAgICAvKiBSZW1lbWJlciBjdXN0b20gR1NVIHN0cnVjdHVyZSBhc3NpZ25lZCB0bwor ICAgICAqIHUuaGFzaC0+dG1wZGF0YSBiZWZvcmUgaGFzaCBnZXRzIGRlbGV0ZWQgKi8KKyAgICBz dHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKiBnc3VfZXh0ID0gcG0tPnUuaGFzaC0+dG1wZGF0YTsKKwor ICAgIC8qIFVzZXMgbm9ybWFsIHVuc2V0dGVyLiBXaWxsIGRlbGV0ZSBhbGwgb3duZWQKKyAgICAg KiBwYXJhbWV0ZXJzIGFuZCBhbHNvIGhhc2h0YWJsZS4gKi8KKyAgICBwbS0+Z3N1LmgtPnNldGZu KHBtLCBOVUxMKTsKKworICAgIC8qIERvbid0IG5lZWQgY3VzdG9tIEdTVSBzdHJ1Y3R1cmUgd2l0 aCBpdHMKKyAgICAgKiByZWRpc0NvbnRleHQgcG9pbnRlciBhbnltb3JlICovCisgICAgenNmcmVl KGdzdV9leHQtPnJlZGlzX2hvc3RfcG9ydCk7CisgICAgaWYgKGdzdV9leHQtPnBhc3N3b3JkKQor ICAgICAgICB6c2ZyZWUoZ3N1X2V4dC0+cGFzc3dvcmQpOworICAgIHpzZnJlZShnc3VfZXh0LT5r ZXkpOworICAgIHpmcmVlKGdzdV9leHQsIHNpemVvZihzdHJ1Y3QgZ3N1X3NjYWxhcl9leHQpKTsK KworICAgIHBtLT5ub2RlLmZsYWdzIHw9IFBNX1VOU0VUOworfQorLyogfX19ICovCisvKiBGVU5D VElPTjogcmVkaXNfaGFzaF9oc2V0X3VudGllIHt7eyAqLworLyoqLworc3RhdGljIHZvaWQKK3Jl ZGlzX2hhc2hfaHNldF91bnRpZShQYXJhbSBwbSkKK3sKKyAgICByZWRpc0NvbnRleHQgKnJjID0g KChzdHJ1Y3QgZ3N1X3NjYWxhcl9leHQgKilwbS0+dS5oYXNoLT50bXBkYXRhKS0+cmM7CisgICAg SGFzaFRhYmxlIGh0ID0gcG0tPnUuaGFzaDsKKworICAgIGlmIChyYykgeyAvKiBwYXJhbm9pYSAq LworICAgICAgICByZWRpc0ZyZWUocmMpOworCisgICAgICAgIC8qIExldCBoYXNoIGZpZWxkcyBr bm93IHRoZXJlJ3Mgbm8gYmFja2VuZCAqLworICAgICAgICAoKHN0cnVjdCBnc3Vfc2NhbGFyX2V4 dCAqKWh0LT50bXBkYXRhKS0+cmMgPSBOVUxMOworCisgICAgICAgIC8qIFJlbW92ZSBmcm9tIGxp c3Qgb2YgdGllZCBwYXJhbWV0ZXJzICovCisgICAgICAgIHJlbW92ZV90aWVkX25hbWUocG0tPm5v ZGUubmFtKTsKKyAgICB9CisKKyAgICAvKiBmb3IgY29tcGxldGVuZXNzIC4uLiBjcmVhdGVzcGVj aWFsaGFzaCgpIHNob3VsZCBoYXZlIGFuIGludmVyc2UgKi8KKyAgICBodC0+Z2V0bm9kZSA9IGh0 LT5nZXRub2RlMiA9IGdldGhhc2hub2RlMjsKKyAgICBodC0+c2NhbnRhYiA9IE5VTEw7CisKKyAg ICBwbS0+bm9kZS5mbGFncyAmPSB+KFBNX1NQRUNJQUx8UE1fUkVBRE9OTFkpOworICAgIHBtLT5n c3UuaCA9ICZzdGRoYXNoX2dzdTsKK30KKy8qIH19fSAqLworCisvKioqKioqKioqKioqKioqKioq IExJU1QgKioqKioqKioqKioqKioqKiovCisKKy8qIEZVTkNUSU9OOiByZWRpc19hcnJsaXN0X2dl dGZuIHt7eyAqLworCisvKiovCitjaGFyICoqCityZWRpc19hcnJsaXN0X2dldGZuKFBhcmFtIHBt KQoreworICAgIHN0cnVjdCBnc3VfYXJyYXlfZXh0ICpnc3VfZXh0OworICAgIGNoYXIgKmtleTsK KyAgICBzaXplX3Qga2V5X2xlbjsKKyAgICByZWRpc0NvbnRleHQgKnJjOworICAgIHJlZGlzUmVw bHkgKnJlcGx5OworICAgIGludCBqOworCisgICAgZ3N1X2V4dCA9IChzdHJ1Y3QgZ3N1X2FycmF5 X2V4dCAqKSBwbS0+Z3N1LmE7CisgICAgLyogS2V5IGFscmVhZHkgcmV0cmlldmVkPyAqLworICAg IGlmICgocG0tPm5vZGUuZmxhZ3MgJiBQTV9VUFRPREFURSkgJiYgZ3N1X2V4dC0+dXNlX2NhY2hl KSB7CisgICAgICAgIHJldHVybiBwbS0+dS5hcnIgPyBwbS0+dS5hcnIgOiAmbXlfbnVsbGFycmF5 OworICAgIH0KKworICAgIGtleSA9IGdzdV9leHQtPmtleTsKKyAgICBrZXlfbGVuID0gZ3N1X2V4 dC0+a2V5X2xlbjsKKworICAgIGludCByZXRyeSA9IDA7CisgcmV0cnk6CisgICAgcmMgPSBnc3Vf ZXh0LT5yYzsKKworICAgIGlmICghcmMpCisgICAgICAgIHJldHVybiAmbXlfbnVsbGFycmF5Owor CisgICAgcmVwbHkgPSByZWRpc0NvbW1hbmQocmMsICJFWElTVFMgJWIiLCBrZXksIChzaXplX3Qp IGtleV9sZW4pOworICAgIGlmIChyZXBseSAmJiByZXBseS0+dHlwZSA9PSBSRURJU19SRVBMWV9J TlRFR0VSICYmIHJlcGx5LT5pbnRlZ2VyID09IDEpIHsKKyAgICAgICAgZnJlZVJlcGx5T2JqZWN0 KHJlcGx5KTsKKyAgICAgICAgcmVwbHkgPSBOVUxMOworCisgICAgICAgIHJlcGx5ID0gcmVkaXND b21tYW5kKHJjLCAiTFJBTkdFICViIDAgLTEiLCBrZXksIChzaXplX3QpIGtleV9sZW4pOworICAg ICAgICBpZiAocmVwbHkgJiYgcmVwbHktPnR5cGUgPT0gUkVESVNfUkVQTFlfQVJSQVkpIHsKKyAg ICAgICAgICAgIC8qIFdlIGhhdmUgZGF0YSDigJMgc3RvcmUgaXQgYW5kIHJldHVybiBpdCAqLwor ICAgICAgICAgICAgcG0tPm5vZGUuZmxhZ3MgfD0gUE1fVVBUT0RBVEU7CisKKyAgICAgICAgICAg IC8qIEVuc3VyZSB0aGVyZSdzIG5vIGxlYWsgKi8KKyAgICAgICAgICAgIGlmIChwbS0+dS5hcnIp IHsKKyAgICAgICAgICAgICAgICBmcmVlYXJyYXkocG0tPnUuYXJyKTsKKyAgICAgICAgICAgICAg ICBwbS0+dS5hcnIgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwbS0+dS5h cnIgPSB6YWxsb2MoKHJlcGx5LT5lbGVtZW50cyArIDEpICogc2l6ZW9mKGNoYXIqKSk7CisKKyAg ICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByZXBseS0+ZWxlbWVudHM7IGorKykgeworICAgICAg ICAgICAgICAgIGlmIChOVUxMID09IHJlcGx5LT5lbGVtZW50W2pdKSB7CisgICAgICAgICAgICAg ICAgICAgIHBtLT51LmFycltqXSA9IHp0cmR1cCgiIik7CisgICAgICAgICAgICAgICAgICAgIHp3 YXJuKCJFcnJvciA4IHdoZW4gZmV0Y2hpbmcgZWxlbWVudHMiKTsKKyAgICAgICAgICAgICAgICAg ICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXBseS0+ZWxlbWVudFtq XS0+dHlwZSAhPSBSRURJU19SRVBMWV9TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgcG0t PnUuYXJyW2pdID0genRyZHVwKCIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0g cmVwbHktPmVsZW1lbnRbal0tPnN0ciAmJiByZXBseS0+ZWxlbWVudFtqXS0+bGVuID4gMCkgewor ICAgICAgICAgICAgICAgICAgICAgICAgendhcm4oIkVycm9yIDkgd2hlbiBmZXRjaGluZyBlbGVt ZW50cyAobWVzc2FnZTogJXMpIiwgcmVwbHktPmVsZW1lbnRbal0tPnN0cik7CisgICAgICAgICAg ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB6d2FybigiRXJyb3Ig OSB3aGVuIGZldGNoaW5nIGVsZW1lbnRzIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg ICAgIC8qIE1ldGFmeSByZXR1cm5lZCBkYXRhLiBBbGwgZml0cyAtIG1ldGFmeQorICAgICAgICAg ICAgICAgICAqIGNhbiBvYnRhaW4gZGF0YSBsZW5ndGggdG8gYXZvaWQgdXNpbmcgXDAgKi8KKyAg ICAgICAgICAgICAgICBwbS0+dS5hcnJbal0gPSBtZXRhZnkocmVwbHktPmVsZW1lbnRbal0tPnN0 ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHktPmVsZW1lbnRb al0tPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUQV9EVVAp OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG0tPnUuYXJyW3JlcGx5LT5lbGVtZW50c10g PSBOVUxMOworCisgICAgICAgICAgICBmcmVlUmVwbHlPYmplY3QocmVwbHkpOworICAgICAgICAg ICAgcmVwbHkgPSBOVUxMOworCisgICAgICAgICAgICAvKiBDYW4gcmV0dXJuIHBvaW50ZXIsIGNv cnJlY3RseSBzYXZlZCBpbnNpZGUgUGFyYW0gKi8KKyAgICAgICAgICAgIHJldHVybiBwbS0+dS5h cnI7CisgICAgICAgIH0gZWxzZSBpZiAocmVwbHkpIHsKKyAgICAgICAgICAgIGZyZWVSZXBseU9i amVjdChyZXBseSk7CisgICAgICAgICAgICByZXBseSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9 IGVsc2UgaWYgKHJlcGx5KSB7CisgICAgICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7CisgICAg ICAgIHJlcGx5ID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBEaXNjb25uZWN0IGRldGVjdGlvbiAq LworICAgIGlmIChyYy0+ZXJyICYgKFJFRElTX0VSUl9JTyB8IFJFRElTX0VSUl9FT0YpKSB7Cisg ICAgICAgIGlmIChyZXBseSkgeworICAgICAgICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsK KyAgICAgICAgICAgIHJlcGx5ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0cnkp IHsKKyAgICAgICAgICAgIHp3YXJuKCJBYm9ydGluZyAobm8gY29ubmVjdGlvbikiKTsKKyAgICAg ICAgICAgIHJldHVybiAmbXlfbnVsbGFycmF5OworICAgICAgICB9CisgICAgICAgIHJldHJ5ID0g MTsKKyAgICAgICAgaWYocmVjb25uZWN0KCZnc3VfZXh0LT5yYywgZ3N1X2V4dC0+cmVkaXNfaG9z dF9wb3J0LCBnc3VfZXh0LT5wYXNzd29yZCkpCisgICAgICAgICAgICBnb3RvIHJldHJ5OworICAg IH0KKworICAgIC8qIEFycmF5IHdpdGggMCBlbGVtZW50cyAqLworICAgIHJldHVybiAmbXlfbnVs bGFycmF5OworfQorLyogfX19ICovCisvKiBGVU5DVElPTjogcmVkaXNfYXJybGlzdF9zZXRmbiB7 e3sgKi8KKy8qKi8KK21vZF9leHBvcnQgdm9pZAorcmVkaXNfYXJybGlzdF9zZXRmbihQYXJhbSBw bSwgY2hhciAqKnZhbCkKK3sKKyAgICBjaGFyICprZXksICpjb250ZW50OworICAgIHNpemVfdCBr ZXlfbGVuLCBjb250ZW50X2xlbjsKKyAgICBpbnQgYWxlbiA9IDAsIGo7CisgICAgcmVkaXNDb250 ZXh0ICpyYzsKKyAgICByZWRpc1JlcGx5ICpyZXBseTsKKworICAgIC8qIFNldCBpcyBkb25lIG9u IHBhcmFtZXRlciBhbmQgb24gZGF0YWJhc2UuICovCisKKyAgICAvKiBQYXJhbWV0ZXIgKi8KKyAg ICBpZiAocG0tPnUuYXJyICYmIHBtLT51LmFyciAhPSB2YWwpIHsKKyAgICAgICAgZnJlZWFycmF5 KHBtLT51LmFycik7CisgICAgICAgIHBtLT51LmFyciA9IE5VTEw7CisgICAgICAgIHBtLT5ub2Rl LmZsYWdzICY9IH4oUE1fVVBUT0RBVEUpOworICAgIH0KKworICAgIGlmICh2YWwpIHsKKyAgICAg ICAgYWxlbiA9IGFycmxlbih2YWwpOworICAgICAgICBwbS0+dS5hcnIgPSB2YWw7CisgICAgICAg IHBtLT5ub2RlLmZsYWdzIHw9IFBNX1VQVE9EQVRFOworICAgIH0KKworICAgIC8qIERhdGFiYXNl ICovCisgICAgc3RydWN0IGdzdV9hcnJheV9leHQgKmdzdV9leHQgPSAoc3RydWN0IGdzdV9hcnJh eV9leHQgKikgcG0tPmdzdS5hOworICAgIHJjID0gZ3N1X2V4dC0+cmM7CisgICAga2V5ID0gZ3N1 X2V4dC0+a2V5OworICAgIGtleV9sZW4gPSBnc3VfZXh0LT5rZXlfbGVuOworCisgICAgaWYgKHJj KSB7CisgICAgICAgIGludCByZXRyeSA9IDA7CisgICAgcmV0cnk6CisgICAgICAgIHJjID0gZ3N1 X2V4dC0+cmM7CisKKyAgICAgICAgaWYgKCFyYykKKyAgICAgICAgICAgIHJldHVybjsKKworICAg ICAgICByZXBseSA9IHJlZGlzQ29tbWFuZChyYywgIkRFTCAlYiIsIGtleSwgKHNpemVfdCkga2V5 X2xlbik7CisgICAgICAgIGlmIChyZXBseSkgeworICAgICAgICAgICAgZnJlZVJlcGx5T2JqZWN0 KHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5ID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAg IC8qIERpc2Nvbm5lY3QgZGV0ZWN0aW9uICovCisgICAgICAgIGlmIChyYy0+ZXJyICYgKFJFRElT X0VSUl9JTyB8IFJFRElTX0VSUl9FT0YpKSB7CisgICAgICAgICAgICBpZiAocmV0cnkpIHsKKyAg ICAgICAgICAgICAgICB6d2FybigiQWJvcnRpbmcgKG5vIGNvbm5lY3Rpb24pIik7CisgICAgICAg ICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0cnkgPSAxOwor ICAgICAgICAgICAgaWYocmVjb25uZWN0KCZnc3VfZXh0LT5yYywgZ3N1X2V4dC0+cmVkaXNfaG9z dF9wb3J0LCBnc3VfZXh0LT5wYXNzd29yZCkpCisgICAgICAgICAgICAgICAgZ290byByZXRyeTsK KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwor ICAgICAgICBpZiAodmFsKSB7CisgICAgICAgICAgICBmb3IgKGo9MDsgajxhbGVuOyBqICsrKSB7 CisgICAgICAgICAgICAgICAgLyogVW5tZXRhZnkgd2l0aCBleGFjdCB6YWxsb2Mgc2l6ZSAqLwor ICAgICAgICAgICAgICAgIGludCB1bWxlbiA9IDA7CisgICAgICAgICAgICAgICAgY2hhciAqdW12 YWwgPSB1bm1ldGFmeV96YWxsb2ModmFsW2pdLCAmdW1sZW4pOworCisgICAgICAgICAgICAgICAg LyogU3RvcmUgKi8KKyAgICAgICAgICAgICAgICBjb250ZW50ID0gdW12YWw7CisgICAgICAgICAg ICAgICAgY29udGVudF9sZW4gPSB1bWxlbjsKKyAgICAgICAgICAgICAgICByZXBseSA9IHJlZGlz Q29tbWFuZChyYywgIlJQVVNIICViICViIiwga2V5LCAoc2l6ZV90KSBrZXlfbGVuLCBjb250ZW50 LCAoc2l6ZV90KSBjb250ZW50X2xlbik7CisgICAgICAgICAgICAgICAgaWYgKHJlcGx5KSB7Cisg ICAgICAgICAgICAgICAgICAgIGZyZWVSZXBseU9iamVjdChyZXBseSk7CisgICAgICAgICAgICAg ICAgICAgIHJlcGx5ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg aWYgKHJjLT5lcnIgJiAoUkVESVNfRVJSX0lPIHwgUkVESVNfRVJSX0VPRikpIHsKKyAgICAgICAg ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg LyogRnJlZSAqLworICAgICAgICAgICAgICAgIHNldF9sZW5ndGgodW12YWwsIHVtbGVuKTsKKyAg ICAgICAgICAgICAgICB6c2ZyZWUodW12YWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAg ICAvKiBEaXNjb25uZWN0IGRldGVjdGlvbiAqLworICAgICAgICAgICAgaWYgKHJjLT5lcnIgJiAo UkVESVNfRVJSX0lPIHwgUkVESVNfRVJSX0VPRikpIHsKKyAgICAgICAgICAgICAgICBpZiAocmV0 cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgendhcm4oIkFib3J0aW5nIChubyBjb25uZWN0aW9u KSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAg ICAgICAgICAgICAgIHJldHJ5ID0gMTsKKyAgICAgICAgICAgICAgICBpZihyZWNvbm5lY3QoJmdz dV9leHQtPnJjLCBnc3VfZXh0LT5yZWRpc19ob3N0X3BvcnQsIGdzdV9leHQtPnBhc3N3b3JkKSkK KyAgICAgICAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg fQorICAgIH0KKworICAgIGlmIChwbS0+ZW5hbWUgJiYgdmFsKQorICAgICAgICBhcnJmaXhlbnYo cG0tPmVuYW1lLCB2YWwpOworfQorLyogfX19ICovCisvKiBGVU5DVElPTjogcmVkaXNfYXJybGlz dF91bnNldGZuIHt7eyAqLworLyoqLworbW9kX2V4cG9ydCB2b2lkCityZWRpc19hcnJsaXN0X3Vu c2V0Zm4oUGFyYW0gcG0sIFVOVVNFRChpbnQgZXhwKSkKK3sKKyAgICAvKiBXaWxsIGNsZWFyIHRo ZSBkYXRhYmFzZSAqLworICAgIHJlZGlzX2Fycmxpc3Rfc2V0Zm4ocG0sIE5VTEwpOworCisgICAg LyogV2lsbCBkZXRhY2ggZnJvbSBkYXRhYmFzZSBhbmQgZnJlZSBjdXN0b20gbWVtb3J5ICovCisg ICAgcmVkaXNfYXJybGlzdF91bnRpZShwbSk7CisKKyAgICBwbS0+bm9kZS5mbGFncyB8PSBQTV9V TlNFVDsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHJlZGlzX2Fycmxpc3RfdW50aWUge3t7 ICovCisvKiovCitzdGF0aWMgdm9pZAorcmVkaXNfYXJybGlzdF91bnRpZShQYXJhbSBwbSkKK3sK KyAgICBzdHJ1Y3QgZ3N1X2FycmF5X2V4dCAqZ3N1X2V4dCA9IChzdHJ1Y3QgZ3N1X2FycmF5X2V4 dCAqKSBwbS0+Z3N1LmE7CisKKyAgICBpZiAoZ3N1X2V4dC0+cmMpIC8qIHBhcmFub2lhICovCisg ICAgICAgIHJlZGlzRnJlZShnc3VfZXh0LT5yYyk7CisKKyAgICAvKiBSZW1vdmUgZnJvbSBsaXN0 IG9mIHRpZWQgcGFyYW1ldGVycyAqLworICAgIHJlbW92ZV90aWVkX25hbWUocG0tPm5vZGUubmFt KTsKKworICAgIHBtLT5ub2RlLmZsYWdzICY9IH4oUE1fU1BFQ0lBTHxQTV9SRUFET05MWSk7Cisg ICAgcG0tPmdzdS5hID0gJnN0ZGFycmF5X2dzdTsKKworICAgIC8qIEZyZWUgZ3N1X2V4dCAqLwor ICAgIHpzZnJlZShnc3VfZXh0LT5yZWRpc19ob3N0X3BvcnQpOworICAgIGlmIChnc3VfZXh0LT5w YXNzd29yZCkKKyAgICAgICAgenNmcmVlKGdzdV9leHQtPnBhc3N3b3JkKTsKKyAgICB6c2ZyZWUo Z3N1X2V4dC0+a2V5KTsKKyAgICB6ZnJlZShnc3VfZXh0LCBzaXplb2Yoc3RydWN0IGdzdV9hcnJh eV9leHQpKTsKK30KKy8qIH19fSAqLworCisvKioqKioqKioqKioqKioqIE1BSU4gQ09ERSAqKioq KioqKioqKioqKiovCisKKy8qIEFSUkFZIGZlYXR1cmVzIHt7eyAqLworc3RhdGljIHN0cnVjdCBm ZWF0dXJlcyBtb2R1bGVfZmVhdHVyZXMgPSB7CisgICAgYmludGFiLCBzaXplb2YoYmludGFiKS9z aXplb2YoKmJpbnRhYiksCisgICAgTlVMTCwgMCwKKyAgICBOVUxMLCAwLAorICAgIHBhdGFiLCBz aXplb2YocGF0YWIpL3NpemVvZigqcGF0YWIpLAorICAgIDAKK307CisvKiB9fX0gKi8KKworLyog RlVOQ1RJT046IHNldHVwXyB7e3sgKi8KKy8qKi8KK2ludAorc2V0dXBfKFVOVVNFRChNb2R1bGUg bSkpCit7CisgICAgcmV0dXJuIDA7Cit9CisvKiB9fX0gKi8KKy8qIEZVTkNUSU9OOiBmZWF0dXJl c18ge3t7ICovCisvKiovCitpbnQKK2ZlYXR1cmVzXyhNb2R1bGUgbSwgY2hhciAqKipmZWF0dXJl cykKK3sKKyAgICAqZmVhdHVyZXMgPSBmZWF0dXJlc2FycmF5KG0sICZtb2R1bGVfZmVhdHVyZXMp OworICAgIHJldHVybiAwOworfQorLyogfX19ICovCisvKiBGVU5DVElPTjogZW5hYmxlc18ge3t7 ICovCisvKiovCitpbnQKK2VuYWJsZXNfKE1vZHVsZSBtLCBpbnQgKiplbmFibGVzKQoreworICAg IHJldHVybiBoYW5kbGVmZWF0dXJlcyhtLCAmbW9kdWxlX2ZlYXR1cmVzLCBlbmFibGVzKTsKK30K Ky8qIH19fSAqLworLyogRlVOQ1RJT046IGJvb3RfIHt7eyAqLworLyoqLworaW50Citib290XyhV TlVTRUQoTW9kdWxlIG0pKQoreworICAgIHpyZWRpc190aWVkID0genNoY2FsbG9jKCgxKSAqIHNp emVvZihjaGFyICopKTsKKyAgICByZXR1cm4gMDsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046 IGNsZWFudXBfIHt7eyAqLworLyoqLworaW50CitjbGVhbnVwXyhNb2R1bGUgbSkKK3sKKyAgICAv KiBUaGlzIGZyZWVzIGB6cmVkaXNfdGllZGAgKi8KKyAgICByZXR1cm4gc2V0ZmVhdHVyZWVuYWJs ZXMobSwgJm1vZHVsZV9mZWF0dXJlcywgTlVMTCk7Cit9CisvKiB9fX0gKi8KKy8qIEZVTkNUSU9O OiBmaW5pc2hfIHt7eyAqLworLyoqLworaW50CitmaW5pc2hfKFVOVVNFRChNb2R1bGUgbSkpCit7 CisgICAgcmV0dXJuIDA7Cit9CisvKiB9fX0gKi8KKworLyoqKioqKioqKioqKioqKiogVVRJTElU WSAqKioqKioqKioqKioqKioqLworCisvKiBGVU5DVElPTjogY3JlYXRlaGFzaCB7e3sgKi8KK3N0 YXRpYyBQYXJhbSBjcmVhdGVoYXNoKGNoYXIgKm5hbWUsIGludCBmbGFncywgaW50IHdoaWNoKQor eworICAgIFBhcmFtIHBtOworICAgIEhhc2hUYWJsZSBodDsKKworICAgIHBtID0gY3JlYXRlcGFy YW0obmFtZSwgZmxhZ3MgfCBQTV9TUEVDSUFMIHwgUE1fSEFTSEVEKTsKKyAgICBpZiAoIXBtKSB7 CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChwbS0+b2xkKQorICAgICAg ICBwbS0+bGV2ZWwgPSBsb2NhbGxldmVsOworCisgICAgLyogVGhpcyBjcmVhdGVzIHN0YW5kYXJk IGhhc2guICovCisgICAgaHQgPSBwbS0+dS5oYXNoID0gbmV3cGFyYW10YWJsZSgzMiwgbmFtZSk7 CisgICAgaWYgKCFwbS0+dS5oYXNoKSB7CisgICAgICAgIHBhcmFtdGFiLT5yZW1vdmVub2RlKHBh cmFtdGFiLCBuYW1lKTsKKyAgICAgICAgcGFyYW10YWItPmZyZWVub2RlKCZwbS0+bm9kZSk7Cisg ICAgICAgIHp3YXJubmFtKG5hbWUsICJPdXQgb2YgbWVtb3J5IHdoZW4gYWxsb2NhdGluZyBoYXNo Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIERvZXMgZnJlZSBQYXJh bSAodW5zZXRmbiBpcyBjYWxsZWQpICovCisgICAgaHQtPmZyZWVub2RlID0gbXlmcmVlcGFyYW1u b2RlOworCisgICAgLyogVGhlc2UgcHJvdmlkZSBzcGVjaWFsIGZlYXR1cmVzICovCisgICAgaWYg KCB3aGljaCA9PSAwICkgeworICAgICAgICBodC0+Z2V0bm9kZSA9IGh0LT5nZXRub2RlMiA9IHJl ZGlzX2dldF9ub2RlOworICAgICAgICBodC0+c2NhbnRhYiA9IHNjYW5fa2V5czsKKyAgICB9IGVs c2UgaWYgKCB3aGljaCA9PSAxICkgeworICAgICAgICBodC0+Z2V0bm9kZSA9IGh0LT5nZXRub2Rl MiA9IHJlZGlzX3pzZXRfZ2V0X25vZGU7CisgICAgICAgIGh0LT5zY2FudGFiID0genNldF9zY2Fu X2tleXM7CisgICAgfSBlbHNlIGlmICggd2hpY2ggPT0gMiApIHsKKyAgICAgICAgaHQtPmdldG5v ZGUgPSBodC0+Z2V0bm9kZTIgPSByZWRpc19oc2V0X2dldF9ub2RlOworICAgICAgICBodC0+c2Nh bnRhYiA9IGhzZXRfc2Nhbl9rZXlzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxM OworICAgIH0KKworICAgIHJldHVybiBwbTsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IGFw cGVuZF90aWVkX25hbWUge3t7ICovCisKKy8qCisgKiBBZGRzIHBhcmFtZXRlciBuYW1lIHRvIGB6 cmVkaXNfdGllZGAKKyAqLworCitzdGF0aWMgaW50IGFwcGVuZF90aWVkX25hbWUoY29uc3QgY2hh ciAqbmFtZSkKK3sKKyAgICBpbnQgb2xkX2xlbiA9IGFycmxlbih6cmVkaXNfdGllZCk7CisgICAg Y2hhciAqKm5ld196cmVkaXNfdGllZCA9IHpzaGNhbGxvYygob2xkX2xlbisyKSAqIHNpemVvZihj aGFyICopKTsKKworICAgIC8qIENvcHkgKi8KKyAgICBjaGFyICoqcCA9IHpyZWRpc190aWVkOwor ICAgIGNoYXIgKipkc3QgPSBuZXdfenJlZGlzX3RpZWQ7CisgICAgd2hpbGUgKCpwKSB7CisgICAg ICAgICpkc3QrKyA9ICpwKys7CisgICAgfQorCisgICAgLyogQXBwZW5kIG5ldyBvbmUgKi8KKyAg ICAqZHN0ID0genRyZHVwKG5hbWUpOworCisgICAgLyogU3Vic3RpdHV0ZSwgZnJlZSBvbGQgb25l ICovCisgICAgemZyZWUoenJlZGlzX3RpZWQsIHNpemVvZihjaGFyICopICogKG9sZF9sZW4gKyAx KSk7CisgICAgenJlZGlzX3RpZWQgPSBuZXdfenJlZGlzX3RpZWQ7CisKKyAgICByZXR1cm4gMDsK K30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHJlbW92ZV90aWVkX25hbWUge3t7ICovCisKKy8q CisgKiBSZW1vdmVzIHBhcmFtZXRlciBuYW1lIGZyb20gYHpyZWRpc190aWVkYAorICovCisKK3N0 YXRpYyBpbnQgcmVtb3ZlX3RpZWRfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBv bGRfbGVuID0gYXJybGVuKHpyZWRpc190aWVkKTsKKworICAgIC8qIFR3byBzdGFnZSwgdG8gYWx3 YXlzIGhhdmUgYXJybGVuKCkgPT0gemZyZWUtc2l6ZSAtIDEuCisgICAgICogQ291bGQgZG8gYWxs b2NhdGlvbiBhbmQgcmV2ZXJ0IHdoZW4gYG5vdCBmb3VuZGAsIGJ1dAorICAgICAqIHdoYXQgd291 bGQgYmUgYmV0dGVyIGFib3V0IHRoYXQuICovCisKKyAgICAvKiBGaW5kIG9uZSB0byByZW1vdmUg Ki8KKyAgICBjaGFyICoqcCA9IHpyZWRpc190aWVkOworICAgIHdoaWxlICgqcCkgeworICAgICAg ICBpZiAoMD09c3RyY21wKG5hbWUsKnApKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg fQorICAgICAgICBwKys7CisgICAgfQorCisgICAgLyogQ29weSB4KzEgdG8geCAqLworICAgIHdo aWxlICgqcCkgeworICAgICAgICAqcD0qKHArMSk7CisgICAgICAgIHArKzsKKyAgICB9CisKKyAg ICAvKiBTZWNvbmQgc3RhZ2UuIFNpemUgY2hhbmdlZD8gT25seSBvbGRfc2l6ZS0xCisgICAgICog Y2hhbmdlIGlzIHBvc3NpYmxlLCBidXQuLiBwYXJhbm9pYSB3YXkgKi8KKyAgICBpbnQgbmV3X2xl biA9IGFycmxlbih6cmVkaXNfdGllZCk7CisgICAgaWYgKG5ld19sZW4gIT0gb2xkX2xlbikgewor ICAgICAgICBjaGFyICoqbmV3X3pyZWRpc190aWVkID0genNoY2FsbG9jKChuZXdfbGVuKzEpICog c2l6ZW9mKGNoYXIgKikpOworCisgICAgICAgIC8qIENvcHkgKi8KKyAgICAgICAgcCA9IHpyZWRp c190aWVkOworICAgICAgICBjaGFyICoqZHN0ID0gbmV3X3pyZWRpc190aWVkOworICAgICAgICB3 aGlsZSAoKnApIHsKKyAgICAgICAgICAgICpkc3QrKyA9ICpwKys7CisgICAgICAgIH0KKyAgICAg ICAgKmRzdCA9IE5VTEw7CisKKyAgICAgICAgLyogU3Vic3RpdHV0ZSwgZnJlZSBvbGQgb25lICov CisgICAgICAgIHpmcmVlKHpyZWRpc190aWVkLCBzaXplb2YoY2hhciAqKSAqIChvbGRfbGVuICsg MSkpOworICAgICAgICB6cmVkaXNfdGllZCA9IG5ld196cmVkaXNfdGllZDsKKyAgICB9CisKKyAg ICByZXR1cm4gMDsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHVubWV0YWZ5X3phbGxvYyB7 e3sgKi8KKworLyoKKyAqIFVubWV0YWZ5IHRoYXQ6CisgKiAtIGR1cGxpY2F0ZXMgYnVmZXIgdG8g d29yayBvbiBpdCwKKyAqIC0gZG9lcyB6YWxsb2Mgb2YgZXhhY3Qgc2l6ZSBmb3IgdGhlIG5ldyBz dHJpbmcsCisgKiAtIHJlc3RvcmVzIHdvcmsgYnVmZmVyIHRvIG9yaWdpbmFsIGNvbnRlbnQsIHRv IHJlc3RvcmUgc3RybGVuCisgKgorICogTm8genNmcmVlKCktY29uZnVzaW5nIHN0cmluZyB3aWxs IGJlIHByb2R1Y2VkLgorICovCitzdGF0aWMgY2hhciAqdW5tZXRhZnlfemFsbG9jKGNvbnN0IGNo YXIgKnRvX2NvcHksIGludCAqbmV3X2xlbikKK3sKKyAgICBjaGFyICp3b3JrLCAqdG9fcmV0dXJu OworICAgIGludCBteV9uZXdfbGVuID0gMDsKKworICAgIHdvcmsgPSB6dHJkdXAodG9fY29weSk7 CisgICAgd29yayA9IHVubWV0YWZ5KHdvcmssICZteV9uZXdfbGVuKTsKKworICAgIGlmIChuZXdf bGVuKQorICAgICAgICAqbmV3X2xlbiA9IG15X25ld19sZW47CisKKyAgICAvKiBUaGlzIHN0cmlu ZyBjYW4gYmUgY29ycmVjdGx5IHpzZnJlZSgpLWQgKi8KKyAgICB0b19yZXR1cm4gPSAoY2hhciAq KSB6YWxsb2MoKG15X25ld19sZW4rMSkqc2l6ZW9mKGNoYXIpKTsKKyAgICBtZW1jcHkodG9fcmV0 dXJuLCB3b3JrLCBzaXplb2YoY2hhcikqbXlfbmV3X2xlbik7IC8vIG1lbWNweSBoYW5kbGVzICQn XDAnCisgICAgdG9fcmV0dXJuW215X25ld19sZW5dPSdcMCc7CisKKyAgICAvKiBSZXN0b3JlIG9y aWdpbmFsIHN0cmxlbiBhbmQgY29ycmVjdGx5IGZyZWUgKi8KKyAgICBzdHJjcHkod29yaywgdG9f Y29weSk7CisgICAgenNmcmVlKHdvcmspOworCisgICAgcmV0dXJuIHRvX3JldHVybjsKK30KKy8q IH19fSAqLworLyogRlVOQ1RJT046IHNldF9sZW5ndGgge3t7ICovCisvKgorICogRm9yIHpzaC1h bGxvY2F0b3IsIHJlc3Qgb2YgWnNoIHNlZW1zIHRvIHVzZQorICogZnJlZSgpIGluc3RlYWQgb2Yg enNmcmVlKCksIGFuZCBzdWNoIGxlbmd0aAorICogcmVzdG9yYXRpb24gY2F1c2VzIHNsb3dkb3du LCBidXQgYWxsIGlzIHRoaXMKKyAqIHdheSBzdHJpY3QgLSBjb3JyZWN0ICovCitzdGF0aWMgdm9p ZCBzZXRfbGVuZ3RoKGNoYXIgKmJ1ZiwgaW50IHNpemUpIHsKKyAgICBidWZbc2l6ZV09J1wwJzsK KyAgICB3aGlsZSAoLS0gc2l6ZSA+PSAwKSB7CisgICAgICAgIGJ1ZltzaXplXT0nICc7CisgICAg fQorfQorLyogfX19ICovCisvKiBGVU5DVElPTjogcGFyc2VfaG9zdF9zdHJpbmcge3t7ICovCitz dGF0aWMgdm9pZCBwYXJzZV9ob3N0X3N0cmluZyhjb25zdCBjaGFyICppbnB1dCwgY2hhciAqcmVz b3VyY2VfbmFtZSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNo YXIgKipob3N0LCBpbnQgKnBvcnQsIGludCAqZGJfaW5kZXgsIGNoYXIgKiprZXkpCit7CisgICAg c3RybmNweShyZXNvdXJjZV9uYW1lLCBpbnB1dCwgc2l6ZS0xKTsKKyAgICByZXNvdXJjZV9uYW1l W3NpemUtMV0gPSAnXDAnOworCisgICAgLyogUGFyc2UgLWYgYXJndW1lbnQgKi8KKyAgICBjaGFy ICpwcm9jZXNzZWQgPSByZXNvdXJjZV9uYW1lOworICAgIGNoYXIgKnBvcnRfc3RhcnQsICprZXlf c3RhcnQsICpuZWVkbGU7CisgICAgaWYgKChwb3J0X3N0YXJ0ID0gc3RyY2hyKHByb2Nlc3NlZCwg JzonKSkpIHsKKyAgICAgICAgaWYgKHBvcnRfc3RhcnRbMV0gIT0gJ1wwJykgeworICAgICAgICAg ICAgaWYgKChuZWVkbGUgPSBzdHJjaHIocG9ydF9zdGFydCsxLCAnLycpKSkgeworICAgICAgICAg ICAgICAgIC8qIFBvcnQgd2l0aCBmb2xsb3dpbmcgZGF0YWJhc2UgaW5kZXggKi8KKyAgICAgICAg ICAgICAgICAqbmVlZGxlID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBpZiAocG9ydF9zdGFydFsx XSAhPSAnXDAnKQorICAgICAgICAgICAgICAgICAgICAqcG9ydCA9IGF0b2kocG9ydF9zdGFydCAr IDEpOworICAgICAgICAgICAgICAgIHByb2Nlc3NlZCA9IG5lZWRsZSsxOworICAgICAgICAgICAg fSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBQb3J0IGFsb25lICovCisgICAgICAgICAgICAg ICAgKnBvcnQgPSBhdG9pKHBvcnRfc3RhcnQgKyAxKTsKKyAgICAgICAgICAgICAgICBwcm9jZXNz ZWQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg LyogRW1wdHkgcG9ydCwgbm90aGluZyBmb2xsb3dzICovCisgICAgICAgICAgICBwcm9jZXNzZWQg PSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLyogUHJvY2VzcyBob3N0IG5hbWUgKi8KKyAg ICAgICAgKnBvcnRfc3RhcnQgPSAnXDAnOworICAgICAgICBpZiAocmVzb3VyY2VfbmFtZVswXSAh PSAnXDAnKQorICAgICAgICAgICAgKmhvc3QgPSByZXNvdXJjZV9uYW1lOworICAgIH0gZWxzZSB7 CisgICAgICAgIC8qIE5vLXBvcnQgdHJhY2sgKi8KKyAgICAgICAgaWYgKChuZWVkbGUgPSBzdHJj aHIocHJvY2Vzc2VkLCAnLycpKSkgeworICAgICAgICAgICAgKm5lZWRsZSA9ICdcMCc7CisgICAg ICAgICAgICAqaG9zdCA9IHJlc291cmNlX25hbWU7CisgICAgICAgICAgICBwcm9jZXNzZWQgPSBu ZWVkbGUrMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEluIHRoaXMgcGxhY2UgaG9zdCBu YW1lIGFuZCBwb3J0IGFyZSBhbHJlYWR5IHBhcnNlZCAqLworCisgICAgLyogRGF0YWJhc2UgaW5k ZXggKi8KKyAgICBpZiAocHJvY2Vzc2VkKSB7CisgICAgICAgIGlmICgoa2V5X3N0YXJ0ID0gc3Ry Y2hyKHByb2Nlc3NlZCwgJy8nKSkpIHsKKyAgICAgICAgICAgIC8qIFdpdGgga2V5LWZvbGxvd2lu ZyB0cmFjayAqLworICAgICAgICAgICAgKmtleV9zdGFydCA9ICdcMCc7CisgICAgICAgICAgICBp ZiAocHJvY2Vzc2VkWzBdICE9ICdcMCcpCisgICAgICAgICAgICAgICAgKmRiX2luZGV4ID0gYXRv aShwcm9jZXNzZWQpOworICAgICAgICAgICAgcHJvY2Vzc2VkID0ga2V5X3N0YXJ0ICsgMTsKKyAg ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFdpdGhvdXQga2V5LWZvbGxvd2luZyB0cmFj ayAqLworICAgICAgICAgICAgaWYgKHByb2Nlc3NlZFswXSAhPSAnXDAnKQorICAgICAgICAgICAg ICAgICpkYl9pbmRleCA9IGF0b2kocHJvY2Vzc2VkKTsKKyAgICAgICAgICAgIHByb2Nlc3NlZCA9 IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBLZXkgKi8KKyAgICBpZiAocHJvY2Vz c2VkKSB7CisgICAgICAgIGlmIChwcm9jZXNzZWRbMF0gIT0gJ1wwJykKKyAgICAgICAgICAgICpr ZXkgPSBwcm9jZXNzZWQ7CisgICAgfQorfQorLyogfX19ICovCisvKiBGVU5DVElPTjogY29ubmVj dCB7e3sgKi8KK3N0YXRpYyBpbnQgY29ubmVjdChjaGFyICpuYW0sIHJlZGlzQ29udGV4dCAqKnJj LCBjb25zdCBjaGFyKiBwYXNzd29yZCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsCisgICAg ICAgICAgICAgICAgICAgaW50IGRiX2luZGV4LCBjb25zdCBjaGFyICpyZXNvdXJjZV9uYW1lX2lu KQoreworICAgIHJlZGlzUmVwbHkgKnJlcGx5OworCisgICAgLyogQ29ubmVjdCAqLworICAgIHN0 cnVjdCB0aW1ldmFsIHRpbWVvdXQgPSB7IDEsIDUwMDAwMCB9OyAvLyAxLjUgc2Vjb25kcworICAg ICpyYyA9IHJlZGlzQ29ubmVjdFdpdGhUaW1lb3V0KGhvc3QsIHBvcnQsIHRpbWVvdXQpOworCisg ICAgaWYoKnJjID09IE5VTEwgfHwgKCpyYyktPmVyciAhPSAwKSB7CisgICAgICAgIGlmKHJjKSB7 CisgICAgICAgICAgICBpZihuYW0gJiYgbmFtWzBdICE9ICdcMCcpIHsKKyAgICAgICAgICAgICAg endhcm5uYW0obmFtLCAiZXJyb3Igb3BlbmluZyBkYXRhYmFzZSAlczolZC8lZCAoJXMpIiwgaG9z dCwgcG9ydCwgZGJfaW5kZXgsICgqcmMpLT5lcnJzdHIpOworICAgICAgICAgICAgfSBlbHNlIHsK KyAgICAgICAgICAgICAgendhcm4oImVycm9yIG9wZW5pbmcgZGF0YWJhc2UgJXM6JWQvJWQgKCVz KSIsIGhvc3QsIHBvcnQsIGRiX2luZGV4LCAoKnJjKS0+ZXJyc3RyKTsKKyAgICAgICAgICAgIH0K KyAgICAgICAgICAgIC8vIHJlZGlzRnJlZSgqcmMpOworICAgICAgICAgICAgLy8gKnJjID0gTlVM TDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKG5hbSAmJiBuYW1bMF0gIT0gJ1ww JykgeworICAgICAgICAgICAgICAgIHp3YXJubmFtKG5hbSwgImVycm9yIG9wZW5pbmcgZGF0YWJh c2UgJXMgKGluc3VmZmljaWVudCBtZW1vcnkpIiwgcmVzb3VyY2VfbmFtZV9pbik7CisgICAgICAg ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHp3YXJuKCJlcnJvciBvcGVuaW5nIGRhdGFi YXNlICVzIChpbnN1ZmZpY2llbnQgbWVtb3J5KSIsIHJlc291cmNlX25hbWVfaW4pOworICAgICAg ICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIEF1 dGhlbnRpY2F0ZSAqLworICAgIGlmIChwYXNzd29yZCkgeworICAgICAgICBpZiAoIWF1dGgocmMs IHBhc3N3b3JkKSkgeworICAgICAgICAgICAgLy8gcmVkaXNGcmVlKCpyYyk7CisgICAgICAgICAg ICAvLyAqcmMgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9 CisKKyAgICAvKiBTZWxlY3QgZGF0YWJhc2UgKi8KKyAgICBpZiAoZGJfaW5kZXgpIHsKKyAgICAg ICAgcmVwbHkgPSByZWRpc0NvbW1hbmQoKnJjLCAiU0VMRUNUICVkIiwgZGJfaW5kZXgpOworICAg ICAgICBpZiAocmVwbHkgPT0gTlVMTCB8fCByZXBseS0+dHlwZSA9PSBSRURJU19SRVBMWV9FUlJP UikgeworICAgICAgICAgICAgaWYgKHJlcGx5KSB7CisgICAgICAgICAgICAgICAgaWYobmFtICYm IG5hbVswXSAhPSAnXDAnKSB7CisgICAgICAgICAgICAgICAgICAgIHp3YXJubmFtKG5hbSwgImVy cm9yIHNlbGVjdGluZyBkYXRhYmFzZSAjJWQgKGhvc3Q6ICVzOiVkLCBtZXNzYWdlOiAlcykiLCBk Yl9pbmRleCwgaG9zdCwgcG9ydCwgcmVwbHktPnN0cik7CisgICAgICAgICAgICAgICAgfSBlbHNl IHsKKyAgICAgICAgICAgICAgICAgICAgendhcm4oImVycm9yIHNlbGVjdGluZyBkYXRhYmFzZSAj JWQgKGhvc3Q6ICVzOiVkLCBtZXNzYWdlOiAlcykiLCBkYl9pbmRleCwgaG9zdCwgcG9ydCwgcmVw bHktPnN0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyZWVSZXBseU9i amVjdChyZXBseSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKG5h bSAmJiBuYW1bMF0gIT0gJ1wwJykgeworICAgICAgICAgICAgICAgICAgICB6d2Fybm5hbShuYW0s ICJJTyBlcnJvciBzZWxlY3RpbmcgZGF0YWJhc2UgIyVkIChob3N0OiAlczolZCkiLCBkYl9pbmRl eCwgaG9zdCwgcG9ydCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg ICAgICAgendhcm4oIklPIGVycm9yIHNlbGVjdGluZyBkYXRhYmFzZSAjJWQgKGhvc3Q6ICVzOiVk KSIsIGRiX2luZGV4LCBob3N0LCBwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg ICB9CisgICAgICAgICAgICAvLyByZWRpc0ZyZWUoKnJjKTsKKyAgICAgICAgICAgIC8vICpyYyA9 IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBmcmVlUmVw bHlPYmplY3QocmVwbHkpOworICAgIH0KKworICAgIHJldHVybiAxOworfQorLyogfX19ICovCisv KiBGVU5DVElPTjogdHlwZSB7e3sgKi8KK3N0YXRpYyBpbnQgdHlwZShyZWRpc0NvbnRleHQgKipy YywgY29uc3QgY2hhciAqcmVkaXNfaG9zdF9wb3J0LCBjb25zdCBjaGFyICpwYXNzd29yZCwgY2hh ciAqa2V5LCBzaXplX3Qga2V5X2xlbikgeworICAgIHJlZGlzUmVwbHkgKnJlcGx5ID0gTlVMTDsK KworICAgIGludCByZXRyeSA9IDA7CisgcmV0cnk6CisgICAgaWYgKCEqcmMpIHsKKyAgICAgICAg cmV0dXJuIFJEX1RZUEVfVU5LTk9XTjsKKyAgICB9CisKKyAgICByZXBseSA9IHJlZGlzQ29tbWFu ZCgqcmMsICJUWVBFICViIiwga2V5LCAoc2l6ZV90KSBrZXlfbGVuKTsKKyAgICBpZiAocmVwbHkg PT0gTlVMTCB8fCByZXBseS0+dHlwZSAhPSBSRURJU19SRVBMWV9TVEFUVVMpIHsKKyAgICAgICAg aWYgKHJlcGx5KSB7CisgICAgICAgICAgICBmcmVlUmVwbHlPYmplY3QocmVwbHkpOworICAgICAg ICAgICAgcmVwbHkgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICgoKnJjKS0+ZXJyICYg KFJFRElTX0VSUl9JTyB8IFJFRElTX0VSUl9FT0YpKSB7CisgICAgICAgICAgICBnb3RvIGRvX3Jl dHJ5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFJEX1RZUEVfVU5LTk9X TjsKKyAgICAgICAgfQorICAgIH0KKworIGRvX3JldHJ5OgorICAgIC8qIERpc2Nvbm5lY3QgZGV0 ZWN0aW9uICovCisgICAgaWYgKCgqcmMpLT5lcnIgJiAoUkVESVNfRVJSX0lPIHwgUkVESVNfRVJS X0VPRikpIHsKKyAgICAgICAgaWYgKHJldHJ5KSB7CisgICAgICAgICAgICB6d2FybigiQWJvcnRp bmcgKG5vIGNvbm5lY3Rpb24pIik7CisgICAgICAgICAgICByZXR1cm4gUkRfVFlQRV9VTktOT1dO OworICAgICAgICB9CisgICAgICAgIHJldHJ5ID0gMTsKKyAgICAgICAgaWYocmVjb25uZWN0KHJj LCByZWRpc19ob3N0X3BvcnQsIHBhc3N3b3JkKSkKKyAgICAgICAgICAgIGdvdG8gcmV0cnk7Cisg ICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBSRF9UWVBFX1VOS05PV047CisgICAgfQor CisKKyAgICBpZiAoMCA9PSBzdHJuY21wKCJzdHJpbmciLCByZXBseS0+c3RyLCByZXBseS0+bGVu KSkgeworICAgICAgICBmcmVlUmVwbHlPYmplY3QocmVwbHkpOworICAgICAgICByZXR1cm4gUkRf VFlQRV9TVFJJTkc7CisgICAgfQorICAgIGlmICgwID09IHN0cm5jbXAoImxpc3QiLCByZXBseS0+ c3RyLCByZXBseS0+bGVuKSkgeworICAgICAgICBmcmVlUmVwbHlPYmplY3QocmVwbHkpOworICAg ICAgICByZXR1cm4gUkRfVFlQRV9MSVNUOworICAgIH0KKyAgICBpZiAoMCA9PSBzdHJuY21wKCJz ZXQiLCByZXBseS0+c3RyLCByZXBseS0+bGVuKSkgeworICAgICAgICBmcmVlUmVwbHlPYmplY3Qo cmVwbHkpOworICAgICAgICByZXR1cm4gUkRfVFlQRV9TRVQ7CisgICAgfQorICAgIGlmICgwID09 IHN0cm5jbXAoInpzZXQiLCByZXBseS0+c3RyLCByZXBseS0+bGVuKSkgeworICAgICAgICBmcmVl UmVwbHlPYmplY3QocmVwbHkpOworICAgICAgICByZXR1cm4gUkRfVFlQRV9aU0VUOworICAgIH0K KyAgICBpZiAoMCA9PSBzdHJuY21wKCJoYXNoIiwgcmVwbHktPnN0ciwgcmVwbHktPmxlbikpIHsK KyAgICAgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsKKyAgICAgICAgcmV0dXJuIFJEX1RZUEVf SEFTSDsKKyAgICB9CisgICAgZnJlZVJlcGx5T2JqZWN0KHJlcGx5KTsKKyAgICByZXR1cm4gUkRf VFlQRV9VTktOT1dOOworfQorLyogfX19ICovCisvKiBGVU5DVElPTjogYXV0aCB7e3sgKi8KK3N0 YXRpYyBpbnQgYXV0aChyZWRpc0NvbnRleHQgKipyYywgY29uc3QgY2hhciAqcGFzc3dvcmQpIHsK KyAgICByZWRpc1JlcGx5ICpyZXBseTsKKworICAgIGlmICghcGFzc3dvcmQgfHwgcGFzc3dvcmRb MF0gPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXBseSA9IHJlZGlzQ29tbWFu ZCgqcmMsICJBVVRIICViIiwgcGFzc3dvcmQsIChzaXplX3Qpc3RybGVuKHBhc3N3b3JkKSk7Cisg ICAgaWYgKHJlcGx5ID09IE5VTEwgfHwgcmVwbHktPnR5cGUgPT0gUkVESVNfUkVQTFlfRVJST1Ip IHsKKyAgICAgICAgaWYgKHJlcGx5KSB7CisgICAgICAgICAgICB6d2FybigiRXJyb3Igd2hlbiBh dXRoZW50aWNhdGluZyAoJXMpIiwgcmVwbHktPnN0cik7CisgICAgICAgICAgICBmcmVlUmVwbHlP YmplY3QocmVwbHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgendhcm4oIkVycm9y IHdoZW4gYXV0aGVudGljYXRpbmcgKG5vIGNvbm5lY3Rpb24/KSIpOworICAgICAgICB9CisgICAg ICAgIHJldHVybiAwOworICAgIH0KKyAgICBmcmVlUmVwbHlPYmplY3QocmVwbHkpOworICAgIHJl dHVybiAxOworfQorLyogfX19ICovCisvKiBGVU5DVElPTjogaXNfdGllZCB7e3sgKi8KK3N0YXRp YyBpbnQgaXNfdGllZChQYXJhbSBwbSkgeworICAgIGlmIChwbS0+Z3N1LmggPT0gJnJlZGlzX2hh c2hfZ3N1KSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAocG0tPmdzdS5zLT5n ZXRmbiA9PSAmcmVkaXNfc3RyX2dldGZuKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxz ZSBpZiAocG0tPmdzdS5hLT5nZXRmbiA9PSAmcmVkaXNfYXJyc2V0X2dldGZuKSB7CisgICAgICAg IHJldHVybiAxOworICAgIH0gZWxzZSBpZiAocG0tPmdzdS5oID09ICZoYXNoX3pzZXRfZ3N1KSB7 CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAocG0tPmdzdS5oID09ICZoYXNoX2hz ZXRfZ3N1KSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAocG0tPmdzdS5hLT5n ZXRmbiA9PSAmcmVkaXNfYXJybGlzdF9nZXRmbikgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9 CisKKyAgICByZXR1cm4gMDsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHpydGllX3VzYWdl IHt7eyAqLworc3RhdGljIHZvaWQgenJ0aWVfdXNhZ2UoKSB7CisgICAgZnByaW50ZihzdGRvdXQs IFlFTExPVyAiVXNhZ2U6IiBSRVNFVCAiIHpydGllIC1kIGRiL3JlZGlzIFstcF0gWy1yXSBbLWEg cGFzc3dvcmRdICIgTUFHRU5UQSAiLWYge2hvc3Qtc3BlY30iCisgICAgICAgICAgICBSRVNFVCAi ICIgUkVEICJ7cGFyYW1ldGVyX25hbWV9IiBSRVNFVCAiXG4iKTsKKyAgICBmcHJpbnRmKHN0ZG91 dCwgWUVMTE9XICJPcHRpb25zOiIgUkVTRVQgIlxuIik7CisgICAgZnByaW50ZihzdGRvdXQsIEdS RUVOICIgLWQiIFJFU0VUICI6IHNlbGVjdCBkYXRhYmFzZSB0eXBlLCBjYW4gY2hhbmdlIGluIGZ1 dHVyZSwgY3VycmVudGx5IG9ubHkgXCJkYi9yZWRpc1wiXG4iKTsKKyAgICBmcHJpbnRmKHN0ZG91 dCwgR1JFRU4gIiAtcCIgUkVTRVQgIjogcGFzc3Rocm91Z2ggLSBhbHdheXMgZG8gYSBmcmVzaCBx dWVyeSB0byBkYXRhYmFzZSwgZG9uJ3QgdXNlIGNhY2hlXG4iKTsKKyAgICBmcHJpbnRmKHN0ZG91 dCwgR1JFRU4gIiAtciIgUkVTRVQgIjogY3JlYXRlIHJlYWQtb25seSBwYXJhbWV0ZXJcbiIgKTsK KyAgICBmcHJpbnRmKHN0ZG91dCwgR1JFRU4gIiAtZiIgUkVTRVQgIjogZGF0YWJhc2UtYWRkcmVz cyBpbiBmb3JtYXQge2hvc3R9Wzpwb3J0XVsvW2RiX2lkeF1bL2tleV1dXG4iKTsKKyAgICBmcHJp bnRmKHN0ZG91dCwgR1JFRU4gIiAtYSIgUkVTRVQgIjogZGF0YWJhc2UtcGFzc3dvcmQgdG8gYmUg dXNlZCB3aXRoIEFVVEggKHJlZGlzIGNvbW1hbmQpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZG91dCwg R1JFRU4gIiAtQSIgUkVTRVQgIjogZmlsZSB3aXRoIGRhdGFiYXNlLXBhc3N3b3JkIHRvIGJlIHVz ZWQgd2l0aCBBVVRIIChyZWRpcyBjb21tYW5kKVxuIik7CisgICAgZnByaW50ZihzdGRvdXQsICJU aGUgIiBSRUQgIntwYXJhbWV0ZXJfbmFtZX0iIFJFU0VUICIgLSBjaG9vc2UgbmFtZSBmb3IgdGhl IGNyZWF0ZWQgZGF0YWJhc2UtYm91bmQgcGFyYW1ldGVyXG4iKTsKKyAgICBmZmx1c2goc3Rkb3V0 KTsKK30KKy8qIH19fSAqLworLyogRlVOQ1RJT046IHpyenNldF91c2FnZSB7e3sgKi8KK3N0YXRp YyB2b2lkIHpyenNldF91c2FnZSgpIHsKKyAgICBmcHJpbnRmKHN0ZG91dCwgWUVMTE9XICJVc2Fn ZToiIFJFU0VUICIgenJ6c2V0IHt0aWVkLXBhcmFtLW5hbWV9XG4iKTsKKyAgICBmcHJpbnRmKHN0 ZG91dCwgWUVMTE9XICJPdXRwdXQ6IiBSRVNFVCAiICRyZXBseSBhcnJheSwgdG8gaG9sZCBlbGVt ZW50cyBvZiB0aGUgc29ydGVkIHNldFxuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7Cit9CisvKiB9 fX0gKi8KKy8qIEZVTkNUSU9OOiB6cnVudGllX3VzYWdlIHt7eyAqLworc3RhdGljIHZvaWQgenJ1 bnRpZV91c2FnZSgpIHsKKyAgICBmcHJpbnRmKHN0ZG91dCwgWUVMTE9XICJVc2FnZToiIFJFU0VU ICIgenJ1bnRpZSBbLXVdIHt0aWVkLXZhcmlhYmxlLW5hbWV9IFt0aWVkLXZhcmlhYmxlLW5hbWVd IC4uLlxuIik7CisgICAgZnByaW50ZihzdGRvdXQsIFlFTExPVyAiT3B0aW9uczoiIFJFU0VUICJc biIpOworICAgIGZwcmludGYoc3Rkb3V0LCBHUkVFTiAiIC11IiBSRVNFVCAiOiBBbGxvdyB0byB1 bnRpZSByZWFkLW9ubHkgcGFyYW1ldGVyXG4iKTsKKyAgICBmcHJpbnRmKHN0ZG91dCwgWUVMTE9X ICJEZXNjcmlwdGlvbjoiIFJFU0VUICIgZGV0YWNoZXMgdmFyaWFibGUgZnJvbSBkYXRhYmFzZSBh bmQgcmVtb3ZlcyB0aGUgdmFyaWFibGU7XG4iKTsKKyAgICBmcHJpbnRmKHN0ZG91dCwgWUVMTE9X ICIgICAgICAgICAgICAiIFJFU0VUICIgZGF0YWJhc2UgaXMgbm90IGNsZWFyZWRcbiIpOworICAg IGZmbHVzaChzdGRvdXQpOworfQorLyogfX19ICovCisvKiBGVU5DVElPTjogenJlZGlzaG9zdF91 c2FnZSB7e3sgKi8KK3N0YXRpYyB2b2lkIHpyZWRpc2hvc3RfdXNhZ2UoKSB7CisgICAgZnByaW50 ZihzdGRvdXQsIFlFTExPVyAiVXNhZ2U6IiBSRVNFVCAiIHpyZWRpc2hvc3Qge3RpZWQtdmFyaWFi bGUtbmFtZX1cbiIpOworICAgIGZwcmludGYoc3Rkb3V0LCBZRUxMT1cgIkRlc2NyaXB0aW9uOiIg UkVTRVQgIiBzdG9yZXMgaG9zdC1zcGVjIG9mIGdpdmVuIHZhcmlhYmxlIHRvICRSRVBMWVxuIik7 CisgICAgZmZsdXNoKHN0ZG91dCk7Cit9CisvKiB9fX0gKi8KKy8qIEZVTkNUSU9OOiB6cmVkaXNj bGVhcl91c2FnZSB7e3sgKi8KK3N0YXRpYyB2b2lkIHpyZWRpc2NsZWFyX3VzYWdlKCkgeworICAg IGZwcmludGYoc3Rkb3V0LCBZRUxMT1cgIlVzYWdlOiIgUkVTRVQgIiB6cmVkaXNjbGVhciB7dGll ZC12YXJpYWJsZS1uYW1lfSBba2V5IG5hbWVdXG4iKTsKKyAgICBmcHJpbnRmKHN0ZG91dCwgWUVM TE9XICJEZXNjcmlwdGlvbjoiIFJFU0VUICIgY2xlYXJzIGNhY2hlIG9mIGdpdmVuIGhhc2gva2V5 IG9yIG9mIGdpdmVuIHBsYWluXG4iKTsKKyAgICBmcHJpbnRmKHN0ZG91dCwgWUVMTE9XICIgICAg ICAgICAgICAiIFJFU0VUICIgdmFyaWFibGU6IHNldCAoYXJyYXkpLCBsaXN0IChhcnJheSksIHN0 cmluZyAoc2NhbGFyKTtcbiIpOworICAgIGZwcmludGYoc3Rkb3V0LCBZRUxMT1cgIiAgICAgICAg ICAgICIgUkVTRVQgIiBwYXNzIGAtcCcgb3B0aW9uIHRvIHpydGllIHRvIGRpc2FibGUgY2FjaGUg Zm9yIHZhcmlhYmxlXG4iKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKK30KKy8qIH19fSAqLworLyog RlVOQ1RJT046IHJlY29ubmVjdCB7e3sgKi8KK3N0YXRpYyBpbnQgcmVjb25uZWN0KHJlZGlzQ29u dGV4dCAqKnJjLCBjb25zdCBjaGFyICpob3N0c3BlY19pbiwgY29uc3QgY2hhciAqcGFzc3dvcmQp IHsKKyAgICBjaGFyIGhvc3RzcGVjWzE5Ml07CisgICAgY2hhciAqaG9zdD0iMTI3LjAuMC4xIiwg KmtleT0iIjsKKyAgICBpbnQgcG9ydCA9IDYzNzksIGRiX2luZGV4ID0gMDsKKworICAgIHBhcnNl X2hvc3Rfc3RyaW5nKGhvc3RzcGVjX2luLCBob3N0c3BlYywgMTkyLCAmaG9zdCwgJnBvcnQsICZk Yl9pbmRleCwgJmtleSk7CisKKyAgICByZWRpc0ZyZWUoKnJjKTsKKyAgICAqcmMgPSBOVUxMOwor ICAgIGlmKCFjb25uZWN0KCIiLCByYywgcGFzc3dvcmQsIGhvc3QsIHBvcnQsIGRiX2luZGV4LCBo b3N0c3BlY19pbikpIHsKKyAgICAgICAgendhcm4oIk5vdCBjb25uZWN0ZWQsIHJldHJ5aW5nLi4u IEZhaWxlZCwgYWJvcnRpbmciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAg ICAgICAgendhcm4oIk5vdCBjb25uZWN0ZWQsIHJldHJ5aW5nLi4uIFN1Y2Nlc3MiKTsKKyAgICAg ICAgcmV0dXJuIDE7CisgICAgfQorfQorLyogfX19ICovCisvKiBGVU5DVElPTjogbXlmcmVlcGFy YW1ub2RlIHt7eyAqLworc3RhdGljIHZvaWQKK215ZnJlZXBhcmFtbm9kZShIYXNoTm9kZSBobikK K3sKKyAgICBQYXJhbSBwbSA9IChQYXJhbSkgaG47CisgCisgICAgLyogVXBzdHJlYW06IFRoZSBz ZWNvbmQgYXJndW1lbnQgb2YgdW5zZXRmbigpIGlzIHVzZWQgYnkgbW9kdWxlcyB0bworICAgICAq IGRpZmZlcmVudGlhdGUgImV4cCJsaWNpdCB1bnNldCBmcm9tIGltcGxpY2l0IHVuc2V0LCBhcyB3 aGVuCisgICAgICogYSBwYXJhbWV0ZXIgaXMgZ29pbmcgb3V0IG9mIHNjb3BlLiAgSXQncyBub3Qg Y2xlYXIgd2hpY2gKKyAgICAgKiBvZiB0aGVzZSBhcHBsaWVzIGhlcmUsIGJ1dCBwYXNzaW5nIDEg aGFzIGFsd2F5cyB3b3JrZWQuCisgICAgICovCisKKyAgICAvKiBpZiAoZGVsdW5zZXQpICovCisg ICAgICBwbS0+Z3N1LnMtPnVuc2V0Zm4ocG0sIDEpOworCisgICAgenNmcmVlKHBtLT5ub2RlLm5h bSk7CisgICAgLyogSWYgdGhpcyB2YXJpYWJsZSB3YXMgdGllZCBieSB0aGUgdXNlciwgZW5hbWUg d2FzIHp0cmR1cCdkICovCisgICAgaWYgKHBtLT5ub2RlLmZsYWdzICYgUE1fVElFRCAmJiBwbS0+ ZW5hbWUpIHsKKyAgICAgICAgenNmcmVlKHBtLT5lbmFtZSk7CisgICAgICAgIHBtLT5lbmFtZSA9 IE5VTEw7CisgICAgfQorICAgIHpmcmVlKHBtLCBzaXplb2Yoc3RydWN0IHBhcmFtKSk7Cit9Cisv KiB9fX0gKi8KKworI2Vsc2UKKyMgZXJyb3Igbm8gaGlyZWRpcyBsaWJyYXJ5IGFmdGVyIGl0IHdh cyBjb3JyZWN0bHkgZGV0ZWN0ZWQgKGJ5IGNvbmZpZ3VyZSBzY3JpcHQpCisjZW5kaWYgLyogaGF2 ZSBoaXJlZGlzICovCmRpZmYgLS1naXQgYS9TcmMvTW9kdWxlcy9kYl9yZWRpcy5tZGQgYi9TcmMv TW9kdWxlcy9kYl9yZWRpcy5tZGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u Y2E5ZWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9Nb2R1bGVzL2RiX3JlZGlzLm1kZApAQCAt MCwwICsxLDEyIEBACituYW1lPXpzaC9kYi9yZWRpcworbGluaz0naWYgdGVzdCAieCRhY19jdl9s aWJfaGlyZWRpc19yZWRpc0Nvbm5lY3QiID0geHllcyAmJiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9o aXJlZGlzX2hpcmVkaXNfaCIgPSB4eWVzOyB0aGVuCisgIGVjaG8gZHluYW1pYworZWxzZQorICBl Y2hvIG5vCitmaQorJworbG9hZD1ubworCithdXRvZmVhdHVyZXM9ImI6enJ0aWUgYjp6cnVudGll IGI6enJlZGlzaG9zdCBiOnpyZWRpc2NsZWFyIGI6enJ6c2V0IHA6enJlZGlzX3RpZWQiCisKK29i amVjdHM9ImRiX3JlZGlzLm8iCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUu YWMKaW5kZXggODhkYTg5ZS4uMzIyY2U2OCAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmFjCisrKyBi L2NvbmZpZ3VyZS5hYwpAQCAtNDUxLDYgKzQ1MSwxMCBAQCBBQ19BUkdfRU5BQkxFKGdkYm0sCiBB Q19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWdkYm1dLCBbdHVybiBvZmYgc2VhcmNoIGZvciBnZGJt IGxpYnJhcnldKSwKIFtnZGJtPSIkZW5hYmxldmFsIl0sIFtnZGJtPXllc10pCiAKK0FDX0FSR19F TkFCTEUocmVkaXMsCitBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXJlZGlzXSwgW3R1cm4gb2Zm IHNlYXJjaCBmb3IgaGlyZWRpcyBsaWJyYXJ5XSksCitbcmVkaXM9IiRlbmFibGV2YWwiXSwgW3Jl ZGlzPXllc10pCisKIGRubCAtLS0tLS0tLS0tLS0tLS0tLS0KIGRubCBDSEVDSyBUSEUgQ09NUElM RVIKIGRubCAtLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk3OSw2ICs5ODMsMTEgQEAgaWYgdGVzdCB4 JGdkYm0gIT0geG5vOyB0aGVuCiAgIEFDX0NIRUNLX0xJQihnZGJtLCBnZGJtX29wZW4pCiBmaQog CitpZiB0ZXN0IHgkcmVkaXMgIT0geG5vOyB0aGVuCisgIEFDX0NIRUNLX0hFQURFUlMoaGlyZWRp cy9oaXJlZGlzLmgpCisgIEFDX0NIRUNLX0xJQihoaXJlZGlzLCByZWRpc0Nvbm5lY3QpCitmaQor CiBBQ19DSEVDS19IRUFERVJTKHN5cy94YXR0ci5oKQogCiBkbmwgLS0tLS0tLS0tLS0tLS0KQEAg LTEzMTksNyArMTMyOCw3IEBAIEFDX0NIRUNLX0ZVTkNTKHN0cmZ0aW1lIHN0cnB0aW1lIG1rdGlt ZSB0aW1lbG9jYWwgXAogCSAgICAgICBncmFudHB0IHVubG9ja3B0IHB0c25hbWUgXAogCSAgICAg ICBodG9ucyBudG9ocyBcCiAJICAgICAgIHJlZ2NvbXAgcmVnZXhlYyByZWdlcnJvciByZWdmcmVl IFwKLQkgICAgICAgZ2RibV9vcGVuIGdldHhhdHRyIFwKKwkgICAgICAgZ2RibV9vcGVuIHJlZGlz Q29ubmVjdCBnZXR4YXR0ciBcCiAJICAgICAgIHJlYWxwYXRoIGNhbm9uaWNhbGl6ZV9maWxlX25h bWUgXAogCSAgICAgICBzeW1saW5rIGdldGN3ZCBcCiAJICAgICAgIGN5Z3dpbl9jb252X3BhdGgg XAo= --5933c637_46e87ccd_c8d8 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?utf-8?Q?V12db=5Fredis.ztst?=" IyBUZXN0cyBmb3IgdGhlIHpkaGFybWEvcmVkaXMgbW9kdWxlCgolcHJlcAoKIG1vZHVsZV9wYXRo PSggYHB3ZGAvTW9kdWxlcyApCiBtb2RuYW1lPSJ6c2gvZGIvcmVkaXMiCiBkYjE9IjEyNy4wLjAu MTo2Mzc5LzEwIgogZGIyPSIxMjcuMC4wLjEvMTEiCiBpZiAhIHptb2Rsb2FkICRtb2RuYW1lIDsg dGhlbgogICBaVFNUX3VuaW1wbGVtZW50ZWQ9ImNhbid0IGxvYWQgJG1vZG5hbWUgbW9kdWxlIGZv ciB0ZXN0aW5nIgogZmkKIHJlZGlzLWNsaSAtbiAxMCBmbHVzaGRiCiByZWRpcy1jbGkgLW4gMTEg Zmx1c2hkYgoKJXRlc3QKCiAoem1vZGxvYWQgLXUgJG1vZG5hbWUgJiYgem1vZGxvYWQgJG1vZG5h bWUpCjA6dW5sb2FkIGFuZCByZWxvYWQgdGhlIG1vZHVsZSB3aXRob3V0IGNyYXNoaW5nCgogenJ0 aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFzZQogZGJhc2VbdGVzdGtleV09dGVzdGRhdGEKIHpy dW50aWUgZGJhc2UKIHVuc2V0IGRiYXNlCiB6cnRpZSAtciAtZCBkYi9yZWRpcyAtZiAkZGIxIGRi YXNlCiBlY2hvICRkYmFzZVt0ZXN0a2V5XQogenJ1bnRpZSAtdSBkYmFzZQogZWNobyAkenJlZGlz X3RpZWQgJHsjenJlZGlzX3RpZWR9CjA6c3RvcmUga2V5IGluIGRhdGFiYXNlIDEKPnRlc3RkYXRh Cj4wCgogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMiBkYmFzZQogZGJhc2VbdGVzdGtleV09dGVz dGRhdGEKIHpydW50aWUgZGJhc2UKIHVuc2V0IGRiYXNlCiB6cnRpZSAtZCBkYi9yZWRpcyAtZiAk ZGIyIGRiYXNlCiBlY2hvICRkYmFzZVt0ZXN0a2V5XQogenJ1bnRpZSBkYmFzZQogZWNobyAkenJl ZGlzX3RpZWQgJHsjenJlZGlzX3RpZWR9CjA6c3RvcmUga2V5IGluIGRhdGFiYXNlIDIKPnRlc3Rk YXRhCj4wCgogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFzZTIKIHVuc2V0ICdkYmFzZTJb dGVzdGtleV0nCiB6cnVudGllIGRiYXNlMgogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFz ZQogZWNobyAkZGJhc2VbdGVzdGtleV0KIHpydW50aWUgZGJhc2UKIGVjaG8gJHpyZWRpc190aWVk ICR7I3pyZWRpc190aWVkfQowOnJlbW92ZSBrZXkgZnJvbSBkYXRhYmFzZSAxIChkaWZmZXJlbnQg dmFyaWFibGVzKQo+Cj4wCgogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFzZQogZGJhc2Vb dGVzdGtleV09dGVzdGRhdGEKIHpydW50aWUgZGJhc2UKIHpydGllIC1kIGRiL3JlZGlzIC1mICRk YjEgZGJhc2UKIGVjaG8gJGRiYXNlW3Rlc3RrZXldCiB6cnVudGllIGRiYXNlCiB6cnRpZSAtZCBk Yi9yZWRpcyAtZiAkZGIxIGRiYXNlCiB1bnNldCAnZGJhc2VbdGVzdGtleV0nCiB6cnVudGllIGRi YXNlCiB6cnRpZSAtciAtZCBkYi9yZWRpcyAtZiAkZGIxIGRiYXNlCiBlY2hvICRkYmFzZVt0ZXN0 a2V5XQogenJ1bnRpZSAtdSBkYmFzZQogZWNobyAkenJlZGlzX3RpZWQgJHsjenJlZGlzX3RpZWR9 CjA6c3RvcmUgJiByZW1vdmUga2V5IGZyb20gZGF0YWJhc2UgKHRoZSBzYW1lIHZhcmlhYmxlcykK PnRlc3RkYXRhCj4KPjAKCiB6cnRpZSAtZCBkYi9yZWRpcyAtZiAkZGIxIGRiYXNlCiBkYmFzZVt0 ZXN0a2V5XT10ZXN0ZGF0YQogZGJhc2VbdGVzdGtleTJdPSRkYmFzZVt0ZXN0a2V5XQogZGJhc2Vb dGVzdGtleTNdPSRkYmFzZVt0ZXN0a2V5XXgkZGJhc2VbdGVzdGtleTJdCiB6cnVudGllIGRiYXNl CiB6cnRpZSAtZCBkYi9yZWRpcyAtZiAkZGIxIGRiYXNlCiBlY2hvICRkYmFzZVt0ZXN0a2V5XQog ZWNobyAkZGJhc2VbdGVzdGtleTJdCiBlY2hvICRkYmFzZVt0ZXN0a2V5M10KIHpydW50aWUgZGJh c2UKIGVjaG8gJHpyZWRpc190aWVkICR7I3pyZWRpc190aWVkfQowOnN0b3JlIDIga2V5cyBmZXRj aGluZyAxc3QKPnRlc3RkYXRhCj50ZXN0ZGF0YQo+dGVzdGRhdGF4dGVzdGRhdGEKPjAKCiB6cnRp ZSAtZCBkYi9yZWRpcyAtZiAkZGIxIGRiYXNlCiB2YWw9JGRiYXNlW3Rlc3RrZXkyXQogdW5zZXQg J2RiYXNlW3Rlc3RrZXkyXScKIGVjaG8gJHZhbAogenJ1bnRpZSBkYmFzZQogZWNobyAkenJlZGlz X3RpZWQgJHsjenJlZGlzX3RpZWR9CjA6dW5zZXQga2V5IHRoYXQgd2FzIGZldGNoZWQKPnRlc3Rk YXRhCj4wCgogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFzZQogbG9jYWwgLWEgcmVzdWx0 CiByZXN1bHQ9KCAiJHsoa3YpZGJhc2VbQF19IiApCiBwcmludCAtcmwgLS0gIiR7KG8pcmVzdWx0 W0BdfSIKIHpydW50aWUgZGJhc2UKIGVjaG8gJHpyZWRpc190aWVkICR7I3pyZWRpc190aWVkfQow OnNjYW4gcmVhZC1vbmx5IHRpZWQgaGFzaCwgZGlyZWN0bHkgYXNzaWduIGxvY2FsIC1hCj50ZXN0 ZGF0YQo+dGVzdGRhdGF4dGVzdGRhdGEKPnRlc3RrZXkKPnRlc3RrZXkzCj4wCgogenJ0aWUgLWQg ZGIvcmVkaXMgLWYgJGRiMSBkYmFzZQogZGJhc2U9KCBhIGEgKQogcHJpbnQgLXJsIC0tICIkeyhr dilkYmFzZVtAXX0iCiB6cnVudGllIGRiYXNlCiBlY2hvICR6cmVkaXNfdGllZCAkeyN6cmVkaXNf dGllZH0KMDpVc2Ugc2NhbiBkaXJlY3RseSBhZnRlciBvdmVyd3JpdGUgb2YgZGF0YWJhc2UKPmEK PmEKPjAKCiB6cnRpZSAtZCBkYi9yZWRpcyAtZiAkZGIxIGRiYXNlCiBkYmFzZT0oIGEgYiBjIGQg KQogenJ1bnRpZSBkYmFzZQogdW5zZXQgZGJhc2UKIHpydGllIC1yIC1kIGRiL3JlZGlzIC1mICRk YjEgZGJhc2UKIHJlc3VsdD0oICIkeyhrdilkYmFzZVtAXX0iICkKIHByaW50IC1ybCAtLSAiJHso bylyZXN1bHRbQF19IgogenJ1bnRpZSAtdSBkYmFzZQogZWNobyAkenJlZGlzX3RpZWQgJHsjenJl ZGlzX3RpZWR9CjA6cmVwbGFjZSBoYXNoIC8gZGF0YWJhc2Ugd2l0aCB1bnRpZSwgc2Nhbgo+YQo+ Ygo+Ywo+ZAo+MAoKIHpydGllIC1kIGRiL3JlZGlzIC1mICRkYjEgZGJhc2UKIGxvY2FsIC1hIGFy cgogYXJyPSggIiR7ZGJhc2VbQF19IiApCiBwcmludCAtcmwgLS0gIiR7KG8pYXJyW0BdfSIKIHpy dW50aWUgZGJhc2UKIGVjaG8gJHpyZWRpc190aWVkICR7I3pyZWRpc190aWVkfQowOnNjYW4gd2l0 aCBubyAoa3YpCj5iCj5kCj4wCgogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFzZQogcmVz dWx0PSggIiR7KGspZGJhc2VbQF19IiApCiBwcmludCAtcmwgLS0gIiR7KG8pcmVzdWx0W0BdfSIK IHpydW50aWUgZGJhc2UKIGVjaG8gJHpyZWRpc190aWVkICR7I3pyZWRpc190aWVkfQowOnNjYW4g d2l0aCBrZXlzIG9ubHkgLSAoaykKPmEKPmMKPjAKCiB6cnRpZSAtZCBkYi9yZWRpcyAtZiAkZGIx IGRiYXNlCiByZXN1bHQ9KCAiJHsodilkYmFzZVtAXX0iICkKIHByaW50IC1ybCAtLSAiJHsobyly ZXN1bHRbQF19IgogenJ1bnRpZSBkYmFzZQogZWNobyAkenJlZGlzX3RpZWQgJHsjenJlZGlzX3Rp ZWR9CjA6c2NhbiB3aXRoIHZhbHVlcyBvbmx5LCBleHBsaWNpdCAtICh2KQo+Ygo+ZAo+MAoKIHpy dGllIC1kIGRiL3JlZGlzIC1mICR7ZGIxJS8qfS8xMDAwIGRiYXNlIDI+L2Rldi9udWxsOyByZXQ9 JD8KIGVjaG8gJHpyZWRpc190aWVkICR7I3pyZWRpc190aWVkfQogcmV0dXJuICRyZXQKMTpyZWFk LW9ubHkgb3BlbiBub24tZXhpc3RlbnQgZGF0YWJhc2UKPjAKCiB6cnRpZSAtZCBkYi9yZWRpcyAt ZiAkZGIxIGRiYXNlCiBkYmFzZT0oICkKIGRiYXNlKz0oIGEgYiApCiBlY2hvICRkYmFzZVthXQog enJ1bnRpZSBkYmFzZQogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFzZQogZWNobyAkZGJh c2VbYV0KIHJlc3VsdD0oICIkeyhrdilkYmFzZVtAXX0iICkKIHByaW50IC1ybCAtLSAiJHsobyly ZXN1bHRbQF19IgogenJ1bnRpZSBkYmFzZQogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFz ZQogZGJhc2UrPSggYyBkICkKIGVjaG8gJGRiYXNlW2FdCiBlY2hvICRkYmFzZVtjXQogcmVzdWx0 PSggIiR7KGt2KWRiYXNlW0BdfSIgKQogcHJpbnQgLXJsIC0tICIkeyhvKXJlc3VsdFtAXX0iCiB6 cnVudGllIGRiYXNlCiB6cnRpZSAtZCBkYi9yZWRpcyAtZiAkZGIxIGRiYXNlCiBlY2hvICRkYmFz ZVthXQogZWNobyAkZGJhc2VbY10KIHJlc3VsdD0oICIkeyhrdilkYmFzZVtAXX0iICkKIHByaW50 IC1ybCAtLSAiJHsobylyZXN1bHRbQF19IgogenJ1bnRpZSBkYmFzZQowOkFwcGVuZCB3aXRoICs9 KCApLCBhbHNvIHdpdGggZXhpc3RpbmcgZGF0YSwgYWxzbyAoa3YpIHNjYW4KPmIKPmIKPmEKPmIK PmIKPmQKPmEKPmIKPmMKPmQKPmIKPmQKPmEKPmIKPmMKPmQKCiB6cnRpZSAtZCBkYi9yZWRpcyAt ZiAkZGIxIGRiYXNlCiBlY2hvICR7KHQpZGJhc2V9CiB6cnVudGllIGRiYXNlCjA6VHlwZSBvZiB0 aWVkIHBhcmFtZXRlcgo+YXNzb2NpYXRpb24tc3BlY2lhbAoKIHR5cGVzZXQgLWdhIGRiYXNlCiB6 cnRpZSAtZCBkYi9yZWRpcyAtZiAkZGIxIGRiYXNlCiBlY2hvICR7KHQpZGJhc2V9CiB6cnVudGll IGRiYXNlCjA6VHlwZSBvZiB0aWVkIHBhcmFtZXRlciwgd2l0aCBwcmVjZWRpbmcgdW5zZXQKPmFz c29jaWF0aW9uLXNwZWNpYWwKCiBsb2NhbCAtYSBkYmFzZQogenJ0aWUgLWQgZGIvcmVkaXMgLWYg JGRiMSBkYmFzZQogZWNobyAkeyh0KWRiYXNlfQogenJ1bnRpZSBkYmFzZQowOlR5cGUgb2YgdGll ZCBwYXJhbWV0ZXIsIHdpdGggbG9jYWwgcGFyYW1ldGVyIGFscmVhZHkgZXhpc3RpbmcKPmFzc29j aWF0aW9uLWxvY2FsLXNwZWNpYWwKCiBsb2NhbCAtYSBkYmFzZQogZGJhc2U9KCBmcm9tYXJyYXkg KQogKCkgewogICAgIGxvY2FsIC1hIGRiYXNlCiAgICAgenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRi MSBkYmFzZQogICAgIGVjaG8gJHsodClkYmFzZX0KICAgICB6cnVudGllIGRiYXNlCiB9CiBlY2hv ICRkYmFzZVsxXQogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFzZQogZWNobyAiQ2FuIGNv bm5lY3Q6IiAkZGJhc2VbYV0KIHpydW50aWUgZGJhc2UKMDpUZXN0IG9mIGF1dG9tYXRpYyB1bnRp ZSAodXNlIG9mIGxvY2FsIHNjb3BlKSBhbmQgb2Ygc2NvcGluZwo+YXNzb2NpYXRpb24tbG9jYWwt c3BlY2lhbAo+ZnJvbWFycmF5Cj5DYW4gY29ubmVjdDogYgoKIGVjaG8gRmlyc3QgJHpyZWRpc190 aWVkICR7I3pyZWRpc190aWVkfQogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFzZQogZWNo byAkenJlZGlzX3RpZWQgJHsjenJlZGlzX3RpZWR9CiB6cnRpZSAtZCBkYi9yZWRpcyAtZiAkZGIy IGRiYXNlMgogZWNobyAkenJlZGlzX3RpZWQgJHsjenJlZGlzX3RpZWR9CiB6cnVudGllIGRiYXNl CiBlY2hvICR6cmVkaXNfdGllZCAkeyN6cmVkaXNfdGllZH0KIHpydW50aWUgZGJhc2UyCiBlY2hv ICR6cmVkaXNfdGllZCAkeyN6cmVkaXNfdGllZH0KMDp6cmVkaXNfdGllZCBwYXJhbWV0ZXIKPkZp cnN0IDAKPmRiYXNlIDEKPmRiYXNlIGRiYXNlMiAyCj5kYmFzZTIgMQo+MAoKIHVuc2V0IHpyZWRp c190aWVkIDI+L2Rldi9udWxsCjE6dW5zZXQgb2YgcmVhZC1vbmx5IHpnZGJtX3RpZWQgcGFyYW1l dGVyCgogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFzZQogZGJhc2Vb5ryi5a2XXT3mvKLl rZcKIGVjaG8gJGRiYXNlW+a8ouWtl10KIHpydW50aWUgZGJhc2UKIHpydGllIC1kIGRiL3JlZGlz IC1mICRkYjEgZGJhc2UKIGVjaG8gJGRiYXNlW+a8ouWtl10KIHpydW50aWUgLXUgZGJhc2UKMDpV bmljb2RlIHRlc3QKPua8ouWtlwo+5ryi5a2XCgoga2V5PSJhYiIkJ1wwJyJlZiIKIHpydGllIC1k IGRiL3JlZGlzIC1mICRkYjEgZGJhc2UKIGRiYXNlWyRrZXldPXZhbHVlCiBlY2hvICRkYmFzZVsk a2V5XQogenJ1bnRpZSBkYmFzZQogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFzZQogZWNo byAkZGJhc2VbJGtleV0KIHpydW50aWUgZGJhc2UKIHpydGllIC1kIGRiL3JlZGlzIC1mICRkYjEg ZGJhc2UKIGRiYXNlWyRrZXldPSRrZXkKIHpydW50aWUgZGJhc2UKIHpydGllIC1kIGRiL3JlZGlz IC1mICRkYjEgZGJhc2UKIFtbICIkZGJhc2VbJGtleV0iID0gIiRrZXkiIF1dICYmIGVjaG8gY29y cmVjdAogenJ1bnRpZSBkYmFzZQowOk1ldGFmaWNhdGlvbiBvZiAkJ1wwJwo+dmFsdWUKPnZhbHVl Cj5jb3JyZWN0CgogenJ0aWUgLWQgZGIvcmVkaXMgLWYgJGRiMSBkYmFzZQogZGJhc2U9KCDmvKLl rZcg5ryi5a2XICkKIGVjaG8gJGRiYXNlW+a8ouWtl10KIHpydW50aWUgZGJhc2UKIHpydGllIC1k IGRiL3JlZGlzIC1mICRkYjEgZGJhc2UKIGVjaG8gJGRiYXNlW+a8ouWtl10KIHpydW50aWUgZGJh c2UKIGtleT0iYWIiJCdcMCciZWYiCiB6cnRpZSAtZCBkYi9yZWRpcyAtZiAkZGIxIGRiYXNlCiBk YmFzZSs9KCAka2V5ICRrZXkgKQogenJ1bnRpZSBkYmFzZQogenJ0aWUgLWQgZGIvcmVkaXMgLWYg JGRiMSBkYmFzZQogW1sgIiRkYmFzZVska2V5XSIgPSAiJGtleSIgXV0gJiYgZWNobyBjb3JyZWN0 CiB6cnVudGllIGRiYXNlCjA6VW5pY29kZSAmIG1ldGFmaWNhdGlvbiB0ZXN0LCBkaWZmZXJlbnQg aGFzaCBhY2Nlc3MKPua8ouWtlwo+5ryi5a2XCj5jb3JyZWN0CgogenJ0aWUgLWQgZGIvcmVkaXMg LWYgJGRiMSBkYmFzZQogZGJhc2U9KCDmvKLlrZcg5ryi5a2XICkKIHpydW50aWUgZGJhc2UKIHpy dGllIC1kIGRiL3JlZGlzIC1mICRkYjEgZGJhc2UKIG5vZ2xvYiBwcmludCAtcmwgJHsoa3YpZGJh c2VbQF19CiB6cnVudGllIGRiYXNlCjA6SGFzaCBzY2FubmluZyBhbmQgbWV0YWZpY2F0aW9uCj7m vKLlrZcKPua8ouWtlwoKIHpydGllIC1kIGRiL3JlZGlzIC1mICRkYjEgZGJhc2UKIG5vZ2xvYiBw cmludCAtcmwgJHsob2t2KWRiYXNlW0BdfQogenJ1bnRpZSBkYmFzZQowOlNvcnRlZCBoYXNoIHNj YW5uaW5nIGFuZCBtZXRhZmljYXRpb24KPua8ouWtlwo+5ryi5a2XCgogenJ0aWUgLWQgZGIvcmVk aXMgLWYgJGRiMSBkYmFzZQogenJlZGlzaG9zdCBkYmFzZQogW1sgJFJFUExZID0gIjEyNy4wLjAu MTo2Mzc5LzEwIiBdXSAmJiBlY2hvIGNvcnJlY3QKIHpydW50aWUgZGJhc2UKIHpydGllIC1kIGRi L3JlZGlzIC1mICRkYjIgZGJhc2UKIHpyZWRpc2hvc3QgZGJhc2UKIFtbICRSRVBMWSA9ICIxMjcu MC4wLjEvMTEiIF1dICYmIGVjaG8gY29ycmVjdAogenJ1bnRpZSBkYmFzZQowOnpyZWRpc2hvc3Qg YnVpbHRpbgo+Y29ycmVjdAo+Y29ycmVjdAoKIHpydGllIC1kIGRiL3JlZGlzIC1mICRkYjEgZGJh c2UKIGRiYXNlW3Rlc3RrZXldPXZhbHVlMQogZnVuKCkgeyB3aGlsZSByZWFkIGxpbmU7IGRvIGVj aG8gJGxpbmU7IGRvbmUgfQogZXZhbCAiZGJhc2VbdGVzdGtleV09dmFsdWUyIiB8IGZ1bgogZWNo byAkZGJhc2VbdGVzdGtleV0KIHpyZWRpc2NsZWFyIGRiYXNlIHRlc3RrZXkKIGVjaG8gJGRiYXNl W3Rlc3RrZXldCiB6cnVudGllIGRiYXNlCjA6VGVzdCBzdG9yZSBpbiBmb3JrZWQgWnNoCj52YWx1 ZTEKPnZhbHVlMgoKIHpydGllIC1wIC1kIGRiL3JlZGlzIC1mICRkYjEgZGJhc2UKIGRiYXNlW3Rl c3RrZXldPXZhbHVlMQogZWNobyAkZGJhc2VbdGVzdGtleV0KIGZ1bigpIHsgd2hpbGUgcmVhZCBs aW5lOyBkbyBlY2hvICRsaW5lOyBkb25lIH0KIGV2YWwgImRiYXNlW3Rlc3RrZXldPXZhbHVlMiIg fCBmdW4KIGVjaG8gJGRiYXNlW3Rlc3RrZXldCiB6cnVudGllIGRiYXNlCjA6VGVzdCBzdG9yZSBp biBmb3JrZWQgWnNoLCB3aXRoIC1wIHBhc3N0aHJvdWdoCj52YWx1ZTEKPnZhbHVlMgoKIHpydGll IC1kIGRiL3JlZGlzIC1mICRkYjEgZGJhc2UKIGVjaG8gJGRiYXNlW2FdICRkYmFzZVtiXSAkZGJh c2VbY10KIHVuc2V0IGRiYXNlCiB6cnRpZSAtciAtZCBkYi9yZWRpcyAtZiAkZGIxIGRiYXNlCiBl Y2hvICRkYmFzZVthXSAkZGJhc2VbYl0gJGRiYXNlW2NdCiB6cnVudGllIC11IGRiYXNlCjA6VGVz dCByZWZlcmVuY2VzIHRvIG5vdC1leGlzdGluZyBlbGVtZW50cwo+Cj4KCiVjbGVhbgoKIHJlZGlz LWNsaSAtbiAxMCBmbHVzaGRiCiByZWRpcy1jbGkgLW4gMTEgZmx1c2hkYgo= --5933c637_46e87ccd_c8d8--