Received: from makus.postgresql.org (makus.postgresql.org [98.129.198.125]) by mail.postgresql.org (Postfix) with ESMTP id 1C04E2DF892 for ; Tue, 13 Dec 2011 08:51:22 -0400 (AST) Received: from tama500.ecl.ntt.co.jp ([129.60.39.148]) by makus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1RaRpE-0002VU-61 for pgsql-hackers@postgresql.org; Tue, 13 Dec 2011 12:51:22 +0000 Received: from mfs6.rdh.ecl.ntt.co.jp (mfs6.rdh.ecl.ntt.co.jp [129.60.39.149]) by tama500.ecl.ntt.co.jp (8.14.5/8.14.5) with ESMTP id pBDCouv9012099; Tue, 13 Dec 2011 21:50:56 +0900 (JST) Received: from mfs6.rdh.ecl.ntt.co.jp (localhost [127.0.0.1]) by mfs6.rdh.ecl.ntt.co.jp (Postfix) with ESMTP id DA22565F1; Tue, 13 Dec 2011 21:50:55 +0900 (JST) Received: from dmailsv1.y.ecl.ntt.co.jp (dmailsv1.y.ecl.ntt.co.jp [129.60.53.14]) by mfs6.rdh.ecl.ntt.co.jp (Postfix) with ESMTP id BADC565EB; Tue, 13 Dec 2011 21:50:55 +0900 (JST) Received: from mailsv01.y.ecl.ntt.co.jp by dmailsv1.y.ecl.ntt.co.jp (8.14.5/dmailsv1-2.1) with ESMTP id pBDCotHB006574; Tue, 13 Dec 2011 21:50:55 +0900 (JST) Received: from localhost by mailsv01.y.ecl.ntt.co.jp (8.14.5/Lab-1.9) with ESMTP id pBDCotZu026645; Tue, 13 Dec 2011 21:50:55 +0900 (JST) Message-ID: <4EE74C5F.3000309@lab.ntt.co.jp> Date: Tue, 13 Dec 2011 22:00:15 +0900 From: Etsuro Fujita User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2.9) Gecko/20100915 Thunderbird/3.1.4 MIME-Version: 1.0 To: Shigeru Hanada CC: pgsql-hackers@postgresql.org Subject: Re: WIP: Collecting statistics on CSV file data References: <4E6DE18B.4010505@lab.ntt.co.jp> <4E7861C1.2000607@gmail.com> <4E8EC1D8.3080700@lab.ntt.co.jp> <4E9C6573.8050507@gmail.com> <4E9FF04B.3050504@lab.ntt.co.jp> <4EB7C07A.5030205@gmail.com> <4EC60883.2050905@lab.ntt.co.jp> <4EC648CA.5050904@gmail.com> <4EC9CBC5.3070500@lab.ntt.co.jp> <4EE1FC38.5080707@lab.ntt.co.jp> <4EE5D862.1080809@gmail.com> In-Reply-To: <4EE5D862.1080809@gmail.com> Content-Type: multipart/mixed; boundary="------------060101010307030304070901" X-Pg-Spam-Score: -4.2 (----) X-Archive-Number: 201112/532 X-Sequence-Number: 199784 This is a multi-part message in MIME format. --------------060101010307030304070901 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit (2011/12/12 19:33), Shigeru Hanada wrote: > (2011/12/09 21:16), Etsuro Fujita wrote: >> I updated the patch. Please find attached a patch. > > I've examined v5 patch, and got reasonable EXPLAIN results which reflect > collected statistics! As increasing STATISTICS option, estimated rows > become better. Please see attached stats_*.txt for what I > tested. > > stats_none.txt : before ANALYZE > stats_100.txt : SET STATISTICS = 100 for all columns, and ANALYZE > stats_10000.txt : SET STATISTICS = 10000 for all columns, and ANALYZE > > I think that this patch become ready for committer after some > minor corrections: > > Couldn't set n_distinct > ======================= > I couldn't set n_distinct to columns of foreign tables. With some > research, I noticed that ATSimplePermissions should accept > ATT_FOREIGN_TABLE too for that case. In addition, regression tests for > ALTER FOREIGN TABLE should be added to detect this kind of problem. > > Showing stats target > ==================== > We can see stats target of ordinary tables with \d+, but it is not > available for foreign tables. I think "Stats target" column should be > added even though output of \d+ for foreign tables become wider. One > possible idea is to remove useless "Storage" column instead, but views > have that column even though their source could come from foreign tables. > > Please see attached patch for these two items. > > Comments of FdwRoutine > ====================== > Mention about optional handler is obsolete. We should clearly say > AnalyzeForeignTable is optional (can be set to NULL) and rest are > required. IMO separating them with comment would help FDW authors to > understand requirements, e.g.: > > typedef struct FdwRoutine > { > NodeTag type; > > /* > * These Handlers are required to execute simple scan on a foreign > * table. If any of them was set to NULL, scan on a foreign table > * managed by such FDW would fail. > */ > PlanForeignScan_function PlanForeignScan; > ExplainForeignScan_function ExplainForeignScan; > BeginForeignScan_function BeginForeignScan; > IterateForeignScan_function IterateForeignScan; > ReScanForeignScan_function ReScanForeignScan; > EndForeignScan_function EndForeignScan; > > /* > * Handlers below are optional. You can set any of them to > * NULL to tell PostgreSQL that the FDW doesn't have the > * capability. > */ > AnalyzeForeignTable_function AnalyzeForeignTable; > } FdwRoutine; > > Code formatting > =============== > Some code lines go past 80 columns. > > Message style > ============= > The terms 'cannot support option "n_distinct"...' used in > ATPrepSetOptions seems little unusual in PostgreSQL. Should we say > 'cannot set "n_distinct_inherited" for foreign tables' for that case? > > Typo > ==== > Typo "spcify" is in document of analyze. Thank you for your effectiveness experiments and proposals for improvements. I updated the patch according to your proposals. Attached is the updated version of the patch. Best regards, Etsuro Fujita > Regards, > > > > --------------060101010307030304070901 Content-Type: text/plain; name="postgresql-analyze-v6.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="postgresql-analyze-v6.patch" KioqIGEvY29udHJpYi9maWxlX2Zkdy9maWxlX2Zkdy5jCi0tLSBiL2NvbnRyaWIvZmlsZV9m ZHcvZmlsZV9mZHcuYwoqKioqKioqKioqKioqKioKKioqIDIwLDI1ICoqKioKLS0tIDIwLDI2 IC0tLS0KICAjaW5jbHVkZSAiY29tbWFuZHMvY29weS5oIgogICNpbmNsdWRlICJjb21tYW5k cy9kZWZyZW0uaCIKICAjaW5jbHVkZSAiY29tbWFuZHMvZXhwbGFpbi5oIgorICNpbmNsdWRl ICJjb21tYW5kcy92YWN1dW0uaCIKICAjaW5jbHVkZSAiZm9yZWlnbi9mZHdhcGkuaCIKICAj aW5jbHVkZSAiZm9yZWlnbi9mb3JlaWduLmgiCiAgI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgoq KioqKioqKioqKioqKioKKioqIDEwMSwxMDYgKioqKiBzdGF0aWMgdm9pZCBmaWxlQmVnaW5G b3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRlICpub2RlLCBpbnQgZWZsYWdzKTsKLS0tIDEw MiwxMTAgLS0tLQogIHN0YXRpYyBUdXBsZVRhYmxlU2xvdCAqZmlsZUl0ZXJhdGVGb3JlaWdu U2NhbihGb3JlaWduU2NhblN0YXRlICpub2RlKTsKICBzdGF0aWMgdm9pZCBmaWxlUmVTY2Fu Rm9yZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSk7CiAgc3RhdGljIHZvaWQgZmls ZUVuZEZvcmVpZ25TY2FuKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUpOworIHN0YXRpYyB2b2lk IGZpbGVBbmFseXplRm9yZWlnblRhYmxlKFJlbGF0aW9uIG9uZXJlbCwKKyAJCQkJCVZhY3V1 bVN0bXQgKnZhY3N0bXQsCisgCQkJCQlpbnQgZWxldmVsKTsKICAKICAvKgogICAqIEhlbHBl ciBmdW5jdGlvbnMKKioqKioqKioqKioqKioqCioqKiAxMTIsMTE4ICoqKiogc3RhdGljIExp c3QgKmdldF9maWxlX2Zkd19hdHRyaWJ1dGVfb3B0aW9ucyhPaWQgcmVsaWQpOwogIHN0YXRp YyB2b2lkIGVzdGltYXRlX2Nvc3RzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpi YXNlcmVsLAogIAkJCSAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogIAkJCSAgIENvc3QgKnN0 YXJ0dXBfY29zdCwgQ29zdCAqdG90YWxfY29zdCk7CiEgCiAgCiAgLyoKICAgKiBGb3JlaWdu LWRhdGEgd3JhcHBlciBoYW5kbGVyIGZ1bmN0aW9uOiByZXR1cm4gYSBzdHJ1Y3Qgd2l0aCBw b2ludGVycwotLS0gMTE2LDEyNSAtLS0tCiAgc3RhdGljIHZvaWQgZXN0aW1hdGVfY29zdHMo UGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmJhc2VyZWwsCiAgCQkJICAgY29uc3Qg Y2hhciAqZmlsZW5hbWUsCiAgCQkJICAgQ29zdCAqc3RhcnR1cF9jb3N0LCBDb3N0ICp0b3Rh bF9jb3N0KTsKISBzdGF0aWMgaW50CWFjcXVpcmVfc2FtcGxlX3Jvd3MoUmVsYXRpb24gb25l cmVsLAohIAkJCSAgIEhlYXBUdXBsZSAqcm93cywgaW50IHRhcmdyb3dzLAohIAkJCSAgIGRv dWJsZSAqdG90YWxyb3dzLCBkb3VibGUgKnRvdGFsZGVhZHJvd3MsCiEgCQkJICAgQmxvY2tO dW1iZXIgKnRvdGFscGFnZXMsIGludCBlbGV2ZWwpOwogIAogIC8qCiAgICogRm9yZWlnbi1k YXRhIHdyYXBwZXIgaGFuZGxlciBmdW5jdGlvbjogcmV0dXJuIGEgc3RydWN0IHdpdGggcG9p bnRlcnMKKioqKioqKioqKioqKioqCioqKiAxMjksMTM0ICoqKiogZmlsZV9mZHdfaGFuZGxl cihQR19GVU5DVElPTl9BUkdTKQotLS0gMTM2LDE0MiAtLS0tCiAgCWZkd3JvdXRpbmUtPkl0 ZXJhdGVGb3JlaWduU2NhbiA9IGZpbGVJdGVyYXRlRm9yZWlnblNjYW47CiAgCWZkd3JvdXRp bmUtPlJlU2NhbkZvcmVpZ25TY2FuID0gZmlsZVJlU2NhbkZvcmVpZ25TY2FuOwogIAlmZHdy b3V0aW5lLT5FbmRGb3JlaWduU2NhbiA9IGZpbGVFbmRGb3JlaWduU2NhbjsKKyAJZmR3cm91 dGluZS0+QW5hbHl6ZUZvcmVpZ25UYWJsZSA9IGZpbGVBbmFseXplRm9yZWlnblRhYmxlOwog IAogIAlQR19SRVRVUk5fUE9JTlRFUihmZHdyb3V0aW5lKTsKICB9CioqKioqKioqKioqKioq KgoqKiogNTc1LDU4MCAqKioqIGZpbGVSZVNjYW5Gb3JlaWduU2NhbihGb3JlaWduU2NhblN0 YXRlICpub2RlKQotLS0gNTgzLDYwMCAtLS0tCiAgfQogIAogIC8qCisgICogZmlsZUFuYWx5 emVGb3JlaWduVGFibGUKKyAgKgkJQW5hbHl6ZSBmb3JlaWduIHRhYmxlCisgICovCisgc3Rh dGljIHZvaWQKKyBmaWxlQW5hbHl6ZUZvcmVpZ25UYWJsZShSZWxhdGlvbiBvbmVyZWwsIFZh Y3V1bVN0bXQgKnZhY3N0bXQsIGludCBlbGV2ZWwpCisgeworIAlkb19hbmFseXplX3JlbChv bmVyZWwsIHZhY3N0bXQsCisgCQkJCSAgIGVsZXZlbCwgZmFsc2UsCisgCQkJCSAgIGFjcXVp cmVfc2FtcGxlX3Jvd3MpOworIH0KKyAKKyAvKgogICAqIEVzdGltYXRlIGNvc3RzIG9mIHNj YW5uaW5nIGEgZm9yZWlnbiB0YWJsZS4KICAgKi8KICBzdGF0aWMgdm9pZAoqKioqKioqKioq KioqKioKKioqIDU4NCw1OTAgKioqKiBlc3RpbWF0ZV9jb3N0cyhQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqYmFzZXJlbCwKICB7CiAgCXN0cnVjdCBzdGF0IHN0YXRfYnVmOwog IAlCbG9ja051bWJlciBwYWdlczsKISAJaW50CQkJdHVwbGVfd2lkdGg7CiAgCWRvdWJsZQkJ bnR1cGxlczsKICAJZG91YmxlCQlucm93czsKICAJQ29zdAkJcnVuX2Nvc3QgPSAwOwotLS0g NjA0LDYxMSAtLS0tCiAgewogIAlzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKICAJQmxvY2tOdW1i ZXIgcGFnZXM7CiEgCUJsb2NrTnVtYmVyCXJlbHBhZ2VzOwohIAlkb3VibGUJCXJlbHR1cGxl czsKICAJZG91YmxlCQludHVwbGVzOwogIAlkb3VibGUJCW5yb3dzOwogIAlDb3N0CQlydW5f Y29zdCA9IDA7CioqKioqKioqKioqKioqKgoqKiogNjA0LDYxOSAqKioqIGVzdGltYXRlX2Nv c3RzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpiYXNlcmVsLAogIAlpZiAocGFn ZXMgPCAxKQogIAkJcGFnZXMgPSAxOwogIAohIAkvKgohIAkgKiBFc3RpbWF0ZSB0aGUgbnVt YmVyIG9mIHR1cGxlcyBpbiB0aGUgZmlsZS4gIFdlIGJhY2sgaW50byB0aGlzIGVzdGltYXRl CiEgCSAqIHVzaW5nIHRoZSBwbGFubmVyJ3MgaWRlYSBvZiB0aGUgcmVsYXRpb24gd2lkdGg7 IHdoaWNoIGlzIGJvZ3VzIGlmIG5vdAohIAkgKiBhbGwgY29sdW1ucyBhcmUgYmVpbmcgcmVh ZCwgbm90IHRvIG1lbnRpb24gdGhhdCB0aGUgdGV4dCByZXByZXNlbnRhdGlvbgohIAkgKiBv ZiBhIHJvdyBwcm9iYWJseSBpc24ndCB0aGUgc2FtZSBzaXplIGFzIGl0cyBpbnRlcm5hbCBy ZXByZXNlbnRhdGlvbi4KISAJICogRklYTUUgbGF0ZXIuCiEgCSAqLwohIAl0dXBsZV93aWR0 aCA9IE1BWEFMSUdOKGJhc2VyZWwtPndpZHRoKSArIE1BWEFMSUdOKHNpemVvZihIZWFwVHVw bGVIZWFkZXJEYXRhKSk7CiAgCiEgCW50dXBsZXMgPSBjbGFtcF9yb3dfZXN0KChkb3VibGUp IHN0YXRfYnVmLnN0X3NpemUgLyAoZG91YmxlKSB0dXBsZV93aWR0aCk7CiAgCiAgCS8qCiAg CSAqIE5vdyBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgYnkgdGhlIHNj YW4gYWZ0ZXIgYXBwbHlpbmcgdGhlCi0tLSA2MjUsNjU4IC0tLS0KICAJaWYgKHBhZ2VzIDwg MSkKICAJCXBhZ2VzID0gMTsKICAKISAJcmVscGFnZXMgPSBiYXNlcmVsLT5wYWdlczsKISAJ cmVsdHVwbGVzID0gYmFzZXJlbC0+dHVwbGVzOwohIAohIAlpZiAocmVscGFnZXMgPiAwKQoh IAl7CiEgCQlkb3VibGUJCWRlbnNpdHk7CiAgCiEgCQlkZW5zaXR5ID0gcmVsdHVwbGVzIC8g KGRvdWJsZSkgcmVscGFnZXM7CiEgCiEgCQludHVwbGVzID0gY2xhbXBfcm93X2VzdChkZW5z aXR5ICogKGRvdWJsZSkgcGFnZXMpOwohIAl9CiEgCWVsc2UKISAJewohIAkJaW50CQkJdHVw bGVfd2lkdGg7CiEgCiEgCQkvKgohIAkJICogRXN0aW1hdGUgdGhlIG51bWJlciBvZiB0dXBs ZXMgaW4gdGhlIGZpbGUuICBXZSBiYWNrIGludG8gdGhpcwohIAkJICogZXN0aW1hdGUgdXNp bmcgdGhlIHBsYW5uZXIncyBpZGVhIG9mIHRoZSByZWxhdGlvbiB3aWR0aDsgd2hpY2ggaXMK ISAJCSAqIGJvZ3VzIGlmIG5vdCBhbGwgY29sdW1ucyBhcmUgYmVpbmcgcmVhZCwgbm90IHRv IG1lbnRpb24gdGhhdCB0aGUKISAJCSAqIHRleHQgcmVwcmVzZW50YXRpb24gb2YgYSByb3cg cHJvYmFibHkgaXNuJ3QgdGhlIHNhbWUgc2l6ZSBhcyBpdHMKISAJCSAqIGludGVybmFsIHJl cHJlc2VudGF0aW9uLiAgRklYTUUgbGF0ZXIuCiEgCQkgKi8KISAJCXR1cGxlX3dpZHRoID0g TUFYQUxJR04oYmFzZXJlbC0+d2lkdGgpICsKISAJCQlNQVhBTElHTihzaXplb2YoSGVhcFR1 cGxlSGVhZGVyRGF0YSkpOwohIAohIAkJbnR1cGxlcyA9IGNsYW1wX3Jvd19lc3QoKGRvdWJs ZSkgc3RhdF9idWYuc3Rfc2l6ZSAvCiEgCQkJCQkJCQkoZG91YmxlKSB0dXBsZV93aWR0aCk7 CiEgCX0KICAKICAJLyoKICAJICogTm93IGVzdGltYXRlIHRoZSBudW1iZXIgb2Ygcm93cyBy ZXR1cm5lZCBieSB0aGUgc2NhbiBhZnRlciBhcHBseWluZyB0aGUKKioqKioqKioqKioqKioq CioqKiA2NDUsNjQ3ICoqKiogZXN0aW1hdGVfY29zdHMoUGxhbm5lckluZm8gKnJvb3QsIFJl bE9wdEluZm8gKmJhc2VyZWwsCi0tLSA2ODQsODcyIC0tLS0KICAJcnVuX2Nvc3QgKz0gY3B1 X3Blcl90dXBsZSAqIG50dXBsZXM7CiAgCSp0b3RhbF9jb3N0ID0gKnN0YXJ0dXBfY29zdCAr IHJ1bl9jb3N0OwogIH0KKyAKKyAvKgorICAqIGFjcXVpcmVfc2FtcGxlX3Jvd3MgLS0gYWNx dWlyZSBhIHJhbmRvbSBzYW1wbGUgb2Ygcm93cyBmcm9tIHRoZSB0YWJsZQorICAqCisgICog U2VsZWN0ZWQgcm93cyBhcmUgcmV0dXJuZWQgaW4gdGhlIGNhbGxlci1hbGxvY2F0ZWQgYXJy YXkgcm93c1tdLCB3aGljaCBtdXN0CisgICogaGF2ZSBhdCBsZWFzdCB0YXJncm93cyBlbnRy aWVzLiAgVGhlIGFjdHVhbCBudW1iZXIgb2Ygcm93cyBzZWxlY3RlZCBpcyAKKyAgKiByZXR1 cm5lZCBhcyB0aGUgZnVuY3Rpb24gcmVzdWx0LiAgV2UgYWxzbyBjb3VudCB0aGUgbnVtYmVy IG9mIHZhbGlkIHJvd3MgaW4KKyAgKiB0aGUgdGFibGUsIGFuZCByZXR1cm4gaXQgaW50byAq dG90YWxyb3dzLgorICAqCisgICogVGhlIHJldHVybmVkIGxpc3Qgb2YgdHVwbGVzIGlzIGlu IG9yZGVyIGJ5IHBoeXNpY2FsIHBvc2l0aW9uIGluIHRoZSB0YWJsZS4KKyAgKiAoV2Ugd2ls bCByZWx5IG9uIHRoaXMgbGF0ZXIgdG8gZGVyaXZlIGNvcnJlbGF0aW9uIGVzdGltYXRlcy4p CisgICovCisgc3RhdGljIGludAorIGFjcXVpcmVfc2FtcGxlX3Jvd3MoUmVsYXRpb24gb25l cmVsLCBIZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywKKyAJCQkJCWRvdWJsZSAqdG90 YWxyb3dzLCBkb3VibGUgKnRvdGFsZGVhZHJvd3MsCisgCQkJCQlCbG9ja051bWJlciAqdG90 YWxwYWdlcywgaW50IGVsZXZlbCkKKyB7CisgCWludAkJCW51bXJvd3MgPSAwOworIAlpbnQJ CQlpbnZhbHJvd3MgPSAwOyAvKiB0b3RhbCAjIHJvd3MgdmlvbGF0aW5nCisgCQkJCQkJCQkg IHRoZSBOT1QgTlVMTCBjb25zdHJhaW50cyAqLworIAlkb3VibGUJCXZhbGlkcm93cyA9IDA7 IC8qIHRvdGFsICMgcm93cyBjb2xsZWN0ZWQgKi8KKyAJZG91YmxlCQlyb3dzdG9za2lwID0g LTE7IC8qIC0xIG1lYW5zIG5vdCBzZXQgeWV0ICovCisgCWRvdWJsZQkJcnN0YXRlOworIAlI ZWFwVHVwbGUJdHVwbGU7CisgCVR1cGxlRGVzYwl0dXBEZXNjOworIAlUdXBsZUNvbnN0ciAq Y29uc3RyOworIAlpbnQJCQluYXR0czsKKyAJaW50CQkJYXR0ckNoazsKKyAJRGF0dW0JICAg KnZhbHVlczsKKyAJYm9vbAkgICAqbnVsbHM7CisgCWJvb2wJCWZvdW5kOworIAlib29sCQlz YW1wbGVfaXQgPSBmYWxzZTsKKyAJY2hhcgkgICAqZmlsZW5hbWU7CisgCXN0cnVjdCBzdGF0 CXN0YXRfYnVmOworIAlMaXN0CSAgICpvcHRpb25zOworIAlDb3B5U3RhdGUJY3N0YXRlOwor IAlFcnJvckNvbnRleHRDYWxsYmFjayBlcnJjb250ZXh0OworIAorIAlBc3NlcnQob25lcmVs KTsKKyAJQXNzZXJ0KHRhcmdyb3dzID4gMCk7CisgCisgCXR1cERlc2MgPSBSZWxhdGlvbkdl dERlc2NyKG9uZXJlbCk7CisgCWNvbnN0ciA9IHR1cERlc2MtPmNvbnN0cjsKKyAJbmF0dHMg PSB0dXBEZXNjLT5uYXR0czsKKyAJdmFsdWVzID0gKERhdHVtICopIHBhbGxvYyh0dXBEZXNj LT5uYXR0cyAqIHNpemVvZihEYXR1bSkpOworIAludWxscyA9IChib29sICopIHBhbGxvYyh0 dXBEZXNjLT5uYXR0cyAqIHNpemVvZihib29sKSk7CisgCisgCS8qIEZldGNoIG9wdGlvbnMg b2YgZm9yZWlnbiB0YWJsZSAqLworIAlmaWxlR2V0T3B0aW9ucyhSZWxhdGlvbkdldFJlbGlk KG9uZXJlbCksICZmaWxlbmFtZSwgJm9wdGlvbnMpOworIAorIAkvKgorIAkgKiBHZXQgc2l6 ZSBvZiB0aGUgZmlsZS4KKyAJICovCisgCWlmIChzdGF0KGZpbGVuYW1lLCAmc3RhdF9idWYp IDwgMCkKKyAJCWVyZXBvcnQoRVJST1IsCisgCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2Vz cygpLAorIAkJCQkgZXJybXNnKCJjb3VsZCBub3Qgc3RhdCBmaWxlIFwiJXNcIjogJW0iLAor IAkJCQkJCWZpbGVuYW1lKSkpOworIAorIAkvKgorIAkgKiBDb252ZXJ0IHNpemUgdG8gcGFn ZXMgZm9yIHVzZSBpbiBJL08gY29zdCBlc3RpbWF0ZS4KKyAJICovCisgCSp0b3RhbHBhZ2Vz ID0gKHN0YXRfYnVmLnN0X3NpemUgKyAoQkxDS1NaIC0gMSkpIC8gQkxDS1NaOworIAlpZiAo KnRvdGFscGFnZXMgPCAxKQorIAkJKnRvdGFscGFnZXMgPSAxOworIAorIAkvKgorIAkgKiBD cmVhdGUgQ29weVN0YXRlIGZyb20gRkRXIG9wdGlvbnMuICBXZSBhbHdheXMgYWNxdWlyZSBh bGwgY29sdW1ucywgc28KKyAJICogYXMgdG8gbWF0Y2ggdGhlIGV4cGVjdGVkIFNjYW5UdXBs ZVNsb3Qgc2lnbmF0dXJlLgorIAkgKi8KKyAJY3N0YXRlID0gQmVnaW5Db3B5RnJvbShvbmVy ZWwsIGZpbGVuYW1lLCBOSUwsIG9wdGlvbnMpOworIAorIAkvKiBQcmVwYXJlIGZvciBzYW1w bGluZyByb3dzICovCisgCXJzdGF0ZSA9IGluaXRfc2VsZWN0aW9uX3N0YXRlKHRhcmdyb3dz KTsKKyAKKyAJLyogU2V0IHVwIGNhbGxiYWNrIHRvIGlkZW50aWZ5IGVycm9yIGxpbmUgbnVt YmVyLiAqLworIAllcnJjb250ZXh0LmNhbGxiYWNrID0gQ29weUZyb21FcnJvckNhbGxiYWNr OworIAllcnJjb250ZXh0LmFyZyA9ICh2b2lkICopIGNzdGF0ZTsKKyAJZXJyY29udGV4dC5w cmV2aW91cyA9IGVycm9yX2NvbnRleHRfc3RhY2s7CisgCWVycm9yX2NvbnRleHRfc3RhY2sg PSAmZXJyY29udGV4dDsKKyAKKyAJZm9yICg7OykKKyAJeworIAkJc2FtcGxlX2l0ID0gdHJ1 ZTsKKyAKKyAJCS8qCisgCQkgKiBDaGVjayBmb3IgdXNlci1yZXF1ZXN0ZWQgYWJvcnQuCisg CQkgKi8KKyAJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CisgCisgCQlmb3VuZCA9IE5leHRD b3B5RnJvbShjc3RhdGUsIE5VTEwsIHZhbHVlcywgbnVsbHMsIE5VTEwpOworIAorIAkJaWYg KCFmb3VuZCkKKyAJCQlicmVhazsKKyAKKyAJCXR1cGxlID0gaGVhcF9mb3JtX3R1cGxlKHR1 cERlc2MsIHZhbHVlcywgbnVsbHMpOworIAorIAkJaWYgKGNvbnN0ciAmJiBjb25zdHItPmhh c19ub3RfbnVsbCkKKyAJCXsKKyAJCQlmb3IgKGF0dHJDaGsgPSAxOyBhdHRyQ2hrIDw9IG5h dHRzOyBhdHRyQ2hrKyspCisgCQkJeworIAkJCQlpZiAob25lcmVsLT5yZF9hdHQtPmF0dHJz W2F0dHJDaGsgLSAxXS0+YXR0bm90bnVsbCAmJgorIAkJCQkJaGVhcF9hdHRpc251bGwodHVw bGUsIGF0dHJDaGspKQorIAkJCQl7CisgCQkJCQlzYW1wbGVfaXQgPSBmYWxzZTsKKyAJCQkJ CWJyZWFrOworIAkJCQl9CisgCQkJfQorIAkJfQorIAorIAkJaWYgKCFzYW1wbGVfaXQpCisg CQl7CisgCQkJaW52YWxyb3dzICs9IDE7CisgCQkJaGVhcF9mcmVldHVwbGUodHVwbGUpOwor IAkJCWNvbnRpbnVlOworIAkJfQorIAorIAkJLyoKKyAJCSAqIFRoZSBmaXJzdCB0YXJncm93 cyBzYW1wbGUgcm93cyBhcmUgc2ltcGx5IGNvcGllZCBpbnRvIHRoZQorIAkJICogcmVzZXJ2 b2lyLiBUaGVuIHdlIHN0YXJ0IHJlcGxhY2luZyB0dXBsZXMgaW4gdGhlIHNhbXBsZQorIAkJ ICogdW50aWwgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgcmVsYXRpb24uCVRoaXMgYWxnb3Jp dGhtIGlzCisgCQkgKiBmcm9tIEplZmYgVml0dGVyJ3MgcGFwZXIgKHNlZSBmdWxsIGNpdGF0 aW9uIGJlbG93KS4gSXQKKyAJCSAqIHdvcmtzIGJ5IHJlcGVhdGVkbHkgY29tcHV0aW5nIHRo ZSBudW1iZXIgb2YgdHVwbGVzIHRvIHNraXAKKyAJCSAqIGJlZm9yZSBzZWxlY3RpbmcgYSB0 dXBsZSwgd2hpY2ggcmVwbGFjZXMgYSByYW5kb21seSBjaG9zZW4KKyAJCSAqIGVsZW1lbnQg b2YgdGhlIHJlc2Vydm9pciAoY3VycmVudCBzZXQgb2YgdHVwbGVzKS4gIEF0IGFsbAorIAkJ ICogdGltZXMgdGhlIHJlc2Vydm9pciBpcyBhIHRydWUgcmFuZG9tIHNhbXBsZSBvZiB0aGUg dHVwbGVzCisgCQkgKiB3ZSd2ZSBwYXNzZWQgb3ZlciBzbyBmYXIsIHNvIHdoZW4gd2UgZmFs bCBvZmYgdGhlIGVuZCBvZgorIAkJICogdGhlIHJlbGF0aW9uIHdlJ3JlIGRvbmUuCisgCQkg Ki8KKyAJCWlmIChudW1yb3dzIDwgdGFyZ3Jvd3MpCisgCQkJcm93c1tudW1yb3dzKytdID0g aGVhcF9jb3B5dHVwbGUodHVwbGUpOworIAkJZWxzZQorIAkJeworIAkJCS8qCisgCQkJICog dCBpbiBWaXR0ZXIncyBwYXBlciBpcyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgYWxyZWFkeQor IAkJCSAqIHByb2Nlc3NlZC4gIElmIHdlIG5lZWQgdG8gY29tcHV0ZSBhIG5ldyBTIHZhbHVl LCB3ZQorIAkJCSAqIG11c3QgdXNlIHRoZSBub3QteWV0LWluY3JlbWVudGVkIHZhbHVlIG9m IHNhbXBsZXJvd3MgYXMKKyAJCQkgKiB0LgorIAkJCSAqLworIAkJCWlmIChyb3dzdG9za2lw IDwgMCkKKyAJCQkJcm93c3Rvc2tpcCA9IGdldF9uZXh0X1ModmFsaWRyb3dzLCB0YXJncm93 cywgJnJzdGF0ZSk7CisgCisgCQkJaWYgKHJvd3N0b3NraXAgPD0gMCkKKyAJCQl7CisgCQkJ CS8qCisgCQkJCSAqIEZvdW5kIGEgc3VpdGFibGUgdHVwbGUsIHNvIHNhdmUgaXQsIHJlcGxh Y2luZyBvbmUKKyAJCQkJICogb2xkIHR1cGxlIGF0IHJhbmRvbQorIAkJCQkgKi8KKyAJCQkJ aW50IGsgPSAoaW50KSAodGFyZ3Jvd3MgKiByYW5kb21fZnJhY3QoKSk7CisgCisgCQkJCUFz c2VydChrID49IDAgJiYgayA8IHRhcmdyb3dzKTsKKyAJCQkJaGVhcF9mcmVldHVwbGUocm93 c1trXSk7CisgCQkJCXJvd3Nba10gPSBoZWFwX2NvcHl0dXBsZSh0dXBsZSk7CisgCQkJfQor IAorIAkJCXJvd3N0b3NraXAgLT0gMTsKKyAJCX0KKyAKKyAJCXZhbGlkcm93cyArPSAxOwor IAkJaGVhcF9mcmVldHVwbGUodHVwbGUpOworIAl9CisgCisgCS8qIFJlbW92ZSBlcnJvciBj YWxsYmFjay4gKi8KKyAJZXJyb3JfY29udGV4dF9zdGFjayA9IGVycmNvbnRleHQucHJldmlv dXM7CisgCisgCSp0b3RhbHJvd3MgPSB2YWxpZHJvd3M7CisgCSp0b3RhbGRlYWRyb3dzID0g MDsKKyAKKyAJRW5kQ29weUZyb20oY3N0YXRlKTsKKyAKKyAJcGZyZWUodmFsdWVzKTsKKyAJ cGZyZWUobnVsbHMpOworIAorIAkvKgorIAkgKiBFbWl0IHNvbWUgaW50ZXJlc3RpbmcgcmVs YXRpb24gaW5mbworIAkgKi8KKyAJZXJlcG9ydChlbGV2ZWwsCisgCQkJKGVycm1zZygiXCIl c1wiOiBzY2FubmVkLCAiCisgCQkJCQkiY29udGFpbmluZyAlZCB2YWxpZCByb3dzIGFuZCAl ZCBpbnZhbGlkIHJvd3M7ICIKKyAJCQkJCSIlZCByb3dzIGluIHNhbXBsZSwgJWQgdG90YWwg cm93cyIsCisgCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShvbmVyZWwpLAorIAkJCQkJ KGludCkgdmFsaWRyb3dzLCBpbnZhbHJvd3MsCisgCQkJCQludW1yb3dzLCAoaW50KSAqdG90 YWxyb3dzKSkpOworIAorIAlyZXR1cm4gbnVtcm93czsKKyB9CioqKiBhL2NvbnRyaWIvZmls ZV9mZHcvaW5wdXQvZmlsZV9mZHcuc291cmNlCi0tLSBiL2NvbnRyaWIvZmlsZV9mZHcvaW5w dXQvZmlsZV9mZHcuc291cmNlCioqKioqKioqKioqKioqKgoqKiogMTExLDExNiAqKioqIEVY RUNVVEUgc3QoMTAwKTsKLS0tIDExMSwxMjEgLS0tLQogIEVYRUNVVEUgc3QoMTAwKTsKICBE RUFMTE9DQVRFIHN0OwogIAorIC0tIHN0YXRpc3RpY3MgY29sbGVjdGlvbiB0ZXN0cworIEFO QUxZWkUgYWdnX2NzdjsKKyBTRUxFQ1QgcmVscGFnZXMsIHJlbHR1cGxlcyBGUk9NIHBnX2Ns YXNzIFdIRVJFIHJlbG5hbWUgPSAnYWdnX2Nzdic7CisgU0VMRUNUICogRlJPTSBwZ19zdGF0 cyBXSEVSRSB0YWJsZW5hbWUgPSAnYWdnX2Nzdic7CisgCiAgLS0gdGFibGVvaWQKICBTRUxF Q1QgdGFibGVvaWQ6OnJlZ2NsYXNzLCBiIEZST00gYWdnX2NzdjsKICAKKioqIGEvY29udHJp Yi9maWxlX2Zkdy9vdXRwdXQvZmlsZV9mZHcuc291cmNlCi0tLSBiL2NvbnRyaWIvZmlsZV9m ZHcvb3V0cHV0L2ZpbGVfZmR3LnNvdXJjZQoqKioqKioqKioqKioqKioKKioqIDE3NCwxNzkg KioqKiBFWEVDVVRFIHN0KDEwMCk7Ci0tLSAxNzQsMTk0IC0tLS0KICAoMSByb3cpCiAgCiAg REVBTExPQ0FURSBzdDsKKyAtLSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gdGVzdHMKKyBBTkFM WVpFIGFnZ19jc3Y7CisgU0VMRUNUIHJlbHBhZ2VzLCByZWx0dXBsZXMgRlJPTSBwZ19jbGFz cyBXSEVSRSByZWxuYW1lID0gJ2FnZ19jc3YnOworICByZWxwYWdlcyB8IHJlbHR1cGxlcyAK KyAtLS0tLS0tLS0tKy0tLS0tLS0tLS0tCisgICAgICAgICAxIHwgICAgICAgICAzCisgKDEg cm93KQorIAorIFNFTEVDVCAqIEZST00gcGdfc3RhdHMgV0hFUkUgdGFibGVuYW1lID0gJ2Fn Z19jc3YnOworICBzY2hlbWFuYW1lIHwgdGFibGVuYW1lIHwgYXR0bmFtZSB8IGluaGVyaXRl ZCB8IG51bGxfZnJhYyB8IGF2Z193aWR0aCB8IG5fZGlzdGluY3QgfCBtb3N0X2NvbW1vbl92 YWxzIHwgbW9zdF9jb21tb25fZnJlcXMgfCAgICBoaXN0b2dyYW1fYm91bmRzICAgICB8IGNv cnJlbGF0aW9uIAorIC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLQorICBwdWJsaWMgICAgIHwgYWdnX2NzdiAgIHwgYSAgICAgICB8IGYg ICAgICAgICB8ICAgICAgICAgMCB8ICAgICAgICAgMiB8ICAgICAgICAgLTEgfCAgICAgICAg ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCB7MCw0MiwxMDB9ICAgICAgICAgICAg ICB8ICAgICAgICAtMC41CisgIHB1YmxpYyAgICAgfCBhZ2dfY3N2ICAgfCBiICAgICAgIHwg ZiAgICAgICAgIHwgICAgICAgICAwIHwgICAgICAgICA0IHwgICAgICAgICAtMSB8ICAgICAg ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8IHswLjA5NTYxLDk5LjA5NywzMjQu Nzh9IHwgICAgICAgICAwLjUKKyAoMiByb3dzKQorIAogIC0tIHRhYmxlb2lkCiAgU0VMRUNU IHRhYmxlb2lkOjpyZWdjbGFzcywgYiBGUk9NIGFnZ19jc3Y7CiAgIHRhYmxlb2lkIHwgICAg YiAgICAKKioqIGEvZG9jL3NyYy9zZ21sL2Zkd2hhbmRsZXIuc2dtbAotLS0gYi9kb2Mvc3Jj L3NnbWwvZmR3aGFuZGxlci5zZ21sCioqKioqKioqKioqKioqKgoqKiogMjI4LDIzMyAqKioq IEVuZEZvcmVpZ25TY2FuIChGb3JlaWduU2NhblN0YXRlICpub2RlKTsKLS0tIDIyOCwyNTcg LS0tLQogICAgICA8L3BhcmE+CiAgCiAgICAgIDxwYXJhPgorIDxwcm9ncmFtbGlzdGluZz4K KyB2b2lkCisgQW5hbHl6ZUZvcmVpZ25UYWJsZSAoUmVsYXRpb24gb25lcmVsLAorICAgICAg ICAgICAgICAgICAgICAgIFZhY3V1bVN0bXQgKnZhY3N0bXQsIAorICAgICAgICAgICAgICAg ICAgICAgIGludCBlbGV2ZWwpOworIDwvcHJvZ3JhbWxpc3Rpbmc+CisgCisgICAgICBDb2xs ZWN0IHN0YXRpc3RpY3Mgb24gYSBmb3JlaWduIHRhYmxlIGFuZCBzdG9yZSB0aGUgcmVzdWx0 cyBpbiB0aGUKKyAgICAgIHBnX2NsYXNzIGFuZCBwZ19zdGF0aXN0aWNzIHN5c3RlbSBjYXRh bG9ncy4KKyAgICAgIFRoaXMgaXMgb3B0aW9uYWwsIGFuZCBpZiBpbXBsZW1lbnRlZCwgY2Fs bGVkIHdoZW4gPGNvbW1hbmQ+QU5BTFlaRQorICAgICAgPC8+IGNvbW1hbmQgaXMgcnVuLgor ICAgICAgVGhlIHN0YXRpc3RpY3MgYXJlIHVzZWQgYnkgdGhlIHF1ZXJ5IHBsYW5uZXIgaW4g b3JkZXIgdG8gbWFrZSBnb29kCisgICAgICBjaG9pY2VzIG9mIHF1ZXJ5IHBsYW5zLgorICAg ICAgVGhlIGZ1bmN0aW9uIGNhbiBiZSBpbXBsZW1lbnRlZCBieSB3cml0aW5nIGEgc2FtcGxp bmcgZnVuY3Rpb24gdGhhdAorICAgICAgYWNxdWlyZXMgYSByYW5kb20gc2FtcGxlIG9mIHJv d3MgZnJvbSBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZSBhbmQKKyAgICAgIHRoZW4gYnkgY2Fs bGluZyA8ZnVuY3Rpb24+ZG9fYW5hbHl6ZV9yZWw8Lz4sIHdoZXJlIHlvdSBzaG91bGQgcGFz cworICAgICAgdGhlIHNhbXBsaW5nIGZ1bmN0aW9uIGFzIGFuIGFyZ3VtZW50LgorICAgICAg T3IgdGhlIGZ1bmN0aW9uIGNhbiBiZSBkaXJlY3RseSBpbXBsZW1lbnRlZCB0byBnZXQgdGhl IHN0YXRpc3RpY3MKKyAgICAgIGZyb20gYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UsIHRyYW5z Zm9ybSBpdCBpZiBuZWNjZXNhcnksIGFuZCBzdG9yZQorICAgICAgaXQgaW4gdGhlIHBnX2Ns YXNzIGFuZCBwZ19zdGF0aXN0aWNzIHN5c3RlbSBjYXRhbG9ncy4KKyAgICAgIFRoZSBmdW5j dGlvbiBtdXN0IGJlIHNldCB0byBOVUxMIGlmIGl0IGlzbid0IGltcGxlbWVudGVkLgorICAg ICA8L3BhcmE+CisgCisgICAgIDxwYXJhPgogICAgICAgVGhlIDxzdHJ1Y3RuYW1lPkZkd1Jv dXRpbmU8Lz4gYW5kIDxzdHJ1Y3RuYW1lPkZkd1BsYW48Lz4gc3RydWN0IHR5cGVzCiAgICAg ICBhcmUgZGVjbGFyZWQgaW4gPGZpbGVuYW1lPnNyYy9pbmNsdWRlL2ZvcmVpZ24vZmR3YXBp Lmg8Lz4sIHdoaWNoIHNlZQogICAgICAgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KKioqIGEv ZG9jL3NyYy9zZ21sL21haW50ZW5hbmNlLnNnbWwKLS0tIGIvZG9jL3NyYy9zZ21sL21haW50 ZW5hbmNlLnNnbWwKKioqKioqKioqKioqKioqCioqKiAyNzksMjg0ICoqKioKLS0tIDI3OSwy ODggLS0tLQogICAgICA8Y29tbWFuZD5BTkFMWVpFPC8+IHN0cmljdGx5IGFzIGEgZnVuY3Rp b24gb2YgdGhlIG51bWJlciBvZiByb3dzCiAgICAgIGluc2VydGVkIG9yIHVwZGF0ZWQ7IGl0 IGhhcyBubyBrbm93bGVkZ2Ugb2Ygd2hldGhlciB0aGF0IHdpbGwgbGVhZAogICAgICB0byBt ZWFuaW5nZnVsIHN0YXRpc3RpY2FsIGNoYW5nZXMuCisgICAgIE5vdGUgdGhhdCB0aGUgYXV0 b3ZhY3V1bSBkYWVtb24gZG9lcyBub3QgaXNzdWUgPGNvbW1hbmQ+QU5BTFlaRTwvPgorICAg ICBjb21tYW5kcyBvbiBmb3JlaWduIHRhYmxlcy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHJ1 biBtYW51YWxseS1tYW5hZ2VkCisgICAgIDxjb21tYW5kPkFOQUxZWkU8Lz4gY29tbWFuZHMg YXMgbmVlZGVkLCB3aGljaCB0eXBpY2FsbHkgYXJlIGV4ZWN1dGVkCisgICAgIGFjY29yZGlu ZyB0byBhIHNjaGVkdWxlIGJ5IGNyb24gb3IgVGFzayBTY2hlZHVsZXIgc2NyaXB0cy4KICAg ICA8L3BhcmE+CiAgCiAgICAgPHBhcmE+CioqKiBhL2RvYy9zcmMvc2dtbC9yZWYvYWx0ZXJf Zm9yZWlnbl90YWJsZS5zZ21sCi0tLSBiL2RvYy9zcmMvc2dtbC9yZWYvYWx0ZXJfZm9yZWln bl90YWJsZS5zZ21sCioqKioqKioqKioqKioqKgoqKiogMzYsNDEgKioqKiBBTFRFUiBGT1JF SUdOIFRBQkxFIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5uYW1lPC9yZXBsYWNl YWJsZT4KLS0tIDM2LDQ0IC0tLS0KICAgICAgRFJPUCBbIENPTFVNTiBdIFsgSUYgRVhJU1RT IF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmNvbHVtbjwvcmVwbGFjZWFibGU+ IFsgUkVTVFJJQ1QgfCBDQVNDQURFIF0KICAgICAgQUxURVIgWyBDT0xVTU4gXSA8cmVwbGFj ZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+Y29sdW1uPC9yZXBsYWNlYWJsZT4gWyBTRVQgREFU QSBdIFRZUEUgPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPnR5cGU8L3JlcGxhY2Vh YmxlPgogICAgICBBTFRFUiBbIENPTFVNTiBdIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1F VEVSIj5jb2x1bW48L3JlcGxhY2VhYmxlPiB7IFNFVCB8IERST1AgfSBOT1QgTlVMTAorICAg ICBBTFRFUiBbIENPTFVNTiBdIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5jb2x1 bW48L3JlcGxhY2VhYmxlPiBTRVQgU1RBVElTVElDUyA8cmVwbGFjZWFibGUgY2xhc3M9IlBB UkFNRVRFUiI+aW50ZWdlcjwvcmVwbGFjZWFibGU+CisgICAgIEFMVEVSIFsgQ09MVU1OIF0g PHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmNvbHVtbjwvcmVwbGFjZWFibGU+IFNF VCAoIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5hdHRyaWJ1dGVfb3B0aW9uPC9y ZXBsYWNlYWJsZT4gPSA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+dmFsdWU8L3Jl cGxhY2VhYmxlPiBbLCAuLi4gXSApCisgICAgIEFMVEVSIFsgQ09MVU1OIF0gPHJlcGxhY2Vh YmxlIGNsYXNzPSJQQVJBTUVURVIiPmNvbHVtbjwvcmVwbGFjZWFibGU+IFJFU0VUICggPHJl cGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmF0dHJpYnV0ZV9vcHRpb248L3JlcGxhY2Vh YmxlPiBbLCAuLi4gXSApCiAgICAgIEFMVEVSIFsgQ09MVU1OIF0gPHJlcGxhY2VhYmxlIGNs YXNzPSJQQVJBTUVURVIiPmNvbHVtbjwvcmVwbGFjZWFibGU+IE9QVElPTlMgKCBbIEFERCB8 IFNFVCB8IERST1AgXSA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+b3B0aW9uPC9y ZXBsYWNlYWJsZT4gWyc8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+dmFsdWU8L3Jl cGxhY2VhYmxlPiddIFssIC4uLiBdKQogICAgICBPV05FUiBUTyA8cmVwbGFjZWFibGUgY2xh c3M9IlBBUkFNRVRFUiI+bmV3X293bmVyPC9yZXBsYWNlYWJsZT4KICAgICAgT1BUSU9OUyAo IFsgQUREIHwgU0VUIHwgRFJPUCBdIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5v cHRpb248L3JlcGxhY2VhYmxlPiBbJzxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj52 YWx1ZTwvcmVwbGFjZWFibGU+J10gWywgLi4uIF0pCioqKioqKioqKioqKioqKgoqKiogOTQs OTkgKioqKiBBTFRFUiBGT1JFSUdOIFRBQkxFIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1F VEVSIj5uYW1lPC9yZXBsYWNlYWJsZT4KLS0tIDk3LDE0NiAtLS0tCiAgICAgPC92YXJsaXN0 ZW50cnk+CiAgCiAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgPHRlcm0+PGxpdGVyYWw+U0VU IFNUQVRJU1RJQ1M8L2xpdGVyYWw+PC90ZXJtPgorICAgICA8bGlzdGl0ZW0+CisgICAgICA8 cGFyYT4KKyAgICAgICBUaGlzIGZvcm0KKyAgICAgICBzZXRzIHRoZSBwZXItY29sdW1uIHN0 YXRpc3RpY3MtZ2F0aGVyaW5nIHRhcmdldCBmb3Igc3Vic2VxdWVudAorICAgICAgIDx4cmVm IGxpbmtlbmQ9InNxbC1hbmFseXplIj4gb3BlcmF0aW9ucy4KKyAgICAgICBUaGUgdGFyZ2V0 IGNhbiBiZSBzZXQgaW4gdGhlIHJhbmdlIDAgdG8gMTAwMDA7IGFsdGVybmF0aXZlbHksIHNl dCBpdAorICAgICAgIHRvIC0xIHRvIHJldmVydCB0byB1c2luZyB0aGUgc3lzdGVtIGRlZmF1 bHQgc3RhdGlzdGljcworICAgICAgIHRhcmdldCAoPHhyZWYgbGlua2VuZD0iZ3VjLWRlZmF1 bHQtc3RhdGlzdGljcy10YXJnZXQiPikuCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlzdGl0 ZW0+CisgICAgPC92YXJsaXN0ZW50cnk+CisgCisgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAg PHRlcm0+PGxpdGVyYWw+U0VUICggPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmF0 dHJpYnV0ZV9vcHRpb248L3JlcGxhY2VhYmxlPiA9IDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFS QU1FVEVSIj52YWx1ZTwvcmVwbGFjZWFibGU+IFssIC4uLiBdICk8L2xpdGVyYWw+PC90ZXJt PgorICAgICA8dGVybT48bGl0ZXJhbD5SRVNFVCAoIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFS QU1FVEVSIj5hdHRyaWJ1dGVfb3B0aW9uPC9yZXBsYWNlYWJsZT4gWywgLi4uIF0gKTwvbGl0 ZXJhbD48L3Rlcm0+CisgICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgIFRo aXMgZm9ybQorICAgICAgIHNldHMgb3IgcmVzZXRzIGEgcGVyLWF0dHJpYnV0ZSBvcHRpb24u ICBDdXJyZW50bHksIHRoZSBvbmx5IGRlZmluZWQKKyAgICAgICBwZXItYXR0cmlidXRlIG9w dGlvbiBpcyA8bGl0ZXJhbD5uX2Rpc3RpbmN0PC8+LCB3aGljaCBvdmVycmlkZXMKKyAgICAg ICB0aGUgbnVtYmVyLW9mLWRpc3RpbmN0LXZhbHVlcyBlc3RpbWF0ZXMgbWFkZSBieSBzdWJz ZXF1ZW50CisgICAgICAgPHhyZWYgbGlua2VuZD0ic3FsLWFuYWx5emUiPiBvcGVyYXRpb25z LiAKKyAgICAgICBXaGVuIHNldCB0byBhIHBvc2l0aXZlIHZhbHVlLCA8Y29tbWFuZD5BTkFM WVpFPC8+IHdpbGwgYXNzdW1lIHRoYXQKKyAgICAgICB0aGUgY29sdW1uIGNvbnRhaW5zIGV4 YWN0bHkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGlzdGluY3Qgbm9ubnVsbAorICAgICAg IHZhbHVlcy4KKyAgICAgICBXaGVuIHNldCB0byBhIG5lZ2F0aXZlIHZhbHVlLCB3aGljaCBt dXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgICAgIHRvIC0xLCA8Y29tbWFuZD5B TkFMWVpFPC8+IHdpbGwgYXNzdW1lIHRoYXQgdGhlIG51bWJlciBvZiBkaXN0aW5jdAorICAg ICAgIG5vbm51bGwgdmFsdWVzIGluIHRoZSBjb2x1bW4gaXMgbGluZWFyIGluIHRoZSBzaXpl IG9mIHRoZSBmb3JlaWduCisgICAgICAgdGFibGU7IHRoZSBleGFjdCBjb3VudCBpcyB0byBi ZSBjb21wdXRlZCBieSBtdWx0aXBseWluZyB0aGUgZXN0aW1hdGVkCisgICAgICAgZm9yZWln biB0YWJsZSBzaXplIGJ5IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbnVtYmVy LgorICAgICAgIEZvciBleGFtcGxlLAorICAgICAgIGEgdmFsdWUgb2YgLTEgaW1wbGllcyB0 aGF0IGFsbCB2YWx1ZXMgaW4gdGhlIGNvbHVtbiBhcmUgZGlzdGluY3QsCisgICAgICAgd2hp bGUgYSB2YWx1ZSBvZiAtMC41IGltcGxpZXMgdGhhdCBlYWNoIHZhbHVlIGFwcGVhcnMgdHdp Y2Ugb24gdGhlCisgICAgICAgYXZlcmFnZS4KKyAgICAgICBUaGlzIGNhbiBiZSB1c2VmdWwg d2hlbiB0aGUgc2l6ZSBvZiB0aGUgZm9yZWlnbiB0YWJsZSBjaGFuZ2VzIG92ZXIKKyAgICAg ICB0aW1lLCBzaW5jZSB0aGUgbXVsdGlwbGljYXRpb24gYnkgdGhlIG51bWJlciBvZiByb3dz IGluIHRoZSBmb3JlaWduCisgICAgICAgdGFibGUgaXMgbm90IHBlcmZvcm1lZCB1bnRpbCBx dWVyeSBwbGFubmluZyB0aW1lLiAgU3BlY2lmeSBhIHZhbHVlCisgICAgICAgb2YgMCB0byBy ZXZlcnQgdG8gZXN0aW1hdGluZyB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHZhbHVlcyBub3Jt YWxseS4KKyAgICAgIDwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICA8L3Zhcmxpc3Rl bnRyeT4KKyAKKyAgICA8dmFybGlzdGVudHJ5PgogICAgICA8dGVybT48bGl0ZXJhbD5PV05F UjwvbGl0ZXJhbD48L3Rlcm0+CiAgICAgIDxsaXN0aXRlbT4KICAgICAgIDxwYXJhPgoqKiog YS9kb2Mvc3JjL3NnbWwvcmVmL2FuYWx5emUuc2dtbAotLS0gYi9kb2Mvc3JjL3NnbWwvcmVm L2FuYWx5emUuc2dtbAoqKioqKioqKioqKioqKioKKioqIDM5LDQ3ICoqKiogQU5BTFlaRSBb IFZFUkJPU0UgXSBbIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj50YWJsZTwvcmVw bGFjZWFibGU+IFsgKCA8cmUKICAKICAgIDxwYXJhPgogICAgIFdpdGggbm8gcGFyYW1ldGVy LCA8Y29tbWFuZD5BTkFMWVpFPC9jb21tYW5kPiBleGFtaW5lcyBldmVyeSB0YWJsZSBpbiB0 aGUKISAgICBjdXJyZW50IGRhdGFiYXNlLiAgV2l0aCBhIHBhcmFtZXRlciwgPGNvbW1hbmQ+ QU5BTFlaRTwvY29tbWFuZD4gZXhhbWluZXMKISAgICBvbmx5IHRoYXQgdGFibGUuICBJdCBp cyBmdXJ0aGVyIHBvc3NpYmxlIHRvIGdpdmUgYSBsaXN0IG9mIGNvbHVtbiBuYW1lcywKISAg ICBpbiB3aGljaCBjYXNlIG9ubHkgdGhlIHN0YXRpc3RpY3MgZm9yIHRob3NlIGNvbHVtbnMg YXJlIGNvbGxlY3RlZC4KICAgIDwvcGFyYT4KICAgPC9yZWZzZWN0MT4KICAKLS0tIDM5LDQ5 IC0tLS0KICAKICAgIDxwYXJhPgogICAgIFdpdGggbm8gcGFyYW1ldGVyLCA8Y29tbWFuZD5B TkFMWVpFPC9jb21tYW5kPiBleGFtaW5lcyBldmVyeSB0YWJsZSBpbiB0aGUKISAgICBjdXJy ZW50IGRhdGFiYXNlIGV4Y2VwdCBmb3IgZm9yZWlnbiB0YWJsZXMuICBXaXRoIGEgcGFyYW1l dGVyLCA8Y29tbWFuZD4KISAgICBBTkFMWVpFPC9jb21tYW5kPiBleGFtaW5lcyBvbmx5IHRo YXQgdGFibGUuICBGb3IgYSBmb3JlaWduIHRhYmxlLCBpdCBpcwohICAgIG5lY2Vzc2FyeSB0 byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoYXQgdGFibGUuICBJdCBpcyBmdXJ0aGVyIHBvc3Np YmxlIHRvIAohICAgIGdpdmUgYSBsaXN0IG9mIGNvbHVtbiBuYW1lcywgaW4gd2hpY2ggY2Fz ZSBvbmx5IHRoZSBzdGF0aXN0aWNzIGZvciB0aG9zZQohICAgIGNvbHVtbnMgYXJlIGNvbGxl Y3RlZC4KICAgIDwvcGFyYT4KICAgPC9yZWZzZWN0MT4KICAKKioqKioqKioqKioqKioqCioq KiA2Myw2OSAqKioqIEFOQUxZWkUgWyBWRVJCT1NFIF0gWyA8cmVwbGFjZWFibGUgY2xhc3M9 IlBBUkFNRVRFUiI+dGFibGU8L3JlcGxhY2VhYmxlPiBbICggPHJlCiAgICAgIDxsaXN0aXRl bT4KICAgICAgIDxwYXJhPgogICAgICAgIFRoZSBuYW1lIChwb3NzaWJseSBzY2hlbWEtcXVh bGlmaWVkKSBvZiBhIHNwZWNpZmljIHRhYmxlIHRvCiEgICAgICAgYW5hbHl6ZS4gRGVmYXVs dHMgdG8gYWxsIHRhYmxlcyBpbiB0aGUgY3VycmVudCBkYXRhYmFzZS4KICAgICAgIDwvcGFy YT4KICAgICAgPC9saXN0aXRlbT4KICAgICA8L3Zhcmxpc3RlbnRyeT4KLS0tIDY1LDcyIC0t LS0KICAgICAgPGxpc3RpdGVtPgogICAgICAgPHBhcmE+CiAgICAgICAgVGhlIG5hbWUgKHBv c3NpYmx5IHNjaGVtYS1xdWFsaWZpZWQpIG9mIGEgc3BlY2lmaWMgdGFibGUgdG8KISAgICAg ICBhbmFseXplLiBEZWZhdWx0cyB0byBhbGwgdGFibGVzIGluIHRoZSBjdXJyZW50IGRhdGFi YXNlIGV4Y2VwdAohICAgICAgIGZvciBmb3JlaWduIHRhYmxlcy4KICAgICAgIDwvcGFyYT4K ICAgICAgPC9saXN0aXRlbT4KICAgICA8L3Zhcmxpc3RlbnRyeT4KKioqKioqKioqKioqKioq CioqKiAxMzcsMTQzICoqKiogQU5BTFlaRSBbIFZFUkJPU0UgXSBbIDxyZXBsYWNlYWJsZSBj bGFzcz0iUEFSQU1FVEVSIj50YWJsZTwvcmVwbGFjZWFibGU+IFsgKCA8cmUKICAgICBJbiBy YXJlIHNpdHVhdGlvbnMsIHRoaXMgbm9uLWRldGVybWluaXNtIHdpbGwgY2F1c2UgdGhlIHBs YW5uZXIncwogICAgIGNob2ljZXMgb2YgcXVlcnkgcGxhbnMgdG8gY2hhbmdlIGFmdGVyIDxj b21tYW5kPkFOQUxZWkU8L2NvbW1hbmQ+IGlzIHJ1bi4KICAgICBUbyBhdm9pZCB0aGlzLCBy YWlzZSB0aGUgYW1vdW50IG9mIHN0YXRpc3RpY3MgY29sbGVjdGVkIGJ5CiEgICAgPGNvbW1h bmQ+QU5BTFlaRTwvY29tbWFuZD4sIGFzIGRlc2NyaWJlZCBiZWxvdy4KICAgIDwvcGFyYT4K ICAKICAgIDxwYXJhPgotLS0gMTQwLDE0OCAtLS0tCiAgICAgSW4gcmFyZSBzaXR1YXRpb25z LCB0aGlzIG5vbi1kZXRlcm1pbmlzbSB3aWxsIGNhdXNlIHRoZSBwbGFubmVyJ3MKICAgICBj aG9pY2VzIG9mIHF1ZXJ5IHBsYW5zIHRvIGNoYW5nZSBhZnRlciA8Y29tbWFuZD5BTkFMWVpF PC9jb21tYW5kPiBpcyBydW4uCiAgICAgVG8gYXZvaWQgdGhpcywgcmFpc2UgdGhlIGFtb3Vu dCBvZiBzdGF0aXN0aWNzIGNvbGxlY3RlZCBieQohICAgIDxjb21tYW5kPkFOQUxZWkU8L2Nv bW1hbmQ+LCBhcyBkZXNjcmliZWQgYmVsb3cuICBOb3RlIHRoYXQgdGhlIHRpbWUKISAgICBu ZWVkZWQgdG8gYW5hbHl6ZSBvbiBmb3JlaWduIHRhYmxlcyBkZXBlbmRzIG9uIHRoZSBpbXBs ZW1lbnRhdGlvbiBvZgohICAgIHRoZSBmb3JlaWduIGRhdGEgd3JhcHBlciB2aWEgd2hpY2gg c3VjaCB0YWJsZXMgYXJlIGF0dGFjaGVkLgogICAgPC9wYXJhPgogIAogICAgPHBhcmE+Cioq KiBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FuYWx5emUuYwotLS0gYi9zcmMvYmFja2VuZC9j b21tYW5kcy9hbmFseXplLmMKKioqKioqKioqKioqKioqCioqKiAyMywyOCAqKioqCi0tLSAy MywyOSAtLS0tCiAgI2luY2x1ZGUgImFjY2Vzcy94YWN0LmgiCiAgI2luY2x1ZGUgImNhdGFs b2cvaW5kZXguaCIKICAjaW5jbHVkZSAiY2F0YWxvZy9pbmRleGluZy5oIgorICNpbmNsdWRl ICJjYXRhbG9nL3BnX2NsYXNzLmgiCiAgI2luY2x1ZGUgImNhdGFsb2cvcGdfY29sbGF0aW9u LmgiCiAgI2luY2x1ZGUgImNhdGFsb2cvcGdfaW5oZXJpdHNfZm4uaCIKICAjaW5jbHVkZSAi Y2F0YWxvZy9wZ19uYW1lc3BhY2UuaCIKKioqKioqKioqKioqKioqCioqKiAzMCwzNSAqKioq Ci0tLSAzMSwzOCAtLS0tCiAgI2luY2x1ZGUgImNvbW1hbmRzL3RhYmxlY21kcy5oIgogICNp bmNsdWRlICJjb21tYW5kcy92YWN1dW0uaCIKICAjaW5jbHVkZSAiZXhlY3V0b3IvZXhlY3V0 b3IuaCIKKyAjaW5jbHVkZSAiZm9yZWlnbi9mb3JlaWduLmgiCisgI2luY2x1ZGUgImZvcmVp Z24vZmR3YXBpLmgiCiAgI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogICNpbmNsdWRlICJub2Rl cy9ub2RlRnVuY3MuaCIKICAjaW5jbHVkZSAicGFyc2VyL3BhcnNlX29wZXIuaCIKKioqKioq KioqKioqKioqCioqKiA3OCw5MSAqKioqIHR5cGVkZWYgc3RydWN0IEFubEluZGV4RGF0YQog IGludAkJCWRlZmF1bHRfc3RhdGlzdGljc190YXJnZXQgPSAxMDA7CiAgCiAgLyogQSBmZXcg dmFyaWFibGVzIHRoYXQgZG9uJ3Qgc2VlbSB3b3J0aCBwYXNzaW5nIGFyb3VuZCBhcyBwYXJh bWV0ZXJzICovCi0gc3RhdGljIGludAllbGV2ZWwgPSAtMTsKLSAKICBzdGF0aWMgTWVtb3J5 Q29udGV4dCBhbmxfY29udGV4dCA9IE5VTEw7CiAgCiAgc3RhdGljIEJ1ZmZlckFjY2Vzc1N0 cmF0ZWd5IHZhY19zdHJhdGVneTsKICAKICAKLSBzdGF0aWMgdm9pZCBkb19hbmFseXplX3Jl bChSZWxhdGlvbiBvbmVyZWwsIFZhY3V1bVN0bXQgKnZhY3N0bXQsIGJvb2wgaW5oKTsKICBz dGF0aWMgdm9pZCBCbG9ja1NhbXBsZXJfSW5pdChCbG9ja1NhbXBsZXIgYnMsIEJsb2NrTnVt YmVyIG5ibG9ja3MsCiAgCQkJCSAgaW50IHNhbXBsZXNpemUpOwogIHN0YXRpYyBib29sIEJs b2NrU2FtcGxlcl9IYXNNb3JlKEJsb2NrU2FtcGxlciBicyk7Ci0tLSA4MSw5MSAtLS0tCioq KioqKioqKioqKioqKgoqKiogOTYsMTEwICoqKiogc3RhdGljIHZvaWQgY29tcHV0ZV9pbmRl eF9zdGF0cyhSZWxhdGlvbiBvbmVyZWwsIGRvdWJsZSB0b3RhbHJvd3MsCiAgCQkJCQlNZW1v cnlDb250ZXh0IGNvbF9jb250ZXh0KTsKICBzdGF0aWMgVmFjQXR0clN0YXRzICpleGFtaW5l X2F0dHJpYnV0ZShSZWxhdGlvbiBvbmVyZWwsIGludCBhdHRudW0sCiAgCQkJCSAgTm9kZSAq aW5kZXhfZXhwcik7CiEgc3RhdGljIGludCBhY3F1aXJlX3NhbXBsZV9yb3dzKFJlbGF0aW9u IG9uZXJlbCwgSGVhcFR1cGxlICpyb3dzLAohIAkJCQkJaW50IHRhcmdyb3dzLCBkb3VibGUg KnRvdGFscm93cywgZG91YmxlICp0b3RhbGRlYWRyb3dzKTsKISBzdGF0aWMgZG91YmxlIHJh bmRvbV9mcmFjdCh2b2lkKTsKISBzdGF0aWMgZG91YmxlIGluaXRfc2VsZWN0aW9uX3N0YXRl KGludCBuKTsKISBzdGF0aWMgZG91YmxlIGdldF9uZXh0X1MoZG91YmxlIHQsIGludCBuLCBk b3VibGUgKnN0YXRlcHRyKTsKISBzdGF0aWMgaW50CWNvbXBhcmVfcm93cyhjb25zdCB2b2lk ICphLCBjb25zdCB2b2lkICpiKTsKICBzdGF0aWMgaW50IGFjcXVpcmVfaW5oZXJpdGVkX3Nh bXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwKICAJCQkJCQkJICBIZWFwVHVwbGUgKnJvd3Ms IGludCB0YXJncm93cywKISAJCQkJCQkJICBkb3VibGUgKnRvdGFscm93cywgZG91YmxlICp0 b3RhbGRlYWRyb3dzKTsKICBzdGF0aWMgdm9pZCB1cGRhdGVfYXR0c3RhdHMoT2lkIHJlbGlk LCBib29sIGluaCwKICAJCQkJaW50IG5hdHRzLCBWYWNBdHRyU3RhdHMgKip2YWNhdHRyc3Rh dHMpOwogIHN0YXRpYyBEYXR1bSBzdGRfZmV0Y2hfZnVuYyhWYWNBdHRyU3RhdHNQIHN0YXRz LCBpbnQgcm93bnVtLCBib29sICppc051bGwpOwotLS0gOTYsMTEwIC0tLS0KICAJCQkJCU1l bW9yeUNvbnRleHQgY29sX2NvbnRleHQpOwogIHN0YXRpYyBWYWNBdHRyU3RhdHMgKmV4YW1p bmVfYXR0cmlidXRlKFJlbGF0aW9uIG9uZXJlbCwgaW50IGF0dG51bSwKICAJCQkJICBOb2Rl ICppbmRleF9leHByKTsKISBzdGF0aWMgaW50IGFjcXVpcmVfc2FtcGxlX3Jvd3MoUmVsYXRp b24gb25lcmVsLAohIAkJCQkJCQkgICBIZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywK ISAJCQkJCQkJICAgZG91YmxlICp0b3RhbHJvd3MsIGRvdWJsZSAqdG90YWxkZWFkcm93cywK ISAJCQkJCQkJICAgQmxvY2tOdW1iZXIgKnRvdGFscGFnZXMsIGludCBlbGV2ZWwpOwogIHN0 YXRpYyBpbnQgYWNxdWlyZV9pbmhlcml0ZWRfc2FtcGxlX3Jvd3MoUmVsYXRpb24gb25lcmVs LAogIAkJCQkJCQkgIEhlYXBUdXBsZSAqcm93cywgaW50IHRhcmdyb3dzLAohIAkJCQkJCQkg IGRvdWJsZSAqdG90YWxyb3dzLCBkb3VibGUgKnRvdGFsZGVhZHJvd3MsCiEgCQkJCQkJCSAg QmxvY2tOdW1iZXIgKnRvdGFscGFnZXMsIGludCBlbGV2ZWwpOwohIHN0YXRpYyBpbnQJY29t cGFyZV9yb3dzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOwogIHN0YXRpYyB2b2lk IHVwZGF0ZV9hdHRzdGF0cyhPaWQgcmVsaWQsIGJvb2wgaW5oLAogIAkJCQlpbnQgbmF0dHMs IFZhY0F0dHJTdGF0cyAqKnZhY2F0dHJzdGF0cyk7CiAgc3RhdGljIERhdHVtIHN0ZF9mZXRj aF9mdW5jKFZhY0F0dHJTdGF0c1Agc3RhdHMsIGludCByb3dudW0sIGJvb2wgKmlzTnVsbCk7 CioqKioqKioqKioqKioqKgoqKiogMTE5LDEyNSAqKioqIHN0YXRpYyBib29sIHN0ZF90eXBh bmFseXplKFZhY0F0dHJTdGF0cyAqc3RhdHMpOwotLS0gMTE5LDEyNyAtLS0tCiAgdm9pZAog IGFuYWx5emVfcmVsKE9pZCByZWxpZCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgQnVmZmVyQWNj ZXNzU3RyYXRlZ3kgYnN0cmF0ZWd5KQogIHsKKyAJaW50CQkJZWxldmVsOwogIAlSZWxhdGlv bglvbmVyZWw7CisgCUZkd1JvdXRpbmUgKmZkd3JvdXRpbmU7CiAgCiAgCS8qIFNldCB1cCBz dGF0aWMgdmFyaWFibGVzICovCiAgCWlmICh2YWNzdG10LT5vcHRpb25zICYgVkFDT1BUX1ZF UkJPU0UpCioqKioqKioqKioqKioqKgoqKiogMTg0LDE5MyAqKioqIGFuYWx5emVfcmVsKE9p ZCByZWxpZCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgYnN0 cmF0ZWd5KQogIAl9CiAgCiAgCS8qCiEgCSAqIENoZWNrIHRoYXQgaXQncyBhIHBsYWluIHRh YmxlOyB3ZSB1c2VkIHRvIGRvIHRoaXMgaW4gZ2V0X3JlbF9vaWRzKCkgYnV0CiEgCSAqIHNl ZW1zIHNhZmVyIHRvIGNoZWNrIGFmdGVyIHdlJ3ZlIGxvY2tlZCB0aGUgcmVsYXRpb24uCiAg CSAqLwohIAlpZiAob25lcmVsLT5yZF9yZWwtPnJlbGtpbmQgIT0gUkVMS0lORF9SRUxBVElP TikKICAJewogIAkJLyogTm8gbmVlZCBmb3IgYSBXQVJOSU5HIGlmIHdlIGFscmVhZHkgY29t cGxhaW5lZCBkdXJpbmcgVkFDVVVNICovCiAgCQlpZiAoISh2YWNzdG10LT5vcHRpb25zICYg VkFDT1BUX1ZBQ1VVTSkpCi0tLSAxODYsMTk3IC0tLS0KICAJfQogIAogIAkvKgohIAkgKiBD aGVjayB0aGF0IGl0J3MgYSBwbGFpbiB0YWJsZSBvciBmb3JlaWduIHRhYmxlOyB3ZSB1c2Vk IHRvIGRvIHRoaXMKISAJICogaW4gZ2V0X3JlbF9vaWRzKCkgYnV0IHNlZW1zIHNhZmVyIHRv IGNoZWNrIGFmdGVyIHdlJ3ZlIGxvY2tlZCB0aGUKISAJICogcmVsYXRpb24uCiAgCSAqLwoh IAlpZiAob25lcmVsLT5yZF9yZWwtPnJlbGtpbmQgIT0gUkVMS0lORF9SRUxBVElPTiAmJgoh IAkJb25lcmVsLT5yZF9yZWwtPnJlbGtpbmQgIT0gUkVMS0lORF9GT1JFSUdOX1RBQkxFKQog IAl7CiAgCQkvKiBObyBuZWVkIGZvciBhIFdBUk5JTkcgaWYgd2UgYWxyZWFkeSBjb21wbGFp bmVkIGR1cmluZyBWQUNVVU0gKi8KICAJCWlmICghKHZhY3N0bXQtPm9wdGlvbnMgJiBWQUNP UFRfVkFDVVVNKSkKKioqKioqKioqKioqKioqCioqKiAyMTEsMjE3ICoqKiogYW5hbHl6ZV9y ZWwoT2lkIHJlbGlkLCBWYWN1dW1TdG10ICp2YWNzdG10LCBCdWZmZXJBY2Nlc3NTdHJhdGVn eSBic3RyYXRlZ3kpCiAgCX0KICAKICAJLyoKISAJICogV2UgY2FuIEFOQUxZWkUgYW55IHRh YmxlIGV4Y2VwdCBwZ19zdGF0aXN0aWMuIFNlZSB1cGRhdGVfYXR0c3RhdHMKICAJICovCiAg CWlmIChSZWxhdGlvbkdldFJlbGlkKG9uZXJlbCkgPT0gU3RhdGlzdGljUmVsYXRpb25JZCkK ICAJewotLS0gMjE1LDIyMyAtLS0tCiAgCX0KICAKICAJLyoKISAJICogV2UgY2FuIEFOQUxZ WkUgYW55IHRhYmxlIGV4Y2VwdCBwZ19zdGF0aXN0aWMuICBTZWUgdXBkYXRlX2F0dHN0YXRz LiAgSW4KISAJICogYWRkaXRpb24sIFdlIGNhbiBBTkFMWVpFIGZvcmVpZ24gdGFibGVzIGlm IEFuYWx5emVGb3JlaWduVGFibGUgY2FsbGJhY2sKISAJICogcm91dGluZXMgb2YgdW5kZXJs eWluZyBmb3JlaWduLWRhdGEgd3JhcHBlcnMgYXJlIGltcGxlbWVudGVkLgogIAkgKi8KICAJ aWYgKFJlbGF0aW9uR2V0UmVsaWQob25lcmVsKSA9PSBTdGF0aXN0aWNSZWxhdGlvbklkKQog IAl7CioqKioqKioqKioqKioqKgoqKiogMjE5LDIyNCAqKioqIGFuYWx5emVfcmVsKE9pZCBy ZWxpZCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgYnN0cmF0 ZWd5KQotLS0gMjI1LDI0NSAtLS0tCiAgCQlyZXR1cm47CiAgCX0KICAKKyAJaWYgKG9uZXJl bC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfRk9SRUlHTl9UQUJMRSkKKyAJeworICAJ CWZkd3JvdXRpbmUgPSBHZXRGZHdSb3V0aW5lQnlSZWxJZChSZWxhdGlvbkdldFJlbGlkKG9u ZXJlbCkpOworIAorIAkJaWYgKGZkd3JvdXRpbmUtPkFuYWx5emVGb3JlaWduVGFibGUgPT0g TlVMTCkKKyAJCXsKKyAJCQllcmVwb3J0KFdBUk5JTkcsCisgCQkJCQkoZXJybXNnKCJza2lw cGluZyBcIiVzXCIgLS0tIHVuZGVybHlpbmcgZm9yZWlnbi1kYXRhICIKKyAJCQkJCQkJIndy YXBwZXIgY2Fubm90IGFuYWx5emUgaXQiLAorIAkJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9u TmFtZShvbmVyZWwpKSkpOworIAkJCXJlbGF0aW9uX2Nsb3NlKG9uZXJlbCwgU2hhcmVVcGRh dGVFeGNsdXNpdmVMb2NrKTsKKyAJCQlyZXR1cm47CisgCQl9CisgCX0KKyAKICAJLyoKICAJ ICogT0ssIGxldCdzIGRvIGl0LiAgRmlyc3QgbGV0IG90aGVyIGJhY2tlbmRzIGtub3cgSSdt IGluIEFOQUxZWkUuCiAgCSAqLwoqKioqKioqKioqKioqKioKKioqIDIyNiwyNDEgKioqKiBh bmFseXplX3JlbChPaWQgcmVsaWQsIFZhY3V1bVN0bXQgKnZhY3N0bXQsIEJ1ZmZlckFjY2Vz c1N0cmF0ZWd5IGJzdHJhdGVneSkKICAJTXlQZ1hhY3QtPnZhY3V1bUZsYWdzIHw9IFBST0Nf SU5fQU5BTFlaRTsKICAJTFdMb2NrUmVsZWFzZShQcm9jQXJyYXlMb2NrKTsKICAKISAJLyoK ISAJICogRG8gdGhlIG5vcm1hbCBub24tcmVjdXJzaXZlIEFOQUxZWkUuCiEgCSAqLwohIAlk b19hbmFseXplX3JlbChvbmVyZWwsIHZhY3N0bXQsIGZhbHNlKTsKICAKISAJLyoKISAJICog SWYgdGhlcmUgYXJlIGNoaWxkIHRhYmxlcywgZG8gcmVjdXJzaXZlIEFOQUxZWkUuCiEgCSAq LwohIAlpZiAob25lcmVsLT5yZF9yZWwtPnJlbGhhc3N1YmNsYXNzKQohIAkJZG9fYW5hbHl6 ZV9yZWwob25lcmVsLCB2YWNzdG10LCB0cnVlKTsKICAKICAJLyoKICAJICogQ2xvc2Ugc291 cmNlIHJlbGF0aW9uIG5vdywgYnV0IGtlZXAgbG9jayBzbyB0aGF0IG5vIG9uZSBkZWxldGVz IGl0Ci0tLSAyNDcsMjg1IC0tLS0KICAJTXlQZ1hhY3QtPnZhY3V1bUZsYWdzIHw9IFBST0Nf SU5fQU5BTFlaRTsKICAJTFdMb2NrUmVsZWFzZShQcm9jQXJyYXlMb2NrKTsKICAKISAJaWYg KG9uZXJlbC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfRk9SRUlHTl9UQUJMRSkKISAJ ewohIAkJZXJlcG9ydChlbGV2ZWwsCiEgCQkJCShlcnJtc2coImFuYWx5emluZyBcIiVzLiVz XCIiLAohIAkJCQkJCWdldF9uYW1lc3BhY2VfbmFtZShSZWxhdGlvbkdldE5hbWVzcGFjZShv bmVyZWwpKSwKISAJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShvbmVyZWwpKSkpOwoh IAkJZmR3cm91dGluZS0+QW5hbHl6ZUZvcmVpZ25UYWJsZShvbmVyZWwsIHZhY3N0bXQsIGVs ZXZlbCk7CiEgCX0KISAJZWxzZQohIAl7CiEgCQkvKgohIAkJICogRG8gdGhlIG5vcm1hbCBu b24tcmVjdXJzaXZlIEFOQUxZWkUuCiEgCQkgKi8KISAJCWVyZXBvcnQoZWxldmVsLAohIAkJ CQkoZXJybXNnKCJhbmFseXppbmcgXCIlcy4lc1wiIiwKISAJCQkJCQlnZXRfbmFtZXNwYWNl X25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2Uob25lcmVsKSksCiEgCQkJCQkJUmVsYXRpb25H ZXRSZWxhdGlvbk5hbWUob25lcmVsKSkpKTsKISAJCWRvX2FuYWx5emVfcmVsKG9uZXJlbCwg dmFjc3RtdCwgZWxldmVsLAohIAkJCQkJICAgZmFsc2UsIGFjcXVpcmVfc2FtcGxlX3Jvd3Mp OwogIAohIAkJLyoKISAJCSAqIElmIHRoZXJlIGFyZSBjaGlsZCB0YWJsZXMsIGRvIHJlY3Vy c2l2ZSBBTkFMWVpFLgohIAkJICovCiEgCQlpZiAob25lcmVsLT5yZF9yZWwtPnJlbGhhc3N1 YmNsYXNzKQohIAkJewohIAkJCWVyZXBvcnQoZWxldmVsLAohIAkJCQkJKGVycm1zZygiYW5h bHl6aW5nIFwiJXMuJXNcIiBpbmhlcml0YW5jZSB0cmVlIiwKISAJCQkJCQkJZ2V0X25hbWVz cGFjZV9uYW1lKFJlbGF0aW9uR2V0TmFtZXNwYWNlKG9uZXJlbCkpLAohIAkJCQkJCQlSZWxh dGlvbkdldFJlbGF0aW9uTmFtZShvbmVyZWwpKSkpOwohIAkJCWRvX2FuYWx5emVfcmVsKG9u ZXJlbCwgdmFjc3RtdCwgZWxldmVsLAohIAkJCQkJCSAgIHRydWUsIGFjcXVpcmVfaW5oZXJp dGVkX3NhbXBsZV9yb3dzKTsKISAJCX0KISAJfQogIAogIAkvKgogIAkgKiBDbG9zZSBzb3Vy Y2UgcmVsYXRpb24gbm93LCBidXQga2VlcCBsb2NrIHNvIHRoYXQgbm8gb25lIGRlbGV0ZXMg aXQKKioqKioqKioqKioqKioqCioqKiAyNTcsMjY0ICoqKiogYW5hbHl6ZV9yZWwoT2lkIHJl bGlkLCBWYWN1dW1TdG10ICp2YWNzdG10LCBCdWZmZXJBY2Nlc3NTdHJhdGVneSBic3RyYXRl Z3kpCiAgLyoKICAgKglkb19hbmFseXplX3JlbCgpIC0tIGFuYWx5emUgb25lIHJlbGF0aW9u LCByZWN1cnNpdmVseSBvciBub3QKICAgKi8KISBzdGF0aWMgdm9pZAohIGRvX2FuYWx5emVf cmVsKFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgYm9vbCBpbmgpCiAg ewogIAlpbnQJCQlhdHRyX2NudCwKICAJCQkJdGNudCwKLS0tIDMwMSwzMDkgLS0tLQogIC8q CiAgICoJZG9fYW5hbHl6ZV9yZWwoKSAtLSBhbmFseXplIG9uZSByZWxhdGlvbiwgcmVjdXJz aXZlbHkgb3Igbm90CiAgICovCiEgdm9pZAohIGRvX2FuYWx5emVfcmVsKFJlbGF0aW9uIG9u ZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgaW50IGVsZXZlbCwgCiEgCQkJICAgYm9vbCBp bmgsIFNhbXBsZVJvd0FjcXVpcmVGdW5jIGFjcXVpcmVmdW5jKQogIHsKICAJaW50CQkJYXR0 cl9jbnQsCiAgCQkJCXRjbnQsCioqKioqKioqKioqKioqKgoqKiogMjczLDI3OCAqKioqIGRv X2FuYWx5emVfcmVsKFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgYm9v bCBpbmgpCi0tLSAzMTgsMzI0IC0tLS0KICAJCQkJbnVtcm93czsKICAJZG91YmxlCQl0b3Rh bHJvd3MsCiAgCQkJCXRvdGFsZGVhZHJvd3M7CisgCUJsb2NrTnVtYmVyIHRvdGFscGFnZXM7 CiAgCUhlYXBUdXBsZSAgKnJvd3M7CiAgCVBHUlVzYWdlCXJ1MDsKICAJVGltZXN0YW1wVHog c3RhcnR0aW1lID0gMDsKKioqKioqKioqKioqKioqCioqKiAyODEsMjk3ICoqKiogZG9fYW5h bHl6ZV9yZWwoUmVsYXRpb24gb25lcmVsLCBWYWN1dW1TdG10ICp2YWNzdG10LCBib29sIGlu aCkKICAJaW50CQkJc2F2ZV9zZWNfY29udGV4dDsKICAJaW50CQkJc2F2ZV9uZXN0bGV2ZWw7 CiAgCi0gCWlmIChpbmgpCi0gCQllcmVwb3J0KGVsZXZlbCwKLSAJCQkJKGVycm1zZygiYW5h bHl6aW5nIFwiJXMuJXNcIiBpbmhlcml0YW5jZSB0cmVlIiwKLSAJCQkJCQlnZXRfbmFtZXNw YWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2Uob25lcmVsKSksCi0gCQkJCQkJUmVsYXRp b25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSkpKTsKLSAJZWxzZQotIAkJZXJlcG9ydChlbGV2 ZWwsCi0gCQkJCShlcnJtc2coImFuYWx5emluZyBcIiVzLiVzXCIiLAotIAkJCQkJCWdldF9u YW1lc3BhY2VfbmFtZShSZWxhdGlvbkdldE5hbWVzcGFjZShvbmVyZWwpKSwKLSAJCQkJCQlS ZWxhdGlvbkdldFJlbGF0aW9uTmFtZShvbmVyZWwpKSkpOwotIAogIAkvKgogIAkgKiBTZXQg dXAgYSB3b3JraW5nIGNvbnRleHQgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGZyZWUgd2hhdGV2 ZXIganVuayBnZXRzCiAgCSAqIGNyZWF0ZWQuCi0tLSAzMjcsMzMyIC0tLS0KKioqKioqKioq KioqKioqCioqKiA0NDksNDU5ICoqKiogZG9fYW5hbHl6ZV9yZWwoUmVsYXRpb24gb25lcmVs LCBWYWN1dW1TdG10ICp2YWNzdG10LCBib29sIGluaCkKICAJICovCiAgCXJvd3MgPSAoSGVh cFR1cGxlICopIHBhbGxvYyh0YXJncm93cyAqIHNpemVvZihIZWFwVHVwbGUpKTsKICAJaWYg KGluaCkKISAJCW51bXJvd3MgPSBhY3F1aXJlX2luaGVyaXRlZF9zYW1wbGVfcm93cyhvbmVy ZWwsIHJvd3MsIHRhcmdyb3dzLAohIAkJCQkJCQkJCQkJCSZ0b3RhbHJvd3MsICZ0b3RhbGRl YWRyb3dzKTsKICAJZWxzZQohIAkJbnVtcm93cyA9IGFjcXVpcmVfc2FtcGxlX3Jvd3Mob25l cmVsLCByb3dzLCB0YXJncm93cywKISAJCQkJCQkJCQkgICZ0b3RhbHJvd3MsICZ0b3RhbGRl YWRyb3dzKTsKICAKICAJLyoKICAJICogQ29tcHV0ZSB0aGUgc3RhdGlzdGljcy4JVGVtcG9y YXJ5IHJlc3VsdHMgZHVyaW5nIHRoZSBjYWxjdWxhdGlvbnMgZm9yCi0tLSA0ODQsNDk2IC0t LS0KICAJICovCiAgCXJvd3MgPSAoSGVhcFR1cGxlICopIHBhbGxvYyh0YXJncm93cyAqIHNp emVvZihIZWFwVHVwbGUpKTsKICAJaWYgKGluaCkKISAJCW51bXJvd3MgPSBhY3F1aXJlZnVu YyhvbmVyZWwsIHJvd3MsIHRhcmdyb3dzLAohIAkJCQkJCQkgICZ0b3RhbHJvd3MsICZ0b3Rh bGRlYWRyb3dzLAohIAkJCQkJCQkgIE5VTEwsIGVsZXZlbCk7CiAgCWVsc2UKISAJCW51bXJv d3MgPSBhY3F1aXJlZnVuYyhvbmVyZWwsIHJvd3MsIHRhcmdyb3dzLAohIAkJCQkJCQkgICZ0 b3RhbHJvd3MsICZ0b3RhbGRlYWRyb3dzLAohIAkJCQkJCQkgICZ0b3RhbHBhZ2VzLCBlbGV2 ZWwpOwogIAogIAkvKgogIAkgKiBDb21wdXRlIHRoZSBzdGF0aXN0aWNzLglUZW1wb3Jhcnkg cmVzdWx0cyBkdXJpbmcgdGhlIGNhbGN1bGF0aW9ucyBmb3IKKioqKioqKioqKioqKioqCioq KiA1MzQsNTQwICoqKiogZG9fYW5hbHl6ZV9yZWwoUmVsYXRpb24gb25lcmVsLCBWYWN1dW1T dG10ICp2YWNzdG10LCBib29sIGluaCkKICAJICovCiAgCWlmICghaW5oKQogIAkJdmFjX3Vw ZGF0ZV9yZWxzdGF0cyhvbmVyZWwsCiEgCQkJCQkJCVJlbGF0aW9uR2V0TnVtYmVyT2ZCbG9j a3Mob25lcmVsKSwKICAJCQkJCQkJdG90YWxyb3dzLAogIAkJCQkJCQl2aXNpYmlsaXR5bWFw X2NvdW50KG9uZXJlbCksCiAgCQkJCQkJCWhhc2luZGV4LAotLS0gNTcxLDU3NyAtLS0tCiAg CSAqLwogIAlpZiAoIWluaCkKICAJCXZhY191cGRhdGVfcmVsc3RhdHMob25lcmVsLAohIAkJ CQkJCQl0b3RhbHBhZ2VzLAogIAkJCQkJCQl0b3RhbHJvd3MsCiAgCQkJCQkJCXZpc2liaWxp dHltYXBfY291bnQob25lcmVsKSwKICAJCQkJCQkJaGFzaW5kZXgsCioqKioqKioqKioqKioq KgoqKiogMTAxNywxMDIzICoqKiogQmxvY2tTYW1wbGVyX05leHQoQmxvY2tTYW1wbGVyIGJz KQogICAqLwogIHN0YXRpYyBpbnQKICBhY3F1aXJlX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9u ZXJlbCwgSGVhcFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3MsCiEgCQkJCQlkb3VibGUgKnRv dGFscm93cywgZG91YmxlICp0b3RhbGRlYWRyb3dzKQogIHsKICAJaW50CQkJbnVtcm93cyA9 IDA7CS8qICMgcm93cyBub3cgaW4gcmVzZXJ2b2lyICovCiAgCWRvdWJsZQkJc2FtcGxlcm93 cyA9IDA7IC8qIHRvdGFsICMgcm93cyBjb2xsZWN0ZWQgKi8KLS0tIDEwNTQsMTA2MSAtLS0t CiAgICovCiAgc3RhdGljIGludAogIGFjcXVpcmVfc2FtcGxlX3Jvd3MoUmVsYXRpb24gb25l cmVsLCBIZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywKISAJCQkJCWRvdWJsZSAqdG90 YWxyb3dzLCBkb3VibGUgKnRvdGFsZGVhZHJvd3MsCiEgCQkJCQlCbG9ja051bWJlciAqdG90 YWxwYWdlcywgaW50IGVsZXZlbCkKICB7CiAgCWludAkJCW51bXJvd3MgPSAwOwkvKiAjIHJv d3Mgbm93IGluIHJlc2Vydm9pciAqLwogIAlkb3VibGUJCXNhbXBsZXJvd3MgPSAwOyAvKiB0 b3RhbCAjIHJvd3MgY29sbGVjdGVkICovCioqKioqKioqKioqKioqKgoqKiogMTAzMiwxMDM3 ICoqKiogYWNxdWlyZV9zYW1wbGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsIEhlYXBUdXBsZSAq cm93cywgaW50IHRhcmdyb3dzLAotLS0gMTA3MCwxMDc3IC0tLS0KICAJQXNzZXJ0KHRhcmdy b3dzID4gMCk7CiAgCiAgCXRvdGFsYmxvY2tzID0gUmVsYXRpb25HZXROdW1iZXJPZkJsb2Nr cyhvbmVyZWwpOworIAlpZiAodG90YWxwYWdlcykKKyAJCSp0b3RhbHBhZ2VzID0gdG90YWxi bG9ja3M7CiAgCiAgCS8qIE5lZWQgYSBjdXRvZmYgeG1pbiBmb3IgSGVhcFR1cGxlU2F0aXNm aWVzVmFjdXVtICovCiAgCU9sZGVzdFhtaW4gPSBHZXRPbGRlc3RYbWluKG9uZXJlbC0+cmRf cmVsLT5yZWxpc3NoYXJlZCwgdHJ1ZSk7CioqKioqKioqKioqKioqKgoqKiogMTI1NCwxMjYw ICoqKiogYWNxdWlyZV9zYW1wbGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsIEhlYXBUdXBsZSAq cm93cywgaW50IHRhcmdyb3dzLAogIH0KICAKICAvKiBTZWxlY3QgYSByYW5kb20gdmFsdWUg UiB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgaW4gKDAgLSAxKSAqLwohIHN0YXRpYyBkb3VibGUK ICByYW5kb21fZnJhY3Qodm9pZCkKICB7CiAgCXJldHVybiAoKGRvdWJsZSkgcmFuZG9tKCkg KyAxKSAvICgoZG91YmxlKSBNQVhfUkFORE9NX1ZBTFVFICsgMik7Ci0tLSAxMjk0LDEzMDAg LS0tLQogIH0KICAKICAvKiBTZWxlY3QgYSByYW5kb20gdmFsdWUgUiB1bmlmb3JtbHkgZGlz dHJpYnV0ZWQgaW4gKDAgLSAxKSAqLwohIGRvdWJsZQogIHJhbmRvbV9mcmFjdCh2b2lkKQog IHsKICAJcmV0dXJuICgoZG91YmxlKSByYW5kb20oKSArIDEpIC8gKChkb3VibGUpIE1BWF9S QU5ET01fVkFMVUUgKyAyKTsKKioqKioqKioqKioqKioqCioqKiAxMjc0LDEyODcgKioqKiBy YW5kb21fZnJhY3Qodm9pZCkKICAgKiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcmVjb3Jk cyB0byBza2lwIGJlZm9yZSB0aGUgbmV4dCByZWNvcmQgaXMKICAgKiBwcm9jZXNzZWQuCiAg ICovCiEgc3RhdGljIGRvdWJsZQogIGluaXRfc2VsZWN0aW9uX3N0YXRlKGludCBuKQogIHsK ICAJLyogSW5pdGlhbCB2YWx1ZSBvZiBXIChmb3IgdXNlIHdoZW4gQWxnb3JpdGhtIFogaXMg Zmlyc3QgYXBwbGllZCkgKi8KICAJcmV0dXJuIGV4cCgtbG9nKHJhbmRvbV9mcmFjdCgpKSAv IG4pOwogIH0KICAKISBzdGF0aWMgZG91YmxlCiAgZ2V0X25leHRfUyhkb3VibGUgdCwgaW50 IG4sIGRvdWJsZSAqc3RhdGVwdHIpCiAgewogIAlkb3VibGUJCVM7Ci0tLSAxMzE0LDEzMjcg LS0tLQogICAqIGRldGVybWluZXMgdGhlIG51bWJlciBvZiByZWNvcmRzIHRvIHNraXAgYmVm b3JlIHRoZSBuZXh0IHJlY29yZCBpcwogICAqIHByb2Nlc3NlZC4KICAgKi8KISBkb3VibGUK ICBpbml0X3NlbGVjdGlvbl9zdGF0ZShpbnQgbikKICB7CiAgCS8qIEluaXRpYWwgdmFsdWUg b2YgVyAoZm9yIHVzZSB3aGVuIEFsZ29yaXRobSBaIGlzIGZpcnN0IGFwcGxpZWQpICovCiAg CXJldHVybiBleHAoLWxvZyhyYW5kb21fZnJhY3QoKSkgLyBuKTsKICB9CiAgCiEgZG91Ymxl CiAgZ2V0X25leHRfUyhkb3VibGUgdCwgaW50IG4sIGRvdWJsZSAqc3RhdGVwdHIpCiAgewog IAlkb3VibGUJCVM7CioqKioqKioqKioqKioqKgoqKiogMTM5NywxNDAzICoqKiogY29tcGFy ZV9yb3dzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCiAgICovCiAgc3RhdGljIGlu dAogIGFjcXVpcmVfaW5oZXJpdGVkX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwgSGVh cFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3MsCiEgCQkJCQkJCSAgZG91YmxlICp0b3RhbHJv d3MsIGRvdWJsZSAqdG90YWxkZWFkcm93cykKICB7CiAgCUxpc3QJICAgKnRhYmxlT0lEczsK ICAJUmVsYXRpb24gICAqcmVsczsKLS0tIDE0MzcsMTQ0NCAtLS0tCiAgICovCiAgc3RhdGlj IGludAogIGFjcXVpcmVfaW5oZXJpdGVkX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwg SGVhcFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3MsCiEgCQkJCQkJCSAgZG91YmxlICp0b3Rh bHJvd3MsIGRvdWJsZSAqdG90YWxkZWFkcm93cywKISAJCQkJCQkJICBCbG9ja051bWJlciAq dG90YWxwYWdlcywgaW50IGVsZXZlbCkKICB7CiAgCUxpc3QJICAgKnRhYmxlT0lEczsKICAJ UmVsYXRpb24gICAqcmVsczsKKioqKioqKioqKioqKioqCioqKiAxNDYwLDE0NjUgKioqKiBh Y3F1aXJlX2luaGVyaXRlZF9zYW1wbGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsIEhlYXBUdXBs ZSAqcm93cywgaW50IHRhcmdyb3dzLAotLS0gMTUwMSwxNTA4IC0tLS0KICAJCXRvdGFsYmxv Y2tzICs9IHJlbGJsb2Nrc1tucmVsc107CiAgCQlucmVscysrOwogIAl9CisgCWlmICh0b3Rh bHBhZ2VzKQorIAkgICp0b3RhbHBhZ2VzID0gdG90YWxibG9ja3M7CiAgCiAgCS8qCiAgCSAq IE5vdyBzYW1wbGUgcm93cyBmcm9tIGVhY2ggcmVsYXRpb24sIHByb3BvcnRpb25hbGx5IHRv IGl0cyBmcmFjdGlvbiBvZgoqKioqKioqKioqKioqKioKKioqIDE0OTMsMTQ5OSAqKioqIGFj cXVpcmVfaW5oZXJpdGVkX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwgSGVhcFR1cGxl ICpyb3dzLCBpbnQgdGFyZ3Jvd3MsCiAgCQkJCQkJCQkJCQkJcm93cyArIG51bXJvd3MsCiAg CQkJCQkJCQkJCQkJY2hpbGR0YXJncm93cywKICAJCQkJCQkJCQkJCQkmdHJvd3MsCiEgCQkJ CQkJCQkJCQkJJnRkcm93cyk7CiAgCiAgCQkJCS8qIFdlIG1heSBuZWVkIHRvIGNvbnZlcnQg ZnJvbSBjaGlsZCdzIHJvd3R5cGUgdG8gcGFyZW50J3MgKi8KICAJCQkJaWYgKGNoaWxkcm93 cyA+IDAgJiYKLS0tIDE1MzYsMTU0NCAtLS0tCiAgCQkJCQkJCQkJCQkJcm93cyArIG51bXJv d3MsCiAgCQkJCQkJCQkJCQkJY2hpbGR0YXJncm93cywKICAJCQkJCQkJCQkJCQkmdHJvd3Ms CiEgCQkJCQkJCQkJCQkJJnRkcm93cywKISAJCQkJCQkJCQkJCQlOVUxMLAohIAkJCQkJCQkJ CQkJCWVsZXZlbCk7CiAgCiAgCQkJCS8qIFdlIG1heSBuZWVkIHRvIGNvbnZlcnQgZnJvbSBj aGlsZCdzIHJvd3R5cGUgdG8gcGFyZW50J3MgKi8KICAJCQkJaWYgKGNoaWxkcm93cyA+IDAg JiYKKioqIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKLS0tIGIvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKKioqKioqKioqKioqKioqCioqKiAzMTcsMzIy ICoqKiogc3RhdGljIHZvaWQgQVRQcmVwU2V0U3RhdGlzdGljcyhSZWxhdGlvbiByZWwsIGNv bnN0IGNoYXIgKmNvbE5hbWUsCi0tLSAzMTcsMzI0IC0tLS0KICAJCQkJCU5vZGUgKm5ld1Zh bHVlLCBMT0NLTU9ERSBsb2NrbW9kZSk7CiAgc3RhdGljIHZvaWQgQVRFeGVjU2V0U3RhdGlz dGljcyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsCiAgCQkJCQlOb2RlICpu ZXdWYWx1ZSwgTE9DS01PREUgbG9ja21vZGUpOworIHN0YXRpYyB2b2lkIEFUUHJlcFNldE9w dGlvbnMoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLAorIAkJCQkgTm9kZSAq b3B0aW9ucywgTE9DS01PREUgbG9ja21vZGUpOwogIHN0YXRpYyB2b2lkIEFURXhlY1NldE9w dGlvbnMoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLAogIAkJCQkgTm9kZSAq b3B0aW9ucywgYm9vbCBpc1Jlc2V0LCBMT0NLTU9ERSBsb2NrbW9kZSk7CiAgc3RhdGljIHZv aWQgQVRFeGVjU2V0U3RvcmFnZShSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUs CioqKioqKioqKioqKioqKgoqKiogMjkxNSwyOTIxICoqKiogQVRQcmVwQ21kKExpc3QgKip3 cXVldWUsIFJlbGF0aW9uIHJlbCwgQWx0ZXJUYWJsZUNtZCAqY21kLAogIAkJCWJyZWFrOwog IAkJY2FzZSBBVF9TZXRPcHRpb25zOgkJLyogQUxURVIgQ09MVU1OIFNFVCAoIG9wdGlvbnMg KSAqLwogIAkJY2FzZSBBVF9SZXNldE9wdGlvbnM6CS8qIEFMVEVSIENPTFVNTiBSRVNFVCAo IG9wdGlvbnMgKSAqLwohIAkJCUFUU2ltcGxlUGVybWlzc2lvbnMocmVsLCBBVFRfVEFCTEUg fCBBVFRfSU5ERVgpOwogIAkJCS8qIFRoaXMgY29tbWFuZCBuZXZlciByZWN1cnNlcyAqLwog IAkJCXBhc3MgPSBBVF9QQVNTX01JU0M7CiAgCQkJYnJlYWs7Ci0tLSAyOTE3LDI5MjQgLS0t LQogIAkJCWJyZWFrOwogIAkJY2FzZSBBVF9TZXRPcHRpb25zOgkJLyogQUxURVIgQ09MVU1O IFNFVCAoIG9wdGlvbnMgKSAqLwogIAkJY2FzZSBBVF9SZXNldE9wdGlvbnM6CS8qIEFMVEVS IENPTFVNTiBSRVNFVCAoIG9wdGlvbnMgKSAqLwohIAkJCUFUU2ltcGxlUGVybWlzc2lvbnMo cmVsLCBBVFRfVEFCTEUgfCBBVFRfSU5ERVggfCBBVFRfRk9SRUlHTl9UQUJMRSk7CiEgCQkJ QVRQcmVwU2V0T3B0aW9ucyhyZWwsIGNtZC0+bmFtZSwgY21kLT5kZWYsIGxvY2ttb2RlKTsK ICAJCQkvKiBUaGlzIGNvbW1hbmQgbmV2ZXIgcmVjdXJzZXMgKi8KICAJCQlwYXNzID0gQVRf UEFTU19NSVNDOwogIAkJCWJyZWFrOwoqKioqKioqKioqKioqKioKKioqIDQ4NTEsNDg2MCAq KioqIEFUUHJlcFNldFN0YXRpc3RpY3MoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xO YW1lLCBOb2RlICpuZXdWYWx1ZSwgTE9DS01PREUKICAJICogYWxsb3dTeXN0ZW1UYWJsZU1v ZHMgdG8gYmUgdHVybmVkIG9uLgogIAkgKi8KICAJaWYgKHJlbC0+cmRfcmVsLT5yZWxraW5k ICE9IFJFTEtJTkRfUkVMQVRJT04gJiYKISAJCXJlbC0+cmRfcmVsLT5yZWxraW5kICE9IFJF TEtJTkRfSU5ERVgpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RF X1dST05HX09CSkVDVF9UWVBFKSwKISAJCQkJIGVycm1zZygiXCIlc1wiIGlzIG5vdCBhIHRh YmxlIG9yIGluZGV4IiwKICAJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKSkp OwogIAogIAkvKiBQZXJtaXNzaW9ucyBjaGVja3MgKi8KLS0tIDQ4NTQsNDg2NCAtLS0tCiAg CSAqIGFsbG93U3lzdGVtVGFibGVNb2RzIHRvIGJlIHR1cm5lZCBvbi4KICAJICovCiAgCWlm IChyZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX1JFTEFUSU9OICYmCiEgCQlyZWwt PnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX0lOREVYICYmCiEgCQlyZWwtPnJkX3JlbC0+ cmVsa2luZCAhPSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUpCiAgCQllcmVwb3J0KEVSUk9SLAog IAkJCQkoZXJyY29kZShFUlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKISAJCQkJIGVycm1z ZygiXCIlc1wiIGlzIG5vdCBhIHRhYmxlLCBpbmRleCBvciBmb3JlaWduIHRhYmxlIiwKICAJ CQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKSkpOwogIAogIAkvKiBQZXJtaXNz aW9ucyBjaGVja3MgKi8KKioqKioqKioqKioqKioqCioqKiA0OTIzLDQ5MjggKioqKiBBVEV4 ZWNTZXRTdGF0aXN0aWNzKFJlbGF0aW9uIHJlbCwgY29uc3QgY2hhciAqY29sTmFtZSwgTm9k ZSAqbmV3VmFsdWUsIExPQ0tNT0RFCi0tLSA0OTI3LDQ5NTQgLS0tLQogIH0KICAKICBzdGF0 aWMgdm9pZAorIEFUUHJlcFNldE9wdGlvbnMoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFyICpj b2xOYW1lLCBOb2RlICpvcHRpb25zLAorIAkJCQkgTE9DS01PREUgbG9ja21vZGUpCisgewor IAlpZiAocmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9GT1JFSUdOX1RBQkxFKQor IAl7CisgCQlMaXN0Q2VsbCAgICpjZWxsOworIAorIAkJZm9yZWFjaChjZWxsLCAoTGlzdCAq KSBvcHRpb25zKQorIAkJeworIAkJCURlZkVsZW0gICAgKmRlZiA9IChEZWZFbGVtICopIGxm aXJzdChjZWxsKTsKKyAKKyAJCQlpZiAocGdfc3RybmNhc2VjbXAoZGVmLT5kZWZuYW1lLCAi bl9kaXN0aW5jdF9pbmhlcml0ZWQiLAorIAkJCQkJCQkgICBzdHJsZW4oIm5fZGlzdGluY3Rf aW5oZXJpdGVkIikpID09IDApCisgCQkJCWVyZXBvcnQoRVJST1IsCisgCQkJCQkJKGVycmNv ZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAorIAkJCQkJCSBlcnJtc2coImNh bm5vdCBzZXQgXCJuX2Rpc3RpbmN0X2luaGVyaXRlZFwiICIKKyAJCQkJCQkJCSJmb3IgZm9y ZWlnbiB0YWJsZXMiKSkpOworIAkJfQorIAl9CisgfQorIAorIHN0YXRpYyB2b2lkCiAgQVRF eGVjU2V0T3B0aW9ucyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsIE5vZGUg Km9wdGlvbnMsCiAgCQkJCSBib29sIGlzUmVzZXQsIExPQ0tNT0RFIGxvY2ttb2RlKQogIHsK KioqIGEvc3JjL2Jpbi9wc3FsL2Rlc2NyaWJlLmMKLS0tIGIvc3JjL2Jpbi9wc3FsL2Rlc2Ny aWJlLmMKKioqKioqKioqKioqKioqCioqKiAxMDk5LDExMDUgKioqKiBkZXNjcmliZU9uZVRh YmxlRGV0YWlscyhjb25zdCBjaGFyICpzY2hlbWFuYW1lLAogIAlib29sCQlwcmludFRhYmxl SW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAJaW50CQkJaTsKICAJY2hhcgkgICAqdmlld19kZWYg PSBOVUxMOwohIAljaGFyCSAgICpoZWFkZXJzWzZdOwogIAljaGFyCSAgKipzZXFfdmFsdWVz ID0gTlVMTDsKICAJY2hhcgkgICoqbW9kaWZpZXJzID0gTlVMTDsKICAJY2hhcgkgICoqcHRy OwotLS0gMTA5OSwxMTA1IC0tLS0KICAJYm9vbAkJcHJpbnRUYWJsZUluaXRpYWxpemVkID0g ZmFsc2U7CiAgCWludAkJCWk7CiAgCWNoYXIJICAgKnZpZXdfZGVmID0gTlVMTDsKISAJY2hh cgkgICAqaGVhZGVyc1s3XTsKICAJY2hhcgkgICoqc2VxX3ZhbHVlcyA9IE5VTEw7CiAgCWNo YXIJICAqKm1vZGlmaWVycyA9IE5VTEw7CiAgCWNoYXIJICAqKnB0cjsKKioqKioqKioqKioq KioqCioqKiAxMzkwLDEzOTYgKioqKiBkZXNjcmliZU9uZVRhYmxlRGV0YWlscyhjb25zdCBj aGFyICpzY2hlbWFuYW1lLAogIAlpZiAodmVyYm9zZSkKICAJewogIAkJaGVhZGVyc1tjb2xz KytdID0gZ2V0dGV4dF9ub29wKCJTdG9yYWdlIik7CiEgCQlpZiAodGFibGVpbmZvLnJlbGtp bmQgPT0gJ3InKQogIAkJCWhlYWRlcnNbY29scysrXSA9IGdldHRleHRfbm9vcCgiU3RhdHMg dGFyZ2V0Iik7CiAgCQkvKiBDb2x1bW4gY29tbWVudHMsIGlmIHRoZSByZWxraW5kIHN1cHBv cnRzIHRoaXMgZmVhdHVyZS4gKi8KICAJCWlmICh0YWJsZWluZm8ucmVsa2luZCA9PSAncicg fHwgdGFibGVpbmZvLnJlbGtpbmQgPT0gJ3YnIHx8Ci0tLSAxMzkwLDEzOTYgLS0tLQogIAlp ZiAodmVyYm9zZSkKICAJewogIAkJaGVhZGVyc1tjb2xzKytdID0gZ2V0dGV4dF9ub29wKCJT dG9yYWdlIik7CiEgCQlpZiAodGFibGVpbmZvLnJlbGtpbmQgPT0gJ3InIHx8IHRhYmxlaW5m by5yZWxraW5kID09ICdmJykKICAJCQloZWFkZXJzW2NvbHMrK10gPSBnZXR0ZXh0X25vb3Ao IlN0YXRzIHRhcmdldCIpOwogIAkJLyogQ29sdW1uIGNvbW1lbnRzLCBpZiB0aGUgcmVsa2lu ZCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCiAgCQlpZiAodGFibGVpbmZvLnJlbGtpbmQg PT0gJ3InIHx8IHRhYmxlaW5mby5yZWxraW5kID09ICd2JyB8fAoqKioqKioqKioqKioqKioK KioqIDE0OTMsMTQ5OSAqKioqIGRlc2NyaWJlT25lVGFibGVEZXRhaWxzKGNvbnN0IGNoYXIg KnNjaGVtYW5hbWUsCiAgCQkJCQkJCSAgZmFsc2UsIGZhbHNlKTsKICAKICAJCQkvKiBTdGF0 aXN0aWNzIHRhcmdldCwgaWYgdGhlIHJlbGtpbmQgc3VwcG9ydHMgdGhpcyBmZWF0dXJlICov CiEgCQkJaWYgKHRhYmxlaW5mby5yZWxraW5kID09ICdyJykKICAJCQl7CiAgCQkJCXByaW50 VGFibGVBZGRDZWxsKCZjb250LCBQUWdldHZhbHVlKHJlcywgaSwgZmlyc3R2Y29sICsgMSks CiAgCQkJCQkJCQkgIGZhbHNlLCBmYWxzZSk7Ci0tLSAxNDkzLDE0OTkgLS0tLQogIAkJCQkJ CQkgIGZhbHNlLCBmYWxzZSk7CiAgCiAgCQkJLyogU3RhdGlzdGljcyB0YXJnZXQsIGlmIHRo ZSByZWxraW5kIHN1cHBvcnRzIHRoaXMgZmVhdHVyZSAqLwohIAkJCWlmICh0YWJsZWluZm8u cmVsa2luZCA9PSAncicgfHwgdGFibGVpbmZvLnJlbGtpbmQgPT0gJ2YnKQogIAkJCXsKICAJ CQkJcHJpbnRUYWJsZUFkZENlbGwoJmNvbnQsIFBRZ2V0dmFsdWUocmVzLCBpLCBmaXJzdHZj b2wgKyAxKSwKICAJCQkJCQkJCSAgZmFsc2UsIGZhbHNlKTsKKioqIGEvc3JjL2Jpbi9wc3Fs L3RhYi1jb21wbGV0ZS5jCi0tLSBiL3NyYy9iaW4vcHNxbC90YWItY29tcGxldGUuYwoqKioq KioqKioqKioqKioKKioqIDM5OSw0MDQgKioqKiBzdGF0aWMgY29uc3QgU2NoZW1hUXVlcnkg UXVlcnlfZm9yX2xpc3Rfb2ZfdHN2ZiA9IHsKLS0tIDM5OSw0MTkgLS0tLQogIAlOVUxMCiAg fTsKICAKKyBzdGF0aWMgY29uc3QgU2NoZW1hUXVlcnkgUXVlcnlfZm9yX2xpc3Rfb2ZfdGYg PSB7CisgCS8qIGNhdG5hbWUgKi8KKyAJInBnX2NhdGFsb2cucGdfY2xhc3MgYyIsCisgCS8q IHNlbGNvbmRpdGlvbiAqLworIAkiYy5yZWxraW5kIElOICgncicsICdmJykiLAorIAkvKiB2 aXNjb25kaXRpb24gKi8KKyAJInBnX2NhdGFsb2cucGdfdGFibGVfaXNfdmlzaWJsZShjLm9p ZCkiLAorIAkvKiBuYW1lc3BhY2UgKi8KKyAJImMucmVsbmFtZXNwYWNlIiwKKyAJLyogcmVz dWx0ICovCisgCSJwZ19jYXRhbG9nLnF1b3RlX2lkZW50KGMucmVsbmFtZSkiLAorIAkvKiBx dWFscmVzdWx0ICovCisgCU5VTEwKKyB9OworIAogIHN0YXRpYyBjb25zdCBTY2hlbWFRdWVy eSBRdWVyeV9mb3JfbGlzdF9vZl92aWV3cyA9IHsKICAJLyogY2F0bmFtZSAqLwogIAkicGdf Y2F0YWxvZy5wZ19jbGFzcyBjIiwKKioqKioqKioqKioqKioqCioqKiAyNzY5LDI3NzUgKioq KiBwc3FsX2NvbXBsZXRpb24oY2hhciAqdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKQogIC8q IEFOQUxZWkUgKi8KICAJLyogSWYgdGhlIHByZXZpb3VzIHdvcmQgaXMgQU5BTFlaRSwgcHJv ZHVjZSBsaXN0IG9mIHRhYmxlcyAqLwogIAllbHNlIGlmIChwZ19zdHJjYXNlY21wKHByZXZf d2QsICJBTkFMWVpFIikgPT0gMCkKISAJCUNPTVBMRVRFX1dJVEhfU0NIRU1BX1FVRVJZKFF1 ZXJ5X2Zvcl9saXN0X29mX3RhYmxlcywgTlVMTCk7CiAgCiAgLyogV0hFUkUgKi8KICAJLyog U2ltcGxlIGNhc2Ugb2YgdGhlIHdvcmQgYmVmb3JlIHRoZSB3aGVyZSBiZWluZyB0aGUgdGFi bGUgbmFtZSAqLwotLS0gMjc4NCwyNzkwIC0tLS0KICAvKiBBTkFMWVpFICovCiAgCS8qIElm IHRoZSBwcmV2aW91cyB3b3JkIGlzIEFOQUxZWkUsIHByb2R1Y2UgbGlzdCBvZiB0YWJsZXMg Ki8KICAJZWxzZSBpZiAocGdfc3RyY2FzZWNtcChwcmV2X3dkLCAiQU5BTFlaRSIpID09IDAp CiEgCQlDT01QTEVURV9XSVRIX1NDSEVNQV9RVUVSWShRdWVyeV9mb3JfbGlzdF9vZl90Ziwg TlVMTCk7CiAgCiAgLyogV0hFUkUgKi8KICAJLyogU2ltcGxlIGNhc2Ugb2YgdGhlIHdvcmQg YmVmb3JlIHRoZSB3aGVyZSBiZWluZyB0aGUgdGFibGUgbmFtZSAqLwoqKiogYS9zcmMvaW5j bHVkZS9jb21tYW5kcy92YWN1dW0uaAotLS0gYi9zcmMvaW5jbHVkZS9jb21tYW5kcy92YWN1 dW0uaAoqKioqKioqKioqKioqKioKKioqIDE2NSwxNzEgKioqKiBleHRlcm4gdm9pZCBsYXp5 X3ZhY3V1bV9yZWwoUmVsYXRpb24gb25lcmVsLCBWYWN1dW1TdG10ICp2YWNzdG10LAotLS0g MTY1LDE4MiAtLS0tCiAgCQkJCUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IGJzdHJhdGVneSk7CiAg CiAgLyogaW4gY29tbWFuZHMvYW5hbHl6ZS5jICovCisgdHlwZWRlZiBpbnQgKCpTYW1wbGVS b3dBY3F1aXJlRnVuYykgKFJlbGF0aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dzLAorIAkJ CQkJCQkJCSBpbnQgdGFyZ3Jvd3MsCisgCQkJCQkJCQkJIGRvdWJsZSAqdG90YWxyb3dzLCBk b3VibGUgKnRvdGFsZGVhZHJvd3MsCisgCQkJCQkJCQkJIEJsb2NrTnVtYmVyICp0b3RhbHBh Z2VzLCBpbnQgZWxldmVsKTsKKyAKICBleHRlcm4gdm9pZCBhbmFseXplX3JlbChPaWQgcmVs aWQsIFZhY3V1bVN0bXQgKnZhY3N0bXQsCiAgCQkJQnVmZmVyQWNjZXNzU3RyYXRlZ3kgYnN0 cmF0ZWd5KTsKKyBleHRlcm4gdm9pZCBkb19hbmFseXplX3JlbChSZWxhdGlvbiBvbmVyZWws IFZhY3V1bVN0bXQgKnZhY3N0bXQsIGludCBlbGV2ZWwsIAorIAkJCQkJCSAgIGJvb2wgaW5o LCBTYW1wbGVSb3dBY3F1aXJlRnVuYyBhY3F1aXJlZnVuYyk7CisgZXh0ZXJuIGRvdWJsZSBy YW5kb21fZnJhY3Qodm9pZCk7CisgZXh0ZXJuIGRvdWJsZSBpbml0X3NlbGVjdGlvbl9zdGF0 ZShpbnQgbik7CisgZXh0ZXJuIGRvdWJsZSBnZXRfbmV4dF9TKGRvdWJsZSB0LCBpbnQgbiwg ZG91YmxlICpzdGF0ZXB0cik7CisgCiAgCiAgI2VuZGlmICAgLyogVkFDVVVNX0ggKi8KKioq IGEvc3JjL2luY2x1ZGUvZm9yZWlnbi9mZHdhcGkuaAotLS0gYi9zcmMvaW5jbHVkZS9mb3Jl aWduL2Zkd2FwaS5oCioqKioqKioqKioqKioqKgoqKiogMTIsMTkgKioqKgotLS0gMTIsMjEg LS0tLQogICNpZm5kZWYgRkRXQVBJX0gKICAjZGVmaW5lIEZEV0FQSV9ICiAgCisgI2luY2x1 ZGUgImZvcmVpZ24vZm9yZWlnbi5oIgogICNpbmNsdWRlICJub2Rlcy9leGVjbm9kZXMuaCIK ICAjaW5jbHVkZSAibm9kZXMvcmVsYXRpb24uaCIKKyAjaW5jbHVkZSAidXRpbHMvcmVsLmgi CiAgCiAgLyogVG8gYXZvaWQgaW5jbHVkaW5nIGV4cGxhaW4uaCBoZXJlLCByZWZlcmVuY2Ug RXhwbGFpblN0YXRlIHRodXM6ICovCiAgc3RydWN0IEV4cGxhaW5TdGF0ZTsKKioqKioqKioq KioqKioqCioqKiA2OCw3MyAqKioqIHR5cGVkZWYgdm9pZCAoKlJlU2NhbkZvcmVpZ25TY2Fu X2Z1bmN0aW9uKSAoRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSk7Ci0tLSA3MCw3OCAtLS0tCiAg CiAgdHlwZWRlZiB2b2lkICgqRW5kRm9yZWlnblNjYW5fZnVuY3Rpb24pIChGb3JlaWduU2Nh blN0YXRlICpub2RlKTsKICAKKyB0eXBlZGVmIHZvaWQgKCpBbmFseXplRm9yZWlnblRhYmxl X2Z1bmN0aW9uKSAoUmVsYXRpb24gcmVsYXRpb24sCisgCQkJCQkJCQkJCQkgIFZhY3V1bVN0 bXQgKnZhY3N0bXQsCisgCQkJCQkJCQkJCQkgIGludCBlbGV2ZWwpOwogIAogIC8qCiAgICog RmR3Um91dGluZSBpcyB0aGUgc3RydWN0IHJldHVybmVkIGJ5IGEgZm9yZWlnbi1kYXRhIHdy YXBwZXIncyBoYW5kbGVyCioqKioqKioqKioqKioqKgoqKiogODIsOTMgKioqKiB0eXBlZGVm IHN0cnVjdCBGZHdSb3V0aW5lCi0tLSA4NywxMDkgLS0tLQogIHsKICAJTm9kZVRhZwkJdHlw ZTsKICAKKyAJLyoKKyAJICogVGhlc2UgaGFuZGxlcnMgYXJlIHJlcXVpcmVkIHRvIGV4ZWN1 dGUgc2ltcGxlIHNjYW5zIG9uIGEgZm9yZWlnbgorIAkgKiB0YWJsZS4gIElmIGFueSBvZiB0 aGVtIHdhcyBzZXQgdG8gTlVMTCwgc2NhbnMgb24gYSBmb3JlaWduIHRhYmxlCisgCSAqIG1h bmFnZWQgYnkgRkRXIHdvdWxkIGZhaWwuCisgCSAqLwogIAlQbGFuRm9yZWlnblNjYW5fZnVu Y3Rpb24gUGxhbkZvcmVpZ25TY2FuOwogIAlFeHBsYWluRm9yZWlnblNjYW5fZnVuY3Rpb24g RXhwbGFpbkZvcmVpZ25TY2FuOwogIAlCZWdpbkZvcmVpZ25TY2FuX2Z1bmN0aW9uIEJlZ2lu Rm9yZWlnblNjYW47CiAgCUl0ZXJhdGVGb3JlaWduU2Nhbl9mdW5jdGlvbiBJdGVyYXRlRm9y ZWlnblNjYW47CiAgCVJlU2NhbkZvcmVpZ25TY2FuX2Z1bmN0aW9uIFJlU2NhbkZvcmVpZ25T Y2FuOwogIAlFbmRGb3JlaWduU2Nhbl9mdW5jdGlvbiBFbmRGb3JlaWduU2NhbjsKKyAKKyAJ LyoKKyAJICogSGFuZGxlcnMgYmVsb3cgYXJlIG9wdGlvbmFsLiAgWW91IGNhbiBzZXQgYW55 IG9mIHRoZW0gdG8gTlVMTCB0bworIAkgKiB0ZWxsIFBvc3RncmVTUUwgdGhhdCBGRFcgZG9l c24ndCBoYXZlIHRoZSBjYXBhYmlsaXR5LgorIAkgKi8KKyAJQW5hbHl6ZUZvcmVpZ25UYWJs ZV9mdW5jdGlvbiBBbmFseXplRm9yZWlnblRhYmxlOwogIH0gRmR3Um91dGluZTsKICAKICAK KioqIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9mb3JlaWduX2RhdGEub3V0Ci0tLSBi L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZm9yZWlnbl9kYXRhLm91dAoqKioqKioqKioq KioqKioKKioqIDY0Nyw2NTggKioqKiBDUkVBVEUgRk9SRUlHTiBUQUJMRSBmdDEgKAogIENP TU1FTlQgT04gRk9SRUlHTiBUQUJMRSBmdDEgSVMgJ2Z0MSc7CiAgQ09NTUVOVCBPTiBDT0xV TU4gZnQxLmMxIElTICdmdDEuYzEnOwogIFxkKyBmdDEKISAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgRm9yZWlnbiB0YWJsZSAicHVibGljLmZ0MSIKISAgQ29sdW1uIHwgIFR5 cGUgICB8IE1vZGlmaWVycyB8ICAgICAgICAgIEZEVyBPcHRpb25zICAgICAgICAgICB8IFN0 b3JhZ2UgIHwgRGVzY3JpcHRpb24gCiEgLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLQohICBjMSAgICAgfCBpbnRlZ2VyIHwgbm90IG51bGwgIHwgKCJwYXJhbSAxIiAndmFs MScpICAgICAgICAgICAgIHwgcGxhaW4gICAgfCBmdDEuYzEKISAgYzIgICAgIHwgdGV4dCAg ICB8ICAgICAgICAgICB8IChwYXJhbTIgJ3ZhbDInLCBwYXJhbTMgJ3ZhbDMnKSB8IGV4dGVu ZGVkIHwgCiEgIGMzICAgICB8IGRhdGUgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCBwbGFpbiAgICB8IAogIFNlcnZlcjogczAKICBGRFcgT3B0 aW9uczogKGRlbGltaXRlciAnLCcsIHF1b3RlICciJywgImJlIHF1b3RlZCIgJ3ZhbHVlJykK ICBIYXMgT0lEczogbm8KLS0tIDY0Nyw2NTggLS0tLQogIENPTU1FTlQgT04gRk9SRUlHTiBU QUJMRSBmdDEgSVMgJ2Z0MSc7CiAgQ09NTUVOVCBPTiBDT0xVTU4gZnQxLmMxIElTICdmdDEu YzEnOwogIFxkKyBmdDEKISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEZvcmVpZ24gdGFibGUgInB1YmxpYy5mdDEiCiEgIENvbHVtbiB8ICBUeXBlICAgfCBNb2Rp ZmllcnMgfCAgICAgICAgICBGRFcgT3B0aW9ucyAgICAgICAgICAgfCBTdG9yYWdlICB8IFN0 YXRzIHRhcmdldCB8IERlc2NyaXB0aW9uIAohIC0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0KISAgYzEgICAgIHwgaW50ZWdlciB8IG5vdCBudWxs ICB8ICgicGFyYW0gMSIgJ3ZhbDEnKSAgICAgICAgICAgICB8IHBsYWluICAgIHwgICAgICAg ICAgICAgIHwgZnQxLmMxCiEgIGMyICAgICB8IHRleHQgICAgfCAgICAgICAgICAgfCAocGFy YW0yICd2YWwyJywgcGFyYW0zICd2YWwzJykgfCBleHRlbmRlZCB8ICAgICAgICAgICAgICB8 IAohICBjMyAgICAgfCBkYXRlICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgcGxhaW4gICAgfCAgICAgICAgICAgICAgfCAKICBTZXJ2ZXI6IHMw CiAgRkRXIE9wdGlvbnM6IChkZWxpbWl0ZXIgJywnLCBxdW90ZSAnIicsICJiZSBxdW90ZWQi ICd2YWx1ZScpCiAgSGFzIE9JRHM6IG5vCioqKioqKioqKioqKioqKgoqKiogNjk4LDcxNiAq KioqIEVSUk9SOiAgY2Fubm90IGFsdGVyIHN5c3RlbSBjb2x1bW4gInhtaW4iCiAgQUxURVIg Rk9SRUlHTiBUQUJMRSBmdDEgQUxURVIgQ09MVU1OIGM3IE9QVElPTlMgKEFERCBwMSAndjEn LCBBREQgcDIgJ3YyJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQUxURVIgQ09MVU1O IGM4IE9QVElPTlMgKEFERCBwMSAndjEnLCBBREQgcDIgJ3YyJyk7CiAgQUxURVIgRk9SRUlH TiBUQUJMRSBmdDEgQUxURVIgQ09MVU1OIGM4IE9QVElPTlMgKFNFVCBwMiAnVjInLCBEUk9Q IHAxKTsKICBcZCsgZnQxCiEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcmVp Z24gdGFibGUgInB1YmxpYy5mdDEiCiEgIENvbHVtbiB8ICBUeXBlICAgfCBNb2RpZmllcnMg fCAgICAgICAgICBGRFcgT3B0aW9ucyAgICAgICAgICAgfCBTdG9yYWdlICB8IERlc2NyaXB0 aW9uIAohIC0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0KISAgYzEgICAgIHwg aW50ZWdlciB8IG5vdCBudWxsICB8ICgicGFyYW0gMSIgJ3ZhbDEnKSAgICAgICAgICAgICB8 IHBsYWluICAgIHwgCiEgIGMyICAgICB8IHRleHQgICAgfCAgICAgICAgICAgfCAocGFyYW0y ICd2YWwyJywgcGFyYW0zICd2YWwzJykgfCBleHRlbmRlZCB8IAohICBjMyAgICAgfCBkYXRl ICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxh aW4gICAgfCAKISAgYzQgICAgIHwgaW50ZWdlciB8ICAgICAgICAgICB8ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IHBsYWluICAgIHwgCiEgIGM2ICAgICB8IGludGVnZXIg fCBub3QgbnVsbCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFpbiAg ICB8IAohICBjNyAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgKHAxICd2MScsIHAyICd2 MicpICAgICAgICAgICAgIHwgcGxhaW4gICAgfCAKISAgYzggICAgIHwgdGV4dCAgICB8ICAg ICAgICAgICB8IChwMiAnVjInKSAgICAgICAgICAgICAgICAgICAgICB8IGV4dGVuZGVkIHwg CiEgIGM5ICAgICB8IGludGVnZXIgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCBwbGFpbiAgICB8IAohICBjMTAgICAgfCBpbnRlZ2VyIHwgICAgICAg ICAgIHwgKHAxICd2MScpICAgICAgICAgICAgICAgICAgICAgIHwgcGxhaW4gICAgfCAKICBT ZXJ2ZXI6IHMwCiAgRkRXIE9wdGlvbnM6IChkZWxpbWl0ZXIgJywnLCBxdW90ZSAnIicsICJi ZSBxdW90ZWQiICd2YWx1ZScpCiAgSGFzIE9JRHM6IG5vCi0tLSA2OTgsNzIxIC0tLS0KICBB TFRFUiBGT1JFSUdOIFRBQkxFIGZ0MSBBTFRFUiBDT0xVTU4gYzcgT1BUSU9OUyAoQUREIHAx ICd2MScsIEFERCBwMiAndjInKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBTFRFUiBD T0xVTU4gYzggT1BUSU9OUyAoQUREIHAxICd2MScsIEFERCBwMiAndjInKTsKICBBTFRFUiBG T1JFSUdOIFRBQkxFIGZ0MSBBTFRFUiBDT0xVTU4gYzggT1BUSU9OUyAoU0VUIHAyICdWMics IERST1AgcDEpOworIEFMVEVSIEZPUkVJR04gVEFCTEUgZnQxIEFMVEVSIENPTFVNTiBjMSBT RVQgU1RBVElTVElDUyAxMDAwMDsKKyBBTFRFUiBGT1JFSUdOIFRBQkxFIGZ0MSBBTFRFUiBD T0xVTU4gYzEgU0VUIChuX2Rpc3RpbmN0ID0gMTAwKTsKKyBBTFRFUiBGT1JFSUdOIFRBQkxF IGZ0MSBBTFRFUiBDT0xVTU4gYzEgU0VUIChuX2Rpc3RpbmN0X2luaGVyaXRlZCA9IDEwMCk7 IC0tIEVSUk9SCisgRVJST1I6ICBjYW5ub3Qgc2V0ICJuX2Rpc3RpbmN0X2luaGVyaXRlZCIg Zm9yIGZvcmVpZ24gdGFibGVzCisgQUxURVIgRk9SRUlHTiBUQUJMRSBmdDEgQUxURVIgQ09M VU1OIGM4IFNFVCBTVEFUSVNUSUNTIC0xOwogIFxkKyBmdDEKISAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIEZvcmVpZ24gdGFibGUgInB1YmxpYy5mdDEiCiEgIENv bHVtbiB8ICBUeXBlICAgfCBNb2RpZmllcnMgfCAgICAgICAgICBGRFcgT3B0aW9ucyAgICAg ICAgICAgfCBTdG9yYWdlICB8IFN0YXRzIHRhcmdldCB8IERlc2NyaXB0aW9uIAohIC0tLS0t LS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0KISAgYzEgICAg IHwgaW50ZWdlciB8IG5vdCBudWxsICB8ICgicGFyYW0gMSIgJ3ZhbDEnKSAgICAgICAgICAg ICB8IHBsYWluICAgIHwgMTAwMDAgICAgICAgIHwgCiEgIGMyICAgICB8IHRleHQgICAgfCAg ICAgICAgICAgfCAocGFyYW0yICd2YWwyJywgcGFyYW0zICd2YWwzJykgfCBleHRlbmRlZCB8 ICAgICAgICAgICAgICB8IAohICBjMyAgICAgfCBkYXRlICAgIHwgICAgICAgICAgIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxhaW4gICAgfCAgICAgICAgICAgICAg fCAKISAgYzQgICAgIHwgaW50ZWdlciB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IHBsYWluICAgIHwgICAgICAgICAgICAgIHwgCiEgIGM2ICAgICB8 IGludGVnZXIgfCBub3QgbnVsbCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCBwbGFpbiAgICB8ICAgICAgICAgICAgICB8IAohICBjNyAgICAgfCBpbnRlZ2VyIHwgICAg ICAgICAgIHwgKHAxICd2MScsIHAyICd2MicpICAgICAgICAgICAgIHwgcGxhaW4gICAgfCAg ICAgICAgICAgICAgfCAKISAgYzggICAgIHwgdGV4dCAgICB8ICAgICAgICAgICB8IChwMiAn VjInKSAgICAgICAgICAgICAgICAgICAgICB8IGV4dGVuZGVkIHwgICAgICAgICAgICAgIHwg CiEgIGM5ICAgICB8IGludGVnZXIgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCBwbGFpbiAgICB8ICAgICAgICAgICAgICB8IAohICBjMTAgICAgfCBp bnRlZ2VyIHwgICAgICAgICAgIHwgKHAxICd2MScpICAgICAgICAgICAgICAgICAgICAgIHwg cGxhaW4gICAgfCAgICAgICAgICAgICAgfCAKICBTZXJ2ZXI6IHMwCiAgRkRXIE9wdGlvbnM6 IChkZWxpbWl0ZXIgJywnLCBxdW90ZSAnIicsICJiZSBxdW90ZWQiICd2YWx1ZScpCiAgSGFz IE9JRHM6IG5vCioqKiBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2ZvcmVpZ25fZGF0YS5zcWwK LS0tIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZm9yZWlnbl9kYXRhLnNxbAoqKioqKioqKioq KioqKioKKioqIDI5OCwzMDMgKioqKiBBTFRFUiBGT1JFSUdOIFRBQkxFIGZ0MSBBTFRFUiBD T0xVTU4geG1pbiBPUFRJT05TIChBREQgcDEgJ3YxJyk7IC0tIEVSUk9SCi0tLSAyOTgsMzA3 IC0tLS0KICBBTFRFUiBGT1JFSUdOIFRBQkxFIGZ0MSBBTFRFUiBDT0xVTU4gYzcgT1BUSU9O UyAoQUREIHAxICd2MScsIEFERCBwMiAndjInKSwKICAgICAgICAgICAgICAgICAgICAgICAg ICBBTFRFUiBDT0xVTU4gYzggT1BUSU9OUyAoQUREIHAxICd2MScsIEFERCBwMiAndjInKTsK ICBBTFRFUiBGT1JFSUdOIFRBQkxFIGZ0MSBBTFRFUiBDT0xVTU4gYzggT1BUSU9OUyAoU0VU IHAyICdWMicsIERST1AgcDEpOworIEFMVEVSIEZPUkVJR04gVEFCTEUgZnQxIEFMVEVSIENP TFVNTiBjMSBTRVQgU1RBVElTVElDUyAxMDAwMDsKKyBBTFRFUiBGT1JFSUdOIFRBQkxFIGZ0 MSBBTFRFUiBDT0xVTU4gYzEgU0VUIChuX2Rpc3RpbmN0ID0gMTAwKTsKKyBBTFRFUiBGT1JF SUdOIFRBQkxFIGZ0MSBBTFRFUiBDT0xVTU4gYzEgU0VUIChuX2Rpc3RpbmN0X2luaGVyaXRl ZCA9IDEwMCk7IC0tIEVSUk9SCisgQUxURVIgRk9SRUlHTiBUQUJMRSBmdDEgQUxURVIgQ09M VU1OIGM4IFNFVCBTVEFUSVNUSUNTIC0xOwogIFxkKyBmdDEKICAtLSBjYW4ndCBjaGFuZ2Ug dGhlIGNvbHVtbiB0eXBlIGlmIGl0J3MgdXNlZCBlbHNld2hlcmUKICBDUkVBVEUgVEFCTEUg dXNlX2Z0MV9jb2x1bW5fdHlwZSAoeCBmdDEpOwo= --------------060101010307030304070901--