X-Original-To: pgsql-patches-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 8AE8D52C84 for ; Thu, 14 Jul 2005 21:22:33 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 40471-02 for ; Fri, 15 Jul 2005 00:22:32 +0000 (GMT) Received: from mail.Mi8.com (mail.mi8.com [63.240.6.41]) by svr1.postgresql.org (Postfix) with ESMTP id D91FF52834 for ; Thu, 14 Jul 2005 21:22:27 -0300 (ADT) Received: from 172.16.1.110 by mail.Mi8.com with ESMTP (- GW01 Welcome to Mi8 Corporation www.Mi8.com); Thu, 14 Jul 2005 20:22:19 -0400 X-Server-Uuid: F1A2E19A-84E4-48DD-8F48-B475613F58B2 Received: from MI8NYCMAIL06.Mi8.com ([172.16.1.175]) by D01SMTP01.Mi8.com with Microsoft SMTPSVC(6.0.3790.211); Thu, 14 Jul 2005 20:22:19 -0400 Received: from 67.103.45.218 ([67.103.45.218]) by MI8NYCMAIL06.Mi8.com ( [172.16.1.219]) via Exchange Front-End Server mi8owa.mi8.com ( [172.16.1.106]) with Microsoft Exchange Server HTTP-DAV ; Thu, 14 Jul 2005 20:22:18 -0500 User-Agent: Microsoft-Entourage/11.1.0.040913 Date: Thu, 14 Jul 2005 17:22:18 -0700 Subject: Re: COPY FROM performance improvements From: "Alon Goldshuv" To: pgsql-patches@postgresql.org Message-ID: In-Reply-To: MIME-Version: 1.0 X-OriginalArrivalTime: 15 Jul 2005 00:22:19.0800 (UTC) FILETIME=[43450180:01C588D3] X-WSS-ID: 6EC9DE311J42555262-01-01 Content-Type: multipart/mixed; boundary=B_3204206540_47940875 X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=1.601 tagged_above=0 required=5 tests=AWL, FORGED_RCVD_HELO, RCVD_NUMERIC_HELO X-Spam-Level: * X-Archive-Number: 200507/314 X-Sequence-Number: 16654 > This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. --B_3204206540_47940875 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit I revisited my patch and removed the code duplications that were there, and added support for CSV with buffered input, so CSV now runs faster too (although it is not as optimized as the TEXT format parsing). So now TEXT,CSV and BINARY are all parsed in CopyFrom(), like in the original file. Patch attached. Greetings, Alon. --B_3204206540_47940875 Content-Type: application/octet-stream; name=copy_parse_improvements_V15.patch Content-Disposition: attachment; filename=copy_parse_improvements_V15.patch Content-Transfer-Encoding: base64 SW5kZXg6IHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHkuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBm aWxlOiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5 LmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjQ3CmRpZmYgLWMgLXIxLjI0NyBjb3B5LmMK KioqIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHkuYwkxMCBKdWwgMjAwNSAyMToxMzo1OCAt MDAwMAkxLjI0NwotLS0gc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weS5jCTE1IEp1bCAyMDA1 IDAwOjA3OjQ5IC0wMDAwCioqKioqKioqKioqKioqKgoqKiogOCwxNCAqKioqCiAgICoKICAg KgogICAqIElERU5USUZJQ0FUSU9OCiEgICoJICAkUG9zdGdyZVNRTDogcGdzcWwvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvY29weS5jLHYgMS4yNDcgMjAwNS8wNy8xMCAyMToxMzo1OCB0Z2wg RXhwICQKICAgKgogICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAqLwotLS0gOCwxNCAtLS0t CiAgICoKICAgKgogICAqIElERU5USUZJQ0FUSU9OCiEgICoJICAkUG9zdGdyZVNRTDogcGdz cWwvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weS5jLHYgMS4yNDYgMjAwNS8wNi8yOCAwNTow ODo1MyB0Z2wgRXhwICQKICAgKgogICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAqLwoqKioq KioqKioqKioqKioKKioqIDUwLDU1ICoqKioKLS0tIDUwLDU2IC0tLS0KICAKICAjZGVmaW5l IElTT0NUQUwoYykgKCgoYykgPj0gJzAnKSAmJiAoKGMpIDw9ICc3JykpCiAgI2RlZmluZSBP Q1RWQUxVRShjKSAoKGMpIC0gJzAnKQorICNkZWZpbmUgQ09QWV9CVUZfU0laRSA2NTUzNgog IAogIC8qCiAgICogUmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IHNvdXJjZS9kZXN0IGNhc2Vz IHdlIG5lZWQgdG8gd29ycnkgYWJvdXQgYXQKKioqKioqKioqKioqKioqCioqKiA2Myw3OCAq KioqCiAgfSBDb3B5RGVzdDsKICAKICAvKgotICAqIFN0YXRlIGluZGljYXRvciBzaG93aW5n IHdoYXQgc3RvcHBlZCBDb3B5UmVhZEF0dHJpYnV0ZSgpCi0gICovCi0gdHlwZWRlZiBlbnVt IENvcHlSZWFkUmVzdWx0Ci0gewotIAlOT1JNQUxfQVRUUiwKLSAJRU5EX09GX0xJTkUsCi0g CVVOVEVSTUlOQVRFRF9GSUVMRAotIH0gQ29weVJlYWRSZXN1bHQ7Ci0gCi0gLyoKICAgKglS ZXByZXNlbnRzIHRoZSBlbmQtb2YtbGluZSB0ZXJtaW5hdG9yIHR5cGUgb2YgdGhlIGlucHV0 CiAgICovCiAgdHlwZWRlZiBlbnVtIEVvbFR5cGUKLS0tIDY0LDY5IC0tLS0KKioqKioqKioq KioqKioqCioqKiA5NywxMDIgKioqKgotLS0gODgsOTYgLS0tLQogIHN0YXRpYyBFb2xUeXBl IGVvbF90eXBlOwkJLyogRU9MIHR5cGUgb2YgaW5wdXQgKi8KICBzdGF0aWMgaW50CWNsaWVu dF9lbmNvZGluZzsJLyogcmVtb3RlIHNpZGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcgKi8KICBz dGF0aWMgaW50CXNlcnZlcl9lbmNvZGluZzsJLyogbG9jYWwgZW5jb2RpbmcgKi8KKyBzdGF0 aWMgY2hhcgllb2xfY2hbMl07CQkJLyogVGhlIGJ5dGUgdmFsdWVzIG9mIHRoZSAxIG9yIDIg ZW9sIGJ5dGVzICovCisgc3RhdGljIGJvb2wgY2xpZW50X2VuY29kaW5nX29ubHk7IC8qIHRy dWUgaWYgY2xpZW50IGVuY29kaW5nIGlzIGEgbm9uCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAqIHN1cHBvcnRlZCBzZXJ2ZXIgZW5jb2RpbmcgKi8KICAKICAvKiB0 aGVzZSBhcmUganVzdCBmb3IgZXJyb3IgbWVzc2FnZXMsIHNlZSBjb3B5X2luX2Vycm9yX2Nh bGxiYWNrICovCiAgc3RhdGljIGJvb2wgY29weV9iaW5hcnk7CQkvKiBpcyBpdCBhIGJpbmFy eSBjb3B5PyAqLwoqKioqKioqKioqKioqKioKKioqIDEwNCwxMjYgKioqKgogIHN0YXRpYyBp bnQJY29weV9saW5lbm87CQkvKiBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2FnZXMgKi8K ICBzdGF0aWMgY29uc3QgY2hhciAqY29weV9hdHRuYW1lOwkvKiBjdXJyZW50IGF0dCBmb3Ig ZXJyb3IgbWVzc2FnZXMgKi8KICAKICAKICAvKgogICAqIFRoZXNlIHN0YXRpYyB2YXJpYWJs ZXMgYXJlIHVzZWQgdG8gYXZvaWQgaW5jdXJyaW5nIG92ZXJoZWFkIGZvciBlYWNoCiEgICog YXR0cmlidXRlIHByb2Nlc3NlZC4gIGF0dHJpYnV0ZV9idWYgaXMgcmV1c2VkIG9uIGVhY2gg Q29weVJlYWRBdHRyaWJ1dGUKICAgKiBjYWxsIHRvIGhvbGQgdGhlIHN0cmluZyBiZWluZyBy ZWFkIGluLiAgVW5kZXIgbm9ybWFsIHVzZSBpdCB3aWxsIHNvb24KICAgKiBncm93IHRvIGEg c3VpdGFibGUgc2l6ZSwgYW5kIHRoZW4gd2Ugd2lsbCBhdm9pZCBwYWxsb2MvcGZyZWUgb3Zl cmhlYWQKICAgKiBmb3Igc3Vic2VxdWVudCBhdHRyaWJ1dGVzLiAgTm90ZSB0aGF0IENvcHlS ZWFkQXR0cmlidXRlIHJldHVybnMgYSBwb2ludGVyCiEgICogdG8gYXR0cmlidXRlX2J1Zidz IGRhdGEgYnVmZmVyIQogICAqLwohIHN0YXRpYyBTdHJpbmdJbmZvRGF0YSBhdHRyaWJ1dGVf YnVmOwogIAogIC8qCiAgICogU2ltaWxhcmx5LCBsaW5lX2J1ZiBob2xkcyB0aGUgd2hvbGUg aW5wdXQgbGluZSBiZWluZyBwcm9jZXNzZWQgKGl0cwogICAqIGN1cnNvciBmaWVsZCBwb2lu dHMgdG8gdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIHJlYWQgYnkgQ29weVJlYWRBdHRyaWJ1 dGUpLgogICAqIFRoZSBpbnB1dCBjeWNsZSBpcyBmaXJzdCB0byByZWFkIHRoZSB3aG9sZSBs aW5lIGludG8gbGluZV9idWYsIGNvbnZlcnQgaXQKICAgKiB0byBzZXJ2ZXIgZW5jb2Rpbmcs IGFuZCB0aGVuIGV4dHJhY3QgaW5kaXZpZHVhbCBhdHRyaWJ1dGUgZmllbGRzIGludG8KISAg KiBhdHRyaWJ1dGVfYnVmLiAgKFdlIHVzZWQgdG8gaGF2ZSBDb3B5UmVhZEF0dHJpYnV0ZSBy ZWFkIHRoZSBpbnB1dCBzb3VyY2UKICAgKiBkaXJlY3RseSwgYnV0IHRoYXQgY2F1c2VkIGEg bG90IG9mIGVuY29kaW5nIGlzc3VlcyBhbmQgdW5uZWNlc3NhcnkgbG9naWMKICAgKiBjb21w bGV4aXR5LikKICAgKi8KLS0tIDk4LDE0MSAtLS0tCiAgc3RhdGljIGludAljb3B5X2xpbmVu bzsJCS8qIGxpbmUgbnVtYmVyIGZvciBlcnJvciBtZXNzYWdlcyAqLwogIHN0YXRpYyBjb25z dCBjaGFyICpjb3B5X2F0dG5hbWU7CS8qIGN1cnJlbnQgYXR0IGZvciBlcnJvciBtZXNzYWdl cyAqLwogIAorIC8qCisgICogU3RhdGljIHZhcmlhYmxlcyBmb3IgYnVmZmVyZWQgaW5wdXQg cGFyc2luZyAKKyAgKi8KKyBzdGF0aWMgY2hhciBpbnB1dF9idWZbQ09QWV9CVUZfU0laRSAr IDFdOyAvKiBleHRyYSBieXRlIGZvciAnXDAnICovCisgc3RhdGljIGludAlidWZmZXJfaW5k ZXg7CQkvKiBpbnB1dCBidWZmZXIgaW5kZXggKi8KKyBzdGF0aWMgYm9vbCBlbmRfbWFya2Vy OworIHN0YXRpYyBjaGFyICpiZWdsb2M7Cisgc3RhdGljIGNoYXIgKmVuZGxvYzsKKyBzdGF0 aWMgYm9vbCBidWZfZG9uZTsJCQkvKiBmaW5pc2hlZCBwcm9jZXNzaW5nIHRoZSBjdXJyZW50 IGJ1ZmZlciAqLworIHN0YXRpYyBib29sIGxpbmVfZG9uZTsJCQkvKiBmaW5pc2hlZCBwcm9j ZXNzaW5nIHRoZSB3aG9sZSBsaW5lIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKiBzdG9wcGVkIGluIHRoZSBtaWRkbGUgKi8KKyAvKiB0aGVzZSBhcmUgZm9yIENT ViBmb3JtYXQgKi8KKyBzdGF0aWMgYm9vbAlpbl9xdW90ZTsKKyBzdGF0aWMgYm9vbCBsYXN0 X3dhc19lc2M7CisgCisgLyogdGhlc2UgYXJlIGZvciBURVhUIGZvcm1hdCAqLworIHN0YXRp YyBib29sIGVzY19pbl9wcmV2YnVmOwkJLyogZXNjYXBlIHdhcyBsYXN0IGNoYXJhY3RlciBv ZiB0aGUgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW5wdXQg YnVmZmVyICovCisgc3RhdGljIGJvb2wgY3JfaW5fcHJldmJ1ZjsJCS8qIENSIHdhcyBsYXN0 IGNoYXJhY3RlciBvZiB0aGUgZGF0YSBpbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICogYnVmZmVyICovCisgCiAgCiAgLyoKICAgKiBUaGVzZSBzdGF0aWMgdmFy aWFibGVzIGFyZSB1c2VkIHRvIGF2b2lkIGluY3VycmluZyBvdmVyaGVhZCBmb3IgZWFjaAoh ICAqIGF0dHJpYnV0ZSBwcm9jZXNzZWQuICBhdHRyX2J1ZiBpcyByZXVzZWQgb24gZWFjaCBD b3B5UmVhZEF0dHJpYnV0ZQogICAqIGNhbGwgdG8gaG9sZCB0aGUgc3RyaW5nIGJlaW5nIHJl YWQgaW4uICBVbmRlciBub3JtYWwgdXNlIGl0IHdpbGwgc29vbgogICAqIGdyb3cgdG8gYSBz dWl0YWJsZSBzaXplLCBhbmQgdGhlbiB3ZSB3aWxsIGF2b2lkIHBhbGxvYy9wZnJlZSBvdmVy aGVhZAogICAqIGZvciBzdWJzZXF1ZW50IGF0dHJpYnV0ZXMuICBOb3RlIHRoYXQgQ29weVJl YWRBdHRyaWJ1dGUgcmV0dXJucyBhIHBvaW50ZXIKISAgKiB0byBhdHRyX2J1ZidzIGRhdGEg YnVmZmVyIQogICAqLwohIHN0YXRpYyBTdHJpbmdJbmZvRGF0YSBhdHRyX2J1ZjsgCiAgCiAg LyoKICAgKiBTaW1pbGFybHksIGxpbmVfYnVmIGhvbGRzIHRoZSB3aG9sZSBpbnB1dCBsaW5l IGJlaW5nIHByb2Nlc3NlZCAoaXRzCiAgICogY3Vyc29yIGZpZWxkIHBvaW50cyB0byB0aGUg bmV4dCBjaGFyYWN0ZXIgdG8gYmUgcmVhZCBieSBDb3B5UmVhZEF0dHJpYnV0ZSkuCiAgICog VGhlIGlucHV0IGN5Y2xlIGlzIGZpcnN0IHRvIHJlYWQgdGhlIHdob2xlIGxpbmUgaW50byBs aW5lX2J1ZiwgY29udmVydCBpdAogICAqIHRvIHNlcnZlciBlbmNvZGluZywgYW5kIHRoZW4g ZXh0cmFjdCBpbmRpdmlkdWFsIGF0dHJpYnV0ZSBmaWVsZHMgaW50bwohICAqIGF0dHJfYnVm LiAgKFdlIHVzZWQgdG8gaGF2ZSBDb3B5UmVhZEF0dHJpYnV0ZSByZWFkIHRoZSBpbnB1dCBz b3VyY2UKICAgKiBkaXJlY3RseSwgYnV0IHRoYXQgY2F1c2VkIGEgbG90IG9mIGVuY29kaW5n IGlzc3VlcyBhbmQgdW5uZWNlc3NhcnkgbG9naWMKICAgKiBjb21wbGV4aXR5LikKICAgKi8K KioqKioqKioqKioqKioqCioqKiAxMzcsMTU1ICoqKioKICBzdGF0aWMgdm9pZCBDb3B5RnJv bShSZWxhdGlvbiByZWwsIExpc3QgKmF0dG51bWxpc3QsIGJvb2wgYmluYXJ5LCBib29sIG9p ZHMsCiAgIGNoYXIgKmRlbGltLCBjaGFyICpudWxsX3ByaW50LCBib29sIGNzdl9tb2RlLCBj aGFyICpxdW90ZSwgY2hhciAqZXNjYXBlLAogIAkJIExpc3QgKmZvcmNlX25vdG51bGxfYXR0 cywgYm9vbCBoZWFkZXJfbGluZSk7CiEgc3RhdGljIGJvb2wgQ29weVJlYWRMaW5lKGNoYXIg KiBxdW90ZSwgY2hhciAqIGVzY2FwZSk7CiEgc3RhdGljIGNoYXIgKkNvcHlSZWFkQXR0cmli dXRlKGNvbnN0IGNoYXIgKmRlbGltLCBjb25zdCBjaGFyICpudWxsX3ByaW50LAohIAkJCQkg IENvcHlSZWFkUmVzdWx0ICpyZXN1bHQsIGJvb2wgKmlzbnVsbCk7CiEgc3RhdGljIGNoYXIg KkNvcHlSZWFkQXR0cmlidXRlQ1NWKGNvbnN0IGNoYXIgKmRlbGltLCBjb25zdCBjaGFyICpu dWxsX3ByaW50LAohIAkJCQkJIGNoYXIgKnF1b3RlLCBjaGFyICplc2NhcGUsCiEgCQkJCQkg Q29weVJlYWRSZXN1bHQgKnJlc3VsdCwgYm9vbCAqaXNudWxsKTsKICBzdGF0aWMgRGF0dW0g Q29weVJlYWRCaW5hcnlBdHRyaWJ1dGUoaW50IGNvbHVtbl9ubywgRm1nckluZm8gKmZsaW5m bywKISAJCQkJCQlPaWQgdHlwaW9wYXJhbSwgaW50MzIgdHlwbW9kLCBib29sICppc251bGwp OwogIHN0YXRpYyB2b2lkIENvcHlBdHRyaWJ1dGVPdXQoY2hhciAqc3RyaW5nLCBjaGFyICpk ZWxpbSk7CiAgc3RhdGljIHZvaWQgQ29weUF0dHJpYnV0ZU91dENTVihjaGFyICpzdHJpbmcs IGNoYXIgKmRlbGltLCBjaGFyICpxdW90ZSwKICAJCQkJCWNoYXIgKmVzY2FwZSwgYm9vbCBm b3JjZV9xdW90ZSk7CiAgc3RhdGljIExpc3QgKkNvcHlHZXRBdHRudW1zKFJlbGF0aW9uIHJl bCwgTGlzdCAqYXR0bmFtZWxpc3QpOwogIHN0YXRpYyB2b2lkIGxpbWl0X3ByaW50b3V0X2xl bmd0aChTdHJpbmdJbmZvIGJ1Zik7CiAgCiAgLyogSW50ZXJuYWwgY29tbXVuaWNhdGlvbnMg ZnVuY3Rpb25zICovCiAgc3RhdGljIHZvaWQgU2VuZENvcHlCZWdpbihib29sIGJpbmFyeSwg aW50IG5hdHRzKTsKLS0tIDE1MiwxNzYgLS0tLQogIHN0YXRpYyB2b2lkIENvcHlGcm9tKFJl bGF0aW9uIHJlbCwgTGlzdCAqYXR0bnVtbGlzdCwgYm9vbCBiaW5hcnksIGJvb2wgb2lkcywK ICAgY2hhciAqZGVsaW0sIGNoYXIgKm51bGxfcHJpbnQsIGJvb2wgY3N2X21vZGUsIGNoYXIg KnF1b3RlLCBjaGFyICplc2NhcGUsCiAgCQkgTGlzdCAqZm9yY2Vfbm90bnVsbF9hdHRzLCBi b29sIGhlYWRlcl9saW5lKTsKISBzdGF0aWMgYm9vbCBDb3B5UmVhZExpbmVUZXh0KHNpemVf dCBieXRlc3JlYWQsIGNoYXIgKmVzY2FwZSk7CiEgc3RhdGljIGJvb2wgQ29weVJlYWRMaW5l Q1NWKHNpemVfdCBieXRlc3JlYWQsIGNoYXIgKnF1b3RlLCBjaGFyICplc2NhcGUpOwohIHN0 YXRpYyB2b2lkIENvcHlSZWFkQXR0cmlidXRlc1RleHQoY29uc3QgY2hhciAqZGVsaW0sIGNv bnN0IGNoYXIgKmVzY2FwZSwgY29uc3QgY2hhciAqbnVsbF9wcmludCwKISAJCQkJCQkJCSAg IGludCBudWxsX3ByaW50X2xlbiwgY2hhciAqbnVsbHMsIExpc3QgKmF0dG51bWxpc3QsIAoh IAkJCQkJCQkJICAgaW50ICphdHRyX29mZnNldHMsIGludCBudW1fcGh5c19hdHRycywgRm9y bV9wZ19hdHRyaWJ1dGUgKmF0dHIpOwohIHN0YXRpYyB2b2lkIENvcHlSZWFkQXR0cmlidXRl c0NTVihjb25zdCBjaGFyICpkZWxpbSwgY29uc3QgY2hhciAqbnVsbF9wcmludCwgY2hhciAq cXVvdGUsCiEgCQkJCQkJCQkgIGNoYXIgKmVzY2FwZSwgaW50IG51bGxfcHJpbnRfbGVuLCBj aGFyICpudWxscywgTGlzdCAqYXR0bnVtbGlzdCwgCiEgCQkJCQkJCQkgIGludCAqYXR0cl9v ZmZzZXRzLCBpbnQgbnVtX3BoeXNfYXR0cnMsIEZvcm1fcGdfYXR0cmlidXRlICphdHRyKTsK ICBzdGF0aWMgRGF0dW0gQ29weVJlYWRCaW5hcnlBdHRyaWJ1dGUoaW50IGNvbHVtbl9ubywg Rm1nckluZm8gKmZsaW5mbywKISAJCQkJCQlPaWQgdHlwaW9wYXJhbSwgYm9vbCAqaXNudWxs KTsKISBzdGF0aWMgY2hhciAqQ29weVJlYWRPaWRBdHRyKGNvbnN0IGNoYXIgKmRlbGltLCBj b25zdCBjaGFyICpudWxsX3ByaW50LCBpbnQgbnVsbF9wcmludF9sZW4sCiEgCQkJCSAgICAg ICAgICAgICBib29sICppc251bGwpOwogIHN0YXRpYyB2b2lkIENvcHlBdHRyaWJ1dGVPdXQo Y2hhciAqc3RyaW5nLCBjaGFyICpkZWxpbSk7CiAgc3RhdGljIHZvaWQgQ29weUF0dHJpYnV0 ZU91dENTVihjaGFyICpzdHJpbmcsIGNoYXIgKmRlbGltLCBjaGFyICpxdW90ZSwKICAJCQkJ CWNoYXIgKmVzY2FwZSwgYm9vbCBmb3JjZV9xdW90ZSk7CiAgc3RhdGljIExpc3QgKkNvcHlH ZXRBdHRudW1zKFJlbGF0aW9uIHJlbCwgTGlzdCAqYXR0bmFtZWxpc3QpOwogIHN0YXRpYyB2 b2lkIGxpbWl0X3ByaW50b3V0X2xlbmd0aChTdHJpbmdJbmZvIGJ1Zik7Cisgc3RhdGljIGJv b2wgRGV0ZWN0TGluZUVuZChzaXplX3QgYnl0ZXNyZWFkLCBjaGFyICpxdW90ZSwgY2hhciAq ZXNjYXBlKTsKKyAKICAKICAvKiBJbnRlcm5hbCBjb21tdW5pY2F0aW9ucyBmdW5jdGlvbnMg Ki8KICBzdGF0aWMgdm9pZCBTZW5kQ29weUJlZ2luKGJvb2wgYmluYXJ5LCBpbnQgbmF0dHMp OwoqKioqKioqKioqKioqKioKKioqIDE1OSwxNzUgKioqKgogIHN0YXRpYyB2b2lkIENvcHlT ZW5kU3RyaW5nKGNvbnN0IGNoYXIgKnN0cik7CiAgc3RhdGljIHZvaWQgQ29weVNlbmRDaGFy KGNoYXIgYyk7CiAgc3RhdGljIHZvaWQgQ29weVNlbmRFbmRPZlJvdyhib29sIGJpbmFyeSk7 CiEgc3RhdGljIHZvaWQgQ29weUdldERhdGEodm9pZCAqZGF0YWJ1ZiwgaW50IGRhdGFzaXpl KTsKISBzdGF0aWMgaW50CUNvcHlHZXRDaGFyKHZvaWQpOwogIAogICNkZWZpbmUgQ29weUdl dEVvZigpICAoZmVfZW9mKQotIHN0YXRpYyBpbnQJQ29weVBlZWtDaGFyKHZvaWQpOwotIHN0 YXRpYyB2b2lkIENvcHlEb25lUGVlayhpbnQgYywgYm9vbCBwaWNrdXApOwogIHN0YXRpYyB2 b2lkIENvcHlTZW5kSW50MzIoaW50MzIgdmFsKTsKICBzdGF0aWMgaW50MzIgQ29weUdldElu dDMyKHZvaWQpOwogIHN0YXRpYyB2b2lkIENvcHlTZW5kSW50MTYoaW50MTYgdmFsKTsKICBz dGF0aWMgaW50MTYgQ29weUdldEludDE2KHZvaWQpOwogIAogIAogIC8qCiAgICogU2VuZCBj b3B5IHN0YXJ0L3N0b3AgbWVzc2FnZXMgZm9yIGZyb250ZW5kIGNvcGllcy4gIFRoZXNlIGhh dmUgY2hhbmdlZAotLS0gMTgwLDE5NyAtLS0tCiAgc3RhdGljIHZvaWQgQ29weVNlbmRTdHJp bmcoY29uc3QgY2hhciAqc3RyKTsKICBzdGF0aWMgdm9pZCBDb3B5U2VuZENoYXIoY2hhciBj KTsKICBzdGF0aWMgdm9pZCBDb3B5U2VuZEVuZE9mUm93KGJvb2wgYmluYXJ5KTsKISBzdGF0 aWMgaW50CUNvcHlHZXREYXRhKHZvaWQgKmRhdGFidWYsIGludCBkYXRhc2l6ZSk7CiAgCiAg I2RlZmluZSBDb3B5R2V0RW9mKCkgIChmZV9lb2YpCiAgc3RhdGljIHZvaWQgQ29weVNlbmRJ bnQzMihpbnQzMiB2YWwpOwogIHN0YXRpYyBpbnQzMiBDb3B5R2V0SW50MzIodm9pZCk7CiAg c3RhdGljIHZvaWQgQ29weVNlbmRJbnQxNihpbnQxNiB2YWwpOwogIHN0YXRpYyBpbnQxNiBD b3B5R2V0SW50MTYodm9pZCk7CiAgCisgLyogYnl0ZSBzY2FuaW5nIHV0aWxzICovCisgc3Rh dGljIGNoYXIgKnNjYW5UZXh0TGluZShjb25zdCBjaGFyICpzLCBjaGFyIGMsIHNpemVfdCBs ZW4pOworIHN0YXRpYyBjaGFyICpzY2FuQ1NWTGluZShjb25zdCBjaGFyICpzLCBjaGFyIGMx LCBjaGFyIGMyLCBjaGFyIGMzLCBzaXplX3QgbGVuKTsKKyBzdGF0aWMgY2hhciAqc2NhblRl eHRBdHRyKGNvbnN0IGNoYXIgKnMsIGNoYXIgYzEsIGNoYXIgYzIsIHNpemVfdCBsZW4pOwog IAogIC8qCiAgICogU2VuZCBjb3B5IHN0YXJ0L3N0b3AgbWVzc2FnZXMgZm9yIGZyb250ZW5k IGNvcGllcy4gIFRoZXNlIGhhdmUgY2hhbmdlZAoqKioqKioqKioqKioqKioKKioqIDM4Miwz OTUgKioqKgogICAqIEl0IHNlZW1zIHVud2lzZSB0byBhbGxvdyB0aGUgQ09QWSBJTiB0byBj b21wbGV0ZSBub3JtYWxseSBpbiB0aGF0IGNhc2UuCiAgICoKICAgKiBOQjogbm8gZGF0YSBj b252ZXJzaW9uIGlzIGFwcGxpZWQgYnkgdGhlc2UgZnVuY3Rpb25zCiAgICovCiEgc3RhdGlj IHZvaWQKICBDb3B5R2V0RGF0YSh2b2lkICpkYXRhYnVmLCBpbnQgZGF0YXNpemUpCiAgewog IAlzd2l0Y2ggKGNvcHlfZGVzdCkKICAJewogIAkJY2FzZSBDT1BZX0ZJTEU6CiEgCQkJZnJl YWQoZGF0YWJ1ZiwgZGF0YXNpemUsIDEsIGNvcHlfZmlsZSk7CiAgCQkJaWYgKGZlb2YoY29w eV9maWxlKSkKICAJCQkJZmVfZW9mID0gdHJ1ZTsKICAJCQlicmVhazsKLS0tIDQwNCw0MjIg LS0tLQogICAqIEl0IHNlZW1zIHVud2lzZSB0byBhbGxvdyB0aGUgQ09QWSBJTiB0byBjb21w bGV0ZSBub3JtYWxseSBpbiB0aGF0IGNhc2UuCiAgICoKICAgKiBOQjogbm8gZGF0YSBjb252 ZXJzaW9uIGlzIGFwcGxpZWQgYnkgdGhlc2UgZnVuY3Rpb25zCisgICoKKyAgKiBSZXR1cm5z OiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgcmVhZAorICAq IGludG8gdGhlIGRhdGEgYnVmZmVyLgogICAqLwohIHN0YXRpYyBpbnQKICBDb3B5R2V0RGF0 YSh2b2lkICpkYXRhYnVmLCBpbnQgZGF0YXNpemUpCiAgeworIAlzaXplX3QJCWJ5dGVzcmVh ZCA9IDA7CisgCiAgCXN3aXRjaCAoY29weV9kZXN0KQogIAl7CiAgCQljYXNlIENPUFlfRklM RToKISAJCQlieXRlc3JlYWQgPSBmcmVhZChkYXRhYnVmLCAxLCBkYXRhc2l6ZSwgY29weV9m aWxlKTsKICAJCQlpZiAoZmVvZihjb3B5X2ZpbGUpKQogIAkJCQlmZV9lb2YgPSB0cnVlOwog IAkJCWJyZWFrOwoqKioqKioqKioqKioqKioKKioqIDQwMSw0MDYgKioqKgotLS0gNDI4LDQz NSAtLS0tCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9DT05ORUNUSU9OX0ZBSUxVUkUpLAog IAkJCQkJCSBlcnJtc2coInVuZXhwZWN0ZWQgRU9GIG9uIGNsaWVudCBjb25uZWN0aW9uIikp KTsKICAJCQl9CisgCQkJYnl0ZXNyZWFkICs9IGRhdGFzaXplOwkJLyogdXBkYXRlIHRoZSBj b3VudCBvZiBieXRlcyB0aGF0IHdlcmUKKyAJCQkJCQkJCQkJICogcmVhZCBzbyBmYXIgKi8K ICAJCQlicmVhazsKICAJCWNhc2UgQ09QWV9ORVdfRkU6CiAgCQkJd2hpbGUgKGRhdGFzaXpl ID4gMCAmJiAhZmVfZW9mKQoqKioqKioqKioqKioqKioKKioqIDQyOSw0MzUgKioqKgogIAkJ CQkJCWNhc2UgJ2MnOgkJLyogQ29weURvbmUgKi8KICAJCQkJCQkJLyogQ09QWSBJTiBjb3Jy ZWN0bHkgdGVybWluYXRlZCBieSBmcm9udGVuZCAqLwogIAkJCQkJCQlmZV9lb2YgPSB0cnVl OwohIAkJCQkJCQlyZXR1cm47CiAgCQkJCQkJY2FzZSAnZic6CQkvKiBDb3B5RmFpbCAqLwog IAkJCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfUVVF UllfQ0FOQ0VMRUQpLAotLS0gNDU4LDQ2NCAtLS0tCiAgCQkJCQkJY2FzZSAnYyc6CQkvKiBD b3B5RG9uZSAqLwogIAkJCQkJCQkvKiBDT1BZIElOIGNvcnJlY3RseSB0ZXJtaW5hdGVkIGJ5 IGZyb250ZW5kICovCiAgCQkJCQkJCWZlX2VvZiA9IHRydWU7CiEgCQkJCQkJCXJldHVybiBi eXRlc3JlYWQ7CiAgCQkJCQkJY2FzZSAnZic6CQkvKiBDb3B5RmFpbCAqLwogIAkJCQkJCQll cmVwb3J0KEVSUk9SLAogIAkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfUVVFUllfQ0FOQ0VM RUQpLAoqKioqKioqKioqKioqKioKKioqIDQ1OSw1OTggKioqKgogIAkJCQkJYXZhaWwgPSBk YXRhc2l6ZTsKICAJCQkJcHFfY29weW1zZ2J5dGVzKGNvcHlfbXNnYnVmLCBkYXRhYnVmLCBh dmFpbCk7CiAgCQkJCWRhdGFidWYgPSAodm9pZCAqKSAoKGNoYXIgKikgZGF0YWJ1ZiArIGF2 YWlsKTsKICAJCQkJZGF0YXNpemUgLT0gYXZhaWw7CiAgCQkJfQogIAkJCWJyZWFrOwogIAl9 Ci0gfQotIAotIHN0YXRpYyBpbnQKLSBDb3B5R2V0Q2hhcih2b2lkKQotIHsKLSAJaW50CQkJ Y2g7Ci0gCi0gCXN3aXRjaCAoY29weV9kZXN0KQotIAl7Ci0gCQljYXNlIENPUFlfRklMRToK LSAJCQljaCA9IGdldGMoY29weV9maWxlKTsKLSAJCQlicmVhazsKLSAJCWNhc2UgQ09QWV9P TERfRkU6Ci0gCQkJY2ggPSBwcV9nZXRieXRlKCk7Ci0gCQkJaWYgKGNoID09IEVPRikKLSAJ CQl7Ci0gCQkJCS8qIE9ubHkgYSBcLiB0ZXJtaW5hdG9yIGlzIGxlZ2FsIEVPRiBpbiBvbGQg cHJvdG9jb2wgKi8KLSAJCQkJZXJlcG9ydChFUlJPUiwKLSAJCQkJCQkoZXJyY29kZShFUlJD T0RFX0NPTk5FQ1RJT05fRkFJTFVSRSksCi0gCQkJCQkJIGVycm1zZygidW5leHBlY3RlZCBF T0Ygb24gY2xpZW50IGNvbm5lY3Rpb24iKSkpOwotIAkJCX0KLSAJCQlicmVhazsKLSAJCWNh c2UgQ09QWV9ORVdfRkU6Ci0gCQkJewotIAkJCQl1bnNpZ25lZCBjaGFyIGNjOwotIAotIAkJ CQlDb3B5R2V0RGF0YSgmY2MsIDEpOwotIAkJCQlpZiAoZmVfZW9mKQotIAkJCQkJY2ggPSBF T0Y7Ci0gCQkJCWVsc2UKLSAJCQkJCWNoID0gY2M7Ci0gCQkJCWJyZWFrOwotIAkJCX0KLSAJ CWRlZmF1bHQ6Ci0gCQkJY2ggPSBFT0Y7Ci0gCQkJYnJlYWs7Ci0gCX0KLSAJaWYgKGNoID09 IEVPRikKLSAJCWZlX2VvZiA9IHRydWU7Ci0gCXJldHVybiBjaDsKLSB9Ci0gCi0gLyoKLSAg KiBDb3B5UGVla0NoYXIgcmVhZHMgYSBieXRlIGluICJwZWVrYWJsZSIgbW9kZS4KLSAgKgot ICAqIGFmdGVyIGVhY2ggY2FsbCB0byBDb3B5UGVla0NoYXIsIGEgY2FsbCB0byBDb3B5RG9u ZVBlZWsgX211c3RfCi0gICogZm9sbG93LCB1bmxlc3MgRU9GIHdhcyByZXR1cm5lZC4KLSAg KgotICAqIENvcHlEb25lUGVlayB3aWxsIGVpdGhlciB0YWtlIHRoZSBwZWVrZWQgY2hhciBv ZmYgdGhlIHN0cmVhbQotICAqIChpZiBwaWNrdXAgaXMgdHJ1ZSkgb3IgbGVhdmUgaXQgb24g dGhlIHN0cmVhbSAoaWYgcGlja3VwIGlzIGZhbHNlKS4KLSAgKi8KLSBzdGF0aWMgaW50Ci0g Q29weVBlZWtDaGFyKHZvaWQpCi0gewotIAlpbnQJCQljaDsKLSAKLSAJc3dpdGNoIChjb3B5 X2Rlc3QpCi0gCXsKLSAJCWNhc2UgQ09QWV9GSUxFOgotIAkJCWNoID0gZ2V0Yyhjb3B5X2Zp bGUpOwotIAkJCWJyZWFrOwotIAkJY2FzZSBDT1BZX09MRF9GRToKLSAJCQljaCA9IHBxX3Bl ZWtieXRlKCk7Ci0gCQkJaWYgKGNoID09IEVPRikKLSAJCQl7Ci0gCQkJCS8qIE9ubHkgYSBc LiB0ZXJtaW5hdG9yIGlzIGxlZ2FsIEVPRiBpbiBvbGQgcHJvdG9jb2wgKi8KLSAJCQkJZXJl cG9ydChFUlJPUiwKLSAJCQkJCQkoZXJyY29kZShFUlJDT0RFX0NPTk5FQ1RJT05fRkFJTFVS RSksCi0gCQkJCQkJIGVycm1zZygidW5leHBlY3RlZCBFT0Ygb24gY2xpZW50IGNvbm5lY3Rp b24iKSkpOwotIAkJCX0KLSAJCQlicmVhazsKLSAJCWNhc2UgQ09QWV9ORVdfRkU6Ci0gCQkJ ewotIAkJCQl1bnNpZ25lZCBjaGFyIGNjOwotIAotIAkJCQlDb3B5R2V0RGF0YSgmY2MsIDEp OwotIAkJCQlpZiAoZmVfZW9mKQotIAkJCQkJY2ggPSBFT0Y7Ci0gCQkJCWVsc2UKLSAJCQkJ CWNoID0gY2M7Ci0gCQkJCWJyZWFrOwotIAkJCX0KLSAJCWRlZmF1bHQ6Ci0gCQkJY2ggPSBF T0Y7Ci0gCQkJYnJlYWs7Ci0gCX0KLSAJaWYgKGNoID09IEVPRikKLSAJCWZlX2VvZiA9IHRy dWU7Ci0gCXJldHVybiBjaDsKLSB9Ci0gCi0gc3RhdGljIHZvaWQKLSBDb3B5RG9uZVBlZWso aW50IGMsIGJvb2wgcGlja3VwKQotIHsKLSAJaWYgKGZlX2VvZikKLSAJCXJldHVybjsJCQkJ CS8qIGNhbid0IHVuZ2V0IGFuIEVPRiAqLwotIAlzd2l0Y2ggKGNvcHlfZGVzdCkKLSAJewot IAkJY2FzZSBDT1BZX0ZJTEU6Ci0gCQkJaWYgKCFwaWNrdXApCi0gCQkJewotIAkJCQkvKiBX ZSBkb24ndCB3YW50IHRvIHBpY2sgaXQgdXAgLSBzbyBwdXQgaXQgYmFjayBpbiB0aGVyZSAq LwotIAkJCQl1bmdldGMoYywgY29weV9maWxlKTsKLSAJCQl9Ci0gCQkJLyogSWYgd2Ugd2Fu dGVkIHRvIHBpY2sgaXQgdXAsIGl0J3MgYWxyZWFkeSBkb25lICovCi0gCQkJYnJlYWs7Ci0g CQljYXNlIENPUFlfT0xEX0ZFOgotIAkJCWlmIChwaWNrdXApCi0gCQkJewotIAkJCQkvKiBX ZSB3YW50IHRvIHBpY2sgaXQgdXAgKi8KLSAJCQkJKHZvaWQpIHBxX2dldGJ5dGUoKTsKLSAJ CQl9CiAgCiEgCQkJLyoKISAJCQkgKiBJZiB3ZSBkaWRuJ3Qgd2FudCB0byBwaWNrIGl0IHVw LCBqdXN0IGxlYXZlIGl0IHdoZXJlIGl0CiEgCQkJICogc2l0cwohIAkJCSAqLwohIAkJCWJy ZWFrOwohIAkJY2FzZSBDT1BZX05FV19GRToKISAJCQlpZiAoIXBpY2t1cCkKISAJCQl7CiEg CQkJCS8qIFdlIGRvbid0IHdhbnQgdG8gcGljayBpdCB1cCAtIHNvIHB1dCBpdCBiYWNrIGlu IHRoZXJlICovCiEgCQkJCWNvcHlfbXNnYnVmLT5jdXJzb3ItLTsKISAJCQl9CiEgCQkJLyog SWYgd2Ugd2FudGVkIHRvIHBpY2sgaXQgdXAsIGl0J3MgYWxyZWFkeSBkb25lICovCiEgCQkJ YnJlYWs7CiEgCX0KICB9CiAgCi0gCiAgLyoKICAgKiBUaGVzZSBmdW5jdGlvbnMgZG8gYXBw bHkgc29tZSBkYXRhIGNvbnZlcnNpb24KICAgKi8KLS0tIDQ4OCw1MDMgLS0tLQogIAkJCQkJ YXZhaWwgPSBkYXRhc2l6ZTsKICAJCQkJcHFfY29weW1zZ2J5dGVzKGNvcHlfbXNnYnVmLCBk YXRhYnVmLCBhdmFpbCk7CiAgCQkJCWRhdGFidWYgPSAodm9pZCAqKSAoKGNoYXIgKikgZGF0 YWJ1ZiArIGF2YWlsKTsKKyAJCQkJYnl0ZXNyZWFkICs9IGF2YWlsOwkJLyogdXBkYXRlIHRo ZSBjb3VudCBvZiBieXRlcyB0aGF0IHdlcmUKKyAJCQkJCQkJCQkJICogcmVhZCBzbyBmYXIg Ki8KICAJCQkJZGF0YXNpemUgLT0gYXZhaWw7CiAgCQkJfQogIAkJCWJyZWFrOwogIAl9CiAg CiEgCXJldHVybiBieXRlc3JlYWQ7CiAgfQogIAogIC8qCiAgICogVGhlc2UgZnVuY3Rpb25z IGRvIGFwcGx5IHNvbWUgZGF0YSBjb252ZXJzaW9uCiAgICovCioqKioqKioqKioqKioqKgoq KiogOTY4LDk4MCAqKioqCiAgCX0KICAKICAJLyogU2V0IHVwIHZhcmlhYmxlcyB0byBhdm9p ZCBwZXItYXR0cmlidXRlIG92ZXJoZWFkLiAqLwohIAlpbml0U3RyaW5nSW5mbygmYXR0cmli dXRlX2J1Zik7CiAgCWluaXRTdHJpbmdJbmZvKCZsaW5lX2J1Zik7CiAgCWxpbmVfYnVmX2Nv bnZlcnRlZCA9IGZhbHNlOwogIAogIAljbGllbnRfZW5jb2RpbmcgPSBwZ19nZXRfY2xpZW50 X2VuY29kaW5nKCk7CiAgCXNlcnZlcl9lbmNvZGluZyA9IEdldERhdGFiYXNlRW5jb2Rpbmco KTsKICAKICAJY29weV9kZXN0ID0gQ09QWV9GSUxFOwkJLyogZGVmYXVsdCAqLwogIAljb3B5 X2ZpbGUgPSBOVUxMOwogIAljb3B5X21zZ2J1ZiA9IE5VTEw7Ci0tLSA4NzMsOTA1IC0tLS0K ICAJfQogIAogIAkvKiBTZXQgdXAgdmFyaWFibGVzIHRvIGF2b2lkIHBlci1hdHRyaWJ1dGUg b3ZlcmhlYWQuICovCiEgCWluaXRTdHJpbmdJbmZvKCZhdHRyX2J1Zik7CiAgCWluaXRTdHJp bmdJbmZvKCZsaW5lX2J1Zik7CiAgCWxpbmVfYnVmX2NvbnZlcnRlZCA9IGZhbHNlOwogIAog IAljbGllbnRfZW5jb2RpbmcgPSBwZ19nZXRfY2xpZW50X2VuY29kaW5nKCk7CiAgCXNlcnZl cl9lbmNvZGluZyA9IEdldERhdGFiYXNlRW5jb2RpbmcoKTsKICAKKyAJLyoKKyAJICogY2hl Y2sgaWYgdGhlIGNsaWVudCBlbmNvZGluZyBpcyBvbmUgb2YgdGhlIDUgZW5jb2RpbmdzCisg CSAqIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYXMgYSBzZXJ2ZXIgZW5jb2RpbmdzLgorIAkg Ki8KKyAJc3dpdGNoIChjbGllbnRfZW5jb2RpbmcpCisgCXsKKyAJCWNhc2UgUEdfU0pJUzoK KyAJCWNhc2UgUEdfQklHNToKKyAJCWNhc2UgUEdfR0JLOgorIAkJY2FzZSBQR19VSEM6Cisg CQljYXNlIFBHX0dCMTgwMzA6CisgCQkJY2xpZW50X2VuY29kaW5nX29ubHkgPSB0cnVlOwor IAkJCWJyZWFrOworIAkJZGVmYXVsdDoKKyAJCQljbGllbnRfZW5jb2Rpbmdfb25seSA9IGZh bHNlOworIAl9CisgCisgCWlmKCFjc3ZfbW9kZSkKKyAJICAgIGVzY2FwZSA9ICJcXCI7CQkv KiBkZWZhdWx0IGZvciB0ZXh0IGZvcm1hdCAqLworIAogIAljb3B5X2Rlc3QgPSBDT1BZX0ZJ TEU7CQkvKiBkZWZhdWx0ICovCiAgCWNvcHlfZmlsZSA9IE5VTEw7CiAgCWNvcHlfbXNnYnVm ID0gTlVMTDsKKioqKioqKioqKioqKioqCioqKiAxMTA1LDExMTMgKioqKgogIAkJCQkJIGVy cm1zZygiY291bGQgbm90IHdyaXRlIHRvIGZpbGUgXCIlc1wiOiAlbSIsCiAgCQkJCQkJCWZp bGVuYW1lKSkpOwogIAl9CiEgCXBmcmVlKGF0dHJpYnV0ZV9idWYuZGF0YSk7CiAgCXBmcmVl KGxpbmVfYnVmLmRhdGEpOwogIAogIAkvKgogIAkgKiBDbG9zZSB0aGUgcmVsYXRpb24uCUlm IHJlYWRpbmcsIHdlIGNhbiByZWxlYXNlIHRoZSBBY2Nlc3NTaGFyZUxvY2sKICAJICogd2Ug Z290OyBpZiB3cml0aW5nLCB3ZSBzaG91bGQgaG9sZCB0aGUgbG9jayB1bnRpbCBlbmQgb2YK LS0tIDEwMzAsMTAzOSAtLS0tCiAgCQkJCQkgZXJybXNnKCJjb3VsZCBub3Qgd3JpdGUgdG8g ZmlsZSBcIiVzXCI6ICVtIiwKICAJCQkJCQkJZmlsZW5hbWUpKSk7CiAgCX0KISAJcGZyZWUo YXR0cl9idWYuZGF0YSk7CiAgCXBmcmVlKGxpbmVfYnVmLmRhdGEpOwogIAorIAogIAkvKgog IAkgKiBDbG9zZSB0aGUgcmVsYXRpb24uCUlmIHJlYWRpbmcsIHdlIGNhbiByZWxlYXNlIHRo ZSBBY2Nlc3NTaGFyZUxvY2sKICAJICogd2UgZ290OyBpZiB3cml0aW5nLCB3ZSBzaG91bGQg aG9sZCB0aGUgbG9jayB1bnRpbCBlbmQgb2YKKioqKioqKioqKioqKioqCioqKiAxMzQ1LDEz NTEgKioqKgogIAkJCQl7CiAgCQkJCQlieXRlYQkgICAqb3V0cHV0Ynl0ZXM7CiAgCiEgCQkJ CQlvdXRwdXRieXRlcyA9IERhdHVtR2V0Qnl0ZWFQKEZ1bmN0aW9uQ2FsbDEoJm91dF9mdW5j dGlvbnNbYXR0bnVtIC0gMV0sCiAgCQkJCQkJCQkJCQkJCQkJICAgdmFsdWUpKTsKICAJCQkJ CS8qIFdlIGFzc3VtZSB0aGUgcmVzdWx0IHdpbGwgbm90IGhhdmUgYmVlbiB0b2FzdGVkICov CiAgCQkJCQlDb3B5U2VuZEludDMyKFZBUlNJWkUob3V0cHV0Ynl0ZXMpIC0gVkFSSERSU1op OwotLS0gMTI3MSwxMjc4IC0tLS0KICAJCQkJewogIAkJCQkJYnl0ZWEJICAgKm91dHB1dGJ5 dGVzOwogIAohIAkJCQkJb3V0cHV0Ynl0ZXMgPQohIAkJCQkJCURhdHVtR2V0Qnl0ZWFQKEZ1 bmN0aW9uQ2FsbDEoJm91dF9mdW5jdGlvbnNbYXR0bnVtIC0gMV0sCiAgCQkJCQkJCQkJCQkJ CQkJICAgdmFsdWUpKTsKICAJCQkJCS8qIFdlIGFzc3VtZSB0aGUgcmVzdWx0IHdpbGwgbm90 IGhhdmUgYmVlbiB0b2FzdGVkICovCiAgCQkJCQlDb3B5U2VuZEludDMyKFZBUlNJWkUob3V0 cHV0Ynl0ZXMpIC0gVkFSSERSU1opOwoqKioqKioqKioqKioqKioKKioqIDEzOTUsMTQwNCAq KioqCiAgCQlpZiAoY29weV9hdHRuYW1lKQogIAkJewogIAkJCS8qIGVycm9yIGlzIHJlbGV2 YW50IHRvIGEgcGFydGljdWxhciBjb2x1bW4gKi8KISAJCQlsaW1pdF9wcmludG91dF9sZW5n dGgoJmF0dHJpYnV0ZV9idWYpOwogIAkJCWVycmNvbnRleHQoIkNPUFkgJXMsIGxpbmUgJWQs IGNvbHVtbiAlczogXCIlc1wiIiwKICAJCQkJCSAgIGNvcHlfcmVsbmFtZSwgY29weV9saW5l bm8sIGNvcHlfYXR0bmFtZSwKISAJCQkJCSAgIGF0dHJpYnV0ZV9idWYuZGF0YSk7CiAgCQl9 CiAgCQllbHNlCiAgCQl7Ci0tLSAxMzIyLDEzMzEgLS0tLQogIAkJaWYgKGNvcHlfYXR0bmFt ZSkKICAJCXsKICAJCQkvKiBlcnJvciBpcyByZWxldmFudCB0byBhIHBhcnRpY3VsYXIgY29s dW1uICovCiEgCQkJbGltaXRfcHJpbnRvdXRfbGVuZ3RoKCZhdHRyX2J1Zik7CiAgCQkJZXJy Y29udGV4dCgiQ09QWSAlcywgbGluZSAlZCwgY29sdW1uICVzOiBcIiVzXCIiLAogIAkJCQkJ ICAgY29weV9yZWxuYW1lLCBjb3B5X2xpbmVubywgY29weV9hdHRuYW1lLAohIAkJCQkJICAg YXR0cl9idWYuZGF0YSk7CiAgCQl9CiAgCQllbHNlCiAgCQl7CioqKioqKioqKioqKioqKgoq KiogMTQwNiwxNDExICoqKioKLS0tIDEzMzMsMTM0MCAtLS0tCiAgCQkJaWYgKGxpbmVfYnVm X2NvbnZlcnRlZCB8fAogIAkJCQljbGllbnRfZW5jb2RpbmcgPT0gc2VydmVyX2VuY29kaW5n KQogIAkJCXsKKyAJCQkJLyogU3RyaXAgb2ZmIHRoZSBuZXdsaW5lICovCisgCQkJCSoobGlu ZV9idWYuZGF0YSArIGxpbmVfYnVmLmxlbiAtIDEpID0gJ1wwJzsKICAJCQkJbGltaXRfcHJp bnRvdXRfbGVuZ3RoKCZsaW5lX2J1Zik7CiAgCQkJCWVycmNvbnRleHQoIkNPUFkgJXMsIGxp bmUgJWQ6IFwiJXNcIiIsCiAgCQkJCQkJICAgY29weV9yZWxuYW1lLCBjb3B5X2xpbmVubywK KioqKioqKioqKioqKioqCioqKiAxNDg1LDE0OTEgKioqKgogIAlPaWQJCQlpbl9mdW5jX29p ZDsKICAJRGF0dW0JICAgKnZhbHVlczsKICAJY2hhcgkgICAqbnVsbHM7Ci0gCWJvb2wJCWRv bmUgPSBmYWxzZTsKICAJYm9vbAkJaXNudWxsOwogIAlSZXN1bHRSZWxJbmZvICpyZXN1bHRS ZWxJbmZvOwogIAlFU3RhdGUJICAgKmVzdGF0ZSA9IENyZWF0ZUV4ZWN1dG9yU3RhdGUoKTsg LyogZm9yIEV4ZWNDb25zdHJhaW50cygpICovCi0tLSAxNDE0LDE0MTkgLS0tLQoqKioqKioq KioqKioqKioKKioqIDE0OTYsMTUwMSAqKioqCi0tLSAxNDI0LDE0MzQgLS0tLQogIAlFeHBy Q29udGV4dCAqZWNvbnRleHQ7CQkvKiB1c2VkIGZvciBFeGVjRXZhbEV4cHIgZm9yIGRlZmF1 bHQgYXR0cyAqLwogIAlNZW1vcnlDb250ZXh0IG9sZGNvbnRleHQgPSBDdXJyZW50TWVtb3J5 Q29udGV4dDsKICAJRXJyb3JDb250ZXh0Q2FsbGJhY2sgZXJyY29udGV4dDsKKyAgICAgaW50 CQkgICAqYXR0cl9vZmZzZXRzOworIAlpbnQJCQludWxsX3ByaW50X2xlbjsgLyogbGVuZ3Ro IG9mIG51bGwgcHJpbnQgKi8KKyAJYm9vbAkJbm9fbW9yZV9kYXRhOworIAlMaXN0Q2VsbCAg ICpjdXI7CisgCiAgCiAgCXR1cERlc2MgPSBSZWxhdGlvbkdldERlc2NyKHJlbCk7CiAgCWF0 dHIgPSB0dXBEZXNjLT5hdHRyczsKKioqKioqKioqKioqKioqCioqKiAxNjA3LDE2MTMgKioq KgogIAkJfQogIAl9CiAgCiEgCS8qIFByZXBhcmUgdG8gY2F0Y2ggQUZURVIgdHJpZ2dlcnMu ICovCiAgCUFmdGVyVHJpZ2dlckJlZ2luUXVlcnkoKTsKICAKICAJLyoKLS0tIDE1NDAsMTU0 OCAtLS0tCiAgCQl9CiAgCX0KICAKISAJLyoKISAJICogUHJlcGFyZSB0byBjYXRjaCBBRlRF UiB0cmlnZ2Vycy4KISAJICovCiAgCUFmdGVyVHJpZ2dlckJlZ2luUXVlcnkoKTsKICAKICAJ LyoKKioqKioqKioqKioqKioqCioqKiAxNjcxLDE2NzYgKioqKgotLS0gMTYwNiwxNjEyIC0t LS0KICAKICAJdmFsdWVzID0gKERhdHVtICopIHBhbGxvYyhudW1fcGh5c19hdHRycyAqIHNp emVvZihEYXR1bSkpOwogIAludWxscyA9IChjaGFyICopIHBhbGxvYyhudW1fcGh5c19hdHRy cyAqIHNpemVvZihjaGFyKSk7CisgCWF0dHJfb2Zmc2V0cyA9IChpbnQgKikgcGFsbG9jKG51 bV9waHlzX2F0dHJzICogc2l6ZW9mKGludCkpOwogIAogIAkvKiBNYWtlIHJvb20gZm9yIGEg UEFSQU1fRVhFQyB2YWx1ZSBmb3IgZG9tYWluIGNvbnN0cmFpbnQgY2hlY2tzICovCiAgCWlm IChoYXNDb25zdHJhaW50cykKKioqKioqKioqKioqKioqCioqKiAxNjkxLDE3MTIgKioqKgog IAllcnJjb250ZXh0LnByZXZpb3VzID0gZXJyb3JfY29udGV4dF9zdGFjazsKICAJZXJyb3Jf Y29udGV4dF9zdGFjayA9ICZlcnJjb250ZXh0OwogIAohIAkvKiBvbiBpbnB1dCBqdXN0IHRo cm93IHRoZSBoZWFkZXIgbGluZSBhd2F5ICovCiEgCWlmIChoZWFkZXJfbGluZSkKICAJewoh IAkJY29weV9saW5lbm8rKzsKISAJCWRvbmUgPSBDb3B5UmVhZExpbmUocXVvdGUsIGVzY2Fw ZSkgOwogIAl9CiAgCiEgCXdoaWxlICghZG9uZSkKICAJewogIAkJYm9vbAkJc2tpcF90dXBs ZTsKICAJCU9pZAkJCWxvYWRlZF9vaWQgPSBJbnZhbGlkT2lkOwogIAogIAkJQ0hFQ0tfRk9S X0lOVEVSUlVQVFMoKTsKICAKLSAJCWNvcHlfbGluZW5vKys7Ci0gCiAgCQkvKiBSZXNldCB0 aGUgcGVyLXR1cGxlIGV4cHJjb250ZXh0ICovCiAgCQlSZXNldFBlclR1cGxlRXhwckNvbnRl eHQoZXN0YXRlKTsKICAKLS0tIDE2MjcsMTY4MSAtLS0tCiAgCWVycmNvbnRleHQucHJldmlv dXMgPSBlcnJvcl9jb250ZXh0X3N0YWNrOwogIAllcnJvcl9jb250ZXh0X3N0YWNrID0gJmVy cmNvbnRleHQ7CiAgCiEgCS8qCiEgCSAqIGluaXRpYWxpemUgYnVmZmVyZWQgc2NhbiB2YXJp YWJsZXMuCiEgCSAqLwohIAlpZihjc3ZfbW9kZSkKISAJewohIAkgICAgaW5fcXVvdGUgPSBm YWxzZTsKISAJCWxhc3Rfd2FzX2VzYyA9IGZhbHNlOwohIAl9CiEgCiEgCW51bGxfcHJpbnRf bGVuID0gc3RybGVuKG51bGxfcHJpbnQpOwohIAkKISAJLyogU2V0IHVwIGRhdGEgYnVmZmVy IHRvIGhvbGQgYSBjaHVuayBvZiBkYXRhICovCiEgCU1lbVNldChpbnB1dF9idWYsICcgJywg Q09QWV9CVUZfU0laRSAqIHNpemVvZihjaGFyKSk7CiEgCWlucHV0X2J1ZltDT1BZX0JVRl9T SVpFXSA9ICdcMCc7CiEgCiEgCW5vX21vcmVfZGF0YSA9IGZhbHNlOwkJLyogbm8gbW9yZSBp bnB1dCBkYXRhIHRvIHJlYWQgZnJvbSBmaWxlIG9yIEZFICovCiEgCWxpbmVfZG9uZSA9IHRy dWU7CiEgCWJ1Zl9kb25lID0gZmFsc2U7CiEgCiEgCWRvCiAgCXsKISAJCXNpemVfdAkgICBi eXRlc3JlYWQgPSAwOwohIAkJCiEgCQkvKiByZWFkIGEgY2h1bmsgb2YgZGF0YSBpbnRvIHRo ZSBidWZmZXIgKi8KISAJCWlmICghYmluYXJ5KQohIAkJewohIAkJICAgYnl0ZXNyZWFkID0g Q29weUdldERhdGEoaW5wdXRfYnVmLCBDT1BZX0JVRl9TSVpFKTsKISAJCSAgIGJ1Zl9kb25l ID0gZmFsc2U7CiEgCiEgCQkgICAvKiBzZXQgYnVmZmVyIHBvaW50ZXJzIHRvIGJlZ2lubmlu ZyBvZiB0aGUgYnVmZmVyICovCiEgCQkgICBiZWdsb2MgPSBpbnB1dF9idWY7CiEgCQkgICBi dWZmZXJfaW5kZXggPSAwOwogIAl9CiAgCiEgCQkvKgohIAkJICogY29udGludWUgaWYgc29t ZSBieXRlcyB3ZXJlIHJlYWQgb3IgaWYgd2UgZGlkbid0IHJlYWNoIEVPRi4gaWYgd2UKISAJ CSAqIGJvdGggcmVhY2hlZCBFT0YgX2FuZF8gbm8gYnl0ZXMgd2VyZSByZWFkLCBxdWl0IHRo ZSBsb29wIHdlIGFyZQohIAkJICogZG9uZQohIAkJICovCiEgCQlpZiAoYnl0ZXNyZWFkID4g MCB8fCAhZmVfZW9mIHx8IGJpbmFyeSkKISAJCXsKISAKISAJCQl3aGlsZSAoIWJ1Zl9kb25l KQogIAl7CiAgCQlib29sCQlza2lwX3R1cGxlOwogIAkJT2lkCQkJbG9hZGVkX29pZCA9IElu dmFsaWRPaWQ7CiAgCiAgCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOwogIAogIAkJLyogUmVz ZXQgdGhlIHBlci10dXBsZSBleHByY29udGV4dCAqLwogIAkJUmVzZXRQZXJUdXBsZUV4cHJD b250ZXh0KGVzdGF0ZSk7CiAgCioqKioqKioqKioqKioqKgoqKiogMTcxNiwxNzQ2ICoqKioK ICAJCS8qIEluaXRpYWxpemUgYWxsIHZhbHVlcyBmb3Igcm93IHRvIE5VTEwgKi8KICAJCU1l bVNldCh2YWx1ZXMsIDAsIG51bV9waHlzX2F0dHJzICogc2l6ZW9mKERhdHVtKSk7CiAgCQlN ZW1TZXQobnVsbHMsICduJywgbnVtX3BoeXNfYXR0cnMgKiBzaXplb2YoY2hhcikpOwogIAog IAkJaWYgKCFiaW5hcnkpCiAgCQl7Ci0gCQkJQ29weVJlYWRSZXN1bHQgcmVzdWx0ID0gTk9S TUFMX0FUVFI7Ci0gCQkJY2hhcgkgICAqc3RyaW5nOwotIAkJCUxpc3RDZWxsICAgKmN1cjsK ICAKICAJCQkvKiBBY3R1YWxseSByZWFkIHRoZSBsaW5lIGludG8gbWVtb3J5IGhlcmUgKi8K ISAJCQlkb25lID0gY3N2X21vZGUgPyAKISAJCQkJQ29weVJlYWRMaW5lKHF1b3RlLCBlc2Nh cGUpIDogQ29weVJlYWRMaW5lKE5VTEwsIE5VTEwpOwogIAogIAkJCS8qCiEgCQkJICogRU9G IGF0IHN0YXJ0IG9mIGxpbmUgbWVhbnMgd2UncmUgZG9uZS4gIElmIHdlIHNlZSBFT0YgYWZ0 ZXIKISAJCQkgKiBzb21lIGNoYXJhY3RlcnMsIHdlIGFjdCBhcyB0aG91Z2ggaXQgd2FzIG5l d2xpbmUgZm9sbG93ZWQKISAJCQkgKiBieSBFT0YsIGllLCBwcm9jZXNzIHRoZSBsaW5lIGFu ZCB0aGVuIGV4aXQgbG9vcCBvbiBuZXh0CiEgCQkJICogaXRlcmF0aW9uLgogIAkJCSAqLwoh IAkJCWlmIChkb25lICYmIGxpbmVfYnVmLmxlbiA9PSAwKQogIAkJCQlicmVhazsKICAKICAJ CQlpZiAoZmlsZV9oYXNfb2lkcykKICAJCQl7CiAgCQkJCS8qIGNhbid0IGJlIGluIENTViBt b2RlIGhlcmUgKi8KISAJCQkJc3RyaW5nID0gQ29weVJlYWRBdHRyaWJ1dGUoZGVsaW0sIG51 bGxfcHJpbnQsCiEgCQkJCQkJCQkJCSAgICZyZXN1bHQsICZpc251bGwpOwogIAogIAkJCQlp ZiAoaXNudWxsKQogIAkJCQkJZXJlcG9ydChFUlJPUiwKLS0tIDE2ODUsMTcyOSAtLS0tCiAg CQkvKiBJbml0aWFsaXplIGFsbCB2YWx1ZXMgZm9yIHJvdyB0byBOVUxMICovCiAgCQlNZW1T ZXQodmFsdWVzLCAwLCBudW1fcGh5c19hdHRycyAqIHNpemVvZihEYXR1bSkpOwogIAkJTWVt U2V0KG51bGxzLCAnbicsIG51bV9waHlzX2F0dHJzICogc2l6ZW9mKGNoYXIpKTsKKyAJCQkJ LyogcmVzZXQgYXR0cmlidXRlIHBvaW50ZXJzICovCisgCQkJCU1lbVNldChhdHRyX29mZnNl dHMsIDAsIG51bV9waHlzX2F0dHJzICogc2l6ZW9mKGludCkpOwogIAogIAkJaWYgKCFiaW5h cnkpCiAgCQl7CiAgCiAgCQkJLyogQWN0dWFsbHkgcmVhZCB0aGUgbGluZSBpbnRvIG1lbW9y eSBoZXJlICovCiEgCQkJCQlsaW5lX2RvbmUgPSBjc3ZfbW9kZSA/CiEgCQkJCQkJCQlDb3B5 UmVhZExpbmVDU1YoYnl0ZXNyZWFkLCBxdW90ZSwgZXNjYXBlKSA6IAohIAkJCQkJCQkJQ29w eVJlYWRMaW5lVGV4dChieXRlc3JlYWQsIGVzY2FwZSk7CiAgCiAgCQkJLyoKISAJCQkJCSAq IGlmIGZpbmlzaGVkIHByb2Nlc3NpbmcgZGF0YSBsaW5lIC0gaW5jcmVtZW50IGxpbmUgY291 bnQuCiEgCQkJCQkgKiBPdGhlcndpc2UsIGlmIGVvZiBpcyBub3QgeWV0IHJlYWNoZWQsIHdl IHNraXAgYXR0IHBhcnNpbmcgCiEgCQkJCQkgKiBhbmQgcmVhZCBtb3JlIGRhdGEuIEJ1dCBp ZiBlb2YgX3dhc18gcmVhY2hlZCBpdCBtZWFucyAKISAJCQkJCSAqIHRoYXQgdGhlIG9yaWdp bmFsIGxhc3QgZGF0YSBsaW5lIGlzIGRlZmVjdGl2ZSBhbmQgCiEgCQkJCQkgKiB3ZSB3YW50 IHRvIGNhdGNoIHRoYXQgZXJyb3IgbGF0ZXIgb24uCiAgCQkJICovCiEgCQkJCQlpZiAobGlu ZV9kb25lKQohIAkJCQkJCWNvcHlfbGluZW5vKys7CiEgCQkJCQllbHNlIGlmICghZmVfZW9m IHx8IGVuZF9tYXJrZXIgKQogIAkJCQlicmVhazsKICAKKyAJCQkJCWlmIChoZWFkZXJfbGlu ZSkKKyAJCQkJCXsKKyAJCQkJCQlsaW5lX2J1Zi5sZW4gPSAwOwkJLyogd2UgY2FuIHJlc2V0 IGxpbmUgYnVmZmVyIG5vdy4gKi8KKyAJCQkJCQlsaW5lX2J1Zi5kYXRhWzBdID0gJ1wwJzsK KyAJCQkJCQlsaW5lX2J1Zi5jdXJzb3IgPSAwOworIAkJCQkJCWhlYWRlcl9saW5lID0gZmFs c2U7CisgCQkJCQkJY29udGludWU7CisgCQkJCQl9CisgCQkJCQkKICAJCQlpZiAoZmlsZV9o YXNfb2lkcykKICAJCQl7CisgCQkJCQkJY2hhcgkgICAqb2lkX3N0cmluZzsKKyAKICAJCQkJ LyogY2FuJ3QgYmUgaW4gQ1NWIG1vZGUgaGVyZSAqLwohIAkJCQkJCW9pZF9zdHJpbmcgPSBD b3B5UmVhZE9pZEF0dHIoZGVsaW0sIG51bGxfcHJpbnQsIG51bGxfcHJpbnRfbGVuLAohIAkJ CQkJCQkJCQkJCQkgJmlzbnVsbCk7CiAgCiAgCQkJCWlmIChpc251bGwpCiAgCQkJCQllcmVw b3J0KEVSUk9SLAoqKioqKioqKioqKioqKioKKioqIDE3NTAsMTc1NiAqKioqCiAgCQkJCXsK ICAJCQkJCWNvcHlfYXR0bmFtZSA9ICJvaWQiOwogIAkJCQkJbG9hZGVkX29pZCA9IERhdHVt R2V0T2JqZWN0SWQoRGlyZWN0RnVuY3Rpb25DYWxsMShvaWRpbiwKISAJCQkJCQkJCQkJCSAg IENTdHJpbmdHZXREYXR1bShzdHJpbmcpKSk7CiAgCQkJCQlpZiAobG9hZGVkX29pZCA9PSBJ bnZhbGlkT2lkKQogIAkJCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCQkoZXJyY29kZShF UlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKLS0tIDE3MzMsMTczOSAtLS0tCiAgCQkJ CXsKICAJCQkJCWNvcHlfYXR0bmFtZSA9ICJvaWQiOwogIAkJCQkJbG9hZGVkX29pZCA9IERh dHVtR2V0T2JqZWN0SWQoRGlyZWN0RnVuY3Rpb25DYWxsMShvaWRpbiwKISAJCQkJCQkJCQkJ CQkgICBDU3RyaW5nR2V0RGF0dW0ob2lkX3N0cmluZykpKTsKICAJCQkJCWlmIChsb2FkZWRf b2lkID09IEludmFsaWRPaWQpCiAgCQkJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkJCShl cnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAoqKioqKioqKioqKioqKioK KioqIDE3NTksMTc5MiAqKioqCiAgCQkJCX0KICAJCQl9CiAgCiEgCQkJLyogTG9vcCB0byBy ZWFkIHRoZSB1c2VyIGF0dHJpYnV0ZXMgb24gdGhlIGxpbmUuICovCiAgCQkJZm9yZWFjaChj dXIsIGF0dG51bWxpc3QpCiAgCQkJewogIAkJCQlpbnQJCQlhdHRudW0gPSBsZmlyc3RfaW50 KGN1cik7CiAgCQkJCWludAkJCW0gPSBhdHRudW0gLSAxOwogIAohIAkJCQkvKgohIAkJCQkg KiBJZiBwcmlvciBhdHRyIG9uIHRoaXMgbGluZSB3YXMgZW5kZWQgYnkgbmV3bGluZSwKISAJ CQkJICogY29tcGxhaW4uCiEgCQkJCSAqLwohIAkJCQlpZiAocmVzdWx0ICE9IE5PUk1BTF9B VFRSKQohIAkJCQkJZXJlcG9ydChFUlJPUiwKISAJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9C QURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkJCSBlcnJtc2coIm1pc3NpbmcgZGF0YSBm b3IgY29sdW1uIFwiJXNcIiIsCiEgCQkJCQkJCQkJTmFtZVN0cihhdHRyW21dLT5hdHRuYW1l KSkpKTsKICAKISAJCQkJaWYgKGNzdl9tb2RlKQohIAkJCQl7CiEgCQkJCQlzdHJpbmcgPSBD b3B5UmVhZEF0dHJpYnV0ZUNTVihkZWxpbSwgbnVsbF9wcmludCwgcXVvdGUsCiEgCQkJCQkJ CQkJCQkgICBlc2NhcGUsICZyZXN1bHQsICZpc251bGwpOwohIAkJCQkJaWYgKHJlc3VsdCA9 PSBVTlRFUk1JTkFURURfRklFTEQpCiEgCQkJCQkJZXJlcG9ydChFUlJPUiwKISAJCQkJCQkJ CShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAohIAkJCQkJCQkgICBl cnJtc2coInVudGVybWluYXRlZCBDU1YgcXVvdGVkIGZpZWxkIikpKTsKISAJCQkJfQogIAkJ CQllbHNlCiEgCQkJCQlzdHJpbmcgPSBDb3B5UmVhZEF0dHJpYnV0ZShkZWxpbSwgbnVsbF9w cmludCwKISAJCQkJCQkJCQkJCSAgICZyZXN1bHQsICZpc251bGwpOwogIAogIAkJCQlpZiAo Y3N2X21vZGUgJiYgaXNudWxsICYmIGZvcmNlX25vdG51bGxbbV0pCiAgCQkJCXsKLS0tIDE3 NDIsMTc3MCAtLS0tCiAgCQkJCX0KICAJCQl9CiAgCiEgCQkJCQkvKiBwYXJzZSBhbGwgdGhl IGF0dHJpYnV0ZSBpbiB0aGUgZGF0YSBsaW5lICovCiEgCQkJCQlpZihjc3ZfbW9kZSkKISAJ CQkJCQlDb3B5UmVhZEF0dHJpYnV0ZXNDU1YoZGVsaW0sIG51bGxfcHJpbnQsIHF1b3RlLCBl c2NhcGUsIG51bGxfcHJpbnRfbGVuLCAKISAJCQkJCQkJCQkJCW51bGxzLCBhdHRudW1saXN0 LCBhdHRyX29mZnNldHMsIG51bV9waHlzX2F0dHJzLCBhdHRyKTsKISAJCQkJCWVsc2UKISAJ CQkJCQlDb3B5UmVhZEF0dHJpYnV0ZXNUZXh0KGRlbGltLCBlc2NhcGUsIG51bGxfcHJpbnQs IG51bGxfcHJpbnRfbGVuLAohIAkJCQkJCQkJCQkJIG51bGxzLCBhdHRudW1saXN0LCBhdHRy X29mZnNldHMsIG51bV9waHlzX2F0dHJzLCBhdHRyKTsKISAKISAJCQkJCS8qCiEgCQkJCQkg KiBMb29wIHRvIHJlYWQgdGhlIHVzZXIgYXR0cmlidXRlcyBvbiB0aGUgbGluZS4KISAJCQkJ CSAqLwogIAkJCWZvcmVhY2goY3VyLCBhdHRudW1saXN0KQogIAkJCXsKICAJCQkJaW50CQkJ YXR0bnVtID0gbGZpcnN0X2ludChjdXIpOwogIAkJCQlpbnQJCQltID0gYXR0bnVtIC0gMTsK KyAJCQkJCQljaGFyICAgICAgICpzdHJpbmc7CiAgCiEgCQkJCQkJc3RyaW5nID0gYXR0cl9i dWYuZGF0YSArIGF0dHJfb2Zmc2V0c1ttXTsKICAKISAJCQkJCQlpZiAobnVsbHNbbV0gPT0g JyAnKQohIAkJCQkJCQlpc251bGwgPSBmYWxzZTsKICAJCQkJZWxzZQohIAkJCQkJCQlpc251 bGwgPSB0cnVlOwogIAogIAkJCQlpZiAoY3N2X21vZGUgJiYgaXNudWxsICYmIGZvcmNlX25v dG51bGxbbV0pCiAgCQkJCXsKKioqKioqKioqKioqKioqCioqKiAxODA2LDE4MjMgKioqKgog IAkJCQkJY29weV9hdHRuYW1lID0gTlVMTDsKICAJCQkJfQogIAkJCX0KLSAKLSAJCQkvKgot IAkJCSAqIENvbXBsYWluIGlmIHRoZXJlIGFyZSBtb3JlIGZpZWxkcyBvbiB0aGUgaW5wdXQg bGluZS4KLSAJCQkgKgotIAkJCSAqIFNwZWNpYWwgY2FzZTogaWYgd2UncmUgcmVhZGluZyBh IHplcm8tY29sdW1uIHRhYmxlLCB3ZSB3b24ndAotIAkJCSAqIHlldCBoYXZlIGNhbGxlZCBD b3B5UmVhZEF0dHJpYnV0ZSgpIGF0IGFsbDsgc28gbm8gZXJyb3IgaWYKLSAJCQkgKiBsaW5l IGlzIGVtcHR5LgotIAkJCSAqLwotIAkJCWlmIChyZXN1bHQgPT0gTk9STUFMX0FUVFIgJiYg bGluZV9idWYubGVuICE9IDApCi0gCQkJCWVyZXBvcnQoRVJST1IsCi0gCQkJCQkJKGVycmNv ZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCi0gCQkJCQkgICBlcnJtc2coImV4 dHJhIGRhdGEgYWZ0ZXIgbGFzdCBleHBlY3RlZCBjb2x1bW4iKSkpOwogIAkJfQogIAkJZWxz ZQogIAkJewotLS0gMTc4NCwxNzg5IC0tLS0KKioqKioqKioqKioqKioqCioqKiAxODI4LDE4 MzQgKioqKgogIAkJCWZsZF9jb3VudCA9IENvcHlHZXRJbnQxNigpOwogIAkJCWlmIChDb3B5 R2V0RW9mKCkgfHwgZmxkX2NvdW50ID09IC0xKQogIAkJCXsKISAJCQkJZG9uZSA9IHRydWU7 CiAgCQkJCWJyZWFrOwogIAkJCX0KICAKLS0tIDE3OTQsMTgwMSAtLS0tCiAgCQkJZmxkX2Nv dW50ID0gQ29weUdldEludDE2KCk7CiAgCQkJaWYgKENvcHlHZXRFb2YoKSB8fCBmbGRfY291 bnQgPT0gLTEpCiAgCQkJewohIAkJCQkJCWJ1Zl9kb25lID0gdHJ1ZTsKISAJCQkJCQlub19t b3JlX2RhdGEgPSB0cnVlOwogIAkJCQlicmVhazsKICAJCQl9CiAgCioqKioqKioqKioqKioq KgoqKiogMTg0NSwxODUxICoqKioKICAJCQkJCURhdHVtR2V0T2JqZWN0SWQoQ29weVJlYWRC aW5hcnlBdHRyaWJ1dGUoMCwKICAJCQkJCQkJCQkJCQkJCQkgJm9pZF9pbl9mdW5jdGlvbiwK ICAJCQkJCQkJCQkJCQkJCQkgb2lkX3R5cGlvcGFyYW0sCi0gCQkJCQkJCQkJCQkJCQkJIC0x LAogIAkJCQkJCQkJCQkJCQkJCSAmaXNudWxsKSk7CiAgCQkJCWlmIChpc251bGwgfHwgbG9h ZGVkX29pZCA9PSBJbnZhbGlkT2lkKQogIAkJCQkJZXJlcG9ydChFUlJPUiwKLS0tIDE4MTIs MTgxNyAtLS0tCioqKioqKioqKioqKioqKgoqKiogMTg2NSwxODcxICoqKioKICAJCQkJdmFs dWVzW21dID0gQ29weVJlYWRCaW5hcnlBdHRyaWJ1dGUoaSwKICAJCQkJCQkJCQkJCQkJJmlu X2Z1bmN0aW9uc1ttXSwKICAJCQkJCQkJCQkJCQkJdHlwaW9wYXJhbXNbbV0sCi0gCQkJCQkJ CQkJCQkJCWF0dHJbbV0tPmF0dHR5cG1vZCwKICAJCQkJCQkJCQkJCQkJJmlzbnVsbCk7CiAg CQkJCW51bGxzW21dID0gaXNudWxsID8gJ24nIDogJyAnOwogIAkJCQljb3B5X2F0dG5hbWUg PSBOVUxMOwotLS0gMTgzMSwxODM2IC0tLS0KKioqKioqKioqKioqKioqCioqKiAxODg1LDE4 OTEgKioqKgogIAkJCQludWxsc1tkZWZtYXBbaV1dID0gJyAnOwogIAkJfQogIAohIAkJLyog TmV4dCBhcHBseSBhbnkgZG9tYWluIGNvbnN0cmFpbnRzICovCiAgCQlpZiAoaGFzQ29uc3Ry YWludHMpCiAgCQl7CiAgCQkJUGFyYW1FeGVjRGF0YSAqcHJtZGF0YSA9ICZlY29udGV4dC0+ ZWN4dF9wYXJhbV9leGVjX3ZhbHNbMF07Ci0tLSAxODUwLDE4NTggLS0tLQogIAkJCQludWxs c1tkZWZtYXBbaV1dID0gJyAnOwogIAkJfQogIAohIAkJCQkvKgohIAkJCQkgKiBOZXh0IGFw cGx5IGFueSBkb21haW4gY29uc3RyYWludHMKISAJCQkJICovCiAgCQlpZiAoaGFzQ29uc3Ry YWludHMpCiAgCQl7CiAgCQkJUGFyYW1FeGVjRGF0YSAqcHJtZGF0YSA9ICZlY29udGV4dC0+ ZWN4dF9wYXJhbV9leGVjX3ZhbHNbMF07CioqKioqKioqKioqKioqKgoqKiogMTkxMiwxOTI0 ICoqKioKICAJCQl9CiAgCQl9CiAgCiEgCQkvKiBBbmQgbm93IHdlIGNhbiBmb3JtIHRoZSBp bnB1dCB0dXBsZS4gKi8KICAJCXR1cGxlID0gaGVhcF9mb3JtdHVwbGUodHVwRGVzYywgdmFs dWVzLCBudWxscyk7CiAgCiAgCQlpZiAob2lkcyAmJiBmaWxlX2hhc19vaWRzKQogIAkJCUhl YXBUdXBsZVNldE9pZCh0dXBsZSwgbG9hZGVkX29pZCk7CiAgCiEgCQkvKiBUcmlnZ2VycyBh bmQgc3R1ZmYgbmVlZCB0byBiZSBpbnZva2VkIGluIHF1ZXJ5IGNvbnRleHQuICovCiAgCQlN ZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CiAgCiAgCQlza2lwX3R1cGxlID0g ZmFsc2U7Ci0tLSAxODc5LDE4OTUgLS0tLQogIAkJCX0KICAJCX0KICAKISAJCQkJLyoKISAJ CQkJICogQW5kIG5vdyB3ZSBjYW4gZm9ybSB0aGUgaW5wdXQgdHVwbGUuCiEgCQkJCSAqLwog IAkJdHVwbGUgPSBoZWFwX2Zvcm10dXBsZSh0dXBEZXNjLCB2YWx1ZXMsIG51bGxzKTsKICAK ICAJCWlmIChvaWRzICYmIGZpbGVfaGFzX29pZHMpCiAgCQkJSGVhcFR1cGxlU2V0T2lkKHR1 cGxlLCBsb2FkZWRfb2lkKTsKICAKISAJCQkJLyoKISAJCQkJICogVHJpZ2dlcnMgYW5kIHN0 dWZmIG5lZWQgdG8gYmUgaW52b2tlZCBpbiBxdWVyeSBjb250ZXh0LgohIAkJCQkgKi8KICAJ CU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKICAKICAJCXNraXBfdHVwbGUg PSBmYWxzZTsKKioqKioqKioqKioqKioqCioqKiAxOTQ1LDE5NTUgKioqKgogIAkJCS8qIFBs YWNlIHR1cGxlIGluIHR1cGxlIHNsb3QgKi8KICAJCQlFeGVjU3RvcmVUdXBsZSh0dXBsZSwg c2xvdCwgSW52YWxpZEJ1ZmZlciwgZmFsc2UpOwogIAohIAkJCS8qIENoZWNrIHRoZSBjb25z dHJhaW50cyBvZiB0aGUgdHVwbGUgKi8KICAJCQlpZiAocmVsLT5yZF9hdHQtPmNvbnN0cikK ICAJCQkJRXhlY0NvbnN0cmFpbnRzKHJlc3VsdFJlbEluZm8sIHNsb3QsIGVzdGF0ZSk7CiAg CiEgCQkJLyogT0ssIHN0b3JlIHRoZSB0dXBsZSBhbmQgY3JlYXRlIGluZGV4IGVudHJpZXMg Zm9yIGl0ICovCiAgCQkJc2ltcGxlX2hlYXBfaW5zZXJ0KHJlbCwgdHVwbGUpOwogIAogIAkJ CWlmIChyZXN1bHRSZWxJbmZvLT5yaV9OdW1JbmRpY2VzID4gMCkKLS0tIDE5MTYsMTkzMCAt LS0tCiAgCQkJLyogUGxhY2UgdHVwbGUgaW4gdHVwbGUgc2xvdCAqLwogIAkJCUV4ZWNTdG9y ZVR1cGxlKHR1cGxlLCBzbG90LCBJbnZhbGlkQnVmZmVyLCBmYWxzZSk7CiAgCiEgCQkJCQkv KgohIAkJCQkJICogQ2hlY2sgdGhlIGNvbnN0cmFpbnRzIG9mIHRoZSB0dXBsZQohIAkJCQkJ ICovCiAgCQkJaWYgKHJlbC0+cmRfYXR0LT5jb25zdHIpCiAgCQkJCUV4ZWNDb25zdHJhaW50 cyhyZXN1bHRSZWxJbmZvLCBzbG90LCBlc3RhdGUpOwogIAohIAkJCQkJLyoKISAJCQkJCSAq IE9LLCBzdG9yZSB0aGUgdHVwbGUgYW5kIGNyZWF0ZSBpbmRleCBlbnRyaWVzIGZvciBpdAoh IAkJCQkJICovCiAgCQkJc2ltcGxlX2hlYXBfaW5zZXJ0KHJlbCwgdHVwbGUpOwogIAogIAkJ CWlmIChyZXN1bHRSZWxJbmZvLT5yaV9OdW1JbmRpY2VzID4gMCkKKioqKioqKioqKioqKioq CioqKiAxOTU4LDE5NzYgKioqKgogIAkJCS8qIEFGVEVSIFJPVyBJTlNFUlQgVHJpZ2dlcnMg Ki8KICAJCQlFeGVjQVJJbnNlcnRUcmlnZ2Vycyhlc3RhdGUsIHJlc3VsdFJlbEluZm8sIHR1 cGxlKTsKICAJCX0KICAJfQogIAohIAkvKiBEb25lLCBjbGVhbiB1cCAqLwogIAllcnJvcl9j b250ZXh0X3N0YWNrID0gZXJyY29udGV4dC5wcmV2aW91czsKICAKICAJTWVtb3J5Q29udGV4 dFN3aXRjaFRvKG9sZGNvbnRleHQpOwogIAohIAkvKiBFeGVjdXRlIEFGVEVSIFNUQVRFTUVO VCBpbnNlcnRpb24gdHJpZ2dlcnMgKi8KICAJRXhlY0FTSW5zZXJ0VHJpZ2dlcnMoZXN0YXRl LCByZXN1bHRSZWxJbmZvKTsKICAKISAJLyogSGFuZGxlIHF1ZXVlZCBBRlRFUiB0cmlnZ2Vy cyAqLwogIAlBZnRlclRyaWdnZXJFbmRRdWVyeShlc3RhdGUpOwogIAogIAlwZnJlZSh2YWx1 ZXMpOwogIAlwZnJlZShudWxscyk7CiAgCi0tLSAxOTMzLDE5NzAgLS0tLQogIAkJCS8qIEFG VEVSIFJPVyBJTlNFUlQgVHJpZ2dlcnMgKi8KICAJCQlFeGVjQVJJbnNlcnRUcmlnZ2Vycyhl c3RhdGUsIHJlc3VsdFJlbEluZm8sIHR1cGxlKTsKICAJCX0KKyAKKyAJCQkJbGluZV9idWYu bGVuID0gMDsJCS8qIHdlIGNhbiByZXNldCBsaW5lIGJ1ZmZlciBub3cuICovCisgCQkJCWxp bmVfYnVmLmRhdGFbMF0gPSAnXDAnOworIAkJCQlsaW5lX2J1Zi5jdXJzb3IgPSAwOworIAkJ CX0JCQkJCS8qIGVuZCB3aGlsZSghYnVmX2RvbmUpICovCisgCQl9CQkJCQkJLyogZW5kIGlm IChieXRlc3JlYWQgPiAwIHx8ICFmZV9lb2YpICovCisgCQllbHNlCisgCQkJLyogbm8gYnl0 ZXMgcmVhZCwgZW5kIG9mIGRhdGEgKi8KKyAJCXsKKyAJCQlub19tb3JlX2RhdGEgPSB0cnVl OwogIAl9CisgCX0gd2hpbGUgKCFub19tb3JlX2RhdGEpOwogIAohIAkvKgohIAkgKiBEb25l LCBjbGVhbiB1cAohIAkgKi8KICAJZXJyb3JfY29udGV4dF9zdGFjayA9IGVycmNvbnRleHQu cHJldmlvdXM7CiAgCiAgCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKICAK ISAJLyogCSAKISAgICAgICogRXhlY3V0ZSBBRlRFUiBTVEFURU1FTlQgaW5zZXJ0aW9uIHRy aWdnZXJzCiEgCSAqLwogIAlFeGVjQVNJbnNlcnRUcmlnZ2Vycyhlc3RhdGUsIHJlc3VsdFJl bEluZm8pOwogIAohIAkvKgohIAkgKiBIYW5kbGUgcXVldWVkIEFGVEVSIHRyaWdnZXJzCiEg CSAqLwogIAlBZnRlclRyaWdnZXJFbmRRdWVyeShlc3RhdGUpOwogIAorIAlwZnJlZShhdHRy X29mZnNldHMpOworIAogIAlwZnJlZSh2YWx1ZXMpOwogIAlwZnJlZShudWxscyk7CiAgCioq KioqKioqKioqKioqKgoqKiogMTk5MCwyMjYyICoqKioKICAKICAKICAvKgohICAqIFJlYWQg dGhlIG5leHQgaW5wdXQgbGluZSBhbmQgc3Rhc2ggaXQgaW4gbGluZV9idWYsIHdpdGggY29u dmVyc2lvbiB0bwohICAqIHNlcnZlciBlbmNvZGluZy4KISAgKgohICAqIFJlc3VsdCBpcyB0 cnVlIGlmIHJlYWQgd2FzIHRlcm1pbmF0ZWQgYnkgRU9GLCBmYWxzZSBpZiB0ZXJtaW5hdGVk CiEgICogYnkgbmV3bGluZS4KICAgKi8KICBzdGF0aWMgYm9vbAohIENvcHlSZWFkTGluZShj aGFyICogcXVvdGUsIGNoYXIgKiBlc2NhcGUpCiAgewohIAlib29sCQlyZXN1bHQ7CiEgCWJv b2wJCWNoYW5nZV9lbmNvZGluZyA9IChjbGllbnRfZW5jb2RpbmcgIT0gc2VydmVyX2VuY29k aW5nKTsKISAJaW50CQkJYzsKISAJaW50CQkJbWJsZW47CiEgCWludAkJCWo7CiEgCXVuc2ln bmVkIGNoYXIgc1syXTsKICAJY2hhcgkgICAqY3Z0OwohIAlib29sICAgICAgICBpbl9xdW90 ZSA9IGZhbHNlLCBsYXN0X3dhc19lc2MgPSBmYWxzZSwgY3N2X21vZGUgPSBmYWxzZTsKISAJ Y2hhciAgICAgICAgcXVvdGVjID0gJ1wwJywgZXNjYXBlYyA9ICdcMCc7CiEgCiEgCWlmIChx dW90ZSkKISAJewohIAkJY3N2X21vZGUgPSB0cnVlOwohIAkJcXVvdGVjID0gcXVvdGVbMF07 CiEgCQllc2NhcGVjID0gZXNjYXBlWzBdOwohIAkJLyogaWdub3JlIHNwZWNpYWwgZXNjYXBl IHByb2Nlc3NpbmcgaWYgaXQncyB0aGUgc2FtZSBhcyBxdW90ZWMgKi8KISAJCWlmIChxdW90 ZWMgPT0gZXNjYXBlYykKISAJCQllc2NhcGVjID0gJ1wwJzsKISAJfQohIAohIAohIAlzWzFd ID0gMDsKISAKISAJLyogcmVzZXQgbGluZV9idWYgdG8gZW1wdHkgKi8KISAJbGluZV9idWYu bGVuID0gMDsKISAJbGluZV9idWYuZGF0YVswXSA9ICdcMCc7CiEgCWxpbmVfYnVmLmN1cnNv ciA9IDA7CiAgCiAgCS8qIG1hcmsgdGhhdCBlbmNvZGluZyBjb252ZXJzaW9uIGhhc24ndCBv Y2N1cnJlZCB5ZXQgKi8KICAJbGluZV9idWZfY29udmVydGVkID0gZmFsc2U7CiAgCiEgCS8q IHNldCBkZWZhdWx0IHN0YXR1cyAqLwohIAlyZXN1bHQgPSBmYWxzZTsKICAKICAJLyoKISAJ ICogSW4gdGhpcyBsb29wIHdlIG9ubHkgY2FyZSBmb3IgZGV0ZWN0aW5nIG5ld2xpbmVzIChc ciBhbmQvb3IgXG4pIGFuZAohIAkgKiB0aGUgZW5kLW9mLWNvcHkgbWFya2VyIChcLikuICAK ISAJICoKISAJICogSW4gVGV4dCBtb2RlLCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkg d2UgYWxsb3cKISAJICogYmFja3NsYXNoZXMgdG8gZXNjYXBlIG5ld2xpbmUgY2hhcmFjdGVy cy4gIEJhY2tzbGFzaGVzIG90aGVyIHRoYW4KISAJICogdGhlIGVuZCBtYXJrZXIgZ2V0IHB1 dCBpbnRvIHRoZSBsaW5lX2J1Ziwgc2luY2UgQ29weVJlYWRBdHRyaWJ1dGUKISAJICogZG9l cyBpdHMgb3duIGVzY2FwZSBwcm9jZXNzaW5nLgkKISAJICoKISAJICogSW4gQ1NWIG1vZGUs IENSIGFuZCBOTCBpbnNpZGUgcSBxdW90ZWQgZmllbGQgYXJlIGp1c3QgcGFydCBvZiB0aGUK ISAJICogZGF0YSB2YWx1ZSBhbmQgYXJlIHB1dCBpbiBsaW5lX2J1Zi4gV2Uga2VlcCBqdXN0 IGVub3VnaCBzdGF0ZQohIAkgKiB0byBrbm93IGlmIHdlIGFyZSBjdXJyZW50bHkgaW4gYSBx dW90ZWQgZmllbGQgb3Igbm90LgohIAkgKgohIAkgKiBUaGVzZSBmb3VyIGNoYXJhY3RlcnMs IGFuZCBvbmx5IHRoZXNlIGZvdXIsIGFyZSBhc3N1bWVkIHRoZSBzYW1lIGluIAohIAkgKiBm cm9udGVuZCBhbmQgYmFja2VuZCBlbmNvZGluZ3MuCiEgCSAqCiEgCSAqIFdlIGRvIG5vdCBh c3N1bWUgdGhhdCBzZWNvbmQgYW5kIGxhdGVyIGJ5dGVzIG9mIGEgZnJvbnRlbmQKISAJICog bXVsdGlieXRlIGNoYXJhY3RlciBjb3VsZG4ndCBsb29rIGxpa2UgQVNDSUkgY2hhcmFjdGVy cy4KICAJICovCiEgCWZvciAoOzspCiAgCXsKISAJCWMgPSBDb3B5R2V0Q2hhcigpOwohIAkJ aWYgKGMgPT0gRU9GKQogIAkJewohIAkJCXJlc3VsdCA9IHRydWU7CiEgCQkJYnJlYWs7CiAg CQl9CiAgCiEgCQlpZiAoY3N2X21vZGUpCiAgCQl7CiAgCQkJLyogIAohIAkJCSAqIERlYWxp bmcgd2l0aCBxdW90ZXMgYW5kIGVzY2FwZXMgaGVyZSBpcyBtaWxkbHkgdHJpY2t5LiBJZiB0 aGUKISAJCQkgKiBxdW90ZSBjaGFyIGlzIGFsc28gdGhlIGVzY2FwZSBjaGFyLCB0aGVyZSdz IG5vIHByb2JsZW0gLSB3ZSAgCiEgCQkJICoganVzdCB1c2UgdGhlIGNoYXIgYXMgYSB0b2dn bGUuIElmIHRoZXkgYXJlIGRpZmZlcmVudCwgd2UgbmVlZAohIAkJCSAqIHRvIGVuc3VyZSB0 aGF0IHdlIG9ubHkgdGFrZSBhY2NvdW50IG9mIGFuIGVzY2FwZSBpbnNpZGUgYSBxdW90ZWQK ISAJCQkgKiBmaWVsZCBhbmQgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIGEgcXVvdGUgY2hhciwg YW5kIG5vdCB0aGUKISAJCQkgKiBzZWNvbmQgaW4gYSBlc2NhcGUtZXNjYXBlIHNlcXVlbmNl LgogIAkJCSAqLyAKICAKISAJCQlpZiAoaW5fcXVvdGUgJiYgYyA9PSBlc2NhcGVjKQohIAkJ CQlsYXN0X3dhc19lc2MgPSAhIGxhc3Rfd2FzX2VzYzsKISAJCQlpZiAoYyA9PSBxdW90ZWMg JiYgISBsYXN0X3dhc19lc2MpCiEgCQkJCWluX3F1b3RlID0gISBpbl9xdW90ZTsKISAJCQlp ZiAoYyAhPSBlc2NhcGVjKQohIAkJCQlsYXN0X3dhc19lc2MgPSBmYWxzZTsKICAKICAJCQkv KgohIAkJCSAqIHVwZGF0aW5nIHRoZSBsaW5lIGNvdW50IGZvciBlbWJlZGRlZCBDUiBhbmQv b3IgTEYgY2hhcnMgaXMgCiEgCQkJICogbmVjZXNzYXJpbHkgYSBsaXR0bGUgZnJhZ2lsZSAt IHRoaXMgdGVzdCBpcyBwcm9iYWJseSBhYm91dCAKISAJCQkgKiB0aGUgYmVzdCB3ZSBjYW4g ZG8uCiAgCQkJICovIAohIAkJCWlmIChpbl9xdW90ZSAmJiBjID09IChlb2xfdHlwZSA9PSBF T0xfQ1IgPyAnXHInIDogJ1xuJykpIAohIAkJCQljb3B5X2xpbmVubysrOyAKISAJCX0KICAK ISAJCWlmICghaW5fcXVvdGUgJiYgYyA9PSAnXHInKQogIAkJewohIAkJCWlmIChlb2xfdHlw ZSA9PSBFT0xfTkwpCiAgCQkJewohIAkJCQlpZiAoISBjc3ZfbW9kZSkKISAJCQkJCWVyZXBv cnQoRVJST1IsCiEgCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JN QVQpLAohIAkJCQkJCQkgZXJybXNnKCJsaXRlcmFsIGNhcnJpYWdlIHJldHVybiBmb3VuZCBp biBkYXRhIiksCiEgCQkJCQkJCSBlcnJoaW50KCJVc2UgXCJcXHJcIiB0byByZXByZXNlbnQg Y2FycmlhZ2UgcmV0dXJuLiIpKSk7CiEgCQkJCWVsc2UKISAJCQkJCWVyZXBvcnQoRVJST1Is CiEgCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAohIAkJ CQkJCQkgZXJybXNnKCJ1bnF1b3RlZCBjYXJyaWFnZSByZXR1cm4gZm91bmQgaW4gQ1NWIGRh dGEiKSwKISAJCQkJCQkJIGVycmhpbnQoIlVzZSBxdW90ZWQgQ1NWIGZpZWxkIHRvIHJlcHJl c2VudCBjYXJyaWFnZSByZXR1cm4uIikpKTsKICAJCQl9CiEgCQkJLyogQ2hlY2sgZm9yIFxy XG4gb24gZmlyc3QgbGluZSwgX2FuZF8gaGFuZGxlIFxyXG4uICovCiEgCQkJaWYgKGVvbF90 eXBlID09IEVPTF9VTktOT1dOIHx8IGVvbF90eXBlID09IEVPTF9DUk5MKQogIAkJCXsKISAJ CQkJaW50CQkJYzIgPSBDb3B5UGVla0NoYXIoKTsKICAKISAJCQkJaWYgKGMyID09ICdcbicp CiEgCQkJCXsKISAJCQkJCUNvcHlEb25lUGVlayhjMiwgdHJ1ZSk7CQkvKiBlYXQgbmV3bGlu ZSAqLwohIAkJCQkJZW9sX3R5cGUgPSBFT0xfQ1JOTDsKICAJCQkJfQogIAkJCQllbHNlCiAg CQkJCXsKISAJCQkJCS8qIGZvdW5kIFxyLCBidXQgbm8gXG4gKi8KICAJCQkJCWlmIChlb2xf dHlwZSA9PSBFT0xfQ1JOTCkKICAJCQkJCXsKISAJCQkJCQlpZiAoIWNzdl9tb2RlKQohIAkJ CQkJCQllcmVwb3J0KEVSUk9SLAohIAkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NP UFlfRklMRV9GT1JNQVQpLAohIAkJCQkJCQkJCSBlcnJtc2coImxpdGVyYWwgY2FycmlhZ2Ug cmV0dXJuIGZvdW5kIGluIGRhdGEiKSwKISAJCQkJCQkJCQkgZXJyaGludCgiVXNlIFwiXFxy XCIgdG8gcmVwcmVzZW50IGNhcnJpYWdlIHJldHVybi4iKSkpOwogIAkJCQkJCWVsc2UKISAJ CQkJCQkJZXJlcG9ydChFUlJPUiwKISAJCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9D T1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJCQkJCQkgZXJybXNnKCJ1bnF1b3RlZCBjYXJyaWFn ZSByZXR1cm4gZm91bmQgaW4gZGF0YSIpLAohIAkJCQkJCQkJCSBlcnJoaW50KCJVc2UgcXVv dGVkIENTViBmaWVsZCB0byByZXByZXNlbnQgY2FycmlhZ2UgcmV0dXJuLiIpKSk7CiEgCiAg CQkJCQl9CiAgCiAgCQkJCQkvKgohIAkJCQkJICogaWYgd2UgZ290IGhlcmUsIGl0IGlzIHRo ZSBmaXJzdCBsaW5lIGFuZCB3ZSBkaWRuJ3QKISAJCQkJCSAqIGdldCBcbiwgc28gcHV0IGl0 IGJhY2sKICAJCQkJCSAqLwohIAkJCQkJQ29weURvbmVQZWVrKGMyLCBmYWxzZSk7CiEgCQkJ CQllb2xfdHlwZSA9IEVPTF9DUjsKICAJCQkJfQogIAkJCX0KLSAJCQlicmVhazsKICAJCX0K ISAJCWlmICghaW5fcXVvdGUgJiYgYyA9PSAnXG4nKQogIAkJewohIAkJCWlmIChlb2xfdHlw ZSA9PSBFT0xfQ1IgfHwgZW9sX3R5cGUgPT0gRU9MX0NSTkwpCiEgCQkJewohIAkJCQlpZiAo IWNzdl9tb2RlKQohIAkJCQkJZXJlcG9ydChFUlJPUiwKISAJCQkJCQkJKGVycmNvZGUoRVJS Q09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkJCSBlcnJtc2coImxpdGVyYWwg bmV3bGluZSBmb3VuZCBpbiBkYXRhIiksCiEgCQkJCQkJCSBlcnJoaW50KCJVc2UgXCJcXG5c IiB0byByZXByZXNlbnQgbmV3bGluZS4iKSkpOwohIAkJCQllbHNlCiEgCQkJCQllcmVwb3J0 KEVSUk9SLAohIAkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFU KSwKISAJCQkJCQkJIGVycm1zZygidW5xdW90ZWQgbmV3bGluZSBmb3VuZCBpbiBkYXRhIiks CiEgCQkJCQkJCSBlcnJoaW50KCJVc2UgcXVvdGVkIENTViBmaWVsZCB0byByZXByZXNlbnQg bmV3bGluZS4iKSkpOwohIAkJCQkJCiAgCQkJfQotIAkJCWVvbF90eXBlID0gRU9MX05MOwot IAkJCWJyZWFrOwotIAkJfQogIAohIAkJaWYgKChsaW5lX2J1Zi5sZW4gPT0gMCB8fCAhY3N2 X21vZGUpICYmIGMgPT0gJ1xcJykKISAJCXsKISAJCQlpbnQgYzI7CiEgCQkJCiEgCQkJaWYg KGNzdl9tb2RlKQohIAkJCQljMiA9IENvcHlQZWVrQ2hhcigpOwohIAkJCWVsc2UKISAJCQkJ YzIgPSBjID0gQ29weUdldENoYXIoKTsKICAKISAJCQlpZiAoYzIgPT0gRU9GKQogIAkJCXsK ISAJCQkJcmVzdWx0ID0gdHJ1ZTsKISAJCQkJaWYgKGNzdl9tb2RlKQohIAkJCQkJQ29weURv bmVQZWVrKGMyLCB0cnVlKTsKICAJCQkJYnJlYWs7CiAgCQkJfQohIAkJCWlmIChjMiA9PSAn LicpCiEgCQkJewohIAkJCQlpZiAoY3N2X21vZGUpCiEgCQkJCQlDb3B5RG9uZVBlZWsoYzIs IHRydWUpOyAvKiBhbGxvdyBrZWVwIGNhbGxpbmcgR2V0Q2hhcigpICovCiAgCiEgCQkJCWlm IChlb2xfdHlwZSA9PSBFT0xfQ1JOTCkKISAJCQkJewohIAkJCQkJYyA9IENvcHlHZXRDaGFy KCk7CiEgCQkJCQlpZiAoYyA9PSAnXG4nKQohIAkJCQkJCWVyZXBvcnQoRVJST1IsCiEgCQkJ CQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJCQkJ CSBlcnJtc2coImVuZC1vZi1jb3B5IG1hcmtlciBkb2VzIG5vdCBtYXRjaCBwcmV2aW91cyBu ZXdsaW5lIHN0eWxlIikpKTsKISAJCQkJCWlmIChjICE9ICdccicpCiEgCQkJCQkJZXJlcG9y dChFUlJPUiwKISAJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JN QVQpLAohIAkJCQkJCQkJIGVycm1zZygiZW5kLW9mLWNvcHkgbWFya2VyIGNvcnJ1cHQiKSkp OwogIAkJCQl9Ci0gCQkJCWMgPSBDb3B5R2V0Q2hhcigpOwotIAkJCQlpZiAoYyAhPSAnXHIn ICYmIGMgIT0gJ1xuJykKLSAJCQkJCWVyZXBvcnQoRVJST1IsCi0gCQkJCQkJCShlcnJjb2Rl KEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAotIAkJCQkJCQkgZXJybXNnKCJlbmQt b2YtY29weSBtYXJrZXIgY29ycnVwdCIpKSk7Ci0gCQkJCWlmICgoZW9sX3R5cGUgPT0gRU9M X05MICYmIGMgIT0gJ1xuJykgfHwKLSAJCQkJCShlb2xfdHlwZSA9PSBFT0xfQ1JOTCAmJiBj ICE9ICdcbicpIHx8Ci0gCQkJCQkoZW9sX3R5cGUgPT0gRU9MX0NSICYmIGMgIT0gJ1xyJykp Ci0gCQkJCQllcmVwb3J0KEVSUk9SLAotIAkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9D T1BZX0ZJTEVfRk9STUFUKSwKLSAJCQkJCQkJIGVycm1zZygiZW5kLW9mLWNvcHkgbWFya2Vy IGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIG5ld2xpbmUgc3R5bGUiKSkpOwogIAogIAkJCQkv KgohIAkJCQkgKiBJbiBwcm90b2NvbCB2ZXJzaW9uIDMsIHdlIHNob3VsZCBpZ25vcmUgYW55 dGhpbmcgYWZ0ZXIKISAJCQkJICogXC4gdXAgdG8gdGhlIHByb3RvY29sIGVuZCBvZiBjb3B5 IGRhdGEuCShYWFggbWF5YmUKISAJCQkJICogYmV0dGVyIG5vdCB0byB0cmVhdCBcLiBhcyBz cGVjaWFsPykKICAJCQkJICovCiEgCQkJCWlmIChjb3B5X2Rlc3QgPT0gQ09QWV9ORVdfRkUp CiAgCQkJCXsKISAJCQkJCXdoaWxlIChjICE9IEVPRikKISAJCQkJCQljID0gQ29weUdldENo YXIoKTsKICAJCQkJfQohIAkJCQlyZXN1bHQgPSB0cnVlOwkvKiByZXBvcnQgRU9GICovCiAg CQkJCWJyZWFrOwogIAkJCX0KICAJCQkKISAJCQlpZiAoY3N2X21vZGUpCiEgCQkJCUNvcHlE b25lUGVlayhjMiwgZmFsc2UpOyAvKiBub3QgYSBkb3QsIHNvIHB1dCBpdCBiYWNrICovIAog IAkJCWVsc2UKISAJCQkJLyogbm90IEVPRiBtYXJrLCBzbyBlbWl0IFwgYW5kIGZvbGxvd2lu ZyBjaGFyIGxpdGVyYWxseSAqLwohIAkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3JvKCZs aW5lX2J1ZiwgJ1xcJyk7CiAgCQl9CiAgCiEgCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3Jv KCZsaW5lX2J1ZiwgYyk7CiAgCiAgCQkvKgohIAkJICogV2hlbiBjbGllbnQgZW5jb2Rpbmcg IT0gc2VydmVyLCBtdXN0IGJlIGNhcmVmdWwgdG8gcmVhZCB0aGUKISAJCSAqIGV4dHJhIGJ5 dGVzIG9mIGEgbXVsdGlieXRlIGNoYXJhY3RlciBleGFjdGx5LCBzaW5jZSB0aGUKISAJCSAq IGVuY29kaW5nIG1pZ2h0IG5vdCBlbnN1cmUgdGhleSBkb24ndCBsb29rIGxpa2UgQVNDSUku ICBXaGVuIHRoZQohIAkJICogZW5jb2RpbmdzIGFyZSB0aGUgc2FtZSwgd2UgbmVlZCBub3Qg ZG8gdGhpcywgc2luY2Ugbm8gc2VydmVyCiEgCQkgKiBlbmNvZGluZyB3ZSB1c2UgaGFzIEFT Q0lJLWxpa2UgZm9sbG93aW5nIGJ5dGVzLgogIAkJICovCiEgCQlpZiAoY2hhbmdlX2VuY29k aW5nKQohIAkJewohIAkJCXNbMF0gPSBjOwohIAkJCW1ibGVuID0gcGdfZW5jb2RpbmdfbWJs ZW4oY2xpZW50X2VuY29kaW5nLCBzKTsKISAJCQlmb3IgKGogPSAxOyBqIDwgbWJsZW47IGor KykKISAJCQl7CiEgCQkJCWMgPSBDb3B5R2V0Q2hhcigpOwohIAkJCQlpZiAoYyA9PSBFT0Yp CiAgCQkJCXsKISAJCQkJCXJlc3VsdCA9IHRydWU7CiAgCQkJCQlicmVhazsKICAJCQkJfQot IAkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3JvKCZsaW5lX2J1ZiwgYyk7CiAgCQkJfQoh IAkJCWlmIChyZXN1bHQpCiEgCQkJCWJyZWFrOwkJCS8qIG91dCBvZiBvdXRlciBsb29wICov CiAgCQl9Ci0gCX0JCQkJCQkJLyogZW5kIG9mIG91dGVyIGxvb3AgKi8KICAKISAJLyogRG9u ZSByZWFkaW5nIHRoZSBsaW5lLiAgQ29udmVydCBpdCB0byBzZXJ2ZXIgZW5jb2RpbmcuICov CiEgCWlmIChjaGFuZ2VfZW5jb2RpbmcpCiAgCXsKICAJCWN2dCA9IChjaGFyICopIHBnX2Ns aWVudF90b19zZXJ2ZXIoKHVuc2lnbmVkIGNoYXIgKikgbGluZV9idWYuZGF0YSwKICAJCQkJ CQkJCQkJICAgbGluZV9idWYubGVuKTsKLS0tIDE5ODQsMjQyMiAtLS0tCiAgCiAgCiAgLyoK ISAgKiBGaW5kcyB0aGUgbmV4dCBURVhUIGxpbmUgdGhhdCBpcyBpbiB0aGUgaW5wdXQgYnVm ZmVyIGFuZCBsb2FkcyAKISAgKiBpdCBpbnRvIGxpbmVfYnVmLiBSZXR1cm5zIGFuIGluZGlj YXRpb24gaWYgdGhlIGxpbmUgdGhhdCB3YXMgcmVhZCAKISAgKiBpcyBjb21wbGV0ZSAoaWYg YW4gdW5lc2NhcGVkIGxpbmUtZW5kIHdhcyBlbmNvdW50ZXJlZCkuIElmIHdlIAohICAqIHJl YWNoZWQgdGhlIGVuZCBvZiBidWZmZXIgYmVmb3JlIHRoZSB3aG9sZSBsaW5lIHdhcyB3cml0 dGVuIGludG8gdGhlCiEgICogbGluZSBidWZmZXIgdGhlbiByZXR1cm5zIGZhbHNlLgogICAq LwogIHN0YXRpYyBib29sCiEgQ29weVJlYWRMaW5lVGV4dChzaXplX3QgYnl0ZXNyZWFkLCBj aGFyICplc2NhcGUpCiAgewohIAlpbnQJCQlsaW5lc2l6ZTsKISAJYm9vbAkJdHJhbnNjb2Rl ID0gKGNsaWVudF9lbmNvZGluZyAhPSBzZXJ2ZXJfZW5jb2RpbmcpOwogIAljaGFyCSAgICpj dnQ7CiEgCWNoYXIgICAgICAgIGVzY2FwZWMgPSAnXDAnOwogIAogIAkvKiBtYXJrIHRoYXQg ZW5jb2RpbmcgY29udmVyc2lvbiBoYXNuJ3Qgb2NjdXJyZWQgeWV0ICovCiAgCWxpbmVfYnVm X2NvbnZlcnRlZCA9IGZhbHNlOwogIAohIAkvKgohIAkgKiBzZXQgdGhlIGVzY2FwZSBjaGFy IGZvciB0ZXh0IGZvcm1hdCAoJ1xcJyBieSBkZWZhdWx0KS4KISAJICovCiEgCWVzY2FwZWMg PSBlc2NhcGVbMF07CiAgCiAgCS8qCiEgCSAqIERldGVjdCBlbmQgb2YgbGluZSB0eXBlIGlm IG5vdCBhbHJlYWR5IGRldGVjdGVkLgogIAkgKi8KISAJaWYgKGVvbF90eXBlID09IEVPTF9V TktOT1dOKQogIAl7CiEgCQlib29sCQllb2xfZGV0ZWN0ZWQgPSBEZXRlY3RMaW5lRW5kKGJ5 dGVzcmVhZCwgTlVMTCwgZXNjYXBlKTsKISAKISAJCWlmICghZW9sX2RldGVjdGVkKQogIAkJ ewohIAkJCS8qIGxvYWQgZW50aXJlIGlucHV0IGJ1ZmZlciBpbnRvIGxpbmUgYnVmLCBhbmQg cXVpdCAqLwohIAkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmxpbmVfYnVmLCBpbnB1dF9i dWYsIENPUFlfQlVGX1NJWkUpOwohIAkJCWJ1Zl9kb25lID0gdHJ1ZTsKISAJCQlyZXR1cm4g ZmFsc2U7CiEgCQl9CiAgCQl9CiAgCiEgCS8qCiEgCSAqIFNwZWNpYWwgY2FzZTogZW9sIGlz IENSTkwsIGxhc3QgYnl0ZSBvZiBwcmV2aW91cyBidWZmZXIgd2FzIGFuCiEgCSAqIHVuZXNj YXBlZCBDUiBhbmQgMXN0IGJ5dGUgb2YgY3VycmVudCBidWZmZXIgaXMgTkwuIFdlIGNoZWNr IGZvcgohIAkgKiB0aGF0IGhlcmUuCiEgCSAqLwohIAlpZiAoZW9sX3R5cGUgPT0gRU9MX0NS TkwpCiEgCXsKISAJCS8qIGlmIHdlIHN0YXJ0ZWQgc2Nhbm5pbmcgZnJvbSB0aGUgMXN0IGJ5 dGUgb2YgdGhlIGJ1ZmZlciAqLwohIAkJaWYgKGJlZ2xvYyA9PSBpbnB1dF9idWYpCiEgCQl7 CiEgCQkJLyogYW5kIGhhZCBhIENSIGluIGxhc3QgYnl0ZSBvZiBwcmV2IGJ1ZiAqLwohIAkJ CWlmIChjcl9pbl9wcmV2YnVmKQohIAkJCXsKISAJCQkJLyoKISAJCQkJICogaWYgdGhpcyAx c3QgYnl0ZSBpbiBidWZmZXIgaXMgMm5kIGJ5dGUgb2YgbGluZSBlbmQgc2VxdWVuY2UKISAJ CQkJICogKGxpbmVmZWVkKQohIAkJCQkgKi8KISAJCQkJaWYgKCpiZWdsb2MgPT0gZW9sX2No WzFdKQogIAkJewogIAkJCS8qICAKISAJCQkJCSAqIGxvYWQgdGhhdCBvbmUgbGluZWZlZWQg Ynl0ZSBhbmQgaW5kaWNhdGUgd2UgYXJlIGRvbmUKISAJCQkJCSAqIHdpdGggdGhlIGRhdGEg bGluZQogIAkJCSAqLyAKKyAJCQkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmxpbmVfYnVm LCBiZWdsb2MsIDEpOworIAkJCQkJYnVmZmVyX2luZGV4Kys7CisgCQkJCQliZWdsb2MrKzsK KyAJCQkJCWVzY19pbl9wcmV2YnVmID0gZmFsc2U7CisgCQkJCQljcl9pbl9wcmV2YnVmID0g ZmFsc2U7CisgCQkJCQlyZXR1cm4gdHJ1ZTsKKyAJCQkJfQorIAkJCX0KICAKISAJCQljcl9p bl9wcmV2YnVmID0gZmFsc2U7CiEgCQl9CiEgCX0KICAKICAJCQkvKgohIAkgKiAod2UgbmVl ZCBhIGxvb3Agc28gdGhhdCBpZiBlb2xfY2ggaXMgZm91bmQsIGJ1dCBwcmV2IGNoIGlzIGJh Y2tzbGFzaCwKISAJICogd2UgY2FuIHNlYXJjaCBmb3IgdGhlIG5leHQgZW9sX2NoKQogIAkJ CSAqLyAKISAJd2hpbGUgKHRydWUpCiEgCXsKISAJCS8qIHJlYWNoZWQgZW5kIG9mIGJ1ZmZl ciAqLwohIAkJaWYgKChlbmRsb2MgPSBzY2FuVGV4dExpbmUoYmVnbG9jLCBlb2xfY2hbMF0s IGJ5dGVzcmVhZCAtIGJ1ZmZlcl9pbmRleCkpID09IE5VTEwpCiEgCQl7CiEgCQkJbGluZXNp emUgPSBDT1BZX0JVRl9TSVpFIC0gKGJlZ2xvYyAtIGlucHV0X2J1Zik7CiEgCQkJYXBwZW5k QmluYXJ5U3RyaW5nSW5mbygmbGluZV9idWYsIGJlZ2xvYywgbGluZXNpemUpOwogIAohIAkJ CWlmIChsaW5lX2J1Zi5sZW4gPiAxKQogIAkJewohIAkJCQljaGFyCSAgICpsYXN0X2NoID0g bGluZV9idWYuZGF0YSArIGxpbmVfYnVmLmxlbiAtIDE7IC8qIGJlZm9yZSB0ZXJtaW5hdGlu ZyBcMCAqLwohIAohIAkJCQlpZiAoKmxhc3RfY2ggPT0gZXNjYXBlYykKICAJCQl7CiEgCQkJ CQllc2NfaW5fcHJldmJ1ZiA9IHRydWU7CiEgCiEgCQkJCQlpZiAobGluZV9idWYubGVuID4g MikKISAJCQkJCXsKISAJCQkJCQlsYXN0X2NoLS07CiEgCQkJCQkJaWYgKCpsYXN0X2NoID09 IGVzY2FwZWMpCiEgCQkJCQkJCWVzY19pbl9wcmV2YnVmID0gZmFsc2U7CiAgCQkJfQohIAkJ CQl9CiEgCQkJCWVsc2UgaWYgKCpsYXN0X2NoID09ICdccicpCiAgCQkJewohIAkJCQkJaWYg KGVvbF90eXBlID09IEVPTF9DUk5MKQohIAkJCQkJCWNyX2luX3ByZXZidWYgPSB0cnVlOwoh IAkJCQl9CiEgCQkJfQogIAohIAkJCWxpbmVfZG9uZSA9IGZhbHNlOwohIAkJCWJ1Zl9kb25l ID0gdHJ1ZTsKISAJCQlicmVhazsKICAJCQkJfQogIAkJCQllbHNlCisgCQkJLyogZm91bmQg dGhlIDFzdCBlb2wgY2ggaW4gaW5wdXRfYnVmLiAqLwogIAkJCQl7CiEgCQkJYm9vbAkJZW9s X2ZvdW5kID0gdHJ1ZTsKISAJCQlib29sCQllb2xfZXNjYXBlZCA9IHRydWU7CiEgCiEgCQkJ LyoKISAJCQkgKiBMb2FkIHRoYXQgcGllY2Ugb2YgZGF0YSAocG90ZW50aWFsbHkgYSBkYXRh IGxpbmUpIGludG8gdGhlIGxpbmUgYnVmZmVyLAohIAkJCSAqIGFuZCB1cGRhdGUgdGhlIHBv aW50ZXJzIGZvciB0aGUgbmV4dCBzY2FuLgohIAkJCSAqLwohIAkJCWxpbmVzaXplID0gZW5k bG9jIC0gYmVnbG9jICsgMTsKISAJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZsaW5lX2J1 ZiwgYmVnbG9jLCBsaW5lc2l6ZSk7CiEgCQkJYnVmZmVyX2luZGV4ICs9IGxpbmVzaXplOwoh IAkJCWJlZ2xvYyA9IGVuZGxvYyArIDE7CiEgCiAgCQkJCQlpZiAoZW9sX3R5cGUgPT0gRU9M X0NSTkwpCiAgCQkJCQl7CiEgCQkJCS8qIGNoZWNrIGlmIHRoZXJlIGlzIGEgJ1xuJyBhZnRl ciB0aGUgJ1xyJyAqLwohIAkJCQlpZiAoKihlbmRsb2MgKyAxKSA9PSAnXG4nKQohIAkJCQl7 CiEgCQkJCQkvKiB0aGlzIGlzIGEgbGluZSBlbmQgKi8KISAJCQkJCWFwcGVuZEJpbmFyeVN0 cmluZ0luZm8oJmxpbmVfYnVmLCBiZWdsb2MsIDEpOwkJLyogbG9hZCB0aGF0ICdcbicgKi8K ISAJCQkJCWJ1ZmZlcl9pbmRleCsrOwohIAkJCQkJYmVnbG9jKys7CiEgCQkJCX0KICAJCQkJ CQllbHNlCiEgCQkJCQkvKiBqdXN0IGEgQ1IsIG5vdCBhIGxpbmUgZW5kICovCiEgCQkJCQll b2xfZm91bmQgPSBmYWxzZTsKICAJCQkJCX0KICAKICAJCQkJCS8qCiEgCQkJICogaW4gc29t ZSBjYXNlcywgdGhpcyBlbmQgb2YgbGluZSBjaGFyIGhhcHBlbnMgdG8gYmUgdGhlCiEgCQkJ ICogbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlci4gd2UgbmVlZCB0byBjYXRjaCB0aGF0 LgogIAkJCQkJICovCiEgCQkJaWYgKGJ1ZmZlcl9pbmRleCA+PSBieXRlc3JlYWQpCiEgCQkJ CWJ1Zl9kb25lID0gdHJ1ZTsKISAKISAJCQkvKgohIAkJCSAqIENoZWNrIGlmIHRoZSAxc3Qg ZW5kIG9mIGxpbmUgY2ggaXMgZXNjYXBlZC4KISAJCQkgKi8KISAJCQlpZiAoZW5kbG9jICE9 IGlucHV0X2J1ZikJLyogY2FuIHdlIGxvb2sgMSBjaGFyIGJhY2s/ICovCiEgCQkJewohIAkJ CQlpZiAoKihlbmRsb2MgLSAxKSAhPSBlc2NhcGVjKQkvKiBwcmV2IGNoYXIgaXMgbm90IGFu IGVzY2FwZSAqLwohIAkJCQkJZW9sX2VzY2FwZWQgPSBmYWxzZTsKISAJCQkJZWxzZQohIAkJ CQkJLyogcHJldiBjaGFyIGlzIGFuIGVzY2FwZSAqLwohIAkJCQl7CiEgCQkJCQlpZiAoZW5k bG9jICE9IChpbnB1dF9idWYgKyAxKSkJCS8qIGNhbiB3ZSBsb29rIGFub3RoZXIKISAJCQkJ CQkJCQkJCQkJCSAqIGNoYXIgYmFjaz8gKi8KISAJCQkJCXsKISAJCQkJCQkvKiBpdCdzIGEg ZG91YmxlIGVzY2FwZSBjaGFyLCBzbyBpdCdzIG5vdCBhbiBlc2NhcGUgKi8KISAJCQkJCQlp ZiAoKihlbmRsb2MgLSAyKSA9PSBlc2NhcGVjKQohIAkJCQkJCQllb2xfZXNjYXBlZCA9IGZh bHNlOwohIAkJCQkJCS8qIGVsc2UgaXQncyBhIHNpbmdsZSBlc2NhcGUgY2hhciwgc28gRU9M IGlzIGFzY2FwZWQgKi8KISAJCQkJCX0KISAJCQkJCWVsc2UKISAJCQkJCXsKISAJCQkJCQkv KiB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZSBsYXN0IGJ1ZmZlciAqLwohIAkJCQkJCWlmIChl c2NfaW5fcHJldmJ1ZikJCQohIAkJCQkJCQllb2xfZXNjYXBlZCA9IGZhbHNlOwogIAkJCQl9 CiAgCQkJfQogIAkJfQohIAkJCWVsc2UKISAJCQkJLyoKISAJCQkJICogdGhpcyBlb2wgY2gg aXMgZmlyc3QgY2ggaW4gYnVmZmVyLCBjaGVjayBmb3IgZXNjYXBlIGluIHByZXYgYnVmCiEg CQkJCSAqLwogIAkJewohIAkJCQlpZiAoIWVzY19pbl9wcmV2YnVmKQohIAkJCQkJZW9sX2Vz Y2FwZWQgPSBmYWxzZTsKICAJCQl9CiAgCiEgCQkJZXNjX2luX3ByZXZidWYgPSBmYWxzZTsJ CS8qIHJlc2V0IHZhcmlhYmxlICovCiAgCiEgCQkJLyoKISAJCQkgKiBpZiBlb2wgd2FzIGZv dW5kLCBhbmQgaXQgaXNuJ3QgZXNjYXBlZCwgbGluZSBpcyBkb25lCiEgCQkJICovCiEgCQkJ aWYgKChlb2xfZXNjYXBlZCA9PSBmYWxzZSkgJiYgZW9sX2ZvdW5kKQogIAkJCXsKISAJCQkJ bGluZV9kb25lID0gdHJ1ZTsKICAJCQkJYnJlYWs7CiAgCQkJfQohIAkJCQllbHNlCiEgCQkJ CS8qIHN0YXkgaW4gdGhlIGxvb3AgYW5kIHByb2Nlc3Mgc29tZSBtb3JlIGRhdGEuICovCiEg CQkJCWxpbmVfZG9uZSA9IGZhbHNlOwohIAkJCQkJCiEgCQl9CQkJCQkJLyogZW5kIG9mIGZv dW5kIGVvbF9jaCAqLwohIAkJfQogIAohIAkvKgohIAkgKiBEb25lIHJlYWRpbmcgdGhlIGxp bmUuIENvbnZlcnQgaXQgdG8gc2VydmVyIGVuY29kaW5nLgohIAkgKi8KISAJaWYgKHRyYW5z Y29kZSkKISAJewohIAkJY3Z0ID0gKGNoYXIgKikgcGdfY2xpZW50X3RvX3NlcnZlcigodW5z aWduZWQgY2hhciAqKSBsaW5lX2J1Zi5kYXRhLAohIAkJCQkJCQkJCQkgICBsaW5lX2J1Zi5s ZW4pOwohIAkJaWYgKGN2dCAhPSBsaW5lX2J1Zi5kYXRhKQohIAkJewohIAkJCS8qIHRyYW5z ZmVyIGNvbnZlcnRlZCBkYXRhIGJhY2sgdG8gbGluZV9idWYgKi8KISAJCQlsaW5lX2J1Zi5s ZW4gPSAwOwohIAkJCWxpbmVfYnVmLmRhdGFbMF0gPSAnXDAnOwohIAkJCWxpbmVfYnVmLmN1 cnNvciA9IDA7CiEgCQkJYXBwZW5kQmluYXJ5U3RyaW5nSW5mbygmbGluZV9idWYsIGN2dCwg c3RybGVuKGN2dCkpOwohIAkJfQohIAl9CiEgCQkJCiEgCS8qIGluZGljYXRlIHRoYXQgY29u dmVyc2lvbiBoYWQgb2NjdXJlZCAqLwohIAlsaW5lX2J1Zl9jb252ZXJ0ZWQgPSB0cnVlOwoh IAohIAkvKgohIAkgKiBjaGVjayBpZiB0aGlzIGxpbmUgaXMgYW4gZW5kIG1hcmtlciAtLSAi XC4iCiEgCSAqLwohIAllbmRfbWFya2VyID0gZmFsc2U7CiEgCiEgCXN3aXRjaCAoZW9sX3R5 cGUpCiEgCQkJewohIAkJY2FzZSBFT0xfTkw6CiEgCQkJaWYgKCFzdHJjbXAobGluZV9idWYu ZGF0YSwgIlxcLlxuIikpCiEgCQkJCWVuZF9tYXJrZXIgPSB0cnVlOwohIAkJCWJyZWFrOwoh IAkJY2FzZSBFT0xfQ1I6CiEgCQkJaWYgKCFzdHJjbXAobGluZV9idWYuZGF0YSwgIlxcLlxy IikpCiEgCQkJCWVuZF9tYXJrZXIgPSB0cnVlOwohIAkJCWJyZWFrOwohIAkJY2FzZSBFT0xf Q1JOTDoKISAJCQlpZiAoIXN0cmNtcChsaW5lX2J1Zi5kYXRhLCAiXFwuXHJcbiIpKQohIAkJ CQllbmRfbWFya2VyID0gdHJ1ZTsKISAJCQlicmVhazsKISAJCWNhc2UgRU9MX1VOS05PV046 CiEgCQkJCWJyZWFrOwohIAkJCX0KISAKISAJaWYgKGVuZF9tYXJrZXIpCiEgCQkJewohIAkJ ZmVfZW9mID0gdHJ1ZTsKISAJCS8qIHdlIGRvbid0IHdhbnQgdG8gcHJvY2VzcyBhIFwuIGFz IGRhdGEgbGluZSwgd2FudCB0byBxdWl0LiAqLwohIAkJbGluZV9kb25lID0gZmFsc2U7CiEg CQlidWZfZG9uZSA9IHRydWU7CiEgCX0KISAKISAJcmV0dXJuIGxpbmVfZG9uZTsKISB9CiEg CiEgLyoKISAgKiBGaW5kcyB0aGUgbmV4dCBDU1YgbGluZSB0aGF0IGlzIGluIHRoZSBpbnB1 dCBidWZmZXIgYW5kIGxvYWRzIAohICAqIGl0IGludG8gbGluZV9idWYuIFJldHVybnMgYW4g aW5kaWNhdGlvbiBpZiB0aGUgbGluZSB0aGF0IHdhcyByZWFkIAohICAqIGlzIGNvbXBsZXRl IChpZiBhbiB1bmVzY2FwZWQgbGluZS1lbmQgd2FzIGVuY291bnRlcmVkKS4gSWYgd2UgCiEg ICogcmVhY2hlZCB0aGUgZW5kIG9mIGJ1ZmZlciBiZWZvcmUgdGhlIHdob2xlIGxpbmUgd2Fz IHdyaXR0ZW4gaW50byB0aGUKISAgKiBsaW5lIGJ1ZmZlciB0aGVuIHJldHVybnMgZmFsc2Uu CiEgICovCiEgc3RhdGljIGJvb2wKISBDb3B5UmVhZExpbmVDU1Yoc2l6ZV90IGJ5dGVzcmVh ZCwgY2hhciAqcXVvdGUsIGNoYXIgKmVzY2FwZSkKISB7CiEgCWludAkJCWxpbmVzaXplOwoh IAljaGFyCSAgICpjdnQ7CiEgCWNoYXIgICAgICAgIHF1b3RlYyA9ICdcMCcsCiEgICAgICAg ICAgICAgICAgIGVzY2FwZWMgPSAnXDAnOwohIAlib29sCQl0cmFuc2NvZGUgPSAoY2xpZW50 X2VuY29kaW5nICE9IHNlcnZlcl9lbmNvZGluZyk7CiEgCQohIAkvKiBtYXJrIHRoYXQgZW5j b2RpbmcgY29udmVyc2lvbiBoYXNuJ3Qgb2NjdXJyZWQgeWV0ICovCiEgCWxpbmVfYnVmX2Nv bnZlcnRlZCA9IGZhbHNlOwohIAkKISAJZXNjYXBlYyA9IGVzY2FwZVswXTsKISAJcXVvdGVj ID0gcXVvdGVbMF07CiEgCQohICAgICAvKiBpZ25vcmUgc3BlY2lhbCBlc2NhcGUgcHJvY2Vz c2luZyBpZiBpdCdzIHRoZSBzYW1lIGFzIHF1b3RlYyAqLwohIAlpZiAocXVvdGVjID09IGVz Y2FwZWMpCiEgCQllc2NhcGVjID0gJ1wwJzsKISAKISAJLyoKISAJICogRGV0ZWN0IGVuZCBv ZiBsaW5lIHR5cGUgaWYgbm90IGFscmVhZHkgZGV0ZWN0ZWQuCiEgCSAqLwohIAlpZiAoZW9s X3R5cGUgPT0gRU9MX1VOS05PV04pCiEgCXsKISAJCWJvb2wJCWVvbF9kZXRlY3RlZCA9IERl dGVjdExpbmVFbmQoYnl0ZXNyZWFkLCBxdW90ZSwgZXNjYXBlKTsKISAJCQohIAkJaWYgKCFl b2xfZGV0ZWN0ZWQpCiEgCQl7CiEgCQkJLyogbG9hZCBlbnRpcmUgaW5wdXQgYnVmZmVyIGlu dG8gbGluZSBidWYsIGFuZCBxdWl0ICovCiEgCQkJYXBwZW5kQmluYXJ5U3RyaW5nSW5mbygm bGluZV9idWYsIGlucHV0X2J1ZiwgQ09QWV9CVUZfU0laRSk7CiEgCQkJbGluZV9kb25lID0g ZmFsc2U7CiEgCQkJYnVmX2RvbmUgPSB0cnVlOwohIAkJCQohIAkJCXJldHVybiBsaW5lX2Rv bmU7CiEgCQl9CiEgCX0KISAJCiEgCS8qCiEgCSAqIFNwZWNpYWwgY2FzZTogZW9sIGlzIENS TkwsIGxhc3QgYnl0ZSBvZiBwcmV2aW91cyBidWZmZXIgd2FzIGFuCiEgCSAqIHVuZXNjYXBl ZCBDUiBhbmQgMXN0IGJ5dGUgb2YgY3VycmVudCBidWZmZXIgaXMgTkwuIFdlIGNoZWNrIGZv cgohIAkgKiB0aGF0IGhlcmUuCiEgCSAqLwohIAkJCQlpZiAoZW9sX3R5cGUgPT0gRU9MX0NS TkwpCiEgCQkJCXsKISAJCS8qIGlmIHdlIHN0YXJ0ZWQgc2Nhbm5pbmcgZnJvbSB0aGUgMXN0 IGJ5dGUgb2YgdGhlIGJ1ZmZlciAqLwohIAkJaWYgKGJlZ2xvYyA9PSBpbnB1dF9idWYpCiEg CQl7CiEgCQkJLyogYW5kIGhhZCBhIENSIGluIGxhc3QgYnl0ZSBvZiBwcmV2IGJ1ZiAqLwoh IAkJCWlmIChjcl9pbl9wcmV2YnVmKQohIAkJCXsKISAJCQkJLyoKISAJCQkJICogaWYgdGhp cyAxc3QgYnl0ZSBpbiBidWZmZXIgaXMgMm5kIGJ5dGUgb2YgbGluZSBlbmQgc2VxdWVuY2UK ISAJCQkJICogKGxpbmVmZWVkKQohIAkJCQkgKi8KISAJCQkJaWYgKCpiZWdsb2MgPT0gZW9s X2NoWzFdKQohIAkJCQl7CiEgCQkJCQkvKgohIAkJCQkJICogbG9hZCB0aGF0IG9uZSBsaW5l ZmVlZCBieXRlIGFuZCBpbmRpY2F0ZSB3ZSBhcmUgZG9uZQohIAkJCQkJICogd2l0aCB0aGUg ZGF0YSBsaW5lCiEgCQkJCQkgKi8KISAJCQkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmxp bmVfYnVmLCBiZWdsb2MsIDEpOwohIAkJCQkJYnVmZmVyX2luZGV4Kys7CiEgCQkJCQliZWds b2MrKzsKISAJCQkJCQohIAkJCQkJbGluZV9kb25lID0gdHJ1ZTsKISAJCQkJCWVzY19pbl9w cmV2YnVmID0gZmFsc2U7CiEgCQkJCQljcl9pbl9wcmV2YnVmID0gZmFsc2U7CiEgCQkJCQkK ISAJCQkJCXJldHVybiBsaW5lX2RvbmU7CiEgCQkJCX0KISAJCQl9CiEgCQkJCiEgCQkJY3Jf aW5fcHJldmJ1ZiA9IGZhbHNlOwohIAkJfQogIAkJCQl9CiAgCiAgCQkJCS8qCiEgCSAqICh3 ZSBuZWVkIGEgbG9vcCBzbyB0aGF0IGlmIGVvbF9jaCBpcyBmb3VuZCwgYnV0IHdlIGFyZSBp biBxdW90ZXMsCiEgCSAqIHdlIGNhbiBzZWFyY2ggZm9yIHRoZSBuZXh0IGVvbF9jaCkKICAJ CQkJICovCiEgCXdoaWxlICh0cnVlKQohIAl7CiEgCQkvKiByZWFjaGVkIGVuZCBvZiBidWZm ZXIgKi8KISAJCWlmICgoZW5kbG9jID0gc2NhbkNTVkxpbmUoYmVnbG9jLCBlb2xfY2hbMF0s IGVzY2FwZWMsIHF1b3RlYywgYnl0ZXNyZWFkIC0gYnVmZmVyX2luZGV4KSkgPT0gTlVMTCkK ICAJCQkJewohIAkJCWxpbmVzaXplID0gQ09QWV9CVUZfU0laRSAtIChiZWdsb2MgLSBpbnB1 dF9idWYpOwohIAkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmxpbmVfYnVmLCBiZWdsb2Ms IGxpbmVzaXplKTsKISAJCQkKISAJCQlpZiAobGFzdF93YXNfZXNjKQohIAkJCQllc2NfaW5f cHJldmJ1ZiA9IHRydWU7CiEgCQkJCiEgCQkJaWYgKGxpbmVfYnVmLmxlbiA+IDEpCiEgCQkJ ewohIAkJCQljaGFyCSAgICpsYXN0X2NoID0gbGluZV9idWYuZGF0YSArIGxpbmVfYnVmLmxl biAtIDE7IC8qIGJlZm9yZSB0ZXJtaW5hdGluZyBcMCAqLwohIAkJCQkKISAJCQkJaWYgKCps YXN0X2NoID09ICdccicpCiEgCQkJCXsKISAJCQkJCWlmIChlb2xfdHlwZSA9PSBFT0xfQ1JO TCkKISAJCQkJCQljcl9pbl9wcmV2YnVmID0gdHJ1ZTsKICAJCQkJfQohIAkJCX0KISAJCQkK ISAJCQlsaW5lX2RvbmUgPSBmYWxzZTsKISAJCQlidWZfZG9uZSA9IHRydWU7CiAgCQkJCWJy ZWFrOwogIAkJCX0KKyAJCWVsc2UKKyAJCQkvKiBmb3VuZCAxc3QgZW9sIGNoYXIgaW4gaW5w dXRfYnVmLiAqLworIAkJeworIAkJCWJvb2wJCWVvbF9mb3VuZCA9IHRydWU7CiAgCQkJCiEg CQkJLyoKISAJCQkgKiBMb2FkIHRoYXQgcGllY2Ugb2YgZGF0YSAocG90ZW50aWFsbHkgYSBk YXRhIGxpbmUpIGludG8gdGhlIGxpbmUgYnVmZmVyLAohIAkJCSAqIGFuZCB1cGRhdGUgdGhl IHBvaW50ZXJzIGZvciB0aGUgbmV4dCBzY2FuLgohIAkJCSAqLwohIAkJCWxpbmVzaXplID0g ZW5kbG9jIC0gYmVnbG9jICsgMTsKISAJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZsaW5l X2J1ZiwgYmVnbG9jLCBsaW5lc2l6ZSk7CiEgCQkJYnVmZmVyX2luZGV4ICs9IGxpbmVzaXpl OwohIAkJCWJlZ2xvYyA9IGVuZGxvYyArIDE7CiEgCQkJCiEgCQkJLyogZW5kIG9mIGxpbmUg b25seSBpZiBub3QgaW4gcXVvdGVzICovCiEgCQkJaWYoaW5fcXVvdGUpCiEgCQkJewohIAkJ CQlsaW5lX2RvbmUgPSBmYWxzZTsKISAJCQkJLyogYnVmIGRvbmUsIGJ1dCBzdGlsbCBpbiBx dW90ZSAqLwohIAkJCQlpZiAoYnVmZmVyX2luZGV4ID49IGJ5dGVzcmVhZCkKISAJCQkJewoh IAkJCQkJYnVmX2RvbmUgPSB0cnVlOwohIAkJCQkJYnJlYWs7CiEgCQkJCX0KISAJCQl9CiAg CQkJZWxzZQohIAkJCXsKISAJCQkJLyogaWYgZG9zIGVvbCwgY2hlY2sgZm9yICdcbicgYWZ0 ZXIgdGhlICdccicgKi8KISAJCQkJaWYgKGVvbF90eXBlID09IEVPTF9DUk5MKQohIAkJCQl7 CiEgCQkJCQlpZiAoKihlbmRsb2MgKyAxKSA9PSAnXG4nKQohIAkJCQkJewohIAkJCQkJCS8q IHRoaXMgaXMgYSBsaW5lIGVuZCAqLwohIAkJCQkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8o JmxpbmVfYnVmLCBiZWdsb2MsIDEpOwkJLyogbG9hZCB0aGF0ICdcbicgKi8KISAJCQkJCQli dWZmZXJfaW5kZXgrKzsKISAJCQkJCQliZWdsb2MrKzsKISAJCQkJCX0KISAJCQllbHNlCiEg CQkJCQkJLyoganVzdCBhIENSLCBub3QgYSBsaW5lIGVuZCAqLwohIAkJCQkJCWVvbF9mb3Vu ZCA9IGZhbHNlOwogIAkJfQogIAohIAkJCQkvKgohIAkJCQkgKiBpbiBzb21lIGNhc2VzLCB0 aGlzIGVuZCBvZiBsaW5lIGNoYXIgaGFwcGVucyB0byBiZSB0aGUKISAJCQkJICogbGFzdCBj aGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlci4gd2UgbmVlZCB0byBjYXRjaCB0aGF0LgohIAkJCQkg Ki8KISAJCQkJaWYgKGJ1ZmZlcl9pbmRleCA+PSBieXRlc3JlYWQpCiEgCQkJCQlidWZfZG9u ZSA9IHRydWU7CiAgCiAgCQkvKgohIAkJCQkgKiBpZiBlb2wgd2FzIGZvdW5kIGxpbmUgaXMg ZG9uZQogIAkJICovCiEgCQkJCWlmIChlb2xfZm91bmQpCiAgCQkJCXsKISAJCQkJCWxpbmVf ZG9uZSA9IHRydWU7CiAgCQkJCQlicmVhazsKICAJCQkJfQogIAkJCX0KISAJCX0JCQkJCQkv KiBlbmQgb2YgZm91bmQgZW9sX2NoICovCiAgCQl9CiAgCiEgCS8qCiEgCSAqIERvbmUgcmVh ZGluZyB0aGUgbGluZS4gQ29udmVydCBpdCB0byBzZXJ2ZXIgZW5jb2RpbmcuCiEgCSAqLwoh IAlpZiAodHJhbnNjb2RlKQogIAl7CiAgCQljdnQgPSAoY2hhciAqKSBwZ19jbGllbnRfdG9f c2VydmVyKCh1bnNpZ25lZCBjaGFyICopIGxpbmVfYnVmLmRhdGEsCiAgCQkJCQkJCQkJCSAg IGxpbmVfYnVmLmxlbik7CioqKioqKioqKioqKioqKgoqKiogMjI2NSwyMjg1ICoqKioKICAJ CQkvKiB0cmFuc2ZlciBjb252ZXJ0ZWQgZGF0YSBiYWNrIHRvIGxpbmVfYnVmICovCiAgCQkJ bGluZV9idWYubGVuID0gMDsKICAJCQlsaW5lX2J1Zi5kYXRhWzBdID0gJ1wwJzsKICAJCQlh cHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZsaW5lX2J1ZiwgY3Z0LCBzdHJsZW4oY3Z0KSk7CiAg CQl9CiAgCX0KICAKISAJLyogTm93IGl0J3Mgc2FmZSB0byB1c2UgdGhlIGJ1ZmZlciBpbiBl cnJvciBtZXNzYWdlcyAqLwogIAlsaW5lX2J1Zl9jb252ZXJ0ZWQgPSB0cnVlOwogIAohIAly ZXR1cm4gcmVzdWx0OwogIH0KICAKICAvKgogICAqCVJldHVybiBkZWNpbWFsIHZhbHVlIGZv ciBhIGhleGFkZWNpbWFsIGRpZ2l0CiAgICovCiAgc3RhdGljCiEgaW50IEdldERlY2ltYWxG cm9tSGV4KGNoYXIgaGV4KQogIHsKICAJaWYgKGlzZGlnaXQoaGV4KSkKICAJCXJldHVybiBo ZXggLSAnMCc7Ci0tLSAyNDI1LDI0NzggLS0tLQogIAkJCS8qIHRyYW5zZmVyIGNvbnZlcnRl ZCBkYXRhIGJhY2sgdG8gbGluZV9idWYgKi8KICAJCQlsaW5lX2J1Zi5sZW4gPSAwOwogIAkJ CWxpbmVfYnVmLmRhdGFbMF0gPSAnXDAnOworIAkJCWxpbmVfYnVmLmN1cnNvciA9IDA7CiAg CQkJYXBwZW5kQmluYXJ5U3RyaW5nSW5mbygmbGluZV9idWYsIGN2dCwgc3RybGVuKGN2dCkp OwogIAkJfQogIAl9CiAgCiEgCS8qIGluZGljYXRlIHRoYXQgY29udmVyc2lvbiBoYWQgb2Nj dXJlZCAqLwogIAlsaW5lX2J1Zl9jb252ZXJ0ZWQgPSB0cnVlOwogIAohIAkvKgohIAkgKiBj aGVjayBpZiB0aGlzIGxpbmUgaXMgYW4gZW5kIG1hcmtlciAtLSAiXC4iCiEgCSAqLwohIAll bmRfbWFya2VyID0gZmFsc2U7CiEgCiEgCXN3aXRjaCAoZW9sX3R5cGUpCiEgCXsKISAJCWNh c2UgRU9MX05MOgohIAkJCWlmICghc3RyY21wKGxpbmVfYnVmLmRhdGEsICJcXC5cbiIpKQoh IAkJCQllbmRfbWFya2VyID0gdHJ1ZTsKISAJCQlicmVhazsKISAJCWNhc2UgRU9MX0NSOgoh IAkJCWlmICghc3RyY21wKGxpbmVfYnVmLmRhdGEsICJcXC5cciIpKQohIAkJCQllbmRfbWFy a2VyID0gdHJ1ZTsKISAJCQlicmVhazsKISAJCWNhc2UgRU9MX0NSTkw6CiEgCQkJaWYgKCFz dHJjbXAobGluZV9idWYuZGF0YSwgIlxcLlxyXG4iKSkKISAJCQkJZW5kX21hcmtlciA9IHRy dWU7CiEgCQkJYnJlYWs7CiEgCQljYXNlIEVPTF9VTktOT1dOOgohIAkJCWJyZWFrOwohIAl9 CiEgCiEgCWlmIChlbmRfbWFya2VyKQohIAl7CiEgCQlmZV9lb2YgPSB0cnVlOwohIAkJLyog d2UgZG9uJ3Qgd2FudCB0byBwcm9jZXNzIGEgXC4gYXMgZGF0YSBsaW5lLCB3YW50IHRvIHF1 aXQuICovCiEgCQlsaW5lX2RvbmUgPSBmYWxzZTsKISAJCWJ1Zl9kb25lID0gdHJ1ZTsKISAJ fQohIAohIAlyZXR1cm4gbGluZV9kb25lOwogIH0KICAKICAvKgogICAqCVJldHVybiBkZWNp bWFsIHZhbHVlIGZvciBhIGhleGFkZWNpbWFsIGRpZ2l0CiAgICovCiAgc3RhdGljCiEgaW50 CiEgR2V0RGVjaW1hbEZyb21IZXgoY2hhciBoZXgpCiAgewogIAlpZiAoaXNkaWdpdChoZXgp KQogIAkJcmV0dXJuIGhleCAtICcwJzsKKioqKioqKioqKioqKioqCioqKiAyMjg3LDIzNDQg KioqKgogIAkJcmV0dXJuIHRvbG93ZXIoaGV4KSAtICdhJyArIDEwOwogIH0KICAKISAvKi0t LS0tLS0tLS0KISAgKiBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBhdHRyaWJ1dGUsIHBl cmZvcm1pbmcgZGUtZXNjYXBpbmcgYXMgbmVlZGVkLgohICAqCiEgICogZGVsaW0gaXMgdGhl IGNvbHVtbiBkZWxpbWl0ZXIgc3RyaW5nIChtdXN0IGJlIGp1c3Qgb25lIGJ5dGUgZm9yIG5v dykuCiEgICogbnVsbF9wcmludCBpcyB0aGUgbnVsbCBtYXJrZXIgc3RyaW5nLiAgTm90ZSB0 aGF0IHRoaXMgaXMgY29tcGFyZWQgdG8KISAgKiB0aGUgcHJlLWRlLWVzY2FwZWQgaW5wdXQg c3RyaW5nLgohICAqCiEgICogKnJlc3VsdCBpcyBzZXQgdG8gaW5kaWNhdGUgd2hhdCB0ZXJt aW5hdGVkIHRoZSByZWFkOgohICAqCQlOT1JNQUxfQVRUUjoJY29sdW1uIGRlbGltaXRlcgoh ICAqCQlFTkRfT0ZfTElORToJZW5kIG9mIGxpbmUKISAgKiBJbiBlaXRoZXIgY2FzZSwgdGhl IHN0cmluZyByZWFkIHVwIHRvIHRoZSB0ZXJtaW5hdG9yIGlzIHJldHVybmVkLgohICAqCiEg ICogKmlzbnVsbCBpcyBzZXQgdHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24gd2hldGhlciB0 aGUgaW5wdXQgbWF0Y2hlZAohICAqIHRoZSBudWxsIG1hcmtlci4gIE5vdGUgdGhhdCB0aGUg Y2FsbGVyIGNhbm5vdCBjaGVjayB0aGlzIHNpbmNlIHRoZQohICAqIHJldHVybmVkIHN0cmlu ZyB3aWxsIGJlIHRoZSBwb3N0LWRlLWVzY2FwaW5nIGVxdWl2YWxlbnQsIHdoaWNoIG1heQoh ICAqIGxvb2sgdGhlIHNhbWUgYXMgc29tZSB2YWxpZCBkYXRhIHN0cmluZy4KISAgKi0tLS0t LS0tLS0KICAgKi8KISBzdGF0aWMgY2hhciAqCiEgQ29weVJlYWRBdHRyaWJ1dGUoY29uc3Qg Y2hhciAqZGVsaW0sIGNvbnN0IGNoYXIgKm51bGxfcHJpbnQsCiEgCQkJCSAgQ29weVJlYWRS ZXN1bHQgKnJlc3VsdCwgYm9vbCAqaXNudWxsKQogIHsKICAJY2hhcgkJYzsKISAJY2hhcgkJ ZGVsaW1jID0gZGVsaW1bMF07CiEgCWludAkJCXN0YXJ0X2N1cnNvciA9IGxpbmVfYnVmLmN1 cnNvcjsKISAJaW50CQkJZW5kX2N1cnNvcjsKISAJaW50CQkJaW5wdXRfbGVuOwogIAohIAkv KiByZXNldCBhdHRyaWJ1dGVfYnVmIHRvIGVtcHR5ICovCiEgCWF0dHJpYnV0ZV9idWYubGVu ID0gMDsKISAJYXR0cmlidXRlX2J1Zi5kYXRhWzBdID0gJ1wwJzsKICAKISAJLyogc2V0IGRl ZmF1bHQgc3RhdHVzICovCiEgCSpyZXN1bHQgPSBFTkRfT0ZfTElORTsKICAKISAJZm9yICg7 OykKICAJewohIAkJZW5kX2N1cnNvciA9IGxpbmVfYnVmLmN1cnNvcjsKISAJCWlmIChsaW5l X2J1Zi5jdXJzb3IgPj0gbGluZV9idWYubGVuKQohIAkJCWJyZWFrOwohIAkJYyA9IGxpbmVf YnVmLmRhdGFbbGluZV9idWYuY3Vyc29yKytdOwohIAkJaWYgKGMgPT0gZGVsaW1jKQogIAkJ ewohIAkJCSpyZXN1bHQgPSBOT1JNQUxfQVRUUjsKISAJCQlicmVhazsKICAJCX0KISAJCWlm IChjID09ICdcXCcpCiAgCQl7CiEgCQkJaWYgKGxpbmVfYnVmLmN1cnNvciA+PSBsaW5lX2J1 Zi5sZW4pCiEgCQkJCWJyZWFrOwohIAkJCWMgPSBsaW5lX2J1Zi5kYXRhW2xpbmVfYnVmLmN1 cnNvcisrXTsKISAJCQlzd2l0Y2ggKGMpCiAgCQkJewogIAkJCQljYXNlICcwJzoKICAJCQkJ Y2FzZSAnMSc6Ci0tLSAyNDgwLDI3NjkgLS0tLQogIAkJcmV0dXJuIHRvbG93ZXIoaGV4KSAt ICdhJyArIDEwOwogIH0KICAKISAvKgohICAqIERldGVjdGVkIHRoZSBlb2wgdHlwZSBieSBs b29raW5nIGF0IHRoZSBmaXJzdCBkYXRhIHJvdy4KISAgKiBQb3NzaWJsZSBlb2wgdHlwZXMg YXJlIE5MLCBDUiwgb3IgQ1JOTC4gSWYgZW9sIHR5cGUgd2FzCiEgICogZGV0ZWN0ZWQsIGl0 IGlzIHNldCBhbmQgYSBib29sZWFuIHRydWUgaXMgcmV0dXJuZWQgdG8KISAgKiBpbmRpY2F0 ZWQgZGV0ZWN0aW9uIHdhcyBzdWNjZXNzZnVsLiBJZiB0aGUgZmlyc3QgZGF0YSByb3cKISAg KiBpcyBsb25nZXIgdGhhbiB0aGUgaW5wdXQgYnVmZmVyLCB3ZSByZXR1cm4gZmFsc2UgYW5k IHdpbGwKISAgKiB0cnkgYWdhaW4gaW4gdGhlIG5leHQgYnVmZmVyLgogICAqLwohIHN0YXRp YyBib29sCiEgRGV0ZWN0TGluZUVuZChzaXplX3QgYnl0ZXNyZWFkLCBjaGFyICpxdW90ZSwg Y2hhciAqZXNjYXBlKQogIHsKKyAJaW50ICAgICAgICAgaW5kZXggPSAwOwogIAljaGFyCQlj OwohIAljaGFyCQlxdW90ZWMgPSAnXDAnLAohIAkJZXNjYXBlYyA9ICdcMCc7CiEgCWJvb2wg ICAgICAgIGNzdiA9IGZhbHNlOwogIAohIAlpZiAocXVvdGUpIC8qIENTViBmb3JtYXQgKi8K ISAJewohIAkJY3N2ID0gdHJ1ZTsKISAJCXF1b3RlYyA9IHF1b3RlWzBdOwohIAkJZXNjYXBl YyA9IGVzY2FwZVswXTsKISAJCS8qIGlnbm9yZSBzcGVjaWFsIGVzY2FwZSBwcm9jZXNzaW5n IGlmIGl0J3MgdGhlIHNhbWUgYXMgcXVvdGVjICovCiEgCQlpZiAocXVvdGVjID09IGVzY2Fw ZWMpCiEgCQkJZXNjYXBlYyA9ICdcMCc7CiEgCX0KICAKISAJd2hpbGUgKGluZGV4IDwgQ09Q WV9CVUZfU0laRSkKISAJewohIAkJYyA9IGlucHV0X2J1ZltpbmRleF07CiAgCiEgCQlpZihj c3YpCiAgCXsKISAJCQlpZiAoaW5fcXVvdGUgJiYgYyA9PSBlc2NhcGVjKQohIAkJCQlsYXN0 X3dhc19lc2MgPSAhbGFzdF93YXNfZXNjOwohIAkJCWlmIChjID09IHF1b3RlYyAmJiAhbGFz dF93YXNfZXNjKQohIAkJCQlpbl9xdW90ZSA9ICFpbl9xdW90ZTsKISAJCQlpZiAoYyAhPSBl c2NhcGVjKQohIAkJCQlsYXN0X3dhc19lc2MgPSBmYWxzZTsKISAJCX0KISAJCQohIAkJaWYg KGMgPT0gJ1xuJykKICAJCXsKISAJCQlpZighY3N2IHx8IChjc3YgJiYgIWluX3F1b3RlKSkK ISAJCQl7CiEgCQkJCWVvbF90eXBlID0gRU9MX05MOwohIAkJCQllb2xfY2hbMF0gPSAnXG4n OwohIAkJCQllb2xfY2hbMV0gPSAnXDAnOwohIAkJCQkKISAJCQkJaW5fcXVvdGUgPSBmYWxz ZTsKISAJCQkJbGFzdF93YXNfZXNjID0gZmFsc2U7CiEgCQkJCXJldHVybiB0cnVlOwohIAkJ CX0KICAJCX0KISAJCWlmIChjID09ICdccicpCiAgCQl7CiEgCQkJaWYoIWNzdiB8fCAoY3N2 ICYmICFpbl9xdW90ZSkpCiEgICAgICAgICAgICAgewohIAkJCQlpZiAoaW5wdXRfYnVmW2lu ZGV4ICsgMV0gPT0gJ1xuJykgLyogYWx3YXlzIHNhZmUgKi8KISAJCQkJCXsKISAJCQkJCWVv bF90eXBlID0gRU9MX0NSTkw7CiEgCQkJCQllb2xfY2hbMF0gPSAnXHInOwohIAkJCQkJZW9s X2NoWzFdID0gJ1xuJzsKISAJCQkJCX0KISAJCQkJCWVsc2UKISAJCQkJCXsKISAJCQkJCQll b2xfdHlwZSA9IEVPTF9DUjsKISAJCQkJCQllb2xfY2hbMF0gPSAnXHInOwohIAkJCQkJCWVv bF9jaFsxXSA9ICdcMCc7CiEgCQkJCQl9CiEgCQkJCQkKISAJCQkJCWluX3F1b3RlID0gZmFs c2U7CiEgCQkJCQlsYXN0X3dhc19lc2MgPSBmYWxzZTsKISAJCQkJCXJldHVybiB0cnVlOwoh IAkJCX0KISAJCX0KISAKISAJCWluZGV4Kys7CiEgCX0KISAKISByZXR1cm4gZmFsc2U7CiEg fQohIAohIC8qCiEgICogUmVhZCBhbGwgVEVYVCBhdHRyaWJ1dGVzLiBBdHRyaWJ1dGVzIGFy ZSBwYXJzZWQgZnJvbSBsaW5lX2J1ZiBhbmQKISAgKiBpbnNlcnRlZCAoYWxsIGF0IG9uY2Up IHRvIGF0dHJfYnVmLCB3aGlsZSBzYXZpbmcgcG9pbnRlcnMgdG8KISAgKiBlYWNoIGF0dHJp YnV0ZSdzIHN0YXJ0aW5nIHBvc2l0aW9uLgohICAqCiEgICogV2hlbiB0aGlzIHJvdXRpbmUg ZmluaXNoZXMgZXhlY3V0aW9uIGJvdGggdGhlIG51bGxzIGFycmF5IGFuZAohICAqIHRoZSBh dHRyX29mZnNldHMgYXJyYXkgYXJlIHVwZGF0ZWQuIFRoZSBhdHRyX29mZnNldHMgd2lsbCBp bmNsdWRlCiEgICogdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF0dHJp YnV0ZSBhcnJheSBvZiB3aGljaAohICAqIGVhY2ggYXR0cmlidXRlIGJlZ2lucy4gSWYgYSBz cGVjaWZpYyBhdHRyaWJ1dGUgaXMgbm90IHVzZWQgZm9yIHRoaXMKISAgKiBDT1BZIGNvbW1h bmQgKG9tbWl0dGVkIGZyb20gdGhlIGNvbHVtbiBsaXN0KSwgYSB2YWx1ZSBvZiAwIHdpbGwg YmUgYXNzaWduZWQuCiEgICogRm9yIGV4YW1wbGU6IGZvciB0YWJsZSBmb28oYSxiLGMsZCxl KSBhbmQgQ09QWSBmb28oYSxiLGUpCiEgICogYXR0cl9vZmZzZXRzIG1heSBsb29rIHNvbWV0 aGluZyBsaWtlIHRoaXMgYWZ0ZXIgdGhpcyByb3V0aW5lCiEgICogcmV0dXJuczogWzAsMjAs MCwwLDU1XS4gVGhhdCBtZWFucyB0aGF0IGNvbHVtbiAiYSIgdmFsdWUgc3RhcnRzCiEgICog YXQgYnl0ZSBvZmZzZXQgMCwgImIiIGluIDIwIGFuZCAiZSIgaW4gNTUsIGluIGF0dHJfYnVm LgohICAqCiEgICogSW4gdGhlIGF0dHJpYnV0ZSBidWZmZXIgKGF0dHJfYnVmKSBlYWNoIGF0 dHJpYnV0ZQohICAqIGlzIHRlcm1pbmF0ZWQgd2l0aCBhICdcMCcsIGFuZCB0aGVyZWZvcmUg YnkgdXNpbmcgdGhlIGF0dHJfb2Zmc2V0cwohICAqIGFycmF5IHdlIGNvdWxkIHBvaW50IHRv IGEgYmVnaW5uaW5nIG9mIGFuIGF0dHJpYnV0ZSBhbmQgaGF2ZSBpdAohICAqIGJlaGF2ZSBh cyBhIEMgc3RyaW5nLCBtdWNoIGxpa2UgcHJldmlvdXNseSBkb25lIGluIENPUFkuCiEgICoK ISAgKiBBbm90aGVyIGFzcGVjdCB0byBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgaXMgcmVkdWNp bmcgdGhlIGZyZXF1ZW5jeQohICAqIG9mIGRhdGEgbG9hZCBpbnRvIGJ1ZmZlcnMuIFRoZSBv cmlnaW5hbCBDT1BZIHJlYWQgYXR0cmlidXRlIGNvZGUKISAgKiBsb2FkZWQgYSBjaGFyYWN0 ZXIgYXQgYSB0aW1lLiBJbiBoZXJlIHdlIHRyeSB0byBsb2FkIGEgY2h1bmsgb2YgZGF0YQoh ICAqIGF0IGEgdGltZS4gVXN1YWxseSBhIGNodW5rIHdpbGwgaW5jbHVkZSBhIGZ1bGwgZGF0 YSByb3cKISAgKiAodW5sZXNzIHdlIGhhdmUgYW4gZXNjYXBlZCBkZWxpbSkuIFRoYXQgZWZm ZWN0aXZlbHkgcmVkdWNlcyB0aGUgbnVtYmVyIG9mCiEgICogbG9hZHMgYnkgYSBmYWN0b3Ig b2YgbnVtYmVyIG9mIGJ5dGVzIHBlciByb3cuIFRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2UK ISAgKiBncmVhdGx5LCB1bmZvcnR1bmF0ZWx5IGl0IGFkZCBtb3JlIGNvbXBsZXhpdHkgdG8g dGhlIGNvZGUuCiEgICoKISAgKiBHbG9iYWwgcGFydGljaXBhbnRzIGluIHBhcnNpbmcgbG9n aWM6CiEgICoKISAgKiBsaW5lX2J1Zi5jdXJzb3IgLS0gYW4gb2Zmc2V0IGZyb20gYmVnaW5u aW5nIG9mIHRoZSBsaW5lIGJ1ZmZlcgohICAqIHRoYXQgaW5kaWNhdGVzIHdoZXJlIHdlIGFy ZSBhYm91dCB0byBiZWdpbiB0aGUgbmV4dCBzY2FuLiBOb3RlIHRoYXQKISAgKiBpZiB3ZSBo YXZlIFdJVEggT0lEUyB0aGlzIGN1cnNvciBpcyBhbHJlYWR5IHNoaWZ0ZWQgcGFzdCB0aGUg Zmlyc3QKISAgKiBPSUQgYXR0cmlidXRlLgohICAqCiEgICogYXR0cl9idWYuY3Vyc29yIC0t IGFuIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCiEgICogYXR0cmlidXRlIGJ1 ZmZlciB0aGF0IGluZGljYXRlcyB3aGVyZSB0aGUgY3VycmVudCBhdHRyaWJ1dGUgYmVnaW5z LgohICAqLwohIHN0YXRpYyB2b2lkIAohIENvcHlSZWFkQXR0cmlidXRlc1RleHQoY29uc3Qg Y2hhciAqZGVsaW0sIGNvbnN0IGNoYXIgKmVzY2FwZSwgY29uc3QgY2hhciAqbnVsbF9wcmlu dCwKISAJCQkJCSAgIGludCBudWxsX3ByaW50X2xlbiwgY2hhciAqbnVsbHMsIExpc3QgKmF0 dG51bWxpc3QsIAohIAkJCQkJICAgaW50ICphdHRyX29mZnNldHMsIGludCBudW1fcGh5c19h dHRycywgRm9ybV9wZ19hdHRyaWJ1dGUgKmF0dHIpCiEgewohIAljaGFyCQlkZWxpbWMgPSBk ZWxpbVswXTsJCS8qIGRlbGltaXRlciBjaGFyYWN0ZXIgKi8KISAJY2hhciAgICAgICAgZXNj YXBlYyA9IGVzY2FwZVswXTsgICAgLyogZXNjYXBlIGNoYXJhY3RlciAgICAqLwohIAljaGFy CSAgICpzY2FuX3N0YXJ0OwkJLyogcG9pbnRlciB0byBsaW5lIGJ1ZmZlciBmb3Igc2NhbiBz dGFydC4gKi8KISAJY2hhcgkgICAqc2Nhbl9lbmQ7CQkvKiBwb2ludGVyIHRvIGxpbmUgYnVm ZmVyIHdoZXJlIGNoYXIgd2FzIGZvdW5kICovCiEgCWludAkJCWF0dHJfcHJlX2xlbjsJLyog YXR0ciByYXcgbGVuLCBiZWZvcmUgcHJvY2Vzc2luZyBlc2NhcGVzICovCiEgCWludAkJCWF0 dHJfcG9zdF9sZW47CS8qIGN1cnJlbnQgYXR0ciBsZW4gYWZ0ZXIgZXNjYXBpbmcgKi8KISAJ aW50CQkJbTsJCQkJLyogYXR0cmlidXRlIGluZGV4IGJlaW5nIHBhcnNlZCAqLwohIAlpbnQJ CQlieXRlc19yZW1haW5pbmc7LyogbnVtIGJ5dGVzIHJlbWFpbmluZyB0byBiZSBzY2FubmVk IGluIGxpbmUgYnVmICovCiEgCWludAkJCWNodW5rX3N0YXJ0OwkvKiBvZmZzZXQgdG8gYmVn aW5uaW5nIG9mIGxpbmUgY2h1bmsgdG8gbG9hZCAqLwohIAlpbnQJCQljaHVua19sZW47CQkv KiBsZW5ndGggb2YgY2h1bmsgb2YgZGF0YSB0byBsb2FkIHRvIGF0dHIgYnVmICovCiEgCWlu dAkJCW9jdF92YWw7CQkvKiBieXRlIHZhbHVlIGZvciBvY3RhbCBlc2NhcGVzICovCiEgCWlu dCAgICAgICAgIGhleF92YWw7ICAgICAgICAvKiBieXRlIHZhbHVlIGZvciBoZXhhZGVjaW1h bCBlc2NhcGVzICovCiEgCWNoYXIgICAgICAgIGhleGNoYXI7ICAgICAgICAvKiBjaGFyIHRo YXQgYXBwZWFycyBhZnRlciBceCBmb3IgaGV4IHZhbHVlcyAqLwohIAlpbnQJCQlhdHRudW07 CQkJLyogYXR0cmlidXRlIG51bWJlciBiZWluZyBwYXJzZWQgKi8KISAJTGlzdENlbGwgICAq Y3VyOwkJCS8qIGN1cnNvciB0byBhdHRyaWJ1dGUgbGlzdCB1c2VkIGZvciB0aGlzIENPUFkg Ki8KISAJaW50CQkJYXR0cmlidXRlOwohIAkJCiEgCQkvKgohIAkJICogaW5pdCB2YXJpYWJs ZXMgZm9yIGF0dHJpYnV0ZSBzY2FuCiEgCQkgKi8KISAJCWF0dHJfYnVmLmxlbiA9IDA7CiEg CQlhdHRyX2J1Zi5kYXRhWzBdID0gJ1wwJzsKISAJCWF0dHJfYnVmLmN1cnNvciA9IDA7CiEg CQkvKiBjdXJzb3IgaXMgbm93ID4gMCBpZiB3ZSBjb3B5IFdJVEggT0lEUyAqLwohIAkJc2Nh bl9zdGFydCA9IGxpbmVfYnVmLmRhdGEgKyBsaW5lX2J1Zi5jdXJzb3I7CiEgCQljdXIgPSBs aXN0X2hlYWQoYXR0bnVtbGlzdCk7CiEgCQlhdHRudW0gPSBsZmlyc3RfaW50KGN1cik7CiEg CQltID0gYXR0bnVtIC0gMTsKISAJCWNodW5rX3N0YXJ0ID0gbGluZV9idWYuY3Vyc29yOwoh IAkJY2h1bmtfbGVuID0gMDsKISAJCWF0dHJfcHJlX2xlbiA9IDA7CiEgCQlhdHRyX3Bvc3Rf bGVuID0gMDsKISAJCQohIAkJLyoKISAJCSAqIFNjYW4gdGhyb3VnaCB0aGUgbGluZSBidWZm ZXIgdG8gcmVhZCBhbGwgYXR0cmlidXRlcyBkYXRhCiEgCQkgKi8KISAJCXdoaWxlIChsaW5l X2J1Zi5jdXJzb3IgPCBsaW5lX2J1Zi5sZW4pCiEgCQl7CiEgCQkJYnl0ZXNfcmVtYWluaW5n ID0gbGluZV9idWYubGVuIC0gbGluZV9idWYuY3Vyc29yOwohIAkJCQohIAkJCWlmICgoc2Nh bl9lbmQgPSBzY2FuVGV4dEF0dHIoc2Nhbl9zdGFydCwgZGVsaW1jLCBlc2NhcGVjLCBieXRl c19yZW1haW5pbmcpKQohIAkJCQk9PSBOVUxMKQohIAkJCXsKISAJCQkJLyogR09UIFRPIEVO RCBPRiBMSU5FIEJVRkZFUiAqLwohIAkJCQkKISAJCQkJaWYgKGN1ciA9PSBOVUxMKQohIAkJ CQkJZXJlcG9ydChFUlJPUiwKISAJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9G SUxFX0ZPUk1BVCksCiEgCQkJCQkJCSBlcnJtc2coImV4dHJhIGRhdGEgYWZ0ZXIgbGFzdCBl eHBlY3RlZCBjb2x1bW4iKSkpOwohIAkJCQkKISAJCQkJYXR0bnVtID0gbGZpcnN0X2ludChj dXIpOwohIAkJCQltID0gYXR0bnVtIC0gMTsKISAJCQkJCiEgCQkJCS8qIGRvbid0IGNvdW50 IGVvbCBjaGFyKHMpIGluIGF0dHIgYW5kIGNodW5rIGxlbiBjYWxjdWxhdGlvbiAqLwohIAkJ CQlpZiAoZW9sX3R5cGUgPT0gRU9MX0NSTkwpCiEgCQkJCXsKISAJCQkJCWF0dHJfcHJlX2xl biArPSBieXRlc19yZW1haW5pbmcgLSAyOwohIAkJCQkJY2h1bmtfbGVuID0gbGluZV9idWYu bGVuIC0gY2h1bmtfc3RhcnQgLSAyOwohIAkJCQl9CiEgCQkJCWVsc2UKISAJCQkJewohIAkJ CQkJYXR0cl9wcmVfbGVuICs9IGJ5dGVzX3JlbWFpbmluZyAtIDE7CiEgCQkJCQljaHVua19s ZW4gPSBsaW5lX2J1Zi5sZW4gLSBjaHVua19zdGFydCAtIDE7CiEgCQkJCX0KISAJCQkJCiEg CQkJCS8qIGNoZWNrIGlmIHRoaXMgaXMgYSBOVUxMIHZhbHVlIG9yIGRhdGEgdmFsdWUgKGFz c3VtZWQgTlVMTCkgKi8KISAJCQkJaWYgKGF0dHJfcHJlX2xlbiA9PSBudWxsX3ByaW50X2xl bgohIAkJCQkJJiYKISAJCQkJCXN0cm5jbXAobGluZV9idWYuZGF0YSArIGxpbmVfYnVmLmxl biAtIGF0dHJfcHJlX2xlbiAtIDEsIG51bGxfcHJpbnQsIGF0dHJfcHJlX2xlbikKISAJCQkJ CT09IDApCiEgCQkJCQludWxsc1ttXSA9ICduJzsKISAJCQkJZWxzZQohIAkJCQkJbnVsbHNb bV0gPSAnICc7CiEgCQkJCQohIAkJCQlhdHRyX29mZnNldHNbbV0gPSBhdHRyX2J1Zi5jdXJz b3I7CiEgCQkJCQohIAkJCQkKISAJCQkJLyogbG9hZCB0aGUgbGFzdCBjaHVuaywgdGhlIHdo b2xlIGJ1ZmZlciBpbiBtb3N0IGNhc2VzICovCiEgCQkJCWFwcGVuZEJpbmFyeVN0cmluZ0lu Zm8oJmF0dHJfYnVmLCBsaW5lX2J1Zi5kYXRhICsgY2h1bmtfc3RhcnQsIGNodW5rX2xlbik7 CiEgCQkJCQohIAkJCQlsaW5lX2J1Zi5jdXJzb3IgKz0gYXR0cl9wcmVfbGVuICsgMjsJCS8q IHNraXAgZW9sIGNoYXIgYW5kCiEgCQkJCQkqICdcMCcgdG8gZXhpdCBsb29wICovCiEgCQkJ CQohIAkJCQlpZiAobG5leHQoY3VyKSAhPSBOVUxMKQohIAkJCQl7CiEgCQkJCQkvKgohIAkJ CQkJICogRm9yIGFuIGVtcHR5IGRhdGEgbGluZSwgdGhlIHByZXZpb3VzIENPUFkgY29kZSB3 aWxsCiEgCQkJCQkgKiBmYWlsIGl0IGR1cmluZyB0aGUgY29udmVyc2lvbiBzdGFnZS4gV2Ug Y2FuIGZhaWwgaXQgaGVyZQohIAkJCQkJICogYWxyZWFkeSwgYnV0IHRoZW4gd2Ugd2lsbCBm YWlsIHRoZSByZWdyZXNzaW9uIHRlc3RzIGIvYwohIAkJCQkJICogb2YgYSBkaWZmZXJlbnQg ZXJyb3IgbWVzc2FnZS4gdGhhdCdzIHdoeSB3ZSByZXR1cm4gc28gd2UKISAJCQkJCSAqIGNh biBnZXQgdGhlIHNhbWUgZXJyb3IgbWVzc2FnZSB0aGF0IHJlZ3Jlc3MgZXhwZWN0cy4gYWho Li4uCiEgCQkJCQkgKiB0aGlzIGNvbmRpdGlvbmFsIGlzIHVubmVjZXNzYXJ5IGFuZCBzaG91 bGQgYmUgcmVtb3ZlZCBzb29uLgohIAkJCQkJICovCiEgCQkJCQlpZiAobGluZV9idWYubGVu ID4gMSkKISAJCQkJCQllcmVwb3J0KEVSUk9SLAohIAkJCQkJCQkJKGVycmNvZGUoRVJSQ09E RV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkJCQkgZXJybXNnKCJtaXNzaW5nIGRh dGEgZm9yIGNvbHVtbiBcIiVzXCIiLAohIAkJCQkJCQkJCQlOYW1lU3RyKGF0dHJbbSArIDFd LT5hdHRuYW1lKSkpKTsKISAJCQkJCWVsc2UKISAJCQkJCQlyZXR1cm47CiEgCQkJCX0KISAJ CQl9CiEgCQkJZWxzZQohIAkJCQkvKiBGT1VORCBBIERFTElNSVRFUiBPUiBFU0NBUEUgKi8K ISAJCQl7CiEgCQkJCWlmIChjdXIgPT0gTlVMTCkKISAJCQkJCWVyZXBvcnQoRVJST1IsCiEg CQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAohIAkJCQkJ CQkgZXJybXNnKCJleHRyYSBkYXRhIGFmdGVyIGxhc3QgZXhwZWN0ZWQgY29sdW1uIikpKTsK ISAJCQkJCiEgCQkJCWlmICgqc2Nhbl9lbmQgPT0gZGVsaW1jKQkJLyogZm91bmQgYSBkZWxp bWl0ZXIgKi8KISAJCQkJewohIAkJCQkJYXR0bnVtID0gbGZpcnN0X2ludChjdXIpOwohIAkJ CQkJbSA9IGF0dG51bSAtIDE7CiEgCQkJCQkKISAJCQkJCS8qICh3ZSBkb24ndCBpbmNsdWRl IHRoZSBkZWxpbWl0ZXIgY2ggaW4gbGVuZ3RoKSAqLwohIAkJCQkJYXR0cl9wcmVfbGVuICs9 IHNjYW5fZW5kIC0gc2Nhbl9zdGFydDsKISAJCQkJCS8qICh3ZSBkb24ndCBpbmNsdWRlIHRo ZSBkZWxpbWl0ZXIgY2ggaW4gbGVuZ3RoKSAqLwohIAkJCQkJYXR0cl9wb3N0X2xlbiArPSBz Y2FuX2VuZCAtIHNjYW5fc3RhcnQ7CiEgCQkJCQkKISAJCQkJCS8qIGNoZWNrIGlmIHRoaXMg aXMgYSBudWxsIHByaW50IG9yIGRhdGEgKGFzc3VtZWQgTlVMTCkgKi8KISAJCQkJCWlmIChh dHRyX3ByZV9sZW4gPT0gbnVsbF9wcmludF9sZW4KISAJCQkJCQkmJgohIAkJCQkJCXN0cm5j bXAoc2Nhbl9lbmQgLSBhdHRyX3ByZV9sZW4sIG51bGxfcHJpbnQsIGF0dHJfcHJlX2xlbikK ISAJCQkJCQk9PSAwKQohIAkJCQkJCW51bGxzW21dID0gJ24nOwohIAkJCQkJZWxzZQohIAkJ CQkJCW51bGxzW21dID0gJyAnOwohIAkJCQkJCiEgCQkJCQkvKiBzZXQgdGhlIHBvaW50ZXIg dG8gbmV4dCBhdHRyaWJ1dGUgcG9zaXRpb24gKi8KISAJCQkJCWF0dHJfb2Zmc2V0c1ttXSA9 IGF0dHJfYnVmLmN1cnNvcjsKISAJCQkJCQohIAkJCQkJLyoKISAJCQkJCSAqIHVwZGF0ZSBi dWZmZXIgY3Vyc29ycyB0byBvdXIgY3VycmVudCBsb2NhdGlvbiwgKzEgdG8gc2tpcAohIAkJ CQkJICogdGhlIGRlbGltYwohIAkJCQkJICovCiEgCQkJCQlsaW5lX2J1Zi5jdXJzb3IgPSBz Y2FuX2VuZCAtIGxpbmVfYnVmLmRhdGEgKyAxOwohIAkJCQkJYXR0cl9idWYuY3Vyc29yICs9 IGF0dHJfcG9zdF9sZW4gKyAxOwohIAkJCQkJCiEgCQkJCQkvKiBwcmVwYXJlIHNjYW4gZm9y IG5leHQgYXR0ciAqLwohIAkJCQkJc2Nhbl9zdGFydCA9IGxpbmVfYnVmLmRhdGEgKyBsaW5l X2J1Zi5jdXJzb3I7CiEgCQkJCQljdXIgPSBsbmV4dChjdXIpOwohIAkJCQkJYXR0cl9wcmVf bGVuID0gMDsKISAJCQkJCWF0dHJfcG9zdF9sZW4gPSAwOwohIAkJCQl9CiEgCQkJCWVsc2UK ISAJCQkJCS8qIGZvdW5kIGFuIGVzY2FwZSBjaGFyYWN0ZXIgKi8KISAJCQkJewohIAkJCQkJ Y2hhcgkJbmV4dGMgPSAqKHNjYW5fZW5kICsgMSk7CiEgCQkJCQljaGFyCQluZXdjOwohIAkJ CQkJaW50CQkJc2tpcCA9IDI7CiEgCQkJCQkKISAJCQkJCWNodW5rX2xlbiA9IChzY2FuX2Vu ZCAtIGxpbmVfYnVmLmRhdGEpIC0gY2h1bmtfc3RhcnQgKyAxOwohIAkJCQkJCiEgCQkJCQkv KiBsb2FkIGEgY2h1bmsgb2YgZGF0YSAqLwohIAkJCQkJYXBwZW5kQmluYXJ5U3RyaW5nSW5m bygmYXR0cl9idWYsIGxpbmVfYnVmLmRhdGEgKyBjaHVua19zdGFydCwgY2h1bmtfbGVuKTsK ISAJCQkJCQohIAkJCQkJc3dpdGNoIChuZXh0YykKICAJCQl7CiAgCQkJCWNhc2UgJzAnOgog IAkJCQljYXNlICcxJzoKKioqKioqKioqKioqKioqCioqKiAyMzQ4LDI0NDUgKioqKgogIAkJ CQljYXNlICc1JzoKICAJCQkJY2FzZSAnNic6CiAgCQkJCWNhc2UgJzcnOgohIAkJCQkJLyog aGFuZGxlIFwwMTMgKi8KISAJCQkJCXsKISAJCQkJCQlpbnQJCQl2YWw7CiAgCiEgCQkJCQkJ dmFsID0gT0NUVkFMVUUoYyk7CiEgCQkJCQkJaWYgKGxpbmVfYnVmLmN1cnNvciA8IGxpbmVf YnVmLmxlbikKISAJCQkJCQl7CiEgCQkJCQkJCWMgPSBsaW5lX2J1Zi5kYXRhW2xpbmVfYnVm LmN1cnNvcl07CiEgCQkJCQkJCWlmIChJU09DVEFMKGMpKQohIAkJCQkJCQl7CiEgCQkJCQkJ CQlsaW5lX2J1Zi5jdXJzb3IrKzsKISAJCQkJCQkJCXZhbCA9ICh2YWwgPDwgMykgKyBPQ1RW QUxVRShjKTsKISAJCQkJCQkJCWlmIChsaW5lX2J1Zi5jdXJzb3IgPCBsaW5lX2J1Zi5sZW4p CiAgCQkJCQkJCQl7CiEgCQkJCQkJCQkJYyA9IGxpbmVfYnVmLmRhdGFbbGluZV9idWYuY3Vy c29yXTsKISAJCQkJCQkJCQlpZiAoSVNPQ1RBTChjKSkKICAJCQkJCQkJCQl7CiEgCQkJCQkJ CQkJCWxpbmVfYnVmLmN1cnNvcisrOwohIAkJCQkJCQkJCQl2YWwgPSAodmFsIDw8IDMpICsg T0NUVkFMVUUoYyk7CiAgCQkJCQkJCQkJfQogIAkJCQkJCQkJfQohIAkJCQkJCQl9CiEgCQkJ CQkJfQohIAkJCQkJCWMgPSB2YWwgJiAwMzc3OwohIAkJCQkJfQogIAkJCQkJYnJlYWs7CiAg CQkJCWNhc2UgJ3gnOgogIAkJCQkJLyogSGFuZGxlIFx4M0YgKi8KISAJCQkJCWlmIChsaW5l X2J1Zi5jdXJzb3IgPCBsaW5lX2J1Zi5sZW4pCiEgCQkJCQl7CiEgCQkJCQkJY2hhciBoZXhj aGFyID0gbGluZV9idWYuZGF0YVtsaW5lX2J1Zi5jdXJzb3JdOwogIAogIAkJCQkJCWlmIChp c3hkaWdpdChoZXhjaGFyKSkKICAJCQkJCQl7CiEgCQkJCQkJCWludCB2YWwgPSBHZXREZWNp bWFsRnJvbUhleChoZXhjaGFyKTsKICAKISAJCQkJCQkJbGluZV9idWYuY3Vyc29yKys7CiEg CQkJCQkJCWlmIChsaW5lX2J1Zi5jdXJzb3IgPCBsaW5lX2J1Zi5sZW4pCiEgCQkJCQkJCXsK ISAJCQkJCQkJCWhleGNoYXIgPSBsaW5lX2J1Zi5kYXRhW2xpbmVfYnVmLmN1cnNvcl07CiAg CQkJCQkJCQlpZiAoaXN4ZGlnaXQoaGV4Y2hhcikpCiAgCQkJCQkJCQl7CiEgCQkJCQkJCQkJ bGluZV9idWYuY3Vyc29yKys7CiEgCQkJCQkJCQkJdmFsID0gKHZhbCA8PCA0KSArIEdldERl Y2ltYWxGcm9tSGV4KGhleGNoYXIpOwohIAkJCQkJCQkJfQohIAkJCQkJCQl9CiEgCQkJCQkJ CWMgPSB2YWwgJiAweGZmOwogIAkJCQkJCX0KICAJCQkJCX0KICAJCQkJCWJyZWFrOwogIAkJ CQljYXNlICdiJzoKISAJCQkJCWMgPSAnXGInOwogIAkJCQkJYnJlYWs7CiAgCQkJCWNhc2Ug J2YnOgohIAkJCQkJYyA9ICdcZic7CiAgCQkJCQlicmVhazsKICAJCQkJY2FzZSAnbic6CiEg CQkJCQljID0gJ1xuJzsKICAJCQkJCWJyZWFrOwogIAkJCQljYXNlICdyJzoKISAJCQkJCWMg PSAnXHInOwogIAkJCQkJYnJlYWs7CiAgCQkJCWNhc2UgJ3QnOgohIAkJCQkJYyA9ICdcdCc7 CiAgCQkJCQlicmVhazsKICAJCQkJY2FzZSAndic6CiEgCQkJCQljID0gJ1x2JzsKICAJCQkJ CWJyZWFrOwogIAogIAkJCQkJLyoKISAJCQkJCSAqIGluIGFsbCBvdGhlciBjYXNlcywgdGFr ZSB0aGUgY2hhciBhZnRlciAnXCcKISAJCQkJCSAqIGxpdGVyYWxseQogIAkJCQkJICovCiAg CQkJfQohIAkJfQohIAkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybygmYXR0cmlidXRlX2J1 ZiwgYyk7CiAgCX0KICAKISAJLyogY2hlY2sgd2hldGhlciByYXcgaW5wdXQgbWF0Y2hlZCBu dWxsIG1hcmtlciAqLwohIAlpbnB1dF9sZW4gPSBlbmRfY3Vyc29yIC0gc3RhcnRfY3Vyc29y OwohIAlpZiAoaW5wdXRfbGVuID09IHN0cmxlbihudWxsX3ByaW50KSAmJgohIAkJc3RybmNt cCgmbGluZV9idWYuZGF0YVtzdGFydF9jdXJzb3JdLCBudWxsX3ByaW50LCBpbnB1dF9sZW4p ID09IDApCiAgCQkqaXNudWxsID0gdHJ1ZTsKISAJZWxzZQohIAkJKmlzbnVsbCA9IGZhbHNl OwogIAohIAlyZXR1cm4gYXR0cmlidXRlX2J1Zi5kYXRhOwohIH0KICAKICAKICAvKgohICAq IFJlYWQgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIGF0dHJpYnV0ZSBpbiBDU1YgbW9kZSwKICAg KiBwZXJmb3JtaW5nIGRlLWVzY2FwaW5nIGFzIG5lZWRlZC4gRXNjYXBpbmcgZG9lcyBub3Qg Zm9sbG93IHRoZSBub3JtYWwKICAgKiBQb3N0Z3JlU1FMIHRleHQgbW9kZSwgYnV0IGluc3Rl YWQgInN0YW5kYXJkIiAoaS5lLiBjb21tb24pIENTViB1c2FnZS4KICAgKgotLS0gMjc3Mywy OTQ0IC0tLS0KICAJCQkJY2FzZSAnNSc6CiAgCQkJCWNhc2UgJzYnOgogIAkJCQljYXNlICc3 JzoKISAJCQkJCQkJb2N0X3ZhbCA9IE9DVFZBTFVFKG5leHRjKTsKISAJCQkJCQkJbmV4dGMg PSAqKHNjYW5fZW5kICsgMik7CiAgCiEgCQkJCQkJCS8qCiEgCQkJCQkJCSAqIChubyBuZWVk IGZvciBvdXQgYmFkIGFjY2VzcyBjaGVjayBzaW5jZSBsaW5lIGlmCiEgCQkJCQkJCQkqIGJ1 ZmZlcmVkKQohIAkJCQkJCQkgKi8KISAJCQkJCQkJaWYgKElTT0NUQUwobmV4dGMpKQogIAkJ CQkJCQkJewohIAkJCQkJCQkJc2tpcCsrOwohIAkJCQkJCQkJb2N0X3ZhbCA9IChvY3RfdmFs IDw8IDMpICsgT0NUVkFMVUUobmV4dGMpOwohIAkJCQkJCQkJbmV4dGMgPSAqKHNjYW5fZW5k ICsgMyk7CiEgCQkJCQkJCQlpZiAoSVNPQ1RBTChuZXh0YykpCiAgCQkJCQkJCQkJewohIAkJ CQkJCQkJCXNraXArKzsKISAJCQkJCQkJCQlvY3RfdmFsID0gKG9jdF92YWwgPDwgMykgKyBP Q1RWQUxVRShuZXh0Yyk7CiAgCQkJCQkJCQkJfQogIAkJCQkJCQkJfQohIAkJCQkJCQkJbmV3 YyA9IG9jdF92YWwgJiAwMzc3OwkvKiB0aGUgZXNjYXBlZCBieXRlIHZhbHVlICovCiAgCQkJ CQlicmVhazsKICAJCQkJY2FzZSAneCc6CiAgCQkJCQkvKiBIYW5kbGUgXHgzRiAqLwohIAkJ CQkJCQloZXhjaGFyID0gKihzY2FuX2VuZCArIDIpOwogIAogIAkJCQkJCWlmIChpc3hkaWdp dChoZXhjaGFyKSkKICAJCQkJCQl7CiEgCQkJCQkJCQlza2lwKys7CiEgCQkJCQkJCQloZXhf dmFsID0gR2V0RGVjaW1hbEZyb21IZXgoaGV4Y2hhcik7CiAgCiEgCQkJCQkJCQloZXhjaGFy ID0gKihzY2FuX2VuZCArIDMpOwogIAkJCQkJCQkJaWYgKGlzeGRpZ2l0KGhleGNoYXIpKQog IAkJCQkJCQkJewohIAkJCQkJCQkJCXNraXArKzsKISAJCQkJCQkJCQloZXhfdmFsID0gKGhl eF92YWwgPDwgNCkgKyBHZXREZWNpbWFsRnJvbUhleChoZXhjaGFyKTsKICAJCQkJCQl9Cisg CQkJCQkJCQluZXdjID0gaGV4X3ZhbCAmIDB4ZmY7CiAgCQkJCQl9CisgCQkJCQkJCQllbHNl IC8qICJceCIgd2l0aCBubyBoZXggdmFsdWUgKi8KKyAJCQkJCQkJCQluZXdjID0gbmV4dGM7 CiAgCQkJCQlicmVhazsKICAJCQkJY2FzZSAnYic6CiEgCQkJCQkJCW5ld2MgPSAnXGInOwog IAkJCQkJYnJlYWs7CiAgCQkJCWNhc2UgJ2YnOgohIAkJCQkJCQluZXdjID0gJ1xmJzsKICAJ CQkJCWJyZWFrOwogIAkJCQljYXNlICduJzoKISAJCQkJCQkJbmV3YyA9ICdcbic7CiAgCQkJ CQlicmVhazsKICAJCQkJY2FzZSAncic6CiEgCQkJCQkJCW5ld2MgPSAnXHInOwogIAkJCQkJ YnJlYWs7CiAgCQkJCWNhc2UgJ3QnOgohIAkJCQkJCQluZXdjID0gJ1x0JzsKICAJCQkJCWJy ZWFrOwogIAkJCQljYXNlICd2JzoKISAJCQkJCQkJbmV3YyA9ICdcdic7CiEgCQkJCQkJCWJy ZWFrOwohIAkJCQkJCWRlZmF1bHQ6CiEgCQkJCQkJCWlmIChuZXh0YyA9PSBkZWxpbWMpCiEg CQkJCQkJCQluZXdjID0gZGVsaW1jOwohIAkJCQkJCQllbHNlIGlmIChuZXh0YyA9PSBlc2Nh cGVjKQohIAkJCQkJCQkJbmV3YyA9IGVzY2FwZWM7CiEgCQkJCQkJCWVsc2UKISAJCQkJCQkJ CS8qIG5vIGVzY2FwZSBzZXF1ZW5jZSwgdGFrZSBuZXh0IGNoYXIgbGl0ZXJhbHkgKi8KISAJ CQkJCQkJCW5ld2MgPSBuZXh0YzsKICAJCQkJCWJyZWFrOworIAkJCQkJfQorIAkJCQkJCisg CQkJCQkvKiB1cGRhdGUgdG8gY3VycmVudCBsZW5ndGgsIGFkZCBlc2NhcGUgYW5kIGVzY2Fw ZWQgY2hhcnMgICovCisgCQkJCQlhdHRyX3ByZV9sZW4gKz0gc2Nhbl9lbmQgLSBzY2FuX3N0 YXJ0ICsgMjsKKyAJCQkJCS8qIHVwZGF0ZSB0byBjdXJyZW50IGxlbmd0aCwgZXNjYXBlZCBj aGFyICovCisgCQkJCQlhdHRyX3Bvc3RfbGVuICs9IHNjYW5fZW5kIC0gc2Nhbl9zdGFydCAr IDE7CiAgCiAgCQkJCQkvKgohIAkJCQkJICogTmVlZCB0byBnZXQgcmlkIG9mIHRoZSBlc2Nh cGUgY2hhcmFjdGVyLiBUaGlzIGlzIGRvbmUgYnkKISAJCQkJCSAqIGxvYWRpbmcgdGhlIGNo dW5rIHVwIHRvIGluY2x1ZGluZyB0aGUgZXNjYXBlIGNoYXJhY3RlcgohIAkJCQkJICogaW50 byB0aGUgYXR0cmlidXRlIGJ1ZmZlci4gVGhlbiBvdmVyd3JpdHRpbmcgdGhlIGJhY2tzbGFz aAohIAkJCQkJICogd2l0aCB0aGUgZXNjYXBlZCBzZXF1ZW5jZSBvciBjaGFyLCBhbmQgY29u dGludWluZyB0byBzY2FuCiEgCQkJCQkgKiBmcm9tICphZnRlciogdGhlIGNoYXIgdGhhbiBp cyBhZnRlciB0aGUgZXNjYXBlIGluIGxpbmUgYnVmLgogIAkJCQkJICovCisgCQkJCQkqKGF0 dHJfYnVmLmRhdGEgKyBhdHRyX2J1Zi5sZW4gLSAxKSA9IG5ld2M7CisgCQkJCQlsaW5lX2J1 Zi5jdXJzb3IgPSBzY2FuX2VuZCAtIGxpbmVfYnVmLmRhdGEgKyBza2lwOworIAkJCQkJc2Nh bl9zdGFydCA9IHNjYW5fZW5kICsgc2tpcDsKKyAJCQkJCWNodW5rX3N0YXJ0ID0gbGluZV9i dWYuY3Vyc29yOworIAkJCQkJY2h1bmtfbGVuID0gMDsKICAJCQl9CiEgCQkJCQohIAkJCX0J CQkJCQkvKiBlbmQgZGVsaW1pdGVyL2JhY2tzbGFzaCAqLwohIAohIAkJfQkJCQkJCQkvKiBl bmQgbGluZSBidWZmZXIgc2Nhbi4gKi8KISAKISAJLyoKISAJICogUmVwbGFjZSBhbGwgZGVs aW1pdGVycyB3aXRoIE5VTEwgZm9yIHN0cmluZyB0ZXJtaW5hdGlvbi4KISAJICogTk9URTog b25seSBkZWxpbWl0ZXJzIChOT1QgbmVjZXNzYXJpbHkgYWxsIGRlbGltYykgYXJlIHJlcGxh Y2VkLgohIAkgKiBFeGFtcGxlIChkZWxpbWMgPSAnfCcpOgohIAkgKiAtIEJlZm9yZTogIGYg IDEJfCAgZiAgXHwgIDIgIHwJZiAgMwohIAkgKiAtIEFmdGVyIDogIGYgIDEgXDAgIGYgICB8 ICAyIFwwCWYgIDMKISAJICovCiEgCWZvciAoYXR0cmlidXRlID0gMTsgYXR0cmlidXRlIDwg bnVtX3BoeXNfYXR0cnM7IGF0dHJpYnV0ZSsrKQohIAl7CiEgCQlpZiAoYXR0cl9vZmZzZXRz W2F0dHJpYnV0ZV0gIT0gMCkKISAJCQkqKGF0dHJfYnVmLmRhdGEgKyBhdHRyX29mZnNldHNb YXR0cmlidXRlXSAtIDEpID0gJ1wwJzsKICAJfQogIAohIH0KISAKISAKISAvKgohICAqIFJl YWQgYSBiaW5hcnkgYXR0cmlidXRlCiEgICovCiEgc3RhdGljIERhdHVtCiEgQ29weVJlYWRC aW5hcnlBdHRyaWJ1dGUoaW50IGNvbHVtbl9ubywgRm1nckluZm8gKmZsaW5mbywgT2lkIHR5 cGlvcGFyYW0sCiEgCQkJCQkJYm9vbCAqaXNudWxsKQohIHsKISAJaW50MzIJCWZsZF9zaXpl OwohIAlEYXR1bQkJcmVzdWx0OwohIAkKISAJZmxkX3NpemUgPSBDb3B5R2V0SW50MzIoKTsK ISAJaWYgKENvcHlHZXRFb2YoKSkKISAJCWVyZXBvcnQoRVJST1IsCiEgCQkJCShlcnJjb2Rl KEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAohIAkJCQkgZXJybXNnKCJ1bmV4cGVj dGVkIEVPRiBpbiBDT1BZIGRhdGEiKSkpOwohIAlpZiAoZmxkX3NpemUgPT0gLTEpCiEgCXsK ICAJCSppc251bGwgPSB0cnVlOwohIAkJcmV0dXJuIChEYXR1bSkgMDsKISAJfQohIAlpZiAo ZmxkX3NpemUgPCAwKQohIAkJZXJlcG9ydChFUlJPUiwKISAJCQkJKGVycmNvZGUoRVJSQ09E RV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCSBlcnJtc2coImludmFsaWQgZmllbGQg c2l6ZSIpKSk7CiAgCiEgCS8qIHJlc2V0IGF0dHJfYnVmIHRvIGVtcHR5LCBhbmQgbG9hZCBy YXcgZGF0YSBpbiBpdCAqLwohIAlhdHRyX2J1Zi5sZW4gPSAwOwohIAlhdHRyX2J1Zi5kYXRh WzBdID0gJ1wwJzsKISAJYXR0cl9idWYuY3Vyc29yID0gMDsKISAJCiEgCWVubGFyZ2VTdHJp bmdJbmZvKCZhdHRyX2J1ZiwgZmxkX3NpemUpOwohIAkKISAJQ29weUdldERhdGEoYXR0cl9i dWYuZGF0YSwgZmxkX3NpemUpOwohIAlpZiAoQ29weUdldEVvZigpKQohIAkJZXJlcG9ydChF UlJPUiwKISAJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEg CQkJCSBlcnJtc2coInVuZXhwZWN0ZWQgRU9GIGluIENPUFkgZGF0YSIpKSk7CiAgCisgCWF0 dHJfYnVmLmxlbiA9IGZsZF9zaXplOworIAlhdHRyX2J1Zi5kYXRhW2ZsZF9zaXplXSA9ICdc MCc7CisgCQorIAkvKiBDYWxsIHRoZSBjb2x1bW4gdHlwZSdzIGJpbmFyeSBpbnB1dCBjb252 ZXJ0ZXIgKi8KKyAJcmVzdWx0ID0gRnVuY3Rpb25DYWxsMihmbGluZm8sCisgCQkJCQkJICAg UG9pbnRlckdldERhdHVtKCZhdHRyX2J1ZiksCisgCQkJCQkJICAgT2JqZWN0SWRHZXREYXR1 bSh0eXBpb3BhcmFtKSk7CisgCQorIAkvKiBUcm91YmxlIGlmIGl0IGRpZG4ndCBlYXQgdGhl IHdob2xlIGJ1ZmZlciAqLworIAlpZiAoYXR0cl9idWYuY3Vyc29yICE9IGF0dHJfYnVmLmxl bikKKyAJCWVyZXBvcnQoRVJST1IsCisgCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9C SU5BUllfUkVQUkVTRU5UQVRJT04pLAorIAkJCQkgZXJybXNnKCJpbmNvcnJlY3QgYmluYXJ5 IGRhdGEgZm9ybWF0IikpKTsKKyAJCisgCSppc251bGwgPSBmYWxzZTsKKyAJcmV0dXJuIHJl c3VsdDsKKyB9CiAgCiAgLyoKISAgKiBSZWFkIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUg ZGF0YSBsaW5lIGluIENTViBtb2RlLAogICAqIHBlcmZvcm1pbmcgZGUtZXNjYXBpbmcgYXMg bmVlZGVkLiBFc2NhcGluZyBkb2VzIG5vdCBmb2xsb3cgdGhlIG5vcm1hbAogICAqIFBvc3Rn cmVTUUwgdGV4dCBtb2RlLCBidXQgaW5zdGVhZCAic3RhbmRhcmQiIChpLmUuIGNvbW1vbikg Q1NWIHVzYWdlLgogICAqCioqKioqKioqKioqKioqKgoqKiogMjQ0OCwyNDcyICoqKioKICAg KgogICAqIG51bGxfcHJpbnQgaXMgdGhlIG51bGwgbWFya2VyIHN0cmluZy4gIE5vdGUgdGhh dCB0aGlzIGlzIGNvbXBhcmVkIHRvCiAgICogdGhlIHByZS1kZS1lc2NhcGVkIGlucHV0IHN0 cmluZyAodGh1cyBpZiBpdCBpcyBxdW90ZWQgaXQgaXMgbm90IGEgTlVMTCkuCi0gICoKLSAg KiAqcmVzdWx0IGlzIHNldCB0byBpbmRpY2F0ZSB3aGF0IHRlcm1pbmF0ZWQgdGhlIHJlYWQ6 Ci0gICoJCU5PUk1BTF9BVFRSOgljb2x1bW4gZGVsaW1pdGVyCi0gICoJCUVORF9PRl9MSU5F OgllbmQgb2YgbGluZQotICAqCQlVTlRFUk1JTkFURURfRklFTEQgbm8gcXVvdGUgZGV0ZWN0 ZWQgYXQgZW5kIG9mIGEgcXVvdGVkIGZpZWxkCi0gICoKLSAgKiBJbiBhbnkgY2FzZSwgdGhl IHN0cmluZyByZWFkIHVwIHRvIHRoZSB0ZXJtaW5hdG9yIChvciBlbmQgb2YgZmlsZSkKLSAg KiBpcyByZXR1cm5lZC4KLSAgKgotICAqICppc251bGwgaXMgc2V0IHRydWUgb3IgZmFsc2Ug ZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGlucHV0IG1hdGNoZWQKLSAgKiB0aGUgbnVsbCBt YXJrZXIuICBOb3RlIHRoYXQgdGhlIGNhbGxlciBjYW5ub3QgY2hlY2sgdGhpcyBzaW5jZSB0 aGUKLSAgKiByZXR1cm5lZCBzdHJpbmcgd2lsbCBiZSB0aGUgcG9zdC1kZS1lc2NhcGluZyBl cXVpdmFsZW50LCB3aGljaCBtYXkKLSAgKiBsb29rIHRoZSBzYW1lIGFzIHNvbWUgdmFsaWQg ZGF0YSBzdHJpbmcuCiAgICotLS0tLS0tLS0tCiAgICovCiEgCiEgc3RhdGljIGNoYXIgKgoh IENvcHlSZWFkQXR0cmlidXRlQ1NWKGNvbnN0IGNoYXIgKmRlbGltLCBjb25zdCBjaGFyICpu dWxsX3ByaW50LCBjaGFyICpxdW90ZSwKISAJCQkJCSBjaGFyICplc2NhcGUsIENvcHlSZWFk UmVzdWx0ICpyZXN1bHQsIGJvb2wgKmlzbnVsbCkKICB7CiAgCWNoYXIJCWRlbGltYyA9IGRl bGltWzBdOwogIAljaGFyCQlxdW90ZWMgPSBxdW90ZVswXTsKLS0tIDI5NDcsMjk1OCAtLS0t CiAgICoKICAgKiBudWxsX3ByaW50IGlzIHRoZSBudWxsIG1hcmtlciBzdHJpbmcuICBOb3Rl IHRoYXQgdGhpcyBpcyBjb21wYXJlZCB0bwogICAqIHRoZSBwcmUtZGUtZXNjYXBlZCBpbnB1 dCBzdHJpbmcgKHRodXMgaWYgaXQgaXMgcXVvdGVkIGl0IGlzIG5vdCBhIE5VTEwpLgogICAq LS0tLS0tLS0tLQogICAqLwohIHN0YXRpYyB2b2lkCiEgQ29weVJlYWRBdHRyaWJ1dGVzQ1NW KGNvbnN0IGNoYXIgKmRlbGltLCBjb25zdCBjaGFyICpudWxsX3ByaW50LCBjaGFyICpxdW90 ZSwKISAJCQkJCSAgY2hhciAqZXNjYXBlLCBpbnQgbnVsbF9wcmludF9sZW4sIGNoYXIgKm51 bGxzLCBMaXN0ICphdHRudW1saXN0LCAKISAJCQkJCSAgaW50ICphdHRyX29mZnNldHMsIGlu dCBudW1fcGh5c19hdHRycywgRm9ybV9wZ19hdHRyaWJ1dGUgKmF0dHIpCiAgewogIAljaGFy CQlkZWxpbWMgPSBkZWxpbVswXTsKICAJY2hhcgkJcXVvdGVjID0gcXVvdGVbMF07CioqKioq KioqKioqKioqKgoqKiogMjQ3NywyNTAyICoqKioKICAJaW50CQkJaW5wdXRfbGVuOwogIAli b29sCQlpbl9xdW90ZSA9IGZhbHNlOwogIAlib29sCQlzYXdfcXVvdGUgPSBmYWxzZTsKICAK ISAJLyogcmVzZXQgYXR0cmlidXRlX2J1ZiB0byBlbXB0eSAqLwohIAlhdHRyaWJ1dGVfYnVm LmxlbiA9IDA7CiEgCWF0dHJpYnV0ZV9idWYuZGF0YVswXSA9ICdcMCc7CiAgCi0gCS8qIHNl dCBkZWZhdWx0IHN0YXR1cyAqLwotIAkqcmVzdWx0ID0gRU5EX09GX0xJTkU7CiAgCiAgCWZv ciAoOzspCiAgCXsKICAJCWVuZF9jdXJzb3IgPSBsaW5lX2J1Zi5jdXJzb3I7CiAgCQlpZiAo bGluZV9idWYuY3Vyc29yID49IGxpbmVfYnVmLmxlbikKICAJCQlicmVhazsKICAJCWMgPSBs aW5lX2J1Zi5kYXRhW2xpbmVfYnVmLmN1cnNvcisrXTsKICAKICAJCS8qIHVucXVvdGVkIGZp ZWxkIGRlbGltaXRlciAgKi8KICAJCWlmICghaW5fcXVvdGUgJiYgYyA9PSBkZWxpbWMpCiAg CQl7CiEgCQkJKnJlc3VsdCA9IE5PUk1BTF9BVFRSOwohIAkJCWJyZWFrOwogIAkJfQogIAog IAkJLyogc3RhcnQgb2YgcXVvdGVkIGZpZWxkIChvciBwYXJ0IG9mIGZpZWxkKSAqLwotLS0g Mjk2MywzMDQzIC0tLS0KICAJaW50CQkJaW5wdXRfbGVuOwogIAlib29sCQlpbl9xdW90ZSA9 IGZhbHNlOwogIAlib29sCQlzYXdfcXVvdGUgPSBmYWxzZTsKKyAJaW50CQkJYXR0bnVtOwkJ CS8qIGF0dHJpYnV0ZSBudW1iZXIgYmVpbmcgcGFyc2VkICovCisgCWludAkJCW07CQkJCS8q IGF0dHJpYnV0ZSBpbmRleCBiZWluZyBwYXJzZWQgKi8KKyAJTGlzdENlbGwgICAqY3VyOwkJ CS8qIGN1cnNvciB0byBhdHRyaWJ1dGUgbGlzdCB1c2VkIGZvciB0aGlzIENPUFkgKi8KICAK ISAJLyoKISAJICogaW5pdCB2YXJpYWJsZXMgZm9yIGF0dHJpYnV0ZSBzY2FuCiEgCSAqLwoh IAlhdHRyX2J1Zi5sZW4gPSAwOwohIAlhdHRyX2J1Zi5kYXRhWzBdID0gJ1wwJzsKISAJYXR0 cl9idWYuY3Vyc29yID0gMDsKISAJCiEgCWN1ciA9IGxpc3RfaGVhZChhdHRudW1saXN0KTsK ISAJYXR0bnVtID0gbGZpcnN0X2ludChjdXIpOwohIAltID0gYXR0bnVtIC0gMTsKISAJaW5w dXRfbGVuID0gMDsKICAKICAKICAJZm9yICg7OykKICAJewogIAkJZW5kX2N1cnNvciA9IGxp bmVfYnVmLmN1cnNvcjsKKyAJCQorIAkJLyogZmluaXNoZWQgcHJvY2Vzc2luZyBhdHRyaWJ1 dGVzIGluIGxpbmUgKi8KICAJCWlmIChsaW5lX2J1Zi5jdXJzb3IgPj0gbGluZV9idWYubGVu KQorIAkJeworIAkJCS8qIGNoZWNrIHdoZXRoZXIgcmF3IGlucHV0IG1hdGNoZWQgbnVsbCBt YXJrZXIgKi8KKyAJCQlpbnB1dF9sZW4gPSBlbmRfY3Vyc29yIC0gc3RhcnRfY3Vyc29yOwor IAkJCWlmICghc2F3X3F1b3RlICYmIGlucHV0X2xlbiA9PSBudWxsX3ByaW50X2xlbiAmJgor IAkJCQlzdHJuY21wKCZsaW5lX2J1Zi5kYXRhW3N0YXJ0X2N1cnNvcl0sIG51bGxfcHJpbnQs IGlucHV0X2xlbikgPT0gMCkKKyAJCQkJbnVsbHNbbV0gPSAnbic7CisgCQkJZWxzZQorIAkJ CQludWxsc1ttXSA9ICcgJzsKKyAJCQkKKyAJCQlpZiAoaW5fcXVvdGUpCisgCQkJCWVyZXBv cnQoRVJST1IsCisgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1B VCksCisgCQkJCQkJIGVycm1zZygidW50ZXJtaW5hdGVkIENTViBxdW90ZWQgZmllbGQiKSkp OworIAkJCQorIAkJCWlmIChsbmV4dChjdXIpICE9IE5VTEwpCisgCQkJCWVyZXBvcnQoRVJS T1IsCisgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCisg CQkJCQkJIGVycm1zZygibWlzc2luZyBkYXRhIGZvciBjb2x1bW4gXCIlc1wiIiwKKyAJCQkJ CQkJCU5hbWVTdHIoYXR0clttICsgMV0tPmF0dG5hbWUpKSkpOwogIAkJCWJyZWFrOworIAkJ fQorIAkJCiAgCQljID0gbGluZV9idWYuZGF0YVtsaW5lX2J1Zi5jdXJzb3IrK107CiAgCiAg CQkvKiB1bnF1b3RlZCBmaWVsZCBkZWxpbWl0ZXIgICovCiAgCQlpZiAoIWluX3F1b3RlICYm IGMgPT0gZGVsaW1jKQogIAkJewohIAkJCS8qIGNoZWNrIHdoZXRoZXIgcmF3IGlucHV0IG1h dGNoZWQgbnVsbCBtYXJrZXIgKi8KISAJCQlpbnB1dF9sZW4gPSBlbmRfY3Vyc29yIC0gc3Rh cnRfY3Vyc29yOwohIAkJCWlmICghc2F3X3F1b3RlICYmIGlucHV0X2xlbiA9PSBudWxsX3By aW50X2xlbiAmJgohIAkJCQlzdHJuY21wKCZsaW5lX2J1Zi5kYXRhW3N0YXJ0X2N1cnNvcl0s IG51bGxfcHJpbnQsIGlucHV0X2xlbikgPT0gMCkKISAJCQkJbnVsbHNbbV0gPSAnbic7CiEg CQkJZWxzZQohIAkJCQludWxsc1ttXSA9ICcgJzsKISAgICAgICAgICAgICAKISAJCQkvKiB0 ZXJtaW5hdGUgYXR0ciBzdHJpbmcgd2l0aCAnXDAnICovCiEgCQkJYXBwZW5kU3RyaW5nSW5m b0NoYXJNYWNybygmYXR0cl9idWYsICdcMCcpOwohIAkJCWF0dHJfYnVmLmN1cnNvcisrOwoh IAkJCQohIAkJCS8qIHNldHVwIG5leHQgYXR0cmlidXRlIHNjYW4gKi8KISAJCQljdXIgPSBs bmV4dChjdXIpOwohIAkJCQohIAkJCWlmIChjdXIgPT0gTlVMTCkKISAJCQkJZXJlcG9ydChF UlJPUiwKISAJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwK ISAJCQkJCQkgZXJybXNnKCJleHRyYSBkYXRhIGFmdGVyIGxhc3QgZXhwZWN0ZWQgY29sdW1u IikpKTsKISAJCQkKISAJCQlhdHRudW0gPSBsZmlyc3RfaW50KGN1cik7CiEgCQkJbSA9IGF0 dG51bSAtIDE7CiEgCQkJYXR0cl9vZmZzZXRzW21dID0gYXR0cl9idWYuY3Vyc29yOwohIAkJ CXN0YXJ0X2N1cnNvciA9IGxpbmVfYnVmLmN1cnNvcjsKISAJCQljb250aW51ZTsKICAJCX0K ICAKICAJCS8qIHN0YXJ0IG9mIHF1b3RlZCBmaWVsZCAob3IgcGFydCBvZiBmaWVsZCkgKi8K KioqKioqKioqKioqKioqCioqKiAyNTIwLDI1MjcgKioqKgogIAogIAkJCQlpZiAobmV4dGMg PT0gZXNjYXBlYyB8fCBuZXh0YyA9PSBxdW90ZWMpCiAgCQkJCXsKISAJCQkJCWFwcGVuZFN0 cmluZ0luZm9DaGFyTWFjcm8oJmF0dHJpYnV0ZV9idWYsIG5leHRjKTsKICAJCQkJCWxpbmVf YnVmLmN1cnNvcisrOwogIAkJCQkJY29udGludWU7CiAgCQkJCX0KICAJCQl9Ci0tLSAzMDYx LDMwNjkgLS0tLQogIAogIAkJCQlpZiAobmV4dGMgPT0gZXNjYXBlYyB8fCBuZXh0YyA9PSBx dW90ZWMpCiAgCQkJCXsKISAJCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyTWFjcm8oJmF0dHJf YnVmLCBuZXh0Yyk7CiAgCQkJCQlsaW5lX2J1Zi5jdXJzb3IrKzsKKyAJCQkJCWF0dHJfYnVm LmN1cnNvcisrOwogIAkJCQkJY29udGludWU7CiAgCQkJCX0KICAJCQl9CioqKioqKioqKioq KioqKgoqKiogMjUzNywyNjE2ICoqKioKICAJCQlpbl9xdW90ZSA9IGZhbHNlOwogIAkJCWNv bnRpbnVlOwogIAkJfQohIAkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybygmYXR0cmlidXRl X2J1ZiwgYyk7CiAgCX0KICAKLSAJaWYgKGluX3F1b3RlKQotIAkJKnJlc3VsdCA9IFVOVEVS TUlOQVRFRF9GSUVMRDsKLSAKLSAJLyogY2hlY2sgd2hldGhlciByYXcgaW5wdXQgbWF0Y2hl ZCBudWxsIG1hcmtlciAqLwotIAlpbnB1dF9sZW4gPSBlbmRfY3Vyc29yIC0gc3RhcnRfY3Vy c29yOwotIAlpZiAoIXNhd19xdW90ZSAmJiBpbnB1dF9sZW4gPT0gc3RybGVuKG51bGxfcHJp bnQpICYmCi0gCQlzdHJuY21wKCZsaW5lX2J1Zi5kYXRhW3N0YXJ0X2N1cnNvcl0sIG51bGxf cHJpbnQsIGlucHV0X2xlbikgPT0gMCkKLSAJCSppc251bGwgPSB0cnVlOwotIAllbHNlCi0g CQkqaXNudWxsID0gZmFsc2U7Ci0gCi0gCXJldHVybiBhdHRyaWJ1dGVfYnVmLmRhdGE7CiAg fQogIAogIC8qCiEgICogUmVhZCBhIGJpbmFyeSBhdHRyaWJ1dGUKICAgKi8KISBzdGF0aWMg RGF0dW0KISBDb3B5UmVhZEJpbmFyeUF0dHJpYnV0ZShpbnQgY29sdW1uX25vLCBGbWdySW5m byAqZmxpbmZvLAohIAkJCQkJCU9pZCB0eXBpb3BhcmFtLCBpbnQzMiB0eXBtb2QsCiAgCQkJ CQkJYm9vbCAqaXNudWxsKQogIHsKISAJaW50MzIJCWZsZF9zaXplOwohIAlEYXR1bQkJcmVz dWx0OwohIAohIAlmbGRfc2l6ZSA9IENvcHlHZXRJbnQzMigpOwohIAlpZiAoQ29weUdldEVv ZigpKQohIAkJZXJlcG9ydChFUlJPUiwKISAJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09Q WV9GSUxFX0ZPUk1BVCksCiEgCQkJCSBlcnJtc2coInVuZXhwZWN0ZWQgRU9GIGluIENPUFkg ZGF0YSIpKSk7CiEgCWlmIChmbGRfc2l6ZSA9PSAtMSkKISAJewohIAkJKmlzbnVsbCA9IHRy dWU7CiEgCQlyZXR1cm4gKERhdHVtKSAwOwogIAl9CiEgCWlmIChmbGRfc2l6ZSA8IDApCiEg CQllcmVwb3J0KEVSUk9SLAohIAkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVf Rk9STUFUKSwKISAJCQkJIGVycm1zZygiaW52YWxpZCBmaWVsZCBzaXplIikpKTsKICAKISAJ LyogcmVzZXQgYXR0cmlidXRlX2J1ZiB0byBlbXB0eSwgYW5kIGxvYWQgcmF3IGRhdGEgaW4g aXQgKi8KISAJYXR0cmlidXRlX2J1Zi5sZW4gPSAwOwohIAlhdHRyaWJ1dGVfYnVmLmRhdGFb MF0gPSAnXDAnOwohIAlhdHRyaWJ1dGVfYnVmLmN1cnNvciA9IDA7CiAgCiEgCWVubGFyZ2VT dHJpbmdJbmZvKCZhdHRyaWJ1dGVfYnVmLCBmbGRfc2l6ZSk7CiAgCi0gCUNvcHlHZXREYXRh KGF0dHJpYnV0ZV9idWYuZGF0YSwgZmxkX3NpemUpOwotIAlpZiAoQ29weUdldEVvZigpKQot IAkJZXJlcG9ydChFUlJPUiwKLSAJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxF X0ZPUk1BVCksCi0gCQkJCSBlcnJtc2coInVuZXhwZWN0ZWQgRU9GIGluIENPUFkgZGF0YSIp KSk7CiAgCiEgCWF0dHJpYnV0ZV9idWYubGVuID0gZmxkX3NpemU7CiEgCWF0dHJpYnV0ZV9i dWYuZGF0YVtmbGRfc2l6ZV0gPSAnXDAnOwogIAohIAkvKiBDYWxsIHRoZSBjb2x1bW4gdHlw ZSdzIGJpbmFyeSBpbnB1dCBjb252ZXJ0ZXIgKi8KISAJcmVzdWx0ID0gRnVuY3Rpb25DYWxs MyhmbGluZm8sCiEgCQkJCQkJICAgUG9pbnRlckdldERhdHVtKCZhdHRyaWJ1dGVfYnVmKSwK ISAJCQkJCQkgICBPYmplY3RJZEdldERhdHVtKHR5cGlvcGFyYW0pLAohIAkJCQkJCSAgIElu dDMyR2V0RGF0dW0odHlwbW9kKSk7CiAgCi0gCS8qIFRyb3VibGUgaWYgaXQgZGlkbid0IGVh dCB0aGUgd2hvbGUgYnVmZmVyICovCi0gCWlmIChhdHRyaWJ1dGVfYnVmLmN1cnNvciAhPSBh dHRyaWJ1dGVfYnVmLmxlbikKLSAJCWVyZXBvcnQoRVJST1IsCi0gCQkJCShlcnJjb2RlKEVS UkNPREVfSU5WQUxJRF9CSU5BUllfUkVQUkVTRU5UQVRJT04pLAotIAkJCQkgZXJybXNnKCJp bmNvcnJlY3QgYmluYXJ5IGRhdGEgZm9ybWF0IikpKTsKICAKLSAJKmlzbnVsbCA9IGZhbHNl OwotIAlyZXR1cm4gcmVzdWx0OwotIH0KICAKICAvKgogICAqIFNlbmQgdGV4dCByZXByZXNl bnRhdGlvbiBvZiBvbmUgYXR0cmlidXRlLCB3aXRoIGNvbnZlcnNpb24gYW5kIGVzY2FwaW5n Ci0tLSAzMDc5LDMxNDUgLS0tLQogIAkJCWluX3F1b3RlID0gZmFsc2U7CiAgCQkJY29udGlu dWU7CiAgCQl9CiEgCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3JvKCZhdHRyX2J1ZiwgYyk7 CiEgCQlhdHRyX2J1Zi5jdXJzb3IrKzsKICAJfQogIAogIH0KICAKICAvKgohICAqIFJlYWQg dGhlIGZpcnN0IGF0dHJpYnV0ZS4gVGhpcyBpcyBtYWlubHkgdXNlZCB0byBtYWludGFpbiBz dXBwb3J0CiEgICogZm9yIGFuIE9JRCBjb2x1bW4uIEFsbCB0aGUgcmVzdCBvZiB0aGUgY29s dW1ucyB3aWxsIGJlIHJlYWQgYXQgb25jZSB3aXRoCiEgICogQ29weVJlYWRBdHRyaWJ1dGVz VGV4dC4KICAgKi8KISBzdGF0aWMgY2hhciAqCiEgQ29weVJlYWRPaWRBdHRyKGNvbnN0IGNo YXIgKmRlbGltLCBjb25zdCBjaGFyICpudWxsX3ByaW50LCBpbnQgbnVsbF9wcmludF9sZW4s CiAgCQkJCQkJYm9vbCAqaXNudWxsKQogIHsKISAJY2hhcgkJZGVsaW1jID0gZGVsaW1bMF07 CiEgCWNoYXIJICAgKnN0YXJ0X2xvYyA9IGxpbmVfYnVmLmRhdGEgKyBsaW5lX2J1Zi5jdXJz b3I7CiEgCWNoYXIJICAgKmVuZF9sb2M7CiEgCWludAkJCWF0dHJfbGVuID0gMDsKISAJaW50 CQkJYnl0ZXNfcmVtYWluaW5nOwohIAohIAkvKiByZXNldCBhdHRyaWJ1dGUgYnVmIHRvIGVt cHR5ICovCiEgCWF0dHJfYnVmLmxlbiA9IDA7CiEgCWF0dHJfYnVmLmRhdGFbMF0gPSAnXDAn OwohIAlhdHRyX2J1Zi5jdXJzb3IgPSAwOwohIAohIAkvKiAjIG9mIGJ5dGVzIHRoYXQgd2Vy ZSBub3QgeWV0IHByb2Nlc3NlZCBpbiB0aGlzIGxpbmUgKi8KISAJYnl0ZXNfcmVtYWluaW5n ID0gbGluZV9idWYubGVuIC0gbGluZV9idWYuY3Vyc29yOwohIAohIAkvKiBnb3QgdG8gZW5k IG9mIGxpbmUgKi8KISAJaWYgKChlbmRfbG9jID0gc2NhblRleHRMaW5lKHN0YXJ0X2xvYywg ZGVsaW1jLCBieXRlc19yZW1haW5pbmcpKSA9PSBOVUxMKQohIAl7CiEgCQlhdHRyX2xlbiA9 IGJ5dGVzX3JlbWFpbmluZyAtIDE7IC8qIGRvbid0IGNvdW50ICdcbicgaW4gbGVuIGNhbGN1 bGF0aW9uICovCiEgCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZhdHRyX2J1Ziwgc3RhcnRf bG9jLCBhdHRyX2xlbik7CiEgCQlsaW5lX2J1Zi5jdXJzb3IgKz0gYXR0cl9sZW4gKyAyOwkJ Lyogc2tpcCAnXG4nIGFuZCAnXDAnICovCiAgCX0KISAJZWxzZQohIAkJLyogZm91bmQgYSBk ZWxpbWl0ZXIgKi8KISAJewohIAkJLyoKISAJCSAqICh3ZSBkb24ndCBjYXJlIGlmIGRlbGlt IHdhcyBwcmVjZWRlZCB3aXRoIGEgYmFja3NsYXNoLCBiZWNhdXNlIGl0J3MKISAJCSAqIGFu IGludmFsaWQgT0lEIGFueXdheSkKISAJCSAqLwogIAohIAkJYXR0cl9sZW4gPSBlbmRfbG9j IC0gc3RhcnRfbG9jOyAvKiB3ZSBkb24ndCBpbmNsdWRlIHRoZSBkZWxpbWl0ZXIgY2ggKi8K ICAKISAJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmF0dHJfYnVmLCBzdGFydF9sb2MsIGF0 dHJfbGVuKTsKISAJCWxpbmVfYnVmLmN1cnNvciArPSBhdHRyX2xlbiArIDE7CiEgCX0KICAK ICAKISAJLyogY2hlY2sgd2hldGhlciByYXcgaW5wdXQgbWF0Y2hlZCBudWxsIG1hcmtlciAq LwohIAlpZiAoYXR0cl9sZW4gPT0gbnVsbF9wcmludF9sZW4gJiYgc3RybmNtcChzdGFydF9s b2MsIG51bGxfcHJpbnQsIGF0dHJfbGVuKSA9PSAwKQohIAkJKmlzbnVsbCA9IHRydWU7CiEg CWVsc2UKISAJCSppc251bGwgPSBmYWxzZTsKICAKISAJcmV0dXJuIGF0dHJfYnVmLmRhdGE7 CiEgfQogIAogIAogIAogIC8qCiAgICogU2VuZCB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIG9u ZSBhdHRyaWJ1dGUsIHdpdGggY29udmVyc2lvbiBhbmQgZXNjYXBpbmcKKioqKioqKioqKioq KioqCioqKiAyODAwLDI4MDIgKioqKgotLS0gMzMyOSwzNDMyIC0tLS0KICAKICAJcmV0dXJu IGF0dG51bXM7CiAgfQorIAorIC8qCisgICogVGhlIGZvbGxvd2luZyBhcmUgY3VzdG9tIHZl cnNpb25zIG9mIHRoZSBzdHJpbmcgZnVuY3Rpb24gc3RyY2hyKCkuCisgICogQXMgb3Bwb3Nl ZCB0byB0aGUgb3JpZ2luYWwgc3RyY2hyIHdoaWNoIHNlYXJjaGVzIHRocm91Z2gKKyAgKiBh IHN0cmluZyB1bnRpbCB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpcyBmb3VuZCwgb3IgYSBOVUxM IGlzCisgICogZm91bmQsIHRoaXMgdmVyc2lvbiB3aWxsIG5vdCByZXR1cm4gd2hlbiBhIE5V TEwgaXMgZm91bmQuCisgICogSW5zdGVhZCBpdCB3aWxsIHNlYXJjaCB0aHJvdWdoIGEgcHJl LWRlZmluZWQgbGVuZ3RoIG9mCisgICogYnl0ZXMgYW5kIHdpbGwgcmV0dXJuIG9ubHkgaWYg dGhlIHRhcmdldCBjaGFyYWN0ZXIocykgaXMgcmVhY2hlZC4KKyAgKgorICAqIElmIG91ciBj bGllbnQgZW5jb2RpbmcgaXMgbm90IGEgc3VwcG9ydGVkIHNlcnZlciBlbmNvZGluZywgd2UK KyAgKiBrbm93IHRoYXQgaXQgaXMgbm90IHNhZmUgdG8gbG9vayBhdCBlYWNoIGNoYXJhY3Rl ciBhcyB0cmFpbGluZworICAqIGJ5dGUgaW4gYSBtdWx0aWJ5dGUgY2hhcmFjdGVyIG1heSBi ZSBhIDctYml0IEFTQ0lJIGVxdWl2YWxlbnQuCisgICogVGhlcmVmb3JlIHdlIHVzZSBwZ19l bmNvZGluZ19tYmxlbiB0byBza2lwIHRvIHRoZSBlbmQgb2YgdGhlCisgICogY2hhcmFjdGVy LgorICAqCisgICogcmV0dXJuczoKKyAgKgkgcG9pbnRlciB0byBjIC0gaWYgYyBpcyBsb2Nh dGVkIHdpdGhpbiB0aGUgc3RyaW5nLgorICAqCSBOVUxMIC0gaWYgYyB3YXMgbm90IGZvdW5k IGluIHNwZWNpZmllZCBsZW5ndGggb2Ygc2VhcmNoLiBOb3RlOgorICAqCQkJdGhpcyBET0VT TidUIG1lYW4gdGhhdCBhICdcMCcgd2FzIHJlYWNoZWQuCisgICovCisgY2hhciAqCisgc2Nh blRleHRMaW5lKGNvbnN0IGNoYXIgKnMsIGNoYXIgZW9sLCBzaXplX3QgbGVuKQorIHsKKyAJ Y29uc3QgY2hhciAqc3RhcnQ7CisgCisgCWlmIChjbGllbnRfZW5jb2Rpbmdfb25seSAmJiAh bGluZV9idWZfY29udmVydGVkKQorIAl7CisgCQlpbnQJCQltYmxlbiA9IHBnX2VuY29kaW5n X21ibGVuKGNsaWVudF9lbmNvZGluZywgKHVuc2lnbmVkIGNoYXIqKXMpOworIAorIAkJZm9y IChzdGFydCA9IHM7ICpzICE9IGVvbCAmJiBzIDwgc3RhcnQgKyBsZW47IHMgKz0gbWJsZW4p CisgCQkJbWJsZW4gPSBwZ19lbmNvZGluZ19tYmxlbihjbGllbnRfZW5jb2RpbmcsICh1bnNp Z25lZCBjaGFyKilzKTsKKyAJCQorIAkJcmV0dXJuICgoKnMgPT0gZW9sKSA/IChjaGFyICop IHMgOiBOVUxMKTsKKyAJfQorIAllbHNlCisgCQlyZXR1cm4gbWVtY2hyKHMsZW9sLGxlbik7 CisgfQorIAorIAorIGNoYXIgKgorIHNjYW5DU1ZMaW5lKGNvbnN0IGNoYXIgKnMsIGNoYXIg ZW9sLCBjaGFyIGVzY2FwZWMsIGNoYXIgcXVvdGVjLCBzaXplX3QgbGVuKQorIHsKKyAJY29u c3QgY2hhciAqc3RhcnQ7CisgCQorIAlpZiAoY2xpZW50X2VuY29kaW5nX29ubHkgJiYgIWxp bmVfYnVmX2NvbnZlcnRlZCkKKyAJeworIAkJaW50CQkJbWJsZW4gPSBwZ19lbmNvZGluZ19t YmxlbihjbGllbnRfZW5jb2RpbmcsICh1bnNpZ25lZCBjaGFyKilzKTsKKyAJCQorIAkJZm9y IChzdGFydCA9IHM7ICpzICE9IGVvbCAmJiAgcyA8IHN0YXJ0ICsgbGVuOyBzICs9IG1ibGVu KQorIAkJeworIAkJCWlmIChpbl9xdW90ZSAmJiAqcyA9PSBlc2NhcGVjKQorIAkJCQlsYXN0 X3dhc19lc2MgPSAhbGFzdF93YXNfZXNjOworIAkJCWlmICgqcyA9PSBxdW90ZWMgJiYgIWxh c3Rfd2FzX2VzYykKKyAJCQkJaW5fcXVvdGUgPSAhaW5fcXVvdGU7CisgCQkJaWYgKCpzICE9 IGVzY2FwZWMpCisgCQkJCWxhc3Rfd2FzX2VzYyA9IGZhbHNlOworIAkJCQkJCisgCQkJbWJs ZW4gPSBwZ19lbmNvZGluZ19tYmxlbihjbGllbnRfZW5jb2RpbmcsICh1bnNpZ25lZCBjaGFy KilzKTsKKyAgICAgICAgIH0KKyAJfQorIAllbHNlCisgCQkvKiBzYWZlIHRvIHNjcm9sbCBi eXRlIGJ5IGJ5dGUgKi8KKyAJeworIAkJZm9yIChzdGFydCA9IHM7ICpzICE9IGVvbCAgJiYg cyA8IHN0YXJ0ICsgbGVuOyBzKyspCisgCQl7CisgCQkJaWYgKGluX3F1b3RlICYmICpzID09 IGVzY2FwZWMpCisgCQkJCWxhc3Rfd2FzX2VzYyA9ICFsYXN0X3dhc19lc2M7CisgCQkJaWYg KCpzID09IHF1b3RlYyAmJiAhbGFzdF93YXNfZXNjKQorIAkJCQlpbl9xdW90ZSA9ICFpbl9x dW90ZTsKKyAJCQlpZiAoKnMgIT0gZXNjYXBlYykKKyAJCQkJbGFzdF93YXNfZXNjID0gZmFs c2U7CisgCQl9CisgCQkJCisgCX0KKyAJCisgCWlmKCpzICE9IGVzY2FwZWMpIC8qIGZvdW5k IGVvbF9jaCAqLworIAkJbGFzdF93YXNfZXNjID0gZmFsc2U7CisgCQorIAlyZXR1cm4gKCgq cyA9PSBlb2wpID8gKGNoYXIgKikgcyA6IE5VTEwpOworIH0KKyAKKyAvKgorICAqIFNjYW4g Zm9yIDEgb2YgMiBjaGFyYWN0ZXJzIG5lY2Vzc2FyeSBmb3IgYXR0cmlidXRlIHBhcnNpbmcu IE5vIG5lZWQKKyAgKiBmb3IgY2hlY2tpbmcgZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVycyBz aW5jZSBjb252ZXJzaW9uIGFscmVhZHkgCisgICogaGFwcGVuZWQuCisgICovCisgY2hhciAq Cisgc2NhblRleHRBdHRyKGNvbnN0IGNoYXIgKnMsIGNoYXIgYzEsIGNoYXIgYzIsIHNpemVf dCBsZW4pCisgeworIAljb25zdCBjaGFyICpzdGFydDsKKyAJCisgCWZvciAoc3RhcnQgPSBz OyAqcyAhPSBjMSAmJiAqcyAhPSBjMiAmJiBzIDwgc3RhcnQgKyBsZW47IHMrKykKKyAJCTsK KyAJCisgCXJldHVybiAoKnMgIT0gJ1wwJyA/IChjaGFyICopIHMgOiBOVUxMKTsKKyB9Cisg CisgCisgCisgCisgCg== --B_3204206540_47940875--